@walkhi/code-relax 0.1.0-beta.10 → 0.1.0-beta.101

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 (851) hide show
  1. package/README.md +67 -44
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +387 -265
  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 +190 -0
  9. package/dist/bin/self-relay-demo.mjs +1 -1
  10. package/dist/bin/self-relay-server.mjs +43 -30
  11. package/dist/bin/set-relay-admin-password.mjs +11 -0
  12. package/dist/build-platform.json +1 -0
  13. package/dist/get-shared-service-url.ps1 +12 -4
  14. package/dist/shared/app-server-events.cjs +452 -235
  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 +115 -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 +100 -0
  26. package/dist/shared/release-version.cjs +31 -0
  27. package/dist/shared/server-requests.cjs +347 -67
  28. package/dist/shared/service-endpoints.cjs +21 -0
  29. package/dist/shared/timeline-sync.cjs +173 -67
  30. package/dist/skills/code-relax/SKILL.md +22 -17
  31. package/dist/src/archived-threads.mjs +22 -0
  32. package/dist/src/bounded-process-log.mjs +63 -0
  33. package/dist/src/browser-auth-operations.mjs +46 -0
  34. package/dist/src/celsius-client.mjs +107 -0
  35. package/dist/src/code-browser.mjs +99 -0
  36. package/dist/src/desktop-launcher.mjs +58 -36
  37. package/dist/src/desktop-operation.mjs +46 -0
  38. package/dist/src/dots-approval-timeline.mjs +99 -0
  39. package/dist/src/dots-avatar.mjs +42 -0
  40. package/dist/src/dots-chat-projection.mjs +50 -0
  41. package/dist/src/dots-chat-server.mjs +623 -0
  42. package/dist/src/dots-message-images.mjs +318 -0
  43. package/dist/src/dots-profile.mjs +77 -0
  44. package/dist/src/dots-room-activity.mjs +199 -0
  45. package/dist/src/dots-room-client.mjs +163 -0
  46. package/dist/src/dots-room-projection.mjs +94 -0
  47. package/dist/src/dots-schedules.mjs +66 -0
  48. package/dist/src/dots-summary-tasks.mjs +32 -0
  49. package/dist/src/dots-task-catalog.mjs +433 -0
  50. package/dist/src/dots-task-files.mjs +52 -0
  51. package/dist/src/file-transfer-range.mjs +22 -0
  52. package/dist/src/file-upload-session.mjs +151 -0
  53. package/dist/src/hosted-history-app-server.mjs +103 -0
  54. package/dist/src/hosted-history-cache.mjs +113 -0
  55. package/dist/src/lan-socket-server.mjs +271 -38
  56. package/dist/src/managed-app-server.mjs +398 -227
  57. package/dist/src/managed-endpoint.mjs +25 -0
  58. package/dist/src/message-upload-files.mjs +111 -0
  59. package/dist/src/onboarding.mjs +9 -26
  60. package/dist/src/plan-pricing.mjs +47 -0
  61. package/dist/src/platform/README.md +7 -12
  62. package/dist/src/platform/codex-protocol.mjs +51 -0
  63. package/dist/src/platform/codex-runtime.mjs +4 -0
  64. package/dist/src/platform/credential-store.mjs +19 -0
  65. package/dist/src/platform/desktop-host.mjs +3 -0
  66. package/dist/src/platform/desktop-permission-mode.mjs +17 -0
  67. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  68. package/dist/src/platform/desktop-project-store.mjs +219 -0
  69. package/dist/src/platform/file-opener.mjs +9 -0
  70. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  71. package/dist/src/platform/linux/desktop-host.mjs +87 -0
  72. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  73. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  74. package/dist/src/platform/linux/network-info.mjs +11 -0
  75. package/dist/src/platform/linux/process.mjs +53 -0
  76. package/dist/src/platform/linux/project-locations.mjs +17 -0
  77. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  78. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  79. package/dist/src/platform/linux/service-host.mjs +18 -0
  80. package/dist/src/platform/linux/system.mjs +50 -0
  81. package/dist/src/platform/linux/user-environment.mjs +31 -0
  82. package/dist/src/platform/macos/codex-runtime.mjs +121 -0
  83. package/dist/src/platform/macos/desktop-host.mjs +114 -0
  84. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  85. package/dist/src/platform/macos/network-info.mjs +8 -0
  86. package/dist/src/platform/macos/project-locations.mjs +8 -0
  87. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  88. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  89. package/dist/src/platform/macos/service-host.mjs +18 -0
  90. package/dist/src/platform/macos/system.mjs +29 -0
  91. package/dist/src/platform/macos/user-environment.mjs +31 -0
  92. package/dist/src/platform/managed-user-environment.mjs +78 -0
  93. package/dist/src/platform/native-package.mjs +69 -0
  94. package/dist/src/platform/network-info.mjs +3 -0
  95. package/dist/src/platform/path-identity.mjs +5 -0
  96. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  97. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  98. package/dist/src/platform/power-inhibitor.mjs +22 -0
  99. package/dist/src/platform/project-locations.mjs +3 -0
  100. package/dist/src/platform/runtime-paths.mjs +8 -0
  101. package/dist/src/platform/select.mjs +5 -0
  102. package/dist/src/platform/service-host.mjs +3 -0
  103. package/dist/src/platform/user-environment.mjs +3 -0
  104. package/dist/src/platform/windows/activate-desktop.ps1 +52 -0
  105. package/dist/src/platform/windows/codex-runtime.mjs +215 -107
  106. package/dist/src/platform/windows/desktop-browser-environment.mjs +38 -0
  107. package/dist/src/platform/windows/desktop-helper.mjs +272 -0
  108. package/dist/src/platform/windows/desktop-host.mjs +47 -33
  109. package/dist/src/platform/windows/desktop-info.ps1 +27 -3
  110. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  111. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  112. package/dist/src/platform/windows/desktop-shortcuts.ps1 +6 -13
  113. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  114. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  115. package/dist/src/platform/windows/launch-worker.mjs +41 -42
  116. package/dist/src/platform/windows/project-locations.mjs +16 -0
  117. package/dist/src/platform/windows/resident-start.js +20 -0
  118. package/dist/src/platform/windows/resident-startup.ps1 +27 -11
  119. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  120. package/dist/src/platform/windows/service-host.mjs +17 -22
  121. package/dist/src/platform/windows/start-hidden-console.ps1 +11 -2
  122. package/dist/src/platform/windows/user-environment.mjs +56 -50
  123. package/dist/src/platform/windows/user-environment.ps1 +4 -3
  124. package/dist/src/project-create.mjs +121 -0
  125. package/dist/src/project-management.mjs +59 -0
  126. package/dist/src/project-remove.mjs +55 -0
  127. package/dist/src/project-update.mjs +59 -0
  128. package/dist/src/relay-config-import.mjs +45 -0
  129. package/dist/src/remote-control.mjs +51 -0
  130. package/dist/src/runtime-discovery.mjs +65 -41
  131. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  132. package/dist/src/self-relay/account-connections.mjs +63 -0
  133. package/dist/src/self-relay/admin-auth.mjs +59 -0
  134. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  135. package/dist/src/self-relay/admin-page.mjs +87 -71
  136. package/dist/src/self-relay/admin-server.mjs +68 -24
  137. package/dist/src/self-relay/admin-state.mjs +11 -6
  138. package/dist/src/self-relay/admin-style.mjs +58 -0
  139. package/dist/src/self-relay/admin-workstations-page.mjs +95 -0
  140. package/dist/src/self-relay/admin-workstations.mjs +145 -0
  141. package/dist/src/self-relay/android-releases.mjs +61 -0
  142. package/dist/src/self-relay/client.mjs +45 -45
  143. package/dist/src/self-relay/connection-reporting.mjs +38 -0
  144. package/dist/src/self-relay/connector.mjs +456 -145
  145. package/dist/src/self-relay/demo.mjs +1 -1
  146. package/dist/src/self-relay/device-info.mjs +27 -0
  147. package/dist/src/self-relay/device-store.mjs +10 -2
  148. package/dist/src/self-relay/diagnostics.mjs +54 -0
  149. package/dist/src/self-relay/email-accounts.mjs +195 -0
  150. package/dist/src/self-relay/file-wire.mjs +76 -0
  151. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  152. package/dist/src/self-relay/lifecycle.mjs +252 -259
  153. package/dist/src/self-relay/long-pairing.mjs +40 -0
  154. package/dist/src/self-relay/mysql-state.mjs +118 -0
  155. package/dist/src/self-relay/p2p-probe.mjs +168 -123
  156. package/dist/src/self-relay/phone-connections.mjs +55 -0
  157. package/dist/src/self-relay/privacy-page.mjs +26 -0
  158. package/dist/src/self-relay/public-releases.mjs +67 -0
  159. package/dist/src/self-relay/rtc-file-bridge.mjs +46 -0
  160. package/dist/src/self-relay/server.mjs +1078 -441
  161. package/dist/src/self-relay/usage-daily.mjs +55 -0
  162. package/dist/src/self-relay/usage-meter.mjs +141 -0
  163. package/dist/src/server.mjs +1442 -716
  164. package/dist/src/service-control.mjs +17 -7
  165. package/dist/src/service-doctor.mjs +150 -51
  166. package/dist/src/service-health.mjs +2 -2
  167. package/dist/src/service-install.mjs +16 -10
  168. package/dist/src/service-lifecycle.mjs +52 -42
  169. package/dist/src/service-power.mjs +58 -0
  170. package/dist/src/service-restart.mjs +45 -12
  171. package/dist/src/service-update-worker.mjs +42 -0
  172. package/dist/src/service-update.mjs +80 -0
  173. package/dist/src/shared-app-server.mjs +511 -307
  174. package/dist/src/shared-catalog.mjs +132 -50
  175. package/dist/src/shared-recovery.mjs +21 -13
  176. package/dist/src/shared-thread-stream.mjs +143 -51
  177. package/dist/src/skill-install.mjs +0 -13
  178. package/dist/src/thread-goals.mjs +40 -0
  179. package/dist/src/turn-model-history.mjs +47 -0
  180. package/dist/src/usage-reset.mjs +17 -0
  181. package/dist/src/workstation-downloads.mjs +120 -0
  182. package/package.json +48 -48
  183. package/tools/postinstall.mjs +186 -146
  184. package/dist/src/debug-ui.mjs +0 -131
  185. package/dist/src/platform/windows/credential-store.mjs +0 -27
  186. package/dist/src/platform/windows/credential-store.ps1 +0 -49
  187. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  188. package/dist/web/activity-view.js +0 -283
  189. package/dist/web/approval-ui.js +0 -188
  190. package/dist/web/capabilities.js +0 -50
  191. package/dist/web/chat-transport.js +0 -196
  192. package/dist/web/chat.css +0 -778
  193. package/dist/web/chat.js +0 -3815
  194. package/dist/web/client-platform.js +0 -11
  195. package/dist/web/community.css +0 -82
  196. package/dist/web/community.html +0 -36
  197. package/dist/web/composer-controller.js +0 -97
  198. package/dist/web/conversation-controller.js +0 -99
  199. package/dist/web/disclosure-state-controller.js +0 -95
  200. package/dist/web/draft-controller.js +0 -103
  201. package/dist/web/harmony-platform.js +0 -52
  202. package/dist/web/highlight-powershell.min.js +0 -39
  203. package/dist/web/highlight.min.js +0 -1262
  204. package/dist/web/history-cache.js +0 -240
  205. package/dist/web/history-controller.js +0 -167
  206. package/dist/web/index.html +0 -288
  207. package/dist/web/lan-session.js +0 -122
  208. package/dist/web/link-action-controller.js +0 -212
  209. package/dist/web/message-send-controller.js +0 -177
  210. package/dist/web/message-view.js +0 -98
  211. package/dist/web/p2p-data-channel.js +0 -50
  212. package/dist/web/p2p-diagnostics.js +0 -28
  213. package/dist/web/p2p-probe.js +0 -123
  214. package/dist/web/page-resume.js +0 -28
  215. package/dist/web/pending-message-store.js +0 -108
  216. package/dist/web/queue-controller.js +0 -82
  217. package/dist/web/resources.json +0 -1
  218. package/dist/web/self-relay-session.js +0 -129
  219. package/dist/web/server-requests.js +0 -67
  220. package/dist/web/station-connection-controller.js +0 -75
  221. package/dist/web/task-list-view.js +0 -289
  222. package/dist/web/thread-attention-controller.js +0 -124
  223. package/dist/web/thread-context-controller.js +0 -30
  224. package/dist/web/thread-list-controller.js +0 -61
  225. package/dist/web/thread-list-sync.js +0 -86
  226. package/dist/web/thread-title-controller.js +0 -57
  227. package/dist/web/timeline-formatters.js +0 -249
  228. package/dist/web/timeline-reducer.js +0 -77
  229. package/dist/web/timeline-renderer.js +0 -161
  230. package/dist/web/timeline-scroll-controller.js +0 -50
  231. package/dist/web/timeline-sync.js +0 -67
  232. package/dist/web/usage-controller.js +0 -258
  233. package/dist/web/vendor/README.md +0 -14
  234. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  235. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  236. package/dist/web/vendor/highlight.min.js +0 -1262
  237. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  238. package/node_modules/@img/colour/LICENSE.md +0 -82
  239. package/node_modules/@img/colour/README.md +0 -15
  240. package/node_modules/@img/colour/color.cjs +0 -1596
  241. package/node_modules/@img/colour/index.cjs +0 -1
  242. package/node_modules/@img/colour/index.d.ts +0 -929
  243. package/node_modules/@img/colour/package.json +0 -58
  244. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  245. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  246. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  247. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  248. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  249. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  250. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  251. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  252. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  253. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  254. package/node_modules/ansi-regex/index.d.ts +0 -37
  255. package/node_modules/ansi-regex/index.js +0 -10
  256. package/node_modules/ansi-regex/license +0 -9
  257. package/node_modules/ansi-regex/package.json +0 -55
  258. package/node_modules/ansi-regex/readme.md +0 -78
  259. package/node_modules/ansi-styles/index.d.ts +0 -345
  260. package/node_modules/ansi-styles/index.js +0 -163
  261. package/node_modules/ansi-styles/license +0 -9
  262. package/node_modules/ansi-styles/package.json +0 -56
  263. package/node_modules/ansi-styles/readme.md +0 -152
  264. package/node_modules/camelcase/index.d.ts +0 -63
  265. package/node_modules/camelcase/index.js +0 -76
  266. package/node_modules/camelcase/license +0 -9
  267. package/node_modules/camelcase/package.json +0 -43
  268. package/node_modules/camelcase/readme.md +0 -99
  269. package/node_modules/cliui/CHANGELOG.md +0 -76
  270. package/node_modules/cliui/LICENSE.txt +0 -14
  271. package/node_modules/cliui/README.md +0 -115
  272. package/node_modules/cliui/index.js +0 -354
  273. package/node_modules/cliui/package.json +0 -65
  274. package/node_modules/color-convert/CHANGELOG.md +0 -54
  275. package/node_modules/color-convert/LICENSE +0 -21
  276. package/node_modules/color-convert/README.md +0 -68
  277. package/node_modules/color-convert/conversions.js +0 -839
  278. package/node_modules/color-convert/index.js +0 -81
  279. package/node_modules/color-convert/package.json +0 -48
  280. package/node_modules/color-convert/route.js +0 -97
  281. package/node_modules/color-name/LICENSE +0 -8
  282. package/node_modules/color-name/README.md +0 -11
  283. package/node_modules/color-name/index.js +0 -152
  284. package/node_modules/color-name/package.json +0 -28
  285. package/node_modules/decamelize/index.js +0 -13
  286. package/node_modules/decamelize/license +0 -21
  287. package/node_modules/decamelize/package.json +0 -38
  288. package/node_modules/decamelize/readme.md +0 -48
  289. package/node_modules/detect-libc/LICENSE +0 -201
  290. package/node_modules/detect-libc/README.md +0 -163
  291. package/node_modules/detect-libc/index.d.ts +0 -14
  292. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  293. package/node_modules/detect-libc/lib/elf.js +0 -39
  294. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  295. package/node_modules/detect-libc/lib/process.js +0 -24
  296. package/node_modules/detect-libc/package.json +0 -44
  297. package/node_modules/dijkstrajs/.travis.yml +0 -4
  298. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  299. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  300. package/node_modules/dijkstrajs/README.md +0 -18
  301. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  302. package/node_modules/dijkstrajs/package.json +0 -60
  303. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  304. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  305. package/node_modules/emoji-regex/README.md +0 -73
  306. package/node_modules/emoji-regex/es2015/index.js +0 -6
  307. package/node_modules/emoji-regex/es2015/text.js +0 -6
  308. package/node_modules/emoji-regex/index.d.ts +0 -23
  309. package/node_modules/emoji-regex/index.js +0 -6
  310. package/node_modules/emoji-regex/package.json +0 -50
  311. package/node_modules/emoji-regex/text.js +0 -6
  312. package/node_modules/find-up/index.d.ts +0 -137
  313. package/node_modules/find-up/index.js +0 -89
  314. package/node_modules/find-up/license +0 -9
  315. package/node_modules/find-up/package.json +0 -53
  316. package/node_modules/find-up/readme.md +0 -156
  317. package/node_modules/get-caller-file/LICENSE.md +0 -6
  318. package/node_modules/get-caller-file/README.md +0 -41
  319. package/node_modules/get-caller-file/index.d.ts +0 -2
  320. package/node_modules/get-caller-file/index.js +0 -22
  321. package/node_modules/get-caller-file/index.js.map +0 -1
  322. package/node_modules/get-caller-file/package.json +0 -42
  323. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  324. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  325. package/node_modules/is-fullwidth-code-point/license +0 -9
  326. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  327. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  328. package/node_modules/locate-path/index.d.ts +0 -83
  329. package/node_modules/locate-path/index.js +0 -65
  330. package/node_modules/locate-path/license +0 -9
  331. package/node_modules/locate-path/package.json +0 -45
  332. package/node_modules/locate-path/readme.md +0 -122
  333. package/node_modules/node-datachannel/.clang-format +0 -17
  334. package/node_modules/node-datachannel/.editorconfig +0 -12
  335. package/node_modules/node-datachannel/.eslintignore +0 -8
  336. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  337. package/node_modules/node-datachannel/.gitmodules +0 -3
  338. package/node_modules/node-datachannel/.prettierignore +0 -7
  339. package/node_modules/node-datachannel/.prettierrc +0 -13
  340. package/node_modules/node-datachannel/API.md +0 -247
  341. package/node_modules/node-datachannel/BULDING.md +0 -26
  342. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  343. package/node_modules/node-datachannel/LICENSE +0 -373
  344. package/node_modules/node-datachannel/README.md +0 -129
  345. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  346. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  347. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  348. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  349. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  350. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  352. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  354. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  356. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  378. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  380. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  382. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  384. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  386. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  388. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  390. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  392. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  394. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  396. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  411. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  412. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  413. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  414. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  415. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  416. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  417. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  418. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  419. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  420. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  421. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  422. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  426. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  428. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  429. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  430. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  431. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  432. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  433. package/node_modules/node-datachannel/jest.config.ts +0 -14
  434. package/node_modules/node-datachannel/package.json +0 -133
  435. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  436. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  437. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  438. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  439. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  440. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  441. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  442. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  443. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  444. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  445. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  446. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  447. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  448. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  449. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  450. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  451. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  452. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  453. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  454. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  455. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  456. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  457. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  458. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  459. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  460. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  461. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  462. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  463. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  464. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  465. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  466. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  467. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  468. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  469. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  470. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  471. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  472. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  473. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  474. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  475. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  476. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  477. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  478. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  479. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  480. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  481. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  482. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  483. package/node_modules/node-datachannel/src/index.ts +0 -9
  484. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  485. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  486. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  487. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  488. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  489. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  490. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  491. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  492. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  493. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  494. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  495. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  496. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  497. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  498. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  499. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  500. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  501. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  502. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  503. package/node_modules/node-datachannel/tsconfig.json +0 -21
  504. package/node_modules/p-limit/index.d.ts +0 -38
  505. package/node_modules/p-limit/index.js +0 -57
  506. package/node_modules/p-limit/license +0 -9
  507. package/node_modules/p-limit/package.json +0 -52
  508. package/node_modules/p-limit/readme.md +0 -101
  509. package/node_modules/p-locate/index.d.ts +0 -64
  510. package/node_modules/p-locate/index.js +0 -52
  511. package/node_modules/p-locate/license +0 -9
  512. package/node_modules/p-locate/package.json +0 -53
  513. package/node_modules/p-locate/readme.md +0 -90
  514. package/node_modules/p-try/index.d.ts +0 -39
  515. package/node_modules/p-try/index.js +0 -9
  516. package/node_modules/p-try/license +0 -9
  517. package/node_modules/p-try/package.json +0 -42
  518. package/node_modules/p-try/readme.md +0 -58
  519. package/node_modules/path-exists/index.d.ts +0 -28
  520. package/node_modules/path-exists/index.js +0 -23
  521. package/node_modules/path-exists/license +0 -9
  522. package/node_modules/path-exists/package.json +0 -39
  523. package/node_modules/path-exists/readme.md +0 -52
  524. package/node_modules/pngjs/.eslintignore +0 -2
  525. package/node_modules/pngjs/.eslintrc.json +0 -19
  526. package/node_modules/pngjs/.prettierignore +0 -3
  527. package/node_modules/pngjs/LICENSE +0 -20
  528. package/node_modules/pngjs/README.md +0 -429
  529. package/node_modules/pngjs/browser.js +0 -16096
  530. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  531. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  532. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  533. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  534. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  535. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  536. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  537. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  538. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  539. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  540. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  541. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  542. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  543. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  544. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  545. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  546. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  547. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  548. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  549. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  550. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  551. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  552. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  553. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  554. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  555. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  556. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  557. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  558. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  559. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  560. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  561. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  562. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  563. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  564. package/node_modules/pngjs/lib/constants.js +0 -32
  565. package/node_modules/pngjs/lib/crc.js +0 -40
  566. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  567. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  568. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  569. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  570. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  571. package/node_modules/pngjs/lib/interlace.js +0 -95
  572. package/node_modules/pngjs/lib/packer-async.js +0 -50
  573. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  574. package/node_modules/pngjs/lib/packer.js +0 -129
  575. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  576. package/node_modules/pngjs/lib/parser-async.js +0 -165
  577. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  578. package/node_modules/pngjs/lib/parser.js +0 -290
  579. package/node_modules/pngjs/lib/png-sync.js +0 -12
  580. package/node_modules/pngjs/lib/png.js +0 -194
  581. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  582. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  583. package/node_modules/pngjs/package.json +0 -73
  584. package/node_modules/qrcode/README.md +0 -770
  585. package/node_modules/qrcode/bin/qrcode +0 -159
  586. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  587. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  588. package/node_modules/qrcode/lib/browser.js +0 -76
  589. package/node_modules/qrcode/lib/can-promise.js +0 -7
  590. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  591. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  592. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  593. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  594. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  595. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  596. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  597. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  598. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  599. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  600. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  601. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  602. package/node_modules/qrcode/lib/core/mode.js +0 -167
  603. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  604. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  605. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  606. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  607. package/node_modules/qrcode/lib/core/regex.js +0 -31
  608. package/node_modules/qrcode/lib/core/segments.js +0 -330
  609. package/node_modules/qrcode/lib/core/utils.js +0 -63
  610. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  611. package/node_modules/qrcode/lib/core/version.js +0 -163
  612. package/node_modules/qrcode/lib/index.js +0 -12
  613. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  614. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  615. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  616. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  617. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  618. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  619. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  620. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  621. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  622. package/node_modules/qrcode/lib/server.js +0 -138
  623. package/node_modules/qrcode/license +0 -10
  624. package/node_modules/qrcode/package.json +0 -77
  625. package/node_modules/require-directory/.jshintrc +0 -67
  626. package/node_modules/require-directory/.npmignore +0 -1
  627. package/node_modules/require-directory/.travis.yml +0 -3
  628. package/node_modules/require-directory/LICENSE +0 -22
  629. package/node_modules/require-directory/README.markdown +0 -184
  630. package/node_modules/require-directory/index.js +0 -86
  631. package/node_modules/require-directory/package.json +0 -40
  632. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  633. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  634. package/node_modules/require-main-filename/README.md +0 -26
  635. package/node_modules/require-main-filename/index.js +0 -18
  636. package/node_modules/require-main-filename/package.json +0 -35
  637. package/node_modules/semver/LICENSE +0 -15
  638. package/node_modules/semver/README.md +0 -680
  639. package/node_modules/semver/bin/semver.js +0 -195
  640. package/node_modules/semver/classes/comparator.js +0 -143
  641. package/node_modules/semver/classes/index.js +0 -7
  642. package/node_modules/semver/classes/range.js +0 -577
  643. package/node_modules/semver/classes/semver.js +0 -350
  644. package/node_modules/semver/functions/clean.js +0 -8
  645. package/node_modules/semver/functions/cmp.js +0 -54
  646. package/node_modules/semver/functions/coerce.js +0 -62
  647. package/node_modules/semver/functions/compare-build.js +0 -9
  648. package/node_modules/semver/functions/compare-loose.js +0 -5
  649. package/node_modules/semver/functions/compare.js +0 -7
  650. package/node_modules/semver/functions/diff.js +0 -60
  651. package/node_modules/semver/functions/eq.js +0 -5
  652. package/node_modules/semver/functions/gt.js +0 -5
  653. package/node_modules/semver/functions/gte.js +0 -5
  654. package/node_modules/semver/functions/inc.js +0 -21
  655. package/node_modules/semver/functions/lt.js +0 -5
  656. package/node_modules/semver/functions/lte.js +0 -5
  657. package/node_modules/semver/functions/major.js +0 -5
  658. package/node_modules/semver/functions/minor.js +0 -5
  659. package/node_modules/semver/functions/neq.js +0 -5
  660. package/node_modules/semver/functions/parse.js +0 -18
  661. package/node_modules/semver/functions/patch.js +0 -5
  662. package/node_modules/semver/functions/prerelease.js +0 -8
  663. package/node_modules/semver/functions/rcompare.js +0 -5
  664. package/node_modules/semver/functions/rsort.js +0 -5
  665. package/node_modules/semver/functions/satisfies.js +0 -12
  666. package/node_modules/semver/functions/sort.js +0 -5
  667. package/node_modules/semver/functions/truncate.js +0 -48
  668. package/node_modules/semver/functions/valid.js +0 -8
  669. package/node_modules/semver/index.js +0 -93
  670. package/node_modules/semver/internal/constants.js +0 -37
  671. package/node_modules/semver/internal/debug.js +0 -11
  672. package/node_modules/semver/internal/identifiers.js +0 -29
  673. package/node_modules/semver/internal/lrucache.js +0 -42
  674. package/node_modules/semver/internal/parse-options.js +0 -17
  675. package/node_modules/semver/internal/re.js +0 -223
  676. package/node_modules/semver/package.json +0 -78
  677. package/node_modules/semver/preload.js +0 -4
  678. package/node_modules/semver/range.bnf +0 -17
  679. package/node_modules/semver/ranges/gtr.js +0 -6
  680. package/node_modules/semver/ranges/intersects.js +0 -9
  681. package/node_modules/semver/ranges/ltr.js +0 -6
  682. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  683. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  684. package/node_modules/semver/ranges/min-version.js +0 -63
  685. package/node_modules/semver/ranges/outside.js +0 -82
  686. package/node_modules/semver/ranges/simplify.js +0 -49
  687. package/node_modules/semver/ranges/subset.js +0 -249
  688. package/node_modules/semver/ranges/to-comparators.js +0 -10
  689. package/node_modules/semver/ranges/valid.js +0 -13
  690. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  691. package/node_modules/set-blocking/LICENSE.txt +0 -14
  692. package/node_modules/set-blocking/README.md +0 -31
  693. package/node_modules/set-blocking/index.js +0 -7
  694. package/node_modules/set-blocking/package.json +0 -42
  695. package/node_modules/sharp/LICENSE +0 -191
  696. package/node_modules/sharp/README.md +0 -112
  697. package/node_modules/sharp/dist/channel.cjs +0 -177
  698. package/node_modules/sharp/dist/channel.mjs +0 -177
  699. package/node_modules/sharp/dist/colour.cjs +0 -199
  700. package/node_modules/sharp/dist/colour.mjs +0 -199
  701. package/node_modules/sharp/dist/composite.cjs +0 -213
  702. package/node_modules/sharp/dist/composite.mjs +0 -213
  703. package/node_modules/sharp/dist/constructor.cjs +0 -511
  704. package/node_modules/sharp/dist/constructor.mjs +0 -511
  705. package/node_modules/sharp/dist/index.cjs +0 -25
  706. package/node_modules/sharp/dist/index.d.cts +0 -1999
  707. package/node_modules/sharp/dist/index.d.mts +0 -2046
  708. package/node_modules/sharp/dist/index.mjs +0 -25
  709. package/node_modules/sharp/dist/input.cjs +0 -819
  710. package/node_modules/sharp/dist/input.mjs +0 -819
  711. package/node_modules/sharp/dist/is.cjs +0 -143
  712. package/node_modules/sharp/dist/is.mjs +0 -143
  713. package/node_modules/sharp/dist/libvips.cjs +0 -212
  714. package/node_modules/sharp/dist/libvips.mjs +0 -212
  715. package/node_modules/sharp/dist/operation.cjs +0 -1002
  716. package/node_modules/sharp/dist/operation.mjs +0 -1002
  717. package/node_modules/sharp/dist/output.cjs +0 -1785
  718. package/node_modules/sharp/dist/output.mjs +0 -1785
  719. package/node_modules/sharp/dist/resize.cjs +0 -617
  720. package/node_modules/sharp/dist/resize.mjs +0 -617
  721. package/node_modules/sharp/dist/sharp.cjs +0 -174
  722. package/node_modules/sharp/dist/sharp.mjs +0 -174
  723. package/node_modules/sharp/dist/utility.cjs +0 -301
  724. package/node_modules/sharp/dist/utility.mjs +0 -301
  725. package/node_modules/sharp/install/build.js +0 -38
  726. package/node_modules/sharp/lib/index.d.ts +0 -1999
  727. package/node_modules/sharp/package.json +0 -227
  728. package/node_modules/sharp/src/binding.gyp +0 -303
  729. package/node_modules/sharp/src/common.cc +0 -1186
  730. package/node_modules/sharp/src/common.h +0 -421
  731. package/node_modules/sharp/src/metadata.cc +0 -404
  732. package/node_modules/sharp/src/metadata.h +0 -95
  733. package/node_modules/sharp/src/operations.cc +0 -516
  734. package/node_modules/sharp/src/operations.h +0 -137
  735. package/node_modules/sharp/src/pipeline.cc +0 -1948
  736. package/node_modules/sharp/src/pipeline.h +0 -422
  737. package/node_modules/sharp/src/sharp.cc +0 -43
  738. package/node_modules/sharp/src/stats.cc +0 -186
  739. package/node_modules/sharp/src/stats.h +0 -62
  740. package/node_modules/sharp/src/utilities.cc +0 -289
  741. package/node_modules/sharp/src/utilities.h +0 -22
  742. package/node_modules/string-width/index.d.ts +0 -29
  743. package/node_modules/string-width/index.js +0 -47
  744. package/node_modules/string-width/license +0 -9
  745. package/node_modules/string-width/package.json +0 -56
  746. package/node_modules/string-width/readme.md +0 -50
  747. package/node_modules/strip-ansi/index.d.ts +0 -17
  748. package/node_modules/strip-ansi/index.js +0 -4
  749. package/node_modules/strip-ansi/license +0 -9
  750. package/node_modules/strip-ansi/package.json +0 -54
  751. package/node_modules/strip-ansi/readme.md +0 -46
  752. package/node_modules/which-module/LICENSE +0 -13
  753. package/node_modules/which-module/README.md +0 -58
  754. package/node_modules/which-module/index.js +0 -9
  755. package/node_modules/which-module/package.json +0 -41
  756. package/node_modules/wrap-ansi/index.js +0 -186
  757. package/node_modules/wrap-ansi/license +0 -9
  758. package/node_modules/wrap-ansi/package.json +0 -61
  759. package/node_modules/wrap-ansi/readme.md +0 -97
  760. package/node_modules/ws/LICENSE +0 -20
  761. package/node_modules/ws/README.md +0 -548
  762. package/node_modules/ws/browser.js +0 -8
  763. package/node_modules/ws/index.js +0 -22
  764. package/node_modules/ws/lib/buffer-util.js +0 -131
  765. package/node_modules/ws/lib/constants.js +0 -19
  766. package/node_modules/ws/lib/event-target.js +0 -292
  767. package/node_modules/ws/lib/extension.js +0 -203
  768. package/node_modules/ws/lib/limiter.js +0 -55
  769. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  770. package/node_modules/ws/lib/receiver.js +0 -743
  771. package/node_modules/ws/lib/sender.js +0 -607
  772. package/node_modules/ws/lib/stream.js +0 -161
  773. package/node_modules/ws/lib/subprotocol.js +0 -62
  774. package/node_modules/ws/lib/validation.js +0 -152
  775. package/node_modules/ws/lib/websocket-server.js +0 -562
  776. package/node_modules/ws/lib/websocket.js +0 -1407
  777. package/node_modules/ws/package.json +0 -74
  778. package/node_modules/ws/wrapper.mjs +0 -21
  779. package/node_modules/y18n/CHANGELOG.md +0 -35
  780. package/node_modules/y18n/LICENSE +0 -13
  781. package/node_modules/y18n/README.md +0 -109
  782. package/node_modules/y18n/index.js +0 -188
  783. package/node_modules/y18n/package.json +0 -39
  784. package/node_modules/yargs/CHANGELOG.md +0 -420
  785. package/node_modules/yargs/LICENSE +0 -21
  786. package/node_modules/yargs/README.md +0 -140
  787. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  788. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  789. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  790. package/node_modules/yargs/build/lib/argsert.js +0 -65
  791. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  792. package/node_modules/yargs/build/lib/command.js +0 -416
  793. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  794. package/node_modules/yargs/build/lib/common-types.js +0 -25
  795. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  796. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  797. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  798. package/node_modules/yargs/build/lib/completion.js +0 -135
  799. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  800. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  801. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  802. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  803. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  804. package/node_modules/yargs/build/lib/middleware.js +0 -57
  805. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  806. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  807. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  808. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  809. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  810. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  811. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  812. package/node_modules/yargs/build/lib/usage.js +0 -540
  813. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  814. package/node_modules/yargs/build/lib/validation.js +0 -330
  815. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  816. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  817. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  818. package/node_modules/yargs/build/lib/yerror.js +0 -11
  819. package/node_modules/yargs/index.js +0 -40
  820. package/node_modules/yargs/locales/be.json +0 -46
  821. package/node_modules/yargs/locales/de.json +0 -46
  822. package/node_modules/yargs/locales/en.json +0 -51
  823. package/node_modules/yargs/locales/es.json +0 -46
  824. package/node_modules/yargs/locales/fi.json +0 -49
  825. package/node_modules/yargs/locales/fr.json +0 -53
  826. package/node_modules/yargs/locales/hi.json +0 -49
  827. package/node_modules/yargs/locales/hu.json +0 -46
  828. package/node_modules/yargs/locales/id.json +0 -50
  829. package/node_modules/yargs/locales/it.json +0 -46
  830. package/node_modules/yargs/locales/ja.json +0 -51
  831. package/node_modules/yargs/locales/ko.json +0 -49
  832. package/node_modules/yargs/locales/nb.json +0 -44
  833. package/node_modules/yargs/locales/nl.json +0 -49
  834. package/node_modules/yargs/locales/nn.json +0 -44
  835. package/node_modules/yargs/locales/pirate.json +0 -13
  836. package/node_modules/yargs/locales/pl.json +0 -49
  837. package/node_modules/yargs/locales/pt.json +0 -45
  838. package/node_modules/yargs/locales/pt_BR.json +0 -48
  839. package/node_modules/yargs/locales/ru.json +0 -46
  840. package/node_modules/yargs/locales/th.json +0 -46
  841. package/node_modules/yargs/locales/tr.json +0 -48
  842. package/node_modules/yargs/locales/zh_CN.json +0 -48
  843. package/node_modules/yargs/locales/zh_TW.json +0 -47
  844. package/node_modules/yargs/package.json +0 -92
  845. package/node_modules/yargs/yargs.js +0 -14
  846. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  847. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  848. package/node_modules/yargs-parser/README.md +0 -449
  849. package/node_modules/yargs-parser/index.js +0 -1032
  850. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  851. package/node_modules/yargs-parser/package.json +0 -46
@@ -1,27 +1,20 @@
1
- import fs from 'node:fs';
2
1
  import path from 'node:path';
3
- import { execFile } from 'node:child_process';
4
- import { setTimeout as delay } from 'node:timers/promises';
5
- import { startBackground, processAlive } from '../background-process.mjs';
6
- import { promisify } from 'node:util';
7
- import { randomBytes, randomUUID } from 'node:crypto';
8
- import { fileURLToPath } from 'node:url';
9
- import { hostname } from 'node:os';
10
- import QRCode from 'qrcode';
11
- import { credentialStore } from '../platform/windows/credential-store.mjs';
12
- import { readRecord, writeRecord } from '../service-lifecycle.mjs';
13
- import { serviceHealth } from '../service-health.mjs';
14
- import { openControl, controlRequest } from '../service-control.mjs';
15
- import { connectBridgeRelay } from './connector.mjs';
16
- import { validProbeIceServers } from './p2p-probe.mjs';
17
- import { relayAddress, validSecret } from './wire.mjs';
18
- import { saveLanAuthorizations } from './lan-authorizations.mjs';
19
- import { lanNetworks } from '../platform/windows/network-info.mjs';
2
+ import serviceEndpoints from '../../shared/service-endpoints.cjs';
3
+ import { randomBytes, randomUUID } from 'node:crypto';
4
+ import { hostname } from 'node:os';
5
+ import QRCode from 'qrcode';
6
+ import { credentialStore } from '../platform/credential-store.mjs';
7
+ import { readRecord, writeRecord } from '../service-lifecycle.mjs';
8
+ import { serviceHealth } from '../service-health.mjs';
9
+ import { controlRequest } from '../service-control.mjs';
10
+ import { connectBridgeRelay } from './connector.mjs';
11
+ import { validProbeIceServers } from './p2p-probe.mjs';
12
+ import { relayAddress, validSecret } from './wire.mjs';
13
+ import { saveLanAuthorizations, onLanDeviceConnected, pendingLanConnections } from './lan-authorizations.mjs';
14
+ import { lanNetworks } from '../platform/network-info.mjs';
15
+ import { connectionReporting } from './connection-reporting.mjs';
20
16
 
21
- const exec = promisify(execFile);
22
- const script = fileURLToPath(import.meta.url);
23
- const recordPath = root => path.join(root, 'self-relay-session.json');
24
- const officialConfig = { url: 'wss://api.uulife.site/relay' };
17
+ const officialConfig = { url: serviceEndpoints.relayUrl };
25
18
 
26
19
  async function loadConfig(stateRoot) {
27
20
  const configPath = path.join(stateRoot, 'self-relay-config.json');
@@ -31,255 +24,255 @@ async function loadConfig(stateRoot) {
31
24
  if (config.p2pIceServers !== undefined && !validProbeIceServers(config.p2pIceServers)) throw new Error('p2pIceServers 只接受最多 4 个 stun:主机:端口地址');
32
25
  if (config.p2pWindowsRouteHelper !== undefined && typeof config.p2pWindowsRouteHelper !== 'boolean') throw new Error('p2pWindowsRouteHelper 必须是布尔值');
33
26
  if (config.p2pWindowsRouteHelper && !/^[A-Za-z0-9_-]{32,128}$/.test(config.p2pWindowsRouteHelperToken || '')) throw new Error('p2pWindowsRouteHelperToken 无效');
34
- const url = process.env.RELAY_URL || config.url;
35
- if (!url) throw new Error('请先配置 self-relay-config.json 的 url 和 hostKeyFile(或 sshHost、sshKeyPath),详见自建中继文档。');
36
- relayAddress(url);
37
- const resolved = relayAddress(url);
38
- const pairingUrl = config.pairingUrl || `${resolved.startsWith('wss:') ? 'https:' : 'http:'}//${new URL(resolved).host}/pair`;
39
- const pairing = new URL(pairingUrl);
40
- if (!['https:', 'http:'].includes(pairing.protocol) || pairing.pathname !== '/pair' || pairing.search || pairing.hash || pairing.username || pairing.password ||
41
- (pairing.protocol === 'http:' && pairing.hostname !== '127.0.0.1')) throw new Error('self-relay-config.json 的 pairingUrl 必须是 HTTPS /pair 地址。');
27
+ const url = process.env.RELAY_URL || serviceEndpoints.resolveRelayUrl(config.url);
28
+ if (!url) throw new Error('请先配置 self-relay-config.json 的 url,详见自建中继文档。');
29
+ relayAddress(url);
30
+ const resolved = relayAddress(url);
31
+ const pairingUrl = config.pairingUrl || (resolved === serviceEndpoints.relayUrl ? serviceEndpoints.pairingUrl : `${resolved.startsWith('wss:') ? 'https:' : 'http:'}//${new URL(resolved).host}/pair`);
32
+ const pairing = new URL(pairingUrl);
33
+ if (!['https:', 'http:'].includes(pairing.protocol) || pairing.pathname !== '/pair' || pairing.search || pairing.hash || pairing.username || pairing.password ||
34
+ (pairing.protocol === 'http:' && pairing.hostname !== '127.0.0.1')) throw new Error('self-relay-config.json 的 pairingUrl 必须是 HTTPS /pair 地址。');
42
35
  return { ...config, url: resolved, pairingUrl: pairing.href };
43
36
  }
44
- async function registrationKey(config) {
45
- if (config.url === officialConfig.url) return undefined;
46
- const hostKeyFile = process.env.RELAY_HOST_KEY_FILE || config.hostKeyFile;
47
- let hostKey;
48
- if (hostKeyFile) hostKey = fs.readFileSync(hostKeyFile, 'utf8').trim();
49
- else {
50
- if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(config.sshHost || '') ||
51
- !/^\/[a-zA-Z0-9/_.-]+$/.test(config.sshKeyPath || '')) throw new Error('中继注册凭据配置不完整或无效。');
52
- try {
53
- const result = await exec('ssh', ['-o', 'BatchMode=yes', '-o', 'ConnectTimeout=10', config.sshHost,
54
- `sudo -n cat ${config.sshKeyPath}`], { encoding: 'utf8', timeout: 15000, windowsHide: true });
55
- hostKey = result.stdout.trim();
56
- } catch { throw new Error('无法通过已配置 SSH 读取中继注册凭据。'); }
37
+ export async function selfRelay(command, stateRoot, details) {
38
+ const session = readRecord(path.join(stateRoot, 'bridge-session.json'));
39
+ if (!session) {
40
+ if (command === 'relay-status') return { running: false, displayText: '桌面服务未运行。' };
41
+ if (command === 'relay-stop') return { stopped: true, displayText: '中继连接已停止。' };
42
+ throw new Error('桌面服务尚未运行,请先执行 relax start。');
57
43
  }
58
- if (!validSecret(hostKey)) throw new Error('中继注册凭据格式无效。');
59
- return hostKey;
44
+ return controlRequest(session, 'POST', command, details);
60
45
  }
61
- export async function selfRelay(command, stateRoot, requiredMode = '') {
62
- const previous = readRecord(recordPath(stateRoot));
63
- let current;
64
- if (previous) {
65
- try { current = await controlRequest(previous); }
66
- catch (error) { if (error.code !== 'ECONNREFUSED') throw error; }
67
- }
68
- if (command === 'relay-status' && current) return controlRequest(previous, 'POST', 'inspect');
69
- if (command === 'relay-status') return current || { running: false, displayText: '私有中继连接器未运行。' };
70
- if (command === 'relay-stop') {
71
- if (current) await controlRequest(previous, 'POST');
72
- const deadline = Date.now() + 10000;
73
- while (current && processAlive(previous.pid)) {
74
- if (Date.now() >= deadline) throw new Error('私有中继未在 10 秒内退出,未继续恢复服务。');
75
- await delay(100);
76
- }
77
- return { stopped: true, displayText: '私有中继连接器已停止;Bridge 和 Codex 保持运行。' };
78
- }
79
- if (current) {
80
- if (requiredMode) {
81
- const bridge = await serviceHealth(readRecord(path.join(stateRoot, 'bridge-session.json')));
82
- if (bridge?.transportMode !== requiredMode) throw new Error('Codex 内核未就绪;请先执行 shared-start。');
83
- }
84
- if (command === 'relay-revoke') return controlRequest(previous, 'POST', 'revoke');
85
- if (command === 'relay-pair' || (current.relayConnected && !current.paired && !current.qrPath)) return controlRequest(previous, 'POST', 'pair');
86
- if (command === 'relay-start' && current.relayConnected) return controlRequest(previous, 'POST', 'refresh-lan');
87
- return current;
88
- }
89
- if (command === 'relay-revoke') throw new Error('请先启动连接器,再撤销手机授权。');
90
- fs.mkdirSync(stateRoot, { recursive: true });
91
- const instanceId = randomUUID();
92
- const log = path.join(stateRoot, 'self-relay.log');
93
- const readyPath = path.join(stateRoot, `relay-ready-${instanceId}.json`);
94
- const pid = await startBackground(process.execPath, [script, '--worker', stateRoot, instanceId,
95
- command === 'relay-pair' ? 'pair' : '', requiredMode], process.env, [log, log]);
96
- try {
97
- const deadline = Date.now() + 25000;
98
- while (true) {
99
- const result = readRecord(readyPath);
100
- if (result) {
101
- if (result.pid !== pid || result.instanceId !== instanceId) throw new Error('私有中继启动实例不匹配。');
102
- if (result.error) throw new Error(result.error);
103
- return result.status;
104
- }
105
- if (!processAlive(pid)) throw new Error('私有中继启动失败,请查看 self-relay.log。');
106
- if (Date.now() >= deadline) throw new Error('私有中继启动超时。');
107
- await delay(100);
108
- }
109
- } catch (error) { if (processAlive(pid)) process.kill(pid); throw error; }
110
- finally { fs.rmSync(readyPath, { force: true }); }
111
- }
112
-
113
- async function worker(stateRoot, instanceId, refresh = false, requiredMode = '') {
114
- const config = await loadConfig(stateRoot);
115
- const session = () => readRecord(path.join(stateRoot, 'bridge-session.json'));
116
- let health = await serviceHealth(session());
117
- if (health?.status !== 'ok') throw new Error('Bridge 尚未运行,请先执行 relax start --json。');
118
- if (requiredMode && health.transportMode !== requiredMode) throw new Error('Codex 内核未就绪,请先执行 relax shared-start --json。');
119
- const legacyPath = path.join(stateRoot, 'self-relay-device.json');
120
- const legacy = readRecord(legacyPath);
121
- const stored = await credentialStore('load');
122
- let identities = stored.record || legacy || { version: 1, servers: {} };
123
- const validate = value => {
124
- if (value?.version !== 1 || !value.servers || typeof value.servers !== 'object' || Array.isArray(value.servers)) throw new Error('本机设备身份损坏,未自动覆盖');
125
- for (const [url, item] of Object.entries(value.servers)) {
126
- relayAddress(url);
127
- if (!validSecret(item.secret) || !/^[\w-]{16,128}$/.test(item.id)) throw new Error('本机设备身份损坏,未自动覆盖');
128
- }
129
- };
130
- validate(identities);
131
- if (legacy) {
132
- validate(legacy);
133
- if (stored.record && JSON.stringify(stored.record) !== JSON.stringify(legacy)) throw new Error('新旧设备身份冲突,未覆盖任何凭据');
134
- if (!stored.record) {
135
- const verified = await credentialStore('save', identities);
136
- if (JSON.stringify(verified.record) !== JSON.stringify(identities)) throw new Error('凭据迁移校验失败');
137
- }
138
- fs.rmSync(legacyPath);
139
- }
140
- let identity = identities.servers[config.url];
46
+
47
+ async function createRelayRuntime(stateRoot) {
48
+ const config = await loadConfig(stateRoot);
49
+ const configPath = path.join(stateRoot, 'self-relay-config.json');
50
+ const session = () => readRecord(path.join(stateRoot, 'bridge-session.json'));
51
+ let health = await serviceHealth(session());
52
+ if (health?.status !== 'ok') throw new Error('桌面服务尚未运行,请先执行 relax start --json。');
53
+ const stored = await credentialStore('load', undefined, stateRoot);
54
+ const identities = stored.record || { version: 2, devices: {} };
55
+ const validIdentity = (id, item) => /^[\w-]{16,128}$/.test(id) && item?.id === id &&
56
+ validSecret(item.secret) && typeof item.registered === 'boolean';
57
+ if (identities.version !== 2 || !identities.devices || typeof identities.devices !== 'object' || Array.isArray(identities.devices) ||
58
+ Object.entries(identities.devices).some(([id, item]) => !validIdentity(id, item))) throw new Error('本机设备身份损坏,未自动覆盖');
59
+ if (!stored.record && config.deviceId && config.deviceId !== 'new') {
60
+ throw new Error('缺少已配对工作站的身份配置,请先完成原配对转存;未自动更换工作站身份。');
61
+ }
62
+ if (!config.deviceId) {
63
+ const known = Object.values(identities.devices);
64
+ if (known.length > 1) throw new Error('存在多个工作站身份,请在 self-relay-config.json 中指定 deviceId。');
65
+ config.deviceId = known[0]?.id || randomUUID();
66
+ }
67
+ const createIdentity = config.deviceId === 'new';
68
+ if (createIdentity) config.deviceId = randomUUID();
69
+ if (!/^[\w-]{16,128}$/.test(config.deviceId)) throw new Error('self-relay-config.json 的 deviceId 无效。');
70
+ let identity = identities.devices[config.deviceId];
141
71
  if (!identity) {
142
- identity = { id: randomUUID(), secret: randomBytes(32).toString('base64url'), registered: false };
143
- identities.servers[config.url] = identity; await credentialStore('save', identities);
72
+ if (!createIdentity && Object.keys(identities.devices).length) throw new Error('找不到配置指定的工作站身份,未自动创建新身份。');
73
+ identity = { id: config.deviceId, secret: randomBytes(32).toString('base64url'), registered: false };
74
+ identities.devices[identity.id] = identity;
75
+ await credentialStore('save', identities, stateRoot);
144
76
  }
145
- const hostKey = identity.registered ? undefined : await registrationKey(config);
77
+ const persistedConfig = readRecord(configPath) || {};
78
+ if (persistedConfig.deviceId !== identity.id) writeRecord(configPath, { ...persistedConfig, deviceId: identity.id });
146
79
  let bridgeError = '';
147
- async function refreshHealth() {
80
+ async function refreshHealth() {
148
81
  try { health = await serviceHealth(session()) || { transportMode: health.transportMode, status: 'offline' }; bridgeError = ''; }
149
82
  catch (error) { bridgeError = error.message; health = { transportMode: health.transportMode, status: 'offline' }; }
150
- }
151
- const secret = randomBytes(32).toString('base64url');
152
- let connector, control, qrPath, expiresAt = 0, paired = false, clientCount = 0, attachedCount = 0;
153
- let closing = false, online = false, connecting = false, retryTimer, attempts = 0, lastError = '';
154
- const audit = (event, details = {}) => console.log(JSON.stringify({ time: new Date().toISOString(), event, ...details }));
155
- async function currentLanCandidates() {
156
- try {
157
- const bridge = session(), port = bridge?.port || 45831;
158
- return (await lanNetworks()).map(network => ({ ...network, address: `http://${network.address}:${port}` }));
159
- } catch (error) {
160
- audit('lan-candidates-unavailable', { message: error.message }); return [];
161
- }
162
- }
163
- const status = () => {
164
- const available = online && !paired && qrPath && Date.now() < expiresAt;
165
- const next = !online ? (lastError || '电脑连接器正在恢复中继连接,已保存授权。')
166
- : paired ? '设备已授权,手机可直接重连;网络断开不需要重新扫码。'
167
- : available ? '用要添加的移动设备在有效期内扫描统一配对二维码。连接器在后台运行。'
83
+ }
84
+ let connector, qrPath, expiresAt = 0, paired = false, clientCount = 0, attachedCount = 0;
85
+ let closing = false, online = false, connecting = false, retryTimer, attempts = 0, lastError = '';
86
+ const audit = (event, details = {}) => console.log(JSON.stringify({ time: new Date().toISOString(), event, ...details }));
87
+ const stopWatchingDevices = onLanDeviceConnected(stateRoot, info => {
88
+ if (online && !closing) connector.reportDeviceConnection(info);
89
+ });
90
+ const phoneReporting = connectionReporting(stateRoot);
91
+ const stopWatchingPhones = phoneReporting.watch(event => {
92
+ if (!online || closing) return;
93
+ try { connector.reportPhoneConnection(event); }
94
+ catch (error) { audit('phone-report-unavailable', { message: error.message }); }
95
+ });
96
+ async function currentLanCandidates() {
97
+ try {
98
+ const bridge = session(), port = bridge?.port || 45831;
99
+ return (await lanNetworks()).map(network => ({ ...network, address: `http://${network.address}:${port}` }));
100
+ } catch (error) {
101
+ audit('lan-candidates-unavailable', { message: error.message }); return [];
102
+ }
103
+ }
104
+ const status = () => {
105
+ const available = online && !paired && qrPath && Date.now() < expiresAt;
106
+ const next = !online ? (lastError || '电脑连接器正在恢复中继连接,已保存授权。')
107
+ : paired ? '设备已授权,移动端可直接重连;网络断开不需要重新扫码。'
108
+ : available ? '用要添加的移动设备在有效期内扫描统一配对二维码。连接器在后台运行。'
168
109
  : '尚未完成设备授权;调用 relax pair --json 生成配对二维码。';
169
- return { running: !closing, relayConnected: online, mode: 'self-relay', transportMode: health.transportMode,
170
- relayUrl: config.url, deviceId: identity.id, paired, clientCount, authorization: online ? (paired ? 'authorized' : 'unpaired') : 'unverified', phoneConnected: attachedCount > 0,
110
+ return { running: !closing, relayConnected: online, mode: 'self-relay', transportMode: health.transportMode,
111
+ relayUrl: config.url, deviceId: identity.id, paired, clientCount, authorization: online ? (paired ? 'authorized' : 'unpaired') : 'unverified', phoneConnected: attachedCount > 0,
171
112
  bridgeReady: health.status === 'ok' && health.execution?.ready === true && health.sharedAppServerConnected === true, bridgeError,
172
- expiresAt: expiresAt ? new Date(expiresAt).toISOString() : null,
173
- ...(available ? { qrPath } : {}), mobileAccess: 'unverified', lastError,
174
- displayText: `Code Relax 中继 · ${health.transportMode === 'lan-shared' ? 'Codex 内核已就绪' : 'Codex 内核未就绪'}\n${next}\n停止连接器保留授权:relax relay-stop --json。撤销全部移动设备:relax relay-revoke --json。` };
175
- };
176
- async function shutdown() {
177
- if (closing) return;
178
- closing = true; clearTimeout(retryTimer);
179
- connector?.events.removeAllListeners(); connector?.close();
180
- if (readRecord(recordPath(stateRoot))?.instanceId === instanceId) fs.rmSync(recordPath(stateRoot), { force: true });
181
- await control?.close();
182
- }
183
- async function saveInvitation(message) {
184
- if (!message.code) return;
185
- expiresAt = message.expires;
186
- const link = new URL(config.pairingUrl);
187
- link.searchParams.set('invite', message.code);
188
- // Keep previously displayed files intact even when their invitation expires.
189
- qrPath = path.join(stateRoot, `self-relay-qr-${randomUUID()}.png`);
190
- await QRCode.toFile(qrPath, link.href, { width: 640, margin: 3 });
191
- }
192
- function scheduleRetry() {
193
- if (closing || retryTimer) return;
194
- const delay = Math.min(1000 * 2 ** Math.min(attempts++, 5), 30000) * (0.8 + Math.random() * 0.2);
195
- retryTimer = setTimeout(() => { retryTimer = undefined; void connect(); }, delay);
196
- }
197
- async function connect() {
198
- if (closing || connecting) return;
199
- connecting = true;
200
- let retryAfterAttempt = false;
201
- try {
202
- const bridge = session();
203
- await refreshHealth();
204
- const lanCandidates = await currentLanCandidates();
205
- connector?.events.removeAllListeners(); connector?.close();
206
- const current = connector = connectBridgeRelay({ relayUrl: config.url, hostKey: identity.registered ? undefined : hostKey, identity,
207
- bridgeUrl: `ws://127.0.0.1:${bridge?.port || 45831}/api/socket`, bridgeToken: bridge?.accessUrl ? new URL(bridge.accessUrl).searchParams.get('token') : 'unavailable',
208
- bridgeConnection: () => { const latest = session(); return { url: `ws://127.0.0.1:${latest.port}/api/socket`, token: new URL(latest.accessUrl).searchParams.get('token') }; },
113
+ expiresAt: expiresAt ? new Date(expiresAt).toISOString() : null,
114
+ ...(available ? { qrPath } : {}), mobileAccess: 'unverified', lastError,
115
+ displayText: `Code Relax 中继 · ${health.transportMode === 'lan-shared' ? 'Codex 内核已就绪' : 'Codex 内核未就绪'}\n${next}` };
116
+ };
117
+ async function shutdown() {
118
+ if (closing) return;
119
+ closing = true; online = false; attachedCount = 0; clearTimeout(retryTimer);
120
+ stopWatchingDevices();
121
+ stopWatchingPhones();
122
+ connector?.events.removeAllListeners(); connector?.close();
123
+ }
124
+ async function saveInvitation(message) {
125
+ if (!message.code) return;
126
+ expiresAt = message.expires;
127
+ const link = new URL(config.pairingUrl);
128
+ link.searchParams.set('invite', message.code);
129
+ // Keep previously displayed files intact even when their invitation expires.
130
+ qrPath = path.join(stateRoot, `self-relay-qr-${randomUUID()}.png`);
131
+ await QRCode.toFile(qrPath, link.href, { width: 640, margin: 3 });
132
+ }
133
+ function scheduleRetry() {
134
+ if (closing || retryTimer) return;
135
+ const delay = Math.min(1000 * 2 ** Math.min(attempts++, 5), 30000) * (0.8 + Math.random() * 0.2);
136
+ retryTimer = setTimeout(() => { retryTimer = undefined; void connect(); }, delay);
137
+ }
138
+ async function connect() {
139
+ if (closing || connecting) return;
140
+ connecting = true;
141
+ let retryAfterAttempt = false;
142
+ try {
143
+ const bridge = session();
144
+ await refreshHealth();
145
+ if (closing) return;
146
+ const lanCandidates = await currentLanCandidates();
147
+ if (closing) return;
148
+ connector?.events.removeAllListeners(); connector?.close();
149
+ const current = connector = connectBridgeRelay({ relayUrl: config.url, identity,
150
+ usageCacheFile: path.join(stateRoot, 'relay-usage-tasks.json'),
151
+ bridgeUrl: `ws://127.0.0.1:${bridge?.port || 45831}/api/socket`, bridgeToken: bridge?.accessUrl ? new URL(bridge.accessUrl).searchParams.get('token') : 'unavailable',
152
+ bridgeConnection: () => { const latest = session(); return { url: `ws://127.0.0.1:${latest.port}/api/socket`, token: new URL(latest.accessUrl).searchParams.get('token') }; },
209
153
  hostName: hostname(), lanCandidates, p2pProbe: config.p2pProbe === true, iceServers: config.p2pIceServers || [],
210
154
  p2pWindowsRouteHelper: config.p2pWindowsRouteHelper === true, p2pWindowsRouteHelperToken: config.p2pWindowsRouteHelperToken || '' });
211
- current.events.on('p2p-probe', result => audit('p2p-probe', result));
212
- current.events.on('diagnostic', message => audit('transport-error', { message }));
213
- current.events.on('attached', () => { paired = true; attachedCount++; audit('phone-attached', { attachedCount }); });
214
- current.events.on('detached', () => { attachedCount = Math.max(0, attachedCount - 1); audit('phone-detached', { attachedCount }); });
215
- current.events.on('authorization-changed', update => {
216
- saveLanAuthorizations(stateRoot, identity.id, update.clients, update.revision);
217
- paired = update.clients.length > 0; clientCount = update.clients.length;
218
- audit('mobile-authorizations-updated', { clientCount, revision: update.revision });
219
- });
220
- current.events.once('disconnected', event => {
221
- if (connector !== current || closing) return;
222
- online = false; attachedCount = 0; lastError = `电脑与中继连接断开(${event.code}):${event.reason}`; audit('relay-disconnected', event);
223
- if (![1008, 4401, 4406, 4409, 4429].includes(event.code)) scheduleRetry();
224
- });
225
- const registration = await current.ready;
155
+ current.events.on('p2p-probe', result => audit('p2p-probe', result));
156
+ current.events.on('diagnostic', message => audit('transport-error', { message }));
157
+ current.events.on('phone-connection-ack', id => phoneReporting.acknowledge(id));
158
+ current.events.on('attached', () => { paired = true; attachedCount++; audit('phone-attached', { attachedCount }); });
159
+ current.events.on('detached', () => { attachedCount = Math.max(0, attachedCount - 1); audit('phone-detached', { attachedCount }); });
160
+ current.events.on('authorization-changed', update => {
161
+ saveLanAuthorizations(stateRoot, identity.id, update.clients, update.revision);
162
+ paired = update.clients.length > 0; clientCount = update.clients.length;
163
+ audit('mobile-authorizations-updated', { clientCount, revision: update.revision });
164
+ });
165
+ current.events.once('disconnected', event => {
166
+ if (connector !== current || closing) return;
167
+ online = false; attachedCount = 0; lastError = `电脑与中继连接断开(${event.code}):${event.reason}`; audit('relay-disconnected', event);
168
+ if (![1008, 4401, 4406, 4409, 4429].includes(event.code)) scheduleRetry();
169
+ });
170
+ const registration = await current.ready;
171
+ if (closing) return;
226
172
  if (registration.protocolVersion !== 7 || registration.room !== identity.id) {
227
- current.events.removeAllListeners(); current.close(); throw Object.assign(new Error('中继服务器尚未升级设备授权协议,未使用临时配对降级。'), { code: 4401 });
228
- }
229
- if (!identity.registered) {
230
- const registeredIdentity = { ...identity, registered: true };
231
- identities.servers[config.url] = registeredIdentity;
232
- await credentialStore('save', identities); identity = registeredIdentity;
233
- }
234
- current.assertConnected();
235
- online = true; attempts = 0; paired = registration.paired; clientCount = registration.clientCount || 0; lastError = '';
236
- saveLanAuthorizations(stateRoot, identity.id, registration.clients || [], registration.revision);
237
- await saveInvitation(registration); audit('relay-connected', { paired });
238
- } catch (error) {
239
- online = false; lastError = error.message; audit('connect-failed', { message: error.message });
240
- if (![1008, 4401, 4406, 4409, 4429].includes(error.code)) retryAfterAttempt = true;
241
- else { clearTimeout(retryTimer); retryTimer = undefined; }
242
- } finally { connecting = false; if (retryAfterAttempt) scheduleRetry(); }
243
- }
244
- async function pair() {
245
- if (!online || closing) throw new Error('中继尚未连接,设备授权保持不变。');
246
- await saveInvitation(await connector.command('pair-code'));
247
- // Each invitation adds or refreshes one mobile identity without revoking other devices.
248
- return { ...status(), qrPath, expiresAt: new Date(expiresAt).toISOString(),
249
- displayText: '用要添加的移动设备扫描此码。每台设备只需配对一次;已有设备授权保持不变。' };
250
- }
251
- async function revoke() {
252
- if (!online || closing) throw new Error('中继尚未连接,未撤销授权。');
253
- await connector.command('revoke'); paired = false; clientCount = 0; attachedCount = 0; qrPath = undefined; expiresAt = 0;
173
+ current.events.removeAllListeners(); current.close(); throw Object.assign(new Error('中继服务器尚未升级设备授权协议,未使用临时配对降级。'), { code: 4401 });
174
+ }
175
+ if (!identity.registered) {
176
+ const registeredIdentity = { ...identity, registered: true };
177
+ identities.devices[identity.id] = registeredIdentity;
178
+ await credentialStore('save', identities, stateRoot); identity = registeredIdentity;
179
+ }
180
+ if (closing) return;
181
+ current.assertConnected();
182
+ online = true; attempts = 0; paired = registration.paired; clientCount = registration.clientCount || 0; lastError = '';
183
+ saveLanAuthorizations(stateRoot, identity.id, registration.clients || [], registration.revision);
184
+ for (const info of pendingLanConnections(stateRoot)) current.reportDeviceConnection(info);
185
+ for (const event of phoneReporting.pending()) current.reportPhoneConnection(event);
186
+ current.reportPhoneConnections(phoneReporting.snapshot());
187
+ await saveInvitation(registration);
188
+ if (!closing) audit('relay-connected', { paired });
189
+ } catch (error) {
190
+ if (closing) return;
191
+ online = false; lastError = error.message; audit('connect-failed', { message: error.message });
192
+ if (![1008, 4401, 4406, 4409, 4429].includes(error.code)) retryAfterAttempt = true;
193
+ else { clearTimeout(retryTimer); retryTimer = undefined; }
194
+ } finally { connecting = false; if (retryAfterAttempt) scheduleRetry(); }
195
+ }
196
+ async function pair() {
197
+ if (!online || closing) throw new Error('中继尚未连接,设备授权保持不变。');
198
+ await saveInvitation(await connector.command('pair-code'));
199
+ // Each invitation adds or refreshes one mobile identity without revoking other devices.
200
+ return { ...status(), qrPath, expiresAt: new Date(expiresAt).toISOString(),
201
+ displayText: '用要添加的移动设备扫描此码。每台设备只需配对一次;已有设备授权保持不变。' };
202
+ }
203
+ async function revoke() {
204
+ if (!online || closing) throw new Error('中继尚未连接,未撤销授权。');
205
+ await connector.command('revoke'); paired = false; clientCount = 0; attachedCount = 0; qrPath = undefined; expiresAt = 0;
254
206
  return { ...status(), displayText: '全部移动设备授权已撤销;重新添加请调用 relax pair --json。' };
255
- }
256
- async function refreshLan() {
257
- if (!online || closing) throw new Error('中继尚未连接,未更新局域网候选。');
258
- await refreshHealth();
259
- const candidates = await currentLanCandidates();
260
- connector.updateLanCandidates(candidates);
261
- audit('lan-candidates-updated', { count: candidates.length });
262
- return { ...status(), lanCandidateCount: candidates.length };
263
- }
264
- try {
265
- const freshStatus = async () => {
266
- if (online) {
267
- const remote = await connector.command('status'); paired = remote.paired;
268
- await refreshHealth();
269
- }
270
- return status();
271
- };
272
- control = await openControl({ instanceId, secret, shutdown, status, actions: { pair, revoke, inspect: freshStatus, 'refresh-lan': refreshLan } });
273
- writeRecord(recordPath(stateRoot), { pid: process.pid, instanceId, controlSecret: secret, controlPort: control.port });
274
- await connect();
275
- const result = refresh && online ? await pair() : status();
276
- writeRecord(path.join(stateRoot, `relay-ready-${instanceId}.json`), { instanceId, pid: process.pid, status: { ...result, pid: process.pid } });
277
- } catch (error) { await shutdown(); throw error; }
278
- }
279
-
280
- if (process.argv[1] && path.resolve(process.argv[1]) === script && process.argv[2] === '--worker') {
281
- worker(process.argv[3], process.argv[4], process.argv[5] === 'pair', process.argv[6]).catch(error => {
282
- writeRecord(path.join(process.argv[3], `relay-ready-${process.argv[4]}.json`), { instanceId: process.argv[4], pid: process.pid, error: error.message });
283
- console.error(error.message); process.exitCode = 1;
284
- });
285
- }
207
+ }
208
+ async function invite(command, details) {
209
+ if (!online || closing) throw new Error('中继尚未连接,请先执行 relax start。');
210
+ const result = await connector.command(command, command === 'invite-create' ? { expires: details.expires } : command === 'invite-revoke' ? { id: details.id } : {});
211
+ if (command === 'invite-create') {
212
+ const link = new URL(config.pairingUrl);
213
+ link.searchParams.set('invite', result.code);
214
+ const inviteQrPath = path.join(stateRoot, `self-relay-long-qr-${result.id}.png`);
215
+ try { await QRCode.toFile(inviteQrPath, link.href, { width: 640, margin: 3 }); }
216
+ catch (error) { throw new Error(`二维码保存失败:${error.message}。邀请 ID:${result.id};请执行 relax pair-revoke ${result.id} 废止。`); }
217
+ return { invitationId: result.id, deviceId: result.room, expiresAt: new Date(result.expires).toISOString(), qrPath: inviteQrPath,
218
+ displayText: `长期配对邀请已创建。邀请 ID:${result.id}\n截止:${new Date(result.expires).toISOString()}` };
219
+ }
220
+ if (command === 'invite-list') return { invitations: result.invitations,
221
+ displayText: result.invitations.length ? result.invitations.map(item => `${item.id} ${new Date(item.expires).toISOString()}${Date.now() >= item.expires ? '(已过期)' : ''}`).join('\n') : '本工作站没有长期配对邀请。' };
222
+ return { invitationId: result.id, revoked: result.revoked, displayText: '长期邀请已废止;已配对手机的独立授权保持不变。' };
223
+ }
224
+ async function refreshLan() {
225
+ if (!online || closing) throw new Error('中继尚未连接,未更新局域网候选。');
226
+ await refreshHealth();
227
+ const candidates = await currentLanCandidates();
228
+ connector.updateLanCandidates(candidates);
229
+ audit('lan-candidates-updated', { count: candidates.length });
230
+ return { ...status(), lanCandidateCount: candidates.length };
231
+ }
232
+ async function devices(command, details = {}) {
233
+ if (!online || closing) throw new Error('中继尚未连接,未读取或修改配对授权。');
234
+ const result = await connector.command(command, command === 'device-revoke' ? { id: details.id, confirmed: details.confirmed === true } : {});
235
+ return command === 'devices-list' ? { clients: result.clients, workstationOnline: result.workstationOnline,
236
+ displayText: result.clients.map(item => `${item.id} ${item.platform || '平台未记录'} ${item.deviceName || ''} 最后连接:${item.lastConnectedAt || '未记录'}`).join('\n') || '没有配对授权。' }
237
+ : { id: result.id, revoked: result.revoked, displayText: '指定配对授权已撤销;其他授权和长期邀请保持不变。' };
238
+ }
239
+ const inspect = async () => {
240
+ if (online) {
241
+ const remote = await connector.command('status'); paired = remote.paired;
242
+ await refreshHealth();
243
+ }
244
+ return status();
245
+ };
246
+ try { await connect(); return { status, inspect, pair, revoke, invite, devices, refreshLan, shutdown }; }
247
+ catch (error) { await shutdown(); throw error; }
248
+ }
249
+
250
+ export function createRelayManager(stateRoot) {
251
+ let current;
252
+ let operation = Promise.resolve();
253
+ const run = (command, details = {}) => {
254
+ const next = operation.then(async () => {
255
+ if (command === 'relay-status') return current ? current.inspect() : { running: false, displayText: '中继连接未运行。' };
256
+ if (command === 'relay-stop') {
257
+ await current?.shutdown(); current = undefined;
258
+ return { stopped: true, displayText: '中继连接已停止;桌面服务和 Codex 内核保持运行。' };
259
+ }
260
+ if (!current) {
261
+ if (['devices-list', 'device-revoke'].includes(command)) throw new Error('请先执行 relax start 连接中继。');
262
+ if (command.startsWith('invite-')) throw new Error('请先执行 relax start 连接中继。');
263
+ if (command === 'relay-revoke') throw new Error('请先启动中继连接,再撤销移动端授权。');
264
+ current = await createRelayRuntime(stateRoot);
265
+ return command === 'relay-pair' && current.status().relayConnected ? current.pair() : current.status();
266
+ }
267
+ if (command.startsWith('invite-')) return current.invite(command, details);
268
+ if (['devices-list', 'device-revoke'].includes(command)) return current.devices(command, details);
269
+ if (command === 'relay-revoke') return current.revoke();
270
+ if (command === 'relay-pair' || (current.status().relayConnected && !current.status().paired && !current.status().qrPath)) return current.pair();
271
+ if (command === 'relay-start' && current.status().relayConnected) return current.refreshLan();
272
+ return current.status();
273
+ });
274
+ operation = next.catch(() => {});
275
+ return next;
276
+ };
277
+ return { run, close: () => run('relay-stop'), status: () => current?.status() || { running: false } };
278
+ }
@@ -0,0 +1,40 @@
1
+ import fs from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { validId } from './device-store.mjs';
4
+ import { digest, matches, secret } from './wire.mjs';
5
+
6
+ // Operator-owned file, separate from device state. Only hashes are retained here.
7
+ export function longPairing(file) {
8
+ function read() {
9
+ if (!file || !fs.existsSync(file)) return [];
10
+ const data = JSON.parse(fs.readFileSync(file, 'utf8'));
11
+ if (data.version !== 1 || !Array.isArray(data.invitations) || data.invitations.some(item =>
12
+ !validId(item.id) || !validId(item.room) || !/^[a-f0-9]{64}$/.test(item.hash) ||
13
+ !Number.isSafeInteger(item.expires))) throw new Error('Invalid long pairing invitations');
14
+ return data.invitations;
15
+ }
16
+ function write(invitations) {
17
+ if (!file) throw new Error('Long pairing file is not configured');
18
+ const temporary = `${file}.${randomUUID()}.tmp`;
19
+ try {
20
+ fs.writeFileSync(temporary, JSON.stringify({ version: 1, invitations }), { mode: 0o600, flag: 'wx' });
21
+ fs.renameSync(temporary, file);
22
+ } finally { fs.rmSync(temporary, { force: true }); }
23
+ }
24
+ return {
25
+ list: () => read().map(({ hash, ...item }) => item),
26
+ find: code => read().find(item => Date.now() < item.expires && matches(code, item.hash)),
27
+ create(room, expires) {
28
+ if (!validId(room) || !Number.isSafeInteger(expires) || expires <= Date.now()) throw new Error('Invalid invitation room or expiry');
29
+ const invitations = read(), code = secret();
30
+ const item = { id: randomUUID(), room, expires, hash: digest(code) };
31
+ write([...invitations, item]);
32
+ return { id: item.id, room, expires, code };
33
+ },
34
+ revoke(id) {
35
+ const invitations = read();
36
+ if (!invitations.some(item => item.id === id)) throw new Error('Invitation not found');
37
+ write(invitations.filter(item => item.id !== id));
38
+ },
39
+ };
40
+ }