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

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