@walkhi/code-relax 0.1.0-beta.4 → 0.1.0-beta.41

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 (845) hide show
  1. package/README.md +83 -71
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +323 -184
  4. package/dist/bin/manage-relay-admin.mjs +20 -0
  5. package/dist/bin/migrate-relay-db.mjs +109 -0
  6. package/dist/bin/publish-android-release.mjs +63 -0
  7. package/dist/bin/publish-harmony-release.mjs +46 -0
  8. package/dist/bin/release-upload-server.mjs +174 -0
  9. package/dist/bin/self-relay-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +2 -2
  11. package/dist/bin/self-relay-server.mjs +43 -30
  12. package/dist/build-platform.json +1 -0
  13. package/dist/get-shared-service-url.ps1 +6 -6
  14. package/dist/shared/app-server-events.cjs +368 -238
  15. package/dist/shared/code-browser.cjs +159 -0
  16. package/dist/shared/file-changes.cjs +31 -0
  17. package/dist/shared/file-citations.cjs +117 -0
  18. package/dist/shared/file-mentions.cjs +92 -0
  19. package/dist/shared/message-delivery.cjs +100 -0
  20. package/dist/shared/p2p-data-channel.cjs +22 -0
  21. package/dist/shared/p2p-diagnostics.cjs +1 -1
  22. package/dist/shared/p2p-file-channel.cjs +87 -0
  23. package/dist/shared/p2p-ice-policy.cjs +22 -0
  24. package/dist/shared/plan-pricing.cjs +32 -0
  25. package/dist/shared/question-attention.cjs +69 -0
  26. package/dist/shared/server-requests.cjs +157 -5
  27. package/dist/shared/service-endpoints.cjs +21 -0
  28. package/dist/shared/timeline-sync.cjs +111 -5
  29. package/dist/skills/code-relax/SKILL.md +13 -8
  30. package/dist/src/archived-threads.mjs +22 -0
  31. package/dist/src/bounded-process-log.mjs +63 -0
  32. package/dist/src/celsius-client.mjs +107 -0
  33. package/dist/src/code-browser.mjs +100 -0
  34. package/dist/src/desktop-launcher.mjs +33 -38
  35. package/dist/src/dots-approval-timeline.mjs +99 -0
  36. package/dist/src/dots-avatar.mjs +42 -0
  37. package/dist/src/dots-chat-projection.mjs +50 -0
  38. package/dist/src/dots-chat-server.mjs +482 -0
  39. package/dist/src/dots-message-images.mjs +319 -0
  40. package/dist/src/dots-profile.mjs +77 -0
  41. package/dist/src/dots-room-activity.mjs +94 -0
  42. package/dist/src/dots-room-client.mjs +135 -0
  43. package/dist/src/dots-room-projection.mjs +94 -0
  44. package/dist/src/dots-schedules.mjs +66 -0
  45. package/dist/src/dots-summary-tasks.mjs +32 -0
  46. package/dist/src/dots-task-catalog.mjs +430 -0
  47. package/dist/src/dots-task-files.mjs +52 -0
  48. package/dist/src/file-transfer-range.mjs +22 -0
  49. package/dist/src/file-upload-session.mjs +130 -0
  50. package/dist/src/hosted-history-app-server.mjs +103 -0
  51. package/dist/src/hosted-history-cache.mjs +113 -0
  52. package/dist/src/lan-socket-server.mjs +241 -84
  53. package/dist/src/managed-app-server.mjs +54 -16
  54. package/dist/src/message-images.mjs +0 -18
  55. package/dist/src/message-upload-files.mjs +109 -0
  56. package/dist/src/onboarding.mjs +10 -29
  57. package/dist/src/plan-pricing.mjs +47 -0
  58. package/dist/src/platform/README.md +2 -2
  59. package/dist/src/platform/codex-protocol.mjs +46 -0
  60. package/dist/src/platform/codex-runtime.mjs +3 -0
  61. package/dist/src/platform/credential-store.mjs +3 -0
  62. package/dist/src/platform/desktop-host.mjs +3 -0
  63. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  64. package/dist/src/platform/desktop-project-store.mjs +208 -0
  65. package/dist/src/platform/file-opener.mjs +9 -0
  66. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  67. package/dist/src/platform/linux/credential-store.mjs +28 -0
  68. package/dist/src/platform/linux/desktop-host.mjs +83 -0
  69. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  70. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  71. package/dist/src/platform/linux/network-info.mjs +11 -0
  72. package/dist/src/platform/linux/process.mjs +42 -0
  73. package/dist/src/platform/linux/project-locations.mjs +17 -0
  74. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  75. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  76. package/dist/src/platform/linux/service-host.mjs +18 -0
  77. package/dist/src/platform/linux/system.mjs +49 -0
  78. package/dist/src/platform/linux/user-environment.mjs +7 -0
  79. package/dist/src/platform/macos/codex-runtime.mjs +125 -0
  80. package/dist/src/platform/macos/credential-store.mjs +10 -0
  81. package/dist/src/platform/macos/desktop-host.mjs +82 -0
  82. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  83. package/dist/src/platform/macos/network-info.mjs +8 -0
  84. package/dist/src/platform/macos/project-locations.mjs +8 -0
  85. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  86. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  87. package/dist/src/platform/macos/service-host.mjs +18 -0
  88. package/dist/src/platform/macos/system.mjs +29 -0
  89. package/dist/src/platform/macos/user-environment.mjs +7 -0
  90. package/dist/src/platform/native-package.mjs +58 -0
  91. package/dist/src/platform/network-info.mjs +3 -0
  92. package/dist/src/platform/path-identity.mjs +5 -0
  93. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  94. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  95. package/dist/src/platform/power-inhibitor.mjs +22 -0
  96. package/dist/src/platform/project-locations.mjs +3 -0
  97. package/dist/src/platform/runtime-paths.mjs +8 -0
  98. package/dist/src/platform/select.mjs +5 -0
  99. package/dist/src/platform/service-host.mjs +3 -0
  100. package/dist/src/platform/user-environment.mjs +3 -0
  101. package/dist/src/platform/windows/activate-desktop.ps1 +48 -0
  102. package/dist/src/platform/windows/codex-runtime.mjs +215 -0
  103. package/dist/src/platform/windows/credential-store.mjs +27 -27
  104. package/dist/src/platform/windows/credential-store.ps1 +49 -49
  105. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  106. package/dist/src/platform/windows/desktop-host.mjs +43 -23
  107. package/dist/src/platform/windows/desktop-info.ps1 +14 -16
  108. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  109. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  110. package/dist/src/platform/windows/desktop-shortcuts.ps1 +21 -28
  111. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  112. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  113. package/dist/src/platform/windows/launch-worker.mjs +17 -18
  114. package/dist/src/platform/windows/project-locations.mjs +16 -0
  115. package/dist/src/platform/windows/resident-start.js +20 -0
  116. package/dist/src/platform/windows/resident-startup.ps1 +76 -20
  117. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  118. package/dist/src/platform/windows/service-host.mjs +24 -36
  119. package/dist/src/platform/windows/stop-desktop.ps1 +7 -4
  120. package/dist/src/platform/windows/user-environment.mjs +1 -1
  121. package/dist/src/project-create.mjs +121 -0
  122. package/dist/src/project-management.mjs +59 -0
  123. package/dist/src/project-remove.mjs +55 -0
  124. package/dist/src/project-update.mjs +59 -0
  125. package/dist/src/runtime-discovery.mjs +47 -0
  126. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  127. package/dist/src/self-relay/account-connections.mjs +52 -0
  128. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  129. package/dist/src/self-relay/admin-page.mjs +80 -0
  130. package/dist/src/self-relay/admin-server.mjs +74 -0
  131. package/dist/src/self-relay/admin-state.mjs +85 -19
  132. package/dist/src/self-relay/admin-style.mjs +14 -0
  133. package/dist/src/self-relay/android-releases.mjs +61 -0
  134. package/dist/src/self-relay/client.mjs +45 -45
  135. package/dist/src/self-relay/connector.mjs +421 -144
  136. package/dist/src/self-relay/demo.mjs +34 -35
  137. package/dist/src/self-relay/device-info.mjs +27 -0
  138. package/dist/src/self-relay/device-store.mjs +10 -2
  139. package/dist/src/self-relay/diagnostics.mjs +54 -0
  140. package/dist/src/self-relay/email-accounts.mjs +183 -0
  141. package/dist/src/self-relay/file-wire.mjs +13 -0
  142. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  143. package/dist/src/self-relay/lifecycle.mjs +250 -272
  144. package/dist/src/self-relay/long-pairing.mjs +40 -0
  145. package/dist/src/self-relay/mysql-state.mjs +118 -0
  146. package/dist/src/self-relay/p2p-probe.mjs +56 -11
  147. package/dist/src/self-relay/privacy-page.mjs +26 -0
  148. package/dist/src/self-relay/public-releases.mjs +52 -0
  149. package/dist/src/self-relay/rtc-file-bridge.mjs +41 -0
  150. package/dist/src/self-relay/server.mjs +652 -114
  151. package/dist/src/self-relay/usage-daily.mjs +55 -0
  152. package/dist/src/self-relay/usage-meter.mjs +141 -0
  153. package/dist/src/server.mjs +1519 -1793
  154. package/dist/src/service-control.mjs +17 -7
  155. package/dist/src/service-doctor.mjs +86 -33
  156. package/dist/src/service-health.mjs +2 -2
  157. package/dist/src/service-install.mjs +91 -85
  158. package/dist/src/service-lifecycle.mjs +117 -108
  159. package/dist/src/service-power.mjs +58 -0
  160. package/dist/src/service-restart.mjs +43 -10
  161. package/dist/src/service-update-worker.mjs +42 -0
  162. package/dist/src/service-update.mjs +71 -0
  163. package/dist/src/shared-app-server.mjs +561 -407
  164. package/dist/src/shared-catalog.mjs +95 -13
  165. package/dist/src/shared-recovery.mjs +15 -11
  166. package/dist/src/shared-thread-stream.mjs +147 -63
  167. package/dist/src/skill-install.mjs +0 -13
  168. package/dist/src/turn-model-history.mjs +47 -0
  169. package/dist/src/usage-reset.mjs +17 -0
  170. package/dist/src/workstation-downloads.mjs +120 -0
  171. package/package.json +35 -37
  172. package/tools/postinstall.mjs +86 -22
  173. package/dist/src/app-server-client.mjs +0 -468
  174. package/dist/src/app-server-tasks.mjs +0 -358
  175. package/dist/src/debug-ui.mjs +0 -131
  176. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  177. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  178. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  179. package/dist/src/thread-catalog.mjs +0 -47
  180. package/dist/tools/find-desktop-pipe.mjs +0 -10
  181. package/dist/web/activity-view.js +0 -283
  182. package/dist/web/approval-ui.js +0 -188
  183. package/dist/web/capabilities.js +0 -57
  184. package/dist/web/chat-transport.js +0 -202
  185. package/dist/web/chat.css +0 -782
  186. package/dist/web/chat.js +0 -3830
  187. package/dist/web/client-platform.js +0 -11
  188. package/dist/web/community-view.js +0 -20
  189. package/dist/web/community.css +0 -77
  190. package/dist/web/community.html +0 -37
  191. package/dist/web/composer-controller.js +0 -101
  192. package/dist/web/conversation-controller.js +0 -99
  193. package/dist/web/disclosure-state-controller.js +0 -95
  194. package/dist/web/draft-controller.js +0 -103
  195. package/dist/web/harmony-platform.js +0 -52
  196. package/dist/web/highlight-powershell.min.js +0 -39
  197. package/dist/web/highlight.min.js +0 -1262
  198. package/dist/web/history-cache.js +0 -240
  199. package/dist/web/history-controller.js +0 -167
  200. package/dist/web/index.html +0 -325
  201. package/dist/web/lan-session.js +0 -122
  202. package/dist/web/link-action-controller.js +0 -212
  203. package/dist/web/message-send-controller.js +0 -177
  204. package/dist/web/message-view.js +0 -98
  205. package/dist/web/p2p-data-channel.js +0 -50
  206. package/dist/web/p2p-diagnostics.js +0 -28
  207. package/dist/web/p2p-probe.js +0 -123
  208. package/dist/web/page-resume.js +0 -28
  209. package/dist/web/pending-message-store.js +0 -108
  210. package/dist/web/queue-controller.js +0 -82
  211. package/dist/web/resources.json +0 -1
  212. package/dist/web/self-relay-session.js +0 -129
  213. package/dist/web/server-requests.js +0 -67
  214. package/dist/web/station-connection-controller.js +0 -75
  215. package/dist/web/task-list-view.js +0 -296
  216. package/dist/web/thread-attention-controller.js +0 -124
  217. package/dist/web/thread-context-controller.js +0 -30
  218. package/dist/web/thread-list-controller.js +0 -61
  219. package/dist/web/thread-list-sync.js +0 -86
  220. package/dist/web/thread-title-controller.js +0 -57
  221. package/dist/web/timeline-formatters.js +0 -249
  222. package/dist/web/timeline-reducer.js +0 -81
  223. package/dist/web/timeline-renderer.js +0 -161
  224. package/dist/web/timeline-scroll-controller.js +0 -50
  225. package/dist/web/timeline-sync.js +0 -67
  226. package/dist/web/usage-controller.js +0 -258
  227. package/dist/web/vendor/README.md +0 -14
  228. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  229. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  230. package/dist/web/vendor/highlight.min.js +0 -1262
  231. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  232. package/node_modules/@img/colour/LICENSE.md +0 -82
  233. package/node_modules/@img/colour/README.md +0 -15
  234. package/node_modules/@img/colour/color.cjs +0 -1596
  235. package/node_modules/@img/colour/index.cjs +0 -1
  236. package/node_modules/@img/colour/index.d.ts +0 -929
  237. package/node_modules/@img/colour/package.json +0 -58
  238. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  239. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  240. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  241. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  242. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  243. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  244. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  245. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  246. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  247. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  248. package/node_modules/ansi-regex/index.d.ts +0 -37
  249. package/node_modules/ansi-regex/index.js +0 -10
  250. package/node_modules/ansi-regex/license +0 -9
  251. package/node_modules/ansi-regex/package.json +0 -55
  252. package/node_modules/ansi-regex/readme.md +0 -78
  253. package/node_modules/ansi-styles/index.d.ts +0 -345
  254. package/node_modules/ansi-styles/index.js +0 -163
  255. package/node_modules/ansi-styles/license +0 -9
  256. package/node_modules/ansi-styles/package.json +0 -56
  257. package/node_modules/ansi-styles/readme.md +0 -152
  258. package/node_modules/camelcase/index.d.ts +0 -63
  259. package/node_modules/camelcase/index.js +0 -76
  260. package/node_modules/camelcase/license +0 -9
  261. package/node_modules/camelcase/package.json +0 -43
  262. package/node_modules/camelcase/readme.md +0 -99
  263. package/node_modules/cliui/CHANGELOG.md +0 -76
  264. package/node_modules/cliui/LICENSE.txt +0 -14
  265. package/node_modules/cliui/README.md +0 -115
  266. package/node_modules/cliui/index.js +0 -354
  267. package/node_modules/cliui/package.json +0 -65
  268. package/node_modules/color-convert/CHANGELOG.md +0 -54
  269. package/node_modules/color-convert/LICENSE +0 -21
  270. package/node_modules/color-convert/README.md +0 -68
  271. package/node_modules/color-convert/conversions.js +0 -839
  272. package/node_modules/color-convert/index.js +0 -81
  273. package/node_modules/color-convert/package.json +0 -48
  274. package/node_modules/color-convert/route.js +0 -97
  275. package/node_modules/color-name/LICENSE +0 -8
  276. package/node_modules/color-name/README.md +0 -11
  277. package/node_modules/color-name/index.js +0 -152
  278. package/node_modules/color-name/package.json +0 -28
  279. package/node_modules/decamelize/index.js +0 -13
  280. package/node_modules/decamelize/license +0 -21
  281. package/node_modules/decamelize/package.json +0 -38
  282. package/node_modules/decamelize/readme.md +0 -48
  283. package/node_modules/detect-libc/LICENSE +0 -201
  284. package/node_modules/detect-libc/README.md +0 -163
  285. package/node_modules/detect-libc/index.d.ts +0 -14
  286. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  287. package/node_modules/detect-libc/lib/elf.js +0 -39
  288. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  289. package/node_modules/detect-libc/lib/process.js +0 -24
  290. package/node_modules/detect-libc/package.json +0 -44
  291. package/node_modules/dijkstrajs/.travis.yml +0 -4
  292. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  293. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  294. package/node_modules/dijkstrajs/README.md +0 -18
  295. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  296. package/node_modules/dijkstrajs/package.json +0 -60
  297. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  298. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  299. package/node_modules/emoji-regex/README.md +0 -73
  300. package/node_modules/emoji-regex/es2015/index.js +0 -6
  301. package/node_modules/emoji-regex/es2015/text.js +0 -6
  302. package/node_modules/emoji-regex/index.d.ts +0 -23
  303. package/node_modules/emoji-regex/index.js +0 -6
  304. package/node_modules/emoji-regex/package.json +0 -50
  305. package/node_modules/emoji-regex/text.js +0 -6
  306. package/node_modules/find-up/index.d.ts +0 -137
  307. package/node_modules/find-up/index.js +0 -89
  308. package/node_modules/find-up/license +0 -9
  309. package/node_modules/find-up/package.json +0 -53
  310. package/node_modules/find-up/readme.md +0 -156
  311. package/node_modules/get-caller-file/LICENSE.md +0 -6
  312. package/node_modules/get-caller-file/README.md +0 -41
  313. package/node_modules/get-caller-file/index.d.ts +0 -2
  314. package/node_modules/get-caller-file/index.js +0 -22
  315. package/node_modules/get-caller-file/index.js.map +0 -1
  316. package/node_modules/get-caller-file/package.json +0 -42
  317. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  318. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  319. package/node_modules/is-fullwidth-code-point/license +0 -9
  320. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  321. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  322. package/node_modules/locate-path/index.d.ts +0 -83
  323. package/node_modules/locate-path/index.js +0 -65
  324. package/node_modules/locate-path/license +0 -9
  325. package/node_modules/locate-path/package.json +0 -45
  326. package/node_modules/locate-path/readme.md +0 -122
  327. package/node_modules/node-datachannel/.clang-format +0 -17
  328. package/node_modules/node-datachannel/.editorconfig +0 -12
  329. package/node_modules/node-datachannel/.eslintignore +0 -8
  330. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  331. package/node_modules/node-datachannel/.gitmodules +0 -3
  332. package/node_modules/node-datachannel/.prettierignore +0 -7
  333. package/node_modules/node-datachannel/.prettierrc +0 -13
  334. package/node_modules/node-datachannel/API.md +0 -247
  335. package/node_modules/node-datachannel/BULDING.md +0 -26
  336. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  337. package/node_modules/node-datachannel/LICENSE +0 -373
  338. package/node_modules/node-datachannel/README.md +0 -129
  339. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  340. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  341. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  342. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  343. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  344. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  345. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  346. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  347. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  348. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  349. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  350. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  352. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  354. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  376. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  378. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  380. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  382. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  384. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  386. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  388. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  390. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  392. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  394. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  410. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  411. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  412. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  413. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  414. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  415. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  416. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  417. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  418. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  419. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  420. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  421. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  426. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  427. package/node_modules/node-datachannel/jest.config.ts +0 -14
  428. package/node_modules/node-datachannel/package.json +0 -133
  429. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  430. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  431. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  432. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  433. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  434. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  435. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  436. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  437. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  438. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  439. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  440. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  441. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  442. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  443. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  444. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  445. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  446. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  447. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  448. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  449. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  450. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  451. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  452. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  453. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  454. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  455. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  456. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  457. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  458. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  459. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  460. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  461. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  462. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  463. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  464. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  465. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  466. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  467. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  468. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  469. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  470. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  471. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  472. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  473. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  474. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  475. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  476. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  477. package/node_modules/node-datachannel/src/index.ts +0 -9
  478. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  479. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  480. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  481. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  482. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  483. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  484. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  485. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  486. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  487. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  488. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  489. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  490. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  491. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  492. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  493. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  494. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  495. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  496. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  497. package/node_modules/node-datachannel/tsconfig.json +0 -21
  498. package/node_modules/p-limit/index.d.ts +0 -38
  499. package/node_modules/p-limit/index.js +0 -57
  500. package/node_modules/p-limit/license +0 -9
  501. package/node_modules/p-limit/package.json +0 -52
  502. package/node_modules/p-limit/readme.md +0 -101
  503. package/node_modules/p-locate/index.d.ts +0 -64
  504. package/node_modules/p-locate/index.js +0 -52
  505. package/node_modules/p-locate/license +0 -9
  506. package/node_modules/p-locate/package.json +0 -53
  507. package/node_modules/p-locate/readme.md +0 -90
  508. package/node_modules/p-try/index.d.ts +0 -39
  509. package/node_modules/p-try/index.js +0 -9
  510. package/node_modules/p-try/license +0 -9
  511. package/node_modules/p-try/package.json +0 -42
  512. package/node_modules/p-try/readme.md +0 -58
  513. package/node_modules/path-exists/index.d.ts +0 -28
  514. package/node_modules/path-exists/index.js +0 -23
  515. package/node_modules/path-exists/license +0 -9
  516. package/node_modules/path-exists/package.json +0 -39
  517. package/node_modules/path-exists/readme.md +0 -52
  518. package/node_modules/pngjs/.eslintignore +0 -2
  519. package/node_modules/pngjs/.eslintrc.json +0 -19
  520. package/node_modules/pngjs/.prettierignore +0 -3
  521. package/node_modules/pngjs/LICENSE +0 -20
  522. package/node_modules/pngjs/README.md +0 -429
  523. package/node_modules/pngjs/browser.js +0 -16096
  524. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  525. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  526. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  527. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  528. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  529. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  530. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  531. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  532. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  533. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  534. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  535. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  536. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  537. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  538. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  539. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  540. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  541. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  542. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  543. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  544. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  545. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  546. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  547. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  548. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  549. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  550. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  551. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  552. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  553. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  554. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  555. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  556. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  557. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  558. package/node_modules/pngjs/lib/constants.js +0 -32
  559. package/node_modules/pngjs/lib/crc.js +0 -40
  560. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  561. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  562. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  563. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  564. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  565. package/node_modules/pngjs/lib/interlace.js +0 -95
  566. package/node_modules/pngjs/lib/packer-async.js +0 -50
  567. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  568. package/node_modules/pngjs/lib/packer.js +0 -129
  569. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  570. package/node_modules/pngjs/lib/parser-async.js +0 -165
  571. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  572. package/node_modules/pngjs/lib/parser.js +0 -290
  573. package/node_modules/pngjs/lib/png-sync.js +0 -12
  574. package/node_modules/pngjs/lib/png.js +0 -194
  575. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  576. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  577. package/node_modules/pngjs/package.json +0 -73
  578. package/node_modules/qrcode/README.md +0 -770
  579. package/node_modules/qrcode/bin/qrcode +0 -159
  580. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  581. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  582. package/node_modules/qrcode/lib/browser.js +0 -76
  583. package/node_modules/qrcode/lib/can-promise.js +0 -7
  584. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  585. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  586. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  587. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  588. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  589. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  590. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  591. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  592. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  593. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  594. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  595. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  596. package/node_modules/qrcode/lib/core/mode.js +0 -167
  597. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  598. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  599. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  600. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  601. package/node_modules/qrcode/lib/core/regex.js +0 -31
  602. package/node_modules/qrcode/lib/core/segments.js +0 -330
  603. package/node_modules/qrcode/lib/core/utils.js +0 -63
  604. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  605. package/node_modules/qrcode/lib/core/version.js +0 -163
  606. package/node_modules/qrcode/lib/index.js +0 -12
  607. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  608. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  609. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  610. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  611. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  612. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  613. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  614. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  615. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  616. package/node_modules/qrcode/lib/server.js +0 -138
  617. package/node_modules/qrcode/license +0 -10
  618. package/node_modules/qrcode/package.json +0 -77
  619. package/node_modules/require-directory/.jshintrc +0 -67
  620. package/node_modules/require-directory/.npmignore +0 -1
  621. package/node_modules/require-directory/.travis.yml +0 -3
  622. package/node_modules/require-directory/LICENSE +0 -22
  623. package/node_modules/require-directory/README.markdown +0 -184
  624. package/node_modules/require-directory/index.js +0 -86
  625. package/node_modules/require-directory/package.json +0 -40
  626. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  627. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  628. package/node_modules/require-main-filename/README.md +0 -26
  629. package/node_modules/require-main-filename/index.js +0 -18
  630. package/node_modules/require-main-filename/package.json +0 -35
  631. package/node_modules/semver/LICENSE +0 -15
  632. package/node_modules/semver/README.md +0 -680
  633. package/node_modules/semver/bin/semver.js +0 -195
  634. package/node_modules/semver/classes/comparator.js +0 -143
  635. package/node_modules/semver/classes/index.js +0 -7
  636. package/node_modules/semver/classes/range.js +0 -577
  637. package/node_modules/semver/classes/semver.js +0 -350
  638. package/node_modules/semver/functions/clean.js +0 -8
  639. package/node_modules/semver/functions/cmp.js +0 -54
  640. package/node_modules/semver/functions/coerce.js +0 -62
  641. package/node_modules/semver/functions/compare-build.js +0 -9
  642. package/node_modules/semver/functions/compare-loose.js +0 -5
  643. package/node_modules/semver/functions/compare.js +0 -7
  644. package/node_modules/semver/functions/diff.js +0 -60
  645. package/node_modules/semver/functions/eq.js +0 -5
  646. package/node_modules/semver/functions/gt.js +0 -5
  647. package/node_modules/semver/functions/gte.js +0 -5
  648. package/node_modules/semver/functions/inc.js +0 -21
  649. package/node_modules/semver/functions/lt.js +0 -5
  650. package/node_modules/semver/functions/lte.js +0 -5
  651. package/node_modules/semver/functions/major.js +0 -5
  652. package/node_modules/semver/functions/minor.js +0 -5
  653. package/node_modules/semver/functions/neq.js +0 -5
  654. package/node_modules/semver/functions/parse.js +0 -18
  655. package/node_modules/semver/functions/patch.js +0 -5
  656. package/node_modules/semver/functions/prerelease.js +0 -8
  657. package/node_modules/semver/functions/rcompare.js +0 -5
  658. package/node_modules/semver/functions/rsort.js +0 -5
  659. package/node_modules/semver/functions/satisfies.js +0 -12
  660. package/node_modules/semver/functions/sort.js +0 -5
  661. package/node_modules/semver/functions/truncate.js +0 -48
  662. package/node_modules/semver/functions/valid.js +0 -8
  663. package/node_modules/semver/index.js +0 -93
  664. package/node_modules/semver/internal/constants.js +0 -37
  665. package/node_modules/semver/internal/debug.js +0 -11
  666. package/node_modules/semver/internal/identifiers.js +0 -29
  667. package/node_modules/semver/internal/lrucache.js +0 -42
  668. package/node_modules/semver/internal/parse-options.js +0 -17
  669. package/node_modules/semver/internal/re.js +0 -223
  670. package/node_modules/semver/package.json +0 -78
  671. package/node_modules/semver/preload.js +0 -4
  672. package/node_modules/semver/range.bnf +0 -17
  673. package/node_modules/semver/ranges/gtr.js +0 -6
  674. package/node_modules/semver/ranges/intersects.js +0 -9
  675. package/node_modules/semver/ranges/ltr.js +0 -6
  676. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  677. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  678. package/node_modules/semver/ranges/min-version.js +0 -63
  679. package/node_modules/semver/ranges/outside.js +0 -82
  680. package/node_modules/semver/ranges/simplify.js +0 -49
  681. package/node_modules/semver/ranges/subset.js +0 -249
  682. package/node_modules/semver/ranges/to-comparators.js +0 -10
  683. package/node_modules/semver/ranges/valid.js +0 -13
  684. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  685. package/node_modules/set-blocking/LICENSE.txt +0 -14
  686. package/node_modules/set-blocking/README.md +0 -31
  687. package/node_modules/set-blocking/index.js +0 -7
  688. package/node_modules/set-blocking/package.json +0 -42
  689. package/node_modules/sharp/LICENSE +0 -191
  690. package/node_modules/sharp/README.md +0 -112
  691. package/node_modules/sharp/dist/channel.cjs +0 -177
  692. package/node_modules/sharp/dist/channel.mjs +0 -177
  693. package/node_modules/sharp/dist/colour.cjs +0 -199
  694. package/node_modules/sharp/dist/colour.mjs +0 -199
  695. package/node_modules/sharp/dist/composite.cjs +0 -213
  696. package/node_modules/sharp/dist/composite.mjs +0 -213
  697. package/node_modules/sharp/dist/constructor.cjs +0 -511
  698. package/node_modules/sharp/dist/constructor.mjs +0 -511
  699. package/node_modules/sharp/dist/index.cjs +0 -25
  700. package/node_modules/sharp/dist/index.d.cts +0 -1999
  701. package/node_modules/sharp/dist/index.d.mts +0 -2046
  702. package/node_modules/sharp/dist/index.mjs +0 -25
  703. package/node_modules/sharp/dist/input.cjs +0 -819
  704. package/node_modules/sharp/dist/input.mjs +0 -819
  705. package/node_modules/sharp/dist/is.cjs +0 -143
  706. package/node_modules/sharp/dist/is.mjs +0 -143
  707. package/node_modules/sharp/dist/libvips.cjs +0 -212
  708. package/node_modules/sharp/dist/libvips.mjs +0 -212
  709. package/node_modules/sharp/dist/operation.cjs +0 -1002
  710. package/node_modules/sharp/dist/operation.mjs +0 -1002
  711. package/node_modules/sharp/dist/output.cjs +0 -1785
  712. package/node_modules/sharp/dist/output.mjs +0 -1785
  713. package/node_modules/sharp/dist/resize.cjs +0 -617
  714. package/node_modules/sharp/dist/resize.mjs +0 -617
  715. package/node_modules/sharp/dist/sharp.cjs +0 -174
  716. package/node_modules/sharp/dist/sharp.mjs +0 -174
  717. package/node_modules/sharp/dist/utility.cjs +0 -301
  718. package/node_modules/sharp/dist/utility.mjs +0 -301
  719. package/node_modules/sharp/install/build.js +0 -38
  720. package/node_modules/sharp/lib/index.d.ts +0 -1999
  721. package/node_modules/sharp/package.json +0 -227
  722. package/node_modules/sharp/src/binding.gyp +0 -303
  723. package/node_modules/sharp/src/common.cc +0 -1186
  724. package/node_modules/sharp/src/common.h +0 -421
  725. package/node_modules/sharp/src/metadata.cc +0 -404
  726. package/node_modules/sharp/src/metadata.h +0 -95
  727. package/node_modules/sharp/src/operations.cc +0 -516
  728. package/node_modules/sharp/src/operations.h +0 -137
  729. package/node_modules/sharp/src/pipeline.cc +0 -1948
  730. package/node_modules/sharp/src/pipeline.h +0 -422
  731. package/node_modules/sharp/src/sharp.cc +0 -43
  732. package/node_modules/sharp/src/stats.cc +0 -186
  733. package/node_modules/sharp/src/stats.h +0 -62
  734. package/node_modules/sharp/src/utilities.cc +0 -289
  735. package/node_modules/sharp/src/utilities.h +0 -22
  736. package/node_modules/string-width/index.d.ts +0 -29
  737. package/node_modules/string-width/index.js +0 -47
  738. package/node_modules/string-width/license +0 -9
  739. package/node_modules/string-width/package.json +0 -56
  740. package/node_modules/string-width/readme.md +0 -50
  741. package/node_modules/strip-ansi/index.d.ts +0 -17
  742. package/node_modules/strip-ansi/index.js +0 -4
  743. package/node_modules/strip-ansi/license +0 -9
  744. package/node_modules/strip-ansi/package.json +0 -54
  745. package/node_modules/strip-ansi/readme.md +0 -46
  746. package/node_modules/which-module/LICENSE +0 -13
  747. package/node_modules/which-module/README.md +0 -58
  748. package/node_modules/which-module/index.js +0 -9
  749. package/node_modules/which-module/package.json +0 -41
  750. package/node_modules/wrap-ansi/index.js +0 -186
  751. package/node_modules/wrap-ansi/license +0 -9
  752. package/node_modules/wrap-ansi/package.json +0 -61
  753. package/node_modules/wrap-ansi/readme.md +0 -97
  754. package/node_modules/ws/LICENSE +0 -20
  755. package/node_modules/ws/README.md +0 -548
  756. package/node_modules/ws/browser.js +0 -8
  757. package/node_modules/ws/index.js +0 -22
  758. package/node_modules/ws/lib/buffer-util.js +0 -131
  759. package/node_modules/ws/lib/constants.js +0 -19
  760. package/node_modules/ws/lib/event-target.js +0 -292
  761. package/node_modules/ws/lib/extension.js +0 -203
  762. package/node_modules/ws/lib/limiter.js +0 -55
  763. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  764. package/node_modules/ws/lib/receiver.js +0 -743
  765. package/node_modules/ws/lib/sender.js +0 -607
  766. package/node_modules/ws/lib/stream.js +0 -161
  767. package/node_modules/ws/lib/subprotocol.js +0 -62
  768. package/node_modules/ws/lib/validation.js +0 -152
  769. package/node_modules/ws/lib/websocket-server.js +0 -562
  770. package/node_modules/ws/lib/websocket.js +0 -1407
  771. package/node_modules/ws/package.json +0 -74
  772. package/node_modules/ws/wrapper.mjs +0 -21
  773. package/node_modules/y18n/CHANGELOG.md +0 -35
  774. package/node_modules/y18n/LICENSE +0 -13
  775. package/node_modules/y18n/README.md +0 -109
  776. package/node_modules/y18n/index.js +0 -188
  777. package/node_modules/y18n/package.json +0 -39
  778. package/node_modules/yargs/CHANGELOG.md +0 -420
  779. package/node_modules/yargs/LICENSE +0 -21
  780. package/node_modules/yargs/README.md +0 -140
  781. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  782. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  783. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  784. package/node_modules/yargs/build/lib/argsert.js +0 -65
  785. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  786. package/node_modules/yargs/build/lib/command.js +0 -416
  787. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  788. package/node_modules/yargs/build/lib/common-types.js +0 -25
  789. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  790. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  791. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  792. package/node_modules/yargs/build/lib/completion.js +0 -135
  793. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  794. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  795. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  796. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  797. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  798. package/node_modules/yargs/build/lib/middleware.js +0 -57
  799. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  800. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  801. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  802. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  803. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  804. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  805. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  806. package/node_modules/yargs/build/lib/usage.js +0 -540
  807. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  808. package/node_modules/yargs/build/lib/validation.js +0 -330
  809. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  810. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  811. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  812. package/node_modules/yargs/build/lib/yerror.js +0 -11
  813. package/node_modules/yargs/index.js +0 -40
  814. package/node_modules/yargs/locales/be.json +0 -46
  815. package/node_modules/yargs/locales/de.json +0 -46
  816. package/node_modules/yargs/locales/en.json +0 -51
  817. package/node_modules/yargs/locales/es.json +0 -46
  818. package/node_modules/yargs/locales/fi.json +0 -49
  819. package/node_modules/yargs/locales/fr.json +0 -53
  820. package/node_modules/yargs/locales/hi.json +0 -49
  821. package/node_modules/yargs/locales/hu.json +0 -46
  822. package/node_modules/yargs/locales/id.json +0 -50
  823. package/node_modules/yargs/locales/it.json +0 -46
  824. package/node_modules/yargs/locales/ja.json +0 -51
  825. package/node_modules/yargs/locales/ko.json +0 -49
  826. package/node_modules/yargs/locales/nb.json +0 -44
  827. package/node_modules/yargs/locales/nl.json +0 -49
  828. package/node_modules/yargs/locales/nn.json +0 -44
  829. package/node_modules/yargs/locales/pirate.json +0 -13
  830. package/node_modules/yargs/locales/pl.json +0 -49
  831. package/node_modules/yargs/locales/pt.json +0 -45
  832. package/node_modules/yargs/locales/pt_BR.json +0 -48
  833. package/node_modules/yargs/locales/ru.json +0 -46
  834. package/node_modules/yargs/locales/th.json +0 -46
  835. package/node_modules/yargs/locales/tr.json +0 -48
  836. package/node_modules/yargs/locales/zh_CN.json +0 -48
  837. package/node_modules/yargs/locales/zh_TW.json +0 -47
  838. package/node_modules/yargs/package.json +0 -92
  839. package/node_modules/yargs/yargs.js +0 -14
  840. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  841. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  842. package/node_modules/yargs-parser/README.md +0 -449
  843. package/node_modules/yargs-parser/index.js +0 -1032
  844. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  845. package/node_modules/yargs-parser/package.json +0 -46
@@ -0,0 +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(); }
@@ -0,0 +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(); }
@@ -0,0 +1,63 @@
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
+ import { readPublicManifest, updatePublicAndroid } from '../src/self-relay/public-releases.mjs';
8
+
9
+ // This administrative command runs only on the deployment host; no keys cross SSH.
10
+ const [apkFile, metadataFile, mode] = process.argv.slice(2);
11
+ if (mode && mode !== '--existing-object') throw new Error('Invalid publication mode');
12
+ if (!apkFile || !metadataFile) throw new Error('Usage: publish-android-release.mjs APK METADATA');
13
+ const storage = androidReleaseStorage('/etc/codex-relay/android-releases.json', '/etc/codex-relay/tencent-monitor.json');
14
+ const metadata = JSON.parse(fs.readFileSync(metadataFile, 'utf8'));
15
+ if (metadata.packageName !== 'com.walkhi.codexremote' || !/^[a-f0-9]{64}$/.test(metadata.certificateSha256)) throw new Error('Invalid APK identity');
16
+ const { certificateSha256: expectedCertificate } = JSON.parse(fs.readFileSync('/etc/codex-relay/android-releases.json', 'utf8'));
17
+ if (!/^[a-f0-9]{64}$/.test(expectedCertificate) || metadata.certificateSha256 !== expectedCertificate) throw new Error('APK signing certificate does not match release configuration');
18
+ const bytes = fs.readFileSync(apkFile), sha256 = createHash('sha256').update(bytes).digest('hex');
19
+ if (sha256 !== metadata.sha256 || bytes.length !== metadata.size) throw new Error('Uploaded APK integrity mismatch');
20
+ const { versionCode, versionName, size, notes, certificateSha256 } = metadata;
21
+ const release = { versionCode, versionName, size, sha256, notes, certificateSha256,
22
+ objectKey: `code-relax/android/${versionCode}/Code-Relax-${sha256.slice(0, 16)}.apk` };
23
+ const catalogFile = storage.catalogFile, temporary = catalogFile + '.new', lock = catalogFile + '.lock';
24
+ const lockHandle = fs.openSync(lock, 'wx', 0o600);
25
+ try {
26
+ readPublicManifest();
27
+ const catalog = fs.existsSync(catalogFile) ? readAndroidCatalog(catalogFile) : { releases: [] };
28
+ const previous = catalog.releases.find(item => item.versionCode === versionCode);
29
+ if (previous && previous.sha256 !== sha256) throw new Error('A different APK already uses this versionCode');
30
+ if (catalog.latestVersionCode > versionCode) throw new Error('Refusing to publish an older version as latest');
31
+ const next = { latestVersionCode: versionCode, releases: [...catalog.releases.filter(item => item.versionCode !== versionCode), release] };
32
+ fs.writeFileSync(temporary, JSON.stringify(next, null, 2) + '\n', { mode: 0o640 });
33
+ readAndroidCatalog(temporary);
34
+ if (!previous && mode !== '--existing-object') {
35
+ await new Promise((resolve, reject) => storage.cos.putObject({ ...storage.object(release), Body: bytes,
36
+ ContentLength: bytes.length, ContentType: 'application/vnd.android.package-archive',
37
+ ContentDisposition: `attachment; filename="Code-Relax-${versionName}.apk"`
38
+ }, (error, value) => error ? reject(error) : resolve(value)));
39
+ }
40
+ // Validate the exact signed GET that website and App use, before switching latest.
41
+ const ticket = await storage.signDownload(release);
42
+ const response = await fetch(ticket.url, { signal: AbortSignal.timeout(120000) });
43
+ if (!response.ok) throw new Error(`Signed download failed: HTTP ${response.status}`);
44
+ const downloaded = Buffer.from(await response.arrayBuffer());
45
+ if (downloaded.length !== size || createHash('sha256').update(downloaded).digest('hex') !== sha256) throw new Error('Stored APK integrity mismatch');
46
+ const unsigned = new URL(ticket.url); unsigned.search = '';
47
+ const denied = await fetch(unsigned, { method: 'HEAD', signal: AbortSignal.timeout(15000) });
48
+ if (denied.status !== 403) throw new Error(`Private object check failed: HTTP ${denied.status}`);
49
+ const owner = fs.statSync(path.dirname(catalogFile));
50
+ fs.chownSync(temporary, owner.uid, owner.gid);
51
+ fs.renameSync(temporary, catalogFile);
52
+ updatePublicAndroid(release);
53
+ console.log(JSON.stringify({ published: true, versionCode, versionName, size, sha256, unsignedStatus: denied.status,
54
+ entry: 'https://www.coderelax.cn/code-relax/android' }));
55
+ } catch (error) {
56
+ // COS errors can carry signed request details. Keep CLI output credential-free.
57
+ console.error('Android publication failed:', error?.code || (error?.name === 'Error' ? error.message : 'storage-request-failed'));
58
+ process.exitCode = 1;
59
+ } finally {
60
+ fs.closeSync(lockHandle);
61
+ fs.unlinkSync(lock);
62
+ if (fs.existsSync(temporary)) fs.unlinkSync(temporary);
63
+ }
@@ -0,0 +1,46 @@
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 { readHarmonyConfig, hapName, validateHarmonyMetadata, checkHarmonyVersion,
7
+ verifyHarmony, activateHarmony } from '../relay-admin/harmony-release.mjs';
8
+
9
+ // Local PowerShell releases use the same verifier, COS objects and activation as GitHub CD.
10
+ const directory = path.resolve(process.argv[2] || '');
11
+ if (!process.argv[2]) throw Error('Usage: publish-harmony-release.mjs DIRECTORY');
12
+ let stage = 'metadata';
13
+ try {
14
+ const manifest = JSON.parse(fs.readFileSync(path.join(directory, 'manifest.json5'), 'utf8')).app;
15
+ const config = readHarmonyConfig();
16
+ const metadata = { packageName: manifest.bundleName, versionCode: manifest.versionCode,
17
+ versionName: manifest.versionName, certificateSha256: config.certificateSha256 };
18
+ if (!Number.isSafeInteger(metadata.versionCode) || metadata.versionCode <= 0
19
+ || !/^\d+\.\d+\.\d+$/.test(metadata.versionName)) throw Error();
20
+ metadata.files = [hapName(metadata), 'manifest.json5', 'icon.png'].map(name => {
21
+ const bytes = fs.readFileSync(path.join(directory, name));
22
+ return { name, size: bytes.length, sha256: createHash('sha256').update(bytes).digest('hex'),
23
+ contentMd5: createHash('md5').update(bytes).digest('base64') };
24
+ });
25
+ Object.assign(metadata, { size: metadata.files[0].size, sha256: metadata.files[0].sha256,
26
+ contentMd5: metadata.files[0].contentMd5 });
27
+ validateHarmonyMetadata(metadata, config);
28
+ checkHarmonyVersion(metadata);
29
+ stage = 'signature';
30
+ await verifyHarmony(directory, metadata, config);
31
+ const storage = androidReleaseStorage('/etc/codex-relay/android-releases.json', '/etc/codex-relay/tencent-monitor.json');
32
+ const keys = metadata.files.map(f => `code-relax/harmony/${metadata.versionCode}/${f.name}`);
33
+ stage = 'upload';
34
+ for (const [i, file] of metadata.files.entries()) {
35
+ await new Promise((resolve, reject) => storage.cos.putObject({ ...storage.object({ objectKey: keys[i] }),
36
+ Body: fs.createReadStream(path.join(directory, file.name)), ContentLength: file.size,
37
+ ContentMD5: file.contentMd5, ContentType: i === 1 ? 'application/json' : i === 2 ? 'image/png' : 'application/octet-stream',
38
+ Headers: { 'x-cos-forbid-overwrite': 'true' }
39
+ }, (error, result) => error ? reject(error) : resolve(result)));
40
+ }
41
+ stage = 'publication';
42
+ console.log(JSON.stringify(await activateHarmony(metadata, storage, keys)));
43
+ } catch {
44
+ console.error(`Harmony publication failed at ${stage}; inspect objects and current version before retrying.`);
45
+ process.exitCode = 1;
46
+ }
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import http from 'node:http';
6
+ import { createHash, randomUUID } from 'node:crypto';
7
+ import { pipeline } from 'node:stream/promises';
8
+ import { Transform, Readable } from 'node:stream';
9
+ import { execFile } from 'node:child_process';
10
+ import { promisify } from 'node:util';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { verifyReleaseIdentity, createUploadSigner } from '../relay-admin/release-oidc.mjs';
13
+ import { androidReleaseStorage } from '../relay-admin/android-release-storage.mjs';
14
+ import { readAndroidCatalog } from '../src/self-relay/android-releases.mjs';
15
+
16
+ import { readHarmonyConfig, validateHarmonyMetadata, checkHarmonyVersion, verifyHarmony, activateHarmony } from '../relay-admin/harmony-release.mjs';
17
+
18
+ const execute = promisify(execFile);
19
+ const config = JSON.parse(fs.readFileSync('/etc/codex-relay/android-releases.json', 'utf8'));
20
+ const credential = JSON.parse(fs.readFileSync('/etc/codex-relay/tencent-monitor.json', 'utf8'));
21
+ const storage = androidReleaseStorage('/etc/codex-relay/android-releases.json', '/etc/codex-relay/tencent-monitor.json');
22
+ const signUpload = createUploadSigner(config, { secretId: credential.secretId, secretKey: credential.secretKey });
23
+ const stateDir = '/var/lib/codex-relay/release-publisher';
24
+ fs.mkdirSync(stateDir, { recursive: true, mode: 0o700 });
25
+ const cosCall = (method, args) => new Promise((resolve, reject) => storage.cos[method](args, (e, r) => e ? reject(e) : resolve(r)));
26
+ const object = key => ({ Bucket: config.bucket, Region: config.region, Key: key });
27
+ const identityKey = p => `${p.repository_id}/${p.run_id}/${p.run_attempt}/${p.sha}`;
28
+ const filename = id => path.join(stateDir, id + '.json');
29
+ function save(row) {
30
+ const temp = filename(row.intentId) + '.' + randomUUID();
31
+ fs.writeFileSync(temp, JSON.stringify(row), { mode: 0o600 }); fs.renameSync(temp, filename(row.intentId));
32
+ }
33
+ const read = id => fs.existsSync(filename(id)) ? JSON.parse(fs.readFileSync(filename(id))) : null;
34
+ const publicState = row => ({ ok: true, intentId: row.intentId, status: row.status, result: row.result, error: row.error });
35
+ async function readJson(req) {
36
+ const chunks = []; let size = 0;
37
+ for await (const chunk of req) { size += chunk.length; if (size > 16384) throw Error('Request too large'); chunks.push(chunk); }
38
+ return JSON.parse(Buffer.concat(chunks).toString('utf8') || '{}');
39
+ }
40
+ function metadataFrom(data, claims, target) {
41
+ const { packageName, versionCode, versionName, size, sha256, contentMd5, certificateSha256, notes,
42
+ buildCommit, artifactId, runId, sourceCommit, verifyOnly } = data;
43
+ if (!Number.isSafeInteger(versionCode) || versionCode < 1 || versionCode > 2100000000
44
+ || !/^[a-f0-9]{64}$/.test(sha256)
45
+ || !Number.isSafeInteger(size) || size < 1 || size > 200 * 1024 * 1024
46
+ || typeof notes !== 'string' || notes.length > 2000 || !/^[A-Za-z0-9+/]{22}==$/.test(contentMd5)
47
+ || !/^\d+$/.test(artifactId) || runId !== claims.run_id || sourceCommit !== claims.sha
48
+ || typeof verifyOnly !== 'boolean' || !/^[a-f0-9]{40}$/.test(buildCommit)) throw Error('Invalid metadata');
49
+ if (target === 'hap') validateHarmonyMetadata(data, readHarmonyConfig());
50
+ else if (packageName !== 'com.walkhi.codexremote' || !/^\d+\.\d+\.\d+\.\d+$/.test(versionName)
51
+ || !versionName.endsWith('.' + versionCode) || certificateSha256 !== config.certificateSha256) throw Error('Invalid Android identity');
52
+ return { target, ...(target === 'hap' ? { files: data.files } : {}), packageName, versionCode, versionName, size, sha256, contentMd5, certificateSha256, notes,
53
+ buildCommit, artifactId, runId, sourceCommit, verifyOnly };
54
+ }
55
+ let busy = false;
56
+ const server = http.createServer(async (req, res) => {
57
+ const reply = (code, data) => { if (!res.destroyed) { res.writeHead(code, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' }); res.end(JSON.stringify(data)); } };
58
+ let claims;
59
+ try { claims = await verifyReleaseIdentity((req.headers.authorization || '').replace(/^Bearer /, '')); }
60
+ catch { reply(401, { ok: false, error: 'OIDC_REJECTED' }); return; }
61
+ const target = /^\/code-relax\/publish\/(android|hap)\/intents(?:\/|$)/.exec(req.url || '')?.[1];
62
+ if (!target) { reply(404, { ok: false, error: 'NOT_FOUND' }); return; }
63
+ const prefix = `/code-relax/publish/${target}/intents`;
64
+ try {
65
+ if (req.method === 'POST' && req.url === prefix) {
66
+ let metadata;
67
+ try { metadata = metadataFrom(await readJson(req), claims, target); } catch { reply(400, { ok: false, error: 'INVALID_RELEASE' }); return; }
68
+ if (!metadata.verifyOnly && target === 'hap') {
69
+ try { checkHarmonyVersion(metadata); } catch { reply(409, { ok: false, error: 'VERSION_CONFLICT' }); return; }
70
+ }
71
+ if (!metadata.verifyOnly && target === 'android') {
72
+ const catalog = readAndroidCatalog(config.catalogFile);
73
+ const previous = catalog.releases.find(x => x.versionCode === metadata.versionCode);
74
+ if (catalog.latestVersionCode > metadata.versionCode || (previous && previous.sha256 !== metadata.sha256)) {
75
+ reply(409, { ok: false, error: 'VERSION_CONFLICT' }); return;
76
+ }
77
+ }
78
+ const identity = identityKey(claims);
79
+ const intentId = createHash('sha256').update(JSON.stringify({ identity, metadata })).digest('hex');
80
+ let row = read(intentId);
81
+ if (row && row.status !== 'prepared') { reply(200, publicState(row)); return; }
82
+ const key = metadata.verifyOnly ? `code-relax/android/ci-verification/${claims.run_id}/${intentId}.apk`
83
+ : `code-relax/android/${metadata.versionCode}/Code-Relax-${metadata.sha256.slice(0, 16)}.apk`;
84
+ const keys = target === 'hap' ? metadata.files.map(f => metadata.verifyOnly
85
+ ? `code-relax/harmony/ci-verification/${claims.run_id}/${intentId}/${f.name}`
86
+ : `code-relax/harmony/${metadata.versionCode}/${f.name}`) : [key];
87
+ row ??= { intentId, identity, metadata, key, keys, status: 'prepared' };
88
+ save(row);
89
+ const grant = target === 'hap' ? { uploads: await Promise.all(metadata.files.map(async (f, i) => ({ name: f.name,
90
+ ...await signUpload(keys[i], f, i === 1 ? 'application/json' : i === 2 ? 'image/png' : 'application/octet-stream') }))) }
91
+ : await signUpload(key, metadata);
92
+ reply(200, { ...publicState(row), ...grant }); return;
93
+ }
94
+ const match = new RegExp(`^${prefix}/([a-f0-9]{64})(/complete)?$`).exec(req.url || '');
95
+ if (!match || !((!match[2] && req.method === 'GET') || (match[2] && req.method === 'POST'))) {
96
+ reply(404, { ok: false, error: 'NOT_FOUND' }); return;
97
+ }
98
+ const row = read(match[1]);
99
+ if (!row || row.identity !== identityKey(claims) || (row.metadata.target || 'android') !== target) { reply(404, { ok: false, error: 'INTENT_NOT_FOUND' }); return; }
100
+ if (match[2] && row.status === 'prepared') {
101
+ if (busy) { reply(409, { ok: false, error: 'PUBLICATION_BUSY' }); return; }
102
+ busy = true; row.status = 'validating'; save(row);
103
+ void complete(row).finally(() => { busy = false; });
104
+ }
105
+ reply(row.status === 'validating' ? 202 : 200, publicState(row));
106
+ } catch (error) {
107
+ console.error(JSON.stringify({ event: 'release-api-failed', code: /^[A-Za-z.]+$/.test(error.code || '') ? error.code : 'io-or-provider' }));
108
+ reply(503, { ok: false, error: 'RELEASE_UNAVAILABLE' });
109
+ }
110
+ });
111
+ async function complete(row) {
112
+ const { metadata, key } = row;
113
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-relax-release-'));
114
+ const apk = path.join(dir, 'release.apk'), json = path.join(dir, 'release.json');
115
+ const hap = metadata.target === 'hap';
116
+ const files = hap ? metadata.files : [{ ...metadata, name: 'release.apk' }];
117
+ let stage = 'download';
118
+ try {
119
+ for (const [i, file] of files.entries()) {
120
+ const ticket = await cosCall('getObjectUrl', { ...object(row.keys?.[i] || key), Sign: true, Method: 'GET', Protocol: 'https:', Expires: 300 });
121
+ const response = await fetch(ticket.Url, { signal: AbortSignal.timeout(120000) });
122
+ if (!response.ok || Number(response.headers.get('content-length')) !== file.size) throw Error();
123
+ let size = 0; const hash = createHash('sha256'), md5 = createHash('md5');
124
+ await pipeline(Readable.fromWeb(response.body), new Transform({ transform(chunk, encoding, next) {
125
+ size += chunk.length; if (size > file.size) return next(Error('Oversize'));
126
+ hash.update(chunk); md5.update(chunk); next(null, chunk);
127
+ } }), fs.createWriteStream(path.join(dir, file.name), { flags: 'wx', mode: 0o600 }));
128
+ if (size !== file.size || hash.digest('hex') !== file.sha256 || md5.digest('base64') !== file.contentMd5) throw Error();
129
+ const unsigned = new URL(ticket.Url); unsigned.search = '';
130
+ if (!hap && (await fetch(unsigned, { method: 'HEAD', signal: AbortSignal.timeout(15000) })).status !== 403) throw Error();
131
+ }
132
+ if (hap) {
133
+ stage = 'harmony-signature';
134
+ await verifyHarmony(dir, metadata, readHarmonyConfig());
135
+ row.result = { sha256: metadata.sha256, versionCode: metadata.versionCode, size: metadata.size };
136
+ if (metadata.verifyOnly) row.status = 'verified';
137
+ else { stage = 'harmony-publish'; row.result = await activateHarmony(metadata, storage, row.keys); row.status = 'published'; }
138
+ save(row); return;
139
+ }
140
+ stage = 'signature';
141
+ const { stdout: signature } = await execute('/usr/bin/apksigner', ['verify', '--print-certs', apk], {
142
+ timeout: 30000, env: { ...process.env, JAVA_TOOL_OPTIONS: '-Xmx256m' } });
143
+ const certificates = [...signature.matchAll(/^Signer #\d+ certificate SHA-256 digest: ([a-f0-9]{64})$/gm)];
144
+ if (certificates.length !== 1 || certificates[0][1] !== metadata.certificateSha256) throw Error();
145
+ stage = 'identity';
146
+ const { stdout: badging } = await execute('/usr/bin/aapt', ['dump', 'badging', apk], { timeout: 30000 });
147
+ const identity = /^package: name='([^']+)' versionCode='(\d+)' versionName='([^']+)'/m.exec(badging);
148
+ if (!identity || identity[1] !== metadata.packageName || Number(identity[2]) !== metadata.versionCode
149
+ || identity[3] !== metadata.versionName || /^application-debuggable/m.test(badging)) throw Error();
150
+ row.result = { sha256: metadata.sha256, versionCode: metadata.versionCode, size: metadata.size };
151
+ if (metadata.verifyOnly) row.status = 'verified';
152
+ else {
153
+ stage = 'publish';
154
+ fs.writeFileSync(json, JSON.stringify(metadata), { mode: 0o600 });
155
+ const { stdout } = await execute(process.execPath, [fileURLToPath(new URL('./publish-android-release.mjs', import.meta.url)), apk, json, '--existing-object'], { timeout: 240000 });
156
+ row.result = JSON.parse(stdout.trim()); row.status = 'published';
157
+ }
158
+ save(row);
159
+ } catch (error) {
160
+ row.status = 'failed'; row.error = `RELEASE_${stage.toUpperCase()}_FAILED`; save(row);
161
+ console.error(JSON.stringify({ event: 'release-validation-failed', intentId: row.intentId, stage, code: /^[A-Za-z0-9_.-]+$/.test(error.code || '') ? error.code : 'validation' }));
162
+ } finally {
163
+ for (const file of [...files.map(f => path.join(dir, f.name)), json]) fs.rmSync(file, { force: true }); fs.rmdirSync(dir);
164
+ // Verification objects remain private evidence; the deployment identity has no DeleteObject grant.
165
+ }
166
+ }
167
+ // A restart never blindly launches an interrupted publisher a second time.
168
+ for (const name of fs.readdirSync(stateDir).filter(x => /^[a-f0-9]{64}\.json$/.test(x))) {
169
+ const row = read(name.slice(0, -5));
170
+ if (row.status === 'validating') { row.status = 'failed'; row.error = 'INTERRUPTED_CHECK_LATEST'; save(row); }
171
+ }
172
+ server.requestTimeout = 15000;
173
+ server.listen(45852, '127.0.0.1');
174
+ process.on('SIGTERM', () => { server.close(); const timer = setInterval(() => { if (!busy) { clearInterval(timer); process.exit(0); } }, 250); });
@@ -0,0 +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();
@@ -3,7 +3,7 @@ import { startRelayDemo } from '../src/self-relay/demo.mjs';
3
3
  import fs from 'node:fs';
4
4
  import { spawnSync } from 'node:child_process';
5
5
 
6
- const mode = process.argv.includes('--legacy') ? 'lan-legacy' : 'lan-shared';
6
+ const mode = 'lan-shared';
7
7
  let remoteRelay;
8
8
  if (process.env.RELAY_URL) {
9
9
  let hostKey;
@@ -25,7 +25,7 @@ try {
25
25
  const health = await client.request('/api/health');
26
26
  if (health.status !== 200 || health.body.transportMode !== mode) throw new Error('Relay validation failed');
27
27
  console.log(JSON.stringify({ ok: true, simulated: true, mode, relay: demo.relay.url,
28
- bridge: demo.bridgeUrl, message: '中继 → 连接器 → 模拟 Bridge 已连通;未连接 Codex,未执行任务。' }, null, 2));
28
+ bridge: demo.bridgeUrl, message: '中继 → 连接器 → 模拟桌面服务已连通;未连接 Codex,未执行任务。' }, null, 2));
29
29
  if (!process.argv.includes('--check')) {
30
30
  console.log('验证连接保持运行。Ctrl+C 停止全部模拟进程内服务。');
31
31
  await new Promise(resolve => { process.once('SIGINT', resolve); process.once('SIGTERM', resolve); });
@@ -1,23 +1,29 @@
1
- #!/usr/bin/env node
2
- import fs from 'node:fs';
3
- import { deviceStore, validId } from '../src/self-relay/device-store.mjs';
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import serviceEndpoints from '../shared/service-endpoints.cjs';
4
+ import { deviceStore, validId } from '../src/self-relay/device-store.mjs';
5
+ import { openRelayMysql } from '../src/self-relay/mysql-state.mjs';
4
6
  import { startSelfRelay } from '../src/self-relay/server.mjs';
5
7
  import { updateDebugAllowlist } from '../src/self-relay/debug-allowlist.mjs';
6
-
7
- const keyFile = process.env.RELAY_HOST_KEY_FILE;
8
- if (!keyFile) throw new Error('RELAY_HOST_KEY_FILE is required');
9
- const hostKey = fs.readFileSync(keyFile, 'utf8').trim();
10
- const port = Number(process.env.RELAY_PORT || 45850);
11
- if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Invalid RELAY_PORT');
12
- const stateFile = process.env.RELAY_STATE_FILE;
13
- if (!stateFile) throw new Error('RELAY_STATE_FILE is required');
8
+
9
+ const keyFile = process.env.RELAY_HOST_KEY_FILE;
10
+ if (!keyFile) throw new Error('RELAY_HOST_KEY_FILE is required');
11
+ const hostKey = fs.readFileSync(keyFile, 'utf8').trim();
12
+ const port = Number(process.env.RELAY_PORT || 45850);
13
+ if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('Invalid RELAY_PORT');
14
+ const stateFile = process.env.RELAY_STATE_FILE;
15
+ const mysqlConfigFile = process.env.RELAY_MYSQL_CONFIG_FILE;
16
+ const accountConfigFile = process.env.RELAY_ACCOUNT_CONFIG_FILE;
17
+ const longPairingFile = process.env.RELAY_LONG_PAIRING_FILE || '/var/lib/codex-relay/long-pairing.json';
18
+ if (!stateFile && !mysqlConfigFile) throw new Error('RELAY_STATE_FILE or RELAY_MYSQL_CONFIG_FILE is required');
14
19
  const debugAllowlistFile = process.env.RELAY_DEBUG_ALLOWLIST_FILE || '/etc/codex-relay/debug-allowlist.json';
15
20
  const adminStateFile = process.env.RELAY_ADMIN_STATE_FILE || '/var/lib/codex-relay/admin.json';
16
21
  const maxRelaySessions = Number(process.env.RELAY_MAX_RELAY_SESSIONS || 8);
17
22
  if (!Number.isSafeInteger(maxRelaySessions) || maxRelaySessions < 1 || maxRelaySessions > 256) throw new Error('Invalid RELAY_MAX_RELAY_SESSIONS');
18
23
  const debugCommand = process.argv.find(value => ['--debug-list', '--debug-allow', '--debug-deny'].includes(value));
19
24
  if (debugCommand) {
20
- const records = deviceStore(stateFile).entries();
25
+ const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
26
+ const records = (database?.devices || deviceStore(stateFile)).entries();
21
27
  if (debugCommand === '--debug-list') {
22
28
  console.log(JSON.stringify(records.map(record => ({
23
29
  deviceId: record.id, status: record.status, clientCount: record.clients.length,
@@ -30,24 +36,31 @@ if (debugCommand) {
30
36
  updateDebugAllowlist(debugAllowlistFile, deviceId, debugCommand === '--debug-allow');
31
37
  console.log('Debug allowlist updated; restart relay to apply.');
32
38
  }
39
+ if (database) await database.close();
33
40
  process.exit(0);
34
41
  }
35
- if (process.argv.includes('--init-state')) { deviceStore(stateFile, { initialize: true }); console.log('Device store initialized'); process.exit(0); }
36
- const revokeIndex = process.argv.indexOf('--revoke-host');
37
- if (revokeIndex >= 0) {
38
- // Run only with the service stopped: this is an offline administrator operation.
39
- if (!process.argv.includes('--offline')) throw new Error('Stop the relay service and supply --offline');
40
- const id = process.argv[revokeIndex + 1];
41
- if (!validId(id)) throw new Error('Invalid device ID');
42
- const store = deviceStore(stateFile), record = store.entries().find(item => item.id === id);
43
- if (!record) throw new Error('Device not found');
44
- store.save({ ...record, status: 'revoked', clientHash: undefined, clientId: undefined, revision: record.revision + 1, updatedAt: new Date().toISOString() });
45
- console.log('Computer and phone authorization revoked'); process.exit(0);
46
- }
47
- const relay = await startSelfRelay({ port, hostKey, stateFile, debugAllowlistFile, adminStateFile, maxRelaySessions,
48
- publicRelayUrl: process.env.RELAY_PUBLIC_URL || '', appDownloadUrl: process.env.RELAY_APP_DOWNLOAD_URL || '',
42
+ if (process.argv.includes('--init-state')) { if (mysqlConfigFile) throw new Error('Use migrations for MySQL mode'); deviceStore(stateFile, { initialize: true }); console.log('Device store initialized'); process.exit(0); }
43
+ const revokeIndex = process.argv.indexOf('--revoke-host');
44
+ if (revokeIndex >= 0) {
45
+ // Run only with the service stopped: this is an offline administrator operation.
46
+ if (!process.argv.includes('--offline')) throw new Error('Stop the relay service and supply --offline');
47
+ const id = process.argv[revokeIndex + 1];
48
+ if (!validId(id)) throw new Error('Invalid device ID');
49
+ const database = mysqlConfigFile ? await openRelayMysql(mysqlConfigFile, maxRelaySessions) : null;
50
+ const store = database?.devices || deviceStore(stateFile), record = store.entries().find(item => item.id === id);
51
+ if (!record) throw new Error('Device not found');
52
+ await store.save({ ...record, status: 'revoked', clients: [], revision: record.revision + 1, updatedAt: new Date().toISOString() });
53
+ if (database) await database.close();
54
+ console.log('Computer and phone authorization revoked'); process.exit(0);
55
+ }
56
+ const relay = await startSelfRelay({ port, hostKey, stateFile, mysqlConfigFile, accountConfigFile, debugAllowlistFile, adminStateFile, maxRelaySessions,
57
+ longPairingFile,
58
+ androidReleaseConfigFile: process.env.RELAY_ANDROID_RELEASE_CONFIG_FILE,
59
+ androidReleaseCredentialFile: process.env.CREDENTIALS_DIRECTORY ? `${process.env.CREDENTIALS_DIRECTORY}/tencent-monitor.json` : undefined,
60
+ usageDiagnosticKeyFile: process.env.RELAY_USAGE_DIAGNOSTIC_KEY_FILE,
61
+ publicRelayUrl: process.env.RELAY_PUBLIC_URL || serviceEndpoints.relayUrl, appDownloadUrl: process.env.RELAY_APP_DOWNLOAD_URL || serviceEndpoints.installUrl,
49
62
  log: entry => console.log(JSON.stringify({ time: new Date().toISOString(), ...entry })) });
50
- console.log(JSON.stringify({ service: 'codex-self-relay', listen: relay.url, maxConnections: 32, maxRelaySessions,
51
- maxFrameMiB: 8, encryption: 'TLS must be supplied by reverse proxy; no end-to-end encryption' }));
52
- await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
53
- await relay.close();
63
+ console.log(JSON.stringify({ service: 'codex-self-relay', listen: relay.url, maxConnections: 128, maxRelaySessions,
64
+ maxFrameMiB: 8, encryption: 'TLS must be supplied by reverse proxy; no end-to-end encryption' }));
65
+ await new Promise(resolve => { process.once('SIGTERM', resolve); process.once('SIGINT', resolve); });
66
+ await relay.close();
@@ -0,0 +1 @@
1
+ {"layout":"npm-platform-packages","version":"0.1.0-beta.41"}
@@ -1,6 +1,6 @@
1
- # Detect the Desktop connection, not merely a listening standalone server.
2
- $connections = @(Get-NetTCPConnection -RemotePort 45839 -State Established -ErrorAction SilentlyContinue | Where-Object {
3
- $_.RemoteAddress -eq '127.0.0.1' -and
4
- (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName -eq 'ChatGPT'
5
- })
6
- if ($connections.Count) { 'ws://127.0.0.1:45839' }
1
+ # Detect the Desktop connection, not merely a listening standalone server.
2
+ $connections = @(Get-NetTCPConnection -RemotePort 45839 -State Established -ErrorAction SilentlyContinue | Where-Object {
3
+ $_.RemoteAddress -eq '127.0.0.1' -and
4
+ (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName -eq 'ChatGPT'
5
+ })
6
+ if ($connections.Count) { 'ws://127.0.0.1:45839' }