aws-runtime-bridge 1.9.79 → 1.9.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/AcodeSdkAdapter.js +11 -1986
- package/dist/adapter/AdapterRegistry.d.ts +0 -1
- package/dist/adapter/AdapterRegistry.js +2 -100
- package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
- package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
- package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
- package/dist/adapter/CodexSdkAdapter.js +4 -836
- package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/OpencodeSdkAdapter.js +4 -879
- package/dist/adapter/SdkProviderSpi.d.ts +0 -1
- package/dist/adapter/SdkProviderSpi.js +2 -55
- package/dist/adapter/acode-tool-names.d.ts +0 -1
- package/dist/adapter/acode-tool-names.js +2 -37
- package/dist/adapter/idle-poll-loop.d.ts +0 -1
- package/dist/adapter/idle-poll-loop.js +2 -59
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/index.js +2 -11
- package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
- package/dist/adapter/instance-ai-config-resolver.js +2 -46
- package/dist/adapter/types.d.ts +0 -1
- package/dist/adapter/types.js +2 -443
- package/dist/adapters/cc-switch/common.d.ts +0 -1
- package/dist/adapters/cc-switch/common.js +2 -61
- package/dist/adapters/cc-switch/index.d.ts +0 -1
- package/dist/adapters/cc-switch/index.js +2 -57
- package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-acode.js +2 -71
- package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claude.js +2 -89
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
- package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-codex.js +11 -249
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
- package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-acode.js +2 -12
- package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claude.js +2 -11
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
- package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-codex.js +2 -6
- package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-directory.js +3 -137
- package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-opencode.js +2 -11
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
- package/dist/config.d.ts +0 -1
- package/dist/config.js +2 -290
- package/dist/index.d.ts +0 -1
- package/dist/index.js +2 -573
- package/dist/middleware/auth.d.ts +0 -1
- package/dist/middleware/auth.js +2 -98
- package/dist/routes/acode-todos.d.ts +0 -1
- package/dist/routes/acode-todos.js +2 -75
- package/dist/routes/ai-sources.d.ts +0 -1
- package/dist/routes/ai-sources.js +2 -132
- package/dist/routes/dashboard.d.ts +0 -1
- package/dist/routes/dashboard.js +182 -649
- package/dist/routes/events.d.ts +0 -1
- package/dist/routes/events.js +2 -22
- package/dist/routes/file-browser.d.ts +0 -1
- package/dist/routes/file-browser.js +2 -781
- package/dist/routes/file-diff-rollback.d.ts +0 -1
- package/dist/routes/file-diff-rollback.js +2 -301
- package/dist/routes/file-snapshot.d.ts +0 -1
- package/dist/routes/file-snapshot.js +2 -156
- package/dist/routes/git.d.ts +0 -1
- package/dist/routes/git.js +28 -1900
- package/dist/routes/instance.d.ts +0 -1
- package/dist/routes/instance.js +3 -748
- package/dist/routes/mcp.d.ts +0 -1
- package/dist/routes/mcp.js +2 -196
- package/dist/routes/processes.d.ts +0 -1
- package/dist/routes/processes.js +2 -252
- package/dist/routes/properties.d.ts +0 -1
- package/dist/routes/properties.js +2 -72
- package/dist/routes/pty.d.ts +0 -1
- package/dist/routes/pty.js +6 -560
- package/dist/routes/runtime-binding.d.ts +0 -1
- package/dist/routes/runtime-binding.js +2 -263
- package/dist/routes/sessions.d.ts +0 -1
- package/dist/routes/sessions.js +2 -758
- package/dist/routes/skills.d.ts +0 -1
- package/dist/routes/skills.js +2 -187
- package/dist/routes/sub-agents.d.ts +0 -1
- package/dist/routes/sub-agents.js +20 -279
- package/dist/routes/system-metrics.d.ts +0 -1
- package/dist/routes/system-metrics.js +2 -20
- package/dist/routes/task-context.d.ts +0 -1
- package/dist/routes/task-context.js +2 -78
- package/dist/routes/terminal.d.ts +0 -1
- package/dist/routes/terminal.js +54 -2882
- package/dist/routes/yml.d.ts +0 -1
- package/dist/routes/yml.js +2 -223
- package/dist/services/acode-package.d.ts +0 -1
- package/dist/services/acode-package.js +2 -111
- package/dist/services/agent-event-store.d.ts +0 -1
- package/dist/services/agent-event-store.js +2 -81
- package/dist/services/agent-process-manager.d.ts +0 -1
- package/dist/services/agent-process-manager.js +2 -796
- package/dist/services/ai-source-apply.d.ts +0 -1
- package/dist/services/ai-source-apply.js +2 -83
- package/dist/services/auto-register.d.ts +5 -1
- package/dist/services/auto-register.js +2 -1053
- package/dist/services/aws-client-agent-mcp.d.ts +0 -1
- package/dist/services/aws-client-agent-mcp.js +3 -337
- package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
- package/dist/services/bridge-package-publish-hooks.js +2 -115
- package/dist/services/cc-switch-sdk.d.ts +0 -1
- package/dist/services/cc-switch-sdk.js +2 -135
- package/dist/services/cli-commands.d.ts +6 -1
- package/dist/services/cli-commands.js +6 -645
- package/dist/services/event-delta-pusher.d.ts +0 -1
- package/dist/services/event-delta-pusher.js +2 -95
- package/dist/services/fileSnapshotStore.d.ts +0 -1
- package/dist/services/fileSnapshotStore.js +2 -500
- package/dist/services/instance-ai-config-service.d.ts +0 -1
- package/dist/services/instance-ai-config-service.js +2 -174
- package/dist/services/instance-init-service.d.ts +0 -1
- package/dist/services/instance-init-service.js +2 -193
- package/dist/services/instance-service.d.ts +0 -1
- package/dist/services/instance-service.js +2 -237
- package/dist/services/instance-state.d.ts +0 -1
- package/dist/services/instance-state.js +2 -94
- package/dist/services/legacy-path-migration.d.ts +0 -1
- package/dist/services/legacy-path-migration.js +2 -66
- package/dist/services/lifecycle-state.d.ts +0 -1
- package/dist/services/lifecycle-state.js +3 -110
- package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
- package/dist/services/mcp-launch-binding-queue.js +2 -175
- package/dist/services/orphan-monitor.d.ts +0 -1
- package/dist/services/orphan-monitor.js +2 -382
- package/dist/services/panel-auth.d.ts +0 -1
- package/dist/services/panel-auth.js +2 -168
- package/dist/services/process-detector.d.ts +0 -1
- package/dist/services/process-detector.js +18 -1019
- package/dist/services/process-registry.d.ts +0 -1
- package/dist/services/process-registry.js +2 -375
- package/dist/services/ring-buffer.d.ts +0 -1
- package/dist/services/ring-buffer.js +2 -103
- package/dist/services/runtime-binding.d.ts +0 -1
- package/dist/services/runtime-binding.js +6 -363
- package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
- package/dist/services/runtime-lifecycle-policy.js +2 -35
- package/dist/services/session-output.d.ts +0 -1
- package/dist/services/session-output.js +5 -539
- package/dist/services/startup-config-wizard.d.ts +0 -1
- package/dist/services/startup-config-wizard.js +14 -258
- package/dist/services/sub-agent-manager-instance.d.ts +0 -1
- package/dist/services/sub-agent-manager-instance.js +2 -12
- package/dist/services/system-metrics.d.ts +0 -1
- package/dist/services/system-metrics.js +2 -252
- package/dist/services/terminal-persistence.d.ts +0 -1
- package/dist/services/terminal-persistence.js +2 -176
- package/dist/services/tool-installer.d.ts +0 -1
- package/dist/services/tool-installer.js +5 -751
- package/dist/services/tunnel-client.d.ts +0 -1
- package/dist/services/tunnel-client.js +2 -402
- package/dist/services/windows-service-manager.d.ts +3 -3
- package/dist/services/windows-service-manager.js +2 -59
- package/dist/services/workspace-files.d.ts +0 -1
- package/dist/services/workspace-files.js +2 -1275
- package/dist/services/workspace-watch.d.ts +0 -1
- package/dist/services/workspace-watch.js +2 -123
- package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
- package/dist/services/workspaceTaskChangeWatcher.js +2 -483
- package/dist/types.d.ts +0 -1
- package/dist/types.js +1 -1
- package/dist/utils/file-utils.d.ts +0 -1
- package/dist/utils/file-utils.js +3 -208
- package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
- package/dist/utils/instance-ai-config-debug-logger.js +4 -63
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +2 -154
- package/dist/utils/mcp-utils.d.ts +0 -1
- package/dist/utils/mcp-utils.js +2 -187
- package/dist/utils/path-utils.d.ts +0 -1
- package/dist/utils/path-utils.js +2 -44
- package/dist/utils/sdk-package-loader.d.ts +0 -1
- package/dist/utils/sdk-package-loader.js +2 -78
- package/dist/utils/validation.d.ts +0 -1
- package/dist/utils/validation.js +2 -53
- package/dist/utils/yaml-utils.d.ts +0 -1
- package/dist/utils/yaml-utils.js +2 -312
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
- package/node_modules/@cc-switch/sdk/package.json +1 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
- package/package/acode/dist/ask-user-question-tool.js +4 -233
- package/package/acode/dist/built-in-file-tools.d.ts +0 -1
- package/package/acode/dist/built-in-file-tools.js +4 -966
- package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
- package/package/acode/dist/built-in-symbols-tool.js +2 -117
- package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
- package/package/acode/dist/builtins/commandArtifacts.js +9 -97
- package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
- package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandResult.js +2 -71
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
- package/package/acode/dist/cli.d.ts +0 -1
- package/package/acode/dist/cli.js +4 -38
- package/package/acode/dist/commands/commandLoader.d.ts +0 -1
- package/package/acode/dist/commands/commandLoader.js +2 -33
- package/package/acode/dist/commands/commandParser.d.ts +0 -1
- package/package/acode/dist/commands/commandParser.js +3 -77
- package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
- package/package/acode/dist/commands/commandRegistry.js +2 -30
- package/package/acode/dist/compaction.d.ts +0 -1
- package/package/acode/dist/compaction.js +7 -919
- package/package/acode/dist/config.d.ts +0 -1
- package/package/acode/dist/config.js +5 -105
- package/package/acode/dist/fs-utils.d.ts +0 -1
- package/package/acode/dist/fs-utils.js +2 -79
- package/package/acode/dist/hooks/hookBus.d.ts +0 -1
- package/package/acode/dist/hooks/hookBus.js +2 -40
- package/package/acode/dist/index.d.ts +0 -1
- package/package/acode/dist/index.js +2 -19
- package/package/acode/dist/mcpToolNames.d.ts +0 -1
- package/package/acode/dist/mcpToolNames.js +2 -17
- package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
- package/package/acode/dist/parsers/ast-cache.js +2 -76
- package/package/acode/dist/parsers/language-detector.d.ts +0 -1
- package/package/acode/dist/parsers/language-detector.js +2 -44
- package/package/acode/dist/parsers/language-queries.d.ts +0 -1
- package/package/acode/dist/parsers/language-queries.js +12 -602
- package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
- package/package/acode/dist/parsers/symbol-extractor.js +3 -164
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
- package/package/acode/dist/parsers/types.d.ts +0 -1
- package/package/acode/dist/parsers/types.js +1 -7
- package/package/acode/dist/runtime.d.ts +0 -1
- package/package/acode/dist/runtime.js +86 -3771
- package/package/acode/dist/skill-tool.d.ts +0 -1
- package/package/acode/dist/skill-tool.js +5 -174
- package/package/acode/dist/sub-agent-manager.d.ts +0 -1
- package/package/acode/dist/sub-agent-manager.js +2 -1159
- package/package/acode/dist/sub-agent-store.d.ts +0 -1
- package/package/acode/dist/sub-agent-store.js +4 -236
- package/package/acode/dist/sub-agent-tools.d.ts +0 -1
- package/package/acode/dist/sub-agent-tools.js +15 -369
- package/package/acode/dist/sub-agent-types.d.ts +0 -1
- package/package/acode/dist/sub-agent-types.js +1 -8
- package/package/acode/dist/todo-store.d.ts +0 -1
- package/package/acode/dist/todo-store.js +2 -73
- package/package/acode/dist/todo-tool.d.ts +0 -1
- package/package/acode/dist/todo-tool.js +5 -121
- package/package/acode/dist/types.d.ts +0 -1
- package/package/acode/dist/types.js +1 -1
- package/package/acode/package.json +2 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.js +2 -243
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js +2 -24
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/index.js +2 -34
- package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js +3 -178
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/types.js +2 -9
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
- package/package/aws-client-agent-mcp/package.json +1 -1
- package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
- package/package/cc-switch-sdk/dist/constants.js +2 -63
- package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
- package/package/cc-switch-sdk/dist/errors.js +2 -8
- package/package/cc-switch-sdk/dist/index.d.ts +0 -1
- package/package/cc-switch-sdk/dist/index.js +2 -9
- package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
- package/package/cc-switch-sdk/dist/schemas.js +2 -38
- package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
- package/package/cc-switch-sdk/dist/sdk.js +2 -470
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
- package/package/cc-switch-sdk/dist/state.d.ts +0 -1
- package/package/cc-switch-sdk/dist/state.js +2 -19
- package/package/cc-switch-sdk/dist/types.d.ts +0 -1
- package/package/cc-switch-sdk/dist/types.js +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
- package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/id.js +2 -12
- package/package/cc-switch-sdk/package.json +1 -1
- package/package.json +4 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
- package/dist/adapter/types.d.ts.map +0 -1
- package/dist/adapters/cc-switch/common.d.ts.map +0 -1
- package/dist/adapters/cc-switch/index.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/routes/acode-todos.d.ts.map +0 -1
- package/dist/routes/ai-sources.d.ts.map +0 -1
- package/dist/routes/dashboard.d.ts.map +0 -1
- package/dist/routes/events.d.ts.map +0 -1
- package/dist/routes/file-browser.d.ts.map +0 -1
- package/dist/routes/file-diff-rollback.d.ts.map +0 -1
- package/dist/routes/file-snapshot.d.ts.map +0 -1
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/instance.d.ts.map +0 -1
- package/dist/routes/mcp.d.ts.map +0 -1
- package/dist/routes/processes.d.ts.map +0 -1
- package/dist/routes/properties.d.ts.map +0 -1
- package/dist/routes/pty.d.ts.map +0 -1
- package/dist/routes/runtime-binding.d.ts.map +0 -1
- package/dist/routes/sessions.d.ts.map +0 -1
- package/dist/routes/skills.d.ts.map +0 -1
- package/dist/routes/sub-agents.d.ts.map +0 -1
- package/dist/routes/system-metrics.d.ts.map +0 -1
- package/dist/routes/task-context.d.ts.map +0 -1
- package/dist/routes/terminal.d.ts.map +0 -1
- package/dist/routes/yml.d.ts.map +0 -1
- package/dist/services/acode-package.d.ts.map +0 -1
- package/dist/services/agent-event-store.d.ts.map +0 -1
- package/dist/services/agent-process-manager.d.ts.map +0 -1
- package/dist/services/ai-source-apply.d.ts.map +0 -1
- package/dist/services/auto-register.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
- package/dist/services/cc-switch-sdk.d.ts.map +0 -1
- package/dist/services/cli-commands.d.ts.map +0 -1
- package/dist/services/event-delta-pusher.d.ts.map +0 -1
- package/dist/services/fileSnapshotStore.d.ts.map +0 -1
- package/dist/services/instance-ai-config-service.d.ts.map +0 -1
- package/dist/services/instance-init-service.d.ts.map +0 -1
- package/dist/services/instance-service.d.ts.map +0 -1
- package/dist/services/instance-state.d.ts.map +0 -1
- package/dist/services/legacy-path-migration.d.ts.map +0 -1
- package/dist/services/lifecycle-state.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
- package/dist/services/orphan-monitor.d.ts.map +0 -1
- package/dist/services/panel-auth.d.ts.map +0 -1
- package/dist/services/process-detector.d.ts.map +0 -1
- package/dist/services/process-registry.d.ts.map +0 -1
- package/dist/services/ring-buffer.d.ts.map +0 -1
- package/dist/services/runtime-binding.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
- package/dist/services/session-output.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.d.ts.map +0 -1
- package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
- package/dist/services/system-metrics.d.ts.map +0 -1
- package/dist/services/terminal-persistence.d.ts.map +0 -1
- package/dist/services/tool-installer.d.ts.map +0 -1
- package/dist/services/tunnel-client.d.ts.map +0 -1
- package/dist/services/windows-service-manager.d.ts.map +0 -1
- package/dist/services/workspace-files.d.ts.map +0 -1
- package/dist/services/workspace-watch.d.ts.map +0 -1
- package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/file-utils.d.ts.map +0 -1
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/mcp-utils.d.ts.map +0 -1
- package/dist/utils/path-utils.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/yaml-utils.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
- package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
- package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
- package/package/acode/dist/cli.d.ts.map +0 -1
- package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
- package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
- package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
- package/package/acode/dist/compaction.d.ts.map +0 -1
- package/package/acode/dist/config.d.ts.map +0 -1
- package/package/acode/dist/fs-utils.d.ts.map +0 -1
- package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
- package/package/acode/dist/index.d.ts.map +0 -1
- package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
- package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
- package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
- package/package/acode/dist/parsers/types.d.ts.map +0 -1
- package/package/acode/dist/runtime.d.ts.map +0 -1
- package/package/acode/dist/skill-tool.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
- package/package/acode/dist/todo-store.d.ts.map +0 -1
- package/package/acode/dist/todo-tool.d.ts.map +0 -1
- package/package/acode/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
- package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
package/dist/routes/dashboard.js
CHANGED
|
@@ -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()"
|
|
757
|
-
<button onclick="openSettings()" id="settingsBtn" title="Settings /
|
|
296
|
+
<span class="lang-btn" id="langBtn" onclick="toggleLang()">\u4E2D\u6587</span>
|
|
297
|
+
<button onclick="openSettings()" id="settingsBtn" title="Settings / \u8BBE\u7F6E">⚙</button>
|
|
758
298
|
<button onclick="refresh()" id="refreshBtn">↻</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 /
|
|
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 /
|
|
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"
|
|
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: "\
|
|
1001
|
-
loading: "\
|
|
1002
|
-
noProcesses: "\
|
|
1003
|
-
noSessions: "\
|
|
1004
|
-
noPersisted: "\
|
|
1005
|
-
metricsUnavailable: "\
|
|
1006
|
-
managed: "\
|
|
1007
|
-
orphan: "\
|
|
1008
|
-
managedLabel: "\
|
|
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: "\
|
|
1012
|
-
cardBinding: "\
|
|
1013
|
-
cardSessions: "\
|
|
1014
|
-
fldVersion: "\u7248\
|
|
1015
|
-
fldHost: "\
|
|
1016
|
-
fldPlatform: "\
|
|
1017
|
-
fldUptime: "\
|
|
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: "\
|
|
1020
|
-
fldInstanceId: "\
|
|
1021
|
-
fldLastAttempt: "\
|
|
1022
|
-
fldError: "\u9519\
|
|
1023
|
-
fldScheduler: "\
|
|
1024
|
-
fldPairingCode: "\u5339\
|
|
1025
|
-
fldActiveSessions: "\
|
|
1026
|
-
fldPersistedSessions: "\u6301\
|
|
1027
|
-
fldManagedProcesses: "\
|
|
1028
|
-
fldOrphanProcesses: "\
|
|
1029
|
-
fldRegistryEntries: "\
|
|
1030
|
-
//
|
|
1031
|
-
secSysRes: "\
|
|
1032
|
-
secSessions: "\
|
|
1033
|
-
secPersisted: "\u6301\
|
|
1034
|
-
secOrphans: "\
|
|
1035
|
-
secUnknown: "\u5176\
|
|
1036
|
-
orphanBanner: "\
|
|
1037
|
-
btnTerminate: "\
|
|
1038
|
-
btnKill: "\u6740\
|
|
1039
|
-
showUnknown: "\
|
|
1040
|
-
hideUnknown: "\u9690\
|
|
1041
|
-
noOrphans: "\
|
|
1042
|
-
fldUsage: "\
|
|
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: "\
|
|
1045
|
-
fldUsed: "\
|
|
1046
|
-
fldFree: "\u5269\
|
|
1047
|
-
fldTotal: "\
|
|
1048
|
-
fldDownload: "\
|
|
1049
|
-
fldUpload: "\
|
|
1050
|
-
fldTotalDown: "\
|
|
1051
|
-
fldTotalUp: "\
|
|
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: "\
|
|
1056
|
-
thSessionId: "\
|
|
1057
|
-
thState: "\
|
|
1058
|
-
thAction: "\
|
|
1059
|
-
thWorkspace: "\
|
|
1060
|
-
thProvider: "\
|
|
1061
|
-
thCommand: "\
|
|
1062
|
-
thDirectory: "\
|
|
1063
|
-
thStarted: "\
|
|
1064
|
-
countManaged: "\
|
|
1065
|
-
//
|
|
1066
|
-
setTitle: "\
|
|
1067
|
-
setAccount: "\
|
|
1068
|
-
setUsername: "\u7528\u6237\
|
|
1069
|
-
setCurrentPwd: "\
|
|
1070
|
-
setNewPwd: "\
|
|
1071
|
-
setConfirmPwd: "\
|
|
1072
|
-
setSave: "\
|
|
1073
|
-
setCancel: "\
|
|
1074
|
-
setKeepUnchanged: "\
|
|
1075
|
-
setPwdRequired: "\
|
|
1076
|
-
setPwdMismatch: "\
|
|
1077
|
-
setPwdTooShort: "\
|
|
1078
|
-
setSaved: "\
|
|
1079
|
-
setSaveFailed: "\
|
|
1080
|
-
setNetworkError: "\
|
|
1081
|
-
setMaintenance: "\
|
|
1082
|
-
setRestartBridge: "\
|
|
1083
|
-
setRestartDesc: "\
|
|
1084
|
-
setRestartConfirm: "\
|
|
1085
|
-
setRestarting: "\
|
|
1086
|
-
//
|
|
1087
|
-
nodeTitle: "\u8282\
|
|
1088
|
-
nodeHostname: "\
|
|
1089
|
-
nodePlatform: "\
|
|
1090
|
-
nodeUptime: "\
|
|
1091
|
-
nodeVersion: "Bridge \u7248\
|
|
1092
|
-
nodeNodeVer: "Node \u7248\
|
|
1093
|
-
nodeConfigPath: "\
|
|
1094
|
-
nodeHomeDir: "\
|
|
1095
|
-
nodeScheduler: "\
|
|
1096
|
-
nodeBinding: "\
|
|
1097
|
-
nodeRegistered: "\
|
|
1098
|
-
nodeInstanceId: "\
|
|
1099
|
-
nodeActiveSessions: "\
|
|
1100
|
-
nodePaired: "\
|
|
1101
|
-
nodeUnpaired: "\
|
|
1102
|
-
nodeRegYes: "\
|
|
1103
|
-
nodeRegNo: "\
|
|
1104
|
-
//
|
|
1105
|
-
logTitle: "\
|
|
1106
|
-
logAutoRefresh: "\
|
|
1107
|
-
logLevelAll: "\u5168\
|
|
1108
|
-
logRefreshing: "\u5237\
|
|
1109
|
-
logEmpty: "\u6682\
|
|
1110
|
-
//
|
|
1111
|
-
schedTitle: "\
|
|
1112
|
-
schedUrl: "\
|
|
1113
|
-
schedReRegister: "\
|
|
1114
|
-
schedReRegistering: "\
|
|
1115
|
-
schedReRegistered: "\
|
|
1116
|
-
schedReRegisterFail: "\
|
|
1117
|
-
schedDesc: "\u5411\
|
|
1118
|
-
//
|
|
1119
|
-
stHealthy: "\u5065\
|
|
1120
|
-
stError: "\
|
|
1121
|
-
stRunning: "\
|
|
1122
|
-
stStopped: "\
|
|
1123
|
-
stPaired: "\
|
|
1124
|
-
stUnpaired: "\
|
|
1125
|
-
stRegistered: "\
|
|
1126
|
-
stNotRegistered: "\
|
|
1127
|
-
stWarning: "\
|
|
1128
|
-
stNone: "\
|
|
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: "\
|
|
1132
|
-
refreshBtn: "\
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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 = "\
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
2310
|
-
<div class="badge">Default credentials detected. Please set a new username and password.<br
|
|
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... /
|
|
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 /
|
|
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 /
|
|
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 /
|
|
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 /
|
|
2328
|
-
<button type="submit" class="btn-primary" id="saveBtn">Save /
|
|
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
|
|
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 /
|
|
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
|
+
|