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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (850) hide show
  1. package/README.md +67 -44
  2. package/dist/bin/cleanup-accounts.mjs +63 -0
  3. package/dist/bin/codex-remote.mjs +382 -261
  4. package/dist/bin/manage-relay-admin.mjs +20 -0
  5. package/dist/bin/migrate-relay-db.mjs +109 -0
  6. package/dist/bin/publish-android-release.mjs +63 -0
  7. package/dist/bin/publish-harmony-release.mjs +46 -0
  8. package/dist/bin/release-upload-server.mjs +190 -0
  9. package/dist/bin/self-relay-admin.mjs +8 -0
  10. package/dist/bin/self-relay-demo.mjs +1 -1
  11. package/dist/bin/self-relay-server.mjs +43 -30
  12. package/dist/bin/set-relay-admin-password.mjs +11 -0
  13. package/dist/build-platform.json +1 -0
  14. package/dist/get-shared-service-url.ps1 +12 -4
  15. package/dist/shared/app-server-events.cjs +452 -235
  16. package/dist/shared/code-browser.cjs +159 -0
  17. package/dist/shared/file-changes.cjs +31 -0
  18. package/dist/shared/file-citations.cjs +117 -0
  19. package/dist/shared/file-mentions.cjs +92 -0
  20. package/dist/shared/message-delivery.cjs +115 -0
  21. package/dist/shared/p2p-data-channel.cjs +22 -0
  22. package/dist/shared/p2p-diagnostics.cjs +1 -1
  23. package/dist/shared/p2p-file-channel.cjs +87 -0
  24. package/dist/shared/p2p-ice-policy.cjs +22 -0
  25. package/dist/shared/plan-pricing.cjs +32 -0
  26. package/dist/shared/question-attention.cjs +100 -0
  27. package/dist/shared/release-version.cjs +31 -0
  28. package/dist/shared/server-requests.cjs +347 -67
  29. package/dist/shared/service-endpoints.cjs +21 -0
  30. package/dist/shared/timeline-sync.cjs +173 -67
  31. package/dist/skills/code-relax/SKILL.md +22 -17
  32. package/dist/src/archived-threads.mjs +22 -0
  33. package/dist/src/bounded-process-log.mjs +63 -0
  34. package/dist/src/browser-auth-operations.mjs +46 -0
  35. package/dist/src/celsius-client.mjs +107 -0
  36. package/dist/src/code-browser.mjs +99 -0
  37. package/dist/src/desktop-launcher.mjs +57 -32
  38. package/dist/src/desktop-operation.mjs +46 -0
  39. package/dist/src/dots-approval-timeline.mjs +99 -0
  40. package/dist/src/dots-avatar.mjs +42 -0
  41. package/dist/src/dots-chat-projection.mjs +50 -0
  42. package/dist/src/dots-chat-server.mjs +623 -0
  43. package/dist/src/dots-message-images.mjs +318 -0
  44. package/dist/src/dots-profile.mjs +77 -0
  45. package/dist/src/dots-room-activity.mjs +199 -0
  46. package/dist/src/dots-room-client.mjs +163 -0
  47. package/dist/src/dots-room-projection.mjs +94 -0
  48. package/dist/src/dots-schedules.mjs +66 -0
  49. package/dist/src/dots-summary-tasks.mjs +32 -0
  50. package/dist/src/dots-task-catalog.mjs +433 -0
  51. package/dist/src/dots-task-files.mjs +52 -0
  52. package/dist/src/file-transfer-range.mjs +22 -0
  53. package/dist/src/file-upload-session.mjs +151 -0
  54. package/dist/src/hosted-history-app-server.mjs +103 -0
  55. package/dist/src/hosted-history-cache.mjs +113 -0
  56. package/dist/src/lan-socket-server.mjs +266 -37
  57. package/dist/src/managed-app-server.mjs +398 -216
  58. package/dist/src/managed-endpoint.mjs +25 -0
  59. package/dist/src/message-upload-files.mjs +111 -0
  60. package/dist/src/onboarding.mjs +9 -27
  61. package/dist/src/plan-pricing.mjs +47 -0
  62. package/dist/src/platform/README.md +7 -12
  63. package/dist/src/platform/codex-protocol.mjs +51 -0
  64. package/dist/src/platform/codex-runtime.mjs +4 -0
  65. package/dist/src/platform/credential-store.mjs +19 -0
  66. package/dist/src/platform/desktop-host.mjs +3 -0
  67. package/dist/src/platform/desktop-permission-mode.mjs +17 -0
  68. package/dist/src/platform/desktop-project-registration.mjs +3 -0
  69. package/dist/src/platform/desktop-project-store.mjs +219 -0
  70. package/dist/src/platform/file-opener.mjs +9 -0
  71. package/dist/src/platform/linux/codex-runtime.mjs +56 -0
  72. package/dist/src/platform/linux/desktop-host.mjs +87 -0
  73. package/dist/src/platform/linux/desktop-installation.mjs +36 -0
  74. package/dist/src/platform/linux/desktop-project-registration.mjs +11 -0
  75. package/dist/src/platform/linux/network-info.mjs +11 -0
  76. package/dist/src/platform/linux/process.mjs +53 -0
  77. package/dist/src/platform/linux/project-locations.mjs +17 -0
  78. package/dist/src/platform/linux/resident-startup.mjs +52 -0
  79. package/dist/src/platform/linux/retained-runtime.mjs +76 -0
  80. package/dist/src/platform/linux/service-host.mjs +18 -0
  81. package/dist/src/platform/linux/system.mjs +50 -0
  82. package/dist/src/platform/linux/user-environment.mjs +31 -0
  83. package/dist/src/platform/macos/codex-runtime.mjs +121 -0
  84. package/dist/src/platform/macos/desktop-host.mjs +114 -0
  85. package/dist/src/platform/macos/desktop-project-registration.mjs +11 -0
  86. package/dist/src/platform/macos/network-info.mjs +8 -0
  87. package/dist/src/platform/macos/project-locations.mjs +8 -0
  88. package/dist/src/platform/macos/resident-startup.mjs +84 -0
  89. package/dist/src/platform/macos/retained-runtime.mjs +127 -0
  90. package/dist/src/platform/macos/service-host.mjs +18 -0
  91. package/dist/src/platform/macos/system.mjs +29 -0
  92. package/dist/src/platform/macos/user-environment.mjs +31 -0
  93. package/dist/src/platform/managed-user-environment.mjs +78 -0
  94. package/dist/src/platform/native-package.mjs +61 -0
  95. package/dist/src/platform/network-info.mjs +3 -0
  96. package/dist/src/platform/path-identity.mjs +5 -0
  97. package/dist/src/platform/posix/network-candidates.mjs +23 -0
  98. package/dist/src/platform/posix/runtime-paths.mjs +25 -0
  99. package/dist/src/platform/power-inhibitor.mjs +22 -0
  100. package/dist/src/platform/project-locations.mjs +3 -0
  101. package/dist/src/platform/runtime-paths.mjs +8 -0
  102. package/dist/src/platform/select.mjs +5 -0
  103. package/dist/src/platform/service-host.mjs +3 -0
  104. package/dist/src/platform/user-environment.mjs +3 -0
  105. package/dist/src/platform/windows/activate-desktop.ps1 +49 -0
  106. package/dist/src/platform/windows/codex-runtime.mjs +225 -0
  107. package/dist/src/platform/windows/desktop-helper.mjs +179 -0
  108. package/dist/src/platform/windows/desktop-host.mjs +45 -18
  109. package/dist/src/platform/windows/desktop-info.ps1 +27 -5
  110. package/dist/src/platform/windows/desktop-project-registration.mjs +4 -0
  111. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  112. package/dist/src/platform/windows/desktop-shortcuts.ps1 +6 -13
  113. package/dist/src/platform/windows/dots-profile.mjs +49 -0
  114. package/dist/src/platform/windows/keep-awake.ps1 +20 -0
  115. package/dist/src/platform/windows/launch-worker.mjs +41 -42
  116. package/dist/src/platform/windows/project-locations.mjs +16 -0
  117. package/dist/src/platform/windows/resident-start.js +20 -0
  118. package/dist/src/platform/windows/resident-startup.ps1 +27 -11
  119. package/dist/src/platform/windows/rustdesk-video-probe.mjs +168 -0
  120. package/dist/src/platform/windows/service-host.mjs +17 -22
  121. package/dist/src/platform/windows/start-hidden-console.ps1 +11 -2
  122. package/dist/src/platform/windows/user-environment.mjs +52 -50
  123. package/dist/src/project-create.mjs +121 -0
  124. package/dist/src/project-management.mjs +59 -0
  125. package/dist/src/project-remove.mjs +55 -0
  126. package/dist/src/project-update.mjs +59 -0
  127. package/dist/src/relay-config-import.mjs +45 -0
  128. package/dist/src/runtime-discovery.mjs +67 -0
  129. package/dist/src/self-relay/account-cleanup.mjs +30 -0
  130. package/dist/src/self-relay/account-connections.mjs +63 -0
  131. package/dist/src/self-relay/admin-auth.mjs +59 -0
  132. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  133. package/dist/src/self-relay/admin-login-page.mjs +7 -0
  134. package/dist/src/self-relay/admin-page.mjs +87 -54
  135. package/dist/src/self-relay/admin-server.mjs +105 -0
  136. package/dist/src/self-relay/admin-state.mjs +69 -16
  137. package/dist/src/self-relay/admin-style.mjs +58 -0
  138. package/dist/src/self-relay/admin-workstations-page.mjs +95 -0
  139. package/dist/src/self-relay/admin-workstations.mjs +143 -0
  140. package/dist/src/self-relay/android-releases.mjs +61 -0
  141. package/dist/src/self-relay/client.mjs +45 -45
  142. package/dist/src/self-relay/connection-reporting.mjs +38 -0
  143. package/dist/src/self-relay/connector.mjs +456 -145
  144. package/dist/src/self-relay/demo.mjs +1 -1
  145. package/dist/src/self-relay/device-info.mjs +27 -0
  146. package/dist/src/self-relay/device-store.mjs +10 -2
  147. package/dist/src/self-relay/diagnostics.mjs +54 -0
  148. package/dist/src/self-relay/email-accounts.mjs +195 -0
  149. package/dist/src/self-relay/file-wire.mjs +76 -0
  150. package/dist/src/self-relay/lan-authorizations.mjs +44 -2
  151. package/dist/src/self-relay/lifecycle.mjs +252 -259
  152. package/dist/src/self-relay/long-pairing.mjs +40 -0
  153. package/dist/src/self-relay/mysql-state.mjs +118 -0
  154. package/dist/src/self-relay/p2p-probe.mjs +168 -123
  155. package/dist/src/self-relay/phone-connections.mjs +55 -0
  156. package/dist/src/self-relay/privacy-page.mjs +26 -0
  157. package/dist/src/self-relay/public-releases.mjs +67 -0
  158. package/dist/src/self-relay/rtc-file-bridge.mjs +46 -0
  159. package/dist/src/self-relay/server.mjs +1065 -424
  160. package/dist/src/self-relay/usage-daily.mjs +55 -0
  161. package/dist/src/self-relay/usage-meter.mjs +141 -0
  162. package/dist/src/server.mjs +1434 -723
  163. package/dist/src/service-control.mjs +17 -7
  164. package/dist/src/service-doctor.mjs +150 -70
  165. package/dist/src/service-health.mjs +2 -2
  166. package/dist/src/service-install.mjs +16 -10
  167. package/dist/src/service-lifecycle.mjs +52 -42
  168. package/dist/src/service-power.mjs +58 -0
  169. package/dist/src/service-restart.mjs +45 -12
  170. package/dist/src/service-update-worker.mjs +42 -0
  171. package/dist/src/service-update.mjs +80 -0
  172. package/dist/src/shared-app-server.mjs +511 -307
  173. package/dist/src/shared-catalog.mjs +132 -50
  174. package/dist/src/shared-recovery.mjs +22 -12
  175. package/dist/src/shared-thread-stream.mjs +143 -51
  176. package/dist/src/skill-install.mjs +0 -13
  177. package/dist/src/thread-goals.mjs +40 -0
  178. package/dist/src/turn-model-history.mjs +47 -0
  179. package/dist/src/usage-reset.mjs +17 -0
  180. package/dist/src/workstation-downloads.mjs +120 -0
  181. package/package.json +48 -48
  182. package/tools/postinstall.mjs +186 -146
  183. package/dist/src/debug-ui.mjs +0 -131
  184. package/dist/src/platform/windows/credential-store.mjs +0 -27
  185. package/dist/src/platform/windows/credential-store.ps1 +0 -49
  186. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  187. package/dist/web/activity-view.js +0 -283
  188. package/dist/web/approval-ui.js +0 -188
  189. package/dist/web/capabilities.js +0 -50
  190. package/dist/web/chat-transport.js +0 -196
  191. package/dist/web/chat.css +0 -781
  192. package/dist/web/chat.js +0 -3812
  193. package/dist/web/client-platform.js +0 -11
  194. package/dist/web/community.css +0 -82
  195. package/dist/web/community.html +0 -36
  196. package/dist/web/composer-controller.js +0 -97
  197. package/dist/web/conversation-controller.js +0 -99
  198. package/dist/web/disclosure-state-controller.js +0 -95
  199. package/dist/web/draft-controller.js +0 -103
  200. package/dist/web/harmony-platform.js +0 -52
  201. package/dist/web/highlight-powershell.min.js +0 -39
  202. package/dist/web/highlight.min.js +0 -1262
  203. package/dist/web/history-cache.js +0 -240
  204. package/dist/web/history-controller.js +0 -167
  205. package/dist/web/index.html +0 -293
  206. package/dist/web/lan-session.js +0 -122
  207. package/dist/web/link-action-controller.js +0 -212
  208. package/dist/web/message-send-controller.js +0 -177
  209. package/dist/web/message-view.js +0 -98
  210. package/dist/web/p2p-data-channel.js +0 -50
  211. package/dist/web/p2p-diagnostics.js +0 -28
  212. package/dist/web/p2p-probe.js +0 -123
  213. package/dist/web/page-resume.js +0 -28
  214. package/dist/web/pending-message-store.js +0 -108
  215. package/dist/web/queue-controller.js +0 -82
  216. package/dist/web/resources.json +0 -1
  217. package/dist/web/self-relay-session.js +0 -129
  218. package/dist/web/server-requests.js +0 -67
  219. package/dist/web/station-connection-controller.js +0 -75
  220. package/dist/web/task-list-view.js +0 -289
  221. package/dist/web/thread-attention-controller.js +0 -124
  222. package/dist/web/thread-context-controller.js +0 -30
  223. package/dist/web/thread-list-controller.js +0 -61
  224. package/dist/web/thread-list-sync.js +0 -86
  225. package/dist/web/thread-title-controller.js +0 -57
  226. package/dist/web/timeline-formatters.js +0 -249
  227. package/dist/web/timeline-reducer.js +0 -77
  228. package/dist/web/timeline-renderer.js +0 -161
  229. package/dist/web/timeline-scroll-controller.js +0 -50
  230. package/dist/web/timeline-sync.js +0 -67
  231. package/dist/web/usage-controller.js +0 -258
  232. package/dist/web/vendor/README.md +0 -14
  233. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  234. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  235. package/dist/web/vendor/highlight.min.js +0 -1262
  236. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
  237. package/node_modules/@img/colour/LICENSE.md +0 -82
  238. package/node_modules/@img/colour/README.md +0 -15
  239. package/node_modules/@img/colour/color.cjs +0 -1596
  240. package/node_modules/@img/colour/index.cjs +0 -1
  241. package/node_modules/@img/colour/index.d.ts +0 -929
  242. package/node_modules/@img/colour/package.json +0 -58
  243. package/node_modules/@img/sharp-win32-x64/LICENSE +0 -191
  244. package/node_modules/@img/sharp-win32-x64/README.md +0 -59
  245. package/node_modules/@img/sharp-win32-x64/index.cjs +0 -1
  246. package/node_modules/@img/sharp-win32-x64/lib/libvips-42.dll +0 -0
  247. package/node_modules/@img/sharp-win32-x64/lib/libvips-cpp-8.18.6.dll +0 -0
  248. package/node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64-0.35.4.node +0 -0
  249. package/node_modules/@img/sharp-win32-x64/package.json +0 -40
  250. package/node_modules/@img/sharp-win32-x64/versions.json +0 -30
  251. package/node_modules/@node-datachannel/win32-x64-msvc/node_datachannel.node +0 -0
  252. package/node_modules/@node-datachannel/win32-x64-msvc/package.json +0 -20
  253. package/node_modules/ansi-regex/index.d.ts +0 -37
  254. package/node_modules/ansi-regex/index.js +0 -10
  255. package/node_modules/ansi-regex/license +0 -9
  256. package/node_modules/ansi-regex/package.json +0 -55
  257. package/node_modules/ansi-regex/readme.md +0 -78
  258. package/node_modules/ansi-styles/index.d.ts +0 -345
  259. package/node_modules/ansi-styles/index.js +0 -163
  260. package/node_modules/ansi-styles/license +0 -9
  261. package/node_modules/ansi-styles/package.json +0 -56
  262. package/node_modules/ansi-styles/readme.md +0 -152
  263. package/node_modules/camelcase/index.d.ts +0 -63
  264. package/node_modules/camelcase/index.js +0 -76
  265. package/node_modules/camelcase/license +0 -9
  266. package/node_modules/camelcase/package.json +0 -43
  267. package/node_modules/camelcase/readme.md +0 -99
  268. package/node_modules/cliui/CHANGELOG.md +0 -76
  269. package/node_modules/cliui/LICENSE.txt +0 -14
  270. package/node_modules/cliui/README.md +0 -115
  271. package/node_modules/cliui/index.js +0 -354
  272. package/node_modules/cliui/package.json +0 -65
  273. package/node_modules/color-convert/CHANGELOG.md +0 -54
  274. package/node_modules/color-convert/LICENSE +0 -21
  275. package/node_modules/color-convert/README.md +0 -68
  276. package/node_modules/color-convert/conversions.js +0 -839
  277. package/node_modules/color-convert/index.js +0 -81
  278. package/node_modules/color-convert/package.json +0 -48
  279. package/node_modules/color-convert/route.js +0 -97
  280. package/node_modules/color-name/LICENSE +0 -8
  281. package/node_modules/color-name/README.md +0 -11
  282. package/node_modules/color-name/index.js +0 -152
  283. package/node_modules/color-name/package.json +0 -28
  284. package/node_modules/decamelize/index.js +0 -13
  285. package/node_modules/decamelize/license +0 -21
  286. package/node_modules/decamelize/package.json +0 -38
  287. package/node_modules/decamelize/readme.md +0 -48
  288. package/node_modules/detect-libc/LICENSE +0 -201
  289. package/node_modules/detect-libc/README.md +0 -163
  290. package/node_modules/detect-libc/index.d.ts +0 -14
  291. package/node_modules/detect-libc/lib/detect-libc.js +0 -313
  292. package/node_modules/detect-libc/lib/elf.js +0 -39
  293. package/node_modules/detect-libc/lib/filesystem.js +0 -51
  294. package/node_modules/detect-libc/lib/process.js +0 -24
  295. package/node_modules/detect-libc/package.json +0 -44
  296. package/node_modules/dijkstrajs/.travis.yml +0 -4
  297. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  298. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  299. package/node_modules/dijkstrajs/README.md +0 -18
  300. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  301. package/node_modules/dijkstrajs/package.json +0 -60
  302. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  303. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  304. package/node_modules/emoji-regex/README.md +0 -73
  305. package/node_modules/emoji-regex/es2015/index.js +0 -6
  306. package/node_modules/emoji-regex/es2015/text.js +0 -6
  307. package/node_modules/emoji-regex/index.d.ts +0 -23
  308. package/node_modules/emoji-regex/index.js +0 -6
  309. package/node_modules/emoji-regex/package.json +0 -50
  310. package/node_modules/emoji-regex/text.js +0 -6
  311. package/node_modules/find-up/index.d.ts +0 -137
  312. package/node_modules/find-up/index.js +0 -89
  313. package/node_modules/find-up/license +0 -9
  314. package/node_modules/find-up/package.json +0 -53
  315. package/node_modules/find-up/readme.md +0 -156
  316. package/node_modules/get-caller-file/LICENSE.md +0 -6
  317. package/node_modules/get-caller-file/README.md +0 -41
  318. package/node_modules/get-caller-file/index.d.ts +0 -2
  319. package/node_modules/get-caller-file/index.js +0 -22
  320. package/node_modules/get-caller-file/index.js.map +0 -1
  321. package/node_modules/get-caller-file/package.json +0 -42
  322. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  323. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  324. package/node_modules/is-fullwidth-code-point/license +0 -9
  325. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  326. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  327. package/node_modules/locate-path/index.d.ts +0 -83
  328. package/node_modules/locate-path/index.js +0 -65
  329. package/node_modules/locate-path/license +0 -9
  330. package/node_modules/locate-path/package.json +0 -45
  331. package/node_modules/locate-path/readme.md +0 -122
  332. package/node_modules/node-datachannel/.clang-format +0 -17
  333. package/node_modules/node-datachannel/.editorconfig +0 -12
  334. package/node_modules/node-datachannel/.eslintignore +0 -8
  335. package/node_modules/node-datachannel/.eslintrc.json +0 -27
  336. package/node_modules/node-datachannel/.gitmodules +0 -3
  337. package/node_modules/node-datachannel/.prettierignore +0 -7
  338. package/node_modules/node-datachannel/.prettierrc +0 -13
  339. package/node_modules/node-datachannel/API.md +0 -247
  340. package/node_modules/node-datachannel/BULDING.md +0 -26
  341. package/node_modules/node-datachannel/CMakeLists.txt +0 -153
  342. package/node_modules/node-datachannel/LICENSE +0 -373
  343. package/node_modules/node-datachannel/README.md +0 -129
  344. package/node_modules/node-datachannel/dist/cjs/index.cjs +0 -11
  345. package/node_modules/node-datachannel/dist/cjs/index.cjs.map +0 -1
  346. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs +0 -101
  347. package/node_modules/node-datachannel/dist/cjs/lib/datachannel-stream.cjs.map +0 -1
  348. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs +0 -91
  349. package/node_modules/node-datachannel/dist/cjs/lib/index.cjs.map +0 -1
  350. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs +0 -94
  351. package/node_modules/node-datachannel/dist/cjs/lib/node-datachannel.cjs.map +0 -1
  352. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs +0 -45
  353. package/node_modules/node-datachannel/dist/cjs/lib/websocket-server.cjs.map +0 -1
  354. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs +0 -8
  355. package/node_modules/node-datachannel/dist/cjs/lib/websocket.cjs.map +0 -1
  356. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs +0 -86
  357. package/node_modules/node-datachannel/dist/cjs/polyfill/Events.cjs.map +0 -1
  358. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs +0 -34
  359. package/node_modules/node-datachannel/dist/cjs/polyfill/Exception.cjs.map +0 -1
  360. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs +0 -34
  361. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCCertificate.cjs.map +0 -1
  362. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs +0 -214
  363. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDataChannel.cjs.map +0 -1
  364. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs +0 -53
  365. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +0 -1
  366. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs +0 -83
  367. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCError.cjs.map +0 -1
  368. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs +0 -132
  369. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceCandidate.cjs.map +0 -1
  370. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs +0 -94
  371. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCIceTransport.cjs.map +0 -1
  372. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs +0 -434
  373. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCPeerConnection.cjs.map +0 -1
  374. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs +0 -59
  375. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSctpTransport.cjs.map +0 -1
  376. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs +0 -45
  377. package/node_modules/node-datachannel/dist/cjs/polyfill/RTCSessionDescription.cjs.map +0 -1
  378. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs +0 -42
  379. package/node_modules/node-datachannel/dist/cjs/polyfill/index.cjs.map +0 -1
  380. package/node_modules/node-datachannel/dist/esm/index.mjs +0 -8
  381. package/node_modules/node-datachannel/dist/esm/index.mjs.map +0 -1
  382. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs +0 -78
  383. package/node_modules/node-datachannel/dist/esm/lib/datachannel-stream.mjs.map +0 -1
  384. package/node_modules/node-datachannel/dist/esm/lib/index.mjs +0 -64
  385. package/node_modules/node-datachannel/dist/esm/lib/index.mjs.map +0 -1
  386. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs +0 -78
  387. package/node_modules/node-datachannel/dist/esm/lib/node-datachannel.mjs.map +0 -1
  388. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs +0 -43
  389. package/node_modules/node-datachannel/dist/esm/lib/websocket-server.mjs.map +0 -1
  390. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs +0 -6
  391. package/node_modules/node-datachannel/dist/esm/lib/websocket.mjs.map +0 -1
  392. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs +0 -82
  393. package/node_modules/node-datachannel/dist/esm/polyfill/Events.mjs.map +0 -1
  394. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs +0 -28
  395. package/node_modules/node-datachannel/dist/esm/polyfill/Exception.mjs.map +0 -1
  396. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs +0 -30
  397. package/node_modules/node-datachannel/dist/esm/polyfill/RTCCertificate.mjs.map +0 -1
  398. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs +0 -210
  399. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDataChannel.mjs.map +0 -1
  400. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs +0 -49
  401. package/node_modules/node-datachannel/dist/esm/polyfill/RTCDtlsTransport.mjs.map +0 -1
  402. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs +0 -79
  403. package/node_modules/node-datachannel/dist/esm/polyfill/RTCError.mjs.map +0 -1
  404. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs +0 -128
  405. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceCandidate.mjs.map +0 -1
  406. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs +0 -89
  407. package/node_modules/node-datachannel/dist/esm/polyfill/RTCIceTransport.mjs.map +0 -1
  408. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs +0 -430
  409. package/node_modules/node-datachannel/dist/esm/polyfill/RTCPeerConnection.mjs.map +0 -1
  410. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs +0 -55
  411. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSctpTransport.mjs.map +0 -1
  412. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs +0 -41
  413. package/node_modules/node-datachannel/dist/esm/polyfill/RTCSessionDescription.mjs.map +0 -1
  414. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs +0 -27
  415. package/node_modules/node-datachannel/dist/esm/polyfill/index.mjs.map +0 -1
  416. package/node_modules/node-datachannel/dist/types/lib/datachannel-stream.d.ts +0 -24
  417. package/node_modules/node-datachannel/dist/types/lib/index.d.ts +0 -241
  418. package/node_modules/node-datachannel/dist/types/lib/types.d.ts +0 -119
  419. package/node_modules/node-datachannel/dist/types/lib/websocket-server.d.ts +0 -13
  420. package/node_modules/node-datachannel/dist/types/lib/websocket.d.ts +0 -25
  421. package/node_modules/node-datachannel/dist/types/polyfill/Events.d.ts +0 -15
  422. package/node_modules/node-datachannel/dist/types/polyfill/RTCCertificate.d.ts +0 -9
  423. package/node_modules/node-datachannel/dist/types/polyfill/RTCDataChannel.d.ts +0 -29
  424. package/node_modules/node-datachannel/dist/types/polyfill/RTCDtlsTransport.d.ts +0 -15
  425. package/node_modules/node-datachannel/dist/types/polyfill/RTCError.d.ts +0 -17
  426. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceCandidate.d.ts +0 -21
  427. package/node_modules/node-datachannel/dist/types/polyfill/RTCIceTransport.d.ts +0 -30
  428. package/node_modules/node-datachannel/dist/types/polyfill/RTCPeerConnection.d.ts +0 -64
  429. package/node_modules/node-datachannel/dist/types/polyfill/RTCSctpTransport.d.ts +0 -15
  430. package/node_modules/node-datachannel/dist/types/polyfill/RTCSessionDescription.d.ts +0 -10
  431. package/node_modules/node-datachannel/dist/types/polyfill/index.d.ts +0 -26
  432. package/node_modules/node-datachannel/jest.config.ts +0 -14
  433. package/node_modules/node-datachannel/package.json +0 -133
  434. package/node_modules/node-datachannel/rollup.config.mjs +0 -67
  435. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.cpp +0 -530
  436. package/node_modules/node-datachannel/src/cpp/data-channel-wrapper.h +0 -63
  437. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.cpp +0 -172
  438. package/node_modules/node-datachannel/src/cpp/ice-udp-mux-listener-wrapper.h +0 -43
  439. package/node_modules/node-datachannel/src/cpp/main.cpp +0 -58
  440. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.cpp +0 -457
  441. package/node_modules/node-datachannel/src/cpp/media-audio-wrapper.h +0 -52
  442. package/node_modules/node-datachannel/src/cpp/media-av1packetization.cpp +0 -24
  443. package/node_modules/node-datachannel/src/cpp/media-av1packetization.h +0 -11
  444. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.cpp +0 -126
  445. package/node_modules/node-datachannel/src/cpp/media-av1rtppacketizer-wrapper.h +0 -29
  446. package/node_modules/node-datachannel/src/cpp/media-direction.cpp +0 -43
  447. package/node_modules/node-datachannel/src/cpp/media-direction.h +0 -10
  448. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.cpp +0 -126
  449. package/node_modules/node-datachannel/src/cpp/media-h264rtppacketizer-wrapper.h +0 -30
  450. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.cpp +0 -126
  451. package/node_modules/node-datachannel/src/cpp/media-h265rtppacketizer-wrapper.h +0 -30
  452. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.cpp +0 -32
  453. package/node_modules/node-datachannel/src/cpp/media-h26xseparator.h +0 -11
  454. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.cpp +0 -31
  455. package/node_modules/node-datachannel/src/cpp/media-mediahandler-helper.h +0 -11
  456. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.cpp +0 -79
  457. package/node_modules/node-datachannel/src/cpp/media-pacinghandler-wrapper.h +0 -28
  458. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.cpp +0 -68
  459. package/node_modules/node-datachannel/src/cpp/media-rtcpnackresponder-wrapper.h +0 -28
  460. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.cpp +0 -57
  461. package/node_modules/node-datachannel/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -28
  462. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.cpp +0 -93
  463. package/node_modules/node-datachannel/src/cpp/media-rtcpsrreporter-wrapper.h +0 -30
  464. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.cpp +0 -167
  465. package/node_modules/node-datachannel/src/cpp/media-rtppacketizationconfig-wrapper.h +0 -35
  466. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.cpp +0 -95
  467. package/node_modules/node-datachannel/src/cpp/media-rtppacketizer-wrapper.h +0 -30
  468. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.cpp +0 -458
  469. package/node_modules/node-datachannel/src/cpp/media-track-wrapper.h +0 -61
  470. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.cpp +0 -526
  471. package/node_modules/node-datachannel/src/cpp/media-video-wrapper.h +0 -56
  472. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.cpp +0 -1298
  473. package/node_modules/node-datachannel/src/cpp/peer-connection-wrapper.h +0 -89
  474. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.cpp +0 -205
  475. package/node_modules/node-datachannel/src/cpp/rtc-wrapper.h +0 -24
  476. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.cpp +0 -57
  477. package/node_modules/node-datachannel/src/cpp/thread-safe-callback.h +0 -47
  478. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.cpp +0 -275
  479. package/node_modules/node-datachannel/src/cpp/web-socket-server-wrapper.h +0 -41
  480. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.cpp +0 -796
  481. package/node_modules/node-datachannel/src/cpp/web-socket-wrapper.h +0 -63
  482. package/node_modules/node-datachannel/src/index.ts +0 -9
  483. package/node_modules/node-datachannel/src/lib/datachannel-stream.ts +0 -100
  484. package/node_modules/node-datachannel/src/lib/index.ts +0 -290
  485. package/node_modules/node-datachannel/src/lib/node-datachannel.ts +0 -84
  486. package/node_modules/node-datachannel/src/lib/types.ts +0 -169
  487. package/node_modules/node-datachannel/src/lib/websocket-server.ts +0 -37
  488. package/node_modules/node-datachannel/src/lib/websocket.ts +0 -26
  489. package/node_modules/node-datachannel/src/polyfill/Events.ts +0 -82
  490. package/node_modules/node-datachannel/src/polyfill/Exception.ts +0 -37
  491. package/node_modules/node-datachannel/src/polyfill/README.md +0 -41
  492. package/node_modules/node-datachannel/src/polyfill/RTCCertificate.ts +0 -21
  493. package/node_modules/node-datachannel/src/polyfill/RTCDataChannel.ts +0 -225
  494. package/node_modules/node-datachannel/src/polyfill/RTCDtlsTransport.ts +0 -46
  495. package/node_modules/node-datachannel/src/polyfill/RTCError.ts +0 -78
  496. package/node_modules/node-datachannel/src/polyfill/RTCIceCandidate.ts +0 -128
  497. package/node_modules/node-datachannel/src/polyfill/RTCIceTransport.ts +0 -90
  498. package/node_modules/node-datachannel/src/polyfill/RTCPeerConnection.ts +0 -527
  499. package/node_modules/node-datachannel/src/polyfill/RTCSctpTransport.ts +0 -51
  500. package/node_modules/node-datachannel/src/polyfill/RTCSessionDescription.ts +0 -41
  501. package/node_modules/node-datachannel/src/polyfill/index.ts +0 -38
  502. package/node_modules/node-datachannel/tsconfig.json +0 -21
  503. package/node_modules/p-limit/index.d.ts +0 -38
  504. package/node_modules/p-limit/index.js +0 -57
  505. package/node_modules/p-limit/license +0 -9
  506. package/node_modules/p-limit/package.json +0 -52
  507. package/node_modules/p-limit/readme.md +0 -101
  508. package/node_modules/p-locate/index.d.ts +0 -64
  509. package/node_modules/p-locate/index.js +0 -52
  510. package/node_modules/p-locate/license +0 -9
  511. package/node_modules/p-locate/package.json +0 -53
  512. package/node_modules/p-locate/readme.md +0 -90
  513. package/node_modules/p-try/index.d.ts +0 -39
  514. package/node_modules/p-try/index.js +0 -9
  515. package/node_modules/p-try/license +0 -9
  516. package/node_modules/p-try/package.json +0 -42
  517. package/node_modules/p-try/readme.md +0 -58
  518. package/node_modules/path-exists/index.d.ts +0 -28
  519. package/node_modules/path-exists/index.js +0 -23
  520. package/node_modules/path-exists/license +0 -9
  521. package/node_modules/path-exists/package.json +0 -39
  522. package/node_modules/path-exists/readme.md +0 -52
  523. package/node_modules/pngjs/.eslintignore +0 -2
  524. package/node_modules/pngjs/.eslintrc.json +0 -19
  525. package/node_modules/pngjs/.prettierignore +0 -3
  526. package/node_modules/pngjs/LICENSE +0 -20
  527. package/node_modules/pngjs/README.md +0 -429
  528. package/node_modules/pngjs/browser.js +0 -16096
  529. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  530. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  531. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  532. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  533. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  534. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  535. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  536. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  537. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  538. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  539. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  540. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  541. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  542. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  543. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  544. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  545. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  546. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  547. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  548. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  549. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  550. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  551. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  552. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  553. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  554. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  555. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  556. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  557. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  558. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  559. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  560. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  561. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  562. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  563. package/node_modules/pngjs/lib/constants.js +0 -32
  564. package/node_modules/pngjs/lib/crc.js +0 -40
  565. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  566. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  567. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  568. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  569. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  570. package/node_modules/pngjs/lib/interlace.js +0 -95
  571. package/node_modules/pngjs/lib/packer-async.js +0 -50
  572. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  573. package/node_modules/pngjs/lib/packer.js +0 -129
  574. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  575. package/node_modules/pngjs/lib/parser-async.js +0 -165
  576. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  577. package/node_modules/pngjs/lib/parser.js +0 -290
  578. package/node_modules/pngjs/lib/png-sync.js +0 -12
  579. package/node_modules/pngjs/lib/png.js +0 -194
  580. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  581. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  582. package/node_modules/pngjs/package.json +0 -73
  583. package/node_modules/qrcode/README.md +0 -770
  584. package/node_modules/qrcode/bin/qrcode +0 -159
  585. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  586. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  587. package/node_modules/qrcode/lib/browser.js +0 -76
  588. package/node_modules/qrcode/lib/can-promise.js +0 -7
  589. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  590. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  591. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  592. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  593. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  594. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  595. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  596. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  597. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  598. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  599. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  600. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  601. package/node_modules/qrcode/lib/core/mode.js +0 -167
  602. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  603. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  604. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  605. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  606. package/node_modules/qrcode/lib/core/regex.js +0 -31
  607. package/node_modules/qrcode/lib/core/segments.js +0 -330
  608. package/node_modules/qrcode/lib/core/utils.js +0 -63
  609. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  610. package/node_modules/qrcode/lib/core/version.js +0 -163
  611. package/node_modules/qrcode/lib/index.js +0 -12
  612. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  613. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  614. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  615. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  616. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  617. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  618. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  619. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  620. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  621. package/node_modules/qrcode/lib/server.js +0 -138
  622. package/node_modules/qrcode/license +0 -10
  623. package/node_modules/qrcode/package.json +0 -77
  624. package/node_modules/require-directory/.jshintrc +0 -67
  625. package/node_modules/require-directory/.npmignore +0 -1
  626. package/node_modules/require-directory/.travis.yml +0 -3
  627. package/node_modules/require-directory/LICENSE +0 -22
  628. package/node_modules/require-directory/README.markdown +0 -184
  629. package/node_modules/require-directory/index.js +0 -86
  630. package/node_modules/require-directory/package.json +0 -40
  631. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  632. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  633. package/node_modules/require-main-filename/README.md +0 -26
  634. package/node_modules/require-main-filename/index.js +0 -18
  635. package/node_modules/require-main-filename/package.json +0 -35
  636. package/node_modules/semver/LICENSE +0 -15
  637. package/node_modules/semver/README.md +0 -680
  638. package/node_modules/semver/bin/semver.js +0 -195
  639. package/node_modules/semver/classes/comparator.js +0 -143
  640. package/node_modules/semver/classes/index.js +0 -7
  641. package/node_modules/semver/classes/range.js +0 -577
  642. package/node_modules/semver/classes/semver.js +0 -350
  643. package/node_modules/semver/functions/clean.js +0 -8
  644. package/node_modules/semver/functions/cmp.js +0 -54
  645. package/node_modules/semver/functions/coerce.js +0 -62
  646. package/node_modules/semver/functions/compare-build.js +0 -9
  647. package/node_modules/semver/functions/compare-loose.js +0 -5
  648. package/node_modules/semver/functions/compare.js +0 -7
  649. package/node_modules/semver/functions/diff.js +0 -60
  650. package/node_modules/semver/functions/eq.js +0 -5
  651. package/node_modules/semver/functions/gt.js +0 -5
  652. package/node_modules/semver/functions/gte.js +0 -5
  653. package/node_modules/semver/functions/inc.js +0 -21
  654. package/node_modules/semver/functions/lt.js +0 -5
  655. package/node_modules/semver/functions/lte.js +0 -5
  656. package/node_modules/semver/functions/major.js +0 -5
  657. package/node_modules/semver/functions/minor.js +0 -5
  658. package/node_modules/semver/functions/neq.js +0 -5
  659. package/node_modules/semver/functions/parse.js +0 -18
  660. package/node_modules/semver/functions/patch.js +0 -5
  661. package/node_modules/semver/functions/prerelease.js +0 -8
  662. package/node_modules/semver/functions/rcompare.js +0 -5
  663. package/node_modules/semver/functions/rsort.js +0 -5
  664. package/node_modules/semver/functions/satisfies.js +0 -12
  665. package/node_modules/semver/functions/sort.js +0 -5
  666. package/node_modules/semver/functions/truncate.js +0 -48
  667. package/node_modules/semver/functions/valid.js +0 -8
  668. package/node_modules/semver/index.js +0 -93
  669. package/node_modules/semver/internal/constants.js +0 -37
  670. package/node_modules/semver/internal/debug.js +0 -11
  671. package/node_modules/semver/internal/identifiers.js +0 -29
  672. package/node_modules/semver/internal/lrucache.js +0 -42
  673. package/node_modules/semver/internal/parse-options.js +0 -17
  674. package/node_modules/semver/internal/re.js +0 -223
  675. package/node_modules/semver/package.json +0 -78
  676. package/node_modules/semver/preload.js +0 -4
  677. package/node_modules/semver/range.bnf +0 -17
  678. package/node_modules/semver/ranges/gtr.js +0 -6
  679. package/node_modules/semver/ranges/intersects.js +0 -9
  680. package/node_modules/semver/ranges/ltr.js +0 -6
  681. package/node_modules/semver/ranges/max-satisfying.js +0 -27
  682. package/node_modules/semver/ranges/min-satisfying.js +0 -26
  683. package/node_modules/semver/ranges/min-version.js +0 -63
  684. package/node_modules/semver/ranges/outside.js +0 -82
  685. package/node_modules/semver/ranges/simplify.js +0 -49
  686. package/node_modules/semver/ranges/subset.js +0 -249
  687. package/node_modules/semver/ranges/to-comparators.js +0 -10
  688. package/node_modules/semver/ranges/valid.js +0 -13
  689. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  690. package/node_modules/set-blocking/LICENSE.txt +0 -14
  691. package/node_modules/set-blocking/README.md +0 -31
  692. package/node_modules/set-blocking/index.js +0 -7
  693. package/node_modules/set-blocking/package.json +0 -42
  694. package/node_modules/sharp/LICENSE +0 -191
  695. package/node_modules/sharp/README.md +0 -112
  696. package/node_modules/sharp/dist/channel.cjs +0 -177
  697. package/node_modules/sharp/dist/channel.mjs +0 -177
  698. package/node_modules/sharp/dist/colour.cjs +0 -199
  699. package/node_modules/sharp/dist/colour.mjs +0 -199
  700. package/node_modules/sharp/dist/composite.cjs +0 -213
  701. package/node_modules/sharp/dist/composite.mjs +0 -213
  702. package/node_modules/sharp/dist/constructor.cjs +0 -511
  703. package/node_modules/sharp/dist/constructor.mjs +0 -511
  704. package/node_modules/sharp/dist/index.cjs +0 -25
  705. package/node_modules/sharp/dist/index.d.cts +0 -1999
  706. package/node_modules/sharp/dist/index.d.mts +0 -2046
  707. package/node_modules/sharp/dist/index.mjs +0 -25
  708. package/node_modules/sharp/dist/input.cjs +0 -819
  709. package/node_modules/sharp/dist/input.mjs +0 -819
  710. package/node_modules/sharp/dist/is.cjs +0 -143
  711. package/node_modules/sharp/dist/is.mjs +0 -143
  712. package/node_modules/sharp/dist/libvips.cjs +0 -212
  713. package/node_modules/sharp/dist/libvips.mjs +0 -212
  714. package/node_modules/sharp/dist/operation.cjs +0 -1002
  715. package/node_modules/sharp/dist/operation.mjs +0 -1002
  716. package/node_modules/sharp/dist/output.cjs +0 -1785
  717. package/node_modules/sharp/dist/output.mjs +0 -1785
  718. package/node_modules/sharp/dist/resize.cjs +0 -617
  719. package/node_modules/sharp/dist/resize.mjs +0 -617
  720. package/node_modules/sharp/dist/sharp.cjs +0 -174
  721. package/node_modules/sharp/dist/sharp.mjs +0 -174
  722. package/node_modules/sharp/dist/utility.cjs +0 -301
  723. package/node_modules/sharp/dist/utility.mjs +0 -301
  724. package/node_modules/sharp/install/build.js +0 -38
  725. package/node_modules/sharp/lib/index.d.ts +0 -1999
  726. package/node_modules/sharp/package.json +0 -227
  727. package/node_modules/sharp/src/binding.gyp +0 -303
  728. package/node_modules/sharp/src/common.cc +0 -1186
  729. package/node_modules/sharp/src/common.h +0 -421
  730. package/node_modules/sharp/src/metadata.cc +0 -404
  731. package/node_modules/sharp/src/metadata.h +0 -95
  732. package/node_modules/sharp/src/operations.cc +0 -516
  733. package/node_modules/sharp/src/operations.h +0 -137
  734. package/node_modules/sharp/src/pipeline.cc +0 -1948
  735. package/node_modules/sharp/src/pipeline.h +0 -422
  736. package/node_modules/sharp/src/sharp.cc +0 -43
  737. package/node_modules/sharp/src/stats.cc +0 -186
  738. package/node_modules/sharp/src/stats.h +0 -62
  739. package/node_modules/sharp/src/utilities.cc +0 -289
  740. package/node_modules/sharp/src/utilities.h +0 -22
  741. package/node_modules/string-width/index.d.ts +0 -29
  742. package/node_modules/string-width/index.js +0 -47
  743. package/node_modules/string-width/license +0 -9
  744. package/node_modules/string-width/package.json +0 -56
  745. package/node_modules/string-width/readme.md +0 -50
  746. package/node_modules/strip-ansi/index.d.ts +0 -17
  747. package/node_modules/strip-ansi/index.js +0 -4
  748. package/node_modules/strip-ansi/license +0 -9
  749. package/node_modules/strip-ansi/package.json +0 -54
  750. package/node_modules/strip-ansi/readme.md +0 -46
  751. package/node_modules/which-module/LICENSE +0 -13
  752. package/node_modules/which-module/README.md +0 -58
  753. package/node_modules/which-module/index.js +0 -9
  754. package/node_modules/which-module/package.json +0 -41
  755. package/node_modules/wrap-ansi/index.js +0 -186
  756. package/node_modules/wrap-ansi/license +0 -9
  757. package/node_modules/wrap-ansi/package.json +0 -61
  758. package/node_modules/wrap-ansi/readme.md +0 -97
  759. package/node_modules/ws/LICENSE +0 -20
  760. package/node_modules/ws/README.md +0 -548
  761. package/node_modules/ws/browser.js +0 -8
  762. package/node_modules/ws/index.js +0 -22
  763. package/node_modules/ws/lib/buffer-util.js +0 -131
  764. package/node_modules/ws/lib/constants.js +0 -19
  765. package/node_modules/ws/lib/event-target.js +0 -292
  766. package/node_modules/ws/lib/extension.js +0 -203
  767. package/node_modules/ws/lib/limiter.js +0 -55
  768. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  769. package/node_modules/ws/lib/receiver.js +0 -743
  770. package/node_modules/ws/lib/sender.js +0 -607
  771. package/node_modules/ws/lib/stream.js +0 -161
  772. package/node_modules/ws/lib/subprotocol.js +0 -62
  773. package/node_modules/ws/lib/validation.js +0 -152
  774. package/node_modules/ws/lib/websocket-server.js +0 -562
  775. package/node_modules/ws/lib/websocket.js +0 -1407
  776. package/node_modules/ws/package.json +0 -74
  777. package/node_modules/ws/wrapper.mjs +0 -21
  778. package/node_modules/y18n/CHANGELOG.md +0 -35
  779. package/node_modules/y18n/LICENSE +0 -13
  780. package/node_modules/y18n/README.md +0 -109
  781. package/node_modules/y18n/index.js +0 -188
  782. package/node_modules/y18n/package.json +0 -39
  783. package/node_modules/yargs/CHANGELOG.md +0 -420
  784. package/node_modules/yargs/LICENSE +0 -21
  785. package/node_modules/yargs/README.md +0 -140
  786. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  787. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  788. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  789. package/node_modules/yargs/build/lib/argsert.js +0 -65
  790. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  791. package/node_modules/yargs/build/lib/command.js +0 -416
  792. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  793. package/node_modules/yargs/build/lib/common-types.js +0 -25
  794. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  795. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  796. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  797. package/node_modules/yargs/build/lib/completion.js +0 -135
  798. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  799. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  800. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  801. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  802. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  803. package/node_modules/yargs/build/lib/middleware.js +0 -57
  804. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  805. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  806. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  807. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  808. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  809. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  810. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  811. package/node_modules/yargs/build/lib/usage.js +0 -540
  812. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  813. package/node_modules/yargs/build/lib/validation.js +0 -330
  814. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  815. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  816. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  817. package/node_modules/yargs/build/lib/yerror.js +0 -11
  818. package/node_modules/yargs/index.js +0 -40
  819. package/node_modules/yargs/locales/be.json +0 -46
  820. package/node_modules/yargs/locales/de.json +0 -46
  821. package/node_modules/yargs/locales/en.json +0 -51
  822. package/node_modules/yargs/locales/es.json +0 -46
  823. package/node_modules/yargs/locales/fi.json +0 -49
  824. package/node_modules/yargs/locales/fr.json +0 -53
  825. package/node_modules/yargs/locales/hi.json +0 -49
  826. package/node_modules/yargs/locales/hu.json +0 -46
  827. package/node_modules/yargs/locales/id.json +0 -50
  828. package/node_modules/yargs/locales/it.json +0 -46
  829. package/node_modules/yargs/locales/ja.json +0 -51
  830. package/node_modules/yargs/locales/ko.json +0 -49
  831. package/node_modules/yargs/locales/nb.json +0 -44
  832. package/node_modules/yargs/locales/nl.json +0 -49
  833. package/node_modules/yargs/locales/nn.json +0 -44
  834. package/node_modules/yargs/locales/pirate.json +0 -13
  835. package/node_modules/yargs/locales/pl.json +0 -49
  836. package/node_modules/yargs/locales/pt.json +0 -45
  837. package/node_modules/yargs/locales/pt_BR.json +0 -48
  838. package/node_modules/yargs/locales/ru.json +0 -46
  839. package/node_modules/yargs/locales/th.json +0 -46
  840. package/node_modules/yargs/locales/tr.json +0 -48
  841. package/node_modules/yargs/locales/zh_CN.json +0 -48
  842. package/node_modules/yargs/locales/zh_TW.json +0 -47
  843. package/node_modules/yargs/package.json +0 -92
  844. package/node_modules/yargs/yargs.js +0 -14
  845. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  846. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  847. package/node_modules/yargs-parser/README.md +0 -449
  848. package/node_modules/yargs-parser/index.js +0 -1032
  849. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  850. package/node_modules/yargs-parser/package.json +0 -46
@@ -1,6 +1,7 @@
1
1
  $ErrorActionPreference = 'Stop'
2
2
  [Console]::InputEncoding = New-Object System.Text.UTF8Encoding($false)
3
3
  [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)
4
+ $brokerStarted = $false
4
5
  try {
5
6
  $spec = [Console]::In.ReadToEnd() | ConvertFrom-Json
6
7
  # WMI owns this launch, not the caller's kill-on-close Desktop job hierarchy.
@@ -13,10 +14,15 @@ try {
13
14
  $request = Join-Path $launchRoot ($instance + '.request.json')
14
15
  $diagnostic = Join-Path $launchRoot ($instance + '.broker.log')
15
16
  $spec | Add-Member -NotePropertyName instance -NotePropertyValue $instance
16
- $spec | Add-Member -NotePropertyName diagnostic -NotePropertyValue $diagnostic
17
17
  $requestTemporary = $request + '.tmp'
18
18
  [IO.File]::WriteAllText($requestTemporary, ($spec | ConvertTo-Json -Compress -Depth 10), (New-Object Text.UTF8Encoding($false)))
19
19
  [IO.File]::Move($requestTemporary, $request)
20
+ # MSIX can redirect a newly written file even when its existing parent
21
+ # resolves outside the package. Resolve the file handle, not just the folder.
22
+ $request = [IsolatedProcess]::ResolvePath($request)
23
+ $launchRoot = [IO.Path]::GetDirectoryName($request)
24
+ $ready = Join-Path $launchRoot ($instance + '.json')
25
+ $diagnostic = Join-Path $launchRoot ($instance + '.broker.log')
20
26
  $startup = New-CimInstance -ClassName Win32_ProcessStartup -ClientOnly -Property @{
21
27
  ShowWindow=[uint16]0; CreateFlags=[uint32]0x1000010
22
28
  }
@@ -26,6 +32,7 @@ try {
26
32
  CommandLine=$command; CurrentDirectory=$env:USERPROFILE; ProcessStartupInformation=$startup
27
33
  }
28
34
  if ($broker.ReturnValue -ne 0) { throw ('Windows process broker failed: ' + $broker.ReturnValue) }
35
+ $brokerStarted = $true
29
36
  $deadline = [DateTime]::UtcNow.AddSeconds(30)
30
37
  while (-not (Test-Path -LiteralPath $ready)) {
31
38
  if ([DateTime]::UtcNow -gt $deadline) {
@@ -44,6 +51,8 @@ try {
44
51
  [Console]::Error.WriteLine($_.Exception.Message)
45
52
  exit 1
46
53
  } finally {
47
- if ($request -and (Test-Path -LiteralPath $request)) { Remove-Item -LiteralPath $request -Force }
54
+ # Once launched, the worker owns consumption. A slow broker must not lose
55
+ # its request merely because this caller timed out; never launch a retry.
56
+ if (-not $brokerStarted -and $request -and (Test-Path -LiteralPath $request)) { Remove-Item -LiteralPath $request -Force }
48
57
  if ($requestTemporary -and (Test-Path -LiteralPath $requestTemporary)) { Remove-Item -LiteralPath $requestTemporary -Force }
49
58
  }
@@ -1,50 +1,52 @@
1
- import path from 'node:path';
2
- import fs from 'node:fs';
3
- import { readRecord, writeRecord } from '../../service-lifecycle.mjs';
4
- import { runScript } from './desktop-host.mjs';
5
- import { managedAppServerUrl } from '../../managed-app-server.mjs';
6
-
7
- const ownershipFile = 'managed-environment.json';
8
-
9
- export async function readManagedEnvironment() {
10
- return JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Read']));
11
- }
12
-
13
- export async function configureManagedEnvironment(stateRoot) {
14
- const current = await readManagedEnvironment();
15
- const ownershipPath = path.join(stateRoot, ownershipFile);
16
- const ownership = readRecord(ownershipPath);
17
- if (current.forceCliUser === '1' || current.forceCliMachine === '1') {
18
- throw new Error('CODEX_APP_SERVER_FORCE_CLI=1 会让 Codex 忽略受管 app-server;未修改该配置。');
19
- }
20
- if (current.userValue && current.userValue !== managedAppServerUrl) {
21
- throw new Error(`用户已有 CODEX_APP_SERVER_WS_URL=${current.userValue};未覆盖该配置。`);
22
- }
23
- if (current.userValue === managedAppServerUrl) {
24
- const owned = ownership?.value === managedAppServerUrl;
25
- return { configured: true, value: current.userValue, changed: false, owned };
26
- }
27
- const applied = JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Set', '-Value', managedAppServerUrl]));
28
- writeRecord(ownershipPath, { name: 'CODEX_APP_SERVER_WS_URL', value: managedAppServerUrl,
29
- configuredAt: new Date().toISOString() });
30
- return { configured: true, value: applied.userValue, changed: true, owned: true };
31
- }
32
-
33
- export async function clearManagedEnvironment(stateRoot) {
34
- const ownershipPath = path.join(stateRoot, ownershipFile);
35
- const ownership = readRecord(ownershipPath);
36
- const current = await readManagedEnvironment();
37
- if (!current.userValue) {
38
- fs.rmSync(ownershipPath, { force: true });
39
- return { removed: false, preserved: false, reason: 'already-empty' };
40
- }
41
- if (ownership?.value !== managedAppServerUrl || current.userValue !== managedAppServerUrl) {
42
- fs.rmSync(ownershipPath, { force: true });
43
- return { removed: false, preserved: true, value: current.userValue,
44
- reason: ownership?.value === managedAppServerUrl ? 'user-modified' : 'not-owned' };
45
- }
46
- const result = JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Clear']));
47
- if (result.userValue) throw new Error('CODEX_APP_SERVER_WS_URL 清理后读回仍不为空。');
48
- fs.rmSync(ownershipPath, { force: true });
49
- return { removed: true, preserved: false, reason: 'removed' };
50
- }
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { readRecord, writeRecord } from '../../service-lifecycle.mjs';
4
+ import { runScript } from './desktop-host.mjs';
5
+ import { managedEndpointUrl } from '../../managed-endpoint.mjs';
6
+
7
+ const ownershipFile = 'managed-environment.json';
8
+
9
+ export async function readManagedEnvironment() {
10
+ return JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Read']));
11
+ }
12
+
13
+ export async function configureManagedEnvironment(stateRoot, url) {
14
+ const current = await readManagedEnvironment();
15
+ if (!managedEndpointUrl(url)) throw new Error('未确认 Codex 内核地址,未修改环境变量。');
16
+ const ownershipPath = path.join(stateRoot, ownershipFile);
17
+ const ownership = readRecord(ownershipPath);
18
+ if (current.forceCliUser === '1' || current.forceCliMachine === '1') {
19
+ throw new Error('CODEX_APP_SERVER_FORCE_CLI=1 会让 Codex 忽略当前内核地址;未修改该配置。');
20
+ }
21
+ if (current.userValue && current.userValue !== url && current.userValue !== ownership?.value) {
22
+ throw new Error(`用户已有 CODEX_APP_SERVER_WS_URL=${current.userValue};未覆盖该配置。`);
23
+ }
24
+ if (current.userValue === url) {
25
+ const owned = ownership?.value === url;
26
+ return { configured: true, value: current.userValue, changed: false, owned };
27
+ }
28
+ const applied = JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Set', '-Value', url]));
29
+ if (applied.userValue !== url) throw new Error('CODEX_APP_SERVER_WS_URL 写入后读回不一致。');
30
+ writeRecord(ownershipPath, { name: 'CODEX_APP_SERVER_WS_URL', value: url,
31
+ configuredAt: new Date().toISOString() });
32
+ return { configured: true, value: applied.userValue, changed: true, owned: true };
33
+ }
34
+
35
+ export async function clearManagedEnvironment(stateRoot) {
36
+ const ownershipPath = path.join(stateRoot, ownershipFile);
37
+ const ownership = readRecord(ownershipPath);
38
+ const current = await readManagedEnvironment();
39
+ if (!current.userValue) {
40
+ fs.rmSync(ownershipPath, { force: true });
41
+ return { removed: false, preserved: false, reason: 'already-empty' };
42
+ }
43
+ if (!managedEndpointUrl(ownership?.value) || current.userValue !== ownership.value) {
44
+ fs.rmSync(ownershipPath, { force: true });
45
+ return { removed: false, preserved: true, value: current.userValue,
46
+ reason: managedEndpointUrl(ownership?.value) ? 'user-modified' : 'not-owned' };
47
+ }
48
+ const result = JSON.parse(await runScript('user-environment.ps1', ['-Action', 'Clear']));
49
+ if (result.userValue) throw new Error('CODEX_APP_SERVER_WS_URL 清理后读回仍不为空。');
50
+ fs.rmSync(ownershipPath, { force: true });
51
+ return { removed: true, preserved: false, reason: 'removed' };
52
+ }
@@ -0,0 +1,121 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { readRecord, writeRecord } from './service-lifecycle.mjs';
5
+ import { projectRoots, projectSummary } from './project-management.mjs';
6
+ import { projectLocations } from './platform/project-locations.mjs';
7
+ import { withDesktopProjectRegistration } from './platform/desktop-project-registration.mjs';
8
+
9
+ const pending = new Map();
10
+ const uuid = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i;
11
+ const fail = message => { throw Object.assign(new Error(message), { statusCode: 400 }); };
12
+ const pathKey = value => process.platform === 'win32' ? path.normalize(value).toLowerCase() : path.normalize(value);
13
+
14
+ function defaultName(name) {
15
+ let value = path.basename(name).trim().replace(/[<>:"/\\|?*\x00-\x1f]/g, '_').replace(/[ .]+$/g, '') || 'New project';
16
+ if (/^(?:con|prn|aux|nul|com[1-9¹²³]|lpt[1-9¹²³])(?:\.|$)/i.test(value)) value = `_${value}`;
17
+ return value;
18
+ }
19
+
20
+ export async function createWorkstationProject(server, stateRoot, codexDataRoot, body, dependencies = {}) {
21
+ if (!uuid.test(body.idempotencyKey || '')) fail('项目创建标识无效。');
22
+ const name = typeof body.name === 'string' ? body.name.trim() : '';
23
+ if (!name) fail('请输入项目名称。');
24
+ if (!Array.isArray(body.roots) || body.roots.some(root => typeof root?.path !== 'string' || !path.isAbsolute(root.path.trim()))) {
25
+ fail('项目文件夹路径无效。');
26
+ }
27
+ const roots = body.roots.map(root => ({ path: path.normalize(root.path.trim()) }));
28
+ const signature = createHash('sha256').update(JSON.stringify({ name, roots })).digest('hex');
29
+ const directory = path.join(stateRoot, 'project-create-operations');
30
+ const record = path.join(directory, `${body.idempotencyKey}.json`);
31
+ const running = pending.get(record);
32
+ if (running) {
33
+ if (running.signature !== signature) fail('同一个创建请求不能修改项目名称或目录。');
34
+ return running.promise;
35
+ }
36
+ const promise = perform().finally(() => pending.delete(record));
37
+ pending.set(record, { signature, promise });
38
+ return promise;
39
+
40
+ async function perform() {
41
+ await fs.mkdir(directory, { recursive: true });
42
+ let operation = readRecord(record);
43
+ if (operation && operation.signature !== signature) fail('项目创建标识已用于其他内容,请重新打开项目编辑器。');
44
+ if (operation?.result) return operation.result;
45
+ operation ||= { signature, name, roots };
46
+ const save = () => writeRecord(record, operation);
47
+ const rpc = (method, params) => server.request(method, params);
48
+ const register = dependencies.registration || withDesktopProjectRegistration;
49
+ try {
50
+ return await register({ stateRoot, codexDataRoot, operationId: body.idempotencyKey,
51
+ confirmed: body.confirmDesktopRestart === true, serverUrl: server.url }, async desktop => {
52
+ // The restart confirmation and state checks happen before any
53
+ // directory or project write. Existing folders are never moved or copied.
54
+ let validatedRoots;
55
+ if (!operation.resolvedRoots) {
56
+ validatedRoots = await projectRoots(rpc, roots);
57
+ operation.resolvedRoots = validatedRoots;
58
+ if (!operation.resolvedRoots.length) {
59
+ const locations = await (dependencies.locations || projectLocations)();
60
+ await rpc('fs/createDirectory', { path: locations.defaultParent, recursive: true });
61
+ const entries = (await rpc('fs/readDirectory', { path: locations.defaultParent })).entries;
62
+ const names = new Set(entries.map(entry => entry.fileName.toLowerCase()));
63
+ const base = defaultName(name);
64
+ let folder = base;
65
+ for (let suffix = 2; names.has(folder.toLowerCase()); suffix++) folder = `${base} ${suffix}`;
66
+ operation.defaultDirectory = path.join(locations.defaultParent, folder);
67
+ operation.resolvedRoots = [{ path: operation.defaultDirectory }];
68
+ }
69
+ save();
70
+ }
71
+ if (operation.defaultDirectory && !operation.directoryCreated) {
72
+ if (operation.directoryAttempted) {
73
+ // On an explicit retry, keep the originally allocated directory. Never
74
+ // allocate another name after an interrupted createDirectory response.
75
+ await projectRoots(rpc, operation.resolvedRoots);
76
+ } else {
77
+ operation.directoryAttempted = true; save();
78
+ await rpc('fs/createDirectory', { path: operation.defaultDirectory, recursive: false });
79
+ }
80
+ operation.directoryCreated = true; save();
81
+ try {
82
+ const result = await rpc('command/exec', { command: ['git', 'init'], cwd: operation.defaultDirectory, timeoutMs: 10000 });
83
+ if (result.exitCode !== 0) throw new Error(result.stderr || result.stdout || `退出码 ${result.exitCode}`);
84
+ } catch (error) { operation.gitWarning = `项目目录已创建,Git 初始化未完成:${error.message}`; save(); }
85
+ }
86
+ const resolvedRoots = validatedRoots?.length ? validatedRoots : await projectRoots(rpc, operation.resolvedRoots);
87
+ if (!operation.projectId) {
88
+ operation.createAttempted = true; save();
89
+ // Native project/create owns idempotency; a retry uses this exact key
90
+ // and original roots on the same server, never a second transport.
91
+ const created = await rpc('project/create', { name, roots: resolvedRoots, idempotencyKey: body.idempotencyKey });
92
+ operation.projectId = created.project.id; save();
93
+ }
94
+ const { project } = await rpc('project/read', { projectId: operation.projectId });
95
+ if (project.id !== operation.projectId || project.name !== name || project.roots.length !== resolvedRoots.length
96
+ || project.roots.some((root, index) => pathKey(root.path) !== pathKey(resolvedRoots[index].path))) {
97
+ throw new Error('已创建项目的名称或目录发生变化,未覆盖其内容。');
98
+ }
99
+ if (!operation.ordered) {
100
+ const first = (await rpc('project/list', { limit: 1, sortKey: 'position', sortDirection: 'asc' })).data[0];
101
+ if (first && first.id !== project.id) await rpc('project/move', { projectId: project.id, beforeProjectId: first.id });
102
+ operation.ordered = true; save();
103
+ }
104
+ const desktopRegistration = await desktop.register(project, operation, save);
105
+ operation.result = { project: projectSummary(project), desktopRegistration,
106
+ ...(operation.gitWarning ? { warning: operation.gitWarning } : {}) };
107
+ save();
108
+ return operation.result;
109
+ });
110
+ } catch (error) {
111
+ if (operation.projectId || operation.createAttempted || operation.directoryAttempted) {
112
+ error.details = { ...error.details, projectCreationPending: true,
113
+ ...(operation.projectId ? { createdProjectId: operation.projectId } : {}) };
114
+ error.message += operation.projectId
115
+ ? ' 项目已创建,请继续完成桌面登记;会沿用同一项目,不会重复创建。'
116
+ : ' 请继续核对本次创建;会沿用原请求标识和目录。';
117
+ } else error.details = { ...error.details, projectCreationPending: false };
118
+ throw error;
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+
3
+ const fail = (message, statusCode = 400) => { throw Object.assign(new Error(message), { statusCode }); };
4
+ const pathKey = value => process.platform === 'win32' ? value.toLowerCase() : value;
5
+
6
+ function absoluteDirectory(value) {
7
+ if (typeof value !== 'string' || !value.trim() || !path.isAbsolute(value.trim())) fail('请输入电脑上的绝对文件夹路径。');
8
+ return path.normalize(value.trim());
9
+ }
10
+
11
+ async function directory(rpc, value) {
12
+ const target = absoluteDirectory(value);
13
+ const stat = await rpc('fs/getMetadata', { path: target });
14
+ if (!stat.isDirectory) fail(`此路径不是文件夹:${target}`);
15
+ return target;
16
+ }
17
+
18
+ function folderName(value) {
19
+ if (typeof value !== 'string' || !value.trim() || /[<>:"/\\|?*\x00-\x1f]/.test(value) || /[ .]$/.test(value)
20
+ || /^(?:con|prn|aux|nul|com[1-9¹²³]|lpt[1-9¹²³])(?:\.|$)/i.test(value) || ['.', '..'].includes(value)) {
21
+ fail('文件夹名称无效,请勿使用路径分隔符或系统保留名称。');
22
+ }
23
+ return value;
24
+ }
25
+
26
+ export async function projectRoots(rpc, roots) {
27
+ if (!Array.isArray(roots)) fail('项目文件夹列表无效。');
28
+ const result = [], seen = new Set();
29
+ for (const root of roots) {
30
+ const target = await directory(rpc, root?.path);
31
+ const key = pathKey(target);
32
+ if (seen.has(key)) fail(`重复的项目文件夹:${target}`);
33
+ seen.add(key); result.push({ path: target });
34
+ }
35
+ return result;
36
+ }
37
+
38
+ export function projectSummary(project) {
39
+ return { projectId: project.id, name: project.name, label: project.name, roots: project.roots,
40
+ path: project.roots[0]?.path || '', cwd: project.roots[0]?.path || '', hostId: 'local' };
41
+ }
42
+
43
+ export async function browseProjectFolders(rpc, locations, value) {
44
+ const target = absoluteDirectory(value || locations?.home);
45
+ const entries = (await rpc('fs/readDirectory', { path: target })).entries
46
+ .filter(entry => entry.isDirectory).map(entry => ({ name: entry.fileName, path: path.join(target, entry.fileName) }))
47
+ .sort((a, b) => a.name.localeCompare(b.name, 'zh-CN', { numeric: true }));
48
+ return { path: target, parent: path.dirname(target) === target ? null : path.dirname(target), entries, ...(locations || {}) };
49
+ }
50
+
51
+ export async function createProjectFolder(rpc, body) {
52
+ const parent = await directory(rpc, body.parent);
53
+ const name = folderName(body.name);
54
+ const entries = (await rpc('fs/readDirectory', { path: parent })).entries;
55
+ if (entries.some(entry => pathKey(entry.fileName) === pathKey(name))) fail('同名文件夹已存在,请选择它或使用其他名称。', 409);
56
+ const target = path.join(parent, name);
57
+ await rpc('fs/createDirectory', { path: target, recursive: false });
58
+ return { path: target };
59
+ }
@@ -0,0 +1,55 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { readRecord, writeRecord } from './service-lifecycle.mjs';
4
+ import { withDesktopProjectRegistration } from './platform/desktop-project-registration.mjs';
5
+
6
+ const pending = new Map();
7
+ const uuid = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i;
8
+
9
+ export async function removeWorkstationProject(server, stateRoot, codexDataRoot, projectId, body, dependencies = {}) {
10
+ if (!projectId || !uuid.test(body.idempotencyKey || '')) throw Object.assign(new Error('项目移除标识无效。'), { statusCode: 400 });
11
+ const record = path.join(stateRoot, 'project-remove-operations', `${body.idempotencyKey}.json`);
12
+ const running = pending.get(record);
13
+ if (running) {
14
+ if (running.projectId !== projectId) throw Object.assign(new Error('同一请求不能移除其他项目。'), { statusCode: 409 });
15
+ return running.promise;
16
+ }
17
+ const promise = perform().finally(() => pending.delete(record));
18
+ pending.set(record, { projectId, promise });
19
+ return promise;
20
+
21
+ async function perform() {
22
+ await fs.mkdir(path.dirname(record), { recursive: true });
23
+ const operation = readRecord(record) || { projectId };
24
+ if (operation.projectId !== projectId) throw Object.assign(new Error('移除标识已用于其他项目。'), { statusCode: 409 });
25
+ if (operation.result) return operation.result;
26
+ const save = () => writeRecord(record, operation);
27
+ const registration = dependencies.registration || withDesktopProjectRegistration;
28
+ return registration({ stateRoot, codexDataRoot, operationId: body.idempotencyKey, operation: 'remove',
29
+ confirmed: body.confirmDesktopRestart === true, serverUrl: server.url }, async desktop => {
30
+ if (!operation.project) {
31
+ operation.project = (await server.request('project/read', { projectId })).project;
32
+ if (operation.project.id !== projectId) throw new Error('项目身份不一致,未执行移除。');
33
+ save();
34
+ }
35
+ const removeNative = async () => {
36
+ if (operation.nativeDeleted) return;
37
+ if (operation.deleteAttempted) {
38
+ // An explicit retry first resolves an earlier unknown response.
39
+ try { await server.request('project/read', { projectId }); }
40
+ catch (error) {
41
+ if (error.message !== `project not found: ${projectId}`) throw error;
42
+ operation.nativeDeleted = true; save(); return;
43
+ }
44
+ }
45
+ operation.deleteAttempted = true; save();
46
+ await server.request('project/delete', { projectId });
47
+ operation.nativeDeleted = true; save();
48
+ };
49
+ const desktopRemoval = await desktop.remove(operation.project, operation, save, removeNative);
50
+ operation.result = { projectId, desktopRemoval };
51
+ save();
52
+ return operation.result;
53
+ });
54
+ }
55
+ }
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { readRecord, writeRecord } from './service-lifecycle.mjs';
5
+ import { projectRoots, projectSummary } from './project-management.mjs';
6
+ import { withDesktopProjectRegistration } from './platform/desktop-project-registration.mjs';
7
+
8
+ const pending = new Map();
9
+ const fail = message => { throw Object.assign(new Error(message), { statusCode: 409 }); };
10
+ const rootKey = roots => JSON.stringify(roots.map(root => process.platform === 'win32' ? path.normalize(root.path).toLowerCase() : path.normalize(root.path)));
11
+ const same = (a, b) => a.name === b.name && rootKey(a.roots) === rootKey(b.roots);
12
+
13
+ export async function updateWorkstationProject(server, stateRoot, codexDataRoot, projectId, body, dependencies = {}) {
14
+ const name = typeof body.name === 'string' ? body.name.trim() : '';
15
+ if (!name || !Array.isArray(body.roots) || body.roots.some(root => typeof root?.path !== 'string' || !path.isAbsolute(root.path.trim()))
16
+ || !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(body.idempotencyKey || '')) fail('项目名称、文件夹或操作标识无效。');
17
+ const target = { name, roots: body.roots.map(root => ({ path: path.normalize(root.path.trim()) })) };
18
+ const signature = createHash('sha256').update(JSON.stringify({ projectId, ...target })).digest('hex');
19
+ const record = path.join(stateRoot, 'project-update-operations', `${body.idempotencyKey}.json`);
20
+ const active = pending.get(record);
21
+ if (active) { if (active.signature !== signature) fail('同一请求不能修改其他项目内容。'); return active.promise; }
22
+ const promise = perform().finally(() => pending.delete(record));
23
+ pending.set(record, { signature, promise }); return promise;
24
+
25
+ async function perform() {
26
+ await fs.mkdir(path.dirname(record), { recursive: true });
27
+ const operation = readRecord(record) || { signature };
28
+ if (operation.signature !== signature) fail('项目编辑标识已用于其他内容。');
29
+ if (operation.result) return operation.result;
30
+ const save = () => writeRecord(record, operation);
31
+ const rpc = (method, params) => server.request(method, params);
32
+ try {
33
+ return await (dependencies.registration || withDesktopProjectRegistration)({ stateRoot, codexDataRoot,
34
+ operationId: body.idempotencyKey, operation: 'update', confirmed: body.confirmDesktopRestart === true, serverUrl: server.url }, async desktop => {
35
+ const current = (await rpc('project/read', { projectId })).project;
36
+ if (current.id !== projectId) fail('项目身份不一致。');
37
+ if (current.roots.length && rootKey(current.roots.slice(0, 1)) !== rootKey(target.roots.slice(0, 1))) {
38
+ fail('编辑项目不能修改或移除主目录。');
39
+ }
40
+ operation.previousProject ||= current;
41
+ if (!same(current, operation.previousProject) && !same(current, target)) fail('项目已被其他操作修改,请刷新后重新编辑。');
42
+ let project = current;
43
+ if (!same(current, target)) {
44
+ const rootsChanged = rootKey(current.roots) !== rootKey(target.roots);
45
+ const roots = rootsChanged ? await projectRoots(rpc, target.roots) : current.roots;
46
+ operation.updateAttempted = true; save();
47
+ project = (await rpc('project/update', { projectId, name, roots })).project;
48
+ }
49
+ save();
50
+ const desktopRegistration = await desktop.register(project, operation, save);
51
+ operation.result = { project: projectSummary(project), desktopRegistration }; save(); return operation.result;
52
+ });
53
+ } catch (error) {
54
+ error.details = { ...error.details, projectUpdatePending: operation.updateAttempted === true };
55
+ if (operation.updateAttempted) error.message += ' 请继续完成本次同步,会先核对已有修改。';
56
+ throw error;
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,45 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFile } from 'node:child_process';
4
+ import { promisify } from 'node:util';
5
+ import { credentialStore } from './platform/credential-store.mjs';
6
+ import { readRecord } from './service-lifecycle.mjs';
7
+
8
+ const exec = promisify(execFile);
9
+
10
+ // One-time installation transfer. Execute the previously installed reader at
11
+ // its original location before replacing it; the new runtime never uses a vault.
12
+ export async function importRelayConfig(serviceRoot, stateRoot, nodeExecutable = process.execPath) {
13
+ const configuredId = readRecord(path.join(stateRoot, 'self-relay-config.json'))?.deviceId;
14
+ const validate = record => {
15
+ if (record?.version !== 2 || !record.devices || typeof record.devices !== 'object' || Array.isArray(record.devices)
16
+ || Object.entries(record.devices).some(([id, item]) => !/^[\w-]{16,128}$/.test(id) || item?.id !== id
17
+ || !/^[A-Za-z0-9_-]{43}$/.test(item.secret || '') || typeof item.registered !== 'boolean')
18
+ || (configuredId && configuredId !== 'new' && !record.devices[configuredId])) {
19
+ throw new Error('工作站身份配置不完整或与当前工作站不一致,未停止旧服务。');
20
+ }
21
+ };
22
+ const current = credentialStore('load', undefined, stateRoot).record;
23
+ if (current) { validate(current); return { status: 'already-configured' }; }
24
+ const legacy = path.join(serviceRoot, 'dist/src/platform', process.platform === 'win32' ? 'windows'
25
+ : process.platform === 'darwin' ? 'macos' : 'linux', 'credential-store.mjs');
26
+ if (!fs.existsSync(legacy)) {
27
+ if (configuredId && configuredId !== 'new') throw new Error('缺少当前工作站身份配置,未停止旧服务;请先完成原配对转存。');
28
+ return { status: 'not-needed' };
29
+ }
30
+ let record;
31
+ try {
32
+ const script = 'import { pathToFileURL } from "node:url"; const {credentialStore} = await import(pathToFileURL(process.argv[1])); '
33
+ + 'process.stdout.write(JSON.stringify((await credentialStore("load")).record));';
34
+ const { stdout } = await exec(nodeExecutable, ['--input-type=module', '-e', script, legacy],
35
+ { windowsHide: true, timeout: 65000, maxBuffer: 1024 * 1024 });
36
+ record = JSON.parse(stdout.replace(/^\uFEFF/, ''));
37
+ if (record === null && !configuredId) return { status: 'not-found' };
38
+ validate(record);
39
+ } catch {
40
+ // Never log execFile's error: it can contain stdout with the old identity.
41
+ throw new Error('原设备配对配置转存失败,未停止旧服务。无人值守更新已中止,未更换工作站身份;请先完成原配对转存。');
42
+ }
43
+ credentialStore('save', record, stateRoot);
44
+ return { status: 'imported' };
45
+ }
@@ -0,0 +1,67 @@
1
+ import { discoverCodex, resolveCodexRuntime, runtimeFingerprint, runtimeInstallationFingerprint } from './platform/codex-runtime.mjs';
2
+
3
+ // Advisory discovery is independent of execution health. Failure here must never
4
+ // disable an already running app-server or cause an automatic process restart.
5
+ export class RuntimeDiscovery {
6
+ constructor({ stateRoot, host, url, interval = 60000, diagnose = () => {} }) {
7
+ Object.assign(this, { stateRoot, host, url, interval, diagnose });
8
+ this.state = {};
9
+ }
10
+ start() { this.stopped = false; void this.tick(); }
11
+ stop() { this.stopped = true; clearTimeout(this.timer); }
12
+ async sample() {
13
+ const errors = [];
14
+ try {
15
+ const candidates = discoverCodex();
16
+ const installation = await runtimeInstallationFingerprint();
17
+ const fingerprints = candidates.map(candidate => {
18
+ try { return [candidate.executable, runtimeFingerprint(candidate.executable)]; }
19
+ catch (error) { return [candidate.executable, error.message]; }
20
+ });
21
+ const signature = JSON.stringify([installation, fingerprints]);
22
+ if (signature !== this.diagnosticCandidateSignature) {
23
+ this.diagnosticCandidateSignature = signature;
24
+ this.diagnose('runtime-candidates', { installation, candidates: candidates.map((candidate, index) => ({
25
+ executable: candidate.executable, source: candidate.source, fingerprint: fingerprints[index][1] })) });
26
+ }
27
+ if (signature !== this.signature) {
28
+ const selected = await resolveCodexRuntime(this.stateRoot, { refresh: true });
29
+ this.signature = signature;
30
+ this.diagnose('runtime-selected', { version: selected.version, source: selected.source,
31
+ executable: selected.executable, runningKernelPreserved: true });
32
+ }
33
+ } catch (error) { errors.push(error.message); }
34
+ try {
35
+ if (this.host.desktopIntegration === false) {
36
+ this.state = { desktop: { state: 'unsupported', integrationSupported: false }, checkedAt: new Date().toISOString() };
37
+ if (errors.length) this.state.discoveryError = errors.join('\n');
38
+ this.diagnoseState();
39
+ return this.state;
40
+ }
41
+ const desktop = await this.host.inspect();
42
+ const attached = desktop.running && await this.host.sharedServiceUrl() === (typeof this.url === 'function' ? this.url() : this.url);
43
+ this.state = { desktop: { state: !desktop.running ? 'stopped' : attached ? 'managed' : 'ordinary',
44
+ installed: Boolean(desktop.desktop), version: desktop.version || '', hasWindow: desktop.hasWindow, attachedToManagedServer: Boolean(attached) },
45
+ desktopRestartRecommended: Boolean(desktop.running && !attached), checkedAt: new Date().toISOString() };
46
+ } catch (error) {
47
+ errors.push(error.message);
48
+ this.state = { checkedAt: new Date().toISOString() };
49
+ }
50
+ if (errors.length) this.state.discoveryError = errors.join('\n');
51
+ this.diagnoseState();
52
+ return this.state;
53
+ }
54
+ diagnoseState() {
55
+ const details = { desktop: this.state.desktop || null,
56
+ desktopRestartRecommended: this.state.desktopRestartRecommended === true,
57
+ discoveryError: this.state.discoveryError || null, runningKernelPreserved: true };
58
+ const signature = JSON.stringify(details);
59
+ if (signature === this.diagnosticStateSignature) return;
60
+ this.diagnosticStateSignature = signature;
61
+ this.diagnose('runtime-discovery', details);
62
+ }
63
+ async tick() {
64
+ await this.sample();
65
+ if (!this.stopped) { this.timer = setTimeout(() => this.tick(), this.interval); this.timer.unref?.(); }
66
+ }
67
+ }
@@ -0,0 +1,30 @@
1
+ // Process one account per transaction; foreign keys keep incomplete deletion atomic.
2
+ export async function purgeCancelledAccounts(pool, scopeHash) {
3
+ let purged = 0;
4
+ for (;;) {
5
+ const db = await pool.getConnection();
6
+ try {
7
+ await db.beginTransaction();
8
+ const [rows] = await db.query(`SELECT id FROM users WHERE status='cancelled'
9
+ AND cancelled_at <= UTC_TIMESTAMP(3) - INTERVAL 1 DAY
10
+ ORDER BY cancelled_at LIMIT 1 FOR UPDATE`);
11
+ if (!rows.length) { await db.commit(); return purged; }
12
+ const id = rows[0].id;
13
+ const [identities] = await db.execute("SELECT normalized_value FROM user_login_identities WHERE user_id=? AND kind='email'", [id]);
14
+ for (const { normalized_value: email } of identities) {
15
+ await db.execute('DELETE FROM email_login_challenges WHERE email=?', [email]);
16
+ await db.execute('DELETE FROM email_send_limits WHERE scope_hash=?', [scopeHash(`email:${email}`)]);
17
+ await db.execute('DELETE FROM relay_admin_emails WHERE email=?', [email]);
18
+ }
19
+ for (const table of ['user_sessions', 'relay_usage_actions', 'relay_usage_sessions',
20
+ 'relay_usage_user_days', 'relay_usage_budgets', 'relay_usage_entitlements',
21
+ 'relay_usage_totals', 'user_login_identities']) {
22
+ await db.execute(`DELETE FROM ${table} WHERE user_id=?`, [id]);
23
+ }
24
+ await db.execute('UPDATE computers SET owner_user_id=NULL WHERE owner_user_id=?', [id]);
25
+ await db.execute('DELETE FROM users WHERE id=?', [id]);
26
+ await db.commit(); purged++;
27
+ } catch (error) { await db.rollback(); throw error; }
28
+ finally { db.release(); }
29
+ }
30
+ }