@walkhi/code-relax 0.1.0-beta.8 → 0.1.0-beta.80

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 (855) hide show
  1. package/README.md +67 -45
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +382 -262
  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-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +2 -2
  11. package/dist/bin/self-relay-server.mjs +43 -30
  12. package/dist/bin/set-relay-admin-password.mjs +11 -0
  13. package/dist/build-platform.json +1 -0
  14. package/dist/get-shared-service-url.ps1 +12 -4
  15. package/dist/shared/app-server-events.cjs +457 -238
  16. package/dist/shared/code-browser.cjs +159 -0
  17. package/dist/shared/file-changes.cjs +31 -0
  18. package/dist/shared/file-citations.cjs +117 -0
  19. package/dist/shared/file-mentions.cjs +92 -0
  20. package/dist/shared/message-delivery.cjs +115 -0
  21. package/dist/shared/p2p-data-channel.cjs +22 -0
  22. package/dist/shared/p2p-diagnostics.cjs +1 -1
  23. package/dist/shared/p2p-file-channel.cjs +87 -0
  24. package/dist/shared/p2p-ice-policy.cjs +22 -0
  25. package/dist/shared/plan-pricing.cjs +32 -0
  26. package/dist/shared/question-attention.cjs +69 -0
  27. package/dist/shared/release-version.cjs +31 -0
  28. package/dist/shared/server-requests.cjs +311 -67
  29. package/dist/shared/service-endpoints.cjs +21 -0
  30. package/dist/shared/timeline-sync.cjs +173 -67
  31. package/dist/skills/code-relax/SKILL.md +22 -17
  32. package/dist/src/archived-threads.mjs +22 -0
  33. package/dist/src/bounded-process-log.mjs +63 -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 +62 -42
  37. package/dist/src/dots-approval-timeline.mjs +99 -0
  38. package/dist/src/dots-avatar.mjs +42 -0
  39. package/dist/src/dots-chat-projection.mjs +50 -0
  40. package/dist/src/dots-chat-server.mjs +531 -0
  41. package/dist/src/dots-message-images.mjs +318 -0
  42. package/dist/src/dots-profile.mjs +77 -0
  43. package/dist/src/dots-room-activity.mjs +199 -0
  44. package/dist/src/dots-room-client.mjs +163 -0
  45. package/dist/src/dots-room-projection.mjs +94 -0
  46. package/dist/src/dots-schedules.mjs +66 -0
  47. package/dist/src/dots-summary-tasks.mjs +32 -0
  48. package/dist/src/dots-task-catalog.mjs +433 -0
  49. package/dist/src/dots-task-files.mjs +52 -0
  50. package/dist/src/file-transfer-range.mjs +22 -0
  51. package/dist/src/file-upload-session.mjs +153 -0
  52. package/dist/src/hosted-history-app-server.mjs +103 -0
  53. package/dist/src/hosted-history-cache.mjs +113 -0
  54. package/dist/src/lan-socket-server.mjs +269 -37
  55. package/dist/src/managed-app-server.mjs +398 -216
  56. package/dist/src/managed-endpoint.mjs +25 -0
  57. package/dist/src/message-images.mjs +0 -18
  58. package/dist/src/message-upload-files.mjs +115 -0
  59. package/dist/src/onboarding.mjs +9 -28
  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 +86 -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 +58 -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 +225 -0
  106. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  107. package/dist/src/platform/windows/desktop-host.mjs +45 -18
  108. package/dist/src/platform/windows/desktop-info.ps1 +27 -5
  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 +7 -14
  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 +15 -23
  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/runtime-discovery.mjs +67 -0
  128. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  129. package/dist/src/self-relay/account-connections.mjs +52 -0
  130. package/dist/src/self-relay/admin-auth.mjs +59 -0
  131. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  132. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  133. package/dist/src/self-relay/admin-page.mjs +87 -0
  134. package/dist/src/self-relay/admin-server.mjs +105 -0
  135. package/dist/src/self-relay/admin-state.mjs +85 -19
  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 +143 -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 +3 -4
  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 +183 -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 +255 -262
  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 +1064 -428
  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 +1592 -1797
  162. package/dist/src/service-control.mjs +17 -7
  163. package/dist/src/service-doctor.mjs +150 -70
  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 +51 -46
  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 +490 -305
  172. package/dist/src/shared-catalog.mjs +132 -50
  173. package/dist/src/shared-recovery.mjs +24 -14
  174. package/dist/src/shared-thread-stream.mjs +136 -51
  175. package/dist/src/skill-install.mjs +0 -13
  176. package/dist/src/turn-model-history.mjs +47 -0
  177. package/dist/src/usage-reset.mjs +17 -0
  178. package/dist/src/workstation-downloads.mjs +120 -0
  179. package/package.json +35 -37
  180. package/tools/postinstall.mjs +186 -146
  181. package/dist/src/app-server-client.mjs +0 -468
  182. package/dist/src/app-server-tasks.mjs +0 -358
  183. package/dist/src/debug-ui.mjs +0 -131
  184. package/dist/src/platform/windows/credential-store.mjs +0 -27
  185. package/dist/src/platform/windows/credential-store.ps1 +0 -49
  186. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  187. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  188. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  189. package/dist/src/thread-catalog.mjs +0 -47
  190. package/dist/tools/find-desktop-pipe.mjs +0 -10
  191. package/dist/web/activity-view.js +0 -283
  192. package/dist/web/approval-ui.js +0 -188
  193. package/dist/web/capabilities.js +0 -57
  194. package/dist/web/chat-transport.js +0 -202
  195. package/dist/web/chat.css +0 -782
  196. package/dist/web/chat.js +0 -3830
  197. package/dist/web/client-platform.js +0 -11
  198. package/dist/web/community-view.js +0 -20
  199. package/dist/web/community.css +0 -77
  200. package/dist/web/community.html +0 -37
  201. package/dist/web/composer-controller.js +0 -101
  202. package/dist/web/conversation-controller.js +0 -99
  203. package/dist/web/disclosure-state-controller.js +0 -95
  204. package/dist/web/draft-controller.js +0 -103
  205. package/dist/web/harmony-platform.js +0 -52
  206. package/dist/web/highlight-powershell.min.js +0 -39
  207. package/dist/web/highlight.min.js +0 -1262
  208. package/dist/web/history-cache.js +0 -240
  209. package/dist/web/history-controller.js +0 -167
  210. package/dist/web/index.html +0 -325
  211. package/dist/web/lan-session.js +0 -122
  212. package/dist/web/link-action-controller.js +0 -212
  213. package/dist/web/message-send-controller.js +0 -177
  214. package/dist/web/message-view.js +0 -98
  215. package/dist/web/p2p-data-channel.js +0 -50
  216. package/dist/web/p2p-diagnostics.js +0 -28
  217. package/dist/web/p2p-probe.js +0 -123
  218. package/dist/web/page-resume.js +0 -28
  219. package/dist/web/pending-message-store.js +0 -108
  220. package/dist/web/queue-controller.js +0 -82
  221. package/dist/web/resources.json +0 -1
  222. package/dist/web/self-relay-session.js +0 -129
  223. package/dist/web/server-requests.js +0 -67
  224. package/dist/web/station-connection-controller.js +0 -75
  225. package/dist/web/task-list-view.js +0 -296
  226. package/dist/web/thread-attention-controller.js +0 -124
  227. package/dist/web/thread-context-controller.js +0 -30
  228. package/dist/web/thread-list-controller.js +0 -61
  229. package/dist/web/thread-list-sync.js +0 -86
  230. package/dist/web/thread-title-controller.js +0 -57
  231. package/dist/web/timeline-formatters.js +0 -249
  232. package/dist/web/timeline-reducer.js +0 -81
  233. package/dist/web/timeline-renderer.js +0 -161
  234. package/dist/web/timeline-scroll-controller.js +0 -50
  235. package/dist/web/timeline-sync.js +0 -67
  236. package/dist/web/usage-controller.js +0 -258
  237. package/dist/web/vendor/README.md +0 -14
  238. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  239. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  240. package/dist/web/vendor/highlight.min.js +0 -1262
  241. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  242. package/node_modules/@img/colour/LICENSE.md +0 -82
  243. package/node_modules/@img/colour/README.md +0 -15
  244. package/node_modules/@img/colour/color.cjs +0 -1596
  245. package/node_modules/@img/colour/index.cjs +0 -1
  246. package/node_modules/@img/colour/index.d.ts +0 -929
  247. package/node_modules/@img/colour/package.json +0 -58
  248. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  249. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  250. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  251. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  252. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  253. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  254. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  255. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  256. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  257. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  258. package/node_modules/ansi-regex/index.d.ts +0 -37
  259. package/node_modules/ansi-regex/index.js +0 -10
  260. package/node_modules/ansi-regex/license +0 -9
  261. package/node_modules/ansi-regex/package.json +0 -55
  262. package/node_modules/ansi-regex/readme.md +0 -78
  263. package/node_modules/ansi-styles/index.d.ts +0 -345
  264. package/node_modules/ansi-styles/index.js +0 -163
  265. package/node_modules/ansi-styles/license +0 -9
  266. package/node_modules/ansi-styles/package.json +0 -56
  267. package/node_modules/ansi-styles/readme.md +0 -152
  268. package/node_modules/camelcase/index.d.ts +0 -63
  269. package/node_modules/camelcase/index.js +0 -76
  270. package/node_modules/camelcase/license +0 -9
  271. package/node_modules/camelcase/package.json +0 -43
  272. package/node_modules/camelcase/readme.md +0 -99
  273. package/node_modules/cliui/CHANGELOG.md +0 -76
  274. package/node_modules/cliui/LICENSE.txt +0 -14
  275. package/node_modules/cliui/README.md +0 -115
  276. package/node_modules/cliui/index.js +0 -354
  277. package/node_modules/cliui/package.json +0 -65
  278. package/node_modules/color-convert/CHANGELOG.md +0 -54
  279. package/node_modules/color-convert/LICENSE +0 -21
  280. package/node_modules/color-convert/README.md +0 -68
  281. package/node_modules/color-convert/conversions.js +0 -839
  282. package/node_modules/color-convert/index.js +0 -81
  283. package/node_modules/color-convert/package.json +0 -48
  284. package/node_modules/color-convert/route.js +0 -97
  285. package/node_modules/color-name/LICENSE +0 -8
  286. package/node_modules/color-name/README.md +0 -11
  287. package/node_modules/color-name/index.js +0 -152
  288. package/node_modules/color-name/package.json +0 -28
  289. package/node_modules/decamelize/index.js +0 -13
  290. package/node_modules/decamelize/license +0 -21
  291. package/node_modules/decamelize/package.json +0 -38
  292. package/node_modules/decamelize/readme.md +0 -48
  293. package/node_modules/detect-libc/LICENSE +0 -201
  294. package/node_modules/detect-libc/README.md +0 -163
  295. package/node_modules/detect-libc/index.d.ts +0 -14
  296. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  297. package/node_modules/detect-libc/lib/elf.js +0 -39
  298. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  299. package/node_modules/detect-libc/lib/process.js +0 -24
  300. package/node_modules/detect-libc/package.json +0 -44
  301. package/node_modules/dijkstrajs/.travis.yml +0 -4
  302. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  303. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  304. package/node_modules/dijkstrajs/README.md +0 -18
  305. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  306. package/node_modules/dijkstrajs/package.json +0 -60
  307. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  308. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  309. package/node_modules/emoji-regex/README.md +0 -73
  310. package/node_modules/emoji-regex/es2015/index.js +0 -6
  311. package/node_modules/emoji-regex/es2015/text.js +0 -6
  312. package/node_modules/emoji-regex/index.d.ts +0 -23
  313. package/node_modules/emoji-regex/index.js +0 -6
  314. package/node_modules/emoji-regex/package.json +0 -50
  315. package/node_modules/emoji-regex/text.js +0 -6
  316. package/node_modules/find-up/index.d.ts +0 -137
  317. package/node_modules/find-up/index.js +0 -89
  318. package/node_modules/find-up/license +0 -9
  319. package/node_modules/find-up/package.json +0 -53
  320. package/node_modules/find-up/readme.md +0 -156
  321. package/node_modules/get-caller-file/LICENSE.md +0 -6
  322. package/node_modules/get-caller-file/README.md +0 -41
  323. package/node_modules/get-caller-file/index.d.ts +0 -2
  324. package/node_modules/get-caller-file/index.js +0 -22
  325. package/node_modules/get-caller-file/index.js.map +0 -1
  326. package/node_modules/get-caller-file/package.json +0 -42
  327. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  328. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  329. package/node_modules/is-fullwidth-code-point/license +0 -9
  330. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  331. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  332. package/node_modules/locate-path/index.d.ts +0 -83
  333. package/node_modules/locate-path/index.js +0 -65
  334. package/node_modules/locate-path/license +0 -9
  335. package/node_modules/locate-path/package.json +0 -45
  336. package/node_modules/locate-path/readme.md +0 -122
  337. package/node_modules/node-datachannel/.clang-format +0 -17
  338. package/node_modules/node-datachannel/.editorconfig +0 -12
  339. package/node_modules/node-datachannel/.eslintignore +0 -8
  340. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  341. package/node_modules/node-datachannel/.gitmodules +0 -3
  342. package/node_modules/node-datachannel/.prettierignore +0 -7
  343. package/node_modules/node-datachannel/.prettierrc +0 -13
  344. package/node_modules/node-datachannel/API.md +0 -247
  345. package/node_modules/node-datachannel/BULDING.md +0 -26
  346. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  347. package/node_modules/node-datachannel/LICENSE +0 -373
  348. package/node_modules/node-datachannel/README.md +0 -129
  349. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  350. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  352. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  354. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  356. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  358. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  360. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  378. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  380. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  382. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  384. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  386. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  388. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  390. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  392. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  394. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  396. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  398. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  400. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  411. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  412. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  413. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  414. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  415. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  416. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  417. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  418. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  419. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  420. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  421. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  422. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  423. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  424. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  425. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  426. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  428. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  429. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  430. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  431. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  432. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  433. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  434. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  435. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  436. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  437. package/node_modules/node-datachannel/jest.config.ts +0 -14
  438. package/node_modules/node-datachannel/package.json +0 -133
  439. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  440. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  441. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  442. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  443. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  444. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  445. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  446. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  447. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  448. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  449. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  450. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  451. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  452. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  453. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  454. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  455. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  456. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  457. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  458. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  459. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  460. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  461. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  462. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  463. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  464. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  465. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  466. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  467. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  468. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  469. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  470. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  471. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  472. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  473. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  474. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  475. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  476. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  477. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  478. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  479. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  480. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  481. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  482. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  483. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  484. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  485. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  486. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  487. package/node_modules/node-datachannel/src/index.ts +0 -9
  488. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  489. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  490. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  491. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  492. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  493. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  494. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  495. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  496. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  497. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  498. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  499. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  500. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  501. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  502. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  503. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  504. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  505. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  506. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  507. package/node_modules/node-datachannel/tsconfig.json +0 -21
  508. package/node_modules/p-limit/index.d.ts +0 -38
  509. package/node_modules/p-limit/index.js +0 -57
  510. package/node_modules/p-limit/license +0 -9
  511. package/node_modules/p-limit/package.json +0 -52
  512. package/node_modules/p-limit/readme.md +0 -101
  513. package/node_modules/p-locate/index.d.ts +0 -64
  514. package/node_modules/p-locate/index.js +0 -52
  515. package/node_modules/p-locate/license +0 -9
  516. package/node_modules/p-locate/package.json +0 -53
  517. package/node_modules/p-locate/readme.md +0 -90
  518. package/node_modules/p-try/index.d.ts +0 -39
  519. package/node_modules/p-try/index.js +0 -9
  520. package/node_modules/p-try/license +0 -9
  521. package/node_modules/p-try/package.json +0 -42
  522. package/node_modules/p-try/readme.md +0 -58
  523. package/node_modules/path-exists/index.d.ts +0 -28
  524. package/node_modules/path-exists/index.js +0 -23
  525. package/node_modules/path-exists/license +0 -9
  526. package/node_modules/path-exists/package.json +0 -39
  527. package/node_modules/path-exists/readme.md +0 -52
  528. package/node_modules/pngjs/.eslintignore +0 -2
  529. package/node_modules/pngjs/.eslintrc.json +0 -19
  530. package/node_modules/pngjs/.prettierignore +0 -3
  531. package/node_modules/pngjs/LICENSE +0 -20
  532. package/node_modules/pngjs/README.md +0 -429
  533. package/node_modules/pngjs/browser.js +0 -16096
  534. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  535. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  536. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  537. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  538. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  539. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  540. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  541. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  542. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  543. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  544. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  545. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  546. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  547. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  548. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  549. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  550. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  551. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  552. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  553. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  554. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  555. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  556. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  557. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  558. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  559. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  560. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  561. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  562. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  563. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  564. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  565. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  566. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  567. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  568. package/node_modules/pngjs/lib/constants.js +0 -32
  569. package/node_modules/pngjs/lib/crc.js +0 -40
  570. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  571. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  572. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  573. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  574. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  575. package/node_modules/pngjs/lib/interlace.js +0 -95
  576. package/node_modules/pngjs/lib/packer-async.js +0 -50
  577. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  578. package/node_modules/pngjs/lib/packer.js +0 -129
  579. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  580. package/node_modules/pngjs/lib/parser-async.js +0 -165
  581. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  582. package/node_modules/pngjs/lib/parser.js +0 -290
  583. package/node_modules/pngjs/lib/png-sync.js +0 -12
  584. package/node_modules/pngjs/lib/png.js +0 -194
  585. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  586. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  587. package/node_modules/pngjs/package.json +0 -73
  588. package/node_modules/qrcode/README.md +0 -770
  589. package/node_modules/qrcode/bin/qrcode +0 -159
  590. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  591. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  592. package/node_modules/qrcode/lib/browser.js +0 -76
  593. package/node_modules/qrcode/lib/can-promise.js +0 -7
  594. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  595. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  596. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  597. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  598. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  599. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  600. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  601. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  602. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  603. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  604. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  605. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  606. package/node_modules/qrcode/lib/core/mode.js +0 -167
  607. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  608. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  609. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  610. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  611. package/node_modules/qrcode/lib/core/regex.js +0 -31
  612. package/node_modules/qrcode/lib/core/segments.js +0 -330
  613. package/node_modules/qrcode/lib/core/utils.js +0 -63
  614. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  615. package/node_modules/qrcode/lib/core/version.js +0 -163
  616. package/node_modules/qrcode/lib/index.js +0 -12
  617. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  618. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  619. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  620. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  621. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  622. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  623. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  624. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  625. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  626. package/node_modules/qrcode/lib/server.js +0 -138
  627. package/node_modules/qrcode/license +0 -10
  628. package/node_modules/qrcode/package.json +0 -77
  629. package/node_modules/require-directory/.jshintrc +0 -67
  630. package/node_modules/require-directory/.npmignore +0 -1
  631. package/node_modules/require-directory/.travis.yml +0 -3
  632. package/node_modules/require-directory/LICENSE +0 -22
  633. package/node_modules/require-directory/README.markdown +0 -184
  634. package/node_modules/require-directory/index.js +0 -86
  635. package/node_modules/require-directory/package.json +0 -40
  636. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  637. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  638. package/node_modules/require-main-filename/README.md +0 -26
  639. package/node_modules/require-main-filename/index.js +0 -18
  640. package/node_modules/require-main-filename/package.json +0 -35
  641. package/node_modules/semver/LICENSE +0 -15
  642. package/node_modules/semver/README.md +0 -680
  643. package/node_modules/semver/bin/semver.js +0 -195
  644. package/node_modules/semver/classes/comparator.js +0 -143
  645. package/node_modules/semver/classes/index.js +0 -7
  646. package/node_modules/semver/classes/range.js +0 -577
  647. package/node_modules/semver/classes/semver.js +0 -350
  648. package/node_modules/semver/functions/clean.js +0 -8
  649. package/node_modules/semver/functions/cmp.js +0 -54
  650. package/node_modules/semver/functions/coerce.js +0 -62
  651. package/node_modules/semver/functions/compare-build.js +0 -9
  652. package/node_modules/semver/functions/compare-loose.js +0 -5
  653. package/node_modules/semver/functions/compare.js +0 -7
  654. package/node_modules/semver/functions/diff.js +0 -60
  655. package/node_modules/semver/functions/eq.js +0 -5
  656. package/node_modules/semver/functions/gt.js +0 -5
  657. package/node_modules/semver/functions/gte.js +0 -5
  658. package/node_modules/semver/functions/inc.js +0 -21
  659. package/node_modules/semver/functions/lt.js +0 -5
  660. package/node_modules/semver/functions/lte.js +0 -5
  661. package/node_modules/semver/functions/major.js +0 -5
  662. package/node_modules/semver/functions/minor.js +0 -5
  663. package/node_modules/semver/functions/neq.js +0 -5
  664. package/node_modules/semver/functions/parse.js +0 -18
  665. package/node_modules/semver/functions/patch.js +0 -5
  666. package/node_modules/semver/functions/prerelease.js +0 -8
  667. package/node_modules/semver/functions/rcompare.js +0 -5
  668. package/node_modules/semver/functions/rsort.js +0 -5
  669. package/node_modules/semver/functions/satisfies.js +0 -12
  670. package/node_modules/semver/functions/sort.js +0 -5
  671. package/node_modules/semver/functions/truncate.js +0 -48
  672. package/node_modules/semver/functions/valid.js +0 -8
  673. package/node_modules/semver/index.js +0 -93
  674. package/node_modules/semver/internal/constants.js +0 -37
  675. package/node_modules/semver/internal/debug.js +0 -11
  676. package/node_modules/semver/internal/identifiers.js +0 -29
  677. package/node_modules/semver/internal/lrucache.js +0 -42
  678. package/node_modules/semver/internal/parse-options.js +0 -17
  679. package/node_modules/semver/internal/re.js +0 -223
  680. package/node_modules/semver/package.json +0 -78
  681. package/node_modules/semver/preload.js +0 -4
  682. package/node_modules/semver/range.bnf +0 -17
  683. package/node_modules/semver/ranges/gtr.js +0 -6
  684. package/node_modules/semver/ranges/intersects.js +0 -9
  685. package/node_modules/semver/ranges/ltr.js +0 -6
  686. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  687. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  688. package/node_modules/semver/ranges/min-version.js +0 -63
  689. package/node_modules/semver/ranges/outside.js +0 -82
  690. package/node_modules/semver/ranges/simplify.js +0 -49
  691. package/node_modules/semver/ranges/subset.js +0 -249
  692. package/node_modules/semver/ranges/to-comparators.js +0 -10
  693. package/node_modules/semver/ranges/valid.js +0 -13
  694. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  695. package/node_modules/set-blocking/LICENSE.txt +0 -14
  696. package/node_modules/set-blocking/README.md +0 -31
  697. package/node_modules/set-blocking/index.js +0 -7
  698. package/node_modules/set-blocking/package.json +0 -42
  699. package/node_modules/sharp/LICENSE +0 -191
  700. package/node_modules/sharp/README.md +0 -112
  701. package/node_modules/sharp/dist/channel.cjs +0 -177
  702. package/node_modules/sharp/dist/channel.mjs +0 -177
  703. package/node_modules/sharp/dist/colour.cjs +0 -199
  704. package/node_modules/sharp/dist/colour.mjs +0 -199
  705. package/node_modules/sharp/dist/composite.cjs +0 -213
  706. package/node_modules/sharp/dist/composite.mjs +0 -213
  707. package/node_modules/sharp/dist/constructor.cjs +0 -511
  708. package/node_modules/sharp/dist/constructor.mjs +0 -511
  709. package/node_modules/sharp/dist/index.cjs +0 -25
  710. package/node_modules/sharp/dist/index.d.cts +0 -1999
  711. package/node_modules/sharp/dist/index.d.mts +0 -2046
  712. package/node_modules/sharp/dist/index.mjs +0 -25
  713. package/node_modules/sharp/dist/input.cjs +0 -819
  714. package/node_modules/sharp/dist/input.mjs +0 -819
  715. package/node_modules/sharp/dist/is.cjs +0 -143
  716. package/node_modules/sharp/dist/is.mjs +0 -143
  717. package/node_modules/sharp/dist/libvips.cjs +0 -212
  718. package/node_modules/sharp/dist/libvips.mjs +0 -212
  719. package/node_modules/sharp/dist/operation.cjs +0 -1002
  720. package/node_modules/sharp/dist/operation.mjs +0 -1002
  721. package/node_modules/sharp/dist/output.cjs +0 -1785
  722. package/node_modules/sharp/dist/output.mjs +0 -1785
  723. package/node_modules/sharp/dist/resize.cjs +0 -617
  724. package/node_modules/sharp/dist/resize.mjs +0 -617
  725. package/node_modules/sharp/dist/sharp.cjs +0 -174
  726. package/node_modules/sharp/dist/sharp.mjs +0 -174
  727. package/node_modules/sharp/dist/utility.cjs +0 -301
  728. package/node_modules/sharp/dist/utility.mjs +0 -301
  729. package/node_modules/sharp/install/build.js +0 -38
  730. package/node_modules/sharp/lib/index.d.ts +0 -1999
  731. package/node_modules/sharp/package.json +0 -227
  732. package/node_modules/sharp/src/binding.gyp +0 -303
  733. package/node_modules/sharp/src/common.cc +0 -1186
  734. package/node_modules/sharp/src/common.h +0 -421
  735. package/node_modules/sharp/src/metadata.cc +0 -404
  736. package/node_modules/sharp/src/metadata.h +0 -95
  737. package/node_modules/sharp/src/operations.cc +0 -516
  738. package/node_modules/sharp/src/operations.h +0 -137
  739. package/node_modules/sharp/src/pipeline.cc +0 -1948
  740. package/node_modules/sharp/src/pipeline.h +0 -422
  741. package/node_modules/sharp/src/sharp.cc +0 -43
  742. package/node_modules/sharp/src/stats.cc +0 -186
  743. package/node_modules/sharp/src/stats.h +0 -62
  744. package/node_modules/sharp/src/utilities.cc +0 -289
  745. package/node_modules/sharp/src/utilities.h +0 -22
  746. package/node_modules/string-width/index.d.ts +0 -29
  747. package/node_modules/string-width/index.js +0 -47
  748. package/node_modules/string-width/license +0 -9
  749. package/node_modules/string-width/package.json +0 -56
  750. package/node_modules/string-width/readme.md +0 -50
  751. package/node_modules/strip-ansi/index.d.ts +0 -17
  752. package/node_modules/strip-ansi/index.js +0 -4
  753. package/node_modules/strip-ansi/license +0 -9
  754. package/node_modules/strip-ansi/package.json +0 -54
  755. package/node_modules/strip-ansi/readme.md +0 -46
  756. package/node_modules/which-module/LICENSE +0 -13
  757. package/node_modules/which-module/README.md +0 -58
  758. package/node_modules/which-module/index.js +0 -9
  759. package/node_modules/which-module/package.json +0 -41
  760. package/node_modules/wrap-ansi/index.js +0 -186
  761. package/node_modules/wrap-ansi/license +0 -9
  762. package/node_modules/wrap-ansi/package.json +0 -61
  763. package/node_modules/wrap-ansi/readme.md +0 -97
  764. package/node_modules/ws/LICENSE +0 -20
  765. package/node_modules/ws/README.md +0 -548
  766. package/node_modules/ws/browser.js +0 -8
  767. package/node_modules/ws/index.js +0 -22
  768. package/node_modules/ws/lib/buffer-util.js +0 -131
  769. package/node_modules/ws/lib/constants.js +0 -19
  770. package/node_modules/ws/lib/event-target.js +0 -292
  771. package/node_modules/ws/lib/extension.js +0 -203
  772. package/node_modules/ws/lib/limiter.js +0 -55
  773. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  774. package/node_modules/ws/lib/receiver.js +0 -743
  775. package/node_modules/ws/lib/sender.js +0 -607
  776. package/node_modules/ws/lib/stream.js +0 -161
  777. package/node_modules/ws/lib/subprotocol.js +0 -62
  778. package/node_modules/ws/lib/validation.js +0 -152
  779. package/node_modules/ws/lib/websocket-server.js +0 -562
  780. package/node_modules/ws/lib/websocket.js +0 -1407
  781. package/node_modules/ws/package.json +0 -74
  782. package/node_modules/ws/wrapper.mjs +0 -21
  783. package/node_modules/y18n/CHANGELOG.md +0 -35
  784. package/node_modules/y18n/LICENSE +0 -13
  785. package/node_modules/y18n/README.md +0 -109
  786. package/node_modules/y18n/index.js +0 -188
  787. package/node_modules/y18n/package.json +0 -39
  788. package/node_modules/yargs/CHANGELOG.md +0 -420
  789. package/node_modules/yargs/LICENSE +0 -21
  790. package/node_modules/yargs/README.md +0 -140
  791. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  792. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  793. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  794. package/node_modules/yargs/build/lib/argsert.js +0 -65
  795. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  796. package/node_modules/yargs/build/lib/command.js +0 -416
  797. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  798. package/node_modules/yargs/build/lib/common-types.js +0 -25
  799. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  800. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  801. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  802. package/node_modules/yargs/build/lib/completion.js +0 -135
  803. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  804. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  805. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  806. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  807. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  808. package/node_modules/yargs/build/lib/middleware.js +0 -57
  809. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  810. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  811. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  812. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  813. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  814. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  815. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  816. package/node_modules/yargs/build/lib/usage.js +0 -540
  817. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  818. package/node_modules/yargs/build/lib/validation.js +0 -330
  819. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  820. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  821. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  822. package/node_modules/yargs/build/lib/yerror.js +0 -11
  823. package/node_modules/yargs/index.js +0 -40
  824. package/node_modules/yargs/locales/be.json +0 -46
  825. package/node_modules/yargs/locales/de.json +0 -46
  826. package/node_modules/yargs/locales/en.json +0 -51
  827. package/node_modules/yargs/locales/es.json +0 -46
  828. package/node_modules/yargs/locales/fi.json +0 -49
  829. package/node_modules/yargs/locales/fr.json +0 -53
  830. package/node_modules/yargs/locales/hi.json +0 -49
  831. package/node_modules/yargs/locales/hu.json +0 -46
  832. package/node_modules/yargs/locales/id.json +0 -50
  833. package/node_modules/yargs/locales/it.json +0 -46
  834. package/node_modules/yargs/locales/ja.json +0 -51
  835. package/node_modules/yargs/locales/ko.json +0 -49
  836. package/node_modules/yargs/locales/nb.json +0 -44
  837. package/node_modules/yargs/locales/nl.json +0 -49
  838. package/node_modules/yargs/locales/nn.json +0 -44
  839. package/node_modules/yargs/locales/pirate.json +0 -13
  840. package/node_modules/yargs/locales/pl.json +0 -49
  841. package/node_modules/yargs/locales/pt.json +0 -45
  842. package/node_modules/yargs/locales/pt_BR.json +0 -48
  843. package/node_modules/yargs/locales/ru.json +0 -46
  844. package/node_modules/yargs/locales/th.json +0 -46
  845. package/node_modules/yargs/locales/tr.json +0 -48
  846. package/node_modules/yargs/locales/zh_CN.json +0 -48
  847. package/node_modules/yargs/locales/zh_TW.json +0 -47
  848. package/node_modules/yargs/package.json +0 -92
  849. package/node_modules/yargs/yargs.js +0 -14
  850. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  851. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  852. package/node_modules/yargs-parser/README.md +0 -449
  853. package/node_modules/yargs-parser/index.js +0 -1032
  854. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  855. package/node_modules/yargs-parser/package.json +0 -46
@@ -0,0 +1,103 @@
1
+ import { SharedAppServer } from './shared-app-server.mjs';
2
+ import { historyCacheScope, completedHistory, turnMetadata } from './hosted-history-cache.mjs';
3
+
4
+ // Hosted history uses a disk range cache; local kernel history retains its own storage.
5
+ export class HostedHistoryAppServer extends SharedAppServer {
6
+ constructor(url, historyCache) {
7
+ super(url);
8
+ this.historyCache = historyCache;
9
+ this.historyHeadKey = 'latest';
10
+ this.diskHeads = new Map(); this.invalidatedTurns = new Set(); this.windowSaves = new Map();
11
+ this.historyVersions = new Map();
12
+ this.on('disconnected', () => { this.diskHeads.clear(); this.invalidatedTurns.clear(); this.historyVersions.clear(); });
13
+ }
14
+
15
+ historyScope(threadId) { return historyCacheScope(this.historyIdentity, this.historySource, threadId); }
16
+ historyVersion(threadId) { return `${this.epoch}:${this.historyVersions.get(threadId) || 0}`; }
17
+
18
+ async restoreHistoryHead(threadId) {
19
+ const scope = this.historyScope(threadId);
20
+ const result = await this.historyCache?.get(scope, this.historyHeadKey);
21
+ if (scope !== this.historyScope(threadId)) throw new Error('云端账号连接已变化,请重新读取历史。');
22
+ return result;
23
+ }
24
+
25
+ saveHistoryWindow(threadId, immediate = false) {
26
+ const record = this.threads.get(threadId), scope = this.historyScope(threadId);
27
+ if (!this.historyCache || !scope || !record || record.hydrating || record.needsReload
28
+ || record.historyTrimmed || record.metadataOnly || record.readOnly || !completedHistory(record.thread.turns)) return;
29
+ const value = structuredClone({ updatedAt: record.thread.updatedAt, turns: record.thread.turns,
30
+ nextCursor: record.nextCursor, revision: record.thread.chatRevision,
31
+ ...(record.approvalBeforeMs !== undefined ? { approvalBeforeMs: record.approvalBeforeMs } : {}) });
32
+ const pending = this.windowSaves.get(scope);
33
+ if (pending) { clearTimeout(pending); this.windowSaves.delete(scope); }
34
+ const save = () => { this.windowSaves.delete(scope); return this.historyCache.put(scope, this.historyHeadKey, value); };
35
+ if (immediate) return save();
36
+ const timer = setTimeout(save, 200); timer.unref(); this.windowSaves.set(scope, timer);
37
+ }
38
+
39
+ invalidateHistory(method, params) {
40
+ const id = params.threadId || params.thread?.id, scope = this.historyScope(id);
41
+ if (!scope || !this.historyCache) return;
42
+ const turnId = params.turnId || params.turn?.id;
43
+ const whole = ['thread/deleted', 'thread/compacted'].includes(method);
44
+ if (!whole && (!turnId || !/^(?:item\/|turn\/)/.test(method))) return;
45
+ this.historyVersions.set(id, (this.historyVersions.get(id) || 0) + 1);
46
+ clearTimeout(this.windowSaves.get(scope)); this.windowSaves.delete(scope);
47
+ const key = `${scope}:${turnId}`;
48
+ if (whole || !this.invalidatedTurns.has(key)) {
49
+ this.invalidatedTurns.add(key); this.diskHeads.delete(id);
50
+ void this.historyCache.invalidate(scope, whole ? undefined : turnId);
51
+ }
52
+ if (whole) {
53
+ const record = this.threads.get(id);
54
+ if (record) record.needsReload = true;
55
+ this.emit('history-invalidated', id);
56
+ }
57
+ if (method === 'turn/completed') this.invalidatedTurns.delete(key);
58
+ }
59
+
60
+ async compactTurn(threadId, turn, cursor = null, apply, limit = 100) {
61
+ const scope = this.historyScope(threadId), candidate = this.diskHeads.get(threadId);
62
+ const version = this.historyVersion(threadId);
63
+ if (cursor && !turn.status && this.historyCache) {
64
+ const final = await this.historyCache.get(scope, `turn:${turn.id}`);
65
+ if (scope !== this.historyScope(threadId)) throw new Error('云端账号连接已变化,请重新读取历史。');
66
+ if (final) turn = { ...final.turns[0], ...turn };
67
+ }
68
+ const saved = !cursor && candidate?.head?.turns.find(value => value.id === turn.id);
69
+ if (scope && this.historyCache && saved && candidate.scope === scope && candidate.updatedAt != null
70
+ && candidate.head.updatedAt === candidate.updatedAt && completedHistory([saved])
71
+ && turnMetadata(saved) === turnMetadata(turn)) {
72
+ const result = { ...saved, ...turn, items: saved.items, itemPage: saved.itemPage };
73
+ apply?.(result); return result;
74
+ }
75
+ const result = await super.compactTurn(threadId, turn, cursor, apply, limit);
76
+ if (this.historyCache && scope === this.historyScope(threadId) && version === this.historyVersion(threadId)
77
+ && completedHistory([{ ...turn, items: [] }])) {
78
+ const { items, itemPage, ...metadata } = turn;
79
+ await this.historyCache.put(scope, `turn:${turn.id}`, { turns: [metadata] });
80
+ }
81
+ return result;
82
+ }
83
+
84
+ async history(threadId, cursor, options = {}) {
85
+ await this.connect();
86
+ let position;
87
+ try { position = JSON.parse(cursor); } catch { position = null; }
88
+ if (position?.threadId !== threadId) return super.history(threadId, cursor, options);
89
+ const scope = this.historyScope(threadId);
90
+ const version = this.historyVersion(threadId);
91
+ const key = JSON.stringify(['history', position.turnId, position.itemCursor, position.turnCursor, options.itemLimit ?? 100]);
92
+ const cached = await this.historyCache?.get(scope, key);
93
+ if (scope !== this.historyScope(threadId)) throw new Error('云端账号连接已变化,请重新读取历史。');
94
+ if (cached && version === this.historyVersion(threadId)) return { thread: { id: threadId, turns: cached.turns },
95
+ nextCursor: cached.position ? JSON.stringify(cached.position) : null };
96
+ const result = await super.history(threadId, cursor, options);
97
+ if (scope === this.historyScope(threadId) && version === this.historyVersion(threadId) && completedHistory(result.thread.turns)) {
98
+ const next = result.nextCursor ? JSON.parse(result.nextCursor) : null;
99
+ await this.historyCache?.put(scope, key, { turns: result.thread.turns, position: next });
100
+ }
101
+ return result;
102
+ }
103
+ }
@@ -0,0 +1,113 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+
5
+ const threadBudget = 8 * 1024 * 1024;
6
+ const totalBudget = 128 * 1024 * 1024;
7
+ const digest = value => createHash('sha256').update(JSON.stringify(value)).digest('hex');
8
+
9
+ // Store confirmed ranges, not connection tokens, execution context or image bytes.
10
+ export function historyCacheScope(identity, source, threadId) {
11
+ return identity?.accountId && threadId ? digest([identity.accountId, identity.userId || '', source, threadId]) : null;
12
+ }
13
+
14
+ export function completedHistory(turns) {
15
+ if (!turns?.length || turns.some(turn => !['completed', 'failed', 'interrupted'].includes(turn.status)
16
+ || turn.cacheStub || turn.items?.some(item => item.dotsStreaming
17
+ || item.type === 'imageGeneration' && !item.savedPath && item.result))) return false;
18
+ // Signed media addresses and embedded bytes must be reread/refreshed, not replayed from disk.
19
+ const media = value => value && typeof value === 'object' && Object.entries(value).some(([key, part]) =>
20
+ typeof part === 'string' && (/^data:/.test(part) || /[?&](?:X-Amz-|X-Goog-|signature=|sig=|token=)/i.test(part))
21
+ || key === 'imageBytes' || media(part));
22
+ return !media(turns);
23
+ }
24
+
25
+ export function turnMetadata(turn) {
26
+ return digest(Object.entries(turn || {}).filter(([key]) => !['items', 'itemPage', 'cacheStub'].includes(key))
27
+ .sort(([a], [b]) => a.localeCompare(b)));
28
+ }
29
+
30
+ export class HostedHistoryCache {
31
+ constructor(stateRoot, { report = error => console.error(`托管历史缓存失败:${error.message}`), maxThreadBytes = threadBudget, maxTotalBytes = totalBudget } = {}) {
32
+ this.directory = path.join(stateRoot, 'hosted-history');
33
+ this.report = report; this.maxThreadBytes = maxThreadBytes; this.maxTotalBytes = maxTotalBytes;
34
+ this.tail = Promise.resolve();
35
+ }
36
+
37
+ async record(scope) {
38
+ try {
39
+ const record = JSON.parse(await fs.readFile(path.join(this.directory, `${scope}.json`), 'utf8'));
40
+ if (record.version !== 1 || !record.entries || Array.isArray(record.entries) || typeof record.entries !== 'object') {
41
+ throw new Error('历史缓存结构无效,需重新读取云端历史。');
42
+ }
43
+ if (Object.values(record.entries).some(entry => !Number.isFinite(entry.at) || !entry.value
44
+ || !Array.isArray(entry.value.turns) && !Array.isArray(entry.value.data))) {
45
+ throw new Error('历史缓存页结构无效,需重新读取云端历史。');
46
+ }
47
+ return record;
48
+ } catch (error) { if (error.code !== 'ENOENT') this.report(error); return { version: 1, entries: {} }; }
49
+ }
50
+
51
+ run(operation, fallback) {
52
+ const work = this.tail.then(operation).catch(error => { this.report(error); return fallback; });
53
+ this.tail = work.then(() => {}); return work;
54
+ }
55
+
56
+ get(scope, key) {
57
+ if (!scope) return Promise.resolve(null);
58
+ return this.run(async () => (await this.record(scope)).entries?.[key]?.value ?? null, null);
59
+ }
60
+
61
+ put(scope, key, value) {
62
+ if (!scope) return Promise.resolve();
63
+ // Freeze before queuing; live events may mutate the source window during disk I/O.
64
+ const snapshot = structuredClone(value);
65
+ return this.run(async () => {
66
+ const record = await this.record(scope);
67
+ record.entries ||= {};
68
+ record.entries[key] = { at: Date.now(), value: snapshot };
69
+ let text = JSON.stringify(record);
70
+ for (const [oldKey] of Object.entries(record.entries).sort((a, b) => a[1].at - b[1].at)) {
71
+ if (Buffer.byteLength(text) <= this.maxThreadBytes) break;
72
+ delete record.entries[oldKey]; text = JSON.stringify(record);
73
+ }
74
+ await this.write(scope, text);
75
+ await this.prune(scope);
76
+ });
77
+ }
78
+
79
+ invalidate(scope, turnId) {
80
+ if (!scope) return Promise.resolve();
81
+ return this.run(async () => {
82
+ const record = await this.record(scope);
83
+ for (const [key, entry] of Object.entries(record.entries || {})) {
84
+ if (!turnId || entry.value.turnIds?.includes(turnId) || entry.value.turns?.some(turn => turn.id === turnId)
85
+ || entry.value.thread?.turns?.some(turn => turn.id === turnId)) delete record.entries[key];
86
+ }
87
+ await this.write(scope, JSON.stringify(record));
88
+ });
89
+ }
90
+
91
+ async write(scope, text) {
92
+ if (!/^[a-f0-9]{64}$/.test(scope)) throw new Error('历史缓存身份无效');
93
+ await fs.mkdir(this.directory, { recursive: true, mode: 0o700 });
94
+ const file = path.join(this.directory, `${scope}.json`), temporary = `${file}.tmp`;
95
+ try {
96
+ await fs.writeFile(temporary, text, { mode: 0o600 });
97
+ await fs.rename(temporary, file);
98
+ } finally {
99
+ try { await fs.unlink(temporary); } catch (error) { if (error.code !== 'ENOENT') this.report(error); }
100
+ }
101
+ }
102
+
103
+ async prune(current) {
104
+ const files = await Promise.all((await fs.readdir(this.directory)).filter(name => /^[a-f0-9]{64}\.json$/.test(name))
105
+ .map(async name => ({ name, ...await fs.stat(path.join(this.directory, name)) })));
106
+ let bytes = files.reduce((sum, file) => sum + file.size, 0);
107
+ for (const file of files.sort((a, b) => a.mtimeMs - b.mtimeMs)) {
108
+ if (bytes <= this.maxTotalBytes) break;
109
+ if (file.name === `${current}.json`) continue;
110
+ await fs.unlink(path.join(this.directory, file.name)); bytes -= file.size;
111
+ }
112
+ }
113
+ }
@@ -1,35 +1,188 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import crypto from 'node:crypto';
3
3
  import { WebSocketServer, WebSocket } from 'ws';
4
+ import timelineSync from '../shared/timeline-sync.cjs';
5
+ import { createFileUploadSession, FILE_CHUNK_BYTES, MAX_FILE_BYTES, MAX_FILE_COUNT, MAX_TOTAL_BYTES } from './file-upload-session.mjs';
6
+ import { FILE_READ_LIMIT } from './file-transfer-range.mjs';
4
7
 
5
8
  // One authenticated connection carries requests and explicitly owned subscriptions.
6
9
  // The dispatcher is shared business routing, not an HTTP loopback proxy.
7
- export function attachLanSocket(server, { token, dispatch, authorizeDevice = () => false }) {
8
- // Allow four individually valid images to reach the aggregate-size validator,
9
- // so an oversized composition returns an error instead of dropping the connection.
10
- const wss = new WebSocketServer({ noServer: true, maxPayload: 48 * 1024 * 1024, perMessageDeflate: false });
10
+ export function attachLanSocket(server, { token, dispatch, authorizeDevice = () => false, onDeviceAuthorizationsChanged, onDeviceConnected,
11
+ onPhoneConnected, onPhoneDisconnected, uploadsRoot }) {
12
+ // Allow four individually valid images to reach the aggregate-size validator,
13
+ // so an oversized composition returns an error instead of dropping the connection.
14
+ const wss = new WebSocketServer({ noServer: true, maxPayload: 48 * 1024 * 1024, perMessageDeflate: false });
15
+ const uploadWss = new WebSocketServer({ noServer: true, maxPayload: 512 * 1024, perMessageDeflate: false });
16
+ const activeUploads = new Map();
17
+ const uploadSessions = new Map();
18
+ let closing = false;
19
+ const expireUpload = async (id, entry) => {
20
+ if (uploadSessions.get(id) !== entry) return;
21
+ uploadSessions.delete(id);
22
+ clearTimeout(entry.timer);
23
+ await entry.session.close();
24
+ };
25
+ const deviceConnections = new Map();
26
+ const stopWatching = onDeviceAuthorizationsChanged?.(() => {
27
+ for (const connection of deviceConnections.values()) {
28
+ if (!authorizeDevice(connection.clientId, connection.credential)) connection.revoke();
29
+ }
30
+ });
11
31
  server.on('upgrade', (request, socket, head) => {
12
32
  const origin = request.headers.origin;
13
- let allowed = request.url === '/api/socket';
14
- // Packaged ArkWeb pages have an opaque ("null") origin; device authentication remains required.
15
- if (origin && origin !== 'null') {
16
- try {
17
- const originUrl = new URL(origin);
18
- const requestUrl = new URL(`http://${request.headers.host}`);
19
- const nativeClient = request.headers['x-code-relax-native'] === '1';
20
- allowed &&= ['http:', 'https:'].includes(originUrl.protocol) &&
21
- (originUrl.host === request.headers.host || (nativeClient && originUrl.hostname === requestUrl.hostname));
22
- }
23
- catch { allowed = false; }
33
+ const upload = request.url === '/api/file-transfer' && Boolean(uploadsRoot);
34
+ let allowed = request.url === '/api/socket' || upload;
35
+ // Packaged ArkWeb pages have an opaque ("null") origin; device authentication remains required.
36
+ if (origin && origin !== 'null') {
37
+ try {
38
+ const originUrl = new URL(origin);
39
+ const requestUrl = new URL(`http://${request.headers.host}`);
40
+ const nativeClient = request.headers['x-code-relax-native'] === '1';
41
+ allowed &&= ['http:', 'https:'].includes(originUrl.protocol) &&
42
+ (originUrl.host === request.headers.host || (nativeClient && originUrl.hostname === requestUrl.hostname));
43
+ }
44
+ catch { allowed = false; }
24
45
  }
25
46
  if (!allowed) { socket.end('HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n'); return; }
26
- wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws));
47
+ const target = upload ? uploadWss : wss;
48
+ target.handleUpgrade(request, socket, head, ws => target.emit('connection', ws));
49
+ });
50
+ uploadWss.on('connection', ws => {
51
+ let authenticated = false, stopped = false, identity = '', upload, purpose, chunk, uploadEntry, uploadId, fileRelay = false;
52
+ let release, discardUpload = false;
53
+ const released = new Promise(resolve => { release = resolve; });
54
+ let queued = 0;
55
+ let pending = Promise.resolve();
56
+ const authTimer = setTimeout(() => ws.close(1008, 'Authentication required'), 5000);
57
+ const reply = value => { if (!stopped && ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify(value)); };
58
+ ws.on('error', () => {});
59
+ const stop = () => {
60
+ if (stopped) return;
61
+ stopped = true;
62
+ deviceConnections.delete(ws);
63
+ clearTimeout(authTimer);
64
+ void pending.finally(async () => {
65
+ activeUploads.delete(ws);
66
+ if (uploadEntry) {
67
+ uploadEntry.ws = null;
68
+ if (discardUpload || closing) await expireUpload(uploadId, uploadEntry);
69
+ else {
70
+ uploadEntry.timer = setTimeout(() => { void expireUpload(uploadId, uploadEntry); }, 5 * 60 * 1000);
71
+ uploadEntry.timer.unref();
72
+ }
73
+ }
74
+ release();
75
+ });
76
+ };
77
+ ws.on('close', stop);
78
+ ws.on('message', (bytes, binary) => {
79
+ if (stopped || ws.readyState !== WebSocket.OPEN) return;
80
+ // Three upload chunks may be in flight, each with a header and binary frame.
81
+ if (++queued > 8) { stop(); ws.close(1013, 'File request queue exceeded'); return; }
82
+ pending = pending.then(async () => {
83
+ if (stopped || ws.readyState !== WebSocket.OPEN) return;
84
+ if (binary) {
85
+ if (!authenticated || purpose !== 'upload' || !chunk || bytes.length !== chunk.length) throw new Error('无效的文件分片');
86
+ const current = chunk; chunk = undefined;
87
+ reply(await upload.receive({ ...current, data: bytes }, { relayed: fileRelay })); return;
88
+ }
89
+ if (bytes.length > 16 * 1024 || chunk) throw new Error('无效的文件请求');
90
+ const message = JSON.parse(bytes.toString());
91
+ if (!authenticated) {
92
+ purpose = message.purpose;
93
+ if (!['upload', 'download'].includes(purpose)) throw new Error('文件通道用途无效');
94
+ if (message?.type === 'device-auth' && typeof message.clientId === 'string' &&
95
+ authorizeDevice(message.clientId, message.credential) === true) identity = `device:${message.clientId}`;
96
+ else if (token && message?.type === 'auth' && typeof message.token === 'string') {
97
+ const supplied = Buffer.from(message.token), expected = Buffer.from(token || '');
98
+ if (supplied.length === expected.length && crypto.timingSafeEqual(supplied, expected)) {
99
+ identity = typeof message.relayClientId === 'string' && message.relayClientId.length <= 200
100
+ ? `relay:${message.relayClientId}` : 'local-token';
101
+ fileRelay = message.fileRelay === true;
102
+ }
103
+ }
104
+ if (identity && purpose === 'upload') {
105
+ uploadId = message.uploadSessionId;
106
+ if (typeof uploadId !== 'string' || !/^[a-f0-9-]{36}$/.test(uploadId)) throw new Error('上传批次编号无效');
107
+ const entry = uploadSessions.get(uploadId);
108
+ if (entry) {
109
+ if (entry.identity !== identity) throw new Error('上传批次身份不一致');
110
+ if (entry.ws) { entry.ws.terminate(); await entry.released; }
111
+ if (uploadSessions.get(uploadId) !== entry) throw new Error('上传批次已失效,无法确认原批次状态');
112
+ } else if (message.resumeUpload) throw new Error('上传断点已过期或工作站已重启,请重新发送');
113
+ }
114
+ // Taking over a connection can await an in-flight disk write. The new
115
+ // socket and its authorization must still be live when that finishes.
116
+ if (stopped || closing || ws.readyState !== WebSocket.OPEN) return;
117
+ if (message.type === 'device-auth' && !authorizeDevice(message.clientId, message.credential)) throw new Error('设备授权已失效');
118
+ const same = [...activeUploads.values()].filter(item => item.identity === identity && item.purpose === purpose);
119
+ const uploads = [...activeUploads.values()].filter(item => item.purpose === 'upload').length;
120
+ if (!identity || same.length >= (purpose === 'upload' ? 1 : 3) || activeUploads.size >= 8 ||
121
+ (purpose === 'upload' && uploads >= 2)) throw new Error('文件身份无效或文件任务过多');
122
+ if (message.type === 'device-auth') deviceConnections.set(ws, {
123
+ clientId: message.clientId, credential: message.credential,
124
+ revoke() { discardUpload = true; stop(); ws.close(4401, 'Device authorization revoked'); },
125
+ });
126
+ activeUploads.set(ws, { identity, purpose }); authenticated = true; clearTimeout(authTimer);
127
+ if (message.type === 'device-auth') onDeviceConnected?.(message.clientId, message);
128
+ if (purpose === 'upload') {
129
+ uploadEntry = uploadSessions.get(uploadId);
130
+ if (!uploadEntry) {
131
+ if ([...uploadSessions.values()].filter(entry => !entry.committed).length >= 2) throw new Error('待完成上传批次过多,请稍后再试');
132
+ if (uploadSessions.size >= 32) {
133
+ const oldest = [...uploadSessions].find(([, entry]) => entry.committed && !entry.ws);
134
+ if (!oldest) throw new Error('上传批次过多,请稍后再试');
135
+ await expireUpload(...oldest);
136
+ }
137
+ if (stopped || closing || ws.readyState !== WebSocket.OPEN) return;
138
+ uploadEntry = { identity, session: createFileUploadSession(uploadsRoot) };
139
+ uploadSessions.set(uploadId, uploadEntry);
140
+ }
141
+ clearTimeout(uploadEntry.timer);
142
+ Object.assign(uploadEntry, { ws, released });
143
+ upload = uploadEntry.session;
144
+ }
145
+ reply({ type: 'ready', version: 4, purpose, maxDownloadBytes: fileRelay ? FILE_READ_LIMIT : null, maxFileBytes: fileRelay ? MAX_FILE_BYTES : null, maxFileCount: MAX_FILE_COUNT,
146
+ maxTotalBytes: fileRelay ? MAX_TOTAL_BYTES : null, chunkBytes: FILE_CHUNK_BYTES, uploadSessionId: uploadId });
147
+ return;
148
+ }
149
+ if (purpose === 'download') {
150
+ if (fileRelay && /^\/api\/desktop\/frames\//.test(message.path || '')) throw new Error('桌面画面仅支持直连');
151
+ if (message.type !== 'read' || typeof message.path !== 'string' || message.path.length > 12000 ||
152
+ !/^\/api\/(?:images\/[a-f0-9]{64}|files\/(?:local|[a-f0-9]{64})|code\/(?:image|binary)|desktop\/frames\/[a-f0-9]{32})(?:\?|$)/.test(message.path) || message.path.includes('#')) throw new Error('无效的文件读取请求');
153
+ await dispatch({ method: 'GET', url: message.path, headers: {}, socketRequest: true, fileTransfer: true }, {
154
+ json(status, body) { reply({ type: 'error', status, error: body?.error || '文件读取失败' }); },
155
+ filePart(metadata, data) {
156
+ if (stopped || ws.readyState !== WebSocket.OPEN) return;
157
+ if (fileRelay && metadata.size > FILE_READ_LIMIT) throw new Error('服务器转发仅支持下载不超过 20 MiB 的文件,请使用局域网或 RTC 直连');
158
+ if (!Buffer.isBuffer(data) || data.length > FILE_CHUNK_BYTES || ws.bufferedAmount > 1024 * 1024) throw new Error('文件接收过慢或分片无效');
159
+ reply({ type: 'part', ...metadata, length: data.length });
160
+ ws.send(data);
161
+ },
162
+ });
163
+ return;
164
+ }
165
+ if (message.type === 'chunk') {
166
+ if (!Number.isSafeInteger(message.length) || message.length < 1 || message.length > FILE_CHUNK_BYTES) throw new Error('文件分片大小无效');
167
+ chunk = message; return;
168
+ }
169
+ reply(await upload.receive(message, { relayed: fileRelay }));
170
+ if (message.type === 'commit') uploadEntry.committed = true;
171
+ if (message.type === 'cancel') {
172
+ await expireUpload(uploadId, uploadEntry);
173
+ uploadEntry = null;
174
+ }
175
+ }).catch(error => { reply({ type: 'error', error: error.message }); discardUpload = true; stop(); ws.close(1008, 'File request rejected'); })
176
+ .finally(() => { queued--; });
177
+ });
27
178
  });
28
179
  wss.on('connection', ws => {
29
- let authenticated = false, alive = true;
180
+ let authenticated = false, alive = true, stopped = false;
181
+ let phone, reported = false;
182
+ const connectionId = crypto.randomUUID();
30
183
  const active = new Map();
31
184
  const send = value => {
32
- if (ws.readyState !== WebSocket.OPEN) return;
185
+ if (stopped || ws.readyState !== WebSocket.OPEN) return;
33
186
  if (ws.bufferedAmount > 64 * 1024 * 1024) { ws.close(1013, 'Client too slow'); return; }
34
187
  ws.send(JSON.stringify(value));
35
188
  };
@@ -40,62 +193,135 @@ export function attachLanSocket(server, { token, dispatch, authorizeDevice = ()
40
193
  }, 30000);
41
194
  ws.on('pong', () => { alive = true; });
42
195
  ws.on('error', () => {}); // close rejects requests and releases every subscription.
43
- ws.on('close', () => {
196
+ const stop = () => {
197
+ if (stopped) return;
198
+ stopped = true;
199
+ deviceConnections.delete(ws);
44
200
  clearTimeout(authTimer); clearInterval(heartbeat);
201
+ if (reported) onPhoneDisconnected?.(connectionId);
45
202
  for (const reply of active.values()) reply.end();
46
203
  active.clear();
47
- });
204
+ };
205
+ ws.on('close', stop);
48
206
  ws.on('message', async (bytes, binary) => {
207
+ if (stopped || ws.readyState !== WebSocket.OPEN) return;
49
208
  let message;
50
209
  try { if (binary) throw new Error(); message = JSON.parse(bytes.toString()); }
51
210
  catch { ws.close(1008, 'Invalid JSON'); return; }
52
211
  if (!message || typeof message !== 'object') { ws.close(1008, 'Invalid message'); return; }
53
- if (!authenticated) {
54
- let accepted = false;
55
- if (message.type === 'device-auth') {
56
- accepted = authorizeDevice(message.clientId, message.credential) === true;
57
- } else if (message.type === 'auth') {
58
- const supplied = Buffer.from(typeof message.token === 'string' ? message.token : '');
59
- const expected = Buffer.from(token || '');
60
- accepted = supplied.length === expected.length && crypto.timingSafeEqual(supplied, expected);
61
- }
62
- if (!accepted) {
63
- ws.close(1008, 'Authentication failed'); return;
64
- }
212
+ if (!authenticated) {
213
+ let accepted = false;
214
+ if (message.type === 'device-auth') {
215
+ accepted = authorizeDevice(message.clientId, message.credential) === true;
216
+ } else if (message.type === 'auth') {
217
+ const supplied = Buffer.from(typeof message.token === 'string' ? message.token : '');
218
+ const expected = Buffer.from(token || '');
219
+ accepted = supplied.length === expected.length && crypto.timingSafeEqual(supplied, expected);
220
+ }
221
+ if (!accepted) {
222
+ ws.close(1008, 'Authentication failed'); return;
223
+ }
224
+ if (message.type === 'device-auth') phone = { clientId: message.clientId, mode: 'lan' };
225
+ else if (typeof message.relayClientId === 'string' && /^[\w-]{16,128}$/.test(message.relayClientId)) {
226
+ phone = { clientId: message.relayClientId, mode: 'self-relay' };
227
+ }
228
+ if (message.type === 'device-auth') onDeviceConnected?.(message.clientId, message);
229
+ if (message.type === 'device-auth') deviceConnections.set(ws, {
230
+ clientId: message.clientId, credential: message.credential,
231
+ revoke() { stop(); ws.close(4401, 'Device authorization revoked'); },
232
+ });
65
233
  authenticated = true; clearTimeout(authTimer); send({ type: 'ready', version: 1 }); return;
66
234
  }
67
235
  const { id, type } = message;
68
236
  if (!Number.isSafeInteger(id) || id < 1) { ws.close(1008, 'Invalid request id'); return; }
237
+ if (type === 'response-ack') { active.get(id)?.acknowledge?.(message.batch); return; }
238
+ if (type === 'cancel') { active.get(id)?.end(); return; }
69
239
  if (type === 'unsubscribe') { const reply = active.get(id); if (reply?.subscription) reply.end(); return; }
70
240
  if (!['request', 'subscribe'].includes(type) || active.has(id)) { ws.close(1008, 'Invalid request'); return; }
71
241
  const subscription = type === 'subscribe';
72
242
  const path = message.path;
73
- const isStream = typeof path === 'string' && /^\/api\/(?:usage-events|shared-recovery\/events|threads\/[^/?]+\/events)(?:\?|$)/.test(path);
74
- if (active.size >= 32 || (subscription && [...active.values()].filter(r => r.subscription).length >= 4)) {
243
+ const isStream = typeof path === 'string' && /^\/api\/(?:usage-events|thread-events|turn-events|health\/events|shared-recovery\/events|threads\/[^/?]+\/(?:events|dots-activity-events))(?:\?|$)/.test(path);
244
+ // Native recovery, usage, catalog, current chat, and the main Dot's sidebar
245
+ // share one station connection (including when viewing a delegated task).
246
+ if (active.size >= 32 || (subscription && [...active.values()].filter(r => r.subscription).length >= 5)) {
75
247
  send({ type: 'response', id, status: 429, body: { error: '同时进行的请求过多' } }); return;
76
248
  }
77
249
  if (typeof path !== 'string' || !path.startsWith('/api/') || path.includes('#') ||
78
250
  path.startsWith('/api/attachments/') || path === '/api/socket' || path === '/api/uploads' ||
79
- subscription !== isStream || !['GET', 'POST', 'DELETE'].includes(message.method || 'GET') ||
251
+ subscription !== isStream || !['GET', 'POST', 'PUT', 'DELETE'].includes(message.method || 'GET') ||
80
252
  (subscription && message.method && message.method !== 'GET') ||
81
253
  (message.body !== undefined && (!message.body || typeof message.body !== 'object' || Array.isArray(message.body)))) {
82
254
  send({ type: 'response', id, status: 400, body: { error: '无效的连接请求' } }); return;
83
255
  }
256
+ // Health probes, management and file sockets are not chat connections.
257
+ // Three message sources share this catalog/events entry point.
258
+ if (phone && !reported && /^\/api\/(?:threads(?:\?|$)|thread-events(?:\?|$)|threads\/[^/?]+\/(?:events|dots-activity-events)(?:\?|$))/.test(path)) {
259
+ reported = true;
260
+ onPhoneConnected?.(connectionId, phone.clientId, phone.mode);
261
+ }
84
262
  const reply = new EventEmitter();
263
+ let waiting, batch = 0;
264
+ const sendPart = (pieces, pageEnd = false) => new Promise((resolve, reject) => {
265
+ const timer = setTimeout(() => reject(new Error('历史接收确认超时')), 20000);
266
+ waiting = { resolve, reject, timer, batch: ++batch };
267
+ send({ type: subscription ? 'event-part' : 'response-part', id, batch, pieces, ...(pageEnd ? { pageEnd: true } : {}) });
268
+ });
269
+ const sendTimeline = async (status, body, event) => {
270
+ if (event) batch = 0;
271
+ try {
272
+ for (const pieces of timelineSync.timelineBatches(body)) {
273
+ if (reply.writableEnded) return;
274
+ await sendPart(pieces);
275
+ }
276
+ if (!reply.writableEnded) {
277
+ send(event ? { type: 'event', id, event, streamed: true } : { type: 'response', id, status, streamed: true });
278
+ if (!event) reply.end();
279
+ }
280
+ } catch (error) {
281
+ if (!reply.writableEnded) {
282
+ send(event ? { type: 'event', id, event: 'bridge-error', data: { error: error.message } }
283
+ : { type: 'response', id, status: 500, body: { error: error.message } });
284
+ reply.end();
285
+ }
286
+ }
287
+ };
85
288
  Object.assign(reply, {
86
289
  subscription, headersSent: false, writableEnded: false, destroyed: false,
290
+ async historyPage(page) {
291
+ const parts = timelineSync.timelineBatches(page);
292
+ let part = parts.next();
293
+ while (!part.done) {
294
+ if (this.writableEnded) throw new Error('历史读取已取消');
295
+ const next = parts.next();
296
+ await sendPart(part.value, next.done);
297
+ part = next;
298
+ }
299
+ },
87
300
  json(status, body) {
88
301
  if (this.writableEnded) return;
302
+ if (status < 400 && body?.schemaVersion === 1 && Array.isArray(body.turns)) {
303
+ void sendTimeline(status, body); return;
304
+ }
89
305
  send({ type: 'response', id, status, body }); this.end();
90
306
  },
307
+ acknowledge(sequence) {
308
+ if (!waiting || sequence !== waiting.batch) return;
309
+ const completed = waiting; waiting = null; clearTimeout(completed.timer);
310
+ this.emit('progress'); completed.resolve();
311
+ },
91
312
  startEvents() {
92
313
  if (this.writableEnded) return;
93
314
  this.headersSent = true; send({ type: 'subscribed', id });
94
315
  },
95
- event(event, data) { if (!this.writableEnded) send({ type: 'event', id, event, data }); },
316
+ event(event, data) {
317
+ if (this.writableEnded) return;
318
+ if (event === 'update' && data?.schemaVersion === 1) return sendTimeline(200, data, event);
319
+ send({ type: 'event', id, event, data });
320
+ },
96
321
  end() {
97
322
  if (this.writableEnded) return;
98
323
  this.writableEnded = this.destroyed = true; active.delete(id);
324
+ if (waiting) { clearTimeout(waiting.timer); waiting.reject(new Error('历史读取已取消')); waiting = null; }
99
325
  if (subscription) send({ type: 'end', id });
100
326
  this.emit('close');
101
327
  },
@@ -105,5 +331,11 @@ export function attachLanSocket(server, { token, dispatch, authorizeDevice = ()
105
331
  catch (error) { reply.json(500, { error: error.message }); }
106
332
  });
107
333
  });
108
- return { close() { for (const ws of wss.clients) ws.terminate(); wss.close(); } };
334
+ return { close() {
335
+ closing = true;
336
+ stopWatching?.();
337
+ for (const ws of wss.clients) ws.terminate(); wss.close();
338
+ for (const ws of uploadWss.clients) ws.terminate(); uploadWss.close();
339
+ for (const [id, entry] of uploadSessions) if (!entry.ws) void expireUpload(id, entry);
340
+ } };
109
341
  }