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

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 (843) hide show
  1. package/README.md +83 -71
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +323 -184
  4. package/dist/bin/manage-relay-admin.mjs +20 -0
  5. package/dist/bin/migrate-relay-db.mjs +109 -0
  6. package/dist/bin/publish-android-release.mjs +63 -0
  7. package/dist/bin/publish-harmony-release.mjs +46 -0
  8. package/dist/bin/release-upload-server.mjs +174 -0
  9. package/dist/bin/self-relay-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +2 -2
  11. package/dist/bin/self-relay-server.mjs +43 -30
  12. package/dist/build-platform.json +1 -0
  13. package/dist/get-shared-service-url.ps1 +6 -6
  14. package/dist/shared/app-server-events.cjs +368 -238
  15. package/dist/shared/code-browser.cjs +159 -0
  16. package/dist/shared/file-changes.cjs +31 -0
  17. package/dist/shared/file-citations.cjs +117 -0
  18. package/dist/shared/file-mentions.cjs +92 -0
  19. package/dist/shared/message-delivery.cjs +100 -0
  20. package/dist/shared/p2p-data-channel.cjs +22 -0
  21. package/dist/shared/p2p-file-channel.cjs +84 -0
  22. package/dist/shared/plan-pricing.cjs +32 -0
  23. package/dist/shared/question-attention.cjs +69 -0
  24. package/dist/shared/server-requests.cjs +157 -5
  25. package/dist/shared/service-endpoints.cjs +21 -0
  26. package/dist/shared/timeline-sync.cjs +111 -5
  27. package/dist/skills/code-relax/SKILL.md +13 -8
  28. package/dist/src/archived-threads.mjs +22 -0
  29. package/dist/src/bounded-process-log.mjs +63 -0
  30. package/dist/src/celsius-client.mjs +107 -0
  31. package/dist/src/code-browser.mjs +100 -0
  32. package/dist/src/desktop-launcher.mjs +33 -38
  33. package/dist/src/dots-approval-timeline.mjs +99 -0
  34. package/dist/src/dots-avatar.mjs +42 -0
  35. package/dist/src/dots-chat-projection.mjs +50 -0
  36. package/dist/src/dots-chat-server.mjs +482 -0
  37. package/dist/src/dots-message-images.mjs +319 -0
  38. package/dist/src/dots-profile.mjs +77 -0
  39. package/dist/src/dots-room-activity.mjs +94 -0
  40. package/dist/src/dots-room-client.mjs +135 -0
  41. package/dist/src/dots-room-projection.mjs +94 -0
  42. package/dist/src/dots-schedules.mjs +66 -0
  43. package/dist/src/dots-summary-tasks.mjs +32 -0
  44. package/dist/src/dots-task-catalog.mjs +430 -0
  45. package/dist/src/dots-task-files.mjs +52 -0
  46. package/dist/src/file-transfer-range.mjs +22 -0
  47. package/dist/src/file-upload-session.mjs +130 -0
  48. package/dist/src/hosted-history-app-server.mjs +103 -0
  49. package/dist/src/hosted-history-cache.mjs +113 -0
  50. package/dist/src/lan-socket-server.mjs +241 -84
  51. package/dist/src/managed-app-server.mjs +54 -16
  52. package/dist/src/message-images.mjs +0 -18
  53. package/dist/src/message-upload-files.mjs +109 -0
  54. package/dist/src/onboarding.mjs +10 -29
  55. package/dist/src/plan-pricing.mjs +47 -0
  56. package/dist/src/platform/README.md +2 -2
  57. package/dist/src/platform/codex-protocol.mjs +46 -0
  58. package/dist/src/platform/codex-runtime.mjs +3 -0
  59. package/dist/src/platform/credential-store.mjs +3 -0
  60. package/dist/src/platform/desktop-host.mjs +3 -0
  61. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  62. package/dist/src/platform/desktop-project-store.mjs +208 -0
  63. package/dist/src/platform/file-opener.mjs +9 -0
  64. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  65. package/dist/src/platform/linux/credential-store.mjs +28 -0
  66. package/dist/src/platform/linux/desktop-host.mjs +83 -0
  67. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  68. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  69. package/dist/src/platform/linux/network-info.mjs +11 -0
  70. package/dist/src/platform/linux/process.mjs +42 -0
  71. package/dist/src/platform/linux/project-locations.mjs +17 -0
  72. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  73. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  74. package/dist/src/platform/linux/service-host.mjs +18 -0
  75. package/dist/src/platform/linux/system.mjs +49 -0
  76. package/dist/src/platform/linux/user-environment.mjs +7 -0
  77. package/dist/src/platform/macos/codex-runtime.mjs +125 -0
  78. package/dist/src/platform/macos/credential-store.mjs +10 -0
  79. package/dist/src/platform/macos/desktop-host.mjs +82 -0
  80. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  81. package/dist/src/platform/macos/network-info.mjs +8 -0
  82. package/dist/src/platform/macos/project-locations.mjs +8 -0
  83. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  84. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  85. package/dist/src/platform/macos/service-host.mjs +18 -0
  86. package/dist/src/platform/macos/system.mjs +29 -0
  87. package/dist/src/platform/macos/user-environment.mjs +7 -0
  88. package/dist/src/platform/native-package.mjs +58 -0
  89. package/dist/src/platform/network-info.mjs +3 -0
  90. package/dist/src/platform/path-identity.mjs +5 -0
  91. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  92. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  93. package/dist/src/platform/power-inhibitor.mjs +22 -0
  94. package/dist/src/platform/project-locations.mjs +3 -0
  95. package/dist/src/platform/runtime-paths.mjs +8 -0
  96. package/dist/src/platform/select.mjs +5 -0
  97. package/dist/src/platform/service-host.mjs +3 -0
  98. package/dist/src/platform/user-environment.mjs +3 -0
  99. package/dist/src/platform/windows/activate-desktop.ps1 +48 -0
  100. package/dist/src/platform/windows/codex-runtime.mjs +215 -0
  101. package/dist/src/platform/windows/credential-store.mjs +27 -27
  102. package/dist/src/platform/windows/credential-store.ps1 +49 -49
  103. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  104. package/dist/src/platform/windows/desktop-host.mjs +43 -23
  105. package/dist/src/platform/windows/desktop-info.ps1 +14 -16
  106. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  107. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  108. package/dist/src/platform/windows/desktop-shortcuts.ps1 +21 -28
  109. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  110. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  111. package/dist/src/platform/windows/launch-worker.mjs +17 -18
  112. package/dist/src/platform/windows/project-locations.mjs +16 -0
  113. package/dist/src/platform/windows/resident-start.js +20 -0
  114. package/dist/src/platform/windows/resident-startup.ps1 +76 -20
  115. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  116. package/dist/src/platform/windows/service-host.mjs +24 -36
  117. package/dist/src/platform/windows/stop-desktop.ps1 +7 -4
  118. package/dist/src/platform/windows/user-environment.mjs +1 -1
  119. package/dist/src/project-create.mjs +121 -0
  120. package/dist/src/project-management.mjs +59 -0
  121. package/dist/src/project-remove.mjs +55 -0
  122. package/dist/src/project-update.mjs +59 -0
  123. package/dist/src/runtime-discovery.mjs +47 -0
  124. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  125. package/dist/src/self-relay/account-connections.mjs +52 -0
  126. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  127. package/dist/src/self-relay/admin-page.mjs +80 -0
  128. package/dist/src/self-relay/admin-server.mjs +74 -0
  129. package/dist/src/self-relay/admin-state.mjs +85 -19
  130. package/dist/src/self-relay/admin-style.mjs +14 -0
  131. package/dist/src/self-relay/android-releases.mjs +61 -0
  132. package/dist/src/self-relay/client.mjs +45 -45
  133. package/dist/src/self-relay/connector.mjs +421 -144
  134. package/dist/src/self-relay/demo.mjs +34 -35
  135. package/dist/src/self-relay/device-info.mjs +27 -0
  136. package/dist/src/self-relay/device-store.mjs +10 -2
  137. package/dist/src/self-relay/diagnostics.mjs +54 -0
  138. package/dist/src/self-relay/email-accounts.mjs +183 -0
  139. package/dist/src/self-relay/file-wire.mjs +13 -0
  140. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  141. package/dist/src/self-relay/lifecycle.mjs +250 -272
  142. package/dist/src/self-relay/long-pairing.mjs +40 -0
  143. package/dist/src/self-relay/mysql-state.mjs +118 -0
  144. package/dist/src/self-relay/p2p-probe.mjs +41 -5
  145. package/dist/src/self-relay/privacy-page.mjs +26 -0
  146. package/dist/src/self-relay/public-releases.mjs +52 -0
  147. package/dist/src/self-relay/rtc-file-bridge.mjs +41 -0
  148. package/dist/src/self-relay/server.mjs +652 -114
  149. package/dist/src/self-relay/usage-daily.mjs +55 -0
  150. package/dist/src/self-relay/usage-meter.mjs +141 -0
  151. package/dist/src/server.mjs +1519 -1793
  152. package/dist/src/service-control.mjs +17 -7
  153. package/dist/src/service-doctor.mjs +86 -33
  154. package/dist/src/service-health.mjs +2 -2
  155. package/dist/src/service-install.mjs +91 -85
  156. package/dist/src/service-lifecycle.mjs +117 -108
  157. package/dist/src/service-power.mjs +58 -0
  158. package/dist/src/service-restart.mjs +43 -10
  159. package/dist/src/service-update-worker.mjs +42 -0
  160. package/dist/src/service-update.mjs +71 -0
  161. package/dist/src/shared-app-server.mjs +561 -407
  162. package/dist/src/shared-catalog.mjs +95 -13
  163. package/dist/src/shared-recovery.mjs +15 -11
  164. package/dist/src/shared-thread-stream.mjs +147 -63
  165. package/dist/src/skill-install.mjs +0 -13
  166. package/dist/src/turn-model-history.mjs +47 -0
  167. package/dist/src/usage-reset.mjs +17 -0
  168. package/dist/src/workstation-downloads.mjs +120 -0
  169. package/package.json +35 -37
  170. package/tools/postinstall.mjs +86 -22
  171. package/dist/src/app-server-client.mjs +0 -468
  172. package/dist/src/app-server-tasks.mjs +0 -358
  173. package/dist/src/debug-ui.mjs +0 -131
  174. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  175. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  176. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  177. package/dist/src/thread-catalog.mjs +0 -47
  178. package/dist/tools/find-desktop-pipe.mjs +0 -10
  179. package/dist/web/activity-view.js +0 -283
  180. package/dist/web/approval-ui.js +0 -188
  181. package/dist/web/capabilities.js +0 -57
  182. package/dist/web/chat-transport.js +0 -202
  183. package/dist/web/chat.css +0 -782
  184. package/dist/web/chat.js +0 -3830
  185. package/dist/web/client-platform.js +0 -11
  186. package/dist/web/community-view.js +0 -20
  187. package/dist/web/community.css +0 -77
  188. package/dist/web/community.html +0 -37
  189. package/dist/web/composer-controller.js +0 -101
  190. package/dist/web/conversation-controller.js +0 -99
  191. package/dist/web/disclosure-state-controller.js +0 -95
  192. package/dist/web/draft-controller.js +0 -103
  193. package/dist/web/harmony-platform.js +0 -52
  194. package/dist/web/highlight-powershell.min.js +0 -39
  195. package/dist/web/highlight.min.js +0 -1262
  196. package/dist/web/history-cache.js +0 -240
  197. package/dist/web/history-controller.js +0 -167
  198. package/dist/web/index.html +0 -325
  199. package/dist/web/lan-session.js +0 -122
  200. package/dist/web/link-action-controller.js +0 -212
  201. package/dist/web/message-send-controller.js +0 -177
  202. package/dist/web/message-view.js +0 -98
  203. package/dist/web/p2p-data-channel.js +0 -50
  204. package/dist/web/p2p-diagnostics.js +0 -28
  205. package/dist/web/p2p-probe.js +0 -123
  206. package/dist/web/page-resume.js +0 -28
  207. package/dist/web/pending-message-store.js +0 -108
  208. package/dist/web/queue-controller.js +0 -82
  209. package/dist/web/resources.json +0 -1
  210. package/dist/web/self-relay-session.js +0 -129
  211. package/dist/web/server-requests.js +0 -67
  212. package/dist/web/station-connection-controller.js +0 -75
  213. package/dist/web/task-list-view.js +0 -296
  214. package/dist/web/thread-attention-controller.js +0 -124
  215. package/dist/web/thread-context-controller.js +0 -30
  216. package/dist/web/thread-list-controller.js +0 -61
  217. package/dist/web/thread-list-sync.js +0 -86
  218. package/dist/web/thread-title-controller.js +0 -57
  219. package/dist/web/timeline-formatters.js +0 -249
  220. package/dist/web/timeline-reducer.js +0 -81
  221. package/dist/web/timeline-renderer.js +0 -161
  222. package/dist/web/timeline-scroll-controller.js +0 -50
  223. package/dist/web/timeline-sync.js +0 -67
  224. package/dist/web/usage-controller.js +0 -258
  225. package/dist/web/vendor/README.md +0 -14
  226. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  227. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  228. package/dist/web/vendor/highlight.min.js +0 -1262
  229. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  230. package/node_modules/@img/colour/LICENSE.md +0 -82
  231. package/node_modules/@img/colour/README.md +0 -15
  232. package/node_modules/@img/colour/color.cjs +0 -1596
  233. package/node_modules/@img/colour/index.cjs +0 -1
  234. package/node_modules/@img/colour/index.d.ts +0 -929
  235. package/node_modules/@img/colour/package.json +0 -58
  236. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  237. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  238. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  239. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  240. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  241. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  242. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  243. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  244. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  245. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  246. package/node_modules/ansi-regex/index.d.ts +0 -37
  247. package/node_modules/ansi-regex/index.js +0 -10
  248. package/node_modules/ansi-regex/license +0 -9
  249. package/node_modules/ansi-regex/package.json +0 -55
  250. package/node_modules/ansi-regex/readme.md +0 -78
  251. package/node_modules/ansi-styles/index.d.ts +0 -345
  252. package/node_modules/ansi-styles/index.js +0 -163
  253. package/node_modules/ansi-styles/license +0 -9
  254. package/node_modules/ansi-styles/package.json +0 -56
  255. package/node_modules/ansi-styles/readme.md +0 -152
  256. package/node_modules/camelcase/index.d.ts +0 -63
  257. package/node_modules/camelcase/index.js +0 -76
  258. package/node_modules/camelcase/license +0 -9
  259. package/node_modules/camelcase/package.json +0 -43
  260. package/node_modules/camelcase/readme.md +0 -99
  261. package/node_modules/cliui/CHANGELOG.md +0 -76
  262. package/node_modules/cliui/LICENSE.txt +0 -14
  263. package/node_modules/cliui/README.md +0 -115
  264. package/node_modules/cliui/index.js +0 -354
  265. package/node_modules/cliui/package.json +0 -65
  266. package/node_modules/color-convert/CHANGELOG.md +0 -54
  267. package/node_modules/color-convert/LICENSE +0 -21
  268. package/node_modules/color-convert/README.md +0 -68
  269. package/node_modules/color-convert/conversions.js +0 -839
  270. package/node_modules/color-convert/index.js +0 -81
  271. package/node_modules/color-convert/package.json +0 -48
  272. package/node_modules/color-convert/route.js +0 -97
  273. package/node_modules/color-name/LICENSE +0 -8
  274. package/node_modules/color-name/README.md +0 -11
  275. package/node_modules/color-name/index.js +0 -152
  276. package/node_modules/color-name/package.json +0 -28
  277. package/node_modules/decamelize/index.js +0 -13
  278. package/node_modules/decamelize/license +0 -21
  279. package/node_modules/decamelize/package.json +0 -38
  280. package/node_modules/decamelize/readme.md +0 -48
  281. package/node_modules/detect-libc/LICENSE +0 -201
  282. package/node_modules/detect-libc/README.md +0 -163
  283. package/node_modules/detect-libc/index.d.ts +0 -14
  284. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  285. package/node_modules/detect-libc/lib/elf.js +0 -39
  286. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  287. package/node_modules/detect-libc/lib/process.js +0 -24
  288. package/node_modules/detect-libc/package.json +0 -44
  289. package/node_modules/dijkstrajs/.travis.yml +0 -4
  290. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  291. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  292. package/node_modules/dijkstrajs/README.md +0 -18
  293. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  294. package/node_modules/dijkstrajs/package.json +0 -60
  295. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  296. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  297. package/node_modules/emoji-regex/README.md +0 -73
  298. package/node_modules/emoji-regex/es2015/index.js +0 -6
  299. package/node_modules/emoji-regex/es2015/text.js +0 -6
  300. package/node_modules/emoji-regex/index.d.ts +0 -23
  301. package/node_modules/emoji-regex/index.js +0 -6
  302. package/node_modules/emoji-regex/package.json +0 -50
  303. package/node_modules/emoji-regex/text.js +0 -6
  304. package/node_modules/find-up/index.d.ts +0 -137
  305. package/node_modules/find-up/index.js +0 -89
  306. package/node_modules/find-up/license +0 -9
  307. package/node_modules/find-up/package.json +0 -53
  308. package/node_modules/find-up/readme.md +0 -156
  309. package/node_modules/get-caller-file/LICENSE.md +0 -6
  310. package/node_modules/get-caller-file/README.md +0 -41
  311. package/node_modules/get-caller-file/index.d.ts +0 -2
  312. package/node_modules/get-caller-file/index.js +0 -22
  313. package/node_modules/get-caller-file/index.js.map +0 -1
  314. package/node_modules/get-caller-file/package.json +0 -42
  315. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  316. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  317. package/node_modules/is-fullwidth-code-point/license +0 -9
  318. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  319. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  320. package/node_modules/locate-path/index.d.ts +0 -83
  321. package/node_modules/locate-path/index.js +0 -65
  322. package/node_modules/locate-path/license +0 -9
  323. package/node_modules/locate-path/package.json +0 -45
  324. package/node_modules/locate-path/readme.md +0 -122
  325. package/node_modules/node-datachannel/.clang-format +0 -17
  326. package/node_modules/node-datachannel/.editorconfig +0 -12
  327. package/node_modules/node-datachannel/.eslintignore +0 -8
  328. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  329. package/node_modules/node-datachannel/.gitmodules +0 -3
  330. package/node_modules/node-datachannel/.prettierignore +0 -7
  331. package/node_modules/node-datachannel/.prettierrc +0 -13
  332. package/node_modules/node-datachannel/API.md +0 -247
  333. package/node_modules/node-datachannel/BULDING.md +0 -26
  334. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  335. package/node_modules/node-datachannel/LICENSE +0 -373
  336. package/node_modules/node-datachannel/README.md +0 -129
  337. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  338. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  339. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  340. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  341. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  342. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  343. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  344. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  345. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  346. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  347. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  348. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  349. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  350. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  352. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  354. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  374. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  376. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  378. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  380. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  382. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  384. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  386. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  388. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  390. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  392. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  394. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  408. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  410. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  411. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  412. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  413. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  414. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  415. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  416. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  417. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  418. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  419. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  420. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  421. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  424. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  425. package/node_modules/node-datachannel/jest.config.ts +0 -14
  426. package/node_modules/node-datachannel/package.json +0 -133
  427. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  428. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  429. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  430. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  431. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  432. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  433. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  434. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  435. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  436. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  437. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  438. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  439. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  440. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  441. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  442. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  443. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  444. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  445. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  446. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  447. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  448. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  449. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  450. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  451. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  452. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  453. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  454. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  455. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  456. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  457. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  458. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  459. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  460. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  461. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  462. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  463. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  464. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  465. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  466. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  467. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  468. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  469. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  470. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  471. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  472. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  473. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  474. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  475. package/node_modules/node-datachannel/src/index.ts +0 -9
  476. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  477. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  478. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  479. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  480. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  481. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  482. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  483. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  484. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  485. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  486. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  487. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  488. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  489. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  490. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  491. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  492. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  493. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  494. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  495. package/node_modules/node-datachannel/tsconfig.json +0 -21
  496. package/node_modules/p-limit/index.d.ts +0 -38
  497. package/node_modules/p-limit/index.js +0 -57
  498. package/node_modules/p-limit/license +0 -9
  499. package/node_modules/p-limit/package.json +0 -52
  500. package/node_modules/p-limit/readme.md +0 -101
  501. package/node_modules/p-locate/index.d.ts +0 -64
  502. package/node_modules/p-locate/index.js +0 -52
  503. package/node_modules/p-locate/license +0 -9
  504. package/node_modules/p-locate/package.json +0 -53
  505. package/node_modules/p-locate/readme.md +0 -90
  506. package/node_modules/p-try/index.d.ts +0 -39
  507. package/node_modules/p-try/index.js +0 -9
  508. package/node_modules/p-try/license +0 -9
  509. package/node_modules/p-try/package.json +0 -42
  510. package/node_modules/p-try/readme.md +0 -58
  511. package/node_modules/path-exists/index.d.ts +0 -28
  512. package/node_modules/path-exists/index.js +0 -23
  513. package/node_modules/path-exists/license +0 -9
  514. package/node_modules/path-exists/package.json +0 -39
  515. package/node_modules/path-exists/readme.md +0 -52
  516. package/node_modules/pngjs/.eslintignore +0 -2
  517. package/node_modules/pngjs/.eslintrc.json +0 -19
  518. package/node_modules/pngjs/.prettierignore +0 -3
  519. package/node_modules/pngjs/LICENSE +0 -20
  520. package/node_modules/pngjs/README.md +0 -429
  521. package/node_modules/pngjs/browser.js +0 -16096
  522. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  523. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  524. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  525. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  526. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  527. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  528. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  529. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  530. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  531. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  532. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  533. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  534. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  535. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  536. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  537. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  538. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  539. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  540. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  541. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  542. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  543. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  544. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  545. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  546. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  547. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  548. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  549. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  550. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  551. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  552. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  553. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  554. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  555. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  556. package/node_modules/pngjs/lib/constants.js +0 -32
  557. package/node_modules/pngjs/lib/crc.js +0 -40
  558. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  559. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  560. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  561. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  562. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  563. package/node_modules/pngjs/lib/interlace.js +0 -95
  564. package/node_modules/pngjs/lib/packer-async.js +0 -50
  565. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  566. package/node_modules/pngjs/lib/packer.js +0 -129
  567. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  568. package/node_modules/pngjs/lib/parser-async.js +0 -165
  569. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  570. package/node_modules/pngjs/lib/parser.js +0 -290
  571. package/node_modules/pngjs/lib/png-sync.js +0 -12
  572. package/node_modules/pngjs/lib/png.js +0 -194
  573. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  574. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  575. package/node_modules/pngjs/package.json +0 -73
  576. package/node_modules/qrcode/README.md +0 -770
  577. package/node_modules/qrcode/bin/qrcode +0 -159
  578. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  579. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  580. package/node_modules/qrcode/lib/browser.js +0 -76
  581. package/node_modules/qrcode/lib/can-promise.js +0 -7
  582. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  583. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  584. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  585. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  586. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  587. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  588. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  589. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  590. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  591. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  592. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  593. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  594. package/node_modules/qrcode/lib/core/mode.js +0 -167
  595. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  596. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  597. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  598. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  599. package/node_modules/qrcode/lib/core/regex.js +0 -31
  600. package/node_modules/qrcode/lib/core/segments.js +0 -330
  601. package/node_modules/qrcode/lib/core/utils.js +0 -63
  602. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  603. package/node_modules/qrcode/lib/core/version.js +0 -163
  604. package/node_modules/qrcode/lib/index.js +0 -12
  605. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  606. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  607. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  608. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  609. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  610. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  611. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  612. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  613. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  614. package/node_modules/qrcode/lib/server.js +0 -138
  615. package/node_modules/qrcode/license +0 -10
  616. package/node_modules/qrcode/package.json +0 -77
  617. package/node_modules/require-directory/.jshintrc +0 -67
  618. package/node_modules/require-directory/.npmignore +0 -1
  619. package/node_modules/require-directory/.travis.yml +0 -3
  620. package/node_modules/require-directory/LICENSE +0 -22
  621. package/node_modules/require-directory/README.markdown +0 -184
  622. package/node_modules/require-directory/index.js +0 -86
  623. package/node_modules/require-directory/package.json +0 -40
  624. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  625. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  626. package/node_modules/require-main-filename/README.md +0 -26
  627. package/node_modules/require-main-filename/index.js +0 -18
  628. package/node_modules/require-main-filename/package.json +0 -35
  629. package/node_modules/semver/LICENSE +0 -15
  630. package/node_modules/semver/README.md +0 -680
  631. package/node_modules/semver/bin/semver.js +0 -195
  632. package/node_modules/semver/classes/comparator.js +0 -143
  633. package/node_modules/semver/classes/index.js +0 -7
  634. package/node_modules/semver/classes/range.js +0 -577
  635. package/node_modules/semver/classes/semver.js +0 -350
  636. package/node_modules/semver/functions/clean.js +0 -8
  637. package/node_modules/semver/functions/cmp.js +0 -54
  638. package/node_modules/semver/functions/coerce.js +0 -62
  639. package/node_modules/semver/functions/compare-build.js +0 -9
  640. package/node_modules/semver/functions/compare-loose.js +0 -5
  641. package/node_modules/semver/functions/compare.js +0 -7
  642. package/node_modules/semver/functions/diff.js +0 -60
  643. package/node_modules/semver/functions/eq.js +0 -5
  644. package/node_modules/semver/functions/gt.js +0 -5
  645. package/node_modules/semver/functions/gte.js +0 -5
  646. package/node_modules/semver/functions/inc.js +0 -21
  647. package/node_modules/semver/functions/lt.js +0 -5
  648. package/node_modules/semver/functions/lte.js +0 -5
  649. package/node_modules/semver/functions/major.js +0 -5
  650. package/node_modules/semver/functions/minor.js +0 -5
  651. package/node_modules/semver/functions/neq.js +0 -5
  652. package/node_modules/semver/functions/parse.js +0 -18
  653. package/node_modules/semver/functions/patch.js +0 -5
  654. package/node_modules/semver/functions/prerelease.js +0 -8
  655. package/node_modules/semver/functions/rcompare.js +0 -5
  656. package/node_modules/semver/functions/rsort.js +0 -5
  657. package/node_modules/semver/functions/satisfies.js +0 -12
  658. package/node_modules/semver/functions/sort.js +0 -5
  659. package/node_modules/semver/functions/truncate.js +0 -48
  660. package/node_modules/semver/functions/valid.js +0 -8
  661. package/node_modules/semver/index.js +0 -93
  662. package/node_modules/semver/internal/constants.js +0 -37
  663. package/node_modules/semver/internal/debug.js +0 -11
  664. package/node_modules/semver/internal/identifiers.js +0 -29
  665. package/node_modules/semver/internal/lrucache.js +0 -42
  666. package/node_modules/semver/internal/parse-options.js +0 -17
  667. package/node_modules/semver/internal/re.js +0 -223
  668. package/node_modules/semver/package.json +0 -78
  669. package/node_modules/semver/preload.js +0 -4
  670. package/node_modules/semver/range.bnf +0 -17
  671. package/node_modules/semver/ranges/gtr.js +0 -6
  672. package/node_modules/semver/ranges/intersects.js +0 -9
  673. package/node_modules/semver/ranges/ltr.js +0 -6
  674. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  675. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  676. package/node_modules/semver/ranges/min-version.js +0 -63
  677. package/node_modules/semver/ranges/outside.js +0 -82
  678. package/node_modules/semver/ranges/simplify.js +0 -49
  679. package/node_modules/semver/ranges/subset.js +0 -249
  680. package/node_modules/semver/ranges/to-comparators.js +0 -10
  681. package/node_modules/semver/ranges/valid.js +0 -13
  682. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  683. package/node_modules/set-blocking/LICENSE.txt +0 -14
  684. package/node_modules/set-blocking/README.md +0 -31
  685. package/node_modules/set-blocking/index.js +0 -7
  686. package/node_modules/set-blocking/package.json +0 -42
  687. package/node_modules/sharp/LICENSE +0 -191
  688. package/node_modules/sharp/README.md +0 -112
  689. package/node_modules/sharp/dist/channel.cjs +0 -177
  690. package/node_modules/sharp/dist/channel.mjs +0 -177
  691. package/node_modules/sharp/dist/colour.cjs +0 -199
  692. package/node_modules/sharp/dist/colour.mjs +0 -199
  693. package/node_modules/sharp/dist/composite.cjs +0 -213
  694. package/node_modules/sharp/dist/composite.mjs +0 -213
  695. package/node_modules/sharp/dist/constructor.cjs +0 -511
  696. package/node_modules/sharp/dist/constructor.mjs +0 -511
  697. package/node_modules/sharp/dist/index.cjs +0 -25
  698. package/node_modules/sharp/dist/index.d.cts +0 -1999
  699. package/node_modules/sharp/dist/index.d.mts +0 -2046
  700. package/node_modules/sharp/dist/index.mjs +0 -25
  701. package/node_modules/sharp/dist/input.cjs +0 -819
  702. package/node_modules/sharp/dist/input.mjs +0 -819
  703. package/node_modules/sharp/dist/is.cjs +0 -143
  704. package/node_modules/sharp/dist/is.mjs +0 -143
  705. package/node_modules/sharp/dist/libvips.cjs +0 -212
  706. package/node_modules/sharp/dist/libvips.mjs +0 -212
  707. package/node_modules/sharp/dist/operation.cjs +0 -1002
  708. package/node_modules/sharp/dist/operation.mjs +0 -1002
  709. package/node_modules/sharp/dist/output.cjs +0 -1785
  710. package/node_modules/sharp/dist/output.mjs +0 -1785
  711. package/node_modules/sharp/dist/resize.cjs +0 -617
  712. package/node_modules/sharp/dist/resize.mjs +0 -617
  713. package/node_modules/sharp/dist/sharp.cjs +0 -174
  714. package/node_modules/sharp/dist/sharp.mjs +0 -174
  715. package/node_modules/sharp/dist/utility.cjs +0 -301
  716. package/node_modules/sharp/dist/utility.mjs +0 -301
  717. package/node_modules/sharp/install/build.js +0 -38
  718. package/node_modules/sharp/lib/index.d.ts +0 -1999
  719. package/node_modules/sharp/package.json +0 -227
  720. package/node_modules/sharp/src/binding.gyp +0 -303
  721. package/node_modules/sharp/src/common.cc +0 -1186
  722. package/node_modules/sharp/src/common.h +0 -421
  723. package/node_modules/sharp/src/metadata.cc +0 -404
  724. package/node_modules/sharp/src/metadata.h +0 -95
  725. package/node_modules/sharp/src/operations.cc +0 -516
  726. package/node_modules/sharp/src/operations.h +0 -137
  727. package/node_modules/sharp/src/pipeline.cc +0 -1948
  728. package/node_modules/sharp/src/pipeline.h +0 -422
  729. package/node_modules/sharp/src/sharp.cc +0 -43
  730. package/node_modules/sharp/src/stats.cc +0 -186
  731. package/node_modules/sharp/src/stats.h +0 -62
  732. package/node_modules/sharp/src/utilities.cc +0 -289
  733. package/node_modules/sharp/src/utilities.h +0 -22
  734. package/node_modules/string-width/index.d.ts +0 -29
  735. package/node_modules/string-width/index.js +0 -47
  736. package/node_modules/string-width/license +0 -9
  737. package/node_modules/string-width/package.json +0 -56
  738. package/node_modules/string-width/readme.md +0 -50
  739. package/node_modules/strip-ansi/index.d.ts +0 -17
  740. package/node_modules/strip-ansi/index.js +0 -4
  741. package/node_modules/strip-ansi/license +0 -9
  742. package/node_modules/strip-ansi/package.json +0 -54
  743. package/node_modules/strip-ansi/readme.md +0 -46
  744. package/node_modules/which-module/LICENSE +0 -13
  745. package/node_modules/which-module/README.md +0 -58
  746. package/node_modules/which-module/index.js +0 -9
  747. package/node_modules/which-module/package.json +0 -41
  748. package/node_modules/wrap-ansi/index.js +0 -186
  749. package/node_modules/wrap-ansi/license +0 -9
  750. package/node_modules/wrap-ansi/package.json +0 -61
  751. package/node_modules/wrap-ansi/readme.md +0 -97
  752. package/node_modules/ws/LICENSE +0 -20
  753. package/node_modules/ws/README.md +0 -548
  754. package/node_modules/ws/browser.js +0 -8
  755. package/node_modules/ws/index.js +0 -22
  756. package/node_modules/ws/lib/buffer-util.js +0 -131
  757. package/node_modules/ws/lib/constants.js +0 -19
  758. package/node_modules/ws/lib/event-target.js +0 -292
  759. package/node_modules/ws/lib/extension.js +0 -203
  760. package/node_modules/ws/lib/limiter.js +0 -55
  761. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  762. package/node_modules/ws/lib/receiver.js +0 -743
  763. package/node_modules/ws/lib/sender.js +0 -607
  764. package/node_modules/ws/lib/stream.js +0 -161
  765. package/node_modules/ws/lib/subprotocol.js +0 -62
  766. package/node_modules/ws/lib/validation.js +0 -152
  767. package/node_modules/ws/lib/websocket-server.js +0 -562
  768. package/node_modules/ws/lib/websocket.js +0 -1407
  769. package/node_modules/ws/package.json +0 -74
  770. package/node_modules/ws/wrapper.mjs +0 -21
  771. package/node_modules/y18n/CHANGELOG.md +0 -35
  772. package/node_modules/y18n/LICENSE +0 -13
  773. package/node_modules/y18n/README.md +0 -109
  774. package/node_modules/y18n/index.js +0 -188
  775. package/node_modules/y18n/package.json +0 -39
  776. package/node_modules/yargs/CHANGELOG.md +0 -420
  777. package/node_modules/yargs/LICENSE +0 -21
  778. package/node_modules/yargs/README.md +0 -140
  779. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  780. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  781. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  782. package/node_modules/yargs/build/lib/argsert.js +0 -65
  783. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  784. package/node_modules/yargs/build/lib/command.js +0 -416
  785. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  786. package/node_modules/yargs/build/lib/common-types.js +0 -25
  787. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  788. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  789. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  790. package/node_modules/yargs/build/lib/completion.js +0 -135
  791. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  792. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  793. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  794. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  795. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  796. package/node_modules/yargs/build/lib/middleware.js +0 -57
  797. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  798. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  799. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  800. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  801. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  802. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  803. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  804. package/node_modules/yargs/build/lib/usage.js +0 -540
  805. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  806. package/node_modules/yargs/build/lib/validation.js +0 -330
  807. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  808. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  809. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  810. package/node_modules/yargs/build/lib/yerror.js +0 -11
  811. package/node_modules/yargs/index.js +0 -40
  812. package/node_modules/yargs/locales/be.json +0 -46
  813. package/node_modules/yargs/locales/de.json +0 -46
  814. package/node_modules/yargs/locales/en.json +0 -51
  815. package/node_modules/yargs/locales/es.json +0 -46
  816. package/node_modules/yargs/locales/fi.json +0 -49
  817. package/node_modules/yargs/locales/fr.json +0 -53
  818. package/node_modules/yargs/locales/hi.json +0 -49
  819. package/node_modules/yargs/locales/hu.json +0 -46
  820. package/node_modules/yargs/locales/id.json +0 -50
  821. package/node_modules/yargs/locales/it.json +0 -46
  822. package/node_modules/yargs/locales/ja.json +0 -51
  823. package/node_modules/yargs/locales/ko.json +0 -49
  824. package/node_modules/yargs/locales/nb.json +0 -44
  825. package/node_modules/yargs/locales/nl.json +0 -49
  826. package/node_modules/yargs/locales/nn.json +0 -44
  827. package/node_modules/yargs/locales/pirate.json +0 -13
  828. package/node_modules/yargs/locales/pl.json +0 -49
  829. package/node_modules/yargs/locales/pt.json +0 -45
  830. package/node_modules/yargs/locales/pt_BR.json +0 -48
  831. package/node_modules/yargs/locales/ru.json +0 -46
  832. package/node_modules/yargs/locales/th.json +0 -46
  833. package/node_modules/yargs/locales/tr.json +0 -48
  834. package/node_modules/yargs/locales/zh_CN.json +0 -48
  835. package/node_modules/yargs/locales/zh_TW.json +0 -47
  836. package/node_modules/yargs/package.json +0 -92
  837. package/node_modules/yargs/yargs.js +0 -14
  838. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  839. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  840. package/node_modules/yargs-parser/README.md +0 -449
  841. package/node_modules/yargs-parser/index.js +0 -1032
  842. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  843. package/node_modules/yargs-parser/package.json +0 -46
@@ -1,19 +1,19 @@
1
- import WebSocket from 'ws';
2
- import { EventEmitter } from 'node:events';
3
- import { randomUUID } from 'node:crypto';
4
- import events from '../shared/app-server-events.cjs';
5
- import serverRequests from '../shared/server-requests.cjs';
6
-
1
+ import WebSocket from 'ws';
2
+ import { EventEmitter } from 'node:events';
3
+ import { randomUUID } from 'node:crypto';
4
+ import events from '../shared/app-server-events.cjs';
5
+ import messageDelivery from '../shared/message-delivery.cjs';
6
+ import serverRequests from '../shared/server-requests.cjs';
7
+
7
8
  const syncTokenTtlMs = 30_000;
8
9
  const syncBufferMaxBytes = 8 * 1024 * 1024;
9
10
  const historyPageMaxTurns = 8;
10
11
  const historyPageMaxBytes = 500 * 1024;
11
- const turnItemPageSize = 50;
12
12
  const writerConflictMessages = ['already has an active writer', 'already has a live local writer'];
13
13
 
14
14
  export class ThreadWriterConflictError extends Error {
15
15
  constructor(threadId, message) {
16
- super('该对话正在另一个 Codex 实例中使用。');
16
+ super('该对话存在写入冲突,请稍后重试。');
17
17
  this.name = 'ThreadWriterConflictError';
18
18
  this.code = 'thread_writer_owned_elsewhere';
19
19
  this.threadId = threadId;
@@ -26,291 +26,478 @@ export function isThreadWriterConflict(error) {
26
26
  const message = String(error?.message || error).toLowerCase();
27
27
  return error instanceof ThreadWriterConflictError || writerConflictMessages.some(text => message.includes(text));
28
28
  }
29
-
30
- // Connect to the Desktop's existing execution service; never spawn or adopt a task.
31
- export class SharedAppServer extends EventEmitter {
32
- constructor(url) {
33
- super();
34
- const address = new URL(url);
35
- if (address.protocol !== 'ws:' || address.hostname !== '127.0.0.1') throw new Error('完整控制必须使用本机回环 WebSocket。');
36
- this.url = url;
37
- this.epoch = randomUUID();
38
- this.sequence = 0;
39
- this.pending = new Map();
40
- this.serverRequests = new serverRequests.Store(randomUUID(), id => this.emit('requests-changed', id));
41
- this.threads = new Map();
42
- this.contexts = new Map();
43
- this.settingsNotifications = new Map();
29
+
30
+ // Connect to the Desktop's existing execution service; never spawn or adopt a task.
31
+ export class SharedAppServer extends EventEmitter {
32
+ constructor(url) {
33
+ super();
34
+ const address = new URL(url);
35
+ if (address.protocol !== 'ws:' || address.hostname !== '127.0.0.1') throw new Error('Codex 内核必须使用本机回环 WebSocket。');
36
+ this.url = url;
37
+ this.serverVersion = '';
38
+ this.epoch = randomUUID();
39
+ this.sequence = 0;
40
+ this.connectionId = null;
41
+ this.pending = new Map();
42
+ this.serverRequests = new serverRequests.Store(randomUUID(), id => {
43
+ this.emit('requests-changed', id);
44
+ this.releaseInactiveThread(id);
45
+ });
46
+ this.threads = new Map();
47
+ this.contexts = new Map();
48
+ this.settingsNotifications = new Map();
44
49
  this.permissionOptions = new events.PermissionOptionsCache();
45
50
  this.subscriptions = new Map();
46
- this.operationGroups = new Map();
47
51
  this.usageCache = new events.UsageCache(value => this.emit('usage', value));
48
- }
49
-
50
- async connect() {
51
- if (this.socket?.readyState === WebSocket.OPEN && this.ready) return;
52
- if (this.connecting) return this.connecting;
53
- this.connecting = this.open().finally(() => { this.connecting = null; });
54
- return this.connecting;
55
- }
56
-
57
- async open() {
58
- const socket = new WebSocket(this.url, { handshakeTimeout: 5000 });
59
- this.socket = socket;
60
- this.ready = false;
61
- this.serverRequests.reset(randomUUID());
62
- socket.on('message', bytes => {
63
- let message;
64
- try { message = JSON.parse(bytes.toString()); } catch { socket.close(); return; }
65
- if (message.method && message.id !== undefined) { this.serverRequests.receive(message); return; }
66
- if (message.method) { this.notification(message.method, message.params || {}); return; }
67
- const pending = this.pending.get(message.id);
68
- if (!pending) return;
69
- this.pending.delete(message.id);
70
- clearTimeout(pending.timer);
52
+ }
53
+
54
+ async connect() {
55
+ if (this.socket?.readyState === WebSocket.OPEN && this.ready) return;
56
+ if (this.connecting) return this.connecting;
57
+ this.connecting = this.open().finally(() => { this.connecting = null; });
58
+ return this.connecting;
59
+ }
60
+
61
+ openSocket() {
62
+ return new WebSocket(this.url, { handshakeTimeout: 5000 });
63
+ }
64
+
65
+ async open() {
66
+ const socket = await this.openSocket();
67
+ this.socket = socket;
68
+ this.connectionId = randomUUID();
69
+ this.ready = false;
70
+ this.serverVersion = '';
71
+ this.serverRequests.reset(randomUUID());
72
+ socket.on('message', bytes => {
73
+ let message;
74
+ try { message = JSON.parse(bytes.toString()); } catch { socket.close(); return; }
75
+ if (message.method && message.id !== undefined) { this.serverRequests.receive(message); return; }
76
+ if (message.method) { this.notification(message.method, message.params || {}); return; }
77
+ const pending = this.pending.get(message.id);
78
+ if (!pending) return;
79
+ this.pending.delete(message.id);
80
+ clearTimeout(pending.timer);
71
81
  if (message.error) {
72
82
  const text = String(message.error.message || 'app-server 请求失败');
83
+ this.traceLifecycle('error', pending, { rpcCode: message.error.code,
84
+ writerError: writerConflictMessages.find(value => text.toLowerCase().includes(value)) || null });
73
85
  pending.reject(writerConflictMessages.some(value => text.toLowerCase().includes(value))
74
86
  ? new ThreadWriterConflictError(pending.threadId, text)
75
- : Object.assign(new Error(text), { rpcCode: message.error.code, details: message.error.data }));
87
+ : Object.assign(new Error(text), { rpcCode: message.error.code, details: message.error.data,
88
+ ...(/^invalid cursor:/i.test(text) ? { code: 'history_cursor_expired' } : {}) }));
89
+ }
90
+ else {
91
+ this.traceLifecycle('complete', pending, { status: message.result?.status,
92
+ resultThreadId: message.result?.thread?.id, resultServiceTier: message.result?.serviceTier });
93
+ try { pending.resolve(pending.transform(message.result)); }
94
+ catch (error) { pending.reject(error); }
95
+ }
96
+ });
97
+ socket.on('close', () => {
98
+ this.ready = false;
99
+ this.serverVersion = '';
100
+ for (const pending of this.pending.values()) {
101
+ clearTimeout(pending.timer);
102
+ this.traceLifecycle('disconnected', pending);
103
+ pending.reject(new Error('Codex 内核连接断开;发送结果可能未确认,请检查对话后再操作。'));
76
104
  }
77
- else pending.resolve(message.result);
78
- });
79
- socket.on('close', () => {
80
- this.ready = false;
81
- for (const pending of this.pending.values()) {
82
- clearTimeout(pending.timer);
83
- pending.reject(new Error('完整控制连接断开;发送结果可能未确认,请检查对话后再操作。'));
84
- }
85
105
  this.pending.clear();
86
106
  this.serverRequests.reset(randomUUID());
87
107
  this.threads.clear();
88
- this.operationGroups.clear();
89
- for (const slot of this.subscriptions.values()) clearTimeout(slot.expiry);
90
- this.subscriptions.clear();
91
- this.contexts.clear();
92
- this.settingsNotifications.clear();
93
- this.permissionOptions.clear();
94
- this.usageCache.reset();
95
- this.emit('disconnected');
96
- });
97
- socket.on('error', () => {}); // open/request reports the connection error to the caller.
98
- await new Promise((resolve, reject) => { socket.once('open', resolve); socket.once('error', reject); });
99
- try {
100
- await this.request('initialize', { clientInfo: { name: 'codex_remote_shared', version: '1.0.0' }, capabilities: { experimentalApi: true } });
101
- socket.send(JSON.stringify({ method: 'initialized' }));
102
- this.ready = true;
103
- this.usageCache.read(() => this.request('account/rateLimits/read')).catch(error => this.emit('usage-error', error));
104
- } catch (error) { socket.close(); throw error; }
105
- }
106
-
107
- request(method, params) {
108
- const id = ++this.sequence;
109
- return new Promise((resolve, reject) => {
110
- const timer = setTimeout(() => {
111
- this.pending.delete(id);
112
- reject(new Error(`${method} 超时;不会自动重发,请先检查对话。`));
113
- }, 30000);
114
- this.pending.set(id, { resolve, reject, timer, threadId: params?.threadId });
115
- this.socket.send(JSON.stringify({ id, method, params }), error => {
116
- if (!error || !this.pending.delete(id)) return;
117
- clearTimeout(timer); reject(error);
118
- });
119
- });
120
- }
121
-
122
- async projects() {
123
- await this.connect();
124
- return events.readProjects((method, params) => this.request(method, params));
125
- }
126
-
127
- async send(args) {
108
+ for (const slot of this.subscriptions.values()) clearTimeout(slot.expiry);
109
+ this.subscriptions.clear();
110
+ this.contexts.clear();
111
+ this.settingsNotifications.clear();
112
+ this.permissionOptions.clear();
113
+ this.usageCache.reset();
114
+ this.emit('disconnected');
115
+ });
116
+ socket.on('error', () => {}); // open/request reports the connection error to the caller.
117
+ await new Promise((resolve, reject) => { socket.once('open', resolve); socket.once('error', reject); });
118
+ try {
119
+ const initialized = await this.request('initialize', { clientInfo: { name: 'codex_remote_shared', version: '1.0.0' }, capabilities: { experimentalApi: true } });
120
+ // The first user-agent product reports the running server build, not the
121
+ // selected executable that may only take effect after a future restart.
122
+ this.serverVersion = String(initialized?.userAgent || '').match(/^[^\s/]+\/([^\s]+)/)?.[1] || '';
123
+ socket.send(JSON.stringify({ method: 'initialized' }));
124
+ this.ready = true;
125
+ this.usageCache.read(() => this.request('account/rateLimits/read')).catch(error => this.emit('usage-error', error));
126
+ } catch (error) { socket.close(); throw error; }
127
+ }
128
+
129
+ request(method, params, transform = value => value) {
130
+ const id = ++this.sequence;
131
+ const diagnostic = { method, requestId: id, threadId: params?.threadId, connectionId: this.connectionId,
132
+ ...(method === 'thread/settings/update' && params?.serviceTier !== undefined ? { serviceTier: params.serviceTier } : {}) };
133
+ this.traceLifecycle('begin', diagnostic);
134
+ return new Promise((resolve, reject) => {
135
+ const timer = setTimeout(() => {
136
+ const error = Object.assign(new Error(`${method} 超时;不会自动重发,请先检查对话。`),
137
+ { code: 'app_server_request_timeout' });
138
+ this.traceLifecycle('timeout', diagnostic);
139
+ if (['turn/start', 'turn/steer', 'thread/queue/add'].includes(method) && this.pending.has(id)) {
140
+ messageDelivery.retainLateResult(this.pending.get(id), error);
141
+ } else { this.pending.delete(id); reject(error); }
142
+ }, 30000);
143
+ this.pending.set(id, { resolve, reject, timer, transform, ...diagnostic });
144
+ this.socket.send(JSON.stringify({ id, method, params }), error => {
145
+ const pending = this.pending.get(id);
146
+ if (!error || !pending) return;
147
+ this.traceLifecycle('send-error', diagnostic);
148
+ this.pending.delete(id);
149
+ clearTimeout(timer); pending.reject(error);
150
+ });
151
+ });
152
+ }
153
+
154
+ traceLifecycle(phase, request, extra = {}) {
155
+ if (!['thread/start', 'thread/resume', 'thread/unsubscribe', 'thread/settings/update', 'thread/settings/updated'].includes(request.method)) return;
156
+ const threadId = value => typeof value === 'string' && /^[\w-]{1,80}$/.test(value) ? value : null;
157
+ const identity = this.diagnosticIdentity?.() || {};
158
+ console.info('[thread-lifecycle]', JSON.stringify({ time: new Date().toISOString(), bridgePid: process.pid,
159
+ kernelPid: identity.kernelPid ?? null, kernelCreated: identity.kernelCreated ?? null,
160
+ connectionId: request.connectionId, serverVersion: this.serverVersion, phase,
161
+ method: request.method, requestId: request.requestId, threadId: threadId(request.threadId),
162
+ ...([null, 'default', 'priority', 'fast'].includes(request.serviceTier) ? { serviceTier: request.serviceTier } : {}),
163
+ ...(extra.resultThreadId ? { resultThreadId: threadId(extra.resultThreadId) } : {}),
164
+ ...(extra.resultServiceTier !== undefined && [null, 'default', 'priority', 'fast'].includes(extra.resultServiceTier)
165
+ ? { resultServiceTier: extra.resultServiceTier } : {}),
166
+ ...(typeof extra.status === 'string' && /^[\w-]{1,40}$/.test(extra.status) ? { status: extra.status } : {}),
167
+ ...(typeof extra.rpcCode === 'number' ? { rpcCode: extra.rpcCode } : {}),
168
+ ...(extra.writerError ? { writerError: extra.writerError } : {}) }));
169
+ }
170
+
171
+ async projects() {
172
+ await this.connect();
173
+ return events.readProjects((method, params) => this.request(method, params));
174
+ }
175
+
176
+ async send(args, { assertCurrent = () => {} } = {}) {
177
+ let submitted = false;
178
+ try {
179
+ await this.connect();
180
+ this.requireWritable(args.threadId);
181
+ // Reading the live thread checks this service owns it without resume changing settings.
182
+ const { thread } = await this.request('thread/read', { threadId: args.threadId, includeTurns: false });
183
+ assertCurrent();
184
+ const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
185
+ if (status === 'active') {
186
+ const page = await this.request('thread/turns/list', {
187
+ threadId: args.threadId, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded',
188
+ });
189
+ const active = page.data?.[0];
190
+ assertCurrent();
191
+ if (active?.status !== 'inProgress') throw new Error('活动轮次已变化,请刷新后再发送。');
192
+ const { turnTrigger, ...source } = events.mobileTurnSource(args.clientUserMessageId, args.responsesapiClientMetadata?.code_relax_input === 'speech_to_text');
193
+ submitted = true;
194
+ return await this.request('turn/steer', { threadId: args.threadId, expectedTurnId: active.id, input: args.input, ...source, ...(args.clientUserMessageId ? { clientUserMessageId: args.clientUserMessageId } : {}) },
195
+ result => ({ result, usage: { kind: 'steer', turnId: active.id } }));
196
+ }
197
+ submitted = true;
198
+ return await this.request('turn/start', args,
199
+ result => ({ result, usage: { kind: 'start', turnId: result?.turn?.id || null } }));
200
+ } catch (error) {
201
+ if (!submitted || messageDelivery.rejectedBeforeSubmission(error)) error.deliveryUnknown = false;
202
+ throw error;
203
+ }
204
+ }
205
+
206
+ async findSentMessage(threadId, clientId, anchorItemId) {
128
207
  await this.connect();
129
- this.requireWritable(args.threadId);
130
- // Reading the live thread checks this service owns it without resume changing settings.
131
- const { thread } = await this.request('thread/read', { threadId: args.threadId, includeTurns: false });
132
- const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
133
- if (status === 'active') {
134
- const live = await this.request('thread/read', { threadId: args.threadId, includeTurns: true });
135
- const active = live.thread.turns?.findLast(turn => turn.status === 'inProgress');
136
- if (!active) throw new Error('活动轮次已变化,请刷新后再发送。');
137
- return this.request('turn/steer', { threadId: args.threadId, expectedTurnId: active.id, input: args.input, ...(args.clientUserMessageId ? { clientUserMessageId: args.clientUserMessageId } : {}) });
138
- }
139
- return this.request('turn/start', args);
140
- }
141
-
208
+ return messageDelivery.findMessage((method, params) => this.request(method, params), threadId, clientId, anchorItemId);
209
+ }
210
+
142
211
  respondApproval(threadId, body) {
143
- if (!this.ready || this.socket?.readyState !== WebSocket.OPEN) throw new Error('完整控制未连接');
212
+ if (!this.ready || this.socket?.readyState !== WebSocket.OPEN) throw new Error('Codex 内核未就绪');
144
213
  this.requireWritable(threadId);
145
- return this.serverRequests.respond(threadId, body, message => new Promise((resolve, reject) => {
146
- this.socket.send(JSON.stringify(message), error => error ? reject(error) : resolve());
147
- }));
148
- }
149
-
150
- notification(method, params) {
151
- this.serverRequests.notification(method, params);
152
- this.emit('notification', { method, params });
153
- if (method === 'thread/queue/changed') { this.emit('queue-changed', params.threadId); return; }
154
- if (method === 'account/rateLimits/updated') { this.usageCache.update(params); return; }
155
- const id = params.threadId;
156
- if (method === 'thread/settings/updated') {
157
- const settings = params.threadSettings;
158
- this.contexts.set(id, { ...this.contexts.get(id), model: settings.model, thinking: settings.effort, serviceTier: settings.serviceTier ?? null,
159
- cwd: settings.cwd, ...events.permissionState(settings) });
160
- this.settingsNotifications.set(id, settings);
161
- this.emit('settings', id);
162
- return;
163
- }
164
- if (method === 'thread/tokenUsage/updated') {
165
- this.contexts.set(id, { ...this.contexts.get(id), tokenUsage: params.tokenUsage });
166
- return;
214
+ return this.serverRequests.respond(threadId, body, message => new Promise((resolve, reject) => {
215
+ this.socket.send(JSON.stringify(message), error => error ? reject(error) : resolve());
216
+ }));
217
+ }
218
+
219
+ notification(method, params) {
220
+ this.serverRequests.notification(method, params);
221
+ this.emit('notification', { method, params });
222
+ if (method === 'thread/queue/changed') { this.emit('queue-changed', params.threadId); return; }
223
+ if (method === 'account/rateLimits/updated') { this.usageCache.update(params); return; }
224
+ const id = params.threadId;
225
+ if (method === 'thread/settings/updated') {
226
+ const settings = params.threadSettings;
227
+ this.traceLifecycle('notification', { method, threadId: id, connectionId: this.connectionId, serviceTier: settings.serviceTier ?? null });
228
+ this.contexts.set(id, { ...this.contexts.get(id), model: settings.model, thinking: settings.effort, serviceTier: settings.serviceTier ?? null,
229
+ cwd: settings.cwd, ...events.permissionState(settings) });
230
+ this.settingsNotifications.set(id, settings);
231
+ this.emit('settings', id);
232
+ return;
233
+ }
234
+ if (method === 'thread/tokenUsage/updated') {
235
+ this.contexts.set(id, { ...this.contexts.get(id), tokenUsage: params.tokenUsage });
236
+ return;
167
237
  }
168
238
  const record = this.threads.get(id);
169
239
  if (!record) return;
170
- const current = params.turn?.id ? record.thread.turns?.find(turn => turn.id === params.turn.id) : null;
171
- const groupedHistory = current?.items?.some(item => item?.type === 'lazyOperationGroup');
172
- const appliedParams = groupedHistory && method === 'turn/completed' && Array.isArray(params.turn?.items)
240
+ if (method === 'thread/name/updated') {
241
+ record.thread.name = params.threadName;
242
+ return; // Catalog metadata must not invalidate or replay message bodies.
243
+ }
244
+ const stub = record.thread.turns?.find(turn => turn.cacheStub && turn.id === (params.turn?.id || params.turnId));
245
+ if (stub && !['thread/status/changed', 'thread/name/updated'].includes(method)) {
246
+ record.needsReload = true;
247
+ this.emit('history-invalidated', id);
248
+ return;
249
+ }
250
+ if (!this.isThreadObserved(id, record)) {
251
+ // Keep task/approval lifecycle metadata, not an invisible growing transcript.
252
+ record.needsReload = true;
253
+ if (params.turn) events.applyNotification(record.thread, method, { ...params, turn: { ...params.turn, items: [] } });
254
+ else if (method === 'thread/status/changed') record.thread.status = params.status;
255
+ record.thread.turns = (record.thread.turns || []).slice(-1).map(turn => ({ ...turn, items: [] }));
256
+ record.changes.clear(); record.changeBytes = 0;
257
+ if (['turn/completed', 'thread/status/changed'].includes(method)) this.releaseInactiveThread(id);
258
+ return;
259
+ }
260
+ const current = record.thread.turns?.find(turn => turn.id === (params.turn?.id || params.turnId));
261
+ if (method === 'item/completed' && !record.hydrating && current?.itemPage?.olderCursor && !current.items.some(item => item.id === params.item?.id)) return;
262
+ // Current app-server completion summaries carry the terminal answer, not
263
+ // an unrequested history page. Its ID may be new during snapshot handoff.
264
+ const visibleParams = (record.hydrating || current?.itemPage?.olderCursor) && method === 'turn/completed'
265
+ && params.turn?.itemsView !== 'summary' && Array.isArray(params.turn?.items)
173
266
  ? { ...params, turn: { ...params.turn,
174
- items: params.turn.items.filter(item => ['userMessage', 'agentMessage'].includes(item?.type)) } }
267
+ items: params.turn.items.filter(item => current?.items?.some(loaded => loaded.id === item.id)) } }
175
268
  : params;
269
+ const appliedParams = { ...visibleParams,
270
+ ...(visibleParams.item ? { item: events.compactItem(visibleParams.item) } : {}),
271
+ ...(visibleParams.turn ? { turn: events.compactTurn(visibleParams.turn) } : {}) };
176
272
  const turn = events.applyNotification(record.thread, method, appliedParams);
177
- if (turn) {
178
- const sequence = ++record.sequence;
179
- record.changes.set(turn.id, { sequence, turn });
273
+ if (turn) {
274
+ const sequence = ++record.sequence;
275
+ record.changes.set(turn.id, { sequence, turn });
180
276
  record.changeBytes += Buffer.byteLength(JSON.stringify({ method, params: appliedParams }));
181
- if (record.changeBytes > syncBufferMaxBytes) {
182
- record.recoverAfter = sequence;
183
- record.changes.clear(); record.changeBytes = 0;
184
- }
185
- this.emit('turn', { thread: record.thread, turn, sequence,
186
- immediate: ['turn/completed', 'item/completed'].includes(method) });
187
- }
188
- if (method === 'turn/completed') record.thread.turns = record.thread.turns.slice(-10);
189
- }
190
-
191
- async timeline(threadId, pageOptions = {}) {
192
- await this.connect();
193
- const slot = this.slot(threadId);
194
- const task = slot.tail.then(async () => {
195
- let record = this.threads.get(threadId);
196
- if (record?.readOnly) {
197
- this.threads.delete(threadId);
198
- this.contexts.delete(threadId);
199
- record = null;
277
+ if (record.changeBytes > syncBufferMaxBytes) {
278
+ record.recoverAfter = sequence;
279
+ record.changes.clear(); record.changeBytes = 0;
280
+ }
281
+ this.emit('turn', { thread: record.thread, turn, sequence,
282
+ immediate: ['turn/completed', 'item/completed'].includes(method) });
283
+ }
284
+ if (method === 'turn/completed' && record.thread.turns.length > 10) {
285
+ record.thread.turns = record.thread.turns.slice(-10);
286
+ // Native cursors are opaque; obtain a matching boundary before the next snapshot.
287
+ record.historyTrimmed = true;
288
+ }
289
+ if (['turn/completed', 'thread/status/changed'].includes(method)) this.releaseInactiveThread(id);
290
+ }
291
+
292
+ matchesUpdatedAt(thread, updatedAt) {
293
+ const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
294
+ const latest = thread.turns?.at(-1);
295
+ return Number(updatedAt) > 0 && status !== 'active' && latest?.status !== 'inProgress'
296
+ && Math.floor(Number(thread.updatedAt)) === Math.floor(Number(updatedAt));
297
+ }
298
+
299
+ resumeTimeline(threadId, apply) {
300
+ return this.request('thread/resume', { threadId, excludeTurns: true,
301
+ initialTurnsPage: { limit: 1, sortDirection: 'desc', itemsView: 'notLoaded' } }, value => {
302
+ if (!Array.isArray(value.initialTurnsPage?.data)) throw new Error('Codex 内核未返回分页历史。');
303
+ return apply(value);
304
+ });
305
+ }
306
+
307
+ initialTurnsPage(_threadId, resumed) { return resumed.initialTurnsPage; }
308
+
309
+ async timeline(threadId, pageOptions = {}, knownSync) {
310
+ await this.connect();
311
+ const slot = this.slot(threadId);
312
+ slot.readers++;
313
+ const task = slot.tail.then(async () => {
314
+ let record = this.threads.get(threadId), metadataReused = false;
315
+ // Seconds are the product's cache-update granularity. Active work still
316
+ // uses the received sequence so an in-progress reply can keep advancing.
317
+ const knownToken = record?.tokens.get(knownSync?.id);
318
+ const unchanged = Boolean(!pageOptions.reconcileObserved && record && !record.readOnly && !record.needsReload && !record.hydrating
319
+ && (this.matchesUpdatedAt(record.thread, knownSync?.updatedAt)
320
+ || (knownSync?.epoch === this.epoch && Number.isSafeInteger(knownSync.seq)
321
+ && knownToken && knownToken.expires > Date.now()
322
+ && knownToken.sequence === knownSync.seq && record.sequence === knownSync.seq)));
323
+ if (unchanged) {
324
+ const id = randomUUID();
325
+ record.tokens.set(id, { sequence: record.sequence, expires: Date.now() + syncTokenTtlMs });
326
+ this.scheduleCleanup(threadId, slot);
327
+ return { thread: { ...record.thread, turns: [] }, notModified: true,
328
+ sync: { id, epoch: this.epoch, seq: record.sequence } };
200
329
  }
201
- if (!record) {
202
- let result;
330
+ // Snapshot refreshes must not reset the sequence or tokens of live subscribers.
331
+ const previous = record?.readOnly ? null : record;
332
+ if (record?.readOnly || record?.needsReload) this.contexts.delete(threadId);
333
+ if (pageOptions.reconcileObserved || !record || record.readOnly || record.needsReload || record.historyTrimmed || record.metadataOnly) {
334
+ let result, snapshot;
335
+ const settingsBeforeResume = this.settingsNotifications.get(threadId);
203
336
  try {
204
- result = await this.request('thread/resume', { threadId, excludeTurns: true,
205
- initialTurnsPage: { limit: 1, sortDirection: 'desc', itemsView: 'summary' } });
337
+ result = await this.resumeTimeline(threadId, value => {
338
+ const retained = new Map((previous?.thread.turns || []).map(turn => [turn.id, turn]));
339
+ record = { thread: { ...value.thread, turns: [...value.initialTurnsPage.data].reverse().map(turn => ({
340
+ ...turn, items: retained.get(turn.id)?.items || [],
341
+ ...(retained.get(turn.id)?.itemPage ? { itemPage: retained.get(turn.id).itemPage } : {}),
342
+ })) },
343
+ nextCursor: value.initialTurnsPage.nextCursor ?? null,
344
+ sequence: previous?.sequence ?? 0, recoverAfter: previous?.recoverAfter ?? 0,
345
+ changes: previous?.changes ?? new Map(), changeBytes: previous?.changeBytes ?? 0,
346
+ tokens: previous?.tokens ?? new Map(), hydrating: true };
347
+ this.threads.set(threadId, record);
348
+ snapshot = events.beginSnapshot(record.thread);
349
+ return value;
350
+ }, pageOptions);
206
351
  } catch (error) {
352
+ snapshot?.close();
207
353
  if (!isThreadWriterConflict(error)) throw error;
208
- const [read, page] = await Promise.all([
209
- this.request('thread/read', { threadId, includeTurns: false }),
210
- this.request('thread/turns/list', {
211
- threadId, limit: historyPageMaxTurns, sortDirection: 'desc', itemsView: 'summary',
212
- }),
213
- ]);
214
- const compact = await Promise.all([...(page.data || [])].reverse().map(turn => this.compactTurn(threadId, turn)));
215
- const turns = this.fitTurns({ thread: read.thread }, compact, pageOptions);
216
- const thread = { ...read.thread, turns, readOnly: true,
217
- readOnlyReason: '该对话正在另一个 Codex 实例中使用。' };
218
- record = { thread, nextCursor: page.nextCursor ?? null, sequence: 0, recoverAfter: 0,
219
- changes: new Map(), changeBytes: 0, tokens: new Map(), readOnly: true };
220
- this.threads.set(threadId, record);
354
+ record = await this.readOnlyRecord(threadId, pageOptions, '该对话存在写入冲突,请稍后重试。');
221
355
  result = null;
222
356
  }
223
- if (result) {
224
- if (!Array.isArray(result.initialTurnsPage?.data)) throw new Error('完整控制未返回分页历史。');
225
- const compact = await Promise.all([...result.initialTurnsPage.data].reverse().map(turn => this.compactTurn(threadId, turn)));
226
- const thread = { ...result.thread, turns: compact };
227
- record = { thread, nextCursor: result.initialTurnsPage.nextCursor ?? null, sequence: 0,
228
- recoverAfter: 0, changes: new Map(), changeBytes: 0, tokens: new Map() };
229
- this.threads.set(threadId, record);
230
- this.contexts.set(threadId, { ...this.contexts.get(threadId), model: result.model, thinking: result.reasoningEffort, serviceTier: result.serviceTier ?? null,
231
- cwd: result.cwd, ...events.permissionState(result) });
232
- await this.extendHistoryRecord(threadId, record, pageOptions);
233
- }
234
- }
235
- const id = randomUUID(), expires = Date.now() + syncTokenTtlMs;
236
- record.tokens.set(id, { sequence: record.sequence, expires });
237
- this.scheduleCleanup(threadId, slot);
238
- return { thread: record.thread, nextCursor: record.nextCursor,
239
- sync: { id, epoch: this.epoch, seq: record.sequence } };
240
- });
241
- slot.tail = task.catch(() => {});
242
- task.catch(() => {
243
- if (!slot.users && !this.threads.has(threadId) && this.subscriptions.get(threadId) === slot) {
244
- clearTimeout(slot.expiry);
245
- this.subscriptions.delete(threadId);
246
- }
247
- });
248
- return task;
249
- }
250
-
251
- slot(threadId) {
252
- let slot = this.subscriptions.get(threadId);
253
- if (!slot) { slot = { users: 0, tail: Promise.resolve(), expiry: null }; this.subscriptions.set(threadId, slot); }
254
- return slot;
255
- }
256
-
257
- scheduleCleanup(threadId, slot) {
258
- clearTimeout(slot.expiry);
259
- const record = this.threads.get(threadId);
260
- const expiries = record ? [...record.tokens.values()].map(token => token.expires) : [];
261
- const next = expiries.length ? Math.max(1, Math.min(...expiries) - Date.now()) : 1;
262
- slot.expiry = setTimeout(() => this.cleanup(threadId, slot), next);
263
- }
264
-
265
- cleanup(threadId, slot) {
266
- const record = this.threads.get(threadId), now = Date.now();
267
- if (record) for (const [id, token] of record.tokens) if (token.expires <= now) record.tokens.delete(id);
268
- if (slot.users) { clearTimeout(slot.expiry); slot.expiry = null; return; }
269
- if (record?.tokens.size) { this.scheduleCleanup(threadId, slot); return; }
270
- slot.tail = slot.tail.then(async () => {
271
- if (slot.users || this.threads.get(threadId)?.tokens.size) return;
357
+ if (result) try {
358
+ const page = await this.initialTurnsPage(threadId, result);
359
+ if (!Array.isArray(page?.data)) throw new Error('Codex 内核未返回分页历史。');
360
+ const live = new Map(record.thread.turns.map(turn => [turn.id, turn]));
361
+ record.thread.turns = [...page.data].reverse().map(turn => {
362
+ const current = live.get(turn.id);
363
+ live.delete(turn.id);
364
+ return current ? Object.assign(current, { ...turn, ...current }) : { ...turn, items: [] };
365
+ }).concat([...live.values()]);
366
+ record.nextCursor = page.nextCursor ?? null;
367
+ metadataReused = Boolean(!pageOptions.reconcileObserved && !snapshot.changed()
368
+ && this.matchesUpdatedAt(record.thread, knownSync?.updatedAt));
369
+ if (metadataReused) {
370
+ record.metadataOnly = true;
371
+ record.thread.turns = record.thread.turns.map(turn => ({ ...turn, items: [], cacheStub: true }));
372
+ } else await Promise.all(page.data.map(turn => this.compactTurn(threadId, turn, null, page => snapshot.merge(page), 20)));
373
+ record.hydrating = false;
374
+ if (this.settingsNotifications.get(threadId) === settingsBeforeResume) {
375
+ this.contexts.set(threadId, { ...this.contexts.get(threadId), model: result.model, thinking: result.reasoningEffort, serviceTier: result.serviceTier ?? null,
376
+ cwd: result.cwd, ...events.permissionState(result) });
377
+ }
378
+ } finally { snapshot?.close(); }
379
+ }
380
+ const id = randomUUID(), expires = Date.now() + syncTokenTtlMs;
381
+ record.tokens.set(id, { sequence: record.sequence, expires });
382
+ this.scheduleCleanup(threadId, slot);
383
+ return { thread: metadataReused ? { ...record.thread, turns: [] } : record.thread,
384
+ ...(metadataReused ? { notModified: true } : {}),
385
+ nextCursor: this.historyCursor(threadId, record.thread.turns[0], record.nextCursor),
386
+ sync: { id, epoch: this.epoch, seq: record.sequence } };
387
+ }).finally(() => { slot.readers--; });
388
+ slot.tail = task.catch(() => {});
389
+ task.catch(() => {
390
+ const record = this.threads.get(threadId);
391
+ if (record?.hydrating) { record.needsReload = true; record.hydrating = false; this.scheduleCleanup(threadId, slot); }
392
+ if (!slot.users && !this.threads.has(threadId) && this.subscriptions.get(threadId) === slot) {
393
+ clearTimeout(slot.expiry);
394
+ this.subscriptions.delete(threadId);
395
+ }
396
+ });
397
+ return task;
398
+ }
399
+
400
+ slot(threadId) {
401
+ let slot = this.subscriptions.get(threadId);
402
+ if (!slot) { slot = { users: 0, readers: 0, tail: Promise.resolve(), expiry: null }; this.subscriptions.set(threadId, slot); }
403
+ return slot;
404
+ }
405
+
406
+ keepSnapshotAlive(threadId, sync) {
407
+ const token = this.threads.get(threadId)?.tokens.get(sync?.id);
408
+ const slot = this.subscriptions.get(threadId);
409
+ if (!token || !slot || sync.epoch !== this.epoch) return;
410
+ token.expires = Date.now() + syncTokenTtlMs;
411
+ this.scheduleCleanup(threadId, slot);
412
+ }
413
+
414
+ scheduleCleanup(threadId, slot) {
415
+ clearTimeout(slot.expiry);
416
+ const record = this.threads.get(threadId);
417
+ const expiries = record ? [...record.tokens.values()].map(token => token.expires) : [];
418
+ const next = expiries.length ? Math.max(1, Math.min(...expiries) - Date.now()) : 1;
419
+ slot.expiry = setTimeout(() => this.cleanup(threadId, slot), next);
420
+ }
421
+
422
+ cleanup(threadId, slot) {
423
+ const record = this.threads.get(threadId), now = Date.now();
424
+ if (record) for (const [id, token] of record.tokens) if (token.expires <= now) record.tokens.delete(id);
425
+ if (slot.users || slot.readers) { clearTimeout(slot.expiry); slot.expiry = null; return; }
426
+ if (record?.tokens.size) { this.scheduleCleanup(threadId, slot); return; }
427
+ if (this.keepThreadLoaded(threadId, record)) { clearTimeout(slot.expiry); slot.expiry = null; return; }
428
+ slot.tail = slot.tail.then(async () => {
429
+ if (this.subscriptions.get(threadId) !== slot) return;
430
+ if (slot.users || slot.readers || this.threads.get(threadId)?.tokens.size || this.keepThreadLoaded(threadId, this.threads.get(threadId))) return;
431
+ if (this.ready && !record?.readOnly) await this.unsubscribeThread(threadId);
432
+ // Keep this queue registered until unsubscribe completes. A returning reader
433
+ // must enqueue its resume behind it, rather than creating a second queue.
434
+ if (this.subscriptions.get(threadId) !== slot) return;
272
435
  this.threads.delete(threadId); this.contexts.delete(threadId); this.permissionOptions.delete(threadId);
273
- this.operationGroups.delete(threadId);
274
- this.subscriptions.delete(threadId); clearTimeout(slot.expiry);
275
- if (this.ready && !record?.readOnly) await this.request('thread/unsubscribe', { threadId });
436
+ if (!slot.users && !slot.readers) this.subscriptions.delete(threadId);
437
+ clearTimeout(slot.expiry);
276
438
  this.serverRequests.forget(threadId);
277
- }).catch(error => this.emit('subscription-error', error));
278
- }
279
-
280
- async acquire(threadId, requested) {
281
- const slot = this.slot(threadId);
282
- let record = this.threads.get(threadId), token;
283
- if (record && requested?.epoch === this.epoch && requested.id && Number.isSafeInteger(requested.after)) {
284
- token = record.tokens.get(requested.id);
285
- if (!token || token.expires <= Date.now() || token.sequence !== requested.after) token = undefined;
286
- }
287
- let snapshot = false, catchup;
288
- if (!record || !token) {
289
- const fresh = await this.timeline(threadId);
290
- record = this.threads.get(threadId); token = record.tokens.get(fresh.sync.id);
291
- requested = { id: fresh.sync.id, epoch: fresh.sync.epoch, after: fresh.sync.seq };
292
- snapshot = true;
293
- }
294
- slot.users++; record.tokens.delete(requested.id); clearTimeout(slot.expiry);
295
- const current = record.sequence;
296
- if (!snapshot && requested.after < record.recoverAfter) snapshot = true;
297
- if (!snapshot && current > requested.after) {
298
- const turns = [...record.changes.values()].filter(change => change.sequence > requested.after)
299
- .sort((left, right) => record.thread.turns.findIndex(turn => turn.id === left.turn.id)
300
- - record.thread.turns.findIndex(turn => turn.id === right.turn.id)).map(change => change.turn);
301
- catchup = { thread: { ...record.thread, turns },
302
- sync: { id: requested.id, epoch: this.epoch, fromSeq: requested.after + 1, toSeq: current } };
303
- }
304
- const release = () => {
305
- slot.users--;
306
- this.cleanup(threadId, slot);
307
- return slot.tail;
308
- };
309
- return { record: { thread: record.thread, nextCursor: record.nextCursor,
310
- sync: { id: requested.id, epoch: this.epoch, seq: current, ...(snapshot ? { reset: true } : {}) } },
311
- snapshot, catchup, release };
312
- }
313
-
439
+ }).catch(error => {
440
+ if (this.subscriptions.get(threadId) === slot && this.threads.get(threadId) === record && record) record.needsReload = true;
441
+ this.emit('subscription-error', error);
442
+ });
443
+ }
444
+
445
+ keepThreadLoaded(threadId, record) {
446
+ if (!record || record.readOnly) return false;
447
+ const status = typeof record.thread.status === 'string' ? record.thread.status : record.thread.status?.type;
448
+ return status === 'active' || record.thread.turns?.some(turn => turn.status === 'inProgress')
449
+ || this.serverRequests.list(threadId).length > 0;
450
+ }
451
+
452
+ releaseInactiveThread(threadId) {
453
+ // Run after the current notification has updated both request and turn state.
454
+ queueMicrotask(() => {
455
+ const slot = this.subscriptions?.get(threadId);
456
+ if (slot && !slot.users && this.ready) this.cleanup(threadId, slot);
457
+ });
458
+ }
459
+
460
+ async acquire(threadId, requested) {
461
+ const slot = this.slot(threadId);
462
+ let record = this.threads.get(threadId), token;
463
+ if (record && requested?.epoch === this.epoch && requested.id && Number.isSafeInteger(requested.after)) {
464
+ token = record.tokens.get(requested.id);
465
+ if (!token || token.expires <= Date.now() || token.sequence !== requested.after) token = undefined;
466
+ }
467
+ let snapshot = false, catchup, confirmed = false;
468
+ if (!record || !token || record.needsReload
469
+ || ((record.historyTrimmed || record.metadataOnly) && requested.after < record.recoverAfter)) {
470
+ const fresh = await this.timeline(threadId, {}, { updatedAt: requested?.updatedAt });
471
+ record = this.threads.get(threadId); token = record.tokens.get(fresh.sync.id);
472
+ requested = { id: fresh.sync.id, epoch: fresh.sync.epoch, after: fresh.sync.seq };
473
+ snapshot = fresh.notModified !== true;
474
+ confirmed = !snapshot;
475
+ }
476
+ slot.users++; record.tokens.delete(requested.id); clearTimeout(slot.expiry);
477
+ const current = record.sequence;
478
+ if (!snapshot && requested.after < record.recoverAfter) snapshot = true;
479
+ if (!snapshot && current > requested.after) {
480
+ const turns = [...record.changes.values()].filter(change => change.sequence > requested.after && !change.turn.cacheStub)
481
+ .sort((left, right) => record.thread.turns.findIndex(turn => turn.id === left.turn.id)
482
+ - record.thread.turns.findIndex(turn => turn.id === right.turn.id)).map(change => change.turn);
483
+ catchup = { thread: { ...record.thread, turns },
484
+ sync: { id: requested.id, epoch: this.epoch, fromSeq: requested.after + 1, toSeq: current } };
485
+ }
486
+ const release = () => {
487
+ slot.users--;
488
+ // Retain the observed snapshot briefly when switching away. A later check
489
+ // must match the client's consumed sequence, never just this release time.
490
+ if (this.threads.get(threadId) === record && !record.readOnly) {
491
+ record.tokens.set(requested.id, { sequence: record.sequence, expires: Date.now() + syncTokenTtlMs });
492
+ }
493
+ this.cleanup(threadId, slot);
494
+ return slot.tail;
495
+ };
496
+ return { record: { thread: record.thread, nextCursor: this.historyCursor(threadId, record.thread.turns[0], record.nextCursor),
497
+ sync: { id: requested.id, epoch: this.epoch, seq: current, ...(snapshot ? { reset: true } : {}) } },
498
+ snapshot, catchup, confirmed, release };
499
+ }
500
+
314
501
  pageSettings(options = {}) {
315
502
  return {
316
503
  maxTurns: Math.max(1, Math.min(historyPageMaxTurns, Number(options.maxTurns) || historyPageMaxTurns)),
@@ -319,61 +506,66 @@ export class SharedAppServer extends EventEmitter {
319
506
  };
320
507
  }
321
508
 
322
- async compactTurn(threadId, turn) {
323
- const compact = events.compactTurn(turn);
324
- if (!turn?.id) return compact;
325
- const batches = [];
326
- let cursor;
327
- do {
328
- const page = await this.request('thread/items/list', {
329
- threadId, turnId: turn.id, ...(cursor ? { cursor } : {}),
330
- limit: 100, sortDirection: 'desc',
331
- });
332
- if (!Array.isArray(page.data)) throw new Error('完整控制未返回单轮条目索引。');
333
- batches.push(page.data.map(entry => events.compactItem(entry.item)));
334
- cursor = page.nextCursor ?? null;
335
- } while (cursor);
336
- const items = batches.reverse().flatMap(batch => batch.reverse());
337
- const groups = new Map(), skeleton = [];
338
- let operationItems = [];
339
- const flushOperations = () => {
340
- if (!operationItems.length) return;
341
- const visibleItems = operationItems.filter(item => item?.type !== 'reasoning');
342
- operationItems = [];
343
- if (!visibleItems.length) return;
344
- const groupId = `g${groups.size + 1}`;
345
- const outline = operationOutline(visibleItems, false);
346
- groups.set(groupId, visibleItems);
347
- skeleton.push({ type: 'lazyOperationGroup', id: `${turn.id}:${groupId}`,
348
- turnId: turn.id, groupId, title: outline.title, count: visibleItems.length });
349
- };
350
- for (const item of items) {
351
- if (['userMessage', 'agentMessage', 'imageGeneration'].includes(item?.type)) {
352
- flushOperations();
353
- skeleton.push(item);
354
- } else operationItems.push(item);
355
- }
356
- flushOperations();
357
- let threadGroups = this.operationGroups.get(threadId);
358
- if (!threadGroups) { threadGroups = new Map(); this.operationGroups.set(threadId, threadGroups); }
359
- threadGroups.set(turn.id, groups);
360
- return { ...compact, items: skeleton };
509
+ historyCursor(threadId, turn, turnCursor) {
510
+ const itemCursor = turn?.itemPage?.olderCursor;
511
+ if (!itemCursor && !turnCursor) return null;
512
+ // Upstream history cursors identify stored positions, not this observer.
513
+ return JSON.stringify({ threadId, turnId: itemCursor ? turn.id : null,
514
+ itemCursor: itemCursor || null, turnCursor: turnCursor || null });
361
515
  }
362
516
 
363
- async operationGroupItems(threadId, turnId, groupId, offset) {
364
- await this.connect();
365
- const items = this.operationGroups.get(threadId)?.get(turnId)?.get(groupId);
366
- if (!items) throw new Error('操作组已失效,请重新打开对话。');
367
- const start = Math.max(0, Number(offset) || 0);
368
- const pageItems = items.slice(start, start + turnItemPageSize);
369
- const nextOffset = start + pageItems.length < items.length ? start + pageItems.length : null;
370
- return { turnId, groupId, items: pageItems, nextOffset, total: items.length };
517
+ async compactTurn(threadId, turn, cursor = null, apply, limit = 100) {
518
+ if (!turn?.id) return events.compactTurn(turn);
519
+ return this.request('thread/items/list', {
520
+ threadId, turnId: turn.id, ...(cursor ? { cursor } : {}), limit, sortDirection: 'desc',
521
+ }, page => {
522
+ const result = this.projectItemPage(threadId, turn, cursor, page);
523
+ apply?.(result); return result;
524
+ });
525
+ }
526
+
527
+ isThreadObserved(threadId, record) {
528
+ const slot = this.subscriptions.get(threadId);
529
+ return Boolean(slot?.users || slot?.readers || record.tokens.size);
530
+ }
531
+
532
+ unsubscribeThread(threadId) { return this.request('thread/unsubscribe', { threadId }); }
533
+
534
+ async readOnlyRecord(threadId, pageOptions, reason) {
535
+ const [read, page] = await Promise.all([
536
+ this.request('thread/read', { threadId, includeTurns: false }),
537
+ this.request('thread/turns/list', { threadId, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded' }),
538
+ ]);
539
+ const compact = await Promise.all([...(page.data || [])].reverse().map(turn => this.compactTurn(threadId, turn)));
540
+ const turns = this.fitTurns({ thread: read.thread }, compact, pageOptions);
541
+ const thread = { ...read.thread, turns, readOnly: true, readOnlyReason: reason };
542
+ const record = { thread, nextCursor: page.nextCursor ?? null, sequence: 0, recoverAfter: 0,
543
+ changes: new Map(), changeBytes: 0, tokens: new Map(), readOnly: true };
544
+ this.threads.set(threadId, record);
545
+ this.contexts.set(threadId, { model: thread.model, thinking: thread.reasoningEffort, cwd: thread.cwd });
546
+ return record;
547
+ }
548
+
549
+ projectItemPage(threadId, turn, cursor, page) {
550
+ const compact = events.compactTurn(turn);
551
+ if (!Array.isArray(page.data)) throw new Error('Codex 内核未返回单轮条目索引。');
552
+ if (page.nextCursor && page.nextCursor === cursor) throw new Error('条目分页游标未推进。');
553
+ if (page.data.some(entry => entry.turnId !== turn.id)) throw new Error('条目所属轮次不匹配。');
554
+ const items = [...page.data].reverse().map(entry => events.compactItem(entry.item));
555
+ return { ...compact, items, itemPage: { olderCursor: page.nextCursor ?? null,
556
+ hasLoadedOldest: !page.nextCursor, oldestItemId: items[0]?.id || null,
557
+ newestItemId: items.at(-1)?.id || null, requestedCursor: cursor, projection: 'mobile-skeleton' } };
371
558
  }
372
559
 
373
560
  async turnContext(threadId, turnId) {
374
561
  await this.connect();
375
562
  if (!threadId || !turnId) throw new Error('缺少图片所属的对话或轮次。');
376
- return this.compactTurn(threadId, { id: turnId });
563
+ let turn = await this.compactTurn(threadId, { id: turnId });
564
+ while (turn.itemPage.olderCursor) {
565
+ const older = await this.compactTurn(threadId, { id: turnId }, turn.itemPage.olderCursor);
566
+ turn = { ...turn, items: [...older.items, ...turn.items], itemPage: older.itemPage };
567
+ }
568
+ return turn;
377
569
  }
378
570
 
379
571
  fitTurns(base, turns, options = {}) {
@@ -390,104 +582,79 @@ export class SharedAppServer extends EventEmitter {
390
582
  return accepted;
391
583
  }
392
584
 
393
- async extendHistoryRecord(threadId, record, options = {}) {
394
- const settings = this.pageSettings(options);
395
- if (!record.nextCursor || !record.thread.turns.length) return;
396
- const firstOversized = settings.measure({ thread: record.thread, nextCursor: record.nextCursor }) > settings.maxBytes;
397
- if (firstOversized) return;
398
- while (record.nextCursor && record.thread.turns.length < settings.maxTurns) {
399
- const cursor = record.nextCursor;
400
- const page = await this.request('thread/turns/list', {
401
- threadId, cursor, limit: 1, sortDirection: 'desc', itemsView: 'summary',
402
- });
403
- if (!Array.isArray(page.data) || !page.data.length) {
404
- record.nextCursor = page.nextCursor ?? null;
405
- break;
406
- }
407
- const candidate = [await this.compactTurn(threadId, page.data[0]), ...record.thread.turns];
408
- const value = { thread: { ...record.thread, turns: candidate }, nextCursor: page.nextCursor ?? null };
409
- if (record.thread.turns.length >= 2 && settings.measure(value) > settings.maxBytes) break;
410
- record.thread.turns = candidate;
411
- record.nextCursor = page.nextCursor ?? null;
412
- if (record.thread.turns.length >= 2 && settings.measure(value) > settings.maxBytes) break;
413
- }
414
- }
415
-
416
585
  async history(threadId, cursor, options = {}) {
417
586
  await this.connect();
418
587
  if (!cursor) throw new Error('缺少历史分页游标。');
419
- const settings = this.pageSettings(options), turns = [];
420
- let firstOversized = false;
421
- let nextCursor = cursor;
422
- while (nextCursor && turns.length < settings.maxTurns) {
423
- const pageCursor = nextCursor;
424
- const page = await this.request('thread/turns/list', {
425
- threadId, cursor: pageCursor, limit: 1, sortDirection: 'desc', itemsView: 'summary',
426
- });
427
- if (!Array.isArray(page.data) || !page.data.length) {
428
- nextCursor = page.nextCursor ?? null;
429
- break;
430
- }
431
- const compact = await this.compactTurn(threadId, page.data[0]);
432
- const candidate = [compact, ...turns];
433
- const value = { thread: { id: threadId, turns: candidate }, nextCursor: page.nextCursor ?? null };
434
- const candidateBytes = settings.measure(value);
435
- if (turns.length >= 2 && candidateBytes > settings.maxBytes) break;
436
- turns.unshift(compact);
437
- nextCursor = page.nextCursor ?? null;
438
- if (turns.length === 1) firstOversized = candidateBytes > settings.maxBytes;
439
- if (firstOversized || (turns.length >= 2 && candidateBytes > settings.maxBytes)) break;
588
+ let position;
589
+ try { position = JSON.parse(cursor); } catch { position = null; }
590
+ if (position?.threadId !== threadId) throw Object.assign(new Error('历史游标不属于当前对话。'), { code: 'history_cursor_expired' });
591
+ if (position.itemCursor && position.turnId) {
592
+ const turn = await this.compactTurn(threadId, { id: position.turnId }, position.itemCursor, undefined, options.itemLimit ?? 100);
593
+ return { thread: { id: threadId, turns: [turn] },
594
+ nextCursor: this.historyCursor(threadId, turn, position.turnCursor) };
440
595
  }
441
- return { thread: { id: threadId, turns }, nextCursor };
596
+ const page = await this.request('thread/turns/list', {
597
+ threadId, cursor: position.turnCursor, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded',
598
+ });
599
+ if (!Array.isArray(page.data)) throw new Error('Codex 内核未返回轮次分页。');
600
+ if (page.nextCursor && page.nextCursor === position.turnCursor) throw new Error('轮次分页游标未推进。');
601
+ const turns = page.data.length ? [await this.compactTurn(threadId, page.data[0], null, undefined, options.itemLimit ?? 100)] : [];
602
+ return { thread: { id: threadId, turns }, nextCursor: this.historyCursor(threadId, turns[0], page.nextCursor) };
442
603
  }
443
-
604
+
444
605
  async interrupt(threadId, turnId) {
445
606
  await this.connect();
446
607
  this.requireWritable(threadId);
447
608
  return this.request('turn/interrupt', { threadId, turnId });
448
- }
449
-
450
- async models() {
451
- await this.connect();
452
- const models = []; let cursor;
453
- do {
454
- const result = await this.request('model/list', { limit: 100, ...(cursor ? { cursor } : {}) });
455
- models.push(...result.data); cursor = result.nextCursor;
456
- } while (cursor);
457
- const config = await this.request('config/read', { includeLayers: false });
458
- return { models: models.filter(model => !model.hidden), enabledReasoningEfforts: config.config?.desktop?.['enabled-reasoning-efforts'] ?? null };
459
- }
460
-
461
- async usage() {
462
- await this.connect();
463
- return this.usageCache.read(() => this.request('account/rateLimits/read'));
464
- }
465
-
609
+ }
610
+
611
+ async models() {
612
+ await this.connect();
613
+ const models = []; let cursor;
614
+ do {
615
+ const result = await this.request('model/list', { limit: 100, ...(cursor ? { cursor } : {}) });
616
+ models.push(...result.data); cursor = result.nextCursor;
617
+ } while (cursor);
618
+ let config, configWarning;
619
+ try { config = await this.request('config/read', { includeLayers: false }); }
620
+ catch (error) {
621
+ configWarning = `读取思考强度偏好失败:${error.message}`;
622
+ console.warn('[model-catalog]', configWarning);
623
+ }
624
+ return { models: models.filter(model => !model.hidden), enabledReasoningEfforts: config?.config?.desktop?.['enabled-reasoning-efforts'] ?? null,
625
+ ...(configWarning ? { configWarning } : {}) };
626
+ }
627
+
628
+ async usage() {
629
+ await this.connect();
630
+ return this.usageCache.read(() => this.request('account/rateLimits/read'));
631
+ }
632
+
466
633
  async settings(threadId, model, effort, serviceTier) {
467
634
  await this.connect();
468
635
  this.requireWritable(threadId);
469
- await events.updateSettings((method, params) => this.request(method, params), this.contexts, this.settingsNotifications, threadId, model, effort, serviceTier);
470
- return this.context(threadId);
471
- }
472
-
636
+ await events.updateSettings((method, params) => this.request(method, params), this.contexts, threadId, model, effort, serviceTier);
637
+ return this.context(threadId);
638
+ }
639
+
473
640
  async permissions(threadId, mode) {
474
641
  await this.connect();
475
642
  this.requireWritable(threadId);
476
- await events.updatePermissions((method, params) => this.request(method, params), this.contexts, this.settingsNotifications, this.permissionOptions, threadId, mode);
477
- return this.context(threadId);
478
- }
479
-
480
- async readContext(threadId) {
481
- const context = this.contexts.get(threadId);
482
- if (context) await this.permissionOptions.read((method, params) => this.request(method, params), threadId, context);
483
- return this.context(threadId);
484
- }
485
-
643
+ await events.updatePermissions((method, params) => this.request(method, params), this.contexts, this.settingsNotifications, this.permissionOptions, threadId, mode);
644
+ return this.context(threadId);
645
+ }
646
+
647
+ async readContext(threadId) {
648
+ const context = this.contexts.get(threadId);
649
+ if (context) await this.permissionOptions.read((method, params) => this.request(method, params), threadId, context);
650
+ return this.context(threadId);
651
+ }
652
+
486
653
  context(threadId) {
487
- const context = this.permissionOptions.context(threadId, this.contexts.get(threadId) || {}), usage = context.tokenUsage;
488
- const usedTokens = usage?.last?.totalTokens, contextWindow = usage?.modelContextWindow;
489
- return { ...context, available: Boolean(contextWindow), usedTokens, contextWindow,
490
- usedPercent: contextWindow ? 100 * usedTokens / contextWindow : 0 };
654
+ const context = this.permissionOptions.context(threadId, this.contexts.get(threadId) || {}), usage = context.tokenUsage;
655
+ const usedTokens = usage?.last?.totalTokens, contextWindow = usage?.modelContextWindow;
656
+ return { ...context, available: Boolean(contextWindow), usedTokens, contextWindow,
657
+ usedPercent: contextWindow ? 100 * usedTokens / contextWindow : 0 };
491
658
  }
492
659
 
493
660
  requireWritable(threadId) {
@@ -497,16 +664,3 @@ export class SharedAppServer extends EventEmitter {
497
664
 
498
665
  close() { this.socket?.close(); }
499
666
  }
500
-
501
- function operationOutline(items, hasMore) {
502
- const types = new Set(items.map(item => item?.type));
503
- const parts = [];
504
- if (types.has('fileChange')) parts.push('编辑了文件');
505
- if (types.has('commandExecution')) parts.push('运行了命令');
506
- if (types.has('mcpToolCall') || types.has('dynamicToolCall')) parts.push('调用了工具');
507
- if (types.has('webSearch')) parts.push('搜索了网页');
508
- if (types.has('imageView')) parts.push('查看了图像');
509
- if (types.has('collabAgentToolCall') || types.has('subAgentActivity')) parts.push('处理了子任务');
510
- const available = hasMore || items.some(item => item && !['userMessage', 'agentMessage'].includes(item.type));
511
- return { available, title: parts.length ? `${parts.join(' · ')}${hasMore ? '等' : ''}` : '执行过程' };
512
- }