@walkhi/code-relax 0.1.0-beta.10 → 0.1.0-beta.101

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