@walkhi/code-relax 0.1.0-beta.9 → 0.1.0-beta.91

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