@walkhi/code-relax 0.1.0-beta.29 → 0.1.0-beta.30
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/README.md +12 -3
- package/dist/bin/codex-remote.mjs +54 -37
- package/dist/bin/manage-relay-admin.mjs +20 -20
- package/dist/bin/migrate-relay-db.mjs +109 -109
- package/dist/bin/publish-android-release.mjs +58 -0
- package/dist/bin/self-relay-admin.mjs +8 -8
- package/dist/bin/self-relay-demo.mjs +33 -33
- package/dist/bin/self-relay-server.mjs +66 -64
- package/dist/build-platform.json +1 -0
- package/dist/get-lan-networks.ps1 +40 -40
- package/dist/shared/file-mentions.cjs +12 -0
- package/dist/shared/message-delivery.cjs +17 -1
- package/dist/shared/p2p-data-channel.cjs +72 -50
- package/dist/shared/p2p-diagnostics.cjs +28 -28
- package/dist/shared/p2p-file-channel.cjs +3 -3
- package/dist/shared/plan-pricing.cjs +32 -0
- package/dist/shared/server-requests.cjs +17 -1
- package/dist/skills/code-relax/SKILL.md +3 -3
- package/dist/src/background-process.mjs +18 -18
- package/dist/src/code-browser.mjs +7 -8
- package/dist/src/dots-chat-server.mjs +50 -1
- package/dist/src/dots-room-client.mjs +2 -2
- package/dist/src/dots-task-catalog.mjs +22 -3
- package/dist/src/dots-task-files.mjs +52 -0
- package/dist/src/execution-health.mjs +26 -26
- package/dist/src/lan-socket-server.mjs +2 -2
- package/dist/src/managed-app-server.mjs +9 -6
- package/dist/src/message-images.mjs +9 -9
- package/dist/src/onboarding.mjs +9 -26
- package/dist/src/plan-pricing.mjs +47 -0
- package/dist/src/platform/README.md +11 -11
- package/dist/src/platform/codex-protocol.mjs +46 -0
- package/dist/src/platform/codex-runtime.mjs +3 -0
- package/dist/src/platform/credential-store.mjs +3 -0
- package/dist/src/platform/desktop-host.mjs +3 -0
- package/dist/src/platform/desktop-project-registration.mjs +3 -0
- package/dist/src/platform/desktop-project-store.mjs +149 -0
- package/dist/src/platform/linux/README.md +3 -3
- package/dist/src/platform/macos/README.md +3 -3
- package/dist/src/platform/macos/codex-runtime.mjs +125 -0
- package/dist/src/platform/macos/credential-store.mjs +10 -0
- package/dist/src/platform/macos/desktop-host.mjs +82 -0
- package/dist/src/platform/macos/desktop-project-registration.mjs +10 -0
- package/dist/src/platform/macos/network-info.mjs +28 -0
- package/dist/src/platform/macos/project-locations.mjs +8 -0
- package/dist/src/platform/macos/resident-startup.mjs +84 -0
- package/dist/src/platform/macos/retained-runtime.mjs +127 -0
- package/dist/src/platform/macos/service-host.mjs +18 -0
- package/dist/src/platform/macos/system.mjs +29 -0
- package/dist/src/platform/macos/user-environment.mjs +7 -0
- package/dist/src/platform/native-package.mjs +46 -0
- package/dist/src/platform/network-info.mjs +3 -0
- package/dist/src/platform/path-identity.mjs +5 -0
- package/dist/src/platform/posix/runtime-paths.mjs +25 -0
- package/dist/src/platform/project-locations.mjs +3 -0
- package/dist/src/platform/runtime-paths.mjs +8 -0
- package/dist/src/platform/select.mjs +5 -0
- package/dist/src/platform/service-host.mjs +3 -0
- package/dist/src/platform/user-environment.mjs +3 -0
- package/dist/src/platform/windows/IsolatedProcess.cs +79 -79
- package/dist/src/platform/windows/background-process.mjs +30 -30
- package/dist/src/platform/windows/codex-runtime.mjs +2 -40
- package/dist/src/platform/windows/desktop-helper.mjs +179 -0
- package/dist/src/platform/windows/desktop-project-registration.mjs +3 -152
- package/dist/src/platform/windows/desktop-runtime.ps1 +10 -10
- package/dist/src/platform/windows/desktop-shortcuts.ps1 +7 -7
- package/dist/src/platform/windows/network-info.mjs +34 -34
- package/dist/src/platform/windows/resident-start.js +20 -20
- package/dist/src/platform/windows/resident-start.ps1 +7 -7
- package/dist/src/platform/windows/resident-startup.ps1 +83 -83
- package/dist/src/platform/windows/resolve-state-root.ps1 +14 -14
- package/dist/src/platform/windows/runtime-paths.mjs +20 -20
- package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
- package/dist/src/platform/windows/service-host.mjs +11 -11
- package/dist/src/platform/windows/start-hidden-console.ps1 +49 -49
- package/dist/src/platform/windows/stop-desktop.ps1 +22 -22
- package/dist/src/platform/windows/user-environment.mjs +50 -50
- package/dist/src/platform/windows/user-environment.ps1 +41 -41
- package/dist/src/project-create.mjs +4 -4
- package/dist/src/runtime-discovery.mjs +47 -43
- package/dist/src/self-relay/account-connections.mjs +52 -52
- package/dist/src/self-relay/admin-cloud.mjs +101 -101
- package/dist/src/self-relay/admin-server.mjs +74 -74
- package/dist/src/self-relay/admin-state.mjs +127 -127
- package/dist/src/self-relay/android-releases.mjs +61 -0
- package/dist/src/self-relay/client.mjs +61 -61
- package/dist/src/self-relay/connector.mjs +36 -20
- package/dist/src/self-relay/debug-allowlist.mjs +33 -33
- package/dist/src/self-relay/demo.mjs +6 -6
- package/dist/src/self-relay/device-store.mjs +84 -84
- package/dist/src/self-relay/lan-authorizations.mjs +42 -42
- package/dist/src/self-relay/lifecycle.mjs +250 -250
- package/dist/src/self-relay/long-pairing.mjs +40 -40
- package/dist/src/self-relay/mysql-state.mjs +105 -105
- package/dist/src/self-relay/p2p-probe.mjs +13 -6
- package/dist/src/self-relay/server.mjs +19 -9
- package/dist/src/self-relay/usage-daily.mjs +55 -55
- package/dist/src/self-relay/windows-route-helper.mjs +75 -75
- package/dist/src/self-relay/wire.mjs +36 -36
- package/dist/src/server.mjs +132 -32
- package/dist/src/service-control.mjs +82 -82
- package/dist/src/service-doctor.mjs +51 -13
- package/dist/src/service-health.mjs +33 -33
- package/dist/src/service-install.mjs +10 -7
- package/dist/src/service-lifecycle.mjs +1 -1
- package/dist/src/service-restart.mjs +81 -81
- package/dist/src/shared-app-server.mjs +16 -7
- package/dist/src/shared-recovery.mjs +146 -144
- package/dist/src/skill-install.mjs +51 -51
- package/dist/src/thread-title-generation.mjs +150 -150
- package/dist/src/turn-model-history.mjs +47 -47
- package/dist/tools/rtc-route-helper.ps1 +99 -99
- package/dist/tools/start-rtc-route-helper.ps1 +15 -15
- package/dist/web/vendor/markdown-it.LICENSE.txt +22 -22
- package/dist/web/vendor/markdown-it.umd.min.js +13 -13
- package/package.json +47 -49
- package/tools/postinstall.mjs +127 -127
- package/node_modules/@img/colour/LICENSE.md +0 -82
- package/node_modules/@img/colour/README.md +0 -15
- package/node_modules/@img/colour/color.cjs +0 -1596
- package/node_modules/@img/colour/index.cjs +0 -1
- package/node_modules/@img/colour/index.d.ts +0 -929
- package/node_modules/@img/colour/package.json +0 -58
- package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
- package/node_modules/@img/sharp-win32-x64/README.md +0 -59
- package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
- package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
- package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
- package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
- package/node_modules/@img/sharp-win32-x64/package.json +0 -40
- package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
- package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
- package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
- package/node_modules/ansi-regex/index.d.ts +0 -37
- package/node_modules/ansi-regex/index.js +0 -10
- package/node_modules/ansi-regex/license +0 -9
- package/node_modules/ansi-regex/package.json +0 -55
- package/node_modules/ansi-regex/readme.md +0 -78
- package/node_modules/ansi-styles/index.d.ts +0 -345
- package/node_modules/ansi-styles/index.js +0 -163
- package/node_modules/ansi-styles/license +0 -9
- package/node_modules/ansi-styles/package.json +0 -56
- package/node_modules/ansi-styles/readme.md +0 -152
- package/node_modules/camelcase/index.d.ts +0 -63
- package/node_modules/camelcase/index.js +0 -76
- package/node_modules/camelcase/license +0 -9
- package/node_modules/camelcase/package.json +0 -43
- package/node_modules/camelcase/readme.md +0 -99
- package/node_modules/cliui/CHANGELOG.md +0 -76
- package/node_modules/cliui/LICENSE.txt +0 -14
- package/node_modules/cliui/README.md +0 -115
- package/node_modules/cliui/index.js +0 -354
- package/node_modules/cliui/package.json +0 -65
- package/node_modules/color-convert/CHANGELOG.md +0 -54
- package/node_modules/color-convert/LICENSE +0 -21
- package/node_modules/color-convert/README.md +0 -68
- package/node_modules/color-convert/conversions.js +0 -839
- package/node_modules/color-convert/index.js +0 -81
- package/node_modules/color-convert/package.json +0 -48
- package/node_modules/color-convert/route.js +0 -97
- package/node_modules/color-name/LICENSE +0 -8
- package/node_modules/color-name/README.md +0 -11
- package/node_modules/color-name/index.js +0 -152
- package/node_modules/color-name/package.json +0 -28
- package/node_modules/decamelize/index.js +0 -13
- package/node_modules/decamelize/license +0 -21
- package/node_modules/decamelize/package.json +0 -38
- package/node_modules/decamelize/readme.md +0 -48
- package/node_modules/detect-libc/LICENSE +0 -201
- package/node_modules/detect-libc/README.md +0 -163
- package/node_modules/detect-libc/index.d.ts +0 -14
- package/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/node_modules/detect-libc/lib/elf.js +0 -39
- package/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/node_modules/detect-libc/lib/process.js +0 -24
- package/node_modules/detect-libc/package.json +0 -44
- package/node_modules/dijkstrajs/.travis.yml +0 -4
- package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
- package/node_modules/dijkstrajs/LICENSE.md +0 -19
- package/node_modules/dijkstrajs/README.md +0 -18
- package/node_modules/dijkstrajs/dijkstra.js +0 -165
- package/node_modules/dijkstrajs/package.json +0 -60
- package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
- package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
- package/node_modules/emoji-regex/README.md +0 -73
- package/node_modules/emoji-regex/es2015/index.js +0 -6
- package/node_modules/emoji-regex/es2015/text.js +0 -6
- package/node_modules/emoji-regex/index.d.ts +0 -23
- package/node_modules/emoji-regex/index.js +0 -6
- package/node_modules/emoji-regex/package.json +0 -50
- package/node_modules/emoji-regex/text.js +0 -6
- package/node_modules/find-up/index.d.ts +0 -137
- package/node_modules/find-up/index.js +0 -89
- package/node_modules/find-up/license +0 -9
- package/node_modules/find-up/package.json +0 -53
- package/node_modules/find-up/readme.md +0 -156
- package/node_modules/get-caller-file/LICENSE.md +0 -6
- package/node_modules/get-caller-file/README.md +0 -41
- package/node_modules/get-caller-file/index.d.ts +0 -2
- package/node_modules/get-caller-file/index.js +0 -22
- package/node_modules/get-caller-file/index.js.map +0 -1
- package/node_modules/get-caller-file/package.json +0 -42
- package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
- package/node_modules/is-fullwidth-code-point/index.js +0 -50
- package/node_modules/is-fullwidth-code-point/license +0 -9
- package/node_modules/is-fullwidth-code-point/package.json +0 -42
- package/node_modules/is-fullwidth-code-point/readme.md +0 -39
- package/node_modules/locate-path/index.d.ts +0 -83
- package/node_modules/locate-path/index.js +0 -65
- package/node_modules/locate-path/license +0 -9
- package/node_modules/locate-path/package.json +0 -45
- package/node_modules/locate-path/readme.md +0 -122
- package/node_modules/node-datachannel/.clang-format +0 -17
- package/node_modules/node-datachannel/.editorconfig +0 -12
- package/node_modules/node-datachannel/.eslintignore +0 -8
- package/node_modules/node-datachannel/.eslintrc.json +0 -27
- package/node_modules/node-datachannel/.gitmodules +0 -3
- package/node_modules/node-datachannel/.prettierignore +0 -7
- package/node_modules/node-datachannel/.prettierrc +0 -13
- package/node_modules/node-datachannel/API.md +0 -247
- package/node_modules/node-datachannel/BULDING.md +0 -26
- package/node_modules/node-datachannel/CMakeLists.txt +0 -153
- package/node_modules/node-datachannel/LICENSE +0 -373
- package/node_modules/node-datachannel/README.md +0 -129
- package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
- package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
- package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
- package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
- package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
- package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
- package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
- package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
- package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
- package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
- package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
- package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
- package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
- package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
- package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
- package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
- package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
- package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
- package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
- package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
- package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
- package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
- package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
- package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
- package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
- package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
- package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
- package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
- package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
- package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
- package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
- package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
- package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
- package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
- package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
- package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
- package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
- package/node_modules/node-datachannel/jest.config.ts +0 -14
- package/node_modules/node-datachannel/package.json +0 -133
- package/node_modules/node-datachannel/rollup.config.mjs +0 -67
- package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
- package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
- package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
- package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
- package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
- package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
- package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
- package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
- package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
- package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
- package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
- package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
- package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
- package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
- package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
- package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
- package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
- package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
- package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
- package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
- package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
- package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
- package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
- package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
- package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
- package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
- package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
- package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
- package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
- package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
- package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
- package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
- package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
- package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
- package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
- package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
- package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
- package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
- package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
- package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
- package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
- package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
- package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
- package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
- package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
- package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
- package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
- package/node_modules/node-datachannel/src/index.ts +0 -9
- package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
- package/node_modules/node-datachannel/src/lib/index.ts +0 -290
- package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
- package/node_modules/node-datachannel/src/lib/types.ts +0 -169
- package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
- package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
- package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
- package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
- package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
- package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
- package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
- package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
- package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
- package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
- package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
- package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
- package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
- package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
- package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
- package/node_modules/node-datachannel/tsconfig.json +0 -21
- package/node_modules/p-limit/index.d.ts +0 -38
- package/node_modules/p-limit/index.js +0 -57
- package/node_modules/p-limit/license +0 -9
- package/node_modules/p-limit/package.json +0 -52
- package/node_modules/p-limit/readme.md +0 -101
- package/node_modules/p-locate/index.d.ts +0 -64
- package/node_modules/p-locate/index.js +0 -52
- package/node_modules/p-locate/license +0 -9
- package/node_modules/p-locate/package.json +0 -53
- package/node_modules/p-locate/readme.md +0 -90
- package/node_modules/p-try/index.d.ts +0 -39
- package/node_modules/p-try/index.js +0 -9
- package/node_modules/p-try/license +0 -9
- package/node_modules/p-try/package.json +0 -42
- package/node_modules/p-try/readme.md +0 -58
- package/node_modules/path-exists/index.d.ts +0 -28
- package/node_modules/path-exists/index.js +0 -23
- package/node_modules/path-exists/license +0 -9
- package/node_modules/path-exists/package.json +0 -39
- package/node_modules/path-exists/readme.md +0 -52
- package/node_modules/pngjs/.eslintignore +0 -2
- package/node_modules/pngjs/.eslintrc.json +0 -19
- package/node_modules/pngjs/.prettierignore +0 -3
- package/node_modules/pngjs/LICENSE +0 -20
- package/node_modules/pngjs/README.md +0 -429
- package/node_modules/pngjs/browser.js +0 -16096
- package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
- package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
- package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
- package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
- package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
- package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
- package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
- package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
- package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
- package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
- package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
- package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
- package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
- package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
- package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
- package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
- package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
- package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
- package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
- package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
- package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
- package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
- package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
- package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
- package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
- package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
- package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
- package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
- package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
- package/node_modules/pngjs/coverage/lcov.info +0 -2177
- package/node_modules/pngjs/lib/bitmapper.js +0 -267
- package/node_modules/pngjs/lib/bitpacker.js +0 -158
- package/node_modules/pngjs/lib/chunkstream.js +0 -189
- package/node_modules/pngjs/lib/constants.js +0 -32
- package/node_modules/pngjs/lib/crc.js +0 -40
- package/node_modules/pngjs/lib/filter-pack.js +0 -171
- package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
- package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
- package/node_modules/pngjs/lib/filter-parse.js +0 -177
- package/node_modules/pngjs/lib/format-normaliser.js +0 -93
- package/node_modules/pngjs/lib/interlace.js +0 -95
- package/node_modules/pngjs/lib/packer-async.js +0 -50
- package/node_modules/pngjs/lib/packer-sync.js +0 -56
- package/node_modules/pngjs/lib/packer.js +0 -129
- package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
- package/node_modules/pngjs/lib/parser-async.js +0 -165
- package/node_modules/pngjs/lib/parser-sync.js +0 -108
- package/node_modules/pngjs/lib/parser.js +0 -290
- package/node_modules/pngjs/lib/png-sync.js +0 -12
- package/node_modules/pngjs/lib/png.js +0 -194
- package/node_modules/pngjs/lib/sync-inflate.js +0 -168
- package/node_modules/pngjs/lib/sync-reader.js +0 -45
- package/node_modules/pngjs/package.json +0 -73
- package/node_modules/qrcode/README.md +0 -770
- package/node_modules/qrcode/bin/qrcode +0 -159
- package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
- package/node_modules/qrcode/helper/to-sjis.js +0 -105
- package/node_modules/qrcode/lib/browser.js +0 -76
- package/node_modules/qrcode/lib/can-promise.js +0 -7
- package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
- package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
- package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
- package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
- package/node_modules/qrcode/lib/core/byte-data.js +0 -30
- package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
- package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
- package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
- package/node_modules/qrcode/lib/core/format-info.js +0 -29
- package/node_modules/qrcode/lib/core/galois-field.js +0 -69
- package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
- package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
- package/node_modules/qrcode/lib/core/mode.js +0 -167
- package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
- package/node_modules/qrcode/lib/core/polynomial.js +0 -62
- package/node_modules/qrcode/lib/core/qrcode.js +0 -495
- package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
- package/node_modules/qrcode/lib/core/regex.js +0 -31
- package/node_modules/qrcode/lib/core/segments.js +0 -330
- package/node_modules/qrcode/lib/core/utils.js +0 -63
- package/node_modules/qrcode/lib/core/version-check.js +0 -9
- package/node_modules/qrcode/lib/core/version.js +0 -163
- package/node_modules/qrcode/lib/index.js +0 -12
- package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
- package/node_modules/qrcode/lib/renderer/png.js +0 -78
- package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
- package/node_modules/qrcode/lib/renderer/svg.js +0 -19
- package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
- package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
- package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
- package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
- package/node_modules/qrcode/lib/renderer/utils.js +0 -99
- package/node_modules/qrcode/lib/server.js +0 -138
- package/node_modules/qrcode/license +0 -10
- package/node_modules/qrcode/package.json +0 -77
- package/node_modules/require-directory/.jshintrc +0 -67
- package/node_modules/require-directory/.npmignore +0 -1
- package/node_modules/require-directory/.travis.yml +0 -3
- package/node_modules/require-directory/LICENSE +0 -22
- package/node_modules/require-directory/README.markdown +0 -184
- package/node_modules/require-directory/index.js +0 -86
- package/node_modules/require-directory/package.json +0 -40
- package/node_modules/require-main-filename/CHANGELOG.md +0 -26
- package/node_modules/require-main-filename/LICENSE.txt +0 -14
- package/node_modules/require-main-filename/README.md +0 -26
- package/node_modules/require-main-filename/index.js +0 -18
- package/node_modules/require-main-filename/package.json +0 -35
- package/node_modules/semver/LICENSE +0 -15
- package/node_modules/semver/README.md +0 -680
- package/node_modules/semver/bin/semver.js +0 -195
- package/node_modules/semver/classes/comparator.js +0 -143
- package/node_modules/semver/classes/index.js +0 -7
- package/node_modules/semver/classes/range.js +0 -577
- package/node_modules/semver/classes/semver.js +0 -350
- package/node_modules/semver/functions/clean.js +0 -8
- package/node_modules/semver/functions/cmp.js +0 -54
- package/node_modules/semver/functions/coerce.js +0 -62
- package/node_modules/semver/functions/compare-build.js +0 -9
- package/node_modules/semver/functions/compare-loose.js +0 -5
- package/node_modules/semver/functions/compare.js +0 -7
- package/node_modules/semver/functions/diff.js +0 -60
- package/node_modules/semver/functions/eq.js +0 -5
- package/node_modules/semver/functions/gt.js +0 -5
- package/node_modules/semver/functions/gte.js +0 -5
- package/node_modules/semver/functions/inc.js +0 -21
- package/node_modules/semver/functions/lt.js +0 -5
- package/node_modules/semver/functions/lte.js +0 -5
- package/node_modules/semver/functions/major.js +0 -5
- package/node_modules/semver/functions/minor.js +0 -5
- package/node_modules/semver/functions/neq.js +0 -5
- package/node_modules/semver/functions/parse.js +0 -18
- package/node_modules/semver/functions/patch.js +0 -5
- package/node_modules/semver/functions/prerelease.js +0 -8
- package/node_modules/semver/functions/rcompare.js +0 -5
- package/node_modules/semver/functions/rsort.js +0 -5
- package/node_modules/semver/functions/satisfies.js +0 -12
- package/node_modules/semver/functions/sort.js +0 -5
- package/node_modules/semver/functions/truncate.js +0 -48
- package/node_modules/semver/functions/valid.js +0 -8
- package/node_modules/semver/index.js +0 -93
- package/node_modules/semver/internal/constants.js +0 -37
- package/node_modules/semver/internal/debug.js +0 -11
- package/node_modules/semver/internal/identifiers.js +0 -29
- package/node_modules/semver/internal/lrucache.js +0 -42
- package/node_modules/semver/internal/parse-options.js +0 -17
- package/node_modules/semver/internal/re.js +0 -223
- package/node_modules/semver/package.json +0 -78
- package/node_modules/semver/preload.js +0 -4
- package/node_modules/semver/range.bnf +0 -17
- package/node_modules/semver/ranges/gtr.js +0 -6
- package/node_modules/semver/ranges/intersects.js +0 -9
- package/node_modules/semver/ranges/ltr.js +0 -6
- package/node_modules/semver/ranges/max-satisfying.js +0 -27
- package/node_modules/semver/ranges/min-satisfying.js +0 -26
- package/node_modules/semver/ranges/min-version.js +0 -63
- package/node_modules/semver/ranges/outside.js +0 -82
- package/node_modules/semver/ranges/simplify.js +0 -49
- package/node_modules/semver/ranges/subset.js +0 -249
- package/node_modules/semver/ranges/to-comparators.js +0 -10
- package/node_modules/semver/ranges/valid.js +0 -13
- package/node_modules/set-blocking/CHANGELOG.md +0 -26
- package/node_modules/set-blocking/LICENSE.txt +0 -14
- package/node_modules/set-blocking/README.md +0 -31
- package/node_modules/set-blocking/index.js +0 -7
- package/node_modules/set-blocking/package.json +0 -42
- package/node_modules/sharp/LICENSE +0 -191
- package/node_modules/sharp/README.md +0 -112
- package/node_modules/sharp/dist/channel.cjs +0 -177
- package/node_modules/sharp/dist/channel.mjs +0 -177
- package/node_modules/sharp/dist/colour.cjs +0 -199
- package/node_modules/sharp/dist/colour.mjs +0 -199
- package/node_modules/sharp/dist/composite.cjs +0 -213
- package/node_modules/sharp/dist/composite.mjs +0 -213
- package/node_modules/sharp/dist/constructor.cjs +0 -511
- package/node_modules/sharp/dist/constructor.mjs +0 -511
- package/node_modules/sharp/dist/index.cjs +0 -25
- package/node_modules/sharp/dist/index.d.cts +0 -1999
- package/node_modules/sharp/dist/index.d.mts +0 -2046
- package/node_modules/sharp/dist/index.mjs +0 -25
- package/node_modules/sharp/dist/input.cjs +0 -819
- package/node_modules/sharp/dist/input.mjs +0 -819
- package/node_modules/sharp/dist/is.cjs +0 -143
- package/node_modules/sharp/dist/is.mjs +0 -143
- package/node_modules/sharp/dist/libvips.cjs +0 -212
- package/node_modules/sharp/dist/libvips.mjs +0 -212
- package/node_modules/sharp/dist/operation.cjs +0 -1002
- package/node_modules/sharp/dist/operation.mjs +0 -1002
- package/node_modules/sharp/dist/output.cjs +0 -1785
- package/node_modules/sharp/dist/output.mjs +0 -1785
- package/node_modules/sharp/dist/resize.cjs +0 -617
- package/node_modules/sharp/dist/resize.mjs +0 -617
- package/node_modules/sharp/dist/sharp.cjs +0 -174
- package/node_modules/sharp/dist/sharp.mjs +0 -174
- package/node_modules/sharp/dist/utility.cjs +0 -301
- package/node_modules/sharp/dist/utility.mjs +0 -301
- package/node_modules/sharp/install/build.js +0 -38
- package/node_modules/sharp/lib/index.d.ts +0 -1999
- package/node_modules/sharp/package.json +0 -227
- package/node_modules/sharp/src/binding.gyp +0 -303
- package/node_modules/sharp/src/common.cc +0 -1186
- package/node_modules/sharp/src/common.h +0 -421
- package/node_modules/sharp/src/metadata.cc +0 -404
- package/node_modules/sharp/src/metadata.h +0 -95
- package/node_modules/sharp/src/operations.cc +0 -516
- package/node_modules/sharp/src/operations.h +0 -137
- package/node_modules/sharp/src/pipeline.cc +0 -1948
- package/node_modules/sharp/src/pipeline.h +0 -422
- package/node_modules/sharp/src/sharp.cc +0 -43
- package/node_modules/sharp/src/stats.cc +0 -186
- package/node_modules/sharp/src/stats.h +0 -62
- package/node_modules/sharp/src/utilities.cc +0 -289
- package/node_modules/sharp/src/utilities.h +0 -22
- package/node_modules/string-width/index.d.ts +0 -29
- package/node_modules/string-width/index.js +0 -47
- package/node_modules/string-width/license +0 -9
- package/node_modules/string-width/package.json +0 -56
- package/node_modules/string-width/readme.md +0 -50
- package/node_modules/strip-ansi/index.d.ts +0 -17
- package/node_modules/strip-ansi/index.js +0 -4
- package/node_modules/strip-ansi/license +0 -9
- package/node_modules/strip-ansi/package.json +0 -54
- package/node_modules/strip-ansi/readme.md +0 -46
- package/node_modules/which-module/LICENSE +0 -13
- package/node_modules/which-module/README.md +0 -58
- package/node_modules/which-module/index.js +0 -9
- package/node_modules/which-module/package.json +0 -41
- package/node_modules/wrap-ansi/index.js +0 -186
- package/node_modules/wrap-ansi/license +0 -9
- package/node_modules/wrap-ansi/package.json +0 -61
- package/node_modules/wrap-ansi/readme.md +0 -97
- package/node_modules/ws/LICENSE +0 -20
- package/node_modules/ws/README.md +0 -548
- package/node_modules/ws/browser.js +0 -8
- package/node_modules/ws/index.js +0 -22
- package/node_modules/ws/lib/buffer-util.js +0 -131
- package/node_modules/ws/lib/constants.js +0 -19
- package/node_modules/ws/lib/event-target.js +0 -292
- package/node_modules/ws/lib/extension.js +0 -203
- package/node_modules/ws/lib/limiter.js +0 -55
- package/node_modules/ws/lib/permessage-deflate.js +0 -530
- package/node_modules/ws/lib/receiver.js +0 -743
- package/node_modules/ws/lib/sender.js +0 -607
- package/node_modules/ws/lib/stream.js +0 -161
- package/node_modules/ws/lib/subprotocol.js +0 -62
- package/node_modules/ws/lib/validation.js +0 -152
- package/node_modules/ws/lib/websocket-server.js +0 -562
- package/node_modules/ws/lib/websocket.js +0 -1407
- package/node_modules/ws/package.json +0 -74
- package/node_modules/ws/wrapper.mjs +0 -21
- package/node_modules/y18n/CHANGELOG.md +0 -35
- package/node_modules/y18n/LICENSE +0 -13
- package/node_modules/y18n/README.md +0 -109
- package/node_modules/y18n/index.js +0 -188
- package/node_modules/y18n/package.json +0 -39
- package/node_modules/yargs/CHANGELOG.md +0 -420
- package/node_modules/yargs/LICENSE +0 -21
- package/node_modules/yargs/README.md +0 -140
- package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
- package/node_modules/yargs/build/lib/apply-extends.js +0 -65
- package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
- package/node_modules/yargs/build/lib/argsert.js +0 -65
- package/node_modules/yargs/build/lib/command.d.ts +0 -64
- package/node_modules/yargs/build/lib/command.js +0 -416
- package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
- package/node_modules/yargs/build/lib/common-types.js +0 -25
- package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
- package/node_modules/yargs/build/lib/completion-templates.js +0 -50
- package/node_modules/yargs/build/lib/completion.d.ts +0 -21
- package/node_modules/yargs/build/lib/completion.js +0 -135
- package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
- package/node_modules/yargs/build/lib/is-promise.js +0 -9
- package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
- package/node_modules/yargs/build/lib/levenshtein.js +0 -58
- package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
- package/node_modules/yargs/build/lib/middleware.js +0 -57
- package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
- package/node_modules/yargs/build/lib/obj-filter.js +0 -14
- package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
- package/node_modules/yargs/build/lib/parse-command.js +0 -36
- package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
- package/node_modules/yargs/build/lib/process-argv.js +0 -31
- package/node_modules/yargs/build/lib/usage.d.ts +0 -49
- package/node_modules/yargs/build/lib/usage.js +0 -540
- package/node_modules/yargs/build/lib/validation.d.ts +0 -34
- package/node_modules/yargs/build/lib/validation.js +0 -330
- package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
- package/node_modules/yargs/build/lib/yargs.js +0 -1190
- package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
- package/node_modules/yargs/build/lib/yerror.js +0 -11
- package/node_modules/yargs/index.js +0 -40
- package/node_modules/yargs/locales/be.json +0 -46
- package/node_modules/yargs/locales/de.json +0 -46
- package/node_modules/yargs/locales/en.json +0 -51
- package/node_modules/yargs/locales/es.json +0 -46
- package/node_modules/yargs/locales/fi.json +0 -49
- package/node_modules/yargs/locales/fr.json +0 -53
- package/node_modules/yargs/locales/hi.json +0 -49
- package/node_modules/yargs/locales/hu.json +0 -46
- package/node_modules/yargs/locales/id.json +0 -50
- package/node_modules/yargs/locales/it.json +0 -46
- package/node_modules/yargs/locales/ja.json +0 -51
- package/node_modules/yargs/locales/ko.json +0 -49
- package/node_modules/yargs/locales/nb.json +0 -44
- package/node_modules/yargs/locales/nl.json +0 -49
- package/node_modules/yargs/locales/nn.json +0 -44
- package/node_modules/yargs/locales/pirate.json +0 -13
- package/node_modules/yargs/locales/pl.json +0 -49
- package/node_modules/yargs/locales/pt.json +0 -45
- package/node_modules/yargs/locales/pt_BR.json +0 -48
- package/node_modules/yargs/locales/ru.json +0 -46
- package/node_modules/yargs/locales/th.json +0 -46
- package/node_modules/yargs/locales/tr.json +0 -48
- package/node_modules/yargs/locales/zh_CN.json +0 -48
- package/node_modules/yargs/locales/zh_TW.json +0 -47
- package/node_modules/yargs/package.json +0 -92
- package/node_modules/yargs/yargs.js +0 -14
- package/node_modules/yargs-parser/CHANGELOG.md +0 -601
- package/node_modules/yargs-parser/LICENSE.txt +0 -14
- package/node_modules/yargs-parser/README.md +0 -449
- package/node_modules/yargs-parser/index.js +0 -1032
- package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
- package/node_modules/yargs-parser/package.json +0 -46
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
# Code Relax
|
|
1
|
+
# Code Relax 工作站服务
|
|
2
|
+
|
|
3
|
+
Windows 与 Mac 的统一 npm 分发源码已就绪:主包按操作系统和 CPU 自动安装对应原生组件,普通用户无需自行编译。此结构尚未发布,线上 beta.29 仍为 Windows 包;Mac 原生包需在测试机编译验收。开发者使用 `npm run pack:release -- --output <新的输出目录>` 生成统一主包与当前平台组件包,详见 [npm 分发](../docs/npm-distribution.md)。
|
|
2
4
|
|
|
3
5
|
桌面服务让 HarmonyOS 客户端控制 Windows 上的Codex 内核。当前要求 Windows x64、Node >=22.12,以及已登录的 Codex Desktop 配套内核或独立 Codex CLI;npm 包不包含 Node,也不修改官方程序文件。
|
|
4
6
|
|
|
@@ -19,13 +21,14 @@ npm i -g @walkhi/code-relax@beta --allow-scripts=@walkhi/code-relax --foreground
|
|
|
19
21
|
```powershell
|
|
20
22
|
relax start # 启动/复用桌面服务、Codex 内核和已配置的 Code Relax 中继
|
|
21
23
|
relax pair # 启动/复用服务并打开配对二维码
|
|
22
|
-
relax doctor #
|
|
24
|
+
relax doctor # 查看工作站是否正常及需要处理的问题
|
|
25
|
+
relax diag # 输出供客服或技术人员使用的详细诊断报告
|
|
23
26
|
relax kernel-restart --confirm # 重启内核并启用已选更新,等待新内核就绪
|
|
24
27
|
```
|
|
25
28
|
|
|
26
29
|
Codex 内核由官方 `codex app-server --listen ws://127.0.0.1:45839` 提供执行服务,Desktop 和桌面服务均可连接;它只监听回环地址。桌面服务独立报告内核健康、Desktop 接入和手机可写状态;Desktop 退出后,手机仍可操作内核中的任务。同一 thread 已被另一个实例持有时,手机只读且可重新检测。
|
|
27
30
|
|
|
28
|
-
发现待启用内核更新时,手机“重启并更新”和 `relax kernel-restart --confirm` 复用同一受控停启流程:先验证候选,再停止旧内核,确认新内核协议就绪后恢复 Desktop,并按清单清理不再运行的旧版保留目录。手机工作站详情可确认让 Desktop 接入Codex 内核,独立进程逐步执行并保留桌面服务/中继连接,见[启用流程](../docs/shared-recovery.md)。本机恢复命令为 `relax desktop-recover --confirm
|
|
31
|
+
发现待启用内核更新时,手机“重启并更新”和 `relax kernel-restart --confirm` 复用同一受控停启流程:先验证候选,再停止旧内核,确认新内核协议就绪后恢复 Desktop,并按清单清理不再运行的旧版保留目录。手机工作站详情可确认让 Desktop 接入Codex 内核,独立进程逐步执行并保留桌面服务/中继连接,见[启用流程](../docs/shared-recovery.md)。本机恢复命令为 `relax desktop-recover --confirm`,查看恢复记录用 `relax diag`。桌面服务状态匹配且健康时直接复用;未知进程占用 45831/45839 时拒绝接管。
|
|
29
32
|
|
|
30
33
|
Codex 内核通过隐藏控制台启动,使后续控制台子进程继承隐藏窗口。手机的项目、任务列表和新建任务均使用Codex 内核,不依赖 Desktop 工具管道;项目和任务 ID 保持原生值。
|
|
31
34
|
|
|
@@ -78,3 +81,9 @@ npm uninstall -g @walkhi/code-relax
|
|
|
78
81
|
## 发布边界
|
|
79
82
|
|
|
80
83
|
registry 测试包使用 `@walkhi/code-relax@beta`,主 CLI 为 `relax`,并保留 `code-relax` 兼容入口。安装摘要通过 `--foreground-scripts` 显示,首次安装或启动链迁移时干净重启 Desktop,分别报告已安装与实际运行版本;登录启动使用当前用户任务计划。通信协议仍为 7。详细规则见 [npm 分发](../docs/npm-distribution.md)。
|
|
84
|
+
|
|
85
|
+
### CLI 输出(2026-10-15)
|
|
86
|
+
|
|
87
|
+
安装和启动成功后只显示结果与 `relax pair` 入口;配对成功显示二维码文件。`relax doctor` 报告工作站健康及实际问题,独立的 `relax diag` 默认用可读文本输出系统、Node、服务进程、逐项检查和 Desktop 接入排障记录;常规命令不再提供 `--detail`;`--json` 保留给安装器等现有程序调用。服务未运行或内核未就绪判为失败;未连接局域网只提示,不阻断中继使用。手机连通性不作为 CLI 检查项,doctor 不创建配对邀请。
|
|
88
|
+
|
|
89
|
+
`doctor` 默认逐项说明安装文件、工作站服务和 Codex 内核的当前状态,问题集中给出处理方法。上次 Desktop 接入记录仅由 `diag` 读取,并明确标注排障用途;常规 `doctor` 不读取该记录,不参与当前健康判定,不拼接互相矛盾的阶段消息与最终错误。
|
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { phonePairingSteps, desktopSetupSteps, pairingDisplayText } from '../src/onboarding.mjs';
|
|
3
3
|
import { lifecycle, readRecord, writeRecord } from '../src/service-lifecycle.mjs';
|
|
4
|
-
import { runtimePaths } from '../src/platform/
|
|
5
|
-
import * as host from '../src/platform/
|
|
4
|
+
import { runtimePaths } from '../src/platform/runtime-paths.mjs';
|
|
5
|
+
import * as host from '../src/platform/service-host.mjs';
|
|
6
6
|
import { installService, uninstallService, packageRoot } from '../src/service-install.mjs';
|
|
7
7
|
import { installSkill, removeSkill, inspectSkill } from '../src/skill-install.mjs';
|
|
8
|
-
import { doctor } from '../src/service-doctor.mjs';
|
|
8
|
+
import { doctor, formatDoctorOutput } from '../src/service-doctor.mjs';
|
|
9
9
|
import { launchDesktop } from '../src/desktop-launcher.mjs';
|
|
10
|
-
import { desktopHost, removeDesktopShortcut, residentStartup, resolveStateRoot } from '../src/platform/
|
|
10
|
+
import { desktopHost, removeDesktopShortcut, residentStartup, resolveStateRoot } from '../src/platform/desktop-host.mjs';
|
|
11
11
|
import { selfRelay } from '../src/self-relay/lifecycle.mjs';
|
|
12
12
|
import { fileURLToPath } from 'node:url';
|
|
13
13
|
import path from 'node:path';
|
|
14
|
+
import { executableKey } from '../src/platform/path-identity.mjs';
|
|
14
15
|
import fs from 'node:fs';
|
|
15
16
|
import { spawn } from 'node:child_process';
|
|
16
17
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
17
18
|
import { requestRecovery, recoveryWarning } from '../src/shared-recovery.mjs';
|
|
18
|
-
import { configureManagedEnvironment, clearManagedEnvironment } from '../src/platform/
|
|
19
|
-
import { resolveCodexRuntime } from '../src/platform/
|
|
19
|
+
import { configureManagedEnvironment, clearManagedEnvironment } from '../src/platform/user-environment.mjs';
|
|
20
|
+
import { resolveCodexRuntime } from '../src/platform/codex-runtime.mjs';
|
|
20
21
|
import { controlRequest } from '../src/service-control.mjs';
|
|
21
22
|
import { processAlive } from '../src/background-process.mjs';
|
|
23
|
+
import { prepareNativePackage } from '../src/platform/native-package.mjs';
|
|
22
24
|
import { managedAppServerUrl } from '../src/managed-app-server.mjs';
|
|
23
25
|
import { readDotsTasks } from '../src/dots-task-catalog.mjs';
|
|
26
|
+
import { installDesktopHelper, desktopHelperStatus, removeDesktopHelper } from '../src/platform/windows/desktop-helper.mjs';
|
|
24
27
|
|
|
25
|
-
const help = `Code Relax(Windows)
|
|
26
|
-
用法:relax <命令>
|
|
28
|
+
const help = `Code Relax(Windows / macOS)
|
|
29
|
+
用法:relax <命令>
|
|
27
30
|
常用指令:
|
|
28
31
|
start 启动或复用桌面服务和 Codex 内核,并恢复已配置的 Code Relax 中继
|
|
29
32
|
pair 启动或复用桌面服务,并打开一次性配对二维码
|
|
@@ -33,12 +36,17 @@ const help = `Code Relax(Windows)
|
|
|
33
36
|
dots-tasks 读取当前 ChatGPT 账号的 Dots 委派任务与最近轮次状态
|
|
34
37
|
维护指令:
|
|
35
38
|
setup 部署并启动桌面服务、Codex 内核和登录自启动;安全配置 Desktop 后续接入
|
|
36
|
-
|
|
39
|
+
setup --desktop-helper (Windows)同时安装受保护的桌面操作辅助服务,首次需要工作站 UAC 授权
|
|
40
|
+
desktop-helper-install (Windows)单独安装桌面操作辅助服务,保持现有桌面服务和 Codex 内核
|
|
41
|
+
desktop-helper-status (Windows)查看桌面操作辅助服务状态
|
|
42
|
+
desktop-helper-remove (Windows)移除桌面操作辅助服务,需要工作站 UAC 授权
|
|
43
|
+
doctor 简单检查工作站是否正常
|
|
44
|
+
diag 输出详细诊断报告,供客服或技术人员排查
|
|
37
45
|
kernel-restart --confirm 重启 Codex 内核并启用已选更新;等待新内核就绪
|
|
38
46
|
desktop-recover --confirm 重新打开 Desktop 并接入 Codex 内核;不强制重启已有内核
|
|
39
47
|
uninstall 停止并移除固定目录服务和本包 Skill,清理自有 Desktop 环境变量,保留其他配置与附件
|
|
40
48
|
默认监听 0.0.0.0,移动端与电脑需在同一受信任局域网。
|
|
41
|
-
--json
|
|
49
|
+
--json 仅供安装脚本等程序调用。`;
|
|
42
50
|
|
|
43
51
|
function currentNodeExecutable() {
|
|
44
52
|
const link = process.env.NVM_SYMLINK && path.join(process.env.NVM_SYMLINK, 'node.exe');
|
|
@@ -59,16 +67,25 @@ async function main() {
|
|
|
59
67
|
const options = flags.filter(flag => flag !== '--json');
|
|
60
68
|
const longPair = command === 'pair' && options.length === 2 && options[0] === '--expires';
|
|
61
69
|
const revokeInvite = command === 'pair-revoke' && options.length === 1 && /^[\w-]{16,128}$/.test(options[0]);
|
|
62
|
-
if (!['kernel-restart', 'desktop-recover', 'setup', 'doctor', 'uninstall', 'start', 'pair', 'pair-list', 'pair-revoke', 'dots-tasks'].includes(command)
|
|
63
|
-
|| (!longPair && !revokeInvite && (command === 'pair-revoke' || options.some(flag => !(['kernel-restart', 'desktop-recover'].includes(command) && flag === '--confirm'))))) {
|
|
70
|
+
if (!['kernel-restart', 'desktop-recover', 'setup', 'doctor', 'diag', 'uninstall', 'start', 'pair', 'pair-list', 'pair-revoke', 'dots-tasks', 'desktop-helper-install', 'desktop-helper-status', 'desktop-helper-remove'].includes(command)
|
|
71
|
+
|| (!longPair && !revokeInvite && (command === 'pair-revoke' || options.some(flag => !((['kernel-restart', 'desktop-recover'].includes(command) && flag === '--confirm') || (command === 'setup' && flag === '--desktop-helper')))))) {
|
|
64
72
|
throw new Error('无效命令或参数。使用 --help 查看用法。');
|
|
65
73
|
}
|
|
66
74
|
const inviteExpires = longPair ? Date.parse(options[1]) : undefined;
|
|
67
75
|
if (longPair && (!/(Z|[+-]\d{2}:\d{2})$/.test(options[1]) || !Number.isSafeInteger(inviteExpires) || inviteExpires <= Date.now())) {
|
|
68
76
|
throw new Error('截止时间必须在未来且含时区,例如 2026-11-01T00:00:00+08:00。');
|
|
69
77
|
}
|
|
70
|
-
if (process.platform
|
|
78
|
+
if (!['win32', 'darwin'].includes(process.platform)) throw new Error('工作站目前支持 Windows 和 macOS。');
|
|
79
|
+
if (process.platform !== 'win32' && (command.startsWith('desktop-helper-') || options.includes('--desktop-helper')))
|
|
80
|
+
throw new Error('Mac 版不提供远程桌面画面、鼠标和键盘控制。');
|
|
81
|
+
if (command === 'desktop-recover' && desktopHost.desktopIntegration === false)
|
|
82
|
+
throw new Error('Mac 的 Codex Desktop 自动接入尚未支持。');
|
|
71
83
|
const json = flags.includes('--json');
|
|
84
|
+
if (['desktop-helper-install', 'desktop-helper-status', 'desktop-helper-remove'].includes(command)) {
|
|
85
|
+
const result = command === 'desktop-helper-install' ? await installDesktopHelper() : command === 'desktop-helper-remove' ? await removeDesktopHelper() : await desktopHelperStatus();
|
|
86
|
+
console.log(json ? JSON.stringify(result) : result.removed ? '桌面操作辅助服务已移除。' : result.running ? '桌面操作辅助服务已就绪,手机可按需获取画面并确认点击。' : '桌面操作辅助服务尚未就绪,请运行 relax desktop-helper-install。');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
72
89
|
if (command === 'dots-tasks') {
|
|
73
90
|
const result = await readDotsTasks(managedAppServerUrl);
|
|
74
91
|
const statuses = { completed: '完成', inProgress: '进行中', failed: '失败', interrupted: '已中断' };
|
|
@@ -83,7 +100,7 @@ async function main() {
|
|
|
83
100
|
const installationPath = path.join(serviceRoot, 'installation.json');
|
|
84
101
|
const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(Number);
|
|
85
102
|
const currentNodeSupported = nodeMajor > 22 || (nodeMajor === 22 && nodeMinor >= 12);
|
|
86
|
-
const installed =
|
|
103
|
+
const installed = executableKey(fileURLToPath(import.meta.url)) === executableKey(installedEntry);
|
|
87
104
|
const installation = readRecord(installationPath);
|
|
88
105
|
if (installation?.nodeExecutable && !fs.existsSync(installation.nodeExecutable) && currentNodeSupported
|
|
89
106
|
&& ['start', 'pair', 'doctor'].includes(command)) {
|
|
@@ -166,19 +183,21 @@ async function main() {
|
|
|
166
183
|
if (longPair) await selfRelay('relay-start', stateRoot);
|
|
167
184
|
const result = await selfRelay(longPair ? 'invite-create' : 'relay-pair', stateRoot, longPair ? { expires: inviteExpires } : undefined);
|
|
168
185
|
if (!json && result.qrPath) {
|
|
169
|
-
const viewer = spawn('explorer.exe', [result.qrPath], { detached: true, stdio: 'ignore', windowsHide: true });
|
|
186
|
+
const viewer = spawn(process.platform === 'darwin' ? '/usr/bin/open' : 'explorer.exe', [result.qrPath], { detached: true, stdio: 'ignore', windowsHide: true });
|
|
187
|
+
viewer.once('error', error => console.error(`无法打开二维码:${error.message}`));
|
|
170
188
|
viewer.unref();
|
|
171
189
|
}
|
|
172
|
-
console.log(json ? JSON.stringify(result) :
|
|
190
|
+
console.log(json ? JSON.stringify(result) : `配对二维码已生成。\n${result.displayText}\n二维码文件:${result.qrPath}`);
|
|
173
191
|
return;
|
|
174
192
|
}
|
|
175
|
-
if (command === 'doctor') {
|
|
176
|
-
const result = await doctor({ paths, host, service, ensureAutostart });
|
|
177
|
-
console.log(json ? JSON.stringify(result) : result
|
|
193
|
+
if (command === 'doctor' || command === 'diag') {
|
|
194
|
+
const result = await doctor({ paths, host, service, ensureAutostart, diagnostics: command === 'diag' });
|
|
195
|
+
console.log(json ? JSON.stringify(result) : formatDoctorOutput(result, command === 'diag'));
|
|
178
196
|
if (!result.ready) process.exitCode = 1;
|
|
179
197
|
return;
|
|
180
198
|
}
|
|
181
199
|
if (command === 'uninstall') {
|
|
200
|
+
const desktopHelper = process.platform === 'win32' ? await removeDesktopHelper() : { removed: false, supported: false };
|
|
182
201
|
const skill = inspectSkill();
|
|
183
202
|
let environment;
|
|
184
203
|
const result = await uninstallService(paths, service, async () => {
|
|
@@ -188,14 +207,18 @@ async function main() {
|
|
|
188
207
|
if (installation?.nodeExecutable) await residentStartup({ serviceRoot, nodeExecutable: installation.nodeExecutable }, 'disable');
|
|
189
208
|
});
|
|
190
209
|
result.environment = environment;
|
|
210
|
+
result.desktopHelper = desktopHelper;
|
|
191
211
|
result.skill = skill.managed ? removeSkill() : { removed: false, message: '未移除自定义或未安装的 Skill。' };
|
|
192
|
-
result.message =
|
|
193
|
-
? '
|
|
194
|
-
:
|
|
212
|
+
result.message = process.platform === 'darwin'
|
|
213
|
+
? '固定目录服务已卸载;配置、附件、钥匙串凭据和可能仍在执行任务的 Codex 内核已保留。'
|
|
214
|
+
: environment?.preserved
|
|
215
|
+
? '固定目录服务已卸载;检测到用户自定义的 CODEX_APP_SERVER_WS_URL,已保留。配置、附件和可能仍在执行任务的 app-server 也已保留;重启电脑可结束该进程。npm 命令入口可再用 npm uninstall -g @walkhi/code-relax 移除。'
|
|
216
|
+
: '固定目录服务已卸载;Code Relax 设置的 app-server 环境变量已清理,其他配置、附件和可能仍在执行任务的 app-server 已保留;重启电脑可结束该进程。npm 命令入口可再用 npm uninstall -g @walkhi/code-relax 移除。';
|
|
195
217
|
console.log(json ? JSON.stringify(result) : `${result.message}\n${result.skill.message}`);
|
|
196
218
|
return;
|
|
197
219
|
}
|
|
198
220
|
if (command === 'setup') {
|
|
221
|
+
prepareNativePackage(packageRoot(path.dirname(fileURLToPath(import.meta.url))));
|
|
199
222
|
const [major, minor] = process.versions.node.split('.').map(Number);
|
|
200
223
|
if (major < 22 || (major === 22 && minor < 12)) throw new Error('需要 Node >=22.12。');
|
|
201
224
|
const physicalStateRoot = await resolveStateRoot(stateRoot);
|
|
@@ -209,7 +232,7 @@ async function main() {
|
|
|
209
232
|
const hadInstalledService = fs.existsSync(path.join(serviceRoot, 'installation.json'));
|
|
210
233
|
const previousInstallation = readRecord(path.join(serviceRoot, 'installation.json'));
|
|
211
234
|
if (previousInstallation?.nodeExecutable) await removeDesktopShortcut({ serviceRoot, nodeExecutable: previousInstallation.nodeExecutable });
|
|
212
|
-
const desktopBeforeSetup = await desktopHost.inspect();
|
|
235
|
+
const desktopBeforeSetup = desktopHost.desktopIntegration === false ? { running: false, desktop: null } : await desktopHost.inspect();
|
|
213
236
|
const runtime = await resolveCodexRuntime(physicalStateRoot, { refresh: true });
|
|
214
237
|
const desktopNeedsAttach = desktopBeforeSetup.running && !await host.sharedServiceUrl();
|
|
215
238
|
const previous = hadInstalledService ? await service.status() : { processRunning: false };
|
|
@@ -258,7 +281,7 @@ async function main() {
|
|
|
258
281
|
throw new Error(bridge.managedAppServer?.error || '桌面服务已安装,但 Codex 内核未就绪;未写入 Desktop 环境变量。');
|
|
259
282
|
}
|
|
260
283
|
const environment = desktopBeforeSetup.desktop
|
|
261
|
-
? await configureManagedEnvironment(physicalStateRoot) : { configured: false, reason: 'desktop-not-installed' };
|
|
284
|
+
? await configureManagedEnvironment(physicalStateRoot) : { configured: false, reason: desktopHost.desktopIntegration === false ? 'desktop-integration-unsupported' : 'desktop-not-installed' };
|
|
262
285
|
let managedAppServerMigrated = false;
|
|
263
286
|
const managedAppServerMigration = {
|
|
264
287
|
required: bridge.managedAppServer.launcherRestartRequired === true,
|
|
@@ -268,7 +291,7 @@ async function main() {
|
|
|
268
291
|
let desktopRestarted = false;
|
|
269
292
|
let desktopRestartReason = null;
|
|
270
293
|
if (managedAppServerMigration.required) {
|
|
271
|
-
const desktopInfo = await desktopHost.inspect();
|
|
294
|
+
const desktopInfo = desktopHost.desktopIntegration === false ? { running: false } : await desktopHost.inspect();
|
|
272
295
|
const desktopAttached = desktopInfo.running
|
|
273
296
|
&& (bridge.desktop?.attachedToManagedServer === true || Boolean(await host.sharedServiceUrl()));
|
|
274
297
|
if (desktopAttached) await desktopHost.closeDesktop(desktopInfo.desktop);
|
|
@@ -314,31 +337,25 @@ async function main() {
|
|
|
314
337
|
launcherRevision: bridge.managedAppServer.launcherRevision ?? null };
|
|
315
338
|
installed.desktopRestarted = desktopRestarted;
|
|
316
339
|
installed.desktopRestartReason = desktopRestartReason;
|
|
317
|
-
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
: '使用独立 Codex CLI;无需安装 Codex Desktop。';
|
|
322
|
-
console.log(json ? JSON.stringify({ ...installed, nextSteps: desktopSetupSteps, displayText: `${migrationText}${desktopSetupSteps.join('\n')}\n${restartText}` }) : `桌面服务已安装:${installed.serviceRoot}\n使用已安装的 Node:${installed.nodeExecutable}\nCodex 内核已就绪;首次联网可能需要 Windows 防火墙授权。\n${migrationText}${desktopSetupSteps.join('\n')}\n${restartText}`);
|
|
340
|
+
if (options.includes('--desktop-helper')) installed.desktopHelper = await installDesktopHelper();
|
|
341
|
+
const migrationText = managedAppServerMigrated ? 'Codex 内核已更新并重启;请检查安装前正在进行的任务。\n' : '';
|
|
342
|
+
const displayText = `Code Relax ${installed.version} 安装成功。\n${migrationText}${desktopSetupSteps.join('\n')}`;
|
|
343
|
+
console.log(json ? JSON.stringify({ ...installed, nextSteps: desktopSetupSteps, displayText }) : displayText);
|
|
323
344
|
return;
|
|
324
345
|
}
|
|
325
346
|
if (!json && command === 'start') console.log('正在检查电脑连接并准备桌面服务…');
|
|
326
347
|
await ensureAutostart();
|
|
327
348
|
const result = await service[command]();
|
|
328
349
|
const { accessUrl, qrPath: _legacyQrPath, ...metadata } = result;
|
|
329
|
-
const notice = '本机服务检查通过,移动端连通性尚未验证。若电脑弹出 Node 网络访问提示,请先处理 Windows 防火墙授权,再用移动端连接。';
|
|
330
350
|
let relay;
|
|
331
351
|
if (fs.existsSync(path.join(stateRoot, 'self-relay-config.json'))) relay = await selfRelay('relay-status', stateRoot);
|
|
332
352
|
const nextSteps = phonePairingSteps(metadata.transportMode, relay?.paired === true);
|
|
333
|
-
const displayText = pairingDisplayText(nextSteps
|
|
353
|
+
const displayText = pairingDisplayText(nextSteps);
|
|
334
354
|
const output = { ...metadata, ...(relay ? { relayConnected: relay.relayConnected,
|
|
335
355
|
paired: relay.paired, clientCount: relay.clientCount, ...(relay.qrPath ? { qrPath: relay.qrPath, expiresAt: relay.expiresAt } : {}) } : {}),
|
|
336
|
-
nextSteps, displayText, mode: 'lan', listenAddress: '0.0.0.0', address: new URL(accessUrl).host
|
|
337
|
-
lanAccess: 'unverified', notice };
|
|
356
|
+
nextSteps, displayText, mode: 'lan', listenAddress: '0.0.0.0', address: new URL(accessUrl).host };
|
|
338
357
|
if (json) console.log(JSON.stringify(output));
|
|
339
358
|
else {
|
|
340
|
-
console.log('电脑连接检查通过 · 桌面服务已就绪');
|
|
341
|
-
console.log(`局域网模式:监听 0.0.0.0:${result.port},连接地址 ${output.address},PID ${result.pid}`);
|
|
342
359
|
if (relay?.qrPath) console.log(`配对二维码:${relay.qrPath}`);
|
|
343
360
|
console.log(displayText);
|
|
344
361
|
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import mysql from 'mysql2/promise';
|
|
4
|
-
|
|
5
|
-
const path = process.env.RELAY_MYSQL_CONFIG_FILE;
|
|
6
|
-
const action = process.argv[2];
|
|
7
|
-
const email = (process.argv[3] || '').trim().toLowerCase();
|
|
8
|
-
if (!path || !['--grant', '--revoke', '--list'].includes(action) ||
|
|
9
|
-
(action !== '--list' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))) {
|
|
10
|
-
throw new Error('Use --grant EMAIL, --revoke EMAIL or --list with RELAY_MYSQL_CONFIG_FILE');
|
|
11
|
-
}
|
|
12
|
-
const db = await mysql.createConnection({ ...JSON.parse(fs.readFileSync(path, 'utf8')),
|
|
13
|
-
dateStrings: true, timezone: 'Z', multipleStatements: false });
|
|
14
|
-
try {
|
|
15
|
-
if (action === '--grant') await db.execute(`INSERT INTO relay_admin_emails (email,granted_at)
|
|
16
|
-
VALUES (?,UTC_TIMESTAMP(3)) ON DUPLICATE KEY UPDATE email=VALUES(email)`, [email]);
|
|
17
|
-
else if (action === '--revoke') await db.execute('DELETE FROM relay_admin_emails WHERE email=?', [email]);
|
|
18
|
-
const [rows] = await db.query('SELECT email FROM relay_admin_emails ORDER BY email');
|
|
19
|
-
console.log(JSON.stringify({ admins: rows.map(row => row.email) }));
|
|
20
|
-
} finally { await db.end(); }
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import mysql from 'mysql2/promise';
|
|
4
|
+
|
|
5
|
+
const path = process.env.RELAY_MYSQL_CONFIG_FILE;
|
|
6
|
+
const action = process.argv[2];
|
|
7
|
+
const email = (process.argv[3] || '').trim().toLowerCase();
|
|
8
|
+
if (!path || !['--grant', '--revoke', '--list'].includes(action) ||
|
|
9
|
+
(action !== '--list' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))) {
|
|
10
|
+
throw new Error('Use --grant EMAIL, --revoke EMAIL or --list with RELAY_MYSQL_CONFIG_FILE');
|
|
11
|
+
}
|
|
12
|
+
const db = await mysql.createConnection({ ...JSON.parse(fs.readFileSync(path, 'utf8')),
|
|
13
|
+
dateStrings: true, timezone: 'Z', multipleStatements: false });
|
|
14
|
+
try {
|
|
15
|
+
if (action === '--grant') await db.execute(`INSERT INTO relay_admin_emails (email,granted_at)
|
|
16
|
+
VALUES (?,UTC_TIMESTAMP(3)) ON DUPLICATE KEY UPDATE email=VALUES(email)`, [email]);
|
|
17
|
+
else if (action === '--revoke') await db.execute('DELETE FROM relay_admin_emails WHERE email=?', [email]);
|
|
18
|
+
const [rows] = await db.query('SELECT email FROM relay_admin_emails ORDER BY email');
|
|
19
|
+
console.log(JSON.stringify({ admins: rows.map(row => row.email) }));
|
|
20
|
+
} finally { await db.end(); }
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import { createHash } from 'node:crypto';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import mysql from 'mysql2/promise';
|
|
6
|
-
import { relaySchemaVersions } from '../database/versions.mjs';
|
|
7
|
-
import { deviceStore } from '../src/self-relay/device-store.mjs';
|
|
8
|
-
import { relayAdminState } from '../src/self-relay/admin-state.mjs';
|
|
9
|
-
|
|
10
|
-
const command = process.argv[2];
|
|
11
|
-
if (!['--schema', '--import', '--check'].includes(command) || !process.env.RELAY_MYSQL_CONFIG_FILE) {
|
|
12
|
-
throw new Error('Use --schema, --import or --check with RELAY_MYSQL_CONFIG_FILE');
|
|
13
|
-
}
|
|
14
|
-
const config = JSON.parse(fs.readFileSync(process.env.RELAY_MYSQL_CONFIG_FILE, 'utf8'));
|
|
15
|
-
const db = await mysql.createConnection({ ...config, dateStrings: true, timezone: 'Z', multipleStatements: false });
|
|
16
|
-
const sqlTime = value => value.replace('T', ' ').replace(/Z$/, '');
|
|
17
|
-
const migrations = relaySchemaVersions;
|
|
18
|
-
try {
|
|
19
|
-
if (command === '--schema') {
|
|
20
|
-
const [existing] = await db.query("SHOW TABLES LIKE 'schema_migrations'");
|
|
21
|
-
const [applied] = existing.length ? await db.query('SELECT version, sha256 FROM schema_migrations') : [[]];
|
|
22
|
-
const known = new Map(applied.map(row => [row.version, row.sha256]));
|
|
23
|
-
if (known.size !== applied.length || [...known.keys()].some(version => !migrations.includes(version))) throw new Error('Unexpected schema version');
|
|
24
|
-
for (const version of migrations) {
|
|
25
|
-
const source = fs.readFileSync(fileURLToPath(new URL(`../database/${version}.sql`, import.meta.url)), 'utf8');
|
|
26
|
-
const sha256 = createHash('sha256').update(source).digest('hex');
|
|
27
|
-
if (known.has(version)) {
|
|
28
|
-
if (known.get(version) !== sha256) throw new Error(`Migration changed: ${version}`);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (version !== migrations[0] && !known.has(migrations[migrations.indexOf(version) - 1])) throw new Error('Previous migration missing');
|
|
32
|
-
const statements = source.split('\n').filter(line => !line.trimStart().startsWith('--')).join('\n');
|
|
33
|
-
for (const statement of statements.split(';').map(item => item.trim()).filter(Boolean)) await db.query(statement);
|
|
34
|
-
await db.execute('INSERT INTO schema_migrations (version, sha256) VALUES (?,?)', [version, sha256]);
|
|
35
|
-
known.set(version, sha256);
|
|
36
|
-
console.log(JSON.stringify({ schema: version, sha256 }));
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
const [versions] = await db.query('SELECT version FROM schema_migrations');
|
|
40
|
-
if (!versions.some(row => row.version === '001_relay_core') || versions.some(row => !migrations.includes(row.version))) throw new Error('Unexpected schema version');
|
|
41
|
-
if (command === '--check') {
|
|
42
|
-
const names = ['computers', 'mobile_authorizations', 'official_computers', 'announcements', 'relay_settings', 'users', 'user_login_identities'];
|
|
43
|
-
if (versions.some(row => row.version === '002_email_accounts')) names.push('email_login_challenges', 'user_sessions', 'email_send_limits');
|
|
44
|
-
if (versions.some(row => row.version === '003_relay_usage')) names.push('relay_admin_emails', 'relay_usage_settings', 'relay_usage_totals', 'relay_usage_computer_totals', 'relay_usage_entitlements', 'relay_usage_budgets', 'relay_usage_computer_budgets', 'relay_usage_sessions');
|
|
45
|
-
if (versions.some(row => row.version === '004_relay_usage_actions')) names.push('relay_usage_actions');
|
|
46
|
-
if (versions.some(row => row.version === '006_relay_diagnostics')) names.push('relay_diagnostics');
|
|
47
|
-
if (versions.some(row => row.version === '007_relay_usage_daily')) names.push('relay_usage_user_days', 'relay_usage_computer_days');
|
|
48
|
-
const counts = {};
|
|
49
|
-
for (const name of names) { const [rows] = await db.query(`SELECT COUNT(*) AS count FROM ${name}`); counts[name] = rows[0].count; }
|
|
50
|
-
if (process.env.RELAY_STATE_FILE && process.env.RELAY_ADMIN_STATE_FILE) {
|
|
51
|
-
const devices = deviceStore(process.env.RELAY_STATE_FILE).entries();
|
|
52
|
-
const admin = relayAdminState(process.env.RELAY_ADMIN_STATE_FILE, 8).read();
|
|
53
|
-
const expected = { computers: devices.length,
|
|
54
|
-
mobile_authorizations: devices.reduce((sum, item) => sum + item.clients.length, 0),
|
|
55
|
-
official_computers: devices.filter(item => item.officialComputer).length,
|
|
56
|
-
announcements: admin.announcements.length, relay_settings: 1 };
|
|
57
|
-
if (Object.keys(expected).some(name => counts[name] !== expected[name])) throw new Error('Imported row counts differ from JSON');
|
|
58
|
-
const [saved] = await db.query('SELECT id,host_hash,status,revision FROM computers');
|
|
59
|
-
const original = new Map(devices.map(item => [item.id, item]));
|
|
60
|
-
for (const row of saved) {
|
|
61
|
-
const item = original.get(row.id);
|
|
62
|
-
if (!item || item.hostHash !== row.host_hash || item.status !== row.status || item.revision !== Number(row.revision)) {
|
|
63
|
-
throw new Error('Imported computer identity differs from JSON');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const [authorized] = await db.query('SELECT computer_id,client_id,credential_hash FROM mobile_authorizations');
|
|
67
|
-
for (const row of authorized) {
|
|
68
|
-
const item = original.get(row.computer_id)?.clients.find(client => client.id === row.client_id);
|
|
69
|
-
if (!item || item.hash !== row.credential_hash) throw new Error('Imported mobile authorization differs from JSON');
|
|
70
|
-
}
|
|
71
|
-
const [settings] = await db.query('SELECT max_relay_sessions FROM relay_settings WHERE id=1');
|
|
72
|
-
if (settings[0]?.max_relay_sessions !== admin.maxRelaySessions) throw new Error('Imported relay setting differs from JSON');
|
|
73
|
-
console.log(JSON.stringify({ verified: true, counts }));
|
|
74
|
-
} else console.log(JSON.stringify(counts));
|
|
75
|
-
} else {
|
|
76
|
-
const stateFile = process.env.RELAY_STATE_FILE, adminFile = process.env.RELAY_ADMIN_STATE_FILE;
|
|
77
|
-
if (!stateFile || !adminFile) throw new Error('RELAY_STATE_FILE and RELAY_ADMIN_STATE_FILE required for import');
|
|
78
|
-
const devices = deviceStore(stateFile).entries();
|
|
79
|
-
const admin = relayAdminState(adminFile, 8).read();
|
|
80
|
-
const [existing] = await db.query('SELECT (SELECT COUNT(*) FROM computers) AS computers, (SELECT COUNT(*) FROM relay_settings) AS settings');
|
|
81
|
-
if (existing[0].computers || existing[0].settings) throw new Error('Import target is not empty');
|
|
82
|
-
await db.beginTransaction();
|
|
83
|
-
try {
|
|
84
|
-
for (const item of devices) {
|
|
85
|
-
await db.execute('INSERT INTO computers (id,host_hash,status,revision,created_at,updated_at) VALUES (?,?,?,?,?,?)',
|
|
86
|
-
[item.id, item.hostHash, item.status, item.revision, sqlTime(item.createdAt), sqlTime(item.updatedAt)]);
|
|
87
|
-
for (const client of item.clients) await db.execute(
|
|
88
|
-
'INSERT INTO mobile_authorizations (computer_id,client_id,credential_hash,created_at,updated_at) VALUES (?,?,?,?,?)',
|
|
89
|
-
[item.id, client.id, client.hash, sqlTime(client.createdAt), sqlTime(client.updatedAt)]);
|
|
90
|
-
if (item.officialComputer) {
|
|
91
|
-
const official = item.officialComputer;
|
|
92
|
-
await db.execute('INSERT INTO official_computers (computer_id,environment_id,name,hostname,updated_at) VALUES (?,?,?,?,?)',
|
|
93
|
-
[item.id, official.environmentId, official.name, official.hostname, sqlTime(official.updatedAt)]);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
await db.execute('INSERT INTO relay_settings (id,max_relay_sessions,updated_at) VALUES (1,?,UTC_TIMESTAMP(3))', [admin.maxRelaySessions]);
|
|
97
|
-
for (const item of admin.announcements) await db.execute(
|
|
98
|
-
'INSERT INTO announcements (id,title,message,status,created_at,updated_at,published_at) VALUES (?,?,?,?,?,?,?)',
|
|
99
|
-
[item.id, item.title, item.message, item.status, sqlTime(item.createdAt), sqlTime(item.updatedAt),
|
|
100
|
-
item.publishedAt ? sqlTime(item.publishedAt) : null]);
|
|
101
|
-
await db.commit();
|
|
102
|
-
} catch (error) { await db.rollback(); throw error; }
|
|
103
|
-
console.log(JSON.stringify({ imported: true, computers: devices.length,
|
|
104
|
-
mobileAuthorizations: devices.reduce((sum, item) => sum + item.clients.length, 0),
|
|
105
|
-
officialComputers: devices.filter(item => item.officialComputer).length,
|
|
106
|
-
announcements: admin.announcements.length }));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
} finally { await db.end(); }
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import mysql from 'mysql2/promise';
|
|
6
|
+
import { relaySchemaVersions } from '../database/versions.mjs';
|
|
7
|
+
import { deviceStore } from '../src/self-relay/device-store.mjs';
|
|
8
|
+
import { relayAdminState } from '../src/self-relay/admin-state.mjs';
|
|
9
|
+
|
|
10
|
+
const command = process.argv[2];
|
|
11
|
+
if (!['--schema', '--import', '--check'].includes(command) || !process.env.RELAY_MYSQL_CONFIG_FILE) {
|
|
12
|
+
throw new Error('Use --schema, --import or --check with RELAY_MYSQL_CONFIG_FILE');
|
|
13
|
+
}
|
|
14
|
+
const config = JSON.parse(fs.readFileSync(process.env.RELAY_MYSQL_CONFIG_FILE, 'utf8'));
|
|
15
|
+
const db = await mysql.createConnection({ ...config, dateStrings: true, timezone: 'Z', multipleStatements: false });
|
|
16
|
+
const sqlTime = value => value.replace('T', ' ').replace(/Z$/, '');
|
|
17
|
+
const migrations = relaySchemaVersions;
|
|
18
|
+
try {
|
|
19
|
+
if (command === '--schema') {
|
|
20
|
+
const [existing] = await db.query("SHOW TABLES LIKE 'schema_migrations'");
|
|
21
|
+
const [applied] = existing.length ? await db.query('SELECT version, sha256 FROM schema_migrations') : [[]];
|
|
22
|
+
const known = new Map(applied.map(row => [row.version, row.sha256]));
|
|
23
|
+
if (known.size !== applied.length || [...known.keys()].some(version => !migrations.includes(version))) throw new Error('Unexpected schema version');
|
|
24
|
+
for (const version of migrations) {
|
|
25
|
+
const source = fs.readFileSync(fileURLToPath(new URL(`../database/${version}.sql`, import.meta.url)), 'utf8');
|
|
26
|
+
const sha256 = createHash('sha256').update(source).digest('hex');
|
|
27
|
+
if (known.has(version)) {
|
|
28
|
+
if (known.get(version) !== sha256) throw new Error(`Migration changed: ${version}`);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (version !== migrations[0] && !known.has(migrations[migrations.indexOf(version) - 1])) throw new Error('Previous migration missing');
|
|
32
|
+
const statements = source.split('\n').filter(line => !line.trimStart().startsWith('--')).join('\n');
|
|
33
|
+
for (const statement of statements.split(';').map(item => item.trim()).filter(Boolean)) await db.query(statement);
|
|
34
|
+
await db.execute('INSERT INTO schema_migrations (version, sha256) VALUES (?,?)', [version, sha256]);
|
|
35
|
+
known.set(version, sha256);
|
|
36
|
+
console.log(JSON.stringify({ schema: version, sha256 }));
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
const [versions] = await db.query('SELECT version FROM schema_migrations');
|
|
40
|
+
if (!versions.some(row => row.version === '001_relay_core') || versions.some(row => !migrations.includes(row.version))) throw new Error('Unexpected schema version');
|
|
41
|
+
if (command === '--check') {
|
|
42
|
+
const names = ['computers', 'mobile_authorizations', 'official_computers', 'announcements', 'relay_settings', 'users', 'user_login_identities'];
|
|
43
|
+
if (versions.some(row => row.version === '002_email_accounts')) names.push('email_login_challenges', 'user_sessions', 'email_send_limits');
|
|
44
|
+
if (versions.some(row => row.version === '003_relay_usage')) names.push('relay_admin_emails', 'relay_usage_settings', 'relay_usage_totals', 'relay_usage_computer_totals', 'relay_usage_entitlements', 'relay_usage_budgets', 'relay_usage_computer_budgets', 'relay_usage_sessions');
|
|
45
|
+
if (versions.some(row => row.version === '004_relay_usage_actions')) names.push('relay_usage_actions');
|
|
46
|
+
if (versions.some(row => row.version === '006_relay_diagnostics')) names.push('relay_diagnostics');
|
|
47
|
+
if (versions.some(row => row.version === '007_relay_usage_daily')) names.push('relay_usage_user_days', 'relay_usage_computer_days');
|
|
48
|
+
const counts = {};
|
|
49
|
+
for (const name of names) { const [rows] = await db.query(`SELECT COUNT(*) AS count FROM ${name}`); counts[name] = rows[0].count; }
|
|
50
|
+
if (process.env.RELAY_STATE_FILE && process.env.RELAY_ADMIN_STATE_FILE) {
|
|
51
|
+
const devices = deviceStore(process.env.RELAY_STATE_FILE).entries();
|
|
52
|
+
const admin = relayAdminState(process.env.RELAY_ADMIN_STATE_FILE, 8).read();
|
|
53
|
+
const expected = { computers: devices.length,
|
|
54
|
+
mobile_authorizations: devices.reduce((sum, item) => sum + item.clients.length, 0),
|
|
55
|
+
official_computers: devices.filter(item => item.officialComputer).length,
|
|
56
|
+
announcements: admin.announcements.length, relay_settings: 1 };
|
|
57
|
+
if (Object.keys(expected).some(name => counts[name] !== expected[name])) throw new Error('Imported row counts differ from JSON');
|
|
58
|
+
const [saved] = await db.query('SELECT id,host_hash,status,revision FROM computers');
|
|
59
|
+
const original = new Map(devices.map(item => [item.id, item]));
|
|
60
|
+
for (const row of saved) {
|
|
61
|
+
const item = original.get(row.id);
|
|
62
|
+
if (!item || item.hostHash !== row.host_hash || item.status !== row.status || item.revision !== Number(row.revision)) {
|
|
63
|
+
throw new Error('Imported computer identity differs from JSON');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const [authorized] = await db.query('SELECT computer_id,client_id,credential_hash FROM mobile_authorizations');
|
|
67
|
+
for (const row of authorized) {
|
|
68
|
+
const item = original.get(row.computer_id)?.clients.find(client => client.id === row.client_id);
|
|
69
|
+
if (!item || item.hash !== row.credential_hash) throw new Error('Imported mobile authorization differs from JSON');
|
|
70
|
+
}
|
|
71
|
+
const [settings] = await db.query('SELECT max_relay_sessions FROM relay_settings WHERE id=1');
|
|
72
|
+
if (settings[0]?.max_relay_sessions !== admin.maxRelaySessions) throw new Error('Imported relay setting differs from JSON');
|
|
73
|
+
console.log(JSON.stringify({ verified: true, counts }));
|
|
74
|
+
} else console.log(JSON.stringify(counts));
|
|
75
|
+
} else {
|
|
76
|
+
const stateFile = process.env.RELAY_STATE_FILE, adminFile = process.env.RELAY_ADMIN_STATE_FILE;
|
|
77
|
+
if (!stateFile || !adminFile) throw new Error('RELAY_STATE_FILE and RELAY_ADMIN_STATE_FILE required for import');
|
|
78
|
+
const devices = deviceStore(stateFile).entries();
|
|
79
|
+
const admin = relayAdminState(adminFile, 8).read();
|
|
80
|
+
const [existing] = await db.query('SELECT (SELECT COUNT(*) FROM computers) AS computers, (SELECT COUNT(*) FROM relay_settings) AS settings');
|
|
81
|
+
if (existing[0].computers || existing[0].settings) throw new Error('Import target is not empty');
|
|
82
|
+
await db.beginTransaction();
|
|
83
|
+
try {
|
|
84
|
+
for (const item of devices) {
|
|
85
|
+
await db.execute('INSERT INTO computers (id,host_hash,status,revision,created_at,updated_at) VALUES (?,?,?,?,?,?)',
|
|
86
|
+
[item.id, item.hostHash, item.status, item.revision, sqlTime(item.createdAt), sqlTime(item.updatedAt)]);
|
|
87
|
+
for (const client of item.clients) await db.execute(
|
|
88
|
+
'INSERT INTO mobile_authorizations (computer_id,client_id,credential_hash,created_at,updated_at) VALUES (?,?,?,?,?)',
|
|
89
|
+
[item.id, client.id, client.hash, sqlTime(client.createdAt), sqlTime(client.updatedAt)]);
|
|
90
|
+
if (item.officialComputer) {
|
|
91
|
+
const official = item.officialComputer;
|
|
92
|
+
await db.execute('INSERT INTO official_computers (computer_id,environment_id,name,hostname,updated_at) VALUES (?,?,?,?,?)',
|
|
93
|
+
[item.id, official.environmentId, official.name, official.hostname, sqlTime(official.updatedAt)]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await db.execute('INSERT INTO relay_settings (id,max_relay_sessions,updated_at) VALUES (1,?,UTC_TIMESTAMP(3))', [admin.maxRelaySessions]);
|
|
97
|
+
for (const item of admin.announcements) await db.execute(
|
|
98
|
+
'INSERT INTO announcements (id,title,message,status,created_at,updated_at,published_at) VALUES (?,?,?,?,?,?,?)',
|
|
99
|
+
[item.id, item.title, item.message, item.status, sqlTime(item.createdAt), sqlTime(item.updatedAt),
|
|
100
|
+
item.publishedAt ? sqlTime(item.publishedAt) : null]);
|
|
101
|
+
await db.commit();
|
|
102
|
+
} catch (error) { await db.rollback(); throw error; }
|
|
103
|
+
console.log(JSON.stringify({ imported: true, computers: devices.length,
|
|
104
|
+
mobileAuthorizations: devices.reduce((sum, item) => sum + item.clients.length, 0),
|
|
105
|
+
officialComputers: devices.filter(item => item.officialComputer).length,
|
|
106
|
+
announcements: admin.announcements.length }));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} finally { await db.end(); }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { androidReleaseStorage } from '../relay-admin/android-release-storage.mjs';
|
|
6
|
+
import { readAndroidCatalog } from '../src/self-relay/android-releases.mjs';
|
|
7
|
+
|
|
8
|
+
// This administrative command runs only on the deployment host; no keys cross SSH.
|
|
9
|
+
const [apkFile, metadataFile] = process.argv.slice(2);
|
|
10
|
+
if (!apkFile || !metadataFile) throw new Error('Usage: publish-android-release.mjs APK METADATA');
|
|
11
|
+
const storage = androidReleaseStorage('/etc/codex-relay/android-releases.json', '/etc/codex-relay/tencent-monitor.json');
|
|
12
|
+
const metadata = JSON.parse(fs.readFileSync(metadataFile, 'utf8'));
|
|
13
|
+
if (metadata.packageName !== 'cn.walkhi.coderelax' || !/^[a-f0-9]{64}$/.test(metadata.certificateSha256)) throw new Error('Invalid APK identity');
|
|
14
|
+
const bytes = fs.readFileSync(apkFile), sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
15
|
+
if (sha256 !== metadata.sha256 || bytes.length !== metadata.size) throw new Error('Uploaded APK integrity mismatch');
|
|
16
|
+
const { versionCode, versionName, size, notes, certificateSha256 } = metadata;
|
|
17
|
+
const release = { versionCode, versionName, size, sha256, notes, certificateSha256,
|
|
18
|
+
objectKey: `code-relax/android/${versionCode}/Code-Relax-${sha256.slice(0, 16)}.apk` };
|
|
19
|
+
const catalogFile = storage.catalogFile, temporary = catalogFile + '.new', lock = catalogFile + '.lock';
|
|
20
|
+
const lockHandle = fs.openSync(lock, 'wx', 0o600);
|
|
21
|
+
try {
|
|
22
|
+
const catalog = fs.existsSync(catalogFile) ? readAndroidCatalog(catalogFile) : { releases: [] };
|
|
23
|
+
const previous = catalog.releases.find(item => item.versionCode === versionCode);
|
|
24
|
+
if (previous && previous.sha256 !== sha256) throw new Error('A different APK already uses this versionCode');
|
|
25
|
+
if (catalog.latestVersionCode > versionCode) throw new Error('Refusing to publish an older version as latest');
|
|
26
|
+
if (catalog.releases.length && catalog.releases.some(item => item.certificateSha256 !== certificateSha256)) throw new Error('APK signing certificate changed');
|
|
27
|
+
const next = { latestVersionCode: versionCode, releases: [...catalog.releases.filter(item => item.versionCode !== versionCode), release] };
|
|
28
|
+
fs.writeFileSync(temporary, JSON.stringify(next, null, 2) + '\n', { mode: 0o640 });
|
|
29
|
+
readAndroidCatalog(temporary);
|
|
30
|
+
if (!previous) {
|
|
31
|
+
await new Promise((resolve, reject) => storage.cos.putObject({ ...storage.object(release), Body: bytes,
|
|
32
|
+
ContentLength: bytes.length, ContentType: 'application/vnd.android.package-archive',
|
|
33
|
+
ContentDisposition: `attachment; filename="Code-Relax-${versionName}.apk"`
|
|
34
|
+
}, (error, value) => error ? reject(error) : resolve(value)));
|
|
35
|
+
}
|
|
36
|
+
// Validate the exact signed GET that website and App use, before switching latest.
|
|
37
|
+
const ticket = await storage.signDownload(release);
|
|
38
|
+
const response = await fetch(ticket.url, { signal: AbortSignal.timeout(120000) });
|
|
39
|
+
if (!response.ok) throw new Error(`Signed download failed: HTTP ${response.status}`);
|
|
40
|
+
const downloaded = Buffer.from(await response.arrayBuffer());
|
|
41
|
+
if (downloaded.length !== size || createHash('sha256').update(downloaded).digest('hex') !== sha256) throw new Error('Stored APK integrity mismatch');
|
|
42
|
+
const unsigned = new URL(ticket.url); unsigned.search = '';
|
|
43
|
+
const denied = await fetch(unsigned, { method: 'HEAD', signal: AbortSignal.timeout(15000) });
|
|
44
|
+
if (denied.status !== 403) throw new Error(`Private object check failed: HTTP ${denied.status}`);
|
|
45
|
+
const owner = fs.statSync(path.dirname(catalogFile));
|
|
46
|
+
fs.chownSync(temporary, owner.uid, owner.gid);
|
|
47
|
+
fs.renameSync(temporary, catalogFile);
|
|
48
|
+
console.log(JSON.stringify({ published: true, versionCode, versionName, size, sha256, unsignedStatus: denied.status,
|
|
49
|
+
entry: 'https://www.coderelax.cn/code-relax/android' }));
|
|
50
|
+
} catch (error) {
|
|
51
|
+
// COS errors can carry signed request details. Keep CLI output credential-free.
|
|
52
|
+
console.error('Android publication failed:', error?.code || (error?.name === 'Error' ? error.message : 'storage-request-failed'));
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
} finally {
|
|
55
|
+
fs.closeSync(lockHandle);
|
|
56
|
+
fs.unlinkSync(lock);
|
|
57
|
+
if (fs.existsSync(temporary)) fs.unlinkSync(temporary);
|
|
58
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { startAdminServer } from '../src/self-relay/admin-server.mjs';
|
|
2
|
-
|
|
3
|
-
const port = Number(process.env.RELAY_ADMIN_PORT || 45851);
|
|
4
|
-
if (!Number.isSafeInteger(port) || port < 1 || port > 65535) throw new Error('Invalid RELAY_ADMIN_PORT');
|
|
5
|
-
const server = await startAdminServer({ port });
|
|
6
|
-
console.log(JSON.stringify({ service: 'codex-relay-admin', port: server.port }));
|
|
7
|
-
await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
|
|
8
|
-
await server.close();
|
|
1
|
+
import { startAdminServer } from '../src/self-relay/admin-server.mjs';
|
|
2
|
+
|
|
3
|
+
const port = Number(process.env.RELAY_ADMIN_PORT || 45851);
|
|
4
|
+
if (!Number.isSafeInteger(port) || port < 1 || port > 65535) throw new Error('Invalid RELAY_ADMIN_PORT');
|
|
5
|
+
const server = await startAdminServer({ port });
|
|
6
|
+
console.log(JSON.stringify({ service: 'codex-relay-admin', port: server.port }));
|
|
7
|
+
await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
|
|
8
|
+
await server.close();
|