@walkhi/code-relax 0.1.0-beta.9 → 0.1.0-beta.91

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 (850) hide show
  1. package/README.md +67 -44
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +382 -261
  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 +1 -1
  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 +452 -235
  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 +100 -0
  27. package/dist/shared/release-version.cjs +31 -0
  28. package/dist/shared/server-requests.cjs +347 -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/browser-auth-operations.mjs +46 -0
  35. package/dist/src/celsius-client.mjs +107 -0
  36. package/dist/src/code-browser.mjs +99 -0
  37. package/dist/src/desktop-launcher.mjs +57 -32
  38. package/dist/src/desktop-operation.mjs +46 -0
  39. package/dist/src/dots-approval-timeline.mjs +99 -0
  40. package/dist/src/dots-avatar.mjs +42 -0
  41. package/dist/src/dots-chat-projection.mjs +50 -0
  42. package/dist/src/dots-chat-server.mjs +623 -0
  43. package/dist/src/dots-message-images.mjs +318 -0
  44. package/dist/src/dots-profile.mjs +77 -0
  45. package/dist/src/dots-room-activity.mjs +199 -0
  46. package/dist/src/dots-room-client.mjs +163 -0
  47. package/dist/src/dots-room-projection.mjs +94 -0
  48. package/dist/src/dots-schedules.mjs +66 -0
  49. package/dist/src/dots-summary-tasks.mjs +32 -0
  50. package/dist/src/dots-task-catalog.mjs +433 -0
  51. package/dist/src/dots-task-files.mjs +52 -0
  52. package/dist/src/file-transfer-range.mjs +22 -0
  53. package/dist/src/file-upload-session.mjs +151 -0
  54. package/dist/src/hosted-history-app-server.mjs +103 -0
  55. package/dist/src/hosted-history-cache.mjs +113 -0
  56. package/dist/src/lan-socket-server.mjs +266 -37
  57. package/dist/src/managed-app-server.mjs +398 -216
  58. package/dist/src/managed-endpoint.mjs +25 -0
  59. package/dist/src/message-upload-files.mjs +111 -0
  60. package/dist/src/onboarding.mjs +9 -27
  61. package/dist/src/plan-pricing.mjs +47 -0
  62. package/dist/src/platform/README.md +7 -12
  63. package/dist/src/platform/codex-protocol.mjs +51 -0
  64. package/dist/src/platform/codex-runtime.mjs +4 -0
  65. package/dist/src/platform/credential-store.mjs +19 -0
  66. package/dist/src/platform/desktop-host.mjs +3 -0
  67. package/dist/src/platform/desktop-permission-mode.mjs +17 -0
  68. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  69. package/dist/src/platform/desktop-project-store.mjs +219 -0
  70. package/dist/src/platform/file-opener.mjs +9 -0
  71. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  72. package/dist/src/platform/linux/desktop-host.mjs +87 -0
  73. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  74. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  75. package/dist/src/platform/linux/network-info.mjs +11 -0
  76. package/dist/src/platform/linux/process.mjs +53 -0
  77. package/dist/src/platform/linux/project-locations.mjs +17 -0
  78. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  79. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  80. package/dist/src/platform/linux/service-host.mjs +18 -0
  81. package/dist/src/platform/linux/system.mjs +50 -0
  82. package/dist/src/platform/linux/user-environment.mjs +31 -0
  83. package/dist/src/platform/macos/codex-runtime.mjs +121 -0
  84. package/dist/src/platform/macos/desktop-host.mjs +114 -0
  85. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  86. package/dist/src/platform/macos/network-info.mjs +8 -0
  87. package/dist/src/platform/macos/project-locations.mjs +8 -0
  88. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  89. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  90. package/dist/src/platform/macos/service-host.mjs +18 -0
  91. package/dist/src/platform/macos/system.mjs +29 -0
  92. package/dist/src/platform/macos/user-environment.mjs +31 -0
  93. package/dist/src/platform/managed-user-environment.mjs +78 -0
  94. package/dist/src/platform/native-package.mjs +61 -0
  95. package/dist/src/platform/network-info.mjs +3 -0
  96. package/dist/src/platform/path-identity.mjs +5 -0
  97. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  98. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  99. package/dist/src/platform/power-inhibitor.mjs +22 -0
  100. package/dist/src/platform/project-locations.mjs +3 -0
  101. package/dist/src/platform/runtime-paths.mjs +8 -0
  102. package/dist/src/platform/select.mjs +5 -0
  103. package/dist/src/platform/service-host.mjs +3 -0
  104. package/dist/src/platform/user-environment.mjs +3 -0
  105. package/dist/src/platform/windows/activate-desktop.ps1 +49 -0
  106. package/dist/src/platform/windows/codex-runtime.mjs +225 -0
  107. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  108. package/dist/src/platform/windows/desktop-host.mjs +45 -18
  109. package/dist/src/platform/windows/desktop-info.ps1 +27 -5
  110. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  111. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  112. package/dist/src/platform/windows/desktop-shortcuts.ps1 +6 -13
  113. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  114. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  115. package/dist/src/platform/windows/launch-worker.mjs +41 -42
  116. package/dist/src/platform/windows/project-locations.mjs +16 -0
  117. package/dist/src/platform/windows/resident-start.js +20 -0
  118. package/dist/src/platform/windows/resident-startup.ps1 +27 -11
  119. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  120. package/dist/src/platform/windows/service-host.mjs +17 -22
  121. package/dist/src/platform/windows/start-hidden-console.ps1 +11 -2
  122. package/dist/src/platform/windows/user-environment.mjs +52 -50
  123. package/dist/src/project-create.mjs +121 -0
  124. package/dist/src/project-management.mjs +59 -0
  125. package/dist/src/project-remove.mjs +55 -0
  126. package/dist/src/project-update.mjs +59 -0
  127. package/dist/src/relay-config-import.mjs +45 -0
  128. package/dist/src/runtime-discovery.mjs +67 -0
  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-cloud.mjs +101 -0
  133. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  134. package/dist/src/self-relay/admin-page.mjs +87 -54
  135. package/dist/src/self-relay/admin-server.mjs +105 -0
  136. package/dist/src/self-relay/admin-state.mjs +69 -16
  137. package/dist/src/self-relay/admin-style.mjs +58 -0
  138. package/dist/src/self-relay/admin-workstations-page.mjs +95 -0
  139. package/dist/src/self-relay/admin-workstations.mjs +143 -0
  140. package/dist/src/self-relay/android-releases.mjs +61 -0
  141. package/dist/src/self-relay/client.mjs +45 -45
  142. package/dist/src/self-relay/connection-reporting.mjs +38 -0
  143. package/dist/src/self-relay/connector.mjs +456 -145
  144. package/dist/src/self-relay/demo.mjs +1 -1
  145. package/dist/src/self-relay/device-info.mjs +27 -0
  146. package/dist/src/self-relay/device-store.mjs +10 -2
  147. package/dist/src/self-relay/diagnostics.mjs +54 -0
  148. package/dist/src/self-relay/email-accounts.mjs +195 -0
  149. package/dist/src/self-relay/file-wire.mjs +76 -0
  150. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  151. package/dist/src/self-relay/lifecycle.mjs +252 -259
  152. package/dist/src/self-relay/long-pairing.mjs +40 -0
  153. package/dist/src/self-relay/mysql-state.mjs +118 -0
  154. package/dist/src/self-relay/p2p-probe.mjs +168 -123
  155. package/dist/src/self-relay/phone-connections.mjs +55 -0
  156. package/dist/src/self-relay/privacy-page.mjs +26 -0
  157. package/dist/src/self-relay/public-releases.mjs +67 -0
  158. package/dist/src/self-relay/rtc-file-bridge.mjs +46 -0
  159. package/dist/src/self-relay/server.mjs +1065 -424
  160. package/dist/src/self-relay/usage-daily.mjs +55 -0
  161. package/dist/src/self-relay/usage-meter.mjs +141 -0
  162. package/dist/src/server.mjs +1434 -723
  163. package/dist/src/service-control.mjs +17 -7
  164. package/dist/src/service-doctor.mjs +150 -70
  165. package/dist/src/service-health.mjs +2 -2
  166. package/dist/src/service-install.mjs +16 -10
  167. package/dist/src/service-lifecycle.mjs +52 -42
  168. package/dist/src/service-power.mjs +58 -0
  169. package/dist/src/service-restart.mjs +45 -12
  170. package/dist/src/service-update-worker.mjs +42 -0
  171. package/dist/src/service-update.mjs +80 -0
  172. package/dist/src/shared-app-server.mjs +511 -307
  173. package/dist/src/shared-catalog.mjs +132 -50
  174. package/dist/src/shared-recovery.mjs +22 -12
  175. package/dist/src/shared-thread-stream.mjs +143 -51
  176. package/dist/src/skill-install.mjs +0 -13
  177. package/dist/src/thread-goals.mjs +40 -0
  178. package/dist/src/turn-model-history.mjs +47 -0
  179. package/dist/src/usage-reset.mjs +17 -0
  180. package/dist/src/workstation-downloads.mjs +120 -0
  181. package/package.json +48 -48
  182. package/tools/postinstall.mjs +186 -146
  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-shortcut-run.ps1 +0 -5
  187. package/dist/web/activity-view.js +0 -283
  188. package/dist/web/approval-ui.js +0 -188
  189. package/dist/web/capabilities.js +0 -50
  190. package/dist/web/chat-transport.js +0 -196
  191. package/dist/web/chat.css +0 -781
  192. package/dist/web/chat.js +0 -3812
  193. package/dist/web/client-platform.js +0 -11
  194. package/dist/web/community.css +0 -82
  195. package/dist/web/community.html +0 -36
  196. package/dist/web/composer-controller.js +0 -97
  197. package/dist/web/conversation-controller.js +0 -99
  198. package/dist/web/disclosure-state-controller.js +0 -95
  199. package/dist/web/draft-controller.js +0 -103
  200. package/dist/web/harmony-platform.js +0 -52
  201. package/dist/web/highlight-powershell.min.js +0 -39
  202. package/dist/web/highlight.min.js +0 -1262
  203. package/dist/web/history-cache.js +0 -240
  204. package/dist/web/history-controller.js +0 -167
  205. package/dist/web/index.html +0 -293
  206. package/dist/web/lan-session.js +0 -122
  207. package/dist/web/link-action-controller.js +0 -212
  208. package/dist/web/message-send-controller.js +0 -177
  209. package/dist/web/message-view.js +0 -98
  210. package/dist/web/p2p-data-channel.js +0 -50
  211. package/dist/web/p2p-diagnostics.js +0 -28
  212. package/dist/web/p2p-probe.js +0 -123
  213. package/dist/web/page-resume.js +0 -28
  214. package/dist/web/pending-message-store.js +0 -108
  215. package/dist/web/queue-controller.js +0 -82
  216. package/dist/web/resources.json +0 -1
  217. package/dist/web/self-relay-session.js +0 -129
  218. package/dist/web/server-requests.js +0 -67
  219. package/dist/web/station-connection-controller.js +0 -75
  220. package/dist/web/task-list-view.js +0 -289
  221. package/dist/web/thread-attention-controller.js +0 -124
  222. package/dist/web/thread-context-controller.js +0 -30
  223. package/dist/web/thread-list-controller.js +0 -61
  224. package/dist/web/thread-list-sync.js +0 -86
  225. package/dist/web/thread-title-controller.js +0 -57
  226. package/dist/web/timeline-formatters.js +0 -249
  227. package/dist/web/timeline-reducer.js +0 -77
  228. package/dist/web/timeline-renderer.js +0 -161
  229. package/dist/web/timeline-scroll-controller.js +0 -50
  230. package/dist/web/timeline-sync.js +0 -67
  231. package/dist/web/usage-controller.js +0 -258
  232. package/dist/web/vendor/README.md +0 -14
  233. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  234. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  235. package/dist/web/vendor/highlight.min.js +0 -1262
  236. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  237. package/node_modules/@img/colour/LICENSE.md +0 -82
  238. package/node_modules/@img/colour/README.md +0 -15
  239. package/node_modules/@img/colour/color.cjs +0 -1596
  240. package/node_modules/@img/colour/index.cjs +0 -1
  241. package/node_modules/@img/colour/index.d.ts +0 -929
  242. package/node_modules/@img/colour/package.json +0 -58
  243. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  244. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  245. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  246. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  247. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  248. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  249. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  250. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  251. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  252. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  253. package/node_modules/ansi-regex/index.d.ts +0 -37
  254. package/node_modules/ansi-regex/index.js +0 -10
  255. package/node_modules/ansi-regex/license +0 -9
  256. package/node_modules/ansi-regex/package.json +0 -55
  257. package/node_modules/ansi-regex/readme.md +0 -78
  258. package/node_modules/ansi-styles/index.d.ts +0 -345
  259. package/node_modules/ansi-styles/index.js +0 -163
  260. package/node_modules/ansi-styles/license +0 -9
  261. package/node_modules/ansi-styles/package.json +0 -56
  262. package/node_modules/ansi-styles/readme.md +0 -152
  263. package/node_modules/camelcase/index.d.ts +0 -63
  264. package/node_modules/camelcase/index.js +0 -76
  265. package/node_modules/camelcase/license +0 -9
  266. package/node_modules/camelcase/package.json +0 -43
  267. package/node_modules/camelcase/readme.md +0 -99
  268. package/node_modules/cliui/CHANGELOG.md +0 -76
  269. package/node_modules/cliui/LICENSE.txt +0 -14
  270. package/node_modules/cliui/README.md +0 -115
  271. package/node_modules/cliui/index.js +0 -354
  272. package/node_modules/cliui/package.json +0 -65
  273. package/node_modules/color-convert/CHANGELOG.md +0 -54
  274. package/node_modules/color-convert/LICENSE +0 -21
  275. package/node_modules/color-convert/README.md +0 -68
  276. package/node_modules/color-convert/conversions.js +0 -839
  277. package/node_modules/color-convert/index.js +0 -81
  278. package/node_modules/color-convert/package.json +0 -48
  279. package/node_modules/color-convert/route.js +0 -97
  280. package/node_modules/color-name/LICENSE +0 -8
  281. package/node_modules/color-name/README.md +0 -11
  282. package/node_modules/color-name/index.js +0 -152
  283. package/node_modules/color-name/package.json +0 -28
  284. package/node_modules/decamelize/index.js +0 -13
  285. package/node_modules/decamelize/license +0 -21
  286. package/node_modules/decamelize/package.json +0 -38
  287. package/node_modules/decamelize/readme.md +0 -48
  288. package/node_modules/detect-libc/LICENSE +0 -201
  289. package/node_modules/detect-libc/README.md +0 -163
  290. package/node_modules/detect-libc/index.d.ts +0 -14
  291. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  292. package/node_modules/detect-libc/lib/elf.js +0 -39
  293. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  294. package/node_modules/detect-libc/lib/process.js +0 -24
  295. package/node_modules/detect-libc/package.json +0 -44
  296. package/node_modules/dijkstrajs/.travis.yml +0 -4
  297. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  298. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  299. package/node_modules/dijkstrajs/README.md +0 -18
  300. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  301. package/node_modules/dijkstrajs/package.json +0 -60
  302. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  303. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  304. package/node_modules/emoji-regex/README.md +0 -73
  305. package/node_modules/emoji-regex/es2015/index.js +0 -6
  306. package/node_modules/emoji-regex/es2015/text.js +0 -6
  307. package/node_modules/emoji-regex/index.d.ts +0 -23
  308. package/node_modules/emoji-regex/index.js +0 -6
  309. package/node_modules/emoji-regex/package.json +0 -50
  310. package/node_modules/emoji-regex/text.js +0 -6
  311. package/node_modules/find-up/index.d.ts +0 -137
  312. package/node_modules/find-up/index.js +0 -89
  313. package/node_modules/find-up/license +0 -9
  314. package/node_modules/find-up/package.json +0 -53
  315. package/node_modules/find-up/readme.md +0 -156
  316. package/node_modules/get-caller-file/LICENSE.md +0 -6
  317. package/node_modules/get-caller-file/README.md +0 -41
  318. package/node_modules/get-caller-file/index.d.ts +0 -2
  319. package/node_modules/get-caller-file/index.js +0 -22
  320. package/node_modules/get-caller-file/index.js.map +0 -1
  321. package/node_modules/get-caller-file/package.json +0 -42
  322. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  323. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  324. package/node_modules/is-fullwidth-code-point/license +0 -9
  325. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  326. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  327. package/node_modules/locate-path/index.d.ts +0 -83
  328. package/node_modules/locate-path/index.js +0 -65
  329. package/node_modules/locate-path/license +0 -9
  330. package/node_modules/locate-path/package.json +0 -45
  331. package/node_modules/locate-path/readme.md +0 -122
  332. package/node_modules/node-datachannel/.clang-format +0 -17
  333. package/node_modules/node-datachannel/.editorconfig +0 -12
  334. package/node_modules/node-datachannel/.eslintignore +0 -8
  335. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  336. package/node_modules/node-datachannel/.gitmodules +0 -3
  337. package/node_modules/node-datachannel/.prettierignore +0 -7
  338. package/node_modules/node-datachannel/.prettierrc +0 -13
  339. package/node_modules/node-datachannel/API.md +0 -247
  340. package/node_modules/node-datachannel/BULDING.md +0 -26
  341. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  342. package/node_modules/node-datachannel/LICENSE +0 -373
  343. package/node_modules/node-datachannel/README.md +0 -129
  344. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  345. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  346. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  347. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  348. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  349. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  350. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  351. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  352. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  353. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  354. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  355. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  377. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  378. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  379. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  380. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  381. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  382. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  383. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  384. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  385. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  386. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  387. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  388. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  389. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  390. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  391. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  392. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  393. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  394. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  395. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  411. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  412. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  413. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  414. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  415. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  416. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  417. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  418. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  419. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  420. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  421. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  426. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  428. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  429. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  430. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  431. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  432. package/node_modules/node-datachannel/jest.config.ts +0 -14
  433. package/node_modules/node-datachannel/package.json +0 -133
  434. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  435. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  436. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  437. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  438. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  439. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  440. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  441. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  442. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  443. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  444. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  445. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  446. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  447. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  448. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  449. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  450. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  451. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  452. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  453. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  454. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  455. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  456. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  457. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  458. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  459. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  460. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  461. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  462. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  463. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  464. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  465. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  466. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  467. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  468. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  469. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  470. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  471. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  472. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  473. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  474. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  475. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  476. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  477. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  478. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  479. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  480. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  481. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  482. package/node_modules/node-datachannel/src/index.ts +0 -9
  483. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  484. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  485. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  486. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  487. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  488. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  489. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  490. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  491. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  492. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  493. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  494. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  495. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  496. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  497. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  498. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  499. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  500. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  501. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  502. package/node_modules/node-datachannel/tsconfig.json +0 -21
  503. package/node_modules/p-limit/index.d.ts +0 -38
  504. package/node_modules/p-limit/index.js +0 -57
  505. package/node_modules/p-limit/license +0 -9
  506. package/node_modules/p-limit/package.json +0 -52
  507. package/node_modules/p-limit/readme.md +0 -101
  508. package/node_modules/p-locate/index.d.ts +0 -64
  509. package/node_modules/p-locate/index.js +0 -52
  510. package/node_modules/p-locate/license +0 -9
  511. package/node_modules/p-locate/package.json +0 -53
  512. package/node_modules/p-locate/readme.md +0 -90
  513. package/node_modules/p-try/index.d.ts +0 -39
  514. package/node_modules/p-try/index.js +0 -9
  515. package/node_modules/p-try/license +0 -9
  516. package/node_modules/p-try/package.json +0 -42
  517. package/node_modules/p-try/readme.md +0 -58
  518. package/node_modules/path-exists/index.d.ts +0 -28
  519. package/node_modules/path-exists/index.js +0 -23
  520. package/node_modules/path-exists/license +0 -9
  521. package/node_modules/path-exists/package.json +0 -39
  522. package/node_modules/path-exists/readme.md +0 -52
  523. package/node_modules/pngjs/.eslintignore +0 -2
  524. package/node_modules/pngjs/.eslintrc.json +0 -19
  525. package/node_modules/pngjs/.prettierignore +0 -3
  526. package/node_modules/pngjs/LICENSE +0 -20
  527. package/node_modules/pngjs/README.md +0 -429
  528. package/node_modules/pngjs/browser.js +0 -16096
  529. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  530. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  531. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  532. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  533. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  534. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  535. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  536. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  537. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  538. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  539. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  540. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  541. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  542. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  543. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  544. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  545. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  546. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  547. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  548. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  549. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  550. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  551. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  552. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  553. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  554. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  555. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  556. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  557. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  558. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  559. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  560. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  561. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  562. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  563. package/node_modules/pngjs/lib/constants.js +0 -32
  564. package/node_modules/pngjs/lib/crc.js +0 -40
  565. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  566. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  567. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  568. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  569. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  570. package/node_modules/pngjs/lib/interlace.js +0 -95
  571. package/node_modules/pngjs/lib/packer-async.js +0 -50
  572. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  573. package/node_modules/pngjs/lib/packer.js +0 -129
  574. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  575. package/node_modules/pngjs/lib/parser-async.js +0 -165
  576. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  577. package/node_modules/pngjs/lib/parser.js +0 -290
  578. package/node_modules/pngjs/lib/png-sync.js +0 -12
  579. package/node_modules/pngjs/lib/png.js +0 -194
  580. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  581. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  582. package/node_modules/pngjs/package.json +0 -73
  583. package/node_modules/qrcode/README.md +0 -770
  584. package/node_modules/qrcode/bin/qrcode +0 -159
  585. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  586. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  587. package/node_modules/qrcode/lib/browser.js +0 -76
  588. package/node_modules/qrcode/lib/can-promise.js +0 -7
  589. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  590. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  591. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  592. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  593. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  594. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  595. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  596. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  597. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  598. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  599. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  600. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  601. package/node_modules/qrcode/lib/core/mode.js +0 -167
  602. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  603. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  604. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  605. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  606. package/node_modules/qrcode/lib/core/regex.js +0 -31
  607. package/node_modules/qrcode/lib/core/segments.js +0 -330
  608. package/node_modules/qrcode/lib/core/utils.js +0 -63
  609. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  610. package/node_modules/qrcode/lib/core/version.js +0 -163
  611. package/node_modules/qrcode/lib/index.js +0 -12
  612. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  613. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  614. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  615. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  616. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  617. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  618. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  619. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  620. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  621. package/node_modules/qrcode/lib/server.js +0 -138
  622. package/node_modules/qrcode/license +0 -10
  623. package/node_modules/qrcode/package.json +0 -77
  624. package/node_modules/require-directory/.jshintrc +0 -67
  625. package/node_modules/require-directory/.npmignore +0 -1
  626. package/node_modules/require-directory/.travis.yml +0 -3
  627. package/node_modules/require-directory/LICENSE +0 -22
  628. package/node_modules/require-directory/README.markdown +0 -184
  629. package/node_modules/require-directory/index.js +0 -86
  630. package/node_modules/require-directory/package.json +0 -40
  631. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  632. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  633. package/node_modules/require-main-filename/README.md +0 -26
  634. package/node_modules/require-main-filename/index.js +0 -18
  635. package/node_modules/require-main-filename/package.json +0 -35
  636. package/node_modules/semver/LICENSE +0 -15
  637. package/node_modules/semver/README.md +0 -680
  638. package/node_modules/semver/bin/semver.js +0 -195
  639. package/node_modules/semver/classes/comparator.js +0 -143
  640. package/node_modules/semver/classes/index.js +0 -7
  641. package/node_modules/semver/classes/range.js +0 -577
  642. package/node_modules/semver/classes/semver.js +0 -350
  643. package/node_modules/semver/functions/clean.js +0 -8
  644. package/node_modules/semver/functions/cmp.js +0 -54
  645. package/node_modules/semver/functions/coerce.js +0 -62
  646. package/node_modules/semver/functions/compare-build.js +0 -9
  647. package/node_modules/semver/functions/compare-loose.js +0 -5
  648. package/node_modules/semver/functions/compare.js +0 -7
  649. package/node_modules/semver/functions/diff.js +0 -60
  650. package/node_modules/semver/functions/eq.js +0 -5
  651. package/node_modules/semver/functions/gt.js +0 -5
  652. package/node_modules/semver/functions/gte.js +0 -5
  653. package/node_modules/semver/functions/inc.js +0 -21
  654. package/node_modules/semver/functions/lt.js +0 -5
  655. package/node_modules/semver/functions/lte.js +0 -5
  656. package/node_modules/semver/functions/major.js +0 -5
  657. package/node_modules/semver/functions/minor.js +0 -5
  658. package/node_modules/semver/functions/neq.js +0 -5
  659. package/node_modules/semver/functions/parse.js +0 -18
  660. package/node_modules/semver/functions/patch.js +0 -5
  661. package/node_modules/semver/functions/prerelease.js +0 -8
  662. package/node_modules/semver/functions/rcompare.js +0 -5
  663. package/node_modules/semver/functions/rsort.js +0 -5
  664. package/node_modules/semver/functions/satisfies.js +0 -12
  665. package/node_modules/semver/functions/sort.js +0 -5
  666. package/node_modules/semver/functions/truncate.js +0 -48
  667. package/node_modules/semver/functions/valid.js +0 -8
  668. package/node_modules/semver/index.js +0 -93
  669. package/node_modules/semver/internal/constants.js +0 -37
  670. package/node_modules/semver/internal/debug.js +0 -11
  671. package/node_modules/semver/internal/identifiers.js +0 -29
  672. package/node_modules/semver/internal/lrucache.js +0 -42
  673. package/node_modules/semver/internal/parse-options.js +0 -17
  674. package/node_modules/semver/internal/re.js +0 -223
  675. package/node_modules/semver/package.json +0 -78
  676. package/node_modules/semver/preload.js +0 -4
  677. package/node_modules/semver/range.bnf +0 -17
  678. package/node_modules/semver/ranges/gtr.js +0 -6
  679. package/node_modules/semver/ranges/intersects.js +0 -9
  680. package/node_modules/semver/ranges/ltr.js +0 -6
  681. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  682. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  683. package/node_modules/semver/ranges/min-version.js +0 -63
  684. package/node_modules/semver/ranges/outside.js +0 -82
  685. package/node_modules/semver/ranges/simplify.js +0 -49
  686. package/node_modules/semver/ranges/subset.js +0 -249
  687. package/node_modules/semver/ranges/to-comparators.js +0 -10
  688. package/node_modules/semver/ranges/valid.js +0 -13
  689. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  690. package/node_modules/set-blocking/LICENSE.txt +0 -14
  691. package/node_modules/set-blocking/README.md +0 -31
  692. package/node_modules/set-blocking/index.js +0 -7
  693. package/node_modules/set-blocking/package.json +0 -42
  694. package/node_modules/sharp/LICENSE +0 -191
  695. package/node_modules/sharp/README.md +0 -112
  696. package/node_modules/sharp/dist/channel.cjs +0 -177
  697. package/node_modules/sharp/dist/channel.mjs +0 -177
  698. package/node_modules/sharp/dist/colour.cjs +0 -199
  699. package/node_modules/sharp/dist/colour.mjs +0 -199
  700. package/node_modules/sharp/dist/composite.cjs +0 -213
  701. package/node_modules/sharp/dist/composite.mjs +0 -213
  702. package/node_modules/sharp/dist/constructor.cjs +0 -511
  703. package/node_modules/sharp/dist/constructor.mjs +0 -511
  704. package/node_modules/sharp/dist/index.cjs +0 -25
  705. package/node_modules/sharp/dist/index.d.cts +0 -1999
  706. package/node_modules/sharp/dist/index.d.mts +0 -2046
  707. package/node_modules/sharp/dist/index.mjs +0 -25
  708. package/node_modules/sharp/dist/input.cjs +0 -819
  709. package/node_modules/sharp/dist/input.mjs +0 -819
  710. package/node_modules/sharp/dist/is.cjs +0 -143
  711. package/node_modules/sharp/dist/is.mjs +0 -143
  712. package/node_modules/sharp/dist/libvips.cjs +0 -212
  713. package/node_modules/sharp/dist/libvips.mjs +0 -212
  714. package/node_modules/sharp/dist/operation.cjs +0 -1002
  715. package/node_modules/sharp/dist/operation.mjs +0 -1002
  716. package/node_modules/sharp/dist/output.cjs +0 -1785
  717. package/node_modules/sharp/dist/output.mjs +0 -1785
  718. package/node_modules/sharp/dist/resize.cjs +0 -617
  719. package/node_modules/sharp/dist/resize.mjs +0 -617
  720. package/node_modules/sharp/dist/sharp.cjs +0 -174
  721. package/node_modules/sharp/dist/sharp.mjs +0 -174
  722. package/node_modules/sharp/dist/utility.cjs +0 -301
  723. package/node_modules/sharp/dist/utility.mjs +0 -301
  724. package/node_modules/sharp/install/build.js +0 -38
  725. package/node_modules/sharp/lib/index.d.ts +0 -1999
  726. package/node_modules/sharp/package.json +0 -227
  727. package/node_modules/sharp/src/binding.gyp +0 -303
  728. package/node_modules/sharp/src/common.cc +0 -1186
  729. package/node_modules/sharp/src/common.h +0 -421
  730. package/node_modules/sharp/src/metadata.cc +0 -404
  731. package/node_modules/sharp/src/metadata.h +0 -95
  732. package/node_modules/sharp/src/operations.cc +0 -516
  733. package/node_modules/sharp/src/operations.h +0 -137
  734. package/node_modules/sharp/src/pipeline.cc +0 -1948
  735. package/node_modules/sharp/src/pipeline.h +0 -422
  736. package/node_modules/sharp/src/sharp.cc +0 -43
  737. package/node_modules/sharp/src/stats.cc +0 -186
  738. package/node_modules/sharp/src/stats.h +0 -62
  739. package/node_modules/sharp/src/utilities.cc +0 -289
  740. package/node_modules/sharp/src/utilities.h +0 -22
  741. package/node_modules/string-width/index.d.ts +0 -29
  742. package/node_modules/string-width/index.js +0 -47
  743. package/node_modules/string-width/license +0 -9
  744. package/node_modules/string-width/package.json +0 -56
  745. package/node_modules/string-width/readme.md +0 -50
  746. package/node_modules/strip-ansi/index.d.ts +0 -17
  747. package/node_modules/strip-ansi/index.js +0 -4
  748. package/node_modules/strip-ansi/license +0 -9
  749. package/node_modules/strip-ansi/package.json +0 -54
  750. package/node_modules/strip-ansi/readme.md +0 -46
  751. package/node_modules/which-module/LICENSE +0 -13
  752. package/node_modules/which-module/README.md +0 -58
  753. package/node_modules/which-module/index.js +0 -9
  754. package/node_modules/which-module/package.json +0 -41
  755. package/node_modules/wrap-ansi/index.js +0 -186
  756. package/node_modules/wrap-ansi/license +0 -9
  757. package/node_modules/wrap-ansi/package.json +0 -61
  758. package/node_modules/wrap-ansi/readme.md +0 -97
  759. package/node_modules/ws/LICENSE +0 -20
  760. package/node_modules/ws/README.md +0 -548
  761. package/node_modules/ws/browser.js +0 -8
  762. package/node_modules/ws/index.js +0 -22
  763. package/node_modules/ws/lib/buffer-util.js +0 -131
  764. package/node_modules/ws/lib/constants.js +0 -19
  765. package/node_modules/ws/lib/event-target.js +0 -292
  766. package/node_modules/ws/lib/extension.js +0 -203
  767. package/node_modules/ws/lib/limiter.js +0 -55
  768. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  769. package/node_modules/ws/lib/receiver.js +0 -743
  770. package/node_modules/ws/lib/sender.js +0 -607
  771. package/node_modules/ws/lib/stream.js +0 -161
  772. package/node_modules/ws/lib/subprotocol.js +0 -62
  773. package/node_modules/ws/lib/validation.js +0 -152
  774. package/node_modules/ws/lib/websocket-server.js +0 -562
  775. package/node_modules/ws/lib/websocket.js +0 -1407
  776. package/node_modules/ws/package.json +0 -74
  777. package/node_modules/ws/wrapper.mjs +0 -21
  778. package/node_modules/y18n/CHANGELOG.md +0 -35
  779. package/node_modules/y18n/LICENSE +0 -13
  780. package/node_modules/y18n/README.md +0 -109
  781. package/node_modules/y18n/index.js +0 -188
  782. package/node_modules/y18n/package.json +0 -39
  783. package/node_modules/yargs/CHANGELOG.md +0 -420
  784. package/node_modules/yargs/LICENSE +0 -21
  785. package/node_modules/yargs/README.md +0 -140
  786. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  787. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  788. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  789. package/node_modules/yargs/build/lib/argsert.js +0 -65
  790. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  791. package/node_modules/yargs/build/lib/command.js +0 -416
  792. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  793. package/node_modules/yargs/build/lib/common-types.js +0 -25
  794. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  795. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  796. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  797. package/node_modules/yargs/build/lib/completion.js +0 -135
  798. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  799. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  800. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  801. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  802. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  803. package/node_modules/yargs/build/lib/middleware.js +0 -57
  804. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  805. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  806. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  807. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  808. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  809. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  810. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  811. package/node_modules/yargs/build/lib/usage.js +0 -540
  812. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  813. package/node_modules/yargs/build/lib/validation.js +0 -330
  814. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  815. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  816. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  817. package/node_modules/yargs/build/lib/yerror.js +0 -11
  818. package/node_modules/yargs/index.js +0 -40
  819. package/node_modules/yargs/locales/be.json +0 -46
  820. package/node_modules/yargs/locales/de.json +0 -46
  821. package/node_modules/yargs/locales/en.json +0 -51
  822. package/node_modules/yargs/locales/es.json +0 -46
  823. package/node_modules/yargs/locales/fi.json +0 -49
  824. package/node_modules/yargs/locales/fr.json +0 -53
  825. package/node_modules/yargs/locales/hi.json +0 -49
  826. package/node_modules/yargs/locales/hu.json +0 -46
  827. package/node_modules/yargs/locales/id.json +0 -50
  828. package/node_modules/yargs/locales/it.json +0 -46
  829. package/node_modules/yargs/locales/ja.json +0 -51
  830. package/node_modules/yargs/locales/ko.json +0 -49
  831. package/node_modules/yargs/locales/nb.json +0 -44
  832. package/node_modules/yargs/locales/nl.json +0 -49
  833. package/node_modules/yargs/locales/nn.json +0 -44
  834. package/node_modules/yargs/locales/pirate.json +0 -13
  835. package/node_modules/yargs/locales/pl.json +0 -49
  836. package/node_modules/yargs/locales/pt.json +0 -45
  837. package/node_modules/yargs/locales/pt_BR.json +0 -48
  838. package/node_modules/yargs/locales/ru.json +0 -46
  839. package/node_modules/yargs/locales/th.json +0 -46
  840. package/node_modules/yargs/locales/tr.json +0 -48
  841. package/node_modules/yargs/locales/zh_CN.json +0 -48
  842. package/node_modules/yargs/locales/zh_TW.json +0 -47
  843. package/node_modules/yargs/package.json +0 -92
  844. package/node_modules/yargs/yargs.js +0 -14
  845. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  846. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  847. package/node_modules/yargs-parser/README.md +0 -449
  848. package/node_modules/yargs-parser/index.js +0 -1032
  849. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  850. package/node_modules/yargs-parser/package.json +0 -46
@@ -0,0 +1,318 @@
1
+ import crypto from 'node:crypto';
2
+ import http2 from 'node:http2';
3
+ import sharp from 'sharp';
4
+ import { fileRange } from './file-transfer-range.mjs';
5
+
6
+ const fileId = value => typeof value === 'string' && /^[A-Za-z0-9_-]{1,256}$/.test(value);
7
+ const formats = { jpeg: 'image/jpeg', png: 'image/png', webp: 'image/webp', gif: 'image/gif', bmp: 'image/bmp' };
8
+
9
+ // Official API reads use HTTP/2, as do the existing Dots history adapters.
10
+ function officialFetch(input, options = {}) {
11
+ const url = new URL(input);
12
+ if (url.origin !== 'https://chatgpt.com') return fetch(input, options);
13
+ return new Promise((resolve, reject) => {
14
+ const session = http2.connect(url.origin);
15
+ let request;
16
+ const close = () => { clearTimeout(connectTimer); request?.destroy(); session.destroy(); options.signal?.removeEventListener('abort', abort); };
17
+ const abort = () => { reject(options.signal.reason || new Error('点点附件读取已取消。')); close(); };
18
+ const connectTimer = setTimeout(() => { reject(new Error('点点附件连接超时。')); close(); }, 30000);
19
+ session.once('connect', () => clearTimeout(connectTimer));
20
+ session.on('error', error => { reject(error); close(); });
21
+ request = session.request({ ':method': 'GET', ':path': url.pathname + url.search,
22
+ 'user-agent': 'Code-Relax/0.1.0', ...options.headers });
23
+ request.on('error', error => { reject(error); close(); });
24
+ request.once('close', () => { reject(new Error('点点附件连接已断开。')); close(); });
25
+ options.signal?.addEventListener('abort', abort, { once: true });
26
+ if (options.signal?.aborted) { abort(); return; }
27
+ request.once('response', values => {
28
+ const status = values[':status'];
29
+ const headers = new Headers(Object.entries(values).filter(([key]) => !key.startsWith(':')));
30
+ const body = { cancel: close, async *[Symbol.asyncIterator]() {
31
+ try { for await (const chunk of request) yield chunk; } finally { close(); }
32
+ } };
33
+ resolve({ status, ok: status >= 200 && status < 300, headers, body, async json() {
34
+ const chunks = []; let size = 0;
35
+ for await (const chunk of body) {
36
+ size += chunk.length;
37
+ if (size > 1024 * 1024) throw new Error('点点附件信息响应过大。');
38
+ chunks.push(chunk);
39
+ }
40
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
41
+ } });
42
+ });
43
+ request.end();
44
+ });
45
+ }
46
+
47
+ export function dotsImageReference(value) {
48
+ let source;
49
+ if (value?.chatFile != null) {
50
+ const { conversationId, messageId, sandboxPath } = value.chatFile;
51
+ if (!fileId(conversationId) || value.roomId || value.libraryFileId) return null;
52
+ if (sandboxPath != null) {
53
+ if (!fileId(messageId) || typeof sandboxPath !== 'string' || !sandboxPath.startsWith('/')
54
+ || sandboxPath.length > 2048 || /[\x00-\x1f]/.test(sandboxPath)) return null;
55
+ source = { chatFile: { conversationId, messageId, sandboxPath } };
56
+ } else if (fileId(value.fileId)) source = { fileId: value.fileId, chatFile: { conversationId } };
57
+ } else if ((fileId(value?.fileId) || fileId(value?.libraryFileId)) && (value.libraryFileId == null || fileId(value.libraryFileId))) {
58
+ if (value.roomId != null && !fileId(value.roomId)) return null;
59
+ source = { ...(fileId(value.fileId) ? { fileId: value.fileId } : {}), ...(value.libraryFileId ? { libraryFileId: value.libraryFileId } : {}),
60
+ ...(value.roomId ? { roomId: value.roomId } : {}) };
61
+ } else if (typeof value?.url === 'string' && value.url.length <= 2048) {
62
+ try {
63
+ const url = new URL(value.url);
64
+ if (url.protocol === 'https:' && !url.username && !url.password && !url.port && !url.hash
65
+ && url.hostname.endsWith('.oaiusercontent.com') && url.pathname.startsWith('/files/')) source = { url: url.href };
66
+ } catch { /* Not an official image reference. */ }
67
+ }
68
+ if (!source) return null;
69
+ return { ...source, type: value.type === 'file' ? 'file' : 'image',
70
+ mimeType: /^[A-Za-z0-9.+-]+\/[A-Za-z0-9.+-]+$/.test(value.mimeType || '') ? value.mimeType : '',
71
+ name: typeof value.name === 'string' ? value.name.slice(0, 128) : value.type === 'file' ? 'Library 附件' : '图片' };
72
+ }
73
+
74
+ // Register attachment references projected from authoritative messages. Fetch bytes on demand.
75
+ // Phone caches keep opaque capabilities. Explicit copy-link requests return official URLs.
76
+ export class DotsMessageImages {
77
+ constructor({ localServer, identity, cache, capabilityKey, maxEntries, maxBytes, fetchImpl = officialFetch }) {
78
+ Object.assign(this, { localServer, identity, cache, capabilityKey, maxEntries, maxBytes, fetchImpl });
79
+ }
80
+
81
+ imageId(reference, identity) {
82
+ const url = reference.url ? new URL(reference.url) : null;
83
+ return crypto.createHmac('sha256', this.capabilityKey)
84
+ .update(JSON.stringify(['dots-image', identity.accountId, identity.userId,
85
+ ...(reference.chatFile ? ['chat-file', reference.fileId || '', reference.chatFile]
86
+ : url ? ['url', url.origin + url.pathname] : [reference.fileId, reference.libraryFileId || '', ...(reference.roomId ? [reference.roomId] : [])])]))
87
+ .digest('hex');
88
+ }
89
+
90
+ remember(value, identity = this.identity()) {
91
+ const reference = dotsImageReference(value);
92
+ if (!reference || !identity?.accountId) return null;
93
+ const id = this.imageId(reference, identity);
94
+ const cached = this.cache.get(id);
95
+ if (!cached || reference.url && reference.url !== cached.dotsFile?.url) {
96
+ const iv = crypto.randomBytes(12), cipher = crypto.createCipheriv('aes-256-gcm', this.capabilityKey, iv);
97
+ const bytes = Buffer.concat([cipher.update(JSON.stringify({ reference, identity })), cipher.final()]);
98
+ const recoveryToken = Buffer.concat([iv, cipher.getAuthTag(), bytes]).toString('base64url');
99
+ if (!cached) while (this.cache.size >= this.maxEntries) this.cache.delete(this.cache.keys().next().value);
100
+ const image = cached || {};
101
+ Object.assign(image, { id, dotsFile: reference, identity: { ...identity }, recoveryToken,
102
+ name: reference.name, mimeType: image.mimeType || reference.mimeType });
103
+ this.cache.set(id, image);
104
+ }
105
+ return this.cache.get(id);
106
+ }
107
+
108
+ restore(id, token) {
109
+ if (!token || token.length > 4096) return null;
110
+ try {
111
+ const bytes = Buffer.from(token, 'base64url');
112
+ if (bytes.length < 29) return null;
113
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.capabilityKey, bytes.subarray(0, 12));
114
+ decipher.setAuthTag(bytes.subarray(12, 28));
115
+ const { reference, identity } = JSON.parse(Buffer.concat([decipher.update(bytes.subarray(28)), decipher.final()]));
116
+ if (!dotsImageReference(reference) || !identity?.accountId || this.imageId(reference, identity) !== id) return null;
117
+ return this.remember(reference, identity);
118
+ } catch { return null; }
119
+ }
120
+
121
+ async authorization(identity) {
122
+ const auth = await this.localServer.request('getAuthStatus', { includeToken: true, refreshToken: false });
123
+ if (!['chatgpt', 'chatgptAuthTokens'].includes(auth.authMethod) || !auth.authToken) {
124
+ throw new Error('点点附件需要 Codex 内核已登录 ChatGPT。');
125
+ }
126
+ const principal = auth.authToken && JSON.parse(Buffer.from(auth.authToken.split('.')[1], 'base64url'))['https://api.openai.com/auth'];
127
+ if (!identity?.accountId || principal?.chatgpt_account_id !== identity.accountId || principal.chatgpt_user_id !== identity.userId) {
128
+ throw new Error('点点附件的账号已变化,请重新连接对话。');
129
+ }
130
+ return { Authorization: `Bearer ${auth.authToken}`, 'ChatGPT-Account-Id': identity.accountId };
131
+ }
132
+
133
+ async json(route, headers) {
134
+ const result = await this.fetchImpl(`https://chatgpt.com/backend-api${route}`, {
135
+ headers: { accept: 'application/json', ...headers },
136
+ redirect: 'error', signal: AbortSignal.timeout(30000),
137
+ });
138
+ if (!result.ok) { await result.body?.cancel(); throw Object.assign(new Error(`点点附件信息读取失败(${result.status})。`), { status: result.status }); }
139
+ const body = await result.json();
140
+ if (body.status === 'error') throw new Error(`点点图片文件请求失败(${body.error_code || '未知错误'})。`);
141
+ return body;
142
+ }
143
+
144
+ libraryId(image) {
145
+ return image.dotsFile.libraryFileId || (image.dotsFile.fileId?.startsWith('libfile_') ? image.dotsFile.fileId : '');
146
+ }
147
+
148
+ async metadata(image, headers) {
149
+ headers ||= await this.authorization(image.identity);
150
+ if (image.size) return image;
151
+ if (!image.metadataLoading) {
152
+ image.metadataLoading = (async () => {
153
+ const library = this.libraryId(image);
154
+ if (!library) throw new Error('点点附件缺少 Library 文件身份。');
155
+ const route = `/files/library/files/${encodeURIComponent(library)}`;
156
+ let value;
157
+ try { value = await this.json(route, headers); }
158
+ catch (error) {
159
+ // Desktop 26.930.4958.0 explicitly reads /node after 403/404.
160
+ if (![403, 404].includes(error.status)) throw error;
161
+ value = await this.json(route + '/node', headers);
162
+ }
163
+ const name = value.file_name || value.name, size = value.file_size_bytes, mimeType = value.mime_type;
164
+ if (typeof name !== 'string' || !name || !Number.isSafeInteger(size) || size < 1
165
+ || typeof mimeType !== 'string' || !/^[A-Za-z0-9.+-]+\/[A-Za-z0-9.+-]+$/.test(mimeType)) {
166
+ throw new Error('点点附件文件信息不完整。');
167
+ }
168
+ Object.assign(image, { name: name.replace(/[\\/\x00-\x1f]/g, '_').slice(0, 128), size, mimeType });
169
+ })().finally(() => { image.metadataLoading = null; });
170
+ }
171
+ await image.metadataLoading;
172
+ return image;
173
+ }
174
+
175
+ async prepareTimeline(thread) {
176
+ const files = new Map();
177
+ for (const turn of thread?.turns || []) for (const item of turn.items || []) {
178
+ for (const attachment of [...(item.attachments || []), ...(Array.isArray(item.content) ? item.content : [])]) {
179
+ if (!['file', 'image', 'input_image'].includes(attachment?.type)) continue;
180
+ const image = this.remember(attachment);
181
+ if (image && !image.size && this.libraryId(image)) files.set(image.id, image);
182
+ }
183
+ }
184
+ if (!files.size) return false;
185
+ let headers;
186
+ try { headers = await this.authorization(files.values().next().value.identity); }
187
+ catch (error) { console.error(`读取点点附件信息失败:${error.message}`); return false; }
188
+ const results = await Promise.allSettled([...files.values()].map(image => this.metadata(image, headers)));
189
+ for (const result of results) if (result.status === 'rejected') console.error(`读取点点附件信息失败:${result.reason.message}`);
190
+ return results.some(result => result.status === 'fulfilled');
191
+ }
192
+
193
+ async contentUrl(image, headers, download = false) {
194
+ const file = image.dotsFile;
195
+ let url;
196
+ if (file.url) url = new URL(file.url);
197
+ else {
198
+ const library = this.libraryId(image);
199
+ const chat = file.chatFile;
200
+ const chatRoute = chat && (chat.sandboxPath
201
+ ? `/conversation/${encodeURIComponent(chat.conversationId)}/interpreter/download?${new URLSearchParams({
202
+ message_id: chat.messageId, sandbox_path: chat.sandboxPath, ...(download ? { download_intent: 'true' } : {}) })}`
203
+ : `/conversation/${encodeURIComponent(chat.conversationId)}/attachment/${encodeURIComponent(file.fileId)}/download`);
204
+ const result = await this.json(chatRoute || (file.roomId ? `/messaging/rooms/${encodeURIComponent(file.roomId)}/files/${encodeURIComponent(file.fileId)}`
205
+ : library ? `/files/library/files/${encodeURIComponent(library)}/${download ? 'download_url' : 'content_url'}`
206
+ : `/files/download/${encodeURIComponent(file.fileId)}?download_intent=${download}&inline=${!download}`), headers);
207
+ url = new URL(result.download_url || result.content_url, 'https://chatgpt.com');
208
+ const redirected = /^\/api\/library\/files\/([^/]+)\/(download|content)$/.exec(url.pathname);
209
+ if (url.origin === 'https://chatgpt.com' && redirected) {
210
+ url.pathname = `/backend-api/files/library/files/${redirected[1]}/${redirected[2]}_redirect`;
211
+ } else if (url.origin === 'https://chatgpt.com' && /^\/files\/library\/files\/[^/]+\/(download|content)_redirect$/.test(url.pathname)) {
212
+ url.pathname = '/backend-api' + url.pathname;
213
+ }
214
+ }
215
+ const authenticated = url.origin === 'https://chatgpt.com' && url.pathname.startsWith('/backend-api/');
216
+ if (url.protocol !== 'https:' || url.username || url.password || url.port
217
+ || !(authenticated || url.hostname.endsWith('.oaiusercontent.com'))) throw new Error('点点附件下载地址无效。');
218
+ return url;
219
+ }
220
+
221
+ async fileLink(image) {
222
+ const headers = await this.authorization(image.identity);
223
+ const library = this.libraryId(image);
224
+ if (library) {
225
+ // Desktop uses this official redirect route for Library downloads. Copy
226
+ // the stable entry point; let opening it resolve the current signed URL.
227
+ return `https://chatgpt.com/backend-api/files/library/files/${encodeURIComponent(library)}/download_redirect`;
228
+ }
229
+ let url = await this.contentUrl(image, headers, true);
230
+ // Library download_url can be an Estuary URL served directly by ChatGPT,
231
+ // not a redirect to oaiusercontent. Keep the official URL for browser login.
232
+ if (url.origin === 'https://chatgpt.com' && url.pathname === '/backend-api/estuary/content') return url.href;
233
+ if (url.origin === 'https://chatgpt.com') {
234
+ const response = await this.fetchImpl(url, { headers, redirect: 'manual', signal: AbortSignal.timeout(30000) });
235
+ try {
236
+ if (![301, 302, 303, 307, 308].includes(response.status) || !response.headers.get('location')) {
237
+ throw new Error('点点附件未返回可复制的网络链接。');
238
+ }
239
+ url = new URL(response.headers.get('location'), url);
240
+ } finally { await response.body?.cancel(); }
241
+ }
242
+ if (url.protocol !== 'https:' || url.username || url.password || url.port
243
+ || !url.hostname.endsWith('.oaiusercontent.com')) throw new Error('点点附件网络链接无效。');
244
+ return url.href;
245
+ }
246
+
247
+ async readPart(image, query) {
248
+ if (image.buffer || !this.libraryId(image)) {
249
+ // Inline file IDs and signed image references use their existing reader.
250
+ await this.load(image);
251
+ const size = image.buffer.length, revision = image.id;
252
+ const { offset, length } = fileRange(query, size, revision);
253
+ return { name: image.name, size, offset, revision, mimeType: image.mimeType, bytes: image.buffer.subarray(offset, offset + length) };
254
+ }
255
+ const headers = await this.authorization(image.identity);
256
+ await this.metadata(image, headers);
257
+ const revision = image.id;
258
+ const { offset, length } = fileRange(query, image.size, revision);
259
+ if (!offset || !image.downloadUrl) image.downloadUrl = await this.contentUrl(image, headers, true);
260
+ const url = image.downloadUrl;
261
+ const response = await this.fetchImpl(url, { redirect: 'error',
262
+ headers: { ...(url.origin === 'https://chatgpt.com' ? headers : {}), Range: `bytes=${offset}-${offset + length - 1}` } });
263
+ try {
264
+ if (response.status !== 206 || response.headers.get('content-range') !== `bytes ${offset}-${offset + length - 1}/${image.size}`) {
265
+ throw new Error(`点点附件分片响应无效(HTTP ${response.status})。`);
266
+ }
267
+ const chunks = []; let size = 0;
268
+ for await (const chunk of response.body) {
269
+ size += chunk.length;
270
+ if (size > length) throw new Error('点点附件分片内容超出范围。');
271
+ chunks.push(chunk);
272
+ }
273
+ if (size !== length) throw new Error('点点附件分片内容不完整。');
274
+ return { name: image.name, size: image.size, offset, revision, mimeType: image.mimeType, bytes: Buffer.concat(chunks) };
275
+ } finally { await response.body?.cancel(); }
276
+ }
277
+
278
+ async load(image) {
279
+ const headers = await this.authorization(image.identity);
280
+ if (image.buffer) return image;
281
+ if (!image.loading) {
282
+ image.loading = (async () => {
283
+ const file = image.dotsFile;
284
+ const url = await this.contentUrl(image, headers);
285
+ const authenticated = url.origin === 'https://chatgpt.com' && url.pathname.startsWith('/backend-api/');
286
+ if (url.protocol !== 'https:' || url.username || url.password || url.port
287
+ || !(authenticated || url.hostname.endsWith('.oaiusercontent.com'))) throw new Error('点点图片下载地址无效。');
288
+ const response = await this.fetchImpl(url, { redirect: 'error',
289
+ ...(authenticated ? { headers } : {}) });
290
+ try {
291
+ if (!response.ok) throw new Error(`点点图片下载失败(${response.status})。`);
292
+ if (Number(response.headers.get('content-length')) > this.maxBytes) throw new Error('点点图片超过 20 MiB 下载上限。');
293
+ const chunks = []; let size = 0;
294
+ for await (const chunk of response.body) {
295
+ size += chunk.length;
296
+ if (size > this.maxBytes) throw new Error('点点图片超过 20 MiB 下载上限。');
297
+ chunks.push(chunk);
298
+ }
299
+ const buffer = Buffer.concat(chunks);
300
+ const mimeType = response.headers.get('content-type')?.split(';')[0] || 'application/octet-stream';
301
+ if (file.type !== 'file') {
302
+ const metadata = await sharp(buffer, { limitInputPixels: 40_000_000 }).metadata();
303
+ if (!formats[metadata.format]) throw new Error('点点附件不是可显示的图片。');
304
+ Object.assign(image, { buffer, mimeType: formats[metadata.format] });
305
+ } else Object.assign(image, { buffer, mimeType });
306
+ const disposition = response.headers.get('content-disposition') || '';
307
+ const encoded = /filename\*=UTF-8''([^;]+)/i.exec(disposition)?.[1];
308
+ let name = /filename="([^"]+)"/i.exec(disposition)?.[1];
309
+ try { if (encoded) name = decodeURIComponent(encoded); } catch {}
310
+ if (name) image.name = name.replace(/[\\/\x00-\x1f]/g, '_').slice(0, 128);
311
+ } finally { if (!response.bodyUsed) await response.body?.cancel(); }
312
+ })().finally(() => { image.loading = null; });
313
+ }
314
+ await image.loading;
315
+ return image;
316
+ }
317
+
318
+ }
@@ -0,0 +1,77 @@
1
+ import http2 from 'node:http2';
2
+
3
+ const colors = new Set(['black', 'blue', 'green', 'orange', 'pink', 'purple', 'red', 'yellow']);
4
+ export function dotsProfile(profile) {
5
+ const name = typeof profile?.display_name === 'string' ? profile.display_name.trim() : '';
6
+ const pointer = profile?.avatar_manifest?.snapshot?.asset_pointer;
7
+ return { profileId: profile.id, activeRootThreadId: profile.active_root_thread_id || '',
8
+ messagingRoomId: typeof profile.messaging_room_id === 'string' ? profile.messaging_room_id : '',
9
+ name: name && !['O', 'o', 'Orbit', 'orbit', 'dot'].includes(name) ? name : 'Dots',
10
+ avatarFileId: typeof pointer === 'string' && /^sediment:\/\/file_[a-f0-9]+$/.test(pointer)
11
+ ? pointer.slice('sediment://'.length) : '', color: colors.has(profile.color) ? profile.color : '' };
12
+ }
13
+
14
+ // Desktop 26.930.7945.0 discovers roots through /tbo and its thread attachments.
15
+ // Hosted thread/list can omit every aeon root while thread/read still resolves it.
16
+ export async function readDotsCatalog(localServer, identity) {
17
+ const auth = await localServer.request('getAuthStatus', { includeToken: true, refreshToken: false });
18
+ const principal = JSON.parse(Buffer.from(auth.authToken.split('.')[1], 'base64url'))['https://api.openai.com/auth'];
19
+ if (!identity || principal?.chatgpt_account_id !== identity.accountId || principal.chatgpt_user_id !== identity.userId) {
20
+ throw new Error('点点账号已变化,请重新连接。');
21
+ }
22
+ const session = http2.connect('https://chatgpt.com');
23
+ session.on('error', () => {}); // Individual requests report the transport error.
24
+ try {
25
+ const get = route => new Promise((resolve, reject) => {
26
+ const request = session.request({ ':method': 'GET', ':path': `/backend-api${route}`,
27
+ authorization: `Bearer ${auth.authToken}`, 'chatgpt-account-id': identity.accountId,
28
+ 'user-agent': 'Code-Relax/0.1.0', accept: 'application/json' });
29
+ let status, body = '', size = 0;
30
+ const timer = setTimeout(() => request.destroy(new Error('读取点点资料超时。')), 15000);
31
+ request.setEncoding('utf8');
32
+ request.on('response', headers => { status = headers[':status']; });
33
+ request.on('data', chunk => {
34
+ size += Buffer.byteLength(chunk);
35
+ if (size > 1024 * 1024) request.destroy(new Error('点点资料响应过大。'));
36
+ else body += chunk;
37
+ });
38
+ request.on('error', reject);
39
+ request.on('close', () => clearTimeout(timer));
40
+ request.on('end', () => {
41
+ try {
42
+ if (status !== 200) throw new Error(`读取点点目录失败(HTTP ${status})。`);
43
+ resolve(JSON.parse(body));
44
+ } catch (error) { reject(error); }
45
+ });
46
+ request.end();
47
+ });
48
+ const profiles = new Map(), rootThreadIds = new Set();
49
+ let cursor;
50
+ do {
51
+ const query = new URLSearchParams({ limit: '25', ...(cursor ? { cursor } : {}) });
52
+ const page = await get(`/tbo?${query}`);
53
+ for (const value of page.items) {
54
+ if (typeof value.id !== 'string' || !value.id
55
+ || value.active_root_thread_id != null && typeof value.active_root_thread_id !== 'string') {
56
+ throw new Error('点点资料缺少有效身份。');
57
+ }
58
+ const profile = dotsProfile(value);
59
+ let threadCursor;
60
+ do {
61
+ const threadQuery = new URLSearchParams({ limit: '100', include_hidden: 'true',
62
+ ...(threadCursor ? { cursor: threadCursor } : {}) });
63
+ const attachments = await get(`/tbo/${encodeURIComponent(value.id)}/threads?${threadQuery}`);
64
+ for (const attachment of attachments.items) {
65
+ const id = attachment.thread_id;
66
+ profiles.set(id, profile);
67
+ if (value.status !== 'deleting' && (!profile.activeRootThreadId || profile.activeRootThreadId === id)
68
+ && (attachment.parent_thread_id === null || attachment.parent_thread_id === id)) rootThreadIds.add(id);
69
+ }
70
+ threadCursor = attachments.cursor;
71
+ } while (threadCursor);
72
+ }
73
+ cursor = page.cursor;
74
+ } while (cursor);
75
+ return { profiles, rootThreadIds };
76
+ } finally { session.destroy(); }
77
+ }
@@ -0,0 +1,199 @@
1
+ import { EventEmitter } from 'node:events';
2
+
3
+ // Desktop 26.1016.6573.0: room-live activity and responding heartbeats are
4
+ // independent. Heartbeats expire after 10s; Dot reply handoff lasts at most 5s.
5
+ const typingTimeout = 10000, handoffTimeout = 5000;
6
+ const statusLabels = {
7
+ working: '正在处理…', searching: '正在搜索…', creating: '正在创建…',
8
+ payment: '等待支付', 'needs input': '等待你的输入', paused: '已暂停',
9
+ };
10
+ const waitingStates = new Set(['payment', 'needs input', 'paused']);
11
+ const retryableStatus = status => status == null || status === 408 || status === 429 || status >= 500;
12
+
13
+ export class DotsRoomActivity extends EventEmitter {
14
+ constructor(server) {
15
+ super(); this.server = server; this.watches = new Map();
16
+ this.message = (topic, event) => {
17
+ for (const watch of this.watches.values()) {
18
+ if (topic === 'calpico-chatgpt-messaging') { this.roomEvent(watch, event); continue; }
19
+ if (event?.type !== 'calpico-room-live') continue;
20
+ const value = event.payload;
21
+ if (watch.topic !== topic || watch.roomId !== value?.room_id || value.version !== 1) continue;
22
+ if (!watch.subscriptionId) {
23
+ if (watch.pending.size >= 4) watch.pending.delete(watch.pending.keys().next().value);
24
+ const old = watch.pending.get(value.subscription_id);
25
+ if (!old || value.revision > old.revision) watch.pending.set(value.subscription_id, value);
26
+ } else this.apply(watch, value);
27
+ }
28
+ };
29
+ server.rooms.on('message', this.message);
30
+ }
31
+ acquire(threadId, listener) {
32
+ let watch = this.watches.get(threadId);
33
+ if (!watch) {
34
+ watch = { threadId, listeners: new Set(), activity: null, generation: 0, attempts: 0 };
35
+ this.watches.set(threadId, watch);
36
+ }
37
+ watch.listeners.add(listener); listener({ threadId, activity: watch.activity });
38
+ if (!watch.controller && !watch.timer) void this.start(watch);
39
+ let released = false;
40
+ return () => {
41
+ if (released) return; released = true; watch.listeners.delete(listener);
42
+ if (!watch.listeners.size) { this.watches.delete(threadId); this.stop(watch); }
43
+ };
44
+ }
45
+ retryUnavailable(threadId) {
46
+ const watch = this.watches.get(threadId);
47
+ if (!watch?.unavailable || !watch.listeners.size || watch.controller || watch.timer) return false;
48
+ watch.attempts = 0;
49
+ void this.start(watch);
50
+ return true;
51
+ }
52
+ publish(watch, activity) {
53
+ if (JSON.stringify(watch.activity) === JSON.stringify(activity)) return;
54
+ watch.activity = activity;
55
+ for (const listener of watch.listeners) listener({ threadId: watch.threadId, activity });
56
+ }
57
+ refresh(watch) {
58
+ const activity = watch.typing ? { kind: 'replying', label: '正在回复…', spinning: true }
59
+ : watch.liveActivity || (watch.handoffTimer ? { kind: 'replying', label: '正在回复…', spinning: true }
60
+ : watch.unavailable ? { kind: 'unavailable', label: '活动状态暂不可用', spinning: false }
61
+ : watch.idle ? { kind: 'idle', label: '空闲', spinning: false } : null);
62
+ this.publish(watch, activity);
63
+ }
64
+ clearReply(watch) {
65
+ clearTimeout(watch.typingTimer); clearTimeout(watch.handoffTimer);
66
+ watch.typingTimer = null; watch.handoffTimer = null; watch.typing = false; watch.handoffMessageId = null;
67
+ }
68
+ handoff(watch, messageId = null) {
69
+ const wasTyping = watch.typing;
70
+ clearTimeout(watch.typingTimer); watch.typingTimer = null; watch.typing = false;
71
+ if (messageId && (wasTyping || watch.handoffTimer)) watch.handoffMessageId = messageId;
72
+ if (wasTyping && !watch.handoffTimer) {
73
+ watch.handoffTimer = setTimeout(() => {
74
+ watch.handoffTimer = null; watch.handoffMessageId = null;
75
+ if (this.watches.get(watch.threadId) === watch) this.refresh(watch);
76
+ }, handoffTimeout);
77
+ watch.handoffTimer.unref();
78
+ }
79
+ this.refresh(watch);
80
+ }
81
+ completeReply(threadId, turns) {
82
+ const watch = this.watches.get(threadId);
83
+ if (!watch?.handoffMessageId || !turns.some(turn => turn.id === watch.handoffMessageId
84
+ && turn.items.some(item => item.type === 'agentMessage' && !item.dotsStreaming))) return;
85
+ // The matching formal message has entered the existing chat stream.
86
+ clearTimeout(watch.handoffTimer); watch.handoffTimer = null; watch.handoffMessageId = null;
87
+ this.refresh(watch);
88
+ }
89
+ roomEvent(watch, event) {
90
+ if (!this.server.rooms.ready || !watch.roomId || event?.payload?.room_id !== watch.roomId) return;
91
+ const payload = event.payload, heartbeat = event.type === 'calpico-is-responding-heartbeat';
92
+ if (!heartbeat && event.type !== 'calpico-message-add') return;
93
+ const room = this.server.bindings.get(watch.threadId);
94
+ const sender = heartbeat ? payload.source : payload.message;
95
+ if (room?.id !== watch.roomId || !room.aeon_id || heartbeat && sender?.role !== 'user'
96
+ || !sender?.account_user_id
97
+ || !room.members.some(member => member.account_user_id === sender.account_user_id && member.aeon_id === room.aeon_id)) return;
98
+ if (!heartbeat || payload.typing === false) {
99
+ this.handoff(watch, heartbeat ? null : payload.message.id); return;
100
+ }
101
+ if (payload.typing != null && payload.typing !== true) return;
102
+ this.clearReply(watch); watch.typing = true;
103
+ watch.typingTimer = setTimeout(() => {
104
+ watch.typingTimer = null;
105
+ if (this.watches.get(watch.threadId) === watch) this.handoff(watch);
106
+ }, typingTimeout);
107
+ watch.typingTimer.unref(); this.refresh(watch);
108
+ }
109
+ apply(watch, value) {
110
+ if (value.subscription_id !== watch.subscriptionId || !Number.isSafeInteger(value.revision) || value.revision <= watch.revision) return;
111
+ if (value.type === 'calpico-room-live-error') {
112
+ watch.revision = value.revision;
113
+ this.fail(watch, new Error('点点活动暂不可用。'), value.code === 'temporarily_unavailable'); return;
114
+ }
115
+ if (value.type !== 'calpico-room-live-state' || !Array.isArray(value.threads)) return;
116
+ watch.revision = value.revision;
117
+ clearTimeout(watch.initialTimer); watch.initialTimer = null;
118
+ const current = value.threads[0];
119
+ watch.idle = value.threads.length === 0;
120
+ if (value.threads.some(thread => thread.stream_state === 'attached')) watch.attempts = 0;
121
+ watch.unavailable = false; watch.liveActivity = null;
122
+ if (current?.stream_state !== 'attached') { this.refresh(watch); return; }
123
+ if (current.turn_status === 'failed') {
124
+ this.clearReply(watch); watch.liveActivity = { kind: 'error', label: '回复出错', spinning: false };
125
+ this.refresh(watch); return;
126
+ }
127
+ const status = typeof current.activity_status?.status_type === 'string' ? current.activity_status.status_type.toLowerCase() : '';
128
+ if (current.turn_status !== 'in_progress') {
129
+ watch.idle = ['completed', 'interrupted'].includes(current.turn_status) || status === 'ready';
130
+ this.refresh(watch); return;
131
+ }
132
+ const label = current.activity_status?.status_label;
133
+ watch.idle = status === 'ready';
134
+ if (status !== 'ready') {
135
+ const waiting = waitingStates.has(status);
136
+ const fallback = Object.hasOwn(statusLabels, status) ? statusLabels[status] : null;
137
+ if (waiting) this.clearReply(watch);
138
+ watch.liveActivity = { kind: waiting ? 'waiting' : fallback ? 'operation' : 'thinking',
139
+ label: typeof label === 'string' && label.trim() ? label : fallback || '正在思考…', spinning: !waiting };
140
+ }
141
+ this.refresh(watch);
142
+ }
143
+ async start(watch) {
144
+ const generation = ++watch.generation, controller = new AbortController();
145
+ watch.controller = controller; watch.pending = new Map(); watch.subscriptionId = null; watch.revision = -1;
146
+ const current = () => this.watches.get(watch.threadId) === watch && generation === watch.generation && !controller.signal.aborted;
147
+ // Ready/keepalive on SSE does not establish delivery on the Celsius topic.
148
+ watch.initialTimer = setTimeout(() => {
149
+ if (current()) this.fail(watch, new Error('点点活动首次状态等待超时。'), true);
150
+ }, 30000);
151
+ watch.initialTimer.unref();
152
+ try {
153
+ await this.server.connect();
154
+ const room = this.server.bindings.get(watch.threadId) || await this.server.room(watch.threadId);
155
+ if (!current()) return;
156
+ watch.roomId = room.id; watch.topic = `calpico-room-live:${room.id}`;
157
+ await this.server.rooms.subscribe(watch.topic);
158
+ if (!current()) { if (!this.watches.has(watch.threadId)) await this.server.rooms.unsubscribe(watch.topic); return; }
159
+ await this.server.rooms.request(`/messaging/rooms/${encodeURIComponent(room.id)}/live`, {
160
+ method: 'POST', signal: controller.signal, onEvent: value => {
161
+ if (!current()) return;
162
+ // The live SSE sends {} keepalives after ready; they carry no identity.
163
+ if (value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) return;
164
+ if (value?.type !== 'calpico-room-live-ready' || value.version !== 1 || value.room_id !== room.id
165
+ || typeof value.subscription_id !== 'string' || watch.subscriptionId && watch.subscriptionId !== value.subscription_id) {
166
+ throw new Error('点点活动订阅身份无效。');
167
+ }
168
+ watch.subscriptionId = value.subscription_id;
169
+ const pending = watch.pending.get(value.subscription_id); watch.pending.clear();
170
+ if (pending) this.apply(watch, pending);
171
+ },
172
+ });
173
+ if (current()) this.fail(watch, new Error('点点活动连接已结束。'), true);
174
+ } catch (error) { if (current()) this.fail(watch, error, retryableStatus(error.status)); }
175
+ }
176
+ fail(watch, error, retry) {
177
+ console.error(JSON.stringify({ time: new Date().toISOString(), event: 'dots-room-activity',
178
+ threadId: watch.threadId, roomId: watch.roomId, status: error.status || 0,
179
+ stage: watch.subscriptionId ? 'state' : 'subscribe', retry, attempts: watch.attempts,
180
+ responseKind: error.details?.responseKind || 'none' }));
181
+ this.stop(watch, true); watch.unavailable = true; this.refresh(watch); this.emit('unavailable', error);
182
+ if (retry && watch.listeners.size && this.server.ready && watch.attempts < 5) {
183
+ watch.timer = setTimeout(() => { watch.timer = null; void this.start(watch); }, Math.min(30000, 1000 * 2 ** watch.attempts++));
184
+ watch.timer.unref();
185
+ }
186
+ }
187
+ stop(watch, keepReply = false) {
188
+ watch.generation++; clearTimeout(watch.timer); watch.timer = null;
189
+ clearTimeout(watch.initialTimer); watch.initialTimer = null;
190
+ watch.controller?.abort(); watch.controller = null; watch.pending?.clear(); watch.liveActivity = null;
191
+ watch.subscriptionId = null; watch.revision = -1; watch.idle = false;
192
+ if (!keepReply) { this.clearReply(watch); watch.unavailable = false; watch.roomId = null; }
193
+ if (!keepReply) this.publish(watch, null);
194
+ // The SSE cancellation ends the server watch. The shared topic remains
195
+ // subscribed while this account socket lives, avoiding unsubscribe races.
196
+ }
197
+ close() { for (const watch of this.watches.values()) this.stop(watch); this.watches.clear(); }
198
+ dispose() { this.close(); this.server.rooms.off('message', this.message); }
199
+ }