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

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 (849) 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 +49 -0
  105. package/dist/src/platform/windows/codex-runtime.mjs +215 -107
  106. package/dist/src/platform/windows/desktop-helper.mjs +272 -0
  107. package/dist/src/platform/windows/desktop-host.mjs +45 -33
  108. package/dist/src/platform/windows/desktop-info.ps1 +27 -3
  109. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  110. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  111. package/dist/src/platform/windows/desktop-shortcuts.ps1 +6 -13
  112. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  113. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  114. package/dist/src/platform/windows/launch-worker.mjs +41 -42
  115. package/dist/src/platform/windows/project-locations.mjs +16 -0
  116. package/dist/src/platform/windows/resident-start.js +20 -0
  117. package/dist/src/platform/windows/resident-startup.ps1 +27 -11
  118. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  119. package/dist/src/platform/windows/service-host.mjs +17 -22
  120. package/dist/src/platform/windows/start-hidden-console.ps1 +11 -2
  121. package/dist/src/platform/windows/user-environment.mjs +52 -50
  122. package/dist/src/project-create.mjs +121 -0
  123. package/dist/src/project-management.mjs +59 -0
  124. package/dist/src/project-remove.mjs +55 -0
  125. package/dist/src/project-update.mjs +59 -0
  126. package/dist/src/relay-config-import.mjs +45 -0
  127. package/dist/src/remote-control.mjs +51 -0
  128. package/dist/src/runtime-discovery.mjs +65 -41
  129. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  130. package/dist/src/self-relay/account-connections.mjs +63 -0
  131. package/dist/src/self-relay/admin-auth.mjs +59 -0
  132. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  133. package/dist/src/self-relay/admin-page.mjs +87 -71
  134. package/dist/src/self-relay/admin-server.mjs +68 -24
  135. package/dist/src/self-relay/admin-state.mjs +11 -6
  136. package/dist/src/self-relay/admin-style.mjs +58 -0
  137. package/dist/src/self-relay/admin-workstations-page.mjs +95 -0
  138. package/dist/src/self-relay/admin-workstations.mjs +145 -0
  139. package/dist/src/self-relay/android-releases.mjs +61 -0
  140. package/dist/src/self-relay/client.mjs +45 -45
  141. package/dist/src/self-relay/connection-reporting.mjs +38 -0
  142. package/dist/src/self-relay/connector.mjs +456 -145
  143. package/dist/src/self-relay/demo.mjs +1 -1
  144. package/dist/src/self-relay/device-info.mjs +27 -0
  145. package/dist/src/self-relay/device-store.mjs +10 -2
  146. package/dist/src/self-relay/diagnostics.mjs +54 -0
  147. package/dist/src/self-relay/email-accounts.mjs +195 -0
  148. package/dist/src/self-relay/file-wire.mjs +76 -0
  149. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  150. package/dist/src/self-relay/lifecycle.mjs +252 -259
  151. package/dist/src/self-relay/long-pairing.mjs +40 -0
  152. package/dist/src/self-relay/mysql-state.mjs +118 -0
  153. package/dist/src/self-relay/p2p-probe.mjs +168 -123
  154. package/dist/src/self-relay/phone-connections.mjs +55 -0
  155. package/dist/src/self-relay/privacy-page.mjs +26 -0
  156. package/dist/src/self-relay/public-releases.mjs +67 -0
  157. package/dist/src/self-relay/rtc-file-bridge.mjs +46 -0
  158. package/dist/src/self-relay/server.mjs +1078 -441
  159. package/dist/src/self-relay/usage-daily.mjs +55 -0
  160. package/dist/src/self-relay/usage-meter.mjs +141 -0
  161. package/dist/src/server.mjs +1442 -716
  162. package/dist/src/service-control.mjs +17 -7
  163. package/dist/src/service-doctor.mjs +150 -51
  164. package/dist/src/service-health.mjs +2 -2
  165. package/dist/src/service-install.mjs +16 -10
  166. package/dist/src/service-lifecycle.mjs +52 -42
  167. package/dist/src/service-power.mjs +58 -0
  168. package/dist/src/service-restart.mjs +45 -12
  169. package/dist/src/service-update-worker.mjs +42 -0
  170. package/dist/src/service-update.mjs +80 -0
  171. package/dist/src/shared-app-server.mjs +511 -307
  172. package/dist/src/shared-catalog.mjs +132 -50
  173. package/dist/src/shared-recovery.mjs +21 -13
  174. package/dist/src/shared-thread-stream.mjs +143 -51
  175. package/dist/src/skill-install.mjs +0 -13
  176. package/dist/src/thread-goals.mjs +40 -0
  177. package/dist/src/turn-model-history.mjs +47 -0
  178. package/dist/src/usage-reset.mjs +17 -0
  179. package/dist/src/workstation-downloads.mjs +120 -0
  180. package/package.json +48 -48
  181. package/tools/postinstall.mjs +186 -146
  182. package/dist/src/debug-ui.mjs +0 -131
  183. package/dist/src/platform/windows/credential-store.mjs +0 -27
  184. package/dist/src/platform/windows/credential-store.ps1 +0 -49
  185. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  186. package/dist/web/activity-view.js +0 -283
  187. package/dist/web/approval-ui.js +0 -188
  188. package/dist/web/capabilities.js +0 -50
  189. package/dist/web/chat-transport.js +0 -196
  190. package/dist/web/chat.css +0 -778
  191. package/dist/web/chat.js +0 -3815
  192. package/dist/web/client-platform.js +0 -11
  193. package/dist/web/community.css +0 -82
  194. package/dist/web/community.html +0 -36
  195. package/dist/web/composer-controller.js +0 -97
  196. package/dist/web/conversation-controller.js +0 -99
  197. package/dist/web/disclosure-state-controller.js +0 -95
  198. package/dist/web/draft-controller.js +0 -103
  199. package/dist/web/harmony-platform.js +0 -52
  200. package/dist/web/highlight-powershell.min.js +0 -39
  201. package/dist/web/highlight.min.js +0 -1262
  202. package/dist/web/history-cache.js +0 -240
  203. package/dist/web/history-controller.js +0 -167
  204. package/dist/web/index.html +0 -288
  205. package/dist/web/lan-session.js +0 -122
  206. package/dist/web/link-action-controller.js +0 -212
  207. package/dist/web/message-send-controller.js +0 -177
  208. package/dist/web/message-view.js +0 -98
  209. package/dist/web/p2p-data-channel.js +0 -50
  210. package/dist/web/p2p-diagnostics.js +0 -28
  211. package/dist/web/p2p-probe.js +0 -123
  212. package/dist/web/page-resume.js +0 -28
  213. package/dist/web/pending-message-store.js +0 -108
  214. package/dist/web/queue-controller.js +0 -82
  215. package/dist/web/resources.json +0 -1
  216. package/dist/web/self-relay-session.js +0 -129
  217. package/dist/web/server-requests.js +0 -67
  218. package/dist/web/station-connection-controller.js +0 -75
  219. package/dist/web/task-list-view.js +0 -289
  220. package/dist/web/thread-attention-controller.js +0 -124
  221. package/dist/web/thread-context-controller.js +0 -30
  222. package/dist/web/thread-list-controller.js +0 -61
  223. package/dist/web/thread-list-sync.js +0 -86
  224. package/dist/web/thread-title-controller.js +0 -57
  225. package/dist/web/timeline-formatters.js +0 -249
  226. package/dist/web/timeline-reducer.js +0 -77
  227. package/dist/web/timeline-renderer.js +0 -161
  228. package/dist/web/timeline-scroll-controller.js +0 -50
  229. package/dist/web/timeline-sync.js +0 -67
  230. package/dist/web/usage-controller.js +0 -258
  231. package/dist/web/vendor/README.md +0 -14
  232. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  233. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  234. package/dist/web/vendor/highlight.min.js +0 -1262
  235. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  236. package/node_modules/@img/colour/LICENSE.md +0 -82
  237. package/node_modules/@img/colour/README.md +0 -15
  238. package/node_modules/@img/colour/color.cjs +0 -1596
  239. package/node_modules/@img/colour/index.cjs +0 -1
  240. package/node_modules/@img/colour/index.d.ts +0 -929
  241. package/node_modules/@img/colour/package.json +0 -58
  242. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  243. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  244. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  245. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  246. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  247. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  248. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  249. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  250. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  251. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  252. package/node_modules/ansi-regex/index.d.ts +0 -37
  253. package/node_modules/ansi-regex/index.js +0 -10
  254. package/node_modules/ansi-regex/license +0 -9
  255. package/node_modules/ansi-regex/package.json +0 -55
  256. package/node_modules/ansi-regex/readme.md +0 -78
  257. package/node_modules/ansi-styles/index.d.ts +0 -345
  258. package/node_modules/ansi-styles/index.js +0 -163
  259. package/node_modules/ansi-styles/license +0 -9
  260. package/node_modules/ansi-styles/package.json +0 -56
  261. package/node_modules/ansi-styles/readme.md +0 -152
  262. package/node_modules/camelcase/index.d.ts +0 -63
  263. package/node_modules/camelcase/index.js +0 -76
  264. package/node_modules/camelcase/license +0 -9
  265. package/node_modules/camelcase/package.json +0 -43
  266. package/node_modules/camelcase/readme.md +0 -99
  267. package/node_modules/cliui/CHANGELOG.md +0 -76
  268. package/node_modules/cliui/LICENSE.txt +0 -14
  269. package/node_modules/cliui/README.md +0 -115
  270. package/node_modules/cliui/index.js +0 -354
  271. package/node_modules/cliui/package.json +0 -65
  272. package/node_modules/color-convert/CHANGELOG.md +0 -54
  273. package/node_modules/color-convert/LICENSE +0 -21
  274. package/node_modules/color-convert/README.md +0 -68
  275. package/node_modules/color-convert/conversions.js +0 -839
  276. package/node_modules/color-convert/index.js +0 -81
  277. package/node_modules/color-convert/package.json +0 -48
  278. package/node_modules/color-convert/route.js +0 -97
  279. package/node_modules/color-name/LICENSE +0 -8
  280. package/node_modules/color-name/README.md +0 -11
  281. package/node_modules/color-name/index.js +0 -152
  282. package/node_modules/color-name/package.json +0 -28
  283. package/node_modules/decamelize/index.js +0 -13
  284. package/node_modules/decamelize/license +0 -21
  285. package/node_modules/decamelize/package.json +0 -38
  286. package/node_modules/decamelize/readme.md +0 -48
  287. package/node_modules/detect-libc/LICENSE +0 -201
  288. package/node_modules/detect-libc/README.md +0 -163
  289. package/node_modules/detect-libc/index.d.ts +0 -14
  290. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  291. package/node_modules/detect-libc/lib/elf.js +0 -39
  292. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  293. package/node_modules/detect-libc/lib/process.js +0 -24
  294. package/node_modules/detect-libc/package.json +0 -44
  295. package/node_modules/dijkstrajs/.travis.yml +0 -4
  296. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  297. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  298. package/node_modules/dijkstrajs/README.md +0 -18
  299. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  300. package/node_modules/dijkstrajs/package.json +0 -60
  301. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  302. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  303. package/node_modules/emoji-regex/README.md +0 -73
  304. package/node_modules/emoji-regex/es2015/index.js +0 -6
  305. package/node_modules/emoji-regex/es2015/text.js +0 -6
  306. package/node_modules/emoji-regex/index.d.ts +0 -23
  307. package/node_modules/emoji-regex/index.js +0 -6
  308. package/node_modules/emoji-regex/package.json +0 -50
  309. package/node_modules/emoji-regex/text.js +0 -6
  310. package/node_modules/find-up/index.d.ts +0 -137
  311. package/node_modules/find-up/index.js +0 -89
  312. package/node_modules/find-up/license +0 -9
  313. package/node_modules/find-up/package.json +0 -53
  314. package/node_modules/find-up/readme.md +0 -156
  315. package/node_modules/get-caller-file/LICENSE.md +0 -6
  316. package/node_modules/get-caller-file/README.md +0 -41
  317. package/node_modules/get-caller-file/index.d.ts +0 -2
  318. package/node_modules/get-caller-file/index.js +0 -22
  319. package/node_modules/get-caller-file/index.js.map +0 -1
  320. package/node_modules/get-caller-file/package.json +0 -42
  321. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  322. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  323. package/node_modules/is-fullwidth-code-point/license +0 -9
  324. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  325. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  326. package/node_modules/locate-path/index.d.ts +0 -83
  327. package/node_modules/locate-path/index.js +0 -65
  328. package/node_modules/locate-path/license +0 -9
  329. package/node_modules/locate-path/package.json +0 -45
  330. package/node_modules/locate-path/readme.md +0 -122
  331. package/node_modules/node-datachannel/.clang-format +0 -17
  332. package/node_modules/node-datachannel/.editorconfig +0 -12
  333. package/node_modules/node-datachannel/.eslintignore +0 -8
  334. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  335. package/node_modules/node-datachannel/.gitmodules +0 -3
  336. package/node_modules/node-datachannel/.prettierignore +0 -7
  337. package/node_modules/node-datachannel/.prettierrc +0 -13
  338. package/node_modules/node-datachannel/API.md +0 -247
  339. package/node_modules/node-datachannel/BULDING.md +0 -26
  340. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  341. package/node_modules/node-datachannel/LICENSE +0 -373
  342. package/node_modules/node-datachannel/README.md +0 -129
  343. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  344. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  345. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  346. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  347. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  348. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  349. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  350. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  352. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  354. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  378. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  380. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  382. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  384. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  386. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  388. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  390. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  392. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  394. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  411. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  412. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  413. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  414. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  415. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  416. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  417. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  418. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  419. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  420. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  421. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  426. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  428. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  429. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  430. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  431. package/node_modules/node-datachannel/jest.config.ts +0 -14
  432. package/node_modules/node-datachannel/package.json +0 -133
  433. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  434. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  435. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  436. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  437. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  438. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  439. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  440. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  441. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  442. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  443. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  444. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  445. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  446. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  447. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  448. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  449. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  450. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  451. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  452. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  453. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  454. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  455. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  456. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  457. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  458. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  459. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  460. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  461. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  462. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  463. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  464. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  465. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  466. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  467. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  468. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  469. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  470. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  471. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  472. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  473. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  474. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  475. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  476. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  477. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  478. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  479. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  480. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  481. package/node_modules/node-datachannel/src/index.ts +0 -9
  482. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  483. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  484. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  485. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  486. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  487. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  488. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  489. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  490. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  491. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  492. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  493. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  494. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  495. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  496. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  497. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  498. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  499. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  500. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  501. package/node_modules/node-datachannel/tsconfig.json +0 -21
  502. package/node_modules/p-limit/index.d.ts +0 -38
  503. package/node_modules/p-limit/index.js +0 -57
  504. package/node_modules/p-limit/license +0 -9
  505. package/node_modules/p-limit/package.json +0 -52
  506. package/node_modules/p-limit/readme.md +0 -101
  507. package/node_modules/p-locate/index.d.ts +0 -64
  508. package/node_modules/p-locate/index.js +0 -52
  509. package/node_modules/p-locate/license +0 -9
  510. package/node_modules/p-locate/package.json +0 -53
  511. package/node_modules/p-locate/readme.md +0 -90
  512. package/node_modules/p-try/index.d.ts +0 -39
  513. package/node_modules/p-try/index.js +0 -9
  514. package/node_modules/p-try/license +0 -9
  515. package/node_modules/p-try/package.json +0 -42
  516. package/node_modules/p-try/readme.md +0 -58
  517. package/node_modules/path-exists/index.d.ts +0 -28
  518. package/node_modules/path-exists/index.js +0 -23
  519. package/node_modules/path-exists/license +0 -9
  520. package/node_modules/path-exists/package.json +0 -39
  521. package/node_modules/path-exists/readme.md +0 -52
  522. package/node_modules/pngjs/.eslintignore +0 -2
  523. package/node_modules/pngjs/.eslintrc.json +0 -19
  524. package/node_modules/pngjs/.prettierignore +0 -3
  525. package/node_modules/pngjs/LICENSE +0 -20
  526. package/node_modules/pngjs/README.md +0 -429
  527. package/node_modules/pngjs/browser.js +0 -16096
  528. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  529. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  530. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  531. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  532. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  533. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  534. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  535. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  536. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  537. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  538. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  539. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  540. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  541. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  542. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  543. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  544. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  545. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  546. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  547. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  548. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  549. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  550. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  551. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  552. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  553. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  554. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  555. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  556. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  557. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  558. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  559. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  560. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  561. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  562. package/node_modules/pngjs/lib/constants.js +0 -32
  563. package/node_modules/pngjs/lib/crc.js +0 -40
  564. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  565. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  566. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  567. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  568. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  569. package/node_modules/pngjs/lib/interlace.js +0 -95
  570. package/node_modules/pngjs/lib/packer-async.js +0 -50
  571. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  572. package/node_modules/pngjs/lib/packer.js +0 -129
  573. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  574. package/node_modules/pngjs/lib/parser-async.js +0 -165
  575. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  576. package/node_modules/pngjs/lib/parser.js +0 -290
  577. package/node_modules/pngjs/lib/png-sync.js +0 -12
  578. package/node_modules/pngjs/lib/png.js +0 -194
  579. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  580. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  581. package/node_modules/pngjs/package.json +0 -73
  582. package/node_modules/qrcode/README.md +0 -770
  583. package/node_modules/qrcode/bin/qrcode +0 -159
  584. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  585. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  586. package/node_modules/qrcode/lib/browser.js +0 -76
  587. package/node_modules/qrcode/lib/can-promise.js +0 -7
  588. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  589. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  590. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  591. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  592. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  593. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  594. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  595. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  596. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  597. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  598. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  599. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  600. package/node_modules/qrcode/lib/core/mode.js +0 -167
  601. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  602. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  603. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  604. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  605. package/node_modules/qrcode/lib/core/regex.js +0 -31
  606. package/node_modules/qrcode/lib/core/segments.js +0 -330
  607. package/node_modules/qrcode/lib/core/utils.js +0 -63
  608. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  609. package/node_modules/qrcode/lib/core/version.js +0 -163
  610. package/node_modules/qrcode/lib/index.js +0 -12
  611. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  612. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  613. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  614. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  615. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  616. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  617. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  618. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  619. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  620. package/node_modules/qrcode/lib/server.js +0 -138
  621. package/node_modules/qrcode/license +0 -10
  622. package/node_modules/qrcode/package.json +0 -77
  623. package/node_modules/require-directory/.jshintrc +0 -67
  624. package/node_modules/require-directory/.npmignore +0 -1
  625. package/node_modules/require-directory/.travis.yml +0 -3
  626. package/node_modules/require-directory/LICENSE +0 -22
  627. package/node_modules/require-directory/README.markdown +0 -184
  628. package/node_modules/require-directory/index.js +0 -86
  629. package/node_modules/require-directory/package.json +0 -40
  630. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  631. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  632. package/node_modules/require-main-filename/README.md +0 -26
  633. package/node_modules/require-main-filename/index.js +0 -18
  634. package/node_modules/require-main-filename/package.json +0 -35
  635. package/node_modules/semver/LICENSE +0 -15
  636. package/node_modules/semver/README.md +0 -680
  637. package/node_modules/semver/bin/semver.js +0 -195
  638. package/node_modules/semver/classes/comparator.js +0 -143
  639. package/node_modules/semver/classes/index.js +0 -7
  640. package/node_modules/semver/classes/range.js +0 -577
  641. package/node_modules/semver/classes/semver.js +0 -350
  642. package/node_modules/semver/functions/clean.js +0 -8
  643. package/node_modules/semver/functions/cmp.js +0 -54
  644. package/node_modules/semver/functions/coerce.js +0 -62
  645. package/node_modules/semver/functions/compare-build.js +0 -9
  646. package/node_modules/semver/functions/compare-loose.js +0 -5
  647. package/node_modules/semver/functions/compare.js +0 -7
  648. package/node_modules/semver/functions/diff.js +0 -60
  649. package/node_modules/semver/functions/eq.js +0 -5
  650. package/node_modules/semver/functions/gt.js +0 -5
  651. package/node_modules/semver/functions/gte.js +0 -5
  652. package/node_modules/semver/functions/inc.js +0 -21
  653. package/node_modules/semver/functions/lt.js +0 -5
  654. package/node_modules/semver/functions/lte.js +0 -5
  655. package/node_modules/semver/functions/major.js +0 -5
  656. package/node_modules/semver/functions/minor.js +0 -5
  657. package/node_modules/semver/functions/neq.js +0 -5
  658. package/node_modules/semver/functions/parse.js +0 -18
  659. package/node_modules/semver/functions/patch.js +0 -5
  660. package/node_modules/semver/functions/prerelease.js +0 -8
  661. package/node_modules/semver/functions/rcompare.js +0 -5
  662. package/node_modules/semver/functions/rsort.js +0 -5
  663. package/node_modules/semver/functions/satisfies.js +0 -12
  664. package/node_modules/semver/functions/sort.js +0 -5
  665. package/node_modules/semver/functions/truncate.js +0 -48
  666. package/node_modules/semver/functions/valid.js +0 -8
  667. package/node_modules/semver/index.js +0 -93
  668. package/node_modules/semver/internal/constants.js +0 -37
  669. package/node_modules/semver/internal/debug.js +0 -11
  670. package/node_modules/semver/internal/identifiers.js +0 -29
  671. package/node_modules/semver/internal/lrucache.js +0 -42
  672. package/node_modules/semver/internal/parse-options.js +0 -17
  673. package/node_modules/semver/internal/re.js +0 -223
  674. package/node_modules/semver/package.json +0 -78
  675. package/node_modules/semver/preload.js +0 -4
  676. package/node_modules/semver/range.bnf +0 -17
  677. package/node_modules/semver/ranges/gtr.js +0 -6
  678. package/node_modules/semver/ranges/intersects.js +0 -9
  679. package/node_modules/semver/ranges/ltr.js +0 -6
  680. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  681. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  682. package/node_modules/semver/ranges/min-version.js +0 -63
  683. package/node_modules/semver/ranges/outside.js +0 -82
  684. package/node_modules/semver/ranges/simplify.js +0 -49
  685. package/node_modules/semver/ranges/subset.js +0 -249
  686. package/node_modules/semver/ranges/to-comparators.js +0 -10
  687. package/node_modules/semver/ranges/valid.js +0 -13
  688. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  689. package/node_modules/set-blocking/LICENSE.txt +0 -14
  690. package/node_modules/set-blocking/README.md +0 -31
  691. package/node_modules/set-blocking/index.js +0 -7
  692. package/node_modules/set-blocking/package.json +0 -42
  693. package/node_modules/sharp/LICENSE +0 -191
  694. package/node_modules/sharp/README.md +0 -112
  695. package/node_modules/sharp/dist/channel.cjs +0 -177
  696. package/node_modules/sharp/dist/channel.mjs +0 -177
  697. package/node_modules/sharp/dist/colour.cjs +0 -199
  698. package/node_modules/sharp/dist/colour.mjs +0 -199
  699. package/node_modules/sharp/dist/composite.cjs +0 -213
  700. package/node_modules/sharp/dist/composite.mjs +0 -213
  701. package/node_modules/sharp/dist/constructor.cjs +0 -511
  702. package/node_modules/sharp/dist/constructor.mjs +0 -511
  703. package/node_modules/sharp/dist/index.cjs +0 -25
  704. package/node_modules/sharp/dist/index.d.cts +0 -1999
  705. package/node_modules/sharp/dist/index.d.mts +0 -2046
  706. package/node_modules/sharp/dist/index.mjs +0 -25
  707. package/node_modules/sharp/dist/input.cjs +0 -819
  708. package/node_modules/sharp/dist/input.mjs +0 -819
  709. package/node_modules/sharp/dist/is.cjs +0 -143
  710. package/node_modules/sharp/dist/is.mjs +0 -143
  711. package/node_modules/sharp/dist/libvips.cjs +0 -212
  712. package/node_modules/sharp/dist/libvips.mjs +0 -212
  713. package/node_modules/sharp/dist/operation.cjs +0 -1002
  714. package/node_modules/sharp/dist/operation.mjs +0 -1002
  715. package/node_modules/sharp/dist/output.cjs +0 -1785
  716. package/node_modules/sharp/dist/output.mjs +0 -1785
  717. package/node_modules/sharp/dist/resize.cjs +0 -617
  718. package/node_modules/sharp/dist/resize.mjs +0 -617
  719. package/node_modules/sharp/dist/sharp.cjs +0 -174
  720. package/node_modules/sharp/dist/sharp.mjs +0 -174
  721. package/node_modules/sharp/dist/utility.cjs +0 -301
  722. package/node_modules/sharp/dist/utility.mjs +0 -301
  723. package/node_modules/sharp/install/build.js +0 -38
  724. package/node_modules/sharp/lib/index.d.ts +0 -1999
  725. package/node_modules/sharp/package.json +0 -227
  726. package/node_modules/sharp/src/binding.gyp +0 -303
  727. package/node_modules/sharp/src/common.cc +0 -1186
  728. package/node_modules/sharp/src/common.h +0 -421
  729. package/node_modules/sharp/src/metadata.cc +0 -404
  730. package/node_modules/sharp/src/metadata.h +0 -95
  731. package/node_modules/sharp/src/operations.cc +0 -516
  732. package/node_modules/sharp/src/operations.h +0 -137
  733. package/node_modules/sharp/src/pipeline.cc +0 -1948
  734. package/node_modules/sharp/src/pipeline.h +0 -422
  735. package/node_modules/sharp/src/sharp.cc +0 -43
  736. package/node_modules/sharp/src/stats.cc +0 -186
  737. package/node_modules/sharp/src/stats.h +0 -62
  738. package/node_modules/sharp/src/utilities.cc +0 -289
  739. package/node_modules/sharp/src/utilities.h +0 -22
  740. package/node_modules/string-width/index.d.ts +0 -29
  741. package/node_modules/string-width/index.js +0 -47
  742. package/node_modules/string-width/license +0 -9
  743. package/node_modules/string-width/package.json +0 -56
  744. package/node_modules/string-width/readme.md +0 -50
  745. package/node_modules/strip-ansi/index.d.ts +0 -17
  746. package/node_modules/strip-ansi/index.js +0 -4
  747. package/node_modules/strip-ansi/license +0 -9
  748. package/node_modules/strip-ansi/package.json +0 -54
  749. package/node_modules/strip-ansi/readme.md +0 -46
  750. package/node_modules/which-module/LICENSE +0 -13
  751. package/node_modules/which-module/README.md +0 -58
  752. package/node_modules/which-module/index.js +0 -9
  753. package/node_modules/which-module/package.json +0 -41
  754. package/node_modules/wrap-ansi/index.js +0 -186
  755. package/node_modules/wrap-ansi/license +0 -9
  756. package/node_modules/wrap-ansi/package.json +0 -61
  757. package/node_modules/wrap-ansi/readme.md +0 -97
  758. package/node_modules/ws/LICENSE +0 -20
  759. package/node_modules/ws/README.md +0 -548
  760. package/node_modules/ws/browser.js +0 -8
  761. package/node_modules/ws/index.js +0 -22
  762. package/node_modules/ws/lib/buffer-util.js +0 -131
  763. package/node_modules/ws/lib/constants.js +0 -19
  764. package/node_modules/ws/lib/event-target.js +0 -292
  765. package/node_modules/ws/lib/extension.js +0 -203
  766. package/node_modules/ws/lib/limiter.js +0 -55
  767. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  768. package/node_modules/ws/lib/receiver.js +0 -743
  769. package/node_modules/ws/lib/sender.js +0 -607
  770. package/node_modules/ws/lib/stream.js +0 -161
  771. package/node_modules/ws/lib/subprotocol.js +0 -62
  772. package/node_modules/ws/lib/validation.js +0 -152
  773. package/node_modules/ws/lib/websocket-server.js +0 -562
  774. package/node_modules/ws/lib/websocket.js +0 -1407
  775. package/node_modules/ws/package.json +0 -74
  776. package/node_modules/ws/wrapper.mjs +0 -21
  777. package/node_modules/y18n/CHANGELOG.md +0 -35
  778. package/node_modules/y18n/LICENSE +0 -13
  779. package/node_modules/y18n/README.md +0 -109
  780. package/node_modules/y18n/index.js +0 -188
  781. package/node_modules/y18n/package.json +0 -39
  782. package/node_modules/yargs/CHANGELOG.md +0 -420
  783. package/node_modules/yargs/LICENSE +0 -21
  784. package/node_modules/yargs/README.md +0 -140
  785. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  786. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  787. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  788. package/node_modules/yargs/build/lib/argsert.js +0 -65
  789. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  790. package/node_modules/yargs/build/lib/command.js +0 -416
  791. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  792. package/node_modules/yargs/build/lib/common-types.js +0 -25
  793. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  794. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  795. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  796. package/node_modules/yargs/build/lib/completion.js +0 -135
  797. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  798. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  799. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  800. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  801. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  802. package/node_modules/yargs/build/lib/middleware.js +0 -57
  803. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  804. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  805. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  806. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  807. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  808. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  809. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  810. package/node_modules/yargs/build/lib/usage.js +0 -540
  811. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  812. package/node_modules/yargs/build/lib/validation.js +0 -330
  813. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  814. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  815. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  816. package/node_modules/yargs/build/lib/yerror.js +0 -11
  817. package/node_modules/yargs/index.js +0 -40
  818. package/node_modules/yargs/locales/be.json +0 -46
  819. package/node_modules/yargs/locales/de.json +0 -46
  820. package/node_modules/yargs/locales/en.json +0 -51
  821. package/node_modules/yargs/locales/es.json +0 -46
  822. package/node_modules/yargs/locales/fi.json +0 -49
  823. package/node_modules/yargs/locales/fr.json +0 -53
  824. package/node_modules/yargs/locales/hi.json +0 -49
  825. package/node_modules/yargs/locales/hu.json +0 -46
  826. package/node_modules/yargs/locales/id.json +0 -50
  827. package/node_modules/yargs/locales/it.json +0 -46
  828. package/node_modules/yargs/locales/ja.json +0 -51
  829. package/node_modules/yargs/locales/ko.json +0 -49
  830. package/node_modules/yargs/locales/nb.json +0 -44
  831. package/node_modules/yargs/locales/nl.json +0 -49
  832. package/node_modules/yargs/locales/nn.json +0 -44
  833. package/node_modules/yargs/locales/pirate.json +0 -13
  834. package/node_modules/yargs/locales/pl.json +0 -49
  835. package/node_modules/yargs/locales/pt.json +0 -45
  836. package/node_modules/yargs/locales/pt_BR.json +0 -48
  837. package/node_modules/yargs/locales/ru.json +0 -46
  838. package/node_modules/yargs/locales/th.json +0 -46
  839. package/node_modules/yargs/locales/tr.json +0 -48
  840. package/node_modules/yargs/locales/zh_CN.json +0 -48
  841. package/node_modules/yargs/locales/zh_TW.json +0 -47
  842. package/node_modules/yargs/package.json +0 -92
  843. package/node_modules/yargs/yargs.js +0 -14
  844. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  845. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  846. package/node_modules/yargs-parser/README.md +0 -449
  847. package/node_modules/yargs-parser/index.js +0 -1032
  848. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  849. package/node_modules/yargs-parser/package.json +0 -46
@@ -0,0 +1,95 @@
1
+ export const adminWorkstationsMarkup = `
2
+ <section id="workstations" class="page stack" hidden>
3
+ <section class="card">
4
+ <div class="usage-toolbar"><div><h2 id="workstationHeading">工作站</h2><p id="workstationCount" class="hint">正在读取</p></div>
5
+ <div class="actions"><button id="workstationBack" class="secondary" type="button" hidden>返回列表</button><button id="workstationRefresh" class="secondary" type="button">刷新</button></div></div>
6
+ <div id="workstationContent" class="workstation-content"></div><p id="workstationError" class="status error" role="alert"></p>
7
+ </section>
8
+ </section>`;
9
+
10
+ export const adminWorkstationsScript = String.raw`
11
+ let workstationId=null,workstationController=null,workstationGeneration=0,workstationRendered='';
12
+ const workstationDisclosures=new Map();
13
+ const workstationRouteNames={management:'管理连接',pending:'连接方式待确认',direct:'中继直连',relay:'中继转发',lan:'局域网','self-relay':'Code Relax 中继'};
14
+ function workstationTime(value){return value?new Date(value).toLocaleString('zh-CN',{timeZone:'Asia/Shanghai',year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false}):'未记录'}
15
+ function workstationFields(values){const list=node('dl','workstation-fields');for(const [label,value] of values){const row=node('div');row.append(node('dt','hint',label),node('dd','',value==null||value===''?'未提供':String(value)));list.append(row)}return list}
16
+ function workstationBlock(title){const block=node('section','workstation-block');block.append(node('h3','',title));return block}
17
+ function workstationAccount(accounts,missing='未上报'){return accounts.length?accounts.map(account=>account.email||account.id).join('、'):missing}
18
+ function workstationAccountView(item){return item.accounts.length?{value:workstationAccount(item.accounts),note:'当前认证'}:item.associatedAccounts.length?{value:workstationAccount(item.associatedAccounts),note:'最近确认'}:{value:'未上报',note:''}}
19
+ function workstationAssociated(accounts){return accounts.length?accounts.map(account=>account.email+(account.lastVerifiedAt?'('+workstationTime(account.lastVerifiedAt)+' 确认)':'')).join('、'):'未上报'}
20
+ function workstationStatus(online){return node('span','workstation-state'+(online?'':' offline'),online?'在线':'离线')}
21
+ function workstationLastRoute(item){return workstationRouteNames[item.lastConnection?.mode]||'未记录'}
22
+ function workstationConnectionState(item){return {connected:'已连接',disconnected:'已断开',unconfirmed:'未确认'}[item.connectionState]||'未确认'}
23
+ function workstationWork(item,online=item.online){return online?(item.activeTasks?'工作中 · '+item.activeTasks+' 项':'未确认'):'—'}
24
+ function workstationHighlights(item,online=item.online){
25
+ const list=node('dl','workstation-key-grid');const account=workstationAccountView(item);
26
+ for(const [key,label,value,note] of [['state','手机连接状态',workstationConnectionState(item),''],['connection','上次连接方式',workstationLastRoute(item),''],['account','手机账号',account.value,account.note],['work','工作状态',workstationWork(item,online),'']]){
27
+ const field=node('div','workstation-key workstation-key-'+key);field.append(node('dt','',label));const result=node('dd','',value);
28
+ if(note)result.append(node('small','workstation-account-note',note));if(key==='work'&&online&&item.activeTasks)result.classList.add('working');field.append(result);list.append(field)
29
+ }return list
30
+ }
31
+ function workstationDisclosure(item,key,title){const details=node('details','workstation-disclosure');const identity=item.id+':'+key;details.open=workstationDisclosures.get(identity)===true;details.append(node('summary','',title));details.addEventListener('toggle',()=>{if(details.isConnected)workstationDisclosures.set(identity,details.open)});return details}
32
+ function openWorkstation(id){history.pushState({workstationDetail:true},'','#workstations/'+encodeURIComponent(id));showPage('workstations/'+encodeURIComponent(id))}
33
+ function cancelWorkstations(){workstationGeneration++;workstationController?.abort();workstationController=null;workstationRendered=''}
34
+ function workstationCaption(result){if(result.workstation){const item=result.workstation;return (item.online?'在线':'离线')+' · 更新 '+workstationTime(result.sampledAt)}const online=result.workstations.filter(item=>item.online).length;return online+' 台在线 · '+(result.workstations.length-online)+' 台离线 · 按上线时间从新到旧'}
35
+ function renderWorkstationList(result){
36
+ const list=el('workstationContent');list.replaceChildren();el('workstationCount').textContent=workstationCaption(result);
37
+ if(!result.workstations.length){list.append(node('p','empty-note','暂无工作站'));return}
38
+ for(const item of result.workstations){
39
+ const row=node('a','workstation-row');row.href='#workstations/'+encodeURIComponent(item.id);row.addEventListener('click',event=>{if(event.button!==0||event.ctrlKey||event.metaKey||event.shiftKey||event.altKey)return;event.preventDefault();openWorkstation(item.id)});const heading=node('span','workstation-row-heading');heading.append(node('strong','',item.name),workstationStatus(item.online));
40
+ const footer=node('span','workstation-row-footer');footer.append(node('span','hint',(item.online?'上线时间 ':'最近上线 ')+workstationTime(item.onlineAt)),node('span','workstation-more','查看 ›'));
41
+ row.append(heading,workstationHighlights(item),footer);list.append(row)
42
+ }
43
+ }
44
+ function renderWorkstationDetail(result){
45
+ const item=result.workstation;const content=el('workstationContent');content.replaceChildren();el('workstationHeading').textContent=item.name;el('workstationCount').textContent=workstationCaption(result);
46
+ const overview=node('section','workstation-overview');const heading=node('div','workstation-row-heading');heading.append(workstationStatus(item.online),node('span','hint',(item.online?'上线时间 ':'最近上线 ')+workstationTime(item.onlineAt)));
47
+ overview.append(heading,workstationHighlights(item),node('p','hint','聊天连接 '+item.chatPhones+' 台手机 · 已配对 '+item.pairedPhones+' 台'));content.append(overview);
48
+ const phones=workstationDisclosure(item,'phones','手机与账号 · '+item.pairedPhones+' 台');const phoneList=node('div','workstation-disclosure-content');
49
+ if(!item.phones.length)phoneList.append(node('p','hint','尚无配对手机'));
50
+ for(const phone of item.phones){
51
+ const card=node('article','workstation-phone');const title=node('div','workstation-row-heading');const platform={android:'Android',harmony:'HarmonyOS',ios:'iOS'}[phone.platform]||'';
52
+ title.append(node('strong','',phone.deviceName||platform||'手机'),node('span','hint',workstationConnectionState(phone)));
53
+ const account=workstationAccountView(phone);card.append(title,workstationFields([['上次连接方式',workstationLastRoute(phone)],['手机账号',account.value+(account.note?' · '+account.note:'')]]));phoneList.append(card)
54
+ }phones.append(phoneList);content.append(phones);
55
+ const diagnostics=workstationDisclosure(item,'diagnostics','诊断详情');const body=node('div','workstation-disclosure-content');
56
+ const station=workstationBlock('工作站记录');station.append(workstationFields([
57
+ ['工作站 ID',item.id],['上线时间',workstationTime(item.onlineAt)],['来源 IP',item.connection?.address],['登记时间',workstationTime(item.registeredAt)],['授权更新时间',workstationTime(item.updatedAt)],
58
+ ['手机关联账号',workstationAssociated(item.associatedAccounts)],['当前认证账号',workstationAccount(item.accounts,'未确认')],['任务账号',workstationAccount(item.taskAccounts,'未记录')],
59
+ ['元数据连接',item.metadataPhones+' 台手机'],['调试白名单',item.debugEnabled?'已启用':'未启用'],['文件接收通道',item.fileReceiverOnline?'在线':'未连接']
60
+ ]));body.append(station);
61
+ const connectionEvents=workstationBlock('手机连接记录 · 工作站上报');
62
+ connectionEvents.append(node('p','hint',item.connectionReportingCurrent?'已收到当前工作站连接状态':'当前上报未确认;不据此推断手机断开'));
63
+ for(const event of item.connectionEvents||[]){const phone=item.phones.find(value=>value.id===event.clientId);connectionEvents.append(workstationFields([
64
+ ['时间',workstationTime(event.at)],['事件',event.state==='connected'?'手机已连接':'手机已断开'],['手机',phone?.deviceName||event.clientId],['连接方式',workstationRouteNames[event.mode]||'未确认']
65
+ ]))}
66
+ if(!item.connectionEvents?.length)connectionEvents.append(node('p','hint','暂无连接 / 断开记录'));body.append(connectionEvents);
67
+ const networks=workstationBlock('网络与 OpenAI 环境');
68
+ for(const network of item.lanCandidates)networks.append(workstationFields([['局域网地址',network.address],['网络',network.networkType==='wifi'?'Wi-Fi':'以太网'],['网络名称',network.networkName],['网卡',network.interfaceName]]));
69
+ if(item.officialComputer){const official=item.officialComputer;networks.append(workstationFields([['OpenAI 环境 ID',official.environmentId],['环境名称',official.name],['主机名',official.hostname],['登记时间',workstationTime(official.updatedAt)]]))}
70
+ if(!item.lanCandidates.length&&!item.officialComputer)networks.append(node('p','hint','尚未上报网络资料'));body.append(networks);
71
+ for(const phone of item.phones){
72
+ const card=workstationBlock(phone.deviceName||'手机连接记录');card.append(workstationFields([
73
+ ['手机 ID',phone.id],['平台',phone.platform],['关联账号',workstationAssociated(phone.associatedAccounts)],['当前认证账号',workstationAccount(phone.accounts,'未确认')],['任务账号',workstationAccount(phone.taskAccounts,'未记录')],
74
+ ['元数据连接',phone.metadata?'已连接':'未连接'],['设备管理连接',phone.managers.length+' 个'],['配对时间',workstationTime(phone.pairedAt)],['最近鉴权',workstationTime(phone.lastConnectedAt)],['最近局域网上报',workstationTime(phone.lastLanConnectedAt)],['上次连接时间',workstationTime(phone.lastConnection?.at)]
75
+ ]));
76
+ const channels=[...(phone.chat?[['聊天 / 管理',phone.chat]]:[]),...(phone.metadata?[['元数据',phone.metadata]]:[]),...phone.managers.map(channel=>['设备管理',channel]),...phone.transfers.map(channel=>[channel.purpose==='upload'?'文件上传':'文件下载',channel])];
77
+ for(const [name,channel] of channels)card.append(workstationFields([['通道',name],['认证账号',channel.account?.email||'未上报'],['连接时间',workstationTime(channel.connectedAt)],['来源 IP',channel.address]]));
78
+ if(phone.chat)card.append(workstationFields([['转发容量',phone.chat.relayAdmitted?(phone.chat.capacityExempt?'白名单豁免':'占用名额'):'未占用'],['待发送队列',phone.chat.queuedBytes+' 字节']]));body.append(card)
79
+ }
80
+ if(item.tasks.length){const tasks=workstationBlock('任务记录');for(const task of item.tasks)tasks.append(workstationFields([['线程 / 轮次',task.key],['手机 ID',task.clientId],['任务账号',task.account?.email||task.userId]]));body.append(tasks)}
81
+ const notes=workstationBlock('状态说明');notes.append(node('p','hint','在线表示工作站已连接云端中继,不代表内核已就绪。手机连接状态与上次连接方式独立:方式保留最近一次工作站确认的局域网 / Code Relax 中继,断开、工作站离线或云端重启不清空;未记录不推测。未确认表示云端没有足够的当前状态,不能据此判断手机未登录或工作站空闲。'),node('p','hint','局域网 / Code Relax 中继的连接、断开由新版工作站上报;健康探测、管理和文件通道不计入。工作站上报链路丢失不记作手机断开,OpenAI 中继暂未提供可靠的手机连接事件。'),node('p','hint','手机账号标为“最近确认”时来自既有验证记录,不代表当前登录;具体时间见关联账号记录。时间按北京时间显示,每 5 秒更新。'));
82
+ body.append(notes);diagnostics.append(body);content.append(diagnostics);
83
+ }
84
+ async function loadWorkstations(){
85
+ if(el('workstations').hidden||workstationController)return;const generation=workstationGeneration;const controller=workstationController=new AbortController();el('workstationRefresh').disabled=true;
86
+ try{
87
+ const result=await request('/admin/api/workstations'+(workstationId?'/'+encodeURIComponent(workstationId):''),{signal:controller.signal});if(generation!==workstationGeneration||el('workstations').hidden)return;
88
+ el('workstationError').textContent='';const signature=JSON.stringify(result.workstation||result.workstations);
89
+ if(signature!==workstationRendered){if(workstationId)renderWorkstationDetail(result);else renderWorkstationList(result);workstationRendered=signature}else el('workstationCount').textContent=workstationCaption(result)
90
+ }catch(error){if(generation!==workstationGeneration||controller.signal.aborted)return;workstationRendered='';el('workstationCount').textContent='读取失败,当前状态未确认';el('workstationContent').replaceChildren();el('workstationError').textContent=error.message}
91
+ finally{if(workstationController===controller){workstationController=null;el('workstationRefresh').disabled=false}}
92
+ }
93
+ el('workstationRefresh').addEventListener('click',()=>loadWorkstations());
94
+ el('workstationBack').addEventListener('click',()=>{if(history.state?.workstationDetail)history.back();else navigatePage('workstations')});
95
+ `;
@@ -0,0 +1,145 @@
1
+ // Explicit projections: authorization hashes, credentials, socket objects and payloads
2
+ // must never become part of the management API.
3
+ const open = entry => entry?.ws?.readyState === 1;
4
+ const socket = ws => ({ connectedAt: ws.adminInfo?.connectedAt || null,
5
+ address: ws.adminInfo?.address || null, account: ws.adminInfo?.account
6
+ ? { id: ws.adminInfo.account.id, email: ws.adminInfo.account.email } : null });
7
+
8
+ export function workstationDetail(room, debugEnabled = false) {
9
+ const online = room.host?.readyState === 1;
10
+ const connectionReportingCurrent = online && room.adminPhoneConnections !== undefined;
11
+ const tasks = online ? [...(room.usageTasks?.entries() || [])] : [];
12
+ const phones = room.clients.map(client => {
13
+ const connection = room.connections.get(client.id);
14
+ const controls = [...room.connections.values()].filter(entry => entry.control && entry.clientId === client.id && open(entry))
15
+ .map(entry => ({ purpose: 'control', ...socket(entry.ws) }));
16
+ const chat = online && open(connection) ? connection : null;
17
+ const observer = room.observers?.get(client.id);
18
+ const metadata = open(observer) ? socket(observer.ws) : null;
19
+ const managers = [...(room.deviceManagers?.entries() || [])]
20
+ .filter(([ws, id]) => id === client.id && ws.readyState === 1).map(([ws]) => socket(ws));
21
+ const transfers = online ? [...(room.uploadClients?.values() || [])]
22
+ .filter(entry => entry.clientId === client.id && open(entry))
23
+ .map(entry => ({ purpose: entry.purpose, ...socket(entry.ws) })) : [];
24
+ const activeTasks = tasks.filter(([, task]) => task.clientId === client.id).length;
25
+ const reportedConnections = online ? [...(room.adminPhoneConnections?.values() || [])]
26
+ .filter(item => item.clientId === client.id).map(item => ({ connectionId: item.connectionId, mode: item.mode })) : [];
27
+ const connected = reportedConnections.length > 0 || Boolean(chat?.userId);
28
+ const channels = [chat && socket(chat.ws), metadata, ...managers, ...transfers, ...controls].filter(Boolean);
29
+ const accounts = [...new Map(channels.filter(item => item.account)
30
+ .map(item => [item.account.id, item.account])).values()];
31
+ const taskAccounts = [...new Set(tasks.filter(([, task]) => task.clientId === client.id)
32
+ .map(([, task]) => task.userId).filter(Boolean))].map(id => accounts.find(account => account.id === id) || { id, email: null });
33
+ return {
34
+ id: client.id, deviceName: client.deviceName || null, platform: client.platform || null,
35
+ pairedAt: client.createdAt || null, lastConnectedAt: client.lastConnectedAt || null,
36
+ connected, connectionState: connected ? 'connected' : connectionReportingCurrent ? 'disconnected' : 'unconfirmed',
37
+ lastConnection: null, reportedConnections,
38
+ accounts, taskAccounts, associatedAccounts: [], metadata, managers, transfers, activeTasks,
39
+ chat: chat ? { ...socket(chat.ws), route: chat.userId ? chat.adminRoute || 'pending' : 'management',
40
+ capacityExempt: Boolean(chat.capacityExempt), relayAdmitted: Boolean(chat.relayAdmitted || chat.relayExempt),
41
+ queuedBytes: chat.queuedBytes || 0 } : null,
42
+ lastLanConnectedAt: room.adminLanConnections?.get(client.id) || null,
43
+ };
44
+ }).sort((a, b) => Number(b.connected) - Number(a.connected) ||
45
+ (b.lastConnectedAt || '').localeCompare(a.lastConnectedAt || '') || a.id.localeCompare(b.id));
46
+ const accounts = [...new Map(phones.flatMap(phone => phone.accounts).map(account => [account.id, account])).values()];
47
+ const taskAccounts = [...new Set(tasks.map(([, task]) => task.userId).filter(Boolean))]
48
+ .map(id => accounts.find(account => account.id === id) || { id, email: null });
49
+ return {
50
+ id: room.id, name: room.hostName || room.adminLastHostName || room.officialComputer?.hostname || '工作站 …' + room.id.slice(-8),
51
+ online, registeredAt: room.createdAt || null, updatedAt: room.updatedAt || null,
52
+ onlineAt: (online ? room.host.adminInfo?.connectedAt : room.adminLastOnlineAt) || null,
53
+ connection: online ? socket(room.host) : null,
54
+ pairedPhones: phones.length, connectedPhones: phones.filter(phone => phone.connected).length,
55
+ chatPhones: phones.filter(phone => phone.reportedConnections.length || phone.chat && phone.chat.route !== 'management').length,
56
+ connectionReportingCurrent,
57
+ connectionState: phones.some(phone => phone.connected) ? 'connected' : connectionReportingCurrent ? 'disconnected' : 'unconfirmed',
58
+ lastConnection: null,
59
+ metadataPhones: phones.filter(phone => phone.metadata).length,
60
+ activeTasks: tasks.length, accounts, taskAccounts, associatedAccounts: [], debugEnabled,
61
+ fileReceiverOnline: online && room.uploadHost?.readyState === 1,
62
+ lanCandidates: online ? (room.lanCandidates || []).map(item => ({ address: item.address,
63
+ networkType: item.networkType, networkName: item.networkName, interfaceName: item.interfaceName })) : [],
64
+ officialComputer: room.officialComputer ? { environmentId: room.officialComputer.environmentId,
65
+ name: room.officialComputer.name, hostname: room.officialComputer.hostname,
66
+ updatedAt: room.officialComputer.updatedAt } : null,
67
+ tasks: tasks.map(([key, task]) => ({ key, clientId: task.clientId, userId: task.userId,
68
+ account: taskAccounts.find(account => account.id === task.userId) || null })), phones,
69
+ };
70
+ }
71
+
72
+ // Previous connection mode is durable history; it never establishes current presence.
73
+ export async function resolveWorkstationConnections(workstations, events) {
74
+ const paired = new Map(workstations.map(item => [item.id, new Map(item.phones.map(phone => [phone.id, phone]))]));
75
+ for (const record of await events.latest(workstations.map(item => item.id))) {
76
+ const phone = paired.get(record.computerId)?.get(record.clientId);
77
+ if (phone) phone.lastConnection = { mode: record.mode, at: record.at };
78
+ }
79
+ for (const item of workstations) {
80
+ const last = item.phones.filter(phone => phone.lastConnection)
81
+ .sort((a, b) => b.lastConnection.at.localeCompare(a.lastConnection.at) || a.id.localeCompare(b.id))[0];
82
+ item.lastConnection = last ? { ...last.lastConnection, clientId: last.id } : null;
83
+ }
84
+ return workstations;
85
+ }
86
+
87
+ // Account association belongs to a workstation/mobile identity pair. A missing
88
+ // signaling socket says nothing about whether that phone has a login session.
89
+ // Read existing verified usage attribution without rewriting any history.
90
+ export async function resolveWorkstationAccounts(workstations, pool) {
91
+ const paired = new Map(workstations.map(item => [item.id, new Map(item.phones.map(phone => [phone.id, phone]))]));
92
+ if (pool && workstations.length) {
93
+ const [rows] = await pool.execute(`SELECT computer_id,client_id,user_id,MAX(occurred_at) AS last_verified_at
94
+ FROM relay_usage_actions WHERE computer_id IN (${workstations.map(() => '?').join(',')})
95
+ GROUP BY computer_id,client_id,user_id`, workstations.map(item => item.id));
96
+ for (const row of rows) {
97
+ const phone = paired.get(row.computer_id)?.get(row.client_id);
98
+ if (phone) phone.associatedAccounts.push({ id: row.user_id, email: null,
99
+ lastVerifiedAt: row.last_verified_at.replace(' ', 'T') + 'Z' });
100
+ }
101
+ }
102
+ const references = workstations.flatMap(item => [...item.taskAccounts,
103
+ ...item.phones.flatMap(phone => [...phone.taskAccounts, ...phone.associatedAccounts])]);
104
+ const missing = [...new Set(references.filter(account => !account.email).map(account => account.id))];
105
+ if (pool && missing.length) {
106
+ const [rows] = await pool.execute(`SELECT i.user_id,i.normalized_value AS email FROM user_login_identities i
107
+ JOIN users u ON u.id=i.user_id AND u.status='active'
108
+ WHERE i.kind='email' AND i.user_id IN (${missing.map(() => '?').join(',')})`, missing);
109
+ const emails = new Map(rows.map(row => [row.user_id, row.email]));
110
+ for (const account of references) if (!account.email) account.email = emails.get(account.id) || null;
111
+ }
112
+ for (const item of workstations) {
113
+ for (const phone of item.phones) {
114
+ const known = new Map(phone.associatedAccounts.filter(account => account.email)
115
+ .sort((a, b) => b.lastVerifiedAt.localeCompare(a.lastVerifiedAt)).map(account => [account.id, account]));
116
+ for (const account of [...phone.taskAccounts, ...phone.accounts]) if (account.email) {
117
+ known.set(account.id, { ...account, lastVerifiedAt: known.get(account.id)?.lastVerifiedAt || null });
118
+ }
119
+ phone.associatedAccounts = [...known.values()];
120
+ }
121
+ const known = new Map();
122
+ for (const phone of item.phones) for (const account of phone.associatedAccounts) {
123
+ if (!known.has(account.id) || (account.lastVerifiedAt || '') > (known.get(account.id).lastVerifiedAt || '')) known.set(account.id, account);
124
+ }
125
+ item.associatedAccounts = [...known.values()];
126
+ }
127
+ return workstations;
128
+ }
129
+
130
+ export function workstationSummary(item) {
131
+ const { phones, tasks, lanCandidates, officialComputer, fileReceiverOnline, debugEnabled, ...summary } = item;
132
+ return { ...summary, routes: workstationRoutes(phones) };
133
+ }
134
+
135
+ function workstationRoutes(phones) {
136
+ return [...new Set(phones.flatMap(phone => [...(phone.chat ? [phone.chat.route] : []),
137
+ ...phone.reportedConnections.filter(item => item.mode === 'lan' || !phone.chat).map(item => item.mode)]))];
138
+ }
139
+
140
+ export function listWorkstations(rooms, { details = false } = {}) {
141
+ const items = [...rooms.values()].filter(room => room.status === 'active').map(room => workstationDetail(room))
142
+ .sort((a, b) => Number(b.online) - Number(a.online) || (b.onlineAt || '').localeCompare(a.onlineAt || '') ||
143
+ a.name.localeCompare(b.name, 'zh-CN') || a.id.localeCompare(b.id));
144
+ return details ? items : items.map(workstationSummary);
145
+ }
@@ -0,0 +1,61 @@
1
+ import fs from 'node:fs';
2
+
3
+ const prefix = '/code-relax/android/';
4
+ const webOrigin = 'https://www.coderelax.cn';
5
+
6
+ export function readAndroidCatalog(file) {
7
+ const data = JSON.parse(fs.readFileSync(file, 'utf8'));
8
+ if (!Array.isArray(data.releases) || !data.releases.length) throw new Error('No Android releases');
9
+ const versions = new Set();
10
+ for (const item of data.releases) {
11
+ if (!Number.isSafeInteger(item.versionCode) || item.versionCode < 1 || item.versionCode > 2100000000
12
+ || versions.has(item.versionCode) || typeof item.versionName !== 'string' || !/^\d+\.\d+\.\d+\.\d+$/.test(item.versionName)
13
+ || !item.versionName.endsWith('.' + item.versionCode)
14
+ || !Number.isSafeInteger(item.size) || item.size <= 0 || !/^[a-f0-9]{64}$/.test(item.sha256)
15
+ || typeof item.objectKey !== 'string' || !/^code-relax\/android\/\d+\/[A-Za-z0-9._-]+\.apk$/.test(item.objectKey)
16
+ || typeof item.notes !== 'string' || item.notes.length > 10000) throw new Error('Invalid Android release catalog');
17
+ versions.add(item.versionCode);
18
+ }
19
+ if (!versions.has(data.latestVersionCode)) throw new Error('Latest Android release is missing');
20
+ return data;
21
+ }
22
+
23
+ export function createAndroidReleaseHandler({ catalogFile, signDownload, log = () => {} }) {
24
+ return async function handle(request, response, target) {
25
+ if (!target.pathname.startsWith(prefix)) return false;
26
+ const headers = { 'Cache-Control': 'no-store', 'Content-Type': 'application/json; charset=utf-8',
27
+ 'X-Content-Type-Options': 'nosniff', 'Referrer-Policy': 'no-referrer',
28
+ 'Access-Control-Allow-Origin': webOrigin, Vary: 'Origin' };
29
+ const reply = (code, data) => { response.writeHead(code, headers); response.end(JSON.stringify(data)); };
30
+ if (request.method !== 'GET') { reply(405, { error: 'Method not allowed' }); return true; }
31
+ if (![prefix + 'latest.json', prefix + 'download'].includes(target.pathname)) {
32
+ reply(404, { error: 'Not found' }); return true;
33
+ }
34
+ try {
35
+ if (!catalogFile || !signDownload) { reply(503, { error: 'Android release is not available' }); return true; }
36
+ const catalog = readAndroidCatalog(catalogFile);
37
+ const requested = target.searchParams.get('versionCode');
38
+ if (requested !== null && !/^[1-9]\d{0,9}$/.test(requested)) { reply(400, { error: 'Invalid version' }); return true; }
39
+ const code = target.pathname.endsWith('/latest.json') || requested === null ? catalog.latestVersionCode : Number(requested);
40
+ const release = catalog.releases.find(item => item.versionCode === code);
41
+ if (!release) { reply(404, { error: 'Release unavailable; check for updates again' }); return true; }
42
+ const { versionCode, versionName, size, sha256, notes } = release;
43
+ if (target.pathname.endsWith('/latest.json')) {
44
+ reply(200, { versionCode, versionName, size, sha256, notes }); return true;
45
+ }
46
+ // Sign only an explicitly published object, never a caller-supplied key or URL.
47
+ const ticket = await signDownload(release);
48
+ if (!ticket || new URL(ticket.url).protocol !== 'https:' || !Number.isSafeInteger(ticket.expiresAt) || ticket.expiresAt <= Date.now()) {
49
+ throw new Error('Invalid download ticket');
50
+ }
51
+ if (target.searchParams.get('redirect') === '1') {
52
+ response.writeHead(302, { ...headers, Location: ticket.url }); response.end();
53
+ } else reply(200, { versionCode, url: ticket.url, expiresAt: ticket.expiresAt });
54
+ } catch (error) {
55
+ // Provider errors may contain signed URLs or credentials. Never return or log them.
56
+ log({ event: 'android-release-error', type: error?.code === 'ENOENT' ? 'not-published' : 'configuration-or-storage' });
57
+ reply(503, { error: 'Android release is temporarily unavailable' });
58
+ }
59
+ return true;
60
+ };
61
+ }
@@ -1,26 +1,26 @@
1
- import { EventEmitter } from 'node:events';
2
- import WebSocket from 'ws';
3
- import { decode, relayAddress, send } from './wire.mjs';
4
-
5
- // Headless mobile-side adapter for the local validation. No OpenAI credentials.
6
- export function connectRelayClient({ relayUrl, room, code, credential, clientId, observe = false }) {
7
- relayAddress(relayUrl);
8
- const events = new EventEmitter(), pending = new Map();
1
+ import { EventEmitter } from 'node:events';
2
+ import WebSocket from 'ws';
3
+ import { decode, relayAddress, send } from './wire.mjs';
4
+
5
+ // Headless mobile-side adapter for the local validation. No OpenAI credentials.
6
+ export function connectRelayClient({ relayUrl, room, code, credential, clientId, accountToken, observe = false }) {
7
+ relayAddress(relayUrl);
8
+ const events = new EventEmitter(), pending = new Map();
9
9
  const socket = new WebSocket(relayUrl, { maxPayload: 64 * 1024 * 1024, perMessageDeflate: true });
10
10
  let serial = 0, connected = false, pairedCredential = credential, pairedClientId = clientId;
11
- const ready = new Promise((resolve, reject) => {
12
- const timer = setTimeout(() => { reject(new Error('Relay connection timeout')); socket.terminate(); }, 7000);
13
- socket.on('open', () => send(socket, observe ? { type: 'observe', room, credential, clientId }
14
- : code ? { type: 'pair', room, code, credential, clientId } : { type: 'resume', room, credential, clientId }));
15
- socket.on('error', error => { reject(error); events.emit('diagnostic', error.message); });
16
- socket.on('close', () => {
17
- clearTimeout(timer); connected = false; reject(new Error('Relay connection closed'));
18
- for (const request of pending.values()) { clearTimeout(request.timer); request.reject(new Error('连接断开,操作结果未确认,不自动重发')); }
19
- pending.clear(); events.emit('disconnected');
20
- });
21
- socket.on('message', (bytes, binary) => {
22
- try {
23
- const message = decode(bytes, binary);
11
+ const ready = new Promise((resolve, reject) => {
12
+ const timer = setTimeout(() => { reject(new Error('Relay connection timeout')); socket.terminate(); }, 7000);
13
+ socket.on('open', () => send(socket, observe ? { type: 'observe', room, credential, clientId, accountToken }
14
+ : code ? { type: 'pair', room, code, credential, clientId, accountToken } : { type: 'resume', room, credential, clientId, accountToken }));
15
+ socket.on('error', error => { reject(error); events.emit('diagnostic', error.message); });
16
+ socket.on('close', () => {
17
+ clearTimeout(timer); connected = false; reject(new Error('Relay connection closed'));
18
+ for (const request of pending.values()) { clearTimeout(request.timer); request.reject(new Error('连接断开,操作结果未确认,不自动重发')); }
19
+ pending.clear(); events.emit('disconnected');
20
+ });
21
+ socket.on('message', (bytes, binary) => {
22
+ try {
23
+ const message = decode(bytes, binary);
24
24
  if (message.type === 'paired') { if (message.credential) pairedCredential = message.credential; if (message.clientId) pairedClientId = message.clientId; }
25
25
  else if (message.type === 'observing') { clearTimeout(timer); connected = true; events.emit('observing', message); resolve({ room, credential: pairedCredential, clientId: pairedClientId }); }
26
26
  else if (message.type === 'computer-info') events.emit('computer-info', { hostName: message.hostName });
@@ -29,33 +29,33 @@ export function connectRelayClient({ relayUrl, room, code, credential, clientId,
29
29
  else if (message.type === 'official-computer-saved') events.emit('official-computer-saved', message.computer);
30
30
  else if (message.type === 'announcement') events.emit('announcement', message.announcement);
31
31
  else if (message.type === 'ready') { clearTimeout(timer); connected = true; resolve({ room, credential: pairedCredential, clientId: pairedClientId }); }
32
- else if (message.type === 'data') {
33
- const body = decode(message.payload, false), request = pending.get(body.id);
34
- if (body.type === 'response' && request) { clearTimeout(request.timer); pending.delete(body.id); request.resolve(body); }
35
- else events.emit('message', body);
36
- } else throw new Error('Invalid relay message');
37
- } catch (error) { reject(error); events.emit('diagnostic', error.message); socket.close(1008, 'Invalid response'); }
38
- });
39
- });
40
- return {
41
- ready, events,
42
- request(path, { method = 'GET', body, timeoutMs = 5000 } = {}) {
43
- if (!connected) return Promise.reject(new Error('Relay not ready'));
44
- const id = ++serial;
45
- return new Promise((resolve, reject) => {
46
- const timer = setTimeout(() => { pending.delete(id); reject(new Error('请求超时,结果未确认,不自动重发')); }, timeoutMs);
47
- pending.set(id, { resolve, reject, timer });
48
- if (!send(socket, { type: 'data', payload: JSON.stringify({ type: 'request', id, path, method, ...(body ? { body } : {}) }) })) {
49
- clearTimeout(timer); pending.delete(id); reject(new Error('Relay not connected'));
50
- }
51
- });
52
- },
32
+ else if (message.type === 'data') {
33
+ const body = decode(message.payload, false), request = pending.get(body.id);
34
+ if (body.type === 'response' && request) { clearTimeout(request.timer); pending.delete(body.id); request.resolve(body); }
35
+ else events.emit('message', body);
36
+ } else throw new Error('Invalid relay message');
37
+ } catch (error) { reject(error); events.emit('diagnostic', error.message); socket.close(1008, 'Invalid response'); }
38
+ });
39
+ });
40
+ return {
41
+ ready, events,
42
+ request(path, { method = 'GET', body, timeoutMs = 5000 } = {}) {
43
+ if (!connected) return Promise.reject(new Error('Relay not ready'));
44
+ const id = ++serial;
45
+ return new Promise((resolve, reject) => {
46
+ const timer = setTimeout(() => { pending.delete(id); reject(new Error('请求超时,结果未确认,不自动重发')); }, timeoutMs);
47
+ pending.set(id, { resolve, reject, timer });
48
+ if (!send(socket, { type: 'data', payload: JSON.stringify({ type: 'request', id, path, method, ...(body ? { body } : {}) }) })) {
49
+ clearTimeout(timer); pending.delete(id); reject(new Error('Relay not connected'));
50
+ }
51
+ });
52
+ },
53
53
  send(message) { if (!connected) throw new Error('Relay not ready'); return send(socket, { type: 'data', payload: JSON.stringify(message) }); },
54
54
  routeDirect() { if (!connected) throw new Error('Relay not ready'); return send(socket, { type: 'p2p-route', direct: 1 }); },
55
55
  recordOfficialComputer(computer) {
56
56
  if (!connected || !observe) throw new Error('Metadata channel not ready');
57
57
  return send(socket, { type: 'official-computer', ...computer });
58
58
  },
59
- close() { socket.terminate(); },
60
- };
61
- }
59
+ close() { socket.terminate(); },
60
+ };
61
+ }
@@ -0,0 +1,38 @@
1
+ import path from 'node:path';
2
+ import { EventEmitter } from 'node:events';
3
+ import { randomUUID } from 'node:crypto';
4
+
5
+ const reporters = new Map();
6
+
7
+ // Workstation observations only. The bounded in-memory outbox covers cloud
8
+ // reconnects, not process exit; no polling or message payloads are involved.
9
+ export function connectionReporting(stateRoot) {
10
+ let key = path.resolve(stateRoot);
11
+ if (process.platform === 'win32') key = key.toLowerCase();
12
+ if (reporters.has(key)) return reporters.get(key);
13
+ const active = new Map(), pending = new Map(), events = new EventEmitter();
14
+ function record(connection, state) {
15
+ const event = { ...connection, id: randomUUID(), state, at: new Date().toISOString() };
16
+ pending.set(event.id, event);
17
+ if (pending.size > 128) pending.delete(pending.keys().next().value);
18
+ events.emit('change', event);
19
+ }
20
+ const reporter = {
21
+ connected(connectionId, clientId, mode) {
22
+ if (active.has(connectionId)) return;
23
+ const connection = { connectionId, clientId, mode };
24
+ active.set(connectionId, connection); record(connection, 'connected');
25
+ },
26
+ disconnected(connectionId) {
27
+ const connection = active.get(connectionId);
28
+ if (!connection) return;
29
+ active.delete(connectionId); record(connection, 'disconnected');
30
+ },
31
+ snapshot: () => [...active.values()],
32
+ pending: () => [...pending.values()],
33
+ acknowledge: id => pending.delete(id),
34
+ watch(listener) { events.on('change', listener); return () => events.off('change', listener); },
35
+ };
36
+ reporters.set(key, reporter);
37
+ return reporter;
38
+ }