@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.
Files changed (731) hide show
  1. package/README.md +12 -3
  2. package/dist/bin/codex-remote.mjs +54 -37
  3. package/dist/bin/manage-relay-admin.mjs +20 -20
  4. package/dist/bin/migrate-relay-db.mjs +109 -109
  5. package/dist/bin/publish-android-release.mjs +58 -0
  6. package/dist/bin/self-relay-admin.mjs +8 -8
  7. package/dist/bin/self-relay-demo.mjs +33 -33
  8. package/dist/bin/self-relay-server.mjs +66 -64
  9. package/dist/build-platform.json +1 -0
  10. package/dist/get-lan-networks.ps1 +40 -40
  11. package/dist/shared/file-mentions.cjs +12 -0
  12. package/dist/shared/message-delivery.cjs +17 -1
  13. package/dist/shared/p2p-data-channel.cjs +72 -50
  14. package/dist/shared/p2p-diagnostics.cjs +28 -28
  15. package/dist/shared/p2p-file-channel.cjs +3 -3
  16. package/dist/shared/plan-pricing.cjs +32 -0
  17. package/dist/shared/server-requests.cjs +17 -1
  18. package/dist/skills/code-relax/SKILL.md +3 -3
  19. package/dist/src/background-process.mjs +18 -18
  20. package/dist/src/code-browser.mjs +7 -8
  21. package/dist/src/dots-chat-server.mjs +50 -1
  22. package/dist/src/dots-room-client.mjs +2 -2
  23. package/dist/src/dots-task-catalog.mjs +22 -3
  24. package/dist/src/dots-task-files.mjs +52 -0
  25. package/dist/src/execution-health.mjs +26 -26
  26. package/dist/src/lan-socket-server.mjs +2 -2
  27. package/dist/src/managed-app-server.mjs +9 -6
  28. package/dist/src/message-images.mjs +9 -9
  29. package/dist/src/onboarding.mjs +9 -26
  30. package/dist/src/plan-pricing.mjs +47 -0
  31. package/dist/src/platform/README.md +11 -11
  32. package/dist/src/platform/codex-protocol.mjs +46 -0
  33. package/dist/src/platform/codex-runtime.mjs +3 -0
  34. package/dist/src/platform/credential-store.mjs +3 -0
  35. package/dist/src/platform/desktop-host.mjs +3 -0
  36. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  37. package/dist/src/platform/desktop-project-store.mjs +149 -0
  38. package/dist/src/platform/linux/README.md +3 -3
  39. package/dist/src/platform/macos/README.md +3 -3
  40. package/dist/src/platform/macos/codex-runtime.mjs +125 -0
  41. package/dist/src/platform/macos/credential-store.mjs +10 -0
  42. package/dist/src/platform/macos/desktop-host.mjs +82 -0
  43. package/dist/src/platform/macos/desktop-project-registration.mjs +10 -0
  44. package/dist/src/platform/macos/network-info.mjs +28 -0
  45. package/dist/src/platform/macos/project-locations.mjs +8 -0
  46. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  47. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  48. package/dist/src/platform/macos/service-host.mjs +18 -0
  49. package/dist/src/platform/macos/system.mjs +29 -0
  50. package/dist/src/platform/macos/user-environment.mjs +7 -0
  51. package/dist/src/platform/native-package.mjs +46 -0
  52. package/dist/src/platform/network-info.mjs +3 -0
  53. package/dist/src/platform/path-identity.mjs +5 -0
  54. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  55. package/dist/src/platform/project-locations.mjs +3 -0
  56. package/dist/src/platform/runtime-paths.mjs +8 -0
  57. package/dist/src/platform/select.mjs +5 -0
  58. package/dist/src/platform/service-host.mjs +3 -0
  59. package/dist/src/platform/user-environment.mjs +3 -0
  60. package/dist/src/platform/windows/IsolatedProcess.cs +79 -79
  61. package/dist/src/platform/windows/background-process.mjs +30 -30
  62. package/dist/src/platform/windows/codex-runtime.mjs +2 -40
  63. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  64. package/dist/src/platform/windows/desktop-project-registration.mjs +3 -152
  65. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -10
  66. package/dist/src/platform/windows/desktop-shortcuts.ps1 +7 -7
  67. package/dist/src/platform/windows/network-info.mjs +34 -34
  68. package/dist/src/platform/windows/resident-start.js +20 -20
  69. package/dist/src/platform/windows/resident-start.ps1 +7 -7
  70. package/dist/src/platform/windows/resident-startup.ps1 +83 -83
  71. package/dist/src/platform/windows/resolve-state-root.ps1 +14 -14
  72. package/dist/src/platform/windows/runtime-paths.mjs +20 -20
  73. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  74. package/dist/src/platform/windows/service-host.mjs +11 -11
  75. package/dist/src/platform/windows/start-hidden-console.ps1 +49 -49
  76. package/dist/src/platform/windows/stop-desktop.ps1 +22 -22
  77. package/dist/src/platform/windows/user-environment.mjs +50 -50
  78. package/dist/src/platform/windows/user-environment.ps1 +41 -41
  79. package/dist/src/project-create.mjs +4 -4
  80. package/dist/src/runtime-discovery.mjs +47 -43
  81. package/dist/src/self-relay/account-connections.mjs +52 -52
  82. package/dist/src/self-relay/admin-cloud.mjs +101 -101
  83. package/dist/src/self-relay/admin-server.mjs +74 -74
  84. package/dist/src/self-relay/admin-state.mjs +127 -127
  85. package/dist/src/self-relay/android-releases.mjs +61 -0
  86. package/dist/src/self-relay/client.mjs +61 -61
  87. package/dist/src/self-relay/connector.mjs +36 -20
  88. package/dist/src/self-relay/debug-allowlist.mjs +33 -33
  89. package/dist/src/self-relay/demo.mjs +6 -6
  90. package/dist/src/self-relay/device-store.mjs +84 -84
  91. package/dist/src/self-relay/lan-authorizations.mjs +42 -42
  92. package/dist/src/self-relay/lifecycle.mjs +250 -250
  93. package/dist/src/self-relay/long-pairing.mjs +40 -40
  94. package/dist/src/self-relay/mysql-state.mjs +105 -105
  95. package/dist/src/self-relay/p2p-probe.mjs +13 -6
  96. package/dist/src/self-relay/server.mjs +19 -9
  97. package/dist/src/self-relay/usage-daily.mjs +55 -55
  98. package/dist/src/self-relay/windows-route-helper.mjs +75 -75
  99. package/dist/src/self-relay/wire.mjs +36 -36
  100. package/dist/src/server.mjs +132 -32
  101. package/dist/src/service-control.mjs +82 -82
  102. package/dist/src/service-doctor.mjs +51 -13
  103. package/dist/src/service-health.mjs +33 -33
  104. package/dist/src/service-install.mjs +10 -7
  105. package/dist/src/service-lifecycle.mjs +1 -1
  106. package/dist/src/service-restart.mjs +81 -81
  107. package/dist/src/shared-app-server.mjs +16 -7
  108. package/dist/src/shared-recovery.mjs +146 -144
  109. package/dist/src/skill-install.mjs +51 -51
  110. package/dist/src/thread-title-generation.mjs +150 -150
  111. package/dist/src/turn-model-history.mjs +47 -47
  112. package/dist/tools/rtc-route-helper.ps1 +99 -99
  113. package/dist/tools/start-rtc-route-helper.ps1 +15 -15
  114. package/dist/web/vendor/markdown-it.LICENSE.txt +22 -22
  115. package/dist/web/vendor/markdown-it.umd.min.js +13 -13
  116. package/package.json +47 -49
  117. package/tools/postinstall.mjs +127 -127
  118. package/node_modules/@img/colour/LICENSE.md +0 -82
  119. package/node_modules/@img/colour/README.md +0 -15
  120. package/node_modules/@img/colour/color.cjs +0 -1596
  121. package/node_modules/@img/colour/index.cjs +0 -1
  122. package/node_modules/@img/colour/index.d.ts +0 -929
  123. package/node_modules/@img/colour/package.json +0 -58
  124. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  125. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  126. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  127. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  128. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  129. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  130. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  131. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  132. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  133. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  134. package/node_modules/ansi-regex/index.d.ts +0 -37
  135. package/node_modules/ansi-regex/index.js +0 -10
  136. package/node_modules/ansi-regex/license +0 -9
  137. package/node_modules/ansi-regex/package.json +0 -55
  138. package/node_modules/ansi-regex/readme.md +0 -78
  139. package/node_modules/ansi-styles/index.d.ts +0 -345
  140. package/node_modules/ansi-styles/index.js +0 -163
  141. package/node_modules/ansi-styles/license +0 -9
  142. package/node_modules/ansi-styles/package.json +0 -56
  143. package/node_modules/ansi-styles/readme.md +0 -152
  144. package/node_modules/camelcase/index.d.ts +0 -63
  145. package/node_modules/camelcase/index.js +0 -76
  146. package/node_modules/camelcase/license +0 -9
  147. package/node_modules/camelcase/package.json +0 -43
  148. package/node_modules/camelcase/readme.md +0 -99
  149. package/node_modules/cliui/CHANGELOG.md +0 -76
  150. package/node_modules/cliui/LICENSE.txt +0 -14
  151. package/node_modules/cliui/README.md +0 -115
  152. package/node_modules/cliui/index.js +0 -354
  153. package/node_modules/cliui/package.json +0 -65
  154. package/node_modules/color-convert/CHANGELOG.md +0 -54
  155. package/node_modules/color-convert/LICENSE +0 -21
  156. package/node_modules/color-convert/README.md +0 -68
  157. package/node_modules/color-convert/conversions.js +0 -839
  158. package/node_modules/color-convert/index.js +0 -81
  159. package/node_modules/color-convert/package.json +0 -48
  160. package/node_modules/color-convert/route.js +0 -97
  161. package/node_modules/color-name/LICENSE +0 -8
  162. package/node_modules/color-name/README.md +0 -11
  163. package/node_modules/color-name/index.js +0 -152
  164. package/node_modules/color-name/package.json +0 -28
  165. package/node_modules/decamelize/index.js +0 -13
  166. package/node_modules/decamelize/license +0 -21
  167. package/node_modules/decamelize/package.json +0 -38
  168. package/node_modules/decamelize/readme.md +0 -48
  169. package/node_modules/detect-libc/LICENSE +0 -201
  170. package/node_modules/detect-libc/README.md +0 -163
  171. package/node_modules/detect-libc/index.d.ts +0 -14
  172. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  173. package/node_modules/detect-libc/lib/elf.js +0 -39
  174. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  175. package/node_modules/detect-libc/lib/process.js +0 -24
  176. package/node_modules/detect-libc/package.json +0 -44
  177. package/node_modules/dijkstrajs/.travis.yml +0 -4
  178. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  179. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  180. package/node_modules/dijkstrajs/README.md +0 -18
  181. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  182. package/node_modules/dijkstrajs/package.json +0 -60
  183. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  184. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  185. package/node_modules/emoji-regex/README.md +0 -73
  186. package/node_modules/emoji-regex/es2015/index.js +0 -6
  187. package/node_modules/emoji-regex/es2015/text.js +0 -6
  188. package/node_modules/emoji-regex/index.d.ts +0 -23
  189. package/node_modules/emoji-regex/index.js +0 -6
  190. package/node_modules/emoji-regex/package.json +0 -50
  191. package/node_modules/emoji-regex/text.js +0 -6
  192. package/node_modules/find-up/index.d.ts +0 -137
  193. package/node_modules/find-up/index.js +0 -89
  194. package/node_modules/find-up/license +0 -9
  195. package/node_modules/find-up/package.json +0 -53
  196. package/node_modules/find-up/readme.md +0 -156
  197. package/node_modules/get-caller-file/LICENSE.md +0 -6
  198. package/node_modules/get-caller-file/README.md +0 -41
  199. package/node_modules/get-caller-file/index.d.ts +0 -2
  200. package/node_modules/get-caller-file/index.js +0 -22
  201. package/node_modules/get-caller-file/index.js.map +0 -1
  202. package/node_modules/get-caller-file/package.json +0 -42
  203. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  204. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  205. package/node_modules/is-fullwidth-code-point/license +0 -9
  206. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  207. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  208. package/node_modules/locate-path/index.d.ts +0 -83
  209. package/node_modules/locate-path/index.js +0 -65
  210. package/node_modules/locate-path/license +0 -9
  211. package/node_modules/locate-path/package.json +0 -45
  212. package/node_modules/locate-path/readme.md +0 -122
  213. package/node_modules/node-datachannel/.clang-format +0 -17
  214. package/node_modules/node-datachannel/.editorconfig +0 -12
  215. package/node_modules/node-datachannel/.eslintignore +0 -8
  216. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  217. package/node_modules/node-datachannel/.gitmodules +0 -3
  218. package/node_modules/node-datachannel/.prettierignore +0 -7
  219. package/node_modules/node-datachannel/.prettierrc +0 -13
  220. package/node_modules/node-datachannel/API.md +0 -247
  221. package/node_modules/node-datachannel/BULDING.md +0 -26
  222. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  223. package/node_modules/node-datachannel/LICENSE +0 -373
  224. package/node_modules/node-datachannel/README.md +0 -129
  225. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  226. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  227. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  228. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  229. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  230. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  231. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  232. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  233. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  234. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  235. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  236. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  237. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  238. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  239. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  240. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  241. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  242. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  243. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  244. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  245. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  246. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  247. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  248. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  249. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  250. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  251. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  252. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  253. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  254. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  255. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  256. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  257. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  258. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  259. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  260. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  261. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  262. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  263. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  264. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  265. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  266. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  267. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  268. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  269. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  270. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  271. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  272. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  273. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  274. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  275. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  276. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  277. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  278. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  279. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  280. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  281. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  282. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  283. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  284. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  285. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  286. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  287. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  288. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  289. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  290. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  291. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  292. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  293. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  294. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  295. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  296. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  297. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  298. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  299. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  300. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  301. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  302. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  303. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  304. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  305. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  306. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  307. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  308. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  309. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  310. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  311. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  312. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  313. package/node_modules/node-datachannel/jest.config.ts +0 -14
  314. package/node_modules/node-datachannel/package.json +0 -133
  315. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  316. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  317. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  318. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  319. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  320. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  321. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  322. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  323. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  324. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  325. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  326. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  327. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  328. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  329. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  330. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  331. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  332. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  333. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  334. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  335. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  336. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  337. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  338. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  339. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  340. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  341. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  342. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  343. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  344. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  345. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  346. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  347. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  348. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  349. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  350. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  351. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  352. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  353. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  354. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  355. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  356. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  357. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  358. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  359. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  360. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  361. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  362. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  363. package/node_modules/node-datachannel/src/index.ts +0 -9
  364. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  365. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  366. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  367. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  368. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  369. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  370. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  371. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  372. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  373. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  374. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  375. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  376. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  377. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  378. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  379. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  380. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  381. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  382. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  383. package/node_modules/node-datachannel/tsconfig.json +0 -21
  384. package/node_modules/p-limit/index.d.ts +0 -38
  385. package/node_modules/p-limit/index.js +0 -57
  386. package/node_modules/p-limit/license +0 -9
  387. package/node_modules/p-limit/package.json +0 -52
  388. package/node_modules/p-limit/readme.md +0 -101
  389. package/node_modules/p-locate/index.d.ts +0 -64
  390. package/node_modules/p-locate/index.js +0 -52
  391. package/node_modules/p-locate/license +0 -9
  392. package/node_modules/p-locate/package.json +0 -53
  393. package/node_modules/p-locate/readme.md +0 -90
  394. package/node_modules/p-try/index.d.ts +0 -39
  395. package/node_modules/p-try/index.js +0 -9
  396. package/node_modules/p-try/license +0 -9
  397. package/node_modules/p-try/package.json +0 -42
  398. package/node_modules/p-try/readme.md +0 -58
  399. package/node_modules/path-exists/index.d.ts +0 -28
  400. package/node_modules/path-exists/index.js +0 -23
  401. package/node_modules/path-exists/license +0 -9
  402. package/node_modules/path-exists/package.json +0 -39
  403. package/node_modules/path-exists/readme.md +0 -52
  404. package/node_modules/pngjs/.eslintignore +0 -2
  405. package/node_modules/pngjs/.eslintrc.json +0 -19
  406. package/node_modules/pngjs/.prettierignore +0 -3
  407. package/node_modules/pngjs/LICENSE +0 -20
  408. package/node_modules/pngjs/README.md +0 -429
  409. package/node_modules/pngjs/browser.js +0 -16096
  410. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  411. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  412. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  413. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  414. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  415. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  416. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  417. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  418. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  419. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  420. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  421. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  422. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  423. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  424. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  425. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  426. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  427. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  428. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  429. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  430. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  431. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  432. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  433. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  434. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  435. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  436. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  437. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  438. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  439. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  440. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  441. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  442. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  443. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  444. package/node_modules/pngjs/lib/constants.js +0 -32
  445. package/node_modules/pngjs/lib/crc.js +0 -40
  446. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  447. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  448. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  449. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  450. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  451. package/node_modules/pngjs/lib/interlace.js +0 -95
  452. package/node_modules/pngjs/lib/packer-async.js +0 -50
  453. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  454. package/node_modules/pngjs/lib/packer.js +0 -129
  455. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  456. package/node_modules/pngjs/lib/parser-async.js +0 -165
  457. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  458. package/node_modules/pngjs/lib/parser.js +0 -290
  459. package/node_modules/pngjs/lib/png-sync.js +0 -12
  460. package/node_modules/pngjs/lib/png.js +0 -194
  461. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  462. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  463. package/node_modules/pngjs/package.json +0 -73
  464. package/node_modules/qrcode/README.md +0 -770
  465. package/node_modules/qrcode/bin/qrcode +0 -159
  466. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  467. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  468. package/node_modules/qrcode/lib/browser.js +0 -76
  469. package/node_modules/qrcode/lib/can-promise.js +0 -7
  470. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  471. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  472. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  473. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  474. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  475. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  476. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  477. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  478. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  479. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  480. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  481. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  482. package/node_modules/qrcode/lib/core/mode.js +0 -167
  483. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  484. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  485. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  486. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  487. package/node_modules/qrcode/lib/core/regex.js +0 -31
  488. package/node_modules/qrcode/lib/core/segments.js +0 -330
  489. package/node_modules/qrcode/lib/core/utils.js +0 -63
  490. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  491. package/node_modules/qrcode/lib/core/version.js +0 -163
  492. package/node_modules/qrcode/lib/index.js +0 -12
  493. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  494. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  495. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  496. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  497. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  498. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  499. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  500. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  501. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  502. package/node_modules/qrcode/lib/server.js +0 -138
  503. package/node_modules/qrcode/license +0 -10
  504. package/node_modules/qrcode/package.json +0 -77
  505. package/node_modules/require-directory/.jshintrc +0 -67
  506. package/node_modules/require-directory/.npmignore +0 -1
  507. package/node_modules/require-directory/.travis.yml +0 -3
  508. package/node_modules/require-directory/LICENSE +0 -22
  509. package/node_modules/require-directory/README.markdown +0 -184
  510. package/node_modules/require-directory/index.js +0 -86
  511. package/node_modules/require-directory/package.json +0 -40
  512. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  513. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  514. package/node_modules/require-main-filename/README.md +0 -26
  515. package/node_modules/require-main-filename/index.js +0 -18
  516. package/node_modules/require-main-filename/package.json +0 -35
  517. package/node_modules/semver/LICENSE +0 -15
  518. package/node_modules/semver/README.md +0 -680
  519. package/node_modules/semver/bin/semver.js +0 -195
  520. package/node_modules/semver/classes/comparator.js +0 -143
  521. package/node_modules/semver/classes/index.js +0 -7
  522. package/node_modules/semver/classes/range.js +0 -577
  523. package/node_modules/semver/classes/semver.js +0 -350
  524. package/node_modules/semver/functions/clean.js +0 -8
  525. package/node_modules/semver/functions/cmp.js +0 -54
  526. package/node_modules/semver/functions/coerce.js +0 -62
  527. package/node_modules/semver/functions/compare-build.js +0 -9
  528. package/node_modules/semver/functions/compare-loose.js +0 -5
  529. package/node_modules/semver/functions/compare.js +0 -7
  530. package/node_modules/semver/functions/diff.js +0 -60
  531. package/node_modules/semver/functions/eq.js +0 -5
  532. package/node_modules/semver/functions/gt.js +0 -5
  533. package/node_modules/semver/functions/gte.js +0 -5
  534. package/node_modules/semver/functions/inc.js +0 -21
  535. package/node_modules/semver/functions/lt.js +0 -5
  536. package/node_modules/semver/functions/lte.js +0 -5
  537. package/node_modules/semver/functions/major.js +0 -5
  538. package/node_modules/semver/functions/minor.js +0 -5
  539. package/node_modules/semver/functions/neq.js +0 -5
  540. package/node_modules/semver/functions/parse.js +0 -18
  541. package/node_modules/semver/functions/patch.js +0 -5
  542. package/node_modules/semver/functions/prerelease.js +0 -8
  543. package/node_modules/semver/functions/rcompare.js +0 -5
  544. package/node_modules/semver/functions/rsort.js +0 -5
  545. package/node_modules/semver/functions/satisfies.js +0 -12
  546. package/node_modules/semver/functions/sort.js +0 -5
  547. package/node_modules/semver/functions/truncate.js +0 -48
  548. package/node_modules/semver/functions/valid.js +0 -8
  549. package/node_modules/semver/index.js +0 -93
  550. package/node_modules/semver/internal/constants.js +0 -37
  551. package/node_modules/semver/internal/debug.js +0 -11
  552. package/node_modules/semver/internal/identifiers.js +0 -29
  553. package/node_modules/semver/internal/lrucache.js +0 -42
  554. package/node_modules/semver/internal/parse-options.js +0 -17
  555. package/node_modules/semver/internal/re.js +0 -223
  556. package/node_modules/semver/package.json +0 -78
  557. package/node_modules/semver/preload.js +0 -4
  558. package/node_modules/semver/range.bnf +0 -17
  559. package/node_modules/semver/ranges/gtr.js +0 -6
  560. package/node_modules/semver/ranges/intersects.js +0 -9
  561. package/node_modules/semver/ranges/ltr.js +0 -6
  562. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  563. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  564. package/node_modules/semver/ranges/min-version.js +0 -63
  565. package/node_modules/semver/ranges/outside.js +0 -82
  566. package/node_modules/semver/ranges/simplify.js +0 -49
  567. package/node_modules/semver/ranges/subset.js +0 -249
  568. package/node_modules/semver/ranges/to-comparators.js +0 -10
  569. package/node_modules/semver/ranges/valid.js +0 -13
  570. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  571. package/node_modules/set-blocking/LICENSE.txt +0 -14
  572. package/node_modules/set-blocking/README.md +0 -31
  573. package/node_modules/set-blocking/index.js +0 -7
  574. package/node_modules/set-blocking/package.json +0 -42
  575. package/node_modules/sharp/LICENSE +0 -191
  576. package/node_modules/sharp/README.md +0 -112
  577. package/node_modules/sharp/dist/channel.cjs +0 -177
  578. package/node_modules/sharp/dist/channel.mjs +0 -177
  579. package/node_modules/sharp/dist/colour.cjs +0 -199
  580. package/node_modules/sharp/dist/colour.mjs +0 -199
  581. package/node_modules/sharp/dist/composite.cjs +0 -213
  582. package/node_modules/sharp/dist/composite.mjs +0 -213
  583. package/node_modules/sharp/dist/constructor.cjs +0 -511
  584. package/node_modules/sharp/dist/constructor.mjs +0 -511
  585. package/node_modules/sharp/dist/index.cjs +0 -25
  586. package/node_modules/sharp/dist/index.d.cts +0 -1999
  587. package/node_modules/sharp/dist/index.d.mts +0 -2046
  588. package/node_modules/sharp/dist/index.mjs +0 -25
  589. package/node_modules/sharp/dist/input.cjs +0 -819
  590. package/node_modules/sharp/dist/input.mjs +0 -819
  591. package/node_modules/sharp/dist/is.cjs +0 -143
  592. package/node_modules/sharp/dist/is.mjs +0 -143
  593. package/node_modules/sharp/dist/libvips.cjs +0 -212
  594. package/node_modules/sharp/dist/libvips.mjs +0 -212
  595. package/node_modules/sharp/dist/operation.cjs +0 -1002
  596. package/node_modules/sharp/dist/operation.mjs +0 -1002
  597. package/node_modules/sharp/dist/output.cjs +0 -1785
  598. package/node_modules/sharp/dist/output.mjs +0 -1785
  599. package/node_modules/sharp/dist/resize.cjs +0 -617
  600. package/node_modules/sharp/dist/resize.mjs +0 -617
  601. package/node_modules/sharp/dist/sharp.cjs +0 -174
  602. package/node_modules/sharp/dist/sharp.mjs +0 -174
  603. package/node_modules/sharp/dist/utility.cjs +0 -301
  604. package/node_modules/sharp/dist/utility.mjs +0 -301
  605. package/node_modules/sharp/install/build.js +0 -38
  606. package/node_modules/sharp/lib/index.d.ts +0 -1999
  607. package/node_modules/sharp/package.json +0 -227
  608. package/node_modules/sharp/src/binding.gyp +0 -303
  609. package/node_modules/sharp/src/common.cc +0 -1186
  610. package/node_modules/sharp/src/common.h +0 -421
  611. package/node_modules/sharp/src/metadata.cc +0 -404
  612. package/node_modules/sharp/src/metadata.h +0 -95
  613. package/node_modules/sharp/src/operations.cc +0 -516
  614. package/node_modules/sharp/src/operations.h +0 -137
  615. package/node_modules/sharp/src/pipeline.cc +0 -1948
  616. package/node_modules/sharp/src/pipeline.h +0 -422
  617. package/node_modules/sharp/src/sharp.cc +0 -43
  618. package/node_modules/sharp/src/stats.cc +0 -186
  619. package/node_modules/sharp/src/stats.h +0 -62
  620. package/node_modules/sharp/src/utilities.cc +0 -289
  621. package/node_modules/sharp/src/utilities.h +0 -22
  622. package/node_modules/string-width/index.d.ts +0 -29
  623. package/node_modules/string-width/index.js +0 -47
  624. package/node_modules/string-width/license +0 -9
  625. package/node_modules/string-width/package.json +0 -56
  626. package/node_modules/string-width/readme.md +0 -50
  627. package/node_modules/strip-ansi/index.d.ts +0 -17
  628. package/node_modules/strip-ansi/index.js +0 -4
  629. package/node_modules/strip-ansi/license +0 -9
  630. package/node_modules/strip-ansi/package.json +0 -54
  631. package/node_modules/strip-ansi/readme.md +0 -46
  632. package/node_modules/which-module/LICENSE +0 -13
  633. package/node_modules/which-module/README.md +0 -58
  634. package/node_modules/which-module/index.js +0 -9
  635. package/node_modules/which-module/package.json +0 -41
  636. package/node_modules/wrap-ansi/index.js +0 -186
  637. package/node_modules/wrap-ansi/license +0 -9
  638. package/node_modules/wrap-ansi/package.json +0 -61
  639. package/node_modules/wrap-ansi/readme.md +0 -97
  640. package/node_modules/ws/LICENSE +0 -20
  641. package/node_modules/ws/README.md +0 -548
  642. package/node_modules/ws/browser.js +0 -8
  643. package/node_modules/ws/index.js +0 -22
  644. package/node_modules/ws/lib/buffer-util.js +0 -131
  645. package/node_modules/ws/lib/constants.js +0 -19
  646. package/node_modules/ws/lib/event-target.js +0 -292
  647. package/node_modules/ws/lib/extension.js +0 -203
  648. package/node_modules/ws/lib/limiter.js +0 -55
  649. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  650. package/node_modules/ws/lib/receiver.js +0 -743
  651. package/node_modules/ws/lib/sender.js +0 -607
  652. package/node_modules/ws/lib/stream.js +0 -161
  653. package/node_modules/ws/lib/subprotocol.js +0 -62
  654. package/node_modules/ws/lib/validation.js +0 -152
  655. package/node_modules/ws/lib/websocket-server.js +0 -562
  656. package/node_modules/ws/lib/websocket.js +0 -1407
  657. package/node_modules/ws/package.json +0 -74
  658. package/node_modules/ws/wrapper.mjs +0 -21
  659. package/node_modules/y18n/CHANGELOG.md +0 -35
  660. package/node_modules/y18n/LICENSE +0 -13
  661. package/node_modules/y18n/README.md +0 -109
  662. package/node_modules/y18n/index.js +0 -188
  663. package/node_modules/y18n/package.json +0 -39
  664. package/node_modules/yargs/CHANGELOG.md +0 -420
  665. package/node_modules/yargs/LICENSE +0 -21
  666. package/node_modules/yargs/README.md +0 -140
  667. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  668. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  669. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  670. package/node_modules/yargs/build/lib/argsert.js +0 -65
  671. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  672. package/node_modules/yargs/build/lib/command.js +0 -416
  673. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  674. package/node_modules/yargs/build/lib/common-types.js +0 -25
  675. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  676. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  677. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  678. package/node_modules/yargs/build/lib/completion.js +0 -135
  679. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  680. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  681. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  682. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  683. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  684. package/node_modules/yargs/build/lib/middleware.js +0 -57
  685. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  686. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  687. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  688. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  689. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  690. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  691. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  692. package/node_modules/yargs/build/lib/usage.js +0 -540
  693. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  694. package/node_modules/yargs/build/lib/validation.js +0 -330
  695. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  696. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  697. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  698. package/node_modules/yargs/build/lib/yerror.js +0 -11
  699. package/node_modules/yargs/index.js +0 -40
  700. package/node_modules/yargs/locales/be.json +0 -46
  701. package/node_modules/yargs/locales/de.json +0 -46
  702. package/node_modules/yargs/locales/en.json +0 -51
  703. package/node_modules/yargs/locales/es.json +0 -46
  704. package/node_modules/yargs/locales/fi.json +0 -49
  705. package/node_modules/yargs/locales/fr.json +0 -53
  706. package/node_modules/yargs/locales/hi.json +0 -49
  707. package/node_modules/yargs/locales/hu.json +0 -46
  708. package/node_modules/yargs/locales/id.json +0 -50
  709. package/node_modules/yargs/locales/it.json +0 -46
  710. package/node_modules/yargs/locales/ja.json +0 -51
  711. package/node_modules/yargs/locales/ko.json +0 -49
  712. package/node_modules/yargs/locales/nb.json +0 -44
  713. package/node_modules/yargs/locales/nl.json +0 -49
  714. package/node_modules/yargs/locales/nn.json +0 -44
  715. package/node_modules/yargs/locales/pirate.json +0 -13
  716. package/node_modules/yargs/locales/pl.json +0 -49
  717. package/node_modules/yargs/locales/pt.json +0 -45
  718. package/node_modules/yargs/locales/pt_BR.json +0 -48
  719. package/node_modules/yargs/locales/ru.json +0 -46
  720. package/node_modules/yargs/locales/th.json +0 -46
  721. package/node_modules/yargs/locales/tr.json +0 -48
  722. package/node_modules/yargs/locales/zh_CN.json +0 -48
  723. package/node_modules/yargs/locales/zh_TW.json +0 -47
  724. package/node_modules/yargs/package.json +0 -92
  725. package/node_modules/yargs/yargs.js +0 -14
  726. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  727. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  728. package/node_modules/yargs-parser/README.md +0 -449
  729. package/node_modules/yargs-parser/index.js +0 -1032
  730. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  731. package/node_modules/yargs-parser/package.json +0 -46
package/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Code Relax 桌面服务(Windows 私测包)
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`,查看恢复结果用 `relax doctor`。桌面服务状态匹配且健康时直接复用;未知进程占用 45831/45839 时拒绝接管。
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/windows/runtime-paths.mjs';
5
- import * as host from '../src/platform/windows/service-host.mjs';
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/windows/desktop-host.mjs';
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/windows/user-environment.mjs';
19
- import { resolveCodexRuntime } from '../src/platform/windows/codex-runtime.mjs';
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 <命令> [--json];下列命令均可用
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
- doctor 检查服务、内核更新、登录自启、最近恢复结果、网络和 Skill
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 输出机器可读结果;统一二维码不含 LAN 地址、桌面服务凭据或中继地址。`;
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 !== 'win32') throw new Error('当前被控端仅支持 Windows。');
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 = path.resolve(fileURLToPath(import.meta.url)).toLowerCase() === installedEntry.toLowerCase();
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) : `${result.displayText}\n二维码:${result.qrPath}`);
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.checks.map(item => `[${item.status}] ${item.message}`).join('\n'));
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 = environment?.preserved
193
- ? '固定目录服务已卸载;检测到用户自定义的 CODEX_APP_SERVER_WS_URL,已保留。配置、附件和可能仍在执行任务的 app-server 也已保留;重启 Windows可结束该进程。npm 命令入口可再用 npm uninstall -g @walkhi/code-relax 移除。'
194
- : '固定目录服务已卸载;Code Relax 设置的 app-server 环境变量已清理,其他配置、附件和可能仍在执行任务的 app-server 已保留;重启 Windows可结束该进程。npm 命令入口可再用 npm uninstall -g @walkhi/code-relax 移除。';
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
- const migrationText = managedAppServerMigrated ? '已自动重建旧启动链的 app-server;安装前尚未完成的任务可能已中断。\n' : '';
318
- const restartText = desktopRestarted
319
- ? 'Codex Desktop 已干净重启并重新接入 Codex 内核。'
320
- : desktopBeforeSetup.desktop ? 'Codex Desktop 使用同一 Codex 内核;移动端控制不依赖 Desktop 是否打开。'
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, notice);
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();