@walkhi/code-relax 0.1.0-beta.5 → 0.1.0-beta.50

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 (847) hide show
  1. package/README.md +93 -71
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +325 -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 +190 -0
  9. package/dist/bin/self-relay-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +2 -2
  11. package/dist/bin/self-relay-server.mjs +43 -30
  12. package/dist/build-platform.json +1 -0
  13. package/dist/get-shared-service-url.ps1 +14 -6
  14. package/dist/shared/app-server-events.cjs +378 -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 +115 -0
  20. package/dist/shared/p2p-data-channel.cjs +22 -0
  21. package/dist/shared/p2p-diagnostics.cjs +1 -1
  22. package/dist/shared/p2p-file-channel.cjs +87 -0
  23. package/dist/shared/p2p-ice-policy.cjs +22 -0
  24. package/dist/shared/plan-pricing.cjs +32 -0
  25. package/dist/shared/question-attention.cjs +69 -0
  26. package/dist/shared/server-requests.cjs +250 -6
  27. package/dist/shared/service-endpoints.cjs +21 -0
  28. package/dist/shared/timeline-sync.cjs +111 -5
  29. package/dist/skills/code-relax/SKILL.md +13 -8
  30. package/dist/src/archived-threads.mjs +22 -0
  31. package/dist/src/bounded-process-log.mjs +63 -0
  32. package/dist/src/celsius-client.mjs +107 -0
  33. package/dist/src/code-browser.mjs +100 -0
  34. package/dist/src/desktop-launcher.mjs +53 -42
  35. package/dist/src/dots-approval-timeline.mjs +99 -0
  36. package/dist/src/dots-avatar.mjs +42 -0
  37. package/dist/src/dots-chat-projection.mjs +50 -0
  38. package/dist/src/dots-chat-server.mjs +483 -0
  39. package/dist/src/dots-message-images.mjs +319 -0
  40. package/dist/src/dots-profile.mjs +77 -0
  41. package/dist/src/dots-room-activity.mjs +172 -0
  42. package/dist/src/dots-room-client.mjs +135 -0
  43. package/dist/src/dots-room-projection.mjs +94 -0
  44. package/dist/src/dots-schedules.mjs +66 -0
  45. package/dist/src/dots-summary-tasks.mjs +32 -0
  46. package/dist/src/dots-task-catalog.mjs +430 -0
  47. package/dist/src/dots-task-files.mjs +52 -0
  48. package/dist/src/file-transfer-range.mjs +22 -0
  49. package/dist/src/file-upload-session.mjs +130 -0
  50. package/dist/src/hosted-history-app-server.mjs +103 -0
  51. package/dist/src/hosted-history-cache.mjs +113 -0
  52. package/dist/src/lan-socket-server.mjs +241 -84
  53. package/dist/src/managed-app-server.mjs +210 -44
  54. package/dist/src/managed-endpoint.mjs +25 -0
  55. package/dist/src/message-images.mjs +0 -18
  56. package/dist/src/message-upload-files.mjs +109 -0
  57. package/dist/src/onboarding.mjs +10 -29
  58. package/dist/src/plan-pricing.mjs +47 -0
  59. package/dist/src/platform/README.md +2 -2
  60. package/dist/src/platform/codex-protocol.mjs +46 -0
  61. package/dist/src/platform/codex-runtime.mjs +3 -0
  62. package/dist/src/platform/credential-store.mjs +3 -0
  63. package/dist/src/platform/desktop-host.mjs +3 -0
  64. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  65. package/dist/src/platform/desktop-project-store.mjs +208 -0
  66. package/dist/src/platform/file-opener.mjs +9 -0
  67. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  68. package/dist/src/platform/linux/credential-store.mjs +28 -0
  69. package/dist/src/platform/linux/desktop-host.mjs +87 -0
  70. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  71. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  72. package/dist/src/platform/linux/network-info.mjs +11 -0
  73. package/dist/src/platform/linux/process.mjs +53 -0
  74. package/dist/src/platform/linux/project-locations.mjs +17 -0
  75. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  76. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  77. package/dist/src/platform/linux/service-host.mjs +18 -0
  78. package/dist/src/platform/linux/system.mjs +50 -0
  79. package/dist/src/platform/linux/user-environment.mjs +9 -0
  80. package/dist/src/platform/macos/codex-runtime.mjs +125 -0
  81. package/dist/src/platform/macos/credential-store.mjs +10 -0
  82. package/dist/src/platform/macos/desktop-host.mjs +86 -0
  83. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  84. package/dist/src/platform/macos/network-info.mjs +8 -0
  85. package/dist/src/platform/macos/project-locations.mjs +8 -0
  86. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  87. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  88. package/dist/src/platform/macos/service-host.mjs +18 -0
  89. package/dist/src/platform/macos/system.mjs +29 -0
  90. package/dist/src/platform/macos/user-environment.mjs +9 -0
  91. package/dist/src/platform/native-package.mjs +58 -0
  92. package/dist/src/platform/network-info.mjs +3 -0
  93. package/dist/src/platform/path-identity.mjs +5 -0
  94. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  95. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  96. package/dist/src/platform/power-inhibitor.mjs +22 -0
  97. package/dist/src/platform/project-locations.mjs +3 -0
  98. package/dist/src/platform/runtime-paths.mjs +8 -0
  99. package/dist/src/platform/select.mjs +5 -0
  100. package/dist/src/platform/service-host.mjs +3 -0
  101. package/dist/src/platform/user-environment.mjs +3 -0
  102. package/dist/src/platform/windows/activate-desktop.ps1 +49 -0
  103. package/dist/src/platform/windows/codex-runtime.mjs +215 -0
  104. package/dist/src/platform/windows/credential-store.mjs +27 -27
  105. package/dist/src/platform/windows/credential-store.ps1 +49 -49
  106. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  107. package/dist/src/platform/windows/desktop-host.mjs +50 -23
  108. package/dist/src/platform/windows/desktop-info.ps1 +38 -16
  109. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  110. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  111. package/dist/src/platform/windows/desktop-shortcuts.ps1 +21 -28
  112. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  113. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  114. package/dist/src/platform/windows/launch-worker.mjs +17 -18
  115. package/dist/src/platform/windows/project-locations.mjs +16 -0
  116. package/dist/src/platform/windows/resident-start.js +20 -0
  117. package/dist/src/platform/windows/resident-startup.ps1 +76 -20
  118. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  119. package/dist/src/platform/windows/service-host.mjs +29 -37
  120. package/dist/src/platform/windows/start-hidden-console.ps1 +11 -2
  121. package/dist/src/platform/windows/stop-desktop.ps1 +7 -4
  122. package/dist/src/platform/windows/user-environment.mjs +12 -10
  123. package/dist/src/project-create.mjs +121 -0
  124. package/dist/src/project-management.mjs +59 -0
  125. package/dist/src/project-remove.mjs +55 -0
  126. package/dist/src/project-update.mjs +59 -0
  127. package/dist/src/runtime-discovery.mjs +47 -0
  128. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  129. package/dist/src/self-relay/account-connections.mjs +52 -0
  130. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  131. package/dist/src/self-relay/admin-page.mjs +80 -0
  132. package/dist/src/self-relay/admin-server.mjs +74 -0
  133. package/dist/src/self-relay/admin-state.mjs +85 -19
  134. package/dist/src/self-relay/admin-style.mjs +14 -0
  135. package/dist/src/self-relay/android-releases.mjs +61 -0
  136. package/dist/src/self-relay/client.mjs +45 -45
  137. package/dist/src/self-relay/connector.mjs +421 -144
  138. package/dist/src/self-relay/demo.mjs +34 -35
  139. package/dist/src/self-relay/device-info.mjs +27 -0
  140. package/dist/src/self-relay/device-store.mjs +10 -2
  141. package/dist/src/self-relay/diagnostics.mjs +54 -0
  142. package/dist/src/self-relay/email-accounts.mjs +183 -0
  143. package/dist/src/self-relay/file-wire.mjs +13 -0
  144. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  145. package/dist/src/self-relay/lifecycle.mjs +241 -262
  146. package/dist/src/self-relay/long-pairing.mjs +40 -0
  147. package/dist/src/self-relay/mysql-state.mjs +118 -0
  148. package/dist/src/self-relay/p2p-probe.mjs +56 -11
  149. package/dist/src/self-relay/privacy-page.mjs +26 -0
  150. package/dist/src/self-relay/public-releases.mjs +67 -0
  151. package/dist/src/self-relay/rtc-file-bridge.mjs +41 -0
  152. package/dist/src/self-relay/server.mjs +653 -115
  153. package/dist/src/self-relay/usage-daily.mjs +55 -0
  154. package/dist/src/self-relay/usage-meter.mjs +141 -0
  155. package/dist/src/server.mjs +1547 -1794
  156. package/dist/src/service-control.mjs +17 -7
  157. package/dist/src/service-doctor.mjs +119 -34
  158. package/dist/src/service-health.mjs +2 -2
  159. package/dist/src/service-install.mjs +91 -85
  160. package/dist/src/service-lifecycle.mjs +117 -108
  161. package/dist/src/service-power.mjs +58 -0
  162. package/dist/src/service-restart.mjs +45 -12
  163. package/dist/src/service-update-worker.mjs +42 -0
  164. package/dist/src/service-update.mjs +77 -0
  165. package/dist/src/shared-app-server.mjs +561 -407
  166. package/dist/src/shared-catalog.mjs +95 -13
  167. package/dist/src/shared-recovery.mjs +24 -14
  168. package/dist/src/shared-thread-stream.mjs +148 -63
  169. package/dist/src/skill-install.mjs +0 -13
  170. package/dist/src/turn-model-history.mjs +47 -0
  171. package/dist/src/usage-reset.mjs +17 -0
  172. package/dist/src/workstation-downloads.mjs +120 -0
  173. package/package.json +35 -37
  174. package/tools/postinstall.mjs +90 -22
  175. package/dist/src/app-server-client.mjs +0 -468
  176. package/dist/src/app-server-tasks.mjs +0 -358
  177. package/dist/src/debug-ui.mjs +0 -131
  178. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  179. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  180. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  181. package/dist/src/thread-catalog.mjs +0 -47
  182. package/dist/tools/find-desktop-pipe.mjs +0 -10
  183. package/dist/web/activity-view.js +0 -283
  184. package/dist/web/approval-ui.js +0 -188
  185. package/dist/web/capabilities.js +0 -57
  186. package/dist/web/chat-transport.js +0 -202
  187. package/dist/web/chat.css +0 -782
  188. package/dist/web/chat.js +0 -3830
  189. package/dist/web/client-platform.js +0 -11
  190. package/dist/web/community-view.js +0 -20
  191. package/dist/web/community.css +0 -77
  192. package/dist/web/community.html +0 -37
  193. package/dist/web/composer-controller.js +0 -101
  194. package/dist/web/conversation-controller.js +0 -99
  195. package/dist/web/disclosure-state-controller.js +0 -95
  196. package/dist/web/draft-controller.js +0 -103
  197. package/dist/web/harmony-platform.js +0 -52
  198. package/dist/web/highlight-powershell.min.js +0 -39
  199. package/dist/web/highlight.min.js +0 -1262
  200. package/dist/web/history-cache.js +0 -240
  201. package/dist/web/history-controller.js +0 -167
  202. package/dist/web/index.html +0 -325
  203. package/dist/web/lan-session.js +0 -122
  204. package/dist/web/link-action-controller.js +0 -212
  205. package/dist/web/message-send-controller.js +0 -177
  206. package/dist/web/message-view.js +0 -98
  207. package/dist/web/p2p-data-channel.js +0 -50
  208. package/dist/web/p2p-diagnostics.js +0 -28
  209. package/dist/web/p2p-probe.js +0 -123
  210. package/dist/web/page-resume.js +0 -28
  211. package/dist/web/pending-message-store.js +0 -108
  212. package/dist/web/queue-controller.js +0 -82
  213. package/dist/web/resources.json +0 -1
  214. package/dist/web/self-relay-session.js +0 -129
  215. package/dist/web/server-requests.js +0 -67
  216. package/dist/web/station-connection-controller.js +0 -75
  217. package/dist/web/task-list-view.js +0 -296
  218. package/dist/web/thread-attention-controller.js +0 -124
  219. package/dist/web/thread-context-controller.js +0 -30
  220. package/dist/web/thread-list-controller.js +0 -61
  221. package/dist/web/thread-list-sync.js +0 -86
  222. package/dist/web/thread-title-controller.js +0 -57
  223. package/dist/web/timeline-formatters.js +0 -249
  224. package/dist/web/timeline-reducer.js +0 -81
  225. package/dist/web/timeline-renderer.js +0 -161
  226. package/dist/web/timeline-scroll-controller.js +0 -50
  227. package/dist/web/timeline-sync.js +0 -67
  228. package/dist/web/usage-controller.js +0 -258
  229. package/dist/web/vendor/README.md +0 -14
  230. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  231. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  232. package/dist/web/vendor/highlight.min.js +0 -1262
  233. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  234. package/node_modules/@img/colour/LICENSE.md +0 -82
  235. package/node_modules/@img/colour/README.md +0 -15
  236. package/node_modules/@img/colour/color.cjs +0 -1596
  237. package/node_modules/@img/colour/index.cjs +0 -1
  238. package/node_modules/@img/colour/index.d.ts +0 -929
  239. package/node_modules/@img/colour/package.json +0 -58
  240. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  241. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  242. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  243. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  244. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  245. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  246. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  247. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  248. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  249. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  250. package/node_modules/ansi-regex/index.d.ts +0 -37
  251. package/node_modules/ansi-regex/index.js +0 -10
  252. package/node_modules/ansi-regex/license +0 -9
  253. package/node_modules/ansi-regex/package.json +0 -55
  254. package/node_modules/ansi-regex/readme.md +0 -78
  255. package/node_modules/ansi-styles/index.d.ts +0 -345
  256. package/node_modules/ansi-styles/index.js +0 -163
  257. package/node_modules/ansi-styles/license +0 -9
  258. package/node_modules/ansi-styles/package.json +0 -56
  259. package/node_modules/ansi-styles/readme.md +0 -152
  260. package/node_modules/camelcase/index.d.ts +0 -63
  261. package/node_modules/camelcase/index.js +0 -76
  262. package/node_modules/camelcase/license +0 -9
  263. package/node_modules/camelcase/package.json +0 -43
  264. package/node_modules/camelcase/readme.md +0 -99
  265. package/node_modules/cliui/CHANGELOG.md +0 -76
  266. package/node_modules/cliui/LICENSE.txt +0 -14
  267. package/node_modules/cliui/README.md +0 -115
  268. package/node_modules/cliui/index.js +0 -354
  269. package/node_modules/cliui/package.json +0 -65
  270. package/node_modules/color-convert/CHANGELOG.md +0 -54
  271. package/node_modules/color-convert/LICENSE +0 -21
  272. package/node_modules/color-convert/README.md +0 -68
  273. package/node_modules/color-convert/conversions.js +0 -839
  274. package/node_modules/color-convert/index.js +0 -81
  275. package/node_modules/color-convert/package.json +0 -48
  276. package/node_modules/color-convert/route.js +0 -97
  277. package/node_modules/color-name/LICENSE +0 -8
  278. package/node_modules/color-name/README.md +0 -11
  279. package/node_modules/color-name/index.js +0 -152
  280. package/node_modules/color-name/package.json +0 -28
  281. package/node_modules/decamelize/index.js +0 -13
  282. package/node_modules/decamelize/license +0 -21
  283. package/node_modules/decamelize/package.json +0 -38
  284. package/node_modules/decamelize/readme.md +0 -48
  285. package/node_modules/detect-libc/LICENSE +0 -201
  286. package/node_modules/detect-libc/README.md +0 -163
  287. package/node_modules/detect-libc/index.d.ts +0 -14
  288. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  289. package/node_modules/detect-libc/lib/elf.js +0 -39
  290. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  291. package/node_modules/detect-libc/lib/process.js +0 -24
  292. package/node_modules/detect-libc/package.json +0 -44
  293. package/node_modules/dijkstrajs/.travis.yml +0 -4
  294. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  295. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  296. package/node_modules/dijkstrajs/README.md +0 -18
  297. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  298. package/node_modules/dijkstrajs/package.json +0 -60
  299. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  300. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  301. package/node_modules/emoji-regex/README.md +0 -73
  302. package/node_modules/emoji-regex/es2015/index.js +0 -6
  303. package/node_modules/emoji-regex/es2015/text.js +0 -6
  304. package/node_modules/emoji-regex/index.d.ts +0 -23
  305. package/node_modules/emoji-regex/index.js +0 -6
  306. package/node_modules/emoji-regex/package.json +0 -50
  307. package/node_modules/emoji-regex/text.js +0 -6
  308. package/node_modules/find-up/index.d.ts +0 -137
  309. package/node_modules/find-up/index.js +0 -89
  310. package/node_modules/find-up/license +0 -9
  311. package/node_modules/find-up/package.json +0 -53
  312. package/node_modules/find-up/readme.md +0 -156
  313. package/node_modules/get-caller-file/LICENSE.md +0 -6
  314. package/node_modules/get-caller-file/README.md +0 -41
  315. package/node_modules/get-caller-file/index.d.ts +0 -2
  316. package/node_modules/get-caller-file/index.js +0 -22
  317. package/node_modules/get-caller-file/index.js.map +0 -1
  318. package/node_modules/get-caller-file/package.json +0 -42
  319. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  320. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  321. package/node_modules/is-fullwidth-code-point/license +0 -9
  322. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  323. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  324. package/node_modules/locate-path/index.d.ts +0 -83
  325. package/node_modules/locate-path/index.js +0 -65
  326. package/node_modules/locate-path/license +0 -9
  327. package/node_modules/locate-path/package.json +0 -45
  328. package/node_modules/locate-path/readme.md +0 -122
  329. package/node_modules/node-datachannel/.clang-format +0 -17
  330. package/node_modules/node-datachannel/.editorconfig +0 -12
  331. package/node_modules/node-datachannel/.eslintignore +0 -8
  332. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  333. package/node_modules/node-datachannel/.gitmodules +0 -3
  334. package/node_modules/node-datachannel/.prettierignore +0 -7
  335. package/node_modules/node-datachannel/.prettierrc +0 -13
  336. package/node_modules/node-datachannel/API.md +0 -247
  337. package/node_modules/node-datachannel/BULDING.md +0 -26
  338. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  339. package/node_modules/node-datachannel/LICENSE +0 -373
  340. package/node_modules/node-datachannel/README.md +0 -129
  341. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  342. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  343. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  344. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  345. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  346. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  347. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  348. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  349. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  350. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  351. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  352. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  353. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  354. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  355. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  377. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  378. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  379. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  380. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  381. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  382. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  383. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  384. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  385. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  386. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  387. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  388. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  389. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  390. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  391. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  392. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  393. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  394. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  395. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  411. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  412. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  413. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  414. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  415. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  416. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  417. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  418. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  419. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  420. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  421. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  426. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  428. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  429. package/node_modules/node-datachannel/jest.config.ts +0 -14
  430. package/node_modules/node-datachannel/package.json +0 -133
  431. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  432. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  433. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  434. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  435. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  436. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  437. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  438. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  439. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  440. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  441. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  442. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  443. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  444. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  445. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  446. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  447. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  448. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  449. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  450. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  451. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  452. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  453. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  454. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  455. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  456. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  457. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  458. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  459. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  460. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  461. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  462. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  463. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  464. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  465. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  466. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  467. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  468. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  469. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  470. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  471. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  472. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  473. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  474. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  475. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  476. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  477. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  478. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  479. package/node_modules/node-datachannel/src/index.ts +0 -9
  480. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  481. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  482. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  483. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  484. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  485. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  486. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  487. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  488. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  489. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  490. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  491. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  492. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  493. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  494. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  495. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  496. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  497. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  498. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  499. package/node_modules/node-datachannel/tsconfig.json +0 -21
  500. package/node_modules/p-limit/index.d.ts +0 -38
  501. package/node_modules/p-limit/index.js +0 -57
  502. package/node_modules/p-limit/license +0 -9
  503. package/node_modules/p-limit/package.json +0 -52
  504. package/node_modules/p-limit/readme.md +0 -101
  505. package/node_modules/p-locate/index.d.ts +0 -64
  506. package/node_modules/p-locate/index.js +0 -52
  507. package/node_modules/p-locate/license +0 -9
  508. package/node_modules/p-locate/package.json +0 -53
  509. package/node_modules/p-locate/readme.md +0 -90
  510. package/node_modules/p-try/index.d.ts +0 -39
  511. package/node_modules/p-try/index.js +0 -9
  512. package/node_modules/p-try/license +0 -9
  513. package/node_modules/p-try/package.json +0 -42
  514. package/node_modules/p-try/readme.md +0 -58
  515. package/node_modules/path-exists/index.d.ts +0 -28
  516. package/node_modules/path-exists/index.js +0 -23
  517. package/node_modules/path-exists/license +0 -9
  518. package/node_modules/path-exists/package.json +0 -39
  519. package/node_modules/path-exists/readme.md +0 -52
  520. package/node_modules/pngjs/.eslintignore +0 -2
  521. package/node_modules/pngjs/.eslintrc.json +0 -19
  522. package/node_modules/pngjs/.prettierignore +0 -3
  523. package/node_modules/pngjs/LICENSE +0 -20
  524. package/node_modules/pngjs/README.md +0 -429
  525. package/node_modules/pngjs/browser.js +0 -16096
  526. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  527. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  528. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  529. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  530. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  531. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  532. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  533. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  534. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  535. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  536. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  537. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  538. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  539. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  540. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  541. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  542. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  543. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  544. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  545. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  546. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  547. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  548. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  549. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  550. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  551. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  552. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  553. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  554. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  555. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  556. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  557. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  558. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  559. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  560. package/node_modules/pngjs/lib/constants.js +0 -32
  561. package/node_modules/pngjs/lib/crc.js +0 -40
  562. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  563. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  564. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  565. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  566. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  567. package/node_modules/pngjs/lib/interlace.js +0 -95
  568. package/node_modules/pngjs/lib/packer-async.js +0 -50
  569. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  570. package/node_modules/pngjs/lib/packer.js +0 -129
  571. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  572. package/node_modules/pngjs/lib/parser-async.js +0 -165
  573. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  574. package/node_modules/pngjs/lib/parser.js +0 -290
  575. package/node_modules/pngjs/lib/png-sync.js +0 -12
  576. package/node_modules/pngjs/lib/png.js +0 -194
  577. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  578. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  579. package/node_modules/pngjs/package.json +0 -73
  580. package/node_modules/qrcode/README.md +0 -770
  581. package/node_modules/qrcode/bin/qrcode +0 -159
  582. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  583. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  584. package/node_modules/qrcode/lib/browser.js +0 -76
  585. package/node_modules/qrcode/lib/can-promise.js +0 -7
  586. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  587. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  588. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  589. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  590. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  591. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  592. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  593. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  594. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  595. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  596. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  597. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  598. package/node_modules/qrcode/lib/core/mode.js +0 -167
  599. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  600. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  601. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  602. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  603. package/node_modules/qrcode/lib/core/regex.js +0 -31
  604. package/node_modules/qrcode/lib/core/segments.js +0 -330
  605. package/node_modules/qrcode/lib/core/utils.js +0 -63
  606. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  607. package/node_modules/qrcode/lib/core/version.js +0 -163
  608. package/node_modules/qrcode/lib/index.js +0 -12
  609. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  610. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  611. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  612. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  613. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  614. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  615. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  616. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  617. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  618. package/node_modules/qrcode/lib/server.js +0 -138
  619. package/node_modules/qrcode/license +0 -10
  620. package/node_modules/qrcode/package.json +0 -77
  621. package/node_modules/require-directory/.jshintrc +0 -67
  622. package/node_modules/require-directory/.npmignore +0 -1
  623. package/node_modules/require-directory/.travis.yml +0 -3
  624. package/node_modules/require-directory/LICENSE +0 -22
  625. package/node_modules/require-directory/README.markdown +0 -184
  626. package/node_modules/require-directory/index.js +0 -86
  627. package/node_modules/require-directory/package.json +0 -40
  628. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  629. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  630. package/node_modules/require-main-filename/README.md +0 -26
  631. package/node_modules/require-main-filename/index.js +0 -18
  632. package/node_modules/require-main-filename/package.json +0 -35
  633. package/node_modules/semver/LICENSE +0 -15
  634. package/node_modules/semver/README.md +0 -680
  635. package/node_modules/semver/bin/semver.js +0 -195
  636. package/node_modules/semver/classes/comparator.js +0 -143
  637. package/node_modules/semver/classes/index.js +0 -7
  638. package/node_modules/semver/classes/range.js +0 -577
  639. package/node_modules/semver/classes/semver.js +0 -350
  640. package/node_modules/semver/functions/clean.js +0 -8
  641. package/node_modules/semver/functions/cmp.js +0 -54
  642. package/node_modules/semver/functions/coerce.js +0 -62
  643. package/node_modules/semver/functions/compare-build.js +0 -9
  644. package/node_modules/semver/functions/compare-loose.js +0 -5
  645. package/node_modules/semver/functions/compare.js +0 -7
  646. package/node_modules/semver/functions/diff.js +0 -60
  647. package/node_modules/semver/functions/eq.js +0 -5
  648. package/node_modules/semver/functions/gt.js +0 -5
  649. package/node_modules/semver/functions/gte.js +0 -5
  650. package/node_modules/semver/functions/inc.js +0 -21
  651. package/node_modules/semver/functions/lt.js +0 -5
  652. package/node_modules/semver/functions/lte.js +0 -5
  653. package/node_modules/semver/functions/major.js +0 -5
  654. package/node_modules/semver/functions/minor.js +0 -5
  655. package/node_modules/semver/functions/neq.js +0 -5
  656. package/node_modules/semver/functions/parse.js +0 -18
  657. package/node_modules/semver/functions/patch.js +0 -5
  658. package/node_modules/semver/functions/prerelease.js +0 -8
  659. package/node_modules/semver/functions/rcompare.js +0 -5
  660. package/node_modules/semver/functions/rsort.js +0 -5
  661. package/node_modules/semver/functions/satisfies.js +0 -12
  662. package/node_modules/semver/functions/sort.js +0 -5
  663. package/node_modules/semver/functions/truncate.js +0 -48
  664. package/node_modules/semver/functions/valid.js +0 -8
  665. package/node_modules/semver/index.js +0 -93
  666. package/node_modules/semver/internal/constants.js +0 -37
  667. package/node_modules/semver/internal/debug.js +0 -11
  668. package/node_modules/semver/internal/identifiers.js +0 -29
  669. package/node_modules/semver/internal/lrucache.js +0 -42
  670. package/node_modules/semver/internal/parse-options.js +0 -17
  671. package/node_modules/semver/internal/re.js +0 -223
  672. package/node_modules/semver/package.json +0 -78
  673. package/node_modules/semver/preload.js +0 -4
  674. package/node_modules/semver/range.bnf +0 -17
  675. package/node_modules/semver/ranges/gtr.js +0 -6
  676. package/node_modules/semver/ranges/intersects.js +0 -9
  677. package/node_modules/semver/ranges/ltr.js +0 -6
  678. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  679. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  680. package/node_modules/semver/ranges/min-version.js +0 -63
  681. package/node_modules/semver/ranges/outside.js +0 -82
  682. package/node_modules/semver/ranges/simplify.js +0 -49
  683. package/node_modules/semver/ranges/subset.js +0 -249
  684. package/node_modules/semver/ranges/to-comparators.js +0 -10
  685. package/node_modules/semver/ranges/valid.js +0 -13
  686. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  687. package/node_modules/set-blocking/LICENSE.txt +0 -14
  688. package/node_modules/set-blocking/README.md +0 -31
  689. package/node_modules/set-blocking/index.js +0 -7
  690. package/node_modules/set-blocking/package.json +0 -42
  691. package/node_modules/sharp/LICENSE +0 -191
  692. package/node_modules/sharp/README.md +0 -112
  693. package/node_modules/sharp/dist/channel.cjs +0 -177
  694. package/node_modules/sharp/dist/channel.mjs +0 -177
  695. package/node_modules/sharp/dist/colour.cjs +0 -199
  696. package/node_modules/sharp/dist/colour.mjs +0 -199
  697. package/node_modules/sharp/dist/composite.cjs +0 -213
  698. package/node_modules/sharp/dist/composite.mjs +0 -213
  699. package/node_modules/sharp/dist/constructor.cjs +0 -511
  700. package/node_modules/sharp/dist/constructor.mjs +0 -511
  701. package/node_modules/sharp/dist/index.cjs +0 -25
  702. package/node_modules/sharp/dist/index.d.cts +0 -1999
  703. package/node_modules/sharp/dist/index.d.mts +0 -2046
  704. package/node_modules/sharp/dist/index.mjs +0 -25
  705. package/node_modules/sharp/dist/input.cjs +0 -819
  706. package/node_modules/sharp/dist/input.mjs +0 -819
  707. package/node_modules/sharp/dist/is.cjs +0 -143
  708. package/node_modules/sharp/dist/is.mjs +0 -143
  709. package/node_modules/sharp/dist/libvips.cjs +0 -212
  710. package/node_modules/sharp/dist/libvips.mjs +0 -212
  711. package/node_modules/sharp/dist/operation.cjs +0 -1002
  712. package/node_modules/sharp/dist/operation.mjs +0 -1002
  713. package/node_modules/sharp/dist/output.cjs +0 -1785
  714. package/node_modules/sharp/dist/output.mjs +0 -1785
  715. package/node_modules/sharp/dist/resize.cjs +0 -617
  716. package/node_modules/sharp/dist/resize.mjs +0 -617
  717. package/node_modules/sharp/dist/sharp.cjs +0 -174
  718. package/node_modules/sharp/dist/sharp.mjs +0 -174
  719. package/node_modules/sharp/dist/utility.cjs +0 -301
  720. package/node_modules/sharp/dist/utility.mjs +0 -301
  721. package/node_modules/sharp/install/build.js +0 -38
  722. package/node_modules/sharp/lib/index.d.ts +0 -1999
  723. package/node_modules/sharp/package.json +0 -227
  724. package/node_modules/sharp/src/binding.gyp +0 -303
  725. package/node_modules/sharp/src/common.cc +0 -1186
  726. package/node_modules/sharp/src/common.h +0 -421
  727. package/node_modules/sharp/src/metadata.cc +0 -404
  728. package/node_modules/sharp/src/metadata.h +0 -95
  729. package/node_modules/sharp/src/operations.cc +0 -516
  730. package/node_modules/sharp/src/operations.h +0 -137
  731. package/node_modules/sharp/src/pipeline.cc +0 -1948
  732. package/node_modules/sharp/src/pipeline.h +0 -422
  733. package/node_modules/sharp/src/sharp.cc +0 -43
  734. package/node_modules/sharp/src/stats.cc +0 -186
  735. package/node_modules/sharp/src/stats.h +0 -62
  736. package/node_modules/sharp/src/utilities.cc +0 -289
  737. package/node_modules/sharp/src/utilities.h +0 -22
  738. package/node_modules/string-width/index.d.ts +0 -29
  739. package/node_modules/string-width/index.js +0 -47
  740. package/node_modules/string-width/license +0 -9
  741. package/node_modules/string-width/package.json +0 -56
  742. package/node_modules/string-width/readme.md +0 -50
  743. package/node_modules/strip-ansi/index.d.ts +0 -17
  744. package/node_modules/strip-ansi/index.js +0 -4
  745. package/node_modules/strip-ansi/license +0 -9
  746. package/node_modules/strip-ansi/package.json +0 -54
  747. package/node_modules/strip-ansi/readme.md +0 -46
  748. package/node_modules/which-module/LICENSE +0 -13
  749. package/node_modules/which-module/README.md +0 -58
  750. package/node_modules/which-module/index.js +0 -9
  751. package/node_modules/which-module/package.json +0 -41
  752. package/node_modules/wrap-ansi/index.js +0 -186
  753. package/node_modules/wrap-ansi/license +0 -9
  754. package/node_modules/wrap-ansi/package.json +0 -61
  755. package/node_modules/wrap-ansi/readme.md +0 -97
  756. package/node_modules/ws/LICENSE +0 -20
  757. package/node_modules/ws/README.md +0 -548
  758. package/node_modules/ws/browser.js +0 -8
  759. package/node_modules/ws/index.js +0 -22
  760. package/node_modules/ws/lib/buffer-util.js +0 -131
  761. package/node_modules/ws/lib/constants.js +0 -19
  762. package/node_modules/ws/lib/event-target.js +0 -292
  763. package/node_modules/ws/lib/extension.js +0 -203
  764. package/node_modules/ws/lib/limiter.js +0 -55
  765. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  766. package/node_modules/ws/lib/receiver.js +0 -743
  767. package/node_modules/ws/lib/sender.js +0 -607
  768. package/node_modules/ws/lib/stream.js +0 -161
  769. package/node_modules/ws/lib/subprotocol.js +0 -62
  770. package/node_modules/ws/lib/validation.js +0 -152
  771. package/node_modules/ws/lib/websocket-server.js +0 -562
  772. package/node_modules/ws/lib/websocket.js +0 -1407
  773. package/node_modules/ws/package.json +0 -74
  774. package/node_modules/ws/wrapper.mjs +0 -21
  775. package/node_modules/y18n/CHANGELOG.md +0 -35
  776. package/node_modules/y18n/LICENSE +0 -13
  777. package/node_modules/y18n/README.md +0 -109
  778. package/node_modules/y18n/index.js +0 -188
  779. package/node_modules/y18n/package.json +0 -39
  780. package/node_modules/yargs/CHANGELOG.md +0 -420
  781. package/node_modules/yargs/LICENSE +0 -21
  782. package/node_modules/yargs/README.md +0 -140
  783. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  784. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  785. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  786. package/node_modules/yargs/build/lib/argsert.js +0 -65
  787. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  788. package/node_modules/yargs/build/lib/command.js +0 -416
  789. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  790. package/node_modules/yargs/build/lib/common-types.js +0 -25
  791. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  792. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  793. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  794. package/node_modules/yargs/build/lib/completion.js +0 -135
  795. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  796. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  797. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  798. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  799. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  800. package/node_modules/yargs/build/lib/middleware.js +0 -57
  801. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  802. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  803. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  804. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  805. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  806. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  807. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  808. package/node_modules/yargs/build/lib/usage.js +0 -540
  809. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  810. package/node_modules/yargs/build/lib/validation.js +0 -330
  811. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  812. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  813. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  814. package/node_modules/yargs/build/lib/yerror.js +0 -11
  815. package/node_modules/yargs/index.js +0 -40
  816. package/node_modules/yargs/locales/be.json +0 -46
  817. package/node_modules/yargs/locales/de.json +0 -46
  818. package/node_modules/yargs/locales/en.json +0 -51
  819. package/node_modules/yargs/locales/es.json +0 -46
  820. package/node_modules/yargs/locales/fi.json +0 -49
  821. package/node_modules/yargs/locales/fr.json +0 -53
  822. package/node_modules/yargs/locales/hi.json +0 -49
  823. package/node_modules/yargs/locales/hu.json +0 -46
  824. package/node_modules/yargs/locales/id.json +0 -50
  825. package/node_modules/yargs/locales/it.json +0 -46
  826. package/node_modules/yargs/locales/ja.json +0 -51
  827. package/node_modules/yargs/locales/ko.json +0 -49
  828. package/node_modules/yargs/locales/nb.json +0 -44
  829. package/node_modules/yargs/locales/nl.json +0 -49
  830. package/node_modules/yargs/locales/nn.json +0 -44
  831. package/node_modules/yargs/locales/pirate.json +0 -13
  832. package/node_modules/yargs/locales/pl.json +0 -49
  833. package/node_modules/yargs/locales/pt.json +0 -45
  834. package/node_modules/yargs/locales/pt_BR.json +0 -48
  835. package/node_modules/yargs/locales/ru.json +0 -46
  836. package/node_modules/yargs/locales/th.json +0 -46
  837. package/node_modules/yargs/locales/tr.json +0 -48
  838. package/node_modules/yargs/locales/zh_CN.json +0 -48
  839. package/node_modules/yargs/locales/zh_TW.json +0 -47
  840. package/node_modules/yargs/package.json +0 -92
  841. package/node_modules/yargs/yargs.js +0 -14
  842. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  843. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  844. package/node_modules/yargs-parser/README.md +0 -449
  845. package/node_modules/yargs-parser/index.js +0 -1032
  846. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  847. 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
- }