@walkhi/code-relax 0.1.0-beta.3 → 0.1.0-beta.30

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