@walkhi/code-relax 0.1.0-beta.1 → 0.1.0-beta.100

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 +67 -45
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +387 -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 +63 -0
  7. package/dist/bin/publish-harmony-release.mjs +46 -0
  8. package/dist/bin/release-upload-server.mjs +190 -0
  9. package/dist/bin/self-relay-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +2 -2
  11. package/dist/bin/self-relay-server.mjs +46 -30
  12. package/dist/bin/set-relay-admin-password.mjs +11 -0
  13. package/dist/build-platform.json +1 -0
  14. package/dist/get-shared-service-url.ps1 +12 -4
  15. package/dist/shared/app-server-events.cjs +500 -255
  16. package/dist/shared/code-browser.cjs +159 -0
  17. package/dist/shared/file-changes.cjs +31 -0
  18. package/dist/shared/file-citations.cjs +117 -0
  19. package/dist/shared/file-mentions.cjs +92 -0
  20. package/dist/shared/message-delivery.cjs +115 -0
  21. package/dist/shared/p2p-data-channel.cjs +72 -0
  22. package/dist/shared/p2p-diagnostics.cjs +1 -1
  23. package/dist/shared/p2p-file-channel.cjs +87 -0
  24. package/dist/shared/p2p-ice-policy.cjs +22 -0
  25. package/dist/shared/plan-pricing.cjs +32 -0
  26. package/dist/shared/question-attention.cjs +100 -0
  27. package/dist/shared/release-version.cjs +31 -0
  28. package/dist/shared/server-requests.cjs +347 -67
  29. package/dist/shared/service-endpoints.cjs +21 -0
  30. package/dist/shared/timeline-sync.cjs +173 -67
  31. package/dist/skills/code-relax/SKILL.md +22 -17
  32. package/dist/src/archived-threads.mjs +22 -0
  33. package/dist/src/bounded-process-log.mjs +63 -0
  34. package/dist/src/browser-auth-operations.mjs +46 -0
  35. package/dist/src/celsius-client.mjs +107 -0
  36. package/dist/src/code-browser.mjs +99 -0
  37. package/dist/src/desktop-launcher.mjs +57 -35
  38. package/dist/src/desktop-operation.mjs +46 -0
  39. package/dist/src/dots-approval-timeline.mjs +99 -0
  40. package/dist/src/dots-avatar.mjs +42 -0
  41. package/dist/src/dots-chat-projection.mjs +50 -0
  42. package/dist/src/dots-chat-server.mjs +623 -0
  43. package/dist/src/dots-message-images.mjs +318 -0
  44. package/dist/src/dots-profile.mjs +77 -0
  45. package/dist/src/dots-room-activity.mjs +199 -0
  46. package/dist/src/dots-room-client.mjs +163 -0
  47. package/dist/src/dots-room-projection.mjs +94 -0
  48. package/dist/src/dots-schedules.mjs +66 -0
  49. package/dist/src/dots-summary-tasks.mjs +32 -0
  50. package/dist/src/dots-task-catalog.mjs +433 -0
  51. package/dist/src/dots-task-files.mjs +52 -0
  52. package/dist/src/file-transfer-range.mjs +22 -0
  53. package/dist/src/file-upload-session.mjs +151 -0
  54. package/dist/src/hosted-history-app-server.mjs +103 -0
  55. package/dist/src/hosted-history-cache.mjs +113 -0
  56. package/dist/src/lan-socket-server.mjs +270 -31
  57. package/dist/src/managed-app-server.mjs +398 -207
  58. package/dist/src/managed-endpoint.mjs +25 -0
  59. package/dist/src/message-images.mjs +0 -18
  60. package/dist/src/message-upload-files.mjs +111 -0
  61. package/dist/src/onboarding.mjs +9 -28
  62. package/dist/src/plan-pricing.mjs +47 -0
  63. package/dist/src/platform/README.md +7 -12
  64. package/dist/src/platform/codex-protocol.mjs +51 -0
  65. package/dist/src/platform/codex-runtime.mjs +4 -0
  66. package/dist/src/platform/credential-store.mjs +19 -0
  67. package/dist/src/platform/desktop-host.mjs +3 -0
  68. package/dist/src/platform/desktop-permission-mode.mjs +17 -0
  69. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  70. package/dist/src/platform/desktop-project-store.mjs +219 -0
  71. package/dist/src/platform/file-opener.mjs +9 -0
  72. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  73. package/dist/src/platform/linux/desktop-host.mjs +87 -0
  74. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  75. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  76. package/dist/src/platform/linux/network-info.mjs +11 -0
  77. package/dist/src/platform/linux/process.mjs +53 -0
  78. package/dist/src/platform/linux/project-locations.mjs +17 -0
  79. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  80. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  81. package/dist/src/platform/linux/service-host.mjs +18 -0
  82. package/dist/src/platform/linux/system.mjs +50 -0
  83. package/dist/src/platform/linux/user-environment.mjs +31 -0
  84. package/dist/src/platform/macos/codex-runtime.mjs +121 -0
  85. package/dist/src/platform/macos/desktop-host.mjs +114 -0
  86. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  87. package/dist/src/platform/macos/network-info.mjs +8 -0
  88. package/dist/src/platform/macos/project-locations.mjs +8 -0
  89. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  90. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  91. package/dist/src/platform/macos/service-host.mjs +18 -0
  92. package/dist/src/platform/macos/system.mjs +29 -0
  93. package/dist/src/platform/macos/user-environment.mjs +31 -0
  94. package/dist/src/platform/managed-user-environment.mjs +78 -0
  95. package/dist/src/platform/native-package.mjs +69 -0
  96. package/dist/src/platform/network-info.mjs +3 -0
  97. package/dist/src/platform/path-identity.mjs +5 -0
  98. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  99. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  100. package/dist/src/platform/power-inhibitor.mjs +22 -0
  101. package/dist/src/platform/project-locations.mjs +3 -0
  102. package/dist/src/platform/runtime-paths.mjs +8 -0
  103. package/dist/src/platform/select.mjs +5 -0
  104. package/dist/src/platform/service-host.mjs +3 -0
  105. package/dist/src/platform/user-environment.mjs +3 -0
  106. package/dist/src/platform/windows/IsolatedProcess.cs +7 -3
  107. package/dist/src/platform/windows/activate-desktop.ps1 +49 -0
  108. package/dist/src/platform/windows/background-process.mjs +7 -2
  109. package/dist/src/platform/windows/codex-runtime.mjs +225 -0
  110. package/dist/src/platform/windows/desktop-helper.mjs +272 -0
  111. package/dist/src/platform/windows/desktop-host.mjs +45 -18
  112. package/dist/src/platform/windows/desktop-info.ps1 +27 -5
  113. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  114. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  115. package/dist/src/platform/windows/desktop-shortcuts.ps1 +7 -14
  116. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  117. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  118. package/dist/src/platform/windows/launch-worker.mjs +41 -0
  119. package/dist/src/platform/windows/project-locations.mjs +16 -0
  120. package/dist/src/platform/windows/resident-start.js +20 -0
  121. package/dist/src/platform/windows/resident-startup.ps1 +76 -20
  122. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  123. package/dist/src/platform/windows/service-host.mjs +15 -23
  124. package/dist/src/platform/windows/start-hidden-console.ps1 +27 -8
  125. package/dist/src/platform/windows/stop-desktop.ps1 +7 -4
  126. package/dist/src/platform/windows/user-environment.mjs +52 -50
  127. package/dist/src/project-create.mjs +121 -0
  128. package/dist/src/project-management.mjs +59 -0
  129. package/dist/src/project-remove.mjs +55 -0
  130. package/dist/src/project-update.mjs +59 -0
  131. package/dist/src/relay-config-import.mjs +45 -0
  132. package/dist/src/remote-control.mjs +51 -0
  133. package/dist/src/runtime-discovery.mjs +67 -0
  134. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  135. package/dist/src/self-relay/account-connections.mjs +63 -0
  136. package/dist/src/self-relay/admin-auth.mjs +59 -0
  137. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  138. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  139. package/dist/src/self-relay/admin-page.mjs +87 -0
  140. package/dist/src/self-relay/admin-server.mjs +105 -0
  141. package/dist/src/self-relay/admin-state.mjs +127 -0
  142. package/dist/src/self-relay/admin-style.mjs +58 -0
  143. package/dist/src/self-relay/admin-workstations-page.mjs +95 -0
  144. package/dist/src/self-relay/admin-workstations.mjs +145 -0
  145. package/dist/src/self-relay/android-releases.mjs +61 -0
  146. package/dist/src/self-relay/client.mjs +47 -45
  147. package/dist/src/self-relay/connection-reporting.mjs +38 -0
  148. package/dist/src/self-relay/connector.mjs +473 -147
  149. package/dist/src/self-relay/demo.mjs +5 -6
  150. package/dist/src/self-relay/device-info.mjs +27 -0
  151. package/dist/src/self-relay/device-store.mjs +10 -2
  152. package/dist/src/self-relay/diagnostics.mjs +54 -0
  153. package/dist/src/self-relay/email-accounts.mjs +195 -0
  154. package/dist/src/self-relay/file-wire.mjs +76 -0
  155. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  156. package/dist/src/self-relay/lifecycle.mjs +271 -274
  157. package/dist/src/self-relay/long-pairing.mjs +40 -0
  158. package/dist/src/self-relay/mysql-state.mjs +118 -0
  159. package/dist/src/self-relay/p2p-probe.mjs +103 -18
  160. package/dist/src/self-relay/phone-connections.mjs +55 -0
  161. package/dist/src/self-relay/privacy-page.mjs +26 -0
  162. package/dist/src/self-relay/public-releases.mjs +67 -0
  163. package/dist/src/self-relay/rtc-file-bridge.mjs +46 -0
  164. package/dist/src/self-relay/server.mjs +1073 -296
  165. package/dist/src/self-relay/usage-daily.mjs +55 -0
  166. package/dist/src/self-relay/usage-meter.mjs +141 -0
  167. package/dist/src/server.mjs +1231 -1295
  168. package/dist/src/service-control.mjs +17 -7
  169. package/dist/src/service-doctor.mjs +150 -63
  170. package/dist/src/service-health.mjs +2 -2
  171. package/dist/src/service-install.mjs +16 -10
  172. package/dist/src/service-lifecycle.mjs +48 -38
  173. package/dist/src/service-power.mjs +58 -0
  174. package/dist/src/service-restart.mjs +45 -12
  175. package/dist/src/service-update-worker.mjs +42 -0
  176. package/dist/src/service-update.mjs +80 -0
  177. package/dist/src/shared-app-server.mjs +495 -133
  178. package/dist/src/shared-catalog.mjs +132 -60
  179. package/dist/src/shared-recovery.mjs +24 -14
  180. package/dist/src/shared-thread-stream.mjs +143 -51
  181. package/dist/src/skill-install.mjs +0 -13
  182. package/dist/src/thread-goals.mjs +40 -0
  183. package/dist/src/turn-model-history.mjs +47 -0
  184. package/dist/src/usage-reset.mjs +17 -0
  185. package/dist/src/workstation-downloads.mjs +120 -0
  186. package/package.json +35 -37
  187. package/tools/postinstall.mjs +186 -9
  188. package/dist/src/app-server-client.mjs +0 -468
  189. package/dist/src/app-server-tasks.mjs +0 -355
  190. package/dist/src/debug-ui.mjs +0 -131
  191. package/dist/src/platform/windows/credential-store.mjs +0 -27
  192. package/dist/src/platform/windows/credential-store.ps1 +0 -49
  193. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  194. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  195. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  196. package/dist/src/platform/windows/launch-worker.ps1 +0 -13
  197. package/dist/src/thread-catalog.mjs +0 -42
  198. package/dist/tools/find-desktop-pipe.mjs +0 -10
  199. package/dist/web/approval-ui.js +0 -188
  200. package/dist/web/capabilities.js +0 -57
  201. package/dist/web/chat-transport.js +0 -196
  202. package/dist/web/chat.css +0 -736
  203. package/dist/web/chat.js +0 -5149
  204. package/dist/web/client-platform.js +0 -11
  205. package/dist/web/harmony-platform.js +0 -51
  206. package/dist/web/highlight-powershell.min.js +0 -39
  207. package/dist/web/highlight.min.js +0 -1262
  208. package/dist/web/history-cache.js +0 -146
  209. package/dist/web/index.html +0 -222
  210. package/dist/web/lan-session.js +0 -122
  211. package/dist/web/p2p-diagnostics.js +0 -28
  212. package/dist/web/p2p-probe.js +0 -83
  213. package/dist/web/resources.json +0 -1
  214. package/dist/web/self-relay-session.js +0 -119
  215. package/dist/web/server-requests.js +0 -67
  216. package/dist/web/timeline-sync.js +0 -67
  217. package/dist/web/vendor/README.md +0 -14
  218. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  219. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  220. package/dist/web/vendor/highlight.min.js +0 -1262
  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,42 +2,51 @@ 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';
7
+ import { desktopPermissionMode } from './platform/desktop-permission-mode.mjs';
6
8
 
7
- const syncTokenTtlMs = 30_000;
8
- const syncBufferMaxBytes = 8 * 1024 * 1024;
9
- const writerConflictMessages = ['already has an active writer', 'already has a live local writer'];
10
-
11
- export class ThreadWriterConflictError extends Error {
12
- constructor(threadId, message) {
13
- super('该对话正在另一个 Codex 实例中使用。');
14
- this.name = 'ThreadWriterConflictError';
15
- this.code = 'thread_writer_owned_elsewhere';
16
- this.threadId = threadId;
17
- this.readOnly = true;
18
- this.details = message;
19
- }
20
- }
21
-
22
- export function isThreadWriterConflict(error) {
23
- const message = String(error?.message || error).toLowerCase();
24
- return error instanceof ThreadWriterConflictError || writerConflictMessages.some(text => message.includes(text));
25
- }
9
+ const syncTokenTtlMs = 30_000;
10
+ const syncBufferMaxBytes = 8 * 1024 * 1024;
11
+ const historyPageMaxTurns = 8;
12
+ const historyPageMaxBytes = 500 * 1024;
13
+ const writerConflictMessages = ['already has an active writer', 'already has a live local writer'];
14
+
15
+ export class ThreadWriterConflictError extends Error {
16
+ constructor(threadId, message) {
17
+ super('该对话存在写入冲突,请稍后重试。');
18
+ this.name = 'ThreadWriterConflictError';
19
+ this.code = 'thread_writer_owned_elsewhere';
20
+ this.threadId = threadId;
21
+ this.readOnly = true;
22
+ this.details = message;
23
+ }
24
+ }
25
+
26
+ export function isThreadWriterConflict(error) {
27
+ const message = String(error?.message || error).toLowerCase();
28
+ return error instanceof ThreadWriterConflictError || writerConflictMessages.some(text => message.includes(text));
29
+ }
26
30
 
27
31
  // Connect to the Desktop's existing execution service; never spawn or adopt a task.
28
32
  export class SharedAppServer extends EventEmitter {
29
33
  constructor(url) {
30
34
  super();
31
35
  const address = new URL(url);
32
- if (address.protocol !== 'ws:' || address.hostname !== '127.0.0.1') throw new Error('完整控制必须使用本机回环 WebSocket。');
36
+ if (address.protocol !== 'ws:' || address.hostname !== '127.0.0.1') throw new Error('Codex 内核必须使用本机回环 WebSocket。');
33
37
  this.url = url;
38
+ this.serverVersion = '';
34
39
  this.epoch = randomUUID();
35
40
  this.sequence = 0;
41
+ this.connectionId = null;
36
42
  this.pending = new Map();
37
- this.serverRequests = new serverRequests.Store(randomUUID(), id => this.emit('requests-changed', id));
43
+ this.serverRequests = new serverRequests.Store(randomUUID(), id => {
44
+ this.emit('requests-changed', id);
45
+ this.releaseInactiveThread(id);
46
+ });
38
47
  this.threads = new Map();
39
48
  this.contexts = new Map();
40
- this.settingsNotifications = new Map();
49
+ this.settingsNotifications = new events.SettingsNotifications();
41
50
  this.permissionOptions = new events.PermissionOptionsCache();
42
51
  this.subscriptions = new Map();
43
52
  this.usageCache = new events.UsageCache(value => this.emit('usage', value));
@@ -50,10 +59,16 @@ export class SharedAppServer extends EventEmitter {
50
59
  return this.connecting;
51
60
  }
52
61
 
62
+ openSocket() {
63
+ return new WebSocket(this.url, { handshakeTimeout: 5000 });
64
+ }
65
+
53
66
  async open() {
54
- const socket = new WebSocket(this.url, { handshakeTimeout: 5000 });
67
+ const socket = await this.openSocket();
55
68
  this.socket = socket;
69
+ this.connectionId = randomUUID();
56
70
  this.ready = false;
71
+ this.serverVersion = '';
57
72
  this.serverRequests.reset(randomUUID());
58
73
  socket.on('message', bytes => {
59
74
  let message;
@@ -64,19 +79,29 @@ export class SharedAppServer extends EventEmitter {
64
79
  if (!pending) return;
65
80
  this.pending.delete(message.id);
66
81
  clearTimeout(pending.timer);
67
- if (message.error) {
68
- const text = String(message.error.message || 'app-server 请求失败');
69
- pending.reject(writerConflictMessages.some(value => text.toLowerCase().includes(value))
70
- ? new ThreadWriterConflictError(pending.threadId, text)
71
- : Object.assign(new Error(text), { rpcCode: message.error.code, details: message.error.data }));
72
- }
73
- else pending.resolve(message.result);
82
+ if (message.error) {
83
+ const text = String(message.error.message || 'app-server 请求失败');
84
+ this.traceLifecycle('error', pending, { rpcCode: message.error.code,
85
+ writerError: writerConflictMessages.find(value => text.toLowerCase().includes(value)) || null });
86
+ pending.reject(writerConflictMessages.some(value => text.toLowerCase().includes(value))
87
+ ? new ThreadWriterConflictError(pending.threadId, text)
88
+ : Object.assign(new Error(text), { rpcCode: message.error.code, details: message.error.data,
89
+ ...(/^invalid cursor:/i.test(text) ? { code: 'history_cursor_expired' } : {}) }));
90
+ }
91
+ else {
92
+ this.traceLifecycle('complete', pending, { status: message.result?.status,
93
+ resultThreadId: message.result?.thread?.id, resultServiceTier: message.result?.serviceTier });
94
+ try { pending.resolve(pending.transform(message.result)); }
95
+ catch (error) { pending.reject(error); }
96
+ }
74
97
  });
75
98
  socket.on('close', () => {
76
99
  this.ready = false;
100
+ this.serverVersion = '';
77
101
  for (const pending of this.pending.values()) {
78
102
  clearTimeout(pending.timer);
79
- pending.reject(new Error('完整控制连接断开;发送结果可能未确认,请检查对话后再操作。'));
103
+ this.traceLifecycle('disconnected', pending);
104
+ pending.reject(new Error('Codex 内核连接断开;发送结果可能未确认,请检查对话后再操作。'));
80
105
  }
81
106
  this.pending.clear();
82
107
  this.serverRequests.reset(randomUUID());
@@ -92,51 +117,142 @@ export class SharedAppServer extends EventEmitter {
92
117
  socket.on('error', () => {}); // open/request reports the connection error to the caller.
93
118
  await new Promise((resolve, reject) => { socket.once('open', resolve); socket.once('error', reject); });
94
119
  try {
95
- await this.request('initialize', { clientInfo: { name: 'codex_remote_shared', version: '1.0.0' }, capabilities: { experimentalApi: true } });
120
+ const initialized = await this.request('initialize', { clientInfo: { name: 'codex_remote_shared', version: '1.0.0' }, capabilities: { experimentalApi: true } });
121
+ // The first user-agent product reports the running server build. Its name
122
+ // may contain spaces ("Codex Desktop"); the slash delimits the version.
123
+ // Do not substitute the selected executable's pending version.
124
+ this.serverVersion = String(initialized?.userAgent || '').match(/^[^/]+\/([^\s]+)/)?.[1] || '';
96
125
  socket.send(JSON.stringify({ method: 'initialized' }));
97
126
  this.ready = true;
98
127
  this.usageCache.read(() => this.request('account/rateLimits/read')).catch(error => this.emit('usage-error', error));
99
128
  } catch (error) { socket.close(); throw error; }
100
129
  }
101
130
 
102
- request(method, params) {
131
+ request(method, params, transform = value => value) {
103
132
  const id = ++this.sequence;
133
+ const diagnostic = { method, requestId: id, threadId: params?.threadId, connectionId: this.connectionId,
134
+ ...(method === 'thread/settings/update' && params?.serviceTier !== undefined ? { serviceTier: params.serviceTier } : {}) };
135
+ this.traceLifecycle('begin', diagnostic);
104
136
  return new Promise((resolve, reject) => {
105
137
  const timer = setTimeout(() => {
106
- this.pending.delete(id);
107
- reject(new Error(`${method} 超时;不会自动重发,请先检查对话。`));
138
+ const error = Object.assign(new Error(`${method} 超时;不会自动重发,请先检查对话。`),
139
+ { code: 'app_server_request_timeout' });
140
+ this.traceLifecycle('timeout', diagnostic);
141
+ if (['turn/start', 'turn/steer', 'thread/queue/add'].includes(method) && this.pending.has(id)) {
142
+ messageDelivery.retainLateResult(this.pending.get(id), error);
143
+ } else { this.pending.delete(id); reject(error); }
108
144
  }, 30000);
109
- this.pending.set(id, { resolve, reject, timer, threadId: params?.threadId });
145
+ this.pending.set(id, { resolve, reject, timer, transform, ...diagnostic });
110
146
  this.socket.send(JSON.stringify({ id, method, params }), error => {
111
- if (!error || !this.pending.delete(id)) return;
112
- clearTimeout(timer); reject(error);
147
+ const pending = this.pending.get(id);
148
+ if (!error || !pending) return;
149
+ this.traceLifecycle('send-error', diagnostic);
150
+ this.pending.delete(id);
151
+ clearTimeout(timer); pending.reject(error);
113
152
  });
114
153
  });
115
154
  }
116
155
 
156
+ traceLifecycle(phase, request, extra = {}) {
157
+ if (!['thread/start', 'thread/resume', 'thread/unsubscribe', 'thread/settings/update', 'thread/settings/updated'].includes(request.method)) return;
158
+ const threadId = value => typeof value === 'string' && /^[\w-]{1,80}$/.test(value) ? value : null;
159
+ const identity = this.diagnosticIdentity?.() || {};
160
+ console.info('[thread-lifecycle]', JSON.stringify({ time: new Date().toISOString(), bridgePid: process.pid,
161
+ kernelPid: identity.kernelPid ?? null, kernelCreated: identity.kernelCreated ?? null,
162
+ connectionId: request.connectionId, serverVersion: this.serverVersion, phase,
163
+ method: request.method, requestId: request.requestId, threadId: threadId(request.threadId),
164
+ ...([null, 'default', 'priority', 'fast'].includes(request.serviceTier) ? { serviceTier: request.serviceTier } : {}),
165
+ ...(extra.resultThreadId ? { resultThreadId: threadId(extra.resultThreadId) } : {}),
166
+ ...(extra.resultServiceTier !== undefined && [null, 'default', 'priority', 'fast'].includes(extra.resultServiceTier)
167
+ ? { resultServiceTier: extra.resultServiceTier } : {}),
168
+ ...(typeof extra.status === 'string' && /^[\w-]{1,40}$/.test(extra.status) ? { status: extra.status } : {}),
169
+ ...(typeof extra.rpcCode === 'number' ? { rpcCode: extra.rpcCode } : {}),
170
+ ...(extra.writerError ? { writerError: extra.writerError } : {}) }));
171
+ }
172
+
117
173
  async projects() {
118
174
  await this.connect();
119
175
  return events.readProjects((method, params) => this.request(method, params));
120
176
  }
121
177
 
122
- async send(args) {
123
- await this.connect();
124
- this.requireWritable(args.threadId);
125
- // Reading the live thread checks this service owns it without resume changing settings.
126
- const { thread } = await this.request('thread/read', { threadId: args.threadId, includeTurns: false });
127
- const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
128
- if (status === 'active') {
129
- const live = await this.request('thread/read', { threadId: args.threadId, includeTurns: true });
130
- const active = live.thread.turns?.findLast(turn => turn.status === 'inProgress');
131
- if (!active) throw new Error('活动轮次已变化,请刷新后再发送。');
132
- return this.request('turn/steer', { threadId: args.threadId, expectedTurnId: active.id, input: args.input, ...(args.clientUserMessageId ? { clientUserMessageId: args.clientUserMessageId } : {}) });
178
+ startThread(target) {
179
+ return this.request('thread/start', target, result => {
180
+ // thread/start already subscribes this connection. Retain its authoritative
181
+ // empty snapshot before turn/start can emit events; immediately resuming
182
+ // would unnecessarily read history that may not have been persisted yet.
183
+ const thread = result.thread;
184
+ const record = { thread: { ...thread, turns: (thread.turns || []).map(turn => events.compactTurn(turn)) },
185
+ nextCursor: null, sequence: 0, recoverAfter: 0, changes: new Map(), changeBytes: 0,
186
+ tokens: new Map([[randomUUID(), { sequence: 0, expires: Date.now() + syncTokenTtlMs }]]) };
187
+ this.threads.set(thread.id, record);
188
+ this.contexts.set(thread.id, { model: result.model, thinking: result.reasoningEffort,
189
+ serviceTier: result.serviceTier ?? null, cwd: result.cwd, ...events.permissionState(result) });
190
+ this.scheduleCleanup(thread.id, this.slot(thread.id));
191
+ return result;
192
+ });
193
+ }
194
+
195
+ async send(args, { assertCurrent = () => {}, useGlobalPermissions = true } = {}) {
196
+ let submitted = false;
197
+ let sendPhase = 'connect';
198
+ try {
199
+ await this.connect();
200
+ sendPhase = 'writable';
201
+ this.requireWritable(args.threadId);
202
+ // Reading the live thread checks this service owns it without resume changing settings.
203
+ sendPhase = 'thread-read';
204
+ const { thread } = await this.request('thread/read', { threadId: args.threadId, includeTurns: false });
205
+ assertCurrent();
206
+ const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
207
+ if (status === 'active') {
208
+ sendPhase = 'active-turn';
209
+ const page = await this.request('thread/turns/list', {
210
+ threadId: args.threadId, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded',
211
+ });
212
+ const active = page.data?.[0];
213
+ assertCurrent();
214
+ if (active?.status !== 'inProgress') throw new Error('活动轮次已变化,请刷新后再发送。');
215
+ const { turnTrigger, ...source } = events.mobileTurnSource(args.clientUserMessageId, args.responsesapiClientMetadata?.code_relax_input === 'speech_to_text');
216
+ submitted = true;
217
+ sendPhase = 'turn-steer';
218
+ return await this.request('turn/steer', { threadId: args.threadId, expectedTurnId: active.id, input: args.input, ...source, ...(args.clientUserMessageId ? { clientUserMessageId: args.clientUserMessageId } : {}) },
219
+ result => ({ result, usage: { kind: 'steer', turnId: active.id } }));
220
+ }
221
+ sendPhase = 'permissions';
222
+ const permissions = useGlobalPermissions ? await events.globalPermissionOverrides((method, params) => this.request(method, params),
223
+ { ...this.contexts.get(args.threadId), desktopPermissionMode: await desktopPermissionMode(), model: args.model || this.contexts.get(args.threadId)?.model }, args.threadId) : {};
224
+ assertCurrent();
225
+ submitted = true;
226
+ sendPhase = 'turn-start';
227
+ return await this.request('turn/start', { ...args, ...permissions },
228
+ result => ({ result, usage: { kind: 'start', turnId: result?.turn?.id || null } }));
229
+ } catch (error) {
230
+ if (!submitted || messageDelivery.rejectedBeforeSubmission(error)) error.deliveryUnknown = false;
231
+ error.details = { ...(error.details && typeof error.details === 'object' ? error.details : {}), sendPhase,
232
+ ...(Number.isInteger(error.rpcCode) ? { rpcCode: error.rpcCode } : {}) };
233
+ throw error;
133
234
  }
134
- return this.request('turn/start', args);
135
235
  }
136
236
 
137
- respondApproval(threadId, body) {
138
- if (!this.ready || this.socket?.readyState !== WebSocket.OPEN) throw new Error('完整控制未连接');
139
- this.requireWritable(threadId);
237
+ async prepareGoalActivation(threadId, { useGlobalPermissions = true } = {}) {
238
+ this.requireWritable(threadId);
239
+ const record = this.threads.get(threadId);
240
+ if (!record || record.needsReload || record.hydrating) throw new Error('请等待对话同步完成后再开始目标');
241
+ if (!useGlobalPermissions) return;
242
+ const request = (method, params) => this.request(method, params);
243
+ const permissions = await events.globalPermissionOverrides(request,
244
+ { ...this.contexts.get(threadId), desktopPermissionMode: await desktopPermissionMode() }, threadId);
245
+ if (Object.keys(permissions).length) await request('thread/settings/update', { threadId, ...permissions });
246
+ }
247
+
248
+ async findSentMessage(threadId, clientId, anchorItemId) {
249
+ await this.connect();
250
+ return messageDelivery.findMessage((method, params) => this.request(method, params), threadId, clientId, anchorItemId);
251
+ }
252
+
253
+ respondApproval(threadId, body) {
254
+ if (!this.ready || this.socket?.readyState !== WebSocket.OPEN) throw new Error('Codex 内核未就绪');
255
+ this.requireWritable(threadId);
140
256
  return this.serverRequests.respond(threadId, body, message => new Promise((resolve, reject) => {
141
257
  this.socket.send(JSON.stringify(message), error => error ? reject(error) : resolve());
142
258
  }));
@@ -145,11 +261,13 @@ export class SharedAppServer extends EventEmitter {
145
261
  notification(method, params) {
146
262
  this.serverRequests.notification(method, params);
147
263
  this.emit('notification', { method, params });
264
+ if (['thread/goal/updated', 'thread/goal/cleared'].includes(method)) return;
148
265
  if (method === 'thread/queue/changed') { this.emit('queue-changed', params.threadId); return; }
149
266
  if (method === 'account/rateLimits/updated') { this.usageCache.update(params); return; }
150
267
  const id = params.threadId;
151
268
  if (method === 'thread/settings/updated') {
152
269
  const settings = params.threadSettings;
270
+ this.traceLifecycle('notification', { method, threadId: id, connectionId: this.connectionId, serviceTier: settings.serviceTier ?? null });
153
271
  this.contexts.set(id, { ...this.contexts.get(id), model: settings.model, thinking: settings.effort, serviceTier: settings.serviceTier ?? null,
154
272
  cwd: settings.cwd, ...events.permissionState(settings) });
155
273
  this.settingsNotifications.set(id, settings);
@@ -162,11 +280,43 @@ export class SharedAppServer extends EventEmitter {
162
280
  }
163
281
  const record = this.threads.get(id);
164
282
  if (!record) return;
165
- const turn = events.applyNotification(record.thread, method, params);
283
+ if (method === 'thread/name/updated') {
284
+ record.thread.name = params.threadName;
285
+ return; // Catalog metadata must not invalidate or replay message bodies.
286
+ }
287
+ const stub = record.thread.turns?.find(turn => turn.cacheStub && turn.id === (params.turn?.id || params.turnId));
288
+ if (stub && !['thread/status/changed', 'thread/name/updated'].includes(method)) {
289
+ record.needsReload = true;
290
+ this.emit('history-invalidated', id);
291
+ return;
292
+ }
293
+ if (!this.isThreadObserved(id, record)) {
294
+ // Keep task/approval lifecycle metadata, not an invisible growing transcript.
295
+ record.needsReload = true;
296
+ if (params.turn) events.applyNotification(record.thread, method, { ...params, turn: { ...params.turn, items: [] } });
297
+ else if (method === 'thread/status/changed') record.thread.status = params.status;
298
+ record.thread.turns = (record.thread.turns || []).slice(-1).map(turn => ({ ...turn, items: [] }));
299
+ record.changes.clear(); record.changeBytes = 0;
300
+ if (['turn/completed', 'thread/status/changed'].includes(method)) this.releaseInactiveThread(id);
301
+ return;
302
+ }
303
+ const current = record.thread.turns?.find(turn => turn.id === (params.turn?.id || params.turnId));
304
+ if (method === 'item/completed' && !record.hydrating && current?.itemPage?.olderCursor && !current.items.some(item => item.id === params.item?.id)) return;
305
+ // Current app-server completion summaries carry the terminal answer, not
306
+ // an unrequested history page. Its ID may be new during snapshot handoff.
307
+ const visibleParams = (record.hydrating || current?.itemPage?.olderCursor) && method === 'turn/completed'
308
+ && params.turn?.itemsView !== 'summary' && Array.isArray(params.turn?.items)
309
+ ? { ...params, turn: { ...params.turn,
310
+ items: params.turn.items.filter(item => current?.items?.some(loaded => loaded.id === item.id)) } }
311
+ : params;
312
+ const appliedParams = { ...visibleParams,
313
+ ...(visibleParams.item ? { item: events.compactItem(visibleParams.item) } : {}),
314
+ ...(visibleParams.turn ? { turn: events.compactTurn(visibleParams.turn) } : {}) };
315
+ const turn = events.applyNotification(record.thread, method, appliedParams);
166
316
  if (turn) {
167
317
  const sequence = ++record.sequence;
168
318
  record.changes.set(turn.id, { sequence, turn });
169
- record.changeBytes += Buffer.byteLength(JSON.stringify({ method, params }));
319
+ record.changeBytes += Buffer.byteLength(JSON.stringify({ method, params: appliedParams }));
170
320
  if (record.changeBytes > syncBufferMaxBytes) {
171
321
  record.recoverAfter = sequence;
172
322
  record.changes.clear(); record.changeBytes = 0;
@@ -174,53 +324,114 @@ export class SharedAppServer extends EventEmitter {
174
324
  this.emit('turn', { thread: record.thread, turn, sequence,
175
325
  immediate: ['turn/completed', 'item/completed'].includes(method) });
176
326
  }
177
- if (method === 'turn/completed') record.thread.turns = record.thread.turns.slice(-10);
327
+ if (method === 'turn/completed' && record.thread.turns.length > 10) {
328
+ record.thread.turns = record.thread.turns.slice(-10);
329
+ // Native cursors are opaque; obtain a matching boundary before the next snapshot.
330
+ record.historyTrimmed = true;
331
+ }
332
+ if (['turn/completed', 'thread/status/changed'].includes(method)) this.releaseInactiveThread(id);
333
+ }
334
+
335
+ matchesUpdatedAt(thread, updatedAt) {
336
+ const status = typeof thread.status === 'string' ? thread.status : thread.status?.type;
337
+ const latest = thread.turns?.at(-1);
338
+ return Number(updatedAt) > 0 && status !== 'active' && latest?.status !== 'inProgress'
339
+ && Math.floor(Number(thread.updatedAt)) === Math.floor(Number(updatedAt));
178
340
  }
179
341
 
180
- async timeline(threadId) {
342
+ resumeTimeline(threadId, apply) {
343
+ return this.request('thread/resume', { threadId, excludeTurns: true,
344
+ initialTurnsPage: { limit: 1, sortDirection: 'desc', itemsView: 'notLoaded' } }, value => {
345
+ if (!Array.isArray(value.initialTurnsPage?.data)) throw new Error('Codex 内核未返回分页历史。');
346
+ return apply(value);
347
+ });
348
+ }
349
+
350
+ initialTurnsPage(_threadId, resumed) { return resumed.initialTurnsPage; }
351
+
352
+ async timeline(threadId, pageOptions = {}, knownSync) {
181
353
  await this.connect();
182
354
  const slot = this.slot(threadId);
355
+ slot.readers++;
183
356
  const task = slot.tail.then(async () => {
184
- let record = this.threads.get(threadId);
185
- if (record?.readOnly) {
186
- this.threads.delete(threadId);
187
- this.contexts.delete(threadId);
188
- record = null;
189
- }
190
- if (!record) {
191
- let result;
192
- try {
193
- result = await this.request('thread/resume', { threadId, excludeTurns: true,
194
- initialTurnsPage: { limit: 10, sortDirection: 'desc', itemsView: 'full' } });
195
- } catch (error) {
196
- if (!isThreadWriterConflict(error)) throw error;
197
- const read = await this.request('thread/read', { threadId, includeTurns: true });
198
- const turns = Array.isArray(read.thread?.turns) ? read.thread.turns.slice(-10) : [];
199
- const thread = { ...read.thread, turns, readOnly: true,
200
- readOnlyReason: '该对话正在另一个 Codex 实例中使用。' };
201
- record = { thread, nextCursor: null, sequence: 0, recoverAfter: 0,
202
- changes: new Map(), changeBytes: 0, tokens: new Map(), readOnly: true };
203
- this.threads.set(threadId, record);
204
- result = null;
205
- }
206
- if (result) {
207
- if (!Array.isArray(result.initialTurnsPage?.data)) throw new Error('完整控制未返回分页历史。');
208
- const thread = { ...result.thread, turns: [...result.initialTurnsPage.data].reverse() };
209
- record = { thread, nextCursor: result.initialTurnsPage.nextCursor ?? null, sequence: 0,
210
- recoverAfter: 0, changes: new Map(), changeBytes: 0, tokens: new Map() };
211
- this.threads.set(threadId, record);
212
- this.contexts.set(threadId, { ...this.contexts.get(threadId), model: result.model, thinking: result.reasoningEffort, serviceTier: result.serviceTier ?? null,
213
- cwd: result.cwd, ...events.permissionState(result) });
214
- }
357
+ let record = this.threads.get(threadId), metadataReused = false;
358
+ // Seconds are the product's cache-update granularity. Active work still
359
+ // uses the received sequence so an in-progress reply can keep advancing.
360
+ const knownToken = record?.tokens.get(knownSync?.id);
361
+ const unchanged = Boolean(!pageOptions.reconcileObserved && record && !record.readOnly && !record.needsReload && !record.hydrating
362
+ && (this.matchesUpdatedAt(record.thread, knownSync?.updatedAt)
363
+ || (knownSync?.epoch === this.epoch && Number.isSafeInteger(knownSync.seq)
364
+ && knownToken && knownToken.expires > Date.now()
365
+ && knownToken.sequence === knownSync.seq && record.sequence === knownSync.seq)));
366
+ if (unchanged) {
367
+ const id = randomUUID();
368
+ record.tokens.set(id, { sequence: record.sequence, expires: Date.now() + syncTokenTtlMs });
369
+ this.scheduleCleanup(threadId, slot);
370
+ return { thread: { ...record.thread, turns: [] }, notModified: true,
371
+ sync: { id, epoch: this.epoch, seq: record.sequence } };
372
+ }
373
+ // Snapshot refreshes must not reset the sequence or tokens of live subscribers.
374
+ const previous = record?.readOnly ? null : record;
375
+ if (record?.readOnly || record?.needsReload) this.contexts.delete(threadId);
376
+ if (pageOptions.reconcileObserved || !record || record.readOnly || record.needsReload || record.historyTrimmed || record.metadataOnly) {
377
+ let result, snapshot;
378
+ const settingsBeforeResume = this.settingsNotifications.get(threadId);
379
+ try {
380
+ result = await this.resumeTimeline(threadId, value => {
381
+ const retained = new Map((previous?.thread.turns || []).map(turn => [turn.id, turn]));
382
+ record = { thread: { ...value.thread, turns: [...value.initialTurnsPage.data].reverse().map(turn => ({
383
+ ...turn, items: retained.get(turn.id)?.items || [],
384
+ ...(retained.get(turn.id)?.itemPage ? { itemPage: retained.get(turn.id).itemPage } : {}),
385
+ })) },
386
+ nextCursor: value.initialTurnsPage.nextCursor ?? null,
387
+ sequence: previous?.sequence ?? 0, recoverAfter: previous?.recoverAfter ?? 0,
388
+ changes: previous?.changes ?? new Map(), changeBytes: previous?.changeBytes ?? 0,
389
+ tokens: previous?.tokens ?? new Map(), hydrating: true };
390
+ this.threads.set(threadId, record);
391
+ snapshot = events.beginSnapshot(record.thread);
392
+ return value;
393
+ }, pageOptions);
394
+ } catch (error) {
395
+ snapshot?.close();
396
+ if (!isThreadWriterConflict(error)) throw error;
397
+ record = await this.readOnlyRecord(threadId, pageOptions, '该对话存在写入冲突,请稍后重试。');
398
+ result = null;
399
+ }
400
+ if (result) try {
401
+ const page = await this.initialTurnsPage(threadId, result);
402
+ if (!Array.isArray(page?.data)) throw new Error('Codex 内核未返回分页历史。');
403
+ const live = new Map(record.thread.turns.map(turn => [turn.id, turn]));
404
+ record.thread.turns = [...page.data].reverse().map(turn => {
405
+ const current = live.get(turn.id);
406
+ live.delete(turn.id);
407
+ return current ? Object.assign(current, { ...turn, ...current }) : { ...turn, items: [] };
408
+ }).concat([...live.values()]);
409
+ record.nextCursor = page.nextCursor ?? null;
410
+ metadataReused = Boolean(!pageOptions.reconcileObserved && !snapshot.changed()
411
+ && this.matchesUpdatedAt(record.thread, knownSync?.updatedAt));
412
+ if (metadataReused) {
413
+ record.metadataOnly = true;
414
+ record.thread.turns = record.thread.turns.map(turn => ({ ...turn, items: [], cacheStub: true }));
415
+ } else await Promise.all(page.data.map(turn => this.compactTurn(threadId, turn, null, page => snapshot.merge(page), 20)));
416
+ record.hydrating = false;
417
+ if (this.settingsNotifications.get(threadId) === settingsBeforeResume) {
418
+ this.contexts.set(threadId, { ...this.contexts.get(threadId), model: result.model, thinking: result.reasoningEffort, serviceTier: result.serviceTier ?? null,
419
+ cwd: result.cwd, ...events.permissionState(result) });
420
+ }
421
+ } finally { snapshot?.close(); }
215
422
  }
216
423
  const id = randomUUID(), expires = Date.now() + syncTokenTtlMs;
217
424
  record.tokens.set(id, { sequence: record.sequence, expires });
218
425
  this.scheduleCleanup(threadId, slot);
219
- return { thread: record.thread, nextCursor: record.nextCursor,
426
+ return { thread: metadataReused ? { ...record.thread, turns: [] } : record.thread,
427
+ ...(metadataReused ? { notModified: true } : {}),
428
+ nextCursor: this.historyCursor(threadId, record.thread.turns[0], record.nextCursor),
220
429
  sync: { id, epoch: this.epoch, seq: record.sequence } };
221
- });
430
+ }).finally(() => { slot.readers--; });
222
431
  slot.tail = task.catch(() => {});
223
432
  task.catch(() => {
433
+ const record = this.threads.get(threadId);
434
+ if (record?.hydrating) { record.needsReload = true; record.hydrating = false; this.scheduleCleanup(threadId, slot); }
224
435
  if (!slot.users && !this.threads.has(threadId) && this.subscriptions.get(threadId) === slot) {
225
436
  clearTimeout(slot.expiry);
226
437
  this.subscriptions.delete(threadId);
@@ -231,10 +442,18 @@ export class SharedAppServer extends EventEmitter {
231
442
 
232
443
  slot(threadId) {
233
444
  let slot = this.subscriptions.get(threadId);
234
- if (!slot) { slot = { users: 0, tail: Promise.resolve(), expiry: null }; this.subscriptions.set(threadId, slot); }
445
+ if (!slot) { slot = { users: 0, readers: 0, tail: Promise.resolve(), expiry: null }; this.subscriptions.set(threadId, slot); }
235
446
  return slot;
236
447
  }
237
448
 
449
+ keepSnapshotAlive(threadId, sync) {
450
+ const token = this.threads.get(threadId)?.tokens.get(sync?.id);
451
+ const slot = this.subscriptions.get(threadId);
452
+ if (!token || !slot || sync.epoch !== this.epoch) return;
453
+ token.expires = Date.now() + syncTokenTtlMs;
454
+ this.scheduleCleanup(threadId, slot);
455
+ }
456
+
238
457
  scheduleCleanup(threadId, slot) {
239
458
  clearTimeout(slot.expiry);
240
459
  const record = this.threads.get(threadId);
@@ -246,15 +465,39 @@ export class SharedAppServer extends EventEmitter {
246
465
  cleanup(threadId, slot) {
247
466
  const record = this.threads.get(threadId), now = Date.now();
248
467
  if (record) for (const [id, token] of record.tokens) if (token.expires <= now) record.tokens.delete(id);
249
- if (slot.users) { clearTimeout(slot.expiry); slot.expiry = null; return; }
468
+ if (slot.users || slot.readers) { clearTimeout(slot.expiry); slot.expiry = null; return; }
250
469
  if (record?.tokens.size) { this.scheduleCleanup(threadId, slot); return; }
470
+ if (this.keepThreadLoaded(threadId, record)) { clearTimeout(slot.expiry); slot.expiry = null; return; }
251
471
  slot.tail = slot.tail.then(async () => {
252
- if (slot.users || this.threads.get(threadId)?.tokens.size) return;
472
+ if (this.subscriptions.get(threadId) !== slot) return;
473
+ if (slot.users || slot.readers || this.threads.get(threadId)?.tokens.size || this.keepThreadLoaded(threadId, this.threads.get(threadId))) return;
474
+ if (this.ready && !record?.readOnly) await this.unsubscribeThread(threadId);
475
+ // Keep this queue registered until unsubscribe completes. A returning reader
476
+ // must enqueue its resume behind it, rather than creating a second queue.
477
+ if (this.subscriptions.get(threadId) !== slot) return;
253
478
  this.threads.delete(threadId); this.contexts.delete(threadId); this.permissionOptions.delete(threadId);
254
- this.subscriptions.delete(threadId); clearTimeout(slot.expiry);
255
- if (this.ready && !record?.readOnly) await this.request('thread/unsubscribe', { threadId });
256
- this.serverRequests.forget(threadId);
257
- }).catch(error => this.emit('subscription-error', error));
479
+ if (!slot.users && !slot.readers) this.subscriptions.delete(threadId);
480
+ clearTimeout(slot.expiry);
481
+ this.serverRequests.forget(threadId);
482
+ }).catch(error => {
483
+ if (this.subscriptions.get(threadId) === slot && this.threads.get(threadId) === record && record) record.needsReload = true;
484
+ this.emit('subscription-error', error);
485
+ });
486
+ }
487
+
488
+ keepThreadLoaded(threadId, record) {
489
+ if (!record || record.readOnly) return false;
490
+ const status = typeof record.thread.status === 'string' ? record.thread.status : record.thread.status?.type;
491
+ return status === 'active' || record.thread.turns?.some(turn => turn.status === 'inProgress')
492
+ || this.serverRequests.list(threadId).length > 0;
493
+ }
494
+
495
+ releaseInactiveThread(threadId) {
496
+ // Run after the current notification has updated both request and turn state.
497
+ queueMicrotask(() => {
498
+ const slot = this.subscriptions?.get(threadId);
499
+ if (slot && !slot.users && this.ready) this.cleanup(threadId, slot);
500
+ });
258
501
  }
259
502
 
260
503
  async acquire(threadId, requested) {
@@ -264,18 +507,20 @@ export class SharedAppServer extends EventEmitter {
264
507
  token = record.tokens.get(requested.id);
265
508
  if (!token || token.expires <= Date.now() || token.sequence !== requested.after) token = undefined;
266
509
  }
267
- let snapshot = false, catchup;
268
- if (!record || !token) {
269
- const fresh = await this.timeline(threadId);
510
+ let snapshot = false, catchup, confirmed = false;
511
+ if (!record || !token || record.needsReload
512
+ || ((record.historyTrimmed || record.metadataOnly) && requested.after < record.recoverAfter)) {
513
+ const fresh = await this.timeline(threadId, {}, { updatedAt: requested?.updatedAt, chatRevision: requested?.chatRevision });
270
514
  record = this.threads.get(threadId); token = record.tokens.get(fresh.sync.id);
271
515
  requested = { id: fresh.sync.id, epoch: fresh.sync.epoch, after: fresh.sync.seq };
272
- snapshot = true;
516
+ snapshot = fresh.notModified !== true;
517
+ confirmed = !snapshot;
273
518
  }
274
519
  slot.users++; record.tokens.delete(requested.id); clearTimeout(slot.expiry);
275
520
  const current = record.sequence;
276
521
  if (!snapshot && requested.after < record.recoverAfter) snapshot = true;
277
522
  if (!snapshot && current > requested.after) {
278
- const turns = [...record.changes.values()].filter(change => change.sequence > requested.after)
523
+ const turns = [...record.changes.values()].filter(change => change.sequence > requested.after && !change.turn.cacheStub)
279
524
  .sort((left, right) => record.thread.turns.findIndex(turn => turn.id === left.turn.id)
280
525
  - record.thread.turns.findIndex(turn => turn.id === right.turn.id)).map(change => change.turn);
281
526
  catchup = { thread: { ...record.thread, turns },
@@ -283,25 +528,127 @@ export class SharedAppServer extends EventEmitter {
283
528
  }
284
529
  const release = () => {
285
530
  slot.users--;
531
+ // Retain the observed snapshot briefly when switching away. A later check
532
+ // must match the client's consumed sequence, never just this release time.
533
+ if (this.threads.get(threadId) === record && !record.readOnly) {
534
+ record.tokens.set(requested.id, { sequence: record.sequence, expires: Date.now() + syncTokenTtlMs });
535
+ }
286
536
  this.cleanup(threadId, slot);
287
537
  return slot.tail;
288
538
  };
289
- return { record: { thread: record.thread, nextCursor: record.nextCursor,
539
+ return { record: { thread: record.thread, nextCursor: this.historyCursor(threadId, record.thread.turns[0], record.nextCursor),
290
540
  sync: { id: requested.id, epoch: this.epoch, seq: current, ...(snapshot ? { reset: true } : {}) } },
291
- snapshot, catchup, release };
541
+ snapshot, catchup, confirmed, release };
542
+ }
543
+
544
+ pageSettings(options = {}) {
545
+ return {
546
+ maxTurns: Math.max(1, Math.min(historyPageMaxTurns, Number(options.maxTurns) || historyPageMaxTurns)),
547
+ maxBytes: Math.max(1, Number(options.maxBytes) || historyPageMaxBytes),
548
+ measure: typeof options.measure === 'function' ? options.measure : value => Buffer.byteLength(JSON.stringify(value)),
549
+ };
550
+ }
551
+
552
+ historyCursor(threadId, turn, turnCursor) {
553
+ const itemCursor = turn?.itemPage?.olderCursor;
554
+ if (!itemCursor && !turnCursor) return null;
555
+ // Upstream history cursors identify stored positions, not this observer.
556
+ return JSON.stringify({ threadId, turnId: itemCursor ? turn.id : null,
557
+ itemCursor: itemCursor || null, turnCursor: turnCursor || null });
558
+ }
559
+
560
+ async compactTurn(threadId, turn, cursor = null, apply, limit = 100) {
561
+ if (!turn?.id) return events.compactTurn(turn);
562
+ return this.request('thread/items/list', {
563
+ threadId, turnId: turn.id, ...(cursor ? { cursor } : {}), limit, sortDirection: 'desc',
564
+ }, page => {
565
+ const result = this.projectItemPage(threadId, turn, cursor, page);
566
+ apply?.(result); return result;
567
+ });
568
+ }
569
+
570
+ isThreadObserved(threadId, record) {
571
+ const slot = this.subscriptions.get(threadId);
572
+ return Boolean(slot?.users || slot?.readers || record.tokens.size);
573
+ }
574
+
575
+ unsubscribeThread(threadId) { return this.request('thread/unsubscribe', { threadId }); }
576
+
577
+ async readOnlyRecord(threadId, pageOptions, reason) {
578
+ const [read, page] = await Promise.all([
579
+ this.request('thread/read', { threadId, includeTurns: false }),
580
+ this.request('thread/turns/list', { threadId, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded' }),
581
+ ]);
582
+ const compact = await Promise.all([...(page.data || [])].reverse().map(turn => this.compactTurn(threadId, turn)));
583
+ const turns = this.fitTurns({ thread: read.thread }, compact, pageOptions);
584
+ const thread = { ...read.thread, turns, readOnly: true, readOnlyReason: reason };
585
+ const record = { thread, nextCursor: page.nextCursor ?? null, sequence: 0, recoverAfter: 0,
586
+ changes: new Map(), changeBytes: 0, tokens: new Map(), readOnly: true };
587
+ this.threads.set(threadId, record);
588
+ this.contexts.set(threadId, { model: thread.model, thinking: thread.reasoningEffort, cwd: thread.cwd });
589
+ return record;
590
+ }
591
+
592
+ projectItemPage(threadId, turn, cursor, page) {
593
+ const compact = events.compactTurn(turn);
594
+ if (!Array.isArray(page.data)) throw new Error('Codex 内核未返回单轮条目索引。');
595
+ if (page.nextCursor && page.nextCursor === cursor) throw new Error('条目分页游标未推进。');
596
+ if (page.data.some(entry => entry.turnId !== turn.id)) throw new Error('条目所属轮次不匹配。');
597
+ const items = [...page.data].reverse().map(entry => events.compactItem(entry.item));
598
+ return { ...compact, items, itemPage: { olderCursor: page.nextCursor ?? null,
599
+ hasLoadedOldest: !page.nextCursor, oldestItemId: items[0]?.id || null,
600
+ newestItemId: items.at(-1)?.id || null, requestedCursor: cursor, projection: 'mobile-skeleton' } };
601
+ }
602
+
603
+ async turnContext(threadId, turnId) {
604
+ await this.connect();
605
+ if (!threadId || !turnId) throw new Error('缺少图片所属的对话或轮次。');
606
+ let turn = await this.compactTurn(threadId, { id: turnId });
607
+ while (turn.itemPage.olderCursor) {
608
+ const older = await this.compactTurn(threadId, { id: turnId }, turn.itemPage.olderCursor);
609
+ turn = { ...turn, items: [...older.items, ...turn.items], itemPage: older.itemPage };
610
+ }
611
+ return turn;
612
+ }
613
+
614
+ fitTurns(base, turns, options = {}) {
615
+ const settings = this.pageSettings(options), accepted = [];
616
+ let firstOversized = false;
617
+ for (let index = turns.length - 1; index >= 0 && accepted.length < settings.maxTurns; index--) {
618
+ const candidate = [turns[index], ...accepted];
619
+ const candidateBytes = settings.measure({ ...base, thread: { ...base.thread, turns: candidate } });
620
+ if (accepted.length >= 2 && candidateBytes > settings.maxBytes) break;
621
+ accepted.unshift(turns[index]);
622
+ if (accepted.length === 1) firstOversized = candidateBytes > settings.maxBytes;
623
+ if (firstOversized || (accepted.length >= 2 && candidateBytes > settings.maxBytes)) break;
624
+ }
625
+ return accepted;
292
626
  }
293
627
 
294
- async history(threadId, cursor) {
628
+ async history(threadId, cursor, options = {}) {
295
629
  await this.connect();
296
630
  if (!cursor) throw new Error('缺少历史分页游标。');
297
- const result = await this.request('thread/turns/list', { threadId, cursor, limit: 10, sortDirection: 'desc', itemsView: 'full' });
298
- return { thread: { id: threadId, turns: [...result.data].reverse() }, nextCursor: result.nextCursor ?? null };
631
+ let position;
632
+ try { position = JSON.parse(cursor); } catch { position = null; }
633
+ if (position?.threadId !== threadId) throw Object.assign(new Error('历史游标不属于当前对话。'), { code: 'history_cursor_expired' });
634
+ if (position.itemCursor && position.turnId) {
635
+ const turn = await this.compactTurn(threadId, { id: position.turnId }, position.itemCursor, undefined, options.itemLimit ?? 100);
636
+ return { thread: { id: threadId, turns: [turn] },
637
+ nextCursor: this.historyCursor(threadId, turn, position.turnCursor) };
638
+ }
639
+ const page = await this.request('thread/turns/list', {
640
+ threadId, cursor: position.turnCursor, limit: 1, sortDirection: 'desc', itemsView: 'notLoaded',
641
+ });
642
+ if (!Array.isArray(page.data)) throw new Error('Codex 内核未返回轮次分页。');
643
+ if (page.nextCursor && page.nextCursor === position.turnCursor) throw new Error('轮次分页游标未推进。');
644
+ const turns = page.data.length ? [await this.compactTurn(threadId, page.data[0], null, undefined, options.itemLimit ?? 100)] : [];
645
+ return { thread: { id: threadId, turns }, nextCursor: this.historyCursor(threadId, turns[0], page.nextCursor) };
299
646
  }
300
647
 
301
- async interrupt(threadId, turnId) {
302
- await this.connect();
303
- this.requireWritable(threadId);
304
- return this.request('turn/interrupt', { threadId, turnId });
648
+ async interrupt(threadId, turnId) {
649
+ await this.connect();
650
+ this.requireWritable(threadId);
651
+ return this.request('turn/interrupt', { threadId, turnId });
305
652
  }
306
653
 
307
654
  async models() {
@@ -311,8 +658,14 @@ export class SharedAppServer extends EventEmitter {
311
658
  const result = await this.request('model/list', { limit: 100, ...(cursor ? { cursor } : {}) });
312
659
  models.push(...result.data); cursor = result.nextCursor;
313
660
  } while (cursor);
314
- const config = await this.request('config/read', { includeLayers: false });
315
- return { models: models.filter(model => !model.hidden), enabledReasoningEfforts: config.config?.desktop?.['enabled-reasoning-efforts'] ?? null };
661
+ let config, configWarning;
662
+ try { config = await this.request('config/read', { includeLayers: false }); }
663
+ catch (error) {
664
+ configWarning = `读取思考强度偏好失败:${error.message}`;
665
+ console.warn('[model-catalog]', configWarning);
666
+ }
667
+ return { models: models.filter(model => !model.hidden), enabledReasoningEfforts: config?.config?.desktop?.['enabled-reasoning-efforts'] ?? null,
668
+ ...(configWarning ? { configWarning } : {}) };
316
669
  }
317
670
 
318
671
  async usage() {
@@ -320,37 +673,46 @@ export class SharedAppServer extends EventEmitter {
320
673
  return this.usageCache.read(() => this.request('account/rateLimits/read'));
321
674
  }
322
675
 
323
- async settings(threadId, model, effort, serviceTier) {
324
- await this.connect();
325
- this.requireWritable(threadId);
326
- await events.updateSettings((method, params) => this.request(method, params), this.contexts, this.settingsNotifications, threadId, model, effort, serviceTier);
676
+ async settings(threadId, model, effort, serviceTier) {
677
+ await this.connect();
678
+ this.requireWritable(threadId);
679
+ await events.updateSettings((method, params) => this.request(method, params), this.contexts, threadId, model, effort, serviceTier);
327
680
  return this.context(threadId);
328
681
  }
329
682
 
330
- async permissions(threadId, mode) {
331
- await this.connect();
332
- this.requireWritable(threadId);
683
+ async permissions(threadId, mode) {
684
+ await this.connect();
685
+ this.requireWritable(threadId);
333
686
  await events.updatePermissions((method, params) => this.request(method, params), this.contexts, this.settingsNotifications, this.permissionOptions, threadId, mode);
334
687
  return this.context(threadId);
335
688
  }
336
689
 
337
690
  async readContext(threadId) {
338
- const context = this.contexts.get(threadId);
339
- if (context) await this.permissionOptions.read((method, params) => this.request(method, params), threadId, context);
340
- return this.context(threadId);
691
+ const context = { ...this.contexts.get(threadId), desktopPermissionMode: await desktopPermissionMode() };
692
+ const permissions = await events.readGlobalPermissions((method, params) => this.request(method, params), context || {}, this.permissionOptions, threadId);
693
+ return { ...this.context(threadId), ...permissions };
694
+ }
695
+
696
+ async globalPermissions(mode, { threadId = '', cwd = '' } = {}) {
697
+ await this.connect();
698
+ if (threadId && !this.contexts.has(threadId)) throw new Error('对话设置尚未加载');
699
+ const context = { ...(threadId ? this.contexts.get(threadId) : { cwd }), desktopPermissionMode: await desktopPermissionMode() };
700
+ const request = (method, params) => this.request(method, params);
701
+ return mode === undefined ? events.readGlobalPermissions(request, context, this.permissionOptions, threadId)
702
+ : events.writeGlobalPermissions(request, mode, context, this.permissionOptions, threadId);
341
703
  }
342
704
 
343
- context(threadId) {
705
+ context(threadId) {
344
706
  const context = this.permissionOptions.context(threadId, this.contexts.get(threadId) || {}), usage = context.tokenUsage;
345
707
  const usedTokens = usage?.last?.totalTokens, contextWindow = usage?.modelContextWindow;
346
708
  return { ...context, available: Boolean(contextWindow), usedTokens, contextWindow,
347
709
  usedPercent: contextWindow ? 100 * usedTokens / contextWindow : 0 };
348
- }
349
-
350
- requireWritable(threadId) {
351
- const record = this.threads.get(threadId);
352
- if (record?.readOnly) throw new ThreadWriterConflictError(threadId, record.thread.readOnlyReason);
353
- }
354
-
355
- close() { this.socket?.close(); }
356
- }
710
+ }
711
+
712
+ requireWritable(threadId) {
713
+ const record = this.threads.get(threadId);
714
+ if (record?.readOnly) throw new ThreadWriterConflictError(threadId, record.thread.readOnlyReason);
715
+ }
716
+
717
+ close() { this.socket?.close(); }
718
+ }