@bryanhu/codexly 0.17.0 → 0.18.0

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 (247) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -2
  3. package/README.zh-CN.md +1 -1
  4. package/dist/{chunk-I74DBIGI.js → chunk-2O7SN37L.js} +1 -1
  5. package/dist/{chunk-PJNYCTFC.js → chunk-3PU3WPOK.js} +234 -59
  6. package/dist/{chunk-P3ZQ3QOJ.js → chunk-M6GWGUSX.js} +105 -2
  7. package/dist/{chunk-5VUCBET3.js → chunk-NROPHBJ7.js} +457 -85
  8. package/dist/cli.js +6 -5
  9. package/dist/client/index.js +136 -3
  10. package/dist/protocol/index.js +1 -1
  11. package/dist/providers/codex/index.js +2 -2
  12. package/dist/server/index.js +4 -4
  13. package/dist/web/.vite/manifest.json +299 -125
  14. package/dist/web/.vite/manifest.json.br +0 -0
  15. package/dist/web/.vite/manifest.json.gz +0 -0
  16. package/dist/web/assets/agent-settings-panel-BagNBAoe.js +1 -0
  17. package/dist/web/assets/agent-settings-panel-BagNBAoe.js.br +0 -0
  18. package/dist/web/assets/agent-settings-panel-BagNBAoe.js.gz +0 -0
  19. package/dist/web/assets/approval-mode-CKJY6q52.js +1 -0
  20. package/dist/web/assets/approval-mode-CKJY6q52.js.br +0 -0
  21. package/dist/web/assets/approval-mode-CKJY6q52.js.gz +0 -0
  22. package/dist/web/assets/background-image-picker-CjpS0dIk.js +1 -0
  23. package/dist/web/assets/background-image-picker-CjpS0dIk.js.br +0 -0
  24. package/dist/web/assets/background-image-picker-CjpS0dIk.js.gz +0 -0
  25. package/dist/web/assets/bing-wallpaper-queries-B-1L0OYP.js +1 -0
  26. package/dist/web/assets/bing-wallpaper-queries-B-1L0OYP.js.br +0 -0
  27. package/dist/web/assets/bing-wallpaper-queries-B-1L0OYP.js.gz +0 -0
  28. package/dist/web/assets/bot-nsMcDaYk.js +1 -0
  29. package/dist/web/assets/bot-nsMcDaYk.js.br +0 -0
  30. package/dist/web/assets/bot-nsMcDaYk.js.gz +0 -0
  31. package/dist/web/assets/{button-group-DxqOhlVt.js → button-group-DIxa2Erp.js} +1 -1
  32. package/dist/web/assets/button-group-DIxa2Erp.js.br +0 -0
  33. package/dist/web/assets/button-group-DIxa2Erp.js.gz +0 -0
  34. package/dist/web/assets/commit-settings-panel-Co1u5Lzc.js +1 -0
  35. package/dist/web/assets/commit-settings-panel-Co1u5Lzc.js.br +0 -0
  36. package/dist/web/assets/commit-settings-panel-Co1u5Lzc.js.gz +0 -0
  37. package/dist/web/assets/{context-menu-D6mhhPGo.js → context-menu-HaQeWpEd.js} +1 -1
  38. package/dist/web/assets/context-menu-HaQeWpEd.js.br +0 -0
  39. package/dist/web/assets/context-menu-HaQeWpEd.js.gz +0 -0
  40. package/dist/web/assets/{dist-Czw-hil0.js → dist-ClwyqJQu.js} +1 -1
  41. package/dist/web/assets/dist-ClwyqJQu.js.br +0 -0
  42. package/dist/web/assets/dist-ClwyqJQu.js.gz +0 -0
  43. package/dist/web/assets/file-review-dialog-B-0RkLZR.js +2 -0
  44. package/dist/web/assets/file-review-dialog-B-0RkLZR.js.br +0 -0
  45. package/dist/web/assets/file-review-dialog-B-0RkLZR.js.gz +0 -0
  46. package/dist/web/assets/git-fork-D0BPqh18.js +1 -0
  47. package/dist/web/assets/git-fork-D0BPqh18.js.br +2 -0
  48. package/dist/web/assets/git-fork-D0BPqh18.js.gz +0 -0
  49. package/dist/web/assets/git-history-panel-QiNKxo_n.js +2 -0
  50. package/dist/web/assets/git-history-panel-QiNKxo_n.js.br +0 -0
  51. package/dist/web/assets/git-history-panel-QiNKxo_n.js.gz +0 -0
  52. package/dist/web/assets/global-settings-about-DWXfIOas.js +1 -0
  53. package/dist/web/assets/global-settings-about-DWXfIOas.js.br +0 -0
  54. package/dist/web/assets/global-settings-about-DWXfIOas.js.gz +0 -0
  55. package/dist/web/assets/global-settings-fields-CmEy5pOE.js +1 -0
  56. package/dist/web/assets/global-settings-fields-CmEy5pOE.js.br +0 -0
  57. package/dist/web/assets/global-settings-fields-CmEy5pOE.js.gz +0 -0
  58. package/dist/web/assets/global-settings-model-B49sZloO.js +1 -0
  59. package/dist/web/assets/global-settings-model-B49sZloO.js.br +0 -0
  60. package/dist/web/assets/global-settings-model-B49sZloO.js.gz +0 -0
  61. package/dist/web/assets/global-settings-page-BqzYrF2U.css +1 -0
  62. package/dist/web/assets/global-settings-page-BqzYrF2U.css.br +0 -0
  63. package/dist/web/assets/global-settings-page-BqzYrF2U.css.gz +0 -0
  64. package/dist/web/assets/global-settings-page-DKXRkWmd.js +2 -0
  65. package/dist/web/assets/global-settings-page-DKXRkWmd.js.br +0 -0
  66. package/dist/web/assets/global-settings-page-DKXRkWmd.js.gz +0 -0
  67. package/dist/web/assets/global-settings-pets-8bzx8OFf.css +1 -0
  68. package/dist/web/assets/global-settings-pets-8bzx8OFf.css.br +0 -0
  69. package/dist/web/assets/global-settings-pets-8bzx8OFf.css.gz +0 -0
  70. package/dist/web/assets/global-settings-pets-DP2AxhJW.js +1 -0
  71. package/dist/web/assets/global-settings-pets-DP2AxhJW.js.br +0 -0
  72. package/dist/web/assets/global-settings-pets-DP2AxhJW.js.gz +0 -0
  73. package/dist/web/assets/index-BGtID8VJ.css +2 -0
  74. package/dist/web/assets/index-BGtID8VJ.css.br +0 -0
  75. package/dist/web/assets/index-BGtID8VJ.css.gz +0 -0
  76. package/dist/web/assets/index-mkWzMsjN.js +4 -0
  77. package/dist/web/assets/index-mkWzMsjN.js.br +0 -0
  78. package/dist/web/assets/index-mkWzMsjN.js.gz +0 -0
  79. package/dist/web/assets/initial-deps-CDAJF_GU.js +1 -0
  80. package/dist/web/assets/initial-deps-CDAJF_GU.js.br +0 -0
  81. package/dist/web/assets/initial-deps-CDAJF_GU.js.gz +0 -0
  82. package/dist/web/assets/{initial-deps-CQxWMuPh.js → initial-deps-DeVnmDFC.js} +1 -1
  83. package/dist/web/assets/initial-deps-DeVnmDFC.js.br +0 -0
  84. package/dist/web/assets/initial-deps-DeVnmDFC.js.gz +0 -0
  85. package/dist/web/assets/{installed-skills-pane-BfNddwjn.js → installed-skills-pane-CR2LbYh9.js} +1 -1
  86. package/dist/web/assets/installed-skills-pane-CR2LbYh9.js.br +0 -0
  87. package/dist/web/assets/installed-skills-pane-CR2LbYh9.js.gz +0 -0
  88. package/dist/web/assets/lazy-message-response-3Fr_a8du.js +2 -0
  89. package/dist/web/assets/lazy-message-response-3Fr_a8du.js.br +0 -0
  90. package/dist/web/assets/lazy-message-response-3Fr_a8du.js.gz +0 -0
  91. package/dist/web/assets/{mcp-management-pane-Ch_kUuam.js → mcp-management-pane-DEuUn7Y6.js} +1 -1
  92. package/dist/web/assets/mcp-management-pane-DEuUn7Y6.js.br +0 -0
  93. package/dist/web/assets/mcp-management-pane-DEuUn7Y6.js.gz +0 -0
  94. package/dist/web/assets/{message-response-KFxzclWt.js → message-response-D3YFwFiE.js} +1 -1
  95. package/dist/web/assets/message-response-D3YFwFiE.js.br +0 -0
  96. package/dist/web/assets/message-response-D3YFwFiE.js.gz +0 -0
  97. package/dist/web/assets/{official-plugins-pane-CFbYqeRf.js → official-plugins-pane-k8o9gVMR.js} +1 -1
  98. package/dist/web/assets/official-plugins-pane-k8o9gVMR.js.br +0 -0
  99. package/dist/web/assets/official-plugins-pane-k8o9gVMR.js.gz +0 -0
  100. package/dist/web/assets/paw-print-9SfXKttW.js +1 -0
  101. package/dist/web/assets/paw-print-9SfXKttW.js.br +0 -0
  102. package/dist/web/assets/paw-print-9SfXKttW.js.gz +0 -0
  103. package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js +1 -0
  104. package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js.br +0 -0
  105. package/dist/web/assets/personalization-settings-panel-Cl4_Y5Uk.js.gz +0 -0
  106. package/dist/web/assets/{project-file-popup-page-9jdg_OXD.js → project-file-popup-page-0uRpUcFH.js} +1 -1
  107. package/dist/web/assets/project-file-popup-page-0uRpUcFH.js.br +0 -0
  108. package/dist/web/assets/project-file-popup-page-0uRpUcFH.js.gz +0 -0
  109. package/dist/web/assets/{project-source-panel-B-xuo6G6.js → project-source-panel-CEegjNVo.js} +2 -2
  110. package/dist/web/assets/project-source-panel-CEegjNVo.js.br +0 -0
  111. package/dist/web/assets/project-source-panel-CEegjNVo.js.gz +0 -0
  112. package/dist/web/assets/prompt-input-Bs_e51Ey.js +1 -0
  113. package/dist/web/assets/prompt-input-Bs_e51Ey.js.br +0 -0
  114. package/dist/web/assets/prompt-input-Bs_e51Ey.js.gz +0 -0
  115. package/dist/web/assets/{prompt-input-controls-CuE9VrWA.js → prompt-input-controls-DMqyvYVY.js} +1 -1
  116. package/dist/web/assets/prompt-input-controls-DMqyvYVY.js.br +0 -0
  117. package/dist/web/assets/prompt-input-controls-DMqyvYVY.js.gz +0 -0
  118. package/dist/web/assets/scheduled-task-date-time-picker-CHc9a7G1.js +1 -0
  119. package/dist/web/assets/scheduled-task-date-time-picker-CHc9a7G1.js.br +0 -0
  120. package/dist/web/assets/scheduled-task-date-time-picker-CHc9a7G1.js.gz +0 -0
  121. package/dist/web/assets/{scheduled-task-floating-ui~scheduled-task-date-time-picker-BischM2-.js → scheduled-task-floating-ui~scheduled-task-date-time-picker-Bz9LiWta.js} +1 -1
  122. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-Bz9LiWta.js.br +0 -0
  123. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-Bz9LiWta.js.gz +0 -0
  124. package/dist/web/assets/scheduled-task-schedule-2Ugh5sqp.js +1 -0
  125. package/dist/web/assets/scheduled-task-schedule-2Ugh5sqp.js.br +0 -0
  126. package/dist/web/assets/scheduled-task-schedule-2Ugh5sqp.js.gz +0 -0
  127. package/dist/web/assets/scheduled-tasks-container-CVGTy7-W.css +1 -0
  128. package/dist/web/assets/scheduled-tasks-container-CVGTy7-W.css.br +0 -0
  129. package/dist/web/assets/scheduled-tasks-container-CVGTy7-W.css.gz +0 -0
  130. package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js +2 -0
  131. package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js.br +0 -0
  132. package/dist/web/assets/scheduled-tasks-container-Ddieo85Q.js.gz +0 -0
  133. package/dist/web/assets/settings-personalization-b55VcvKr.js +1 -0
  134. package/dist/web/assets/settings-personalization-b55VcvKr.js.br +0 -0
  135. package/dist/web/assets/settings-personalization-b55VcvKr.js.gz +0 -0
  136. package/dist/web/assets/{sheet-DTJIZQHt.js → sheet-DbEBBgCs.js} +1 -1
  137. package/dist/web/assets/sheet-DbEBBgCs.js.br +0 -0
  138. package/dist/web/assets/sheet-DbEBBgCs.js.gz +0 -0
  139. package/dist/web/assets/{skills-market-container-8VwHWKJN.js → skills-market-container-BwT-U8XF.js} +2 -2
  140. package/dist/web/assets/skills-market-container-BwT-U8XF.js.br +0 -0
  141. package/dist/web/assets/skills-market-container-BwT-U8XF.js.gz +0 -0
  142. package/dist/web/assets/sliders-horizontal-DfoeSLtp.js +1 -0
  143. package/dist/web/assets/sliders-horizontal-DfoeSLtp.js.br +0 -0
  144. package/dist/web/assets/sliders-horizontal-DfoeSLtp.js.gz +0 -0
  145. package/dist/web/assets/{third-party-marketplace-pane-BtZYBzru.js → third-party-marketplace-pane-Cva9dfRn.js} +1 -1
  146. package/dist/web/assets/third-party-marketplace-pane-Cva9dfRn.js.br +0 -0
  147. package/dist/web/assets/third-party-marketplace-pane-Cva9dfRn.js.gz +0 -0
  148. package/dist/web/assets/workbench-composer-BxYlmKUq.js +10 -0
  149. package/dist/web/assets/workbench-composer-BxYlmKUq.js.br +0 -0
  150. package/dist/web/assets/workbench-composer-BxYlmKUq.js.gz +0 -0
  151. package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js +2 -0
  152. package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js.br +0 -0
  153. package/dist/web/assets/workbench-inspector-changes-DFZ_PDdt.js.gz +0 -0
  154. package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js +1 -0
  155. package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js.br +0 -0
  156. package/dist/web/assets/workbench-pet-canvas-DwkSGxpw.js.gz +0 -0
  157. package/dist/web/assets/workbench-shell-CnjG23lI.js +8 -0
  158. package/dist/web/assets/workbench-shell-CnjG23lI.js.br +0 -0
  159. package/dist/web/assets/workbench-shell-CnjG23lI.js.gz +0 -0
  160. package/dist/web/index.html +5 -5
  161. package/dist/web/index.html.br +0 -0
  162. package/dist/web/index.html.gz +0 -0
  163. package/package.json +2 -2
  164. package/dist/web/assets/button-group-DxqOhlVt.js.br +0 -0
  165. package/dist/web/assets/button-group-DxqOhlVt.js.gz +0 -0
  166. package/dist/web/assets/context-menu-D6mhhPGo.js.br +0 -0
  167. package/dist/web/assets/context-menu-D6mhhPGo.js.gz +0 -0
  168. package/dist/web/assets/dist-Czw-hil0.js.br +0 -0
  169. package/dist/web/assets/dist-Czw-hil0.js.gz +0 -0
  170. package/dist/web/assets/file-review-dialog-CX8yGcaF.js +0 -2
  171. package/dist/web/assets/file-review-dialog-CX8yGcaF.js.br +0 -0
  172. package/dist/web/assets/file-review-dialog-CX8yGcaF.js.gz +0 -0
  173. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js +0 -1
  174. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js.br +0 -0
  175. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js.gz +0 -0
  176. package/dist/web/assets/git-history-panel-ChKO0MmG.js +0 -2
  177. package/dist/web/assets/git-history-panel-ChKO0MmG.js.br +0 -0
  178. package/dist/web/assets/git-history-panel-ChKO0MmG.js.gz +0 -0
  179. package/dist/web/assets/global-settings-dialog-Dmjldruk.js +0 -1
  180. package/dist/web/assets/global-settings-dialog-Dmjldruk.js.br +0 -0
  181. package/dist/web/assets/global-settings-dialog-Dmjldruk.js.gz +0 -0
  182. package/dist/web/assets/index-C1q8rvrB.css +0 -2
  183. package/dist/web/assets/index-C1q8rvrB.css.br +0 -0
  184. package/dist/web/assets/index-C1q8rvrB.css.gz +0 -0
  185. package/dist/web/assets/index-Dc0FOD_M.js +0 -4
  186. package/dist/web/assets/index-Dc0FOD_M.js.br +0 -0
  187. package/dist/web/assets/index-Dc0FOD_M.js.gz +0 -0
  188. package/dist/web/assets/initial-deps-CQxWMuPh.js.br +0 -0
  189. package/dist/web/assets/initial-deps-CQxWMuPh.js.gz +0 -0
  190. package/dist/web/assets/initial-deps-Dr1AWuHB.js +0 -1
  191. package/dist/web/assets/initial-deps-Dr1AWuHB.js.br +0 -0
  192. package/dist/web/assets/initial-deps-Dr1AWuHB.js.gz +0 -0
  193. package/dist/web/assets/installed-skills-pane-BfNddwjn.js.br +0 -0
  194. package/dist/web/assets/installed-skills-pane-BfNddwjn.js.gz +0 -0
  195. package/dist/web/assets/lazy-message-response-BpXGmE9E.js +0 -2
  196. package/dist/web/assets/lazy-message-response-BpXGmE9E.js.br +0 -0
  197. package/dist/web/assets/lazy-message-response-BpXGmE9E.js.gz +0 -0
  198. package/dist/web/assets/mcp-management-pane-Ch_kUuam.js.br +0 -0
  199. package/dist/web/assets/mcp-management-pane-Ch_kUuam.js.gz +0 -0
  200. package/dist/web/assets/message-response-KFxzclWt.js.br +0 -0
  201. package/dist/web/assets/message-response-KFxzclWt.js.gz +0 -0
  202. package/dist/web/assets/official-plugins-pane-CFbYqeRf.js.br +0 -0
  203. package/dist/web/assets/official-plugins-pane-CFbYqeRf.js.gz +0 -0
  204. package/dist/web/assets/project-file-popup-page-9jdg_OXD.js.br +0 -0
  205. package/dist/web/assets/project-file-popup-page-9jdg_OXD.js.gz +0 -0
  206. package/dist/web/assets/project-source-panel-B-xuo6G6.js.br +0 -0
  207. package/dist/web/assets/project-source-panel-B-xuo6G6.js.gz +0 -0
  208. package/dist/web/assets/prompt-input-CS22f1Yj.js +0 -1
  209. package/dist/web/assets/prompt-input-CS22f1Yj.js.br +0 -0
  210. package/dist/web/assets/prompt-input-CS22f1Yj.js.gz +0 -0
  211. package/dist/web/assets/prompt-input-controls-CuE9VrWA.js.br +0 -0
  212. package/dist/web/assets/prompt-input-controls-CuE9VrWA.js.gz +0 -0
  213. package/dist/web/assets/scheduled-task-date-time-picker-DbgzJnvY.js +0 -1
  214. package/dist/web/assets/scheduled-task-date-time-picker-DbgzJnvY.js.br +0 -0
  215. package/dist/web/assets/scheduled-task-date-time-picker-DbgzJnvY.js.gz +0 -0
  216. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-BischM2-.js.br +0 -0
  217. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-BischM2-.js.gz +0 -0
  218. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js +0 -1
  219. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js.br +0 -0
  220. package/dist/web/assets/scheduled-task-schedule-Cfuv_Kyf.js.gz +0 -0
  221. package/dist/web/assets/scheduled-tasks-container-Cikmo6YE.js +0 -2
  222. package/dist/web/assets/scheduled-tasks-container-Cikmo6YE.js.br +0 -0
  223. package/dist/web/assets/scheduled-tasks-container-Cikmo6YE.js.gz +0 -0
  224. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css +0 -1
  225. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css.br +0 -0
  226. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css.gz +0 -0
  227. package/dist/web/assets/sheet-DTJIZQHt.js.br +0 -0
  228. package/dist/web/assets/sheet-DTJIZQHt.js.gz +0 -0
  229. package/dist/web/assets/skills-market-container-8VwHWKJN.js.br +0 -0
  230. package/dist/web/assets/skills-market-container-8VwHWKJN.js.gz +0 -0
  231. package/dist/web/assets/third-party-marketplace-pane-BtZYBzru.js.br +0 -0
  232. package/dist/web/assets/third-party-marketplace-pane-BtZYBzru.js.gz +0 -0
  233. package/dist/web/assets/workbench-composer-Dfa3le3p.js +0 -10
  234. package/dist/web/assets/workbench-composer-Dfa3le3p.js.br +0 -0
  235. package/dist/web/assets/workbench-composer-Dfa3le3p.js.gz +0 -0
  236. package/dist/web/assets/workbench-inspector-changes-Be75nN9Z.js +0 -2
  237. package/dist/web/assets/workbench-inspector-changes-Be75nN9Z.js.br +0 -0
  238. package/dist/web/assets/workbench-inspector-changes-Be75nN9Z.js.gz +0 -0
  239. package/dist/web/assets/workbench-pet-canvas-gckmllUf.js +0 -1
  240. package/dist/web/assets/workbench-pet-canvas-gckmllUf.js.br +0 -0
  241. package/dist/web/assets/workbench-pet-canvas-gckmllUf.js.gz +0 -0
  242. package/dist/web/assets/workbench-shell-0X1Ehypo.js +0 -8
  243. package/dist/web/assets/workbench-shell-0X1Ehypo.js.br +0 -0
  244. package/dist/web/assets/workbench-shell-0X1Ehypo.js.gz +0 -0
  245. /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~olri0nvu-DAfditVv.js → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~egzauog4-DAfditVv.js} +0 -0
  246. /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~olri0nvu-DAfditVv.js.br → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~egzauog4-DAfditVv.js.br} +0 -0
  247. /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~olri0nvu-DAfditVv.js.gz → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-file-p~egzauog4-DAfditVv.js.gz} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { createRequire } from 'node:module';
2
- import { value_exports } from './chunk-I74DBIGI.js';
3
- import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-PJNYCTFC.js';
2
+ import { value_exports } from './chunk-2O7SN37L.js';
3
+ import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-3PU3WPOK.js';
4
4
  import { WorkbenchPetProviderError, PendingRequestResolutionError } from './chunk-RNTA4MFS.js';
5
- import { Type, SkillInstallScopeSchema, ScheduledTaskSchema, AgentTurnSchema, DEFAULT_COMMIT_MESSAGE_MODEL, TEMPORARY_TASK_API_PATH, TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_FILE_BYTES, AccessStatusResponseSchema, PairAccessRequestSchema, HealthResponseSchema, AppInfoResponseSchema, AppUpdateProgressResponseSchema, AgentMutationErrorSchema, InstallAppUpdateResponseSchema, InstallAppUpdateRequestSchema, EventStreamMetricsResponseSchema, AgentCapabilitiesSchema, AgentModelPageSchema, AgentGlobalSettingsResponseSchema, AgentGlobalSettingsSchema, MAX_AGENT_IMAGE_BYTES, MAX_AGENT_TEXT_BYTES, AgentProviderConnectionStatusSchema, StartOfficialProviderLoginResponseSchema, StartOfficialProviderLoginRequestSchema, AgentProviderConnectionMutationResponseSchema, CancelProviderLoginRequestSchema, ConfigureCustomProviderResponseSchema, ConfigureCustomProviderRequestSchema, WorkbenchPetCatalogResponseSchema, WorkbenchPetDownloadResponseSchema, WorkbenchPetDownloadRequestSchema, ProjectPageSchema, HostFileListingSchema, HostFileQuerySchema, ProjectDirectoryListingSchema, ProjectDirectoryQuerySchema, ProjectOpenCapabilitiesResponseSchema, OpenProjectResponseSchema, ProjectRootQuerySchema, OpenProjectRequestSchema, ReorderProjectsResponseSchema, ReorderProjectsRequestSchema, AgentSkillPageSchema, AgentProjectDefaultsResponseSchema, AgentProjectDefaultsSchema, AddProjectResponseSchema, AddProjectRequestSchema, RenameProjectResponseSchema, RenameProjectRequestSchema, RemoveProjectResponseSchema, RemoveProjectRequestSchema, InstalledSkillPageSchema, OfficialPluginPageSchema, OfficialPluginDetailSchema, OfficialPluginInstallResultSchema, OfficialPluginUninstallResultSchema, ClawhubSkillPageSchema, ClawhubSkillDetailSchema, ConfiguredMcpServerPageSchema, OpenSkillDirectoryResponseSchema, SetSkillEnabledResponseSchema, SetMcpServerEnabledResponseSchema, SkillInstallResultSchema, ScheduledTaskPageSchema, ScheduledTaskMutationResponseSchema, ScheduledTaskInputSchema, DeleteScheduledTaskResponseSchema, SetScheduledTaskEnabledRequestSchema, AgentTaskPageSchema, UnsubscribeAgentTaskResponseSchema, AgentTaskSnapshotResponseSchema, AgentMcpServerPageSchema, AgentBackgroundTerminalPageSchema, TerminateAgentBackgroundTerminalResponseSchema, PinAgentTaskResponseSchema, PinAgentTaskRequestSchema, RenameAgentTaskResponseSchema, RenameAgentTaskRequestSchema, ArchiveAgentTaskResponseSchema, ArchiveAgentTaskRequestSchema, UnarchiveAgentTaskResponseSchema, UnarchiveAgentTaskRequestSchema, DeleteAgentTaskResponseSchema, DeleteAgentTaskRequestSchema, StartAgentTaskResponseSchema, StartAgentTaskRequestSchema, StartAgentTurnResponseSchema, StartAgentTurnRequestSchema, SteerAgentTurnResponseSchema, SteerAgentTurnRequestSchema, InterruptAgentTurnResponseSchema, InterruptAgentTurnRequestSchema, ResolvePendingRequestResponseSchema, ResolvePendingRequestRequestSchema, AgentQueuedSubmissionPageSchema, AddAgentQueuedSubmissionResponseSchema, AddAgentQueuedSubmissionRequestSchema, UpdateAgentQueuedSubmissionResponseSchema, UpdateAgentQueuedSubmissionRequestSchema, DeleteAgentQueuedSubmissionResponseSchema, ReorderAgentQueuedSubmissionsResponseSchema, ReorderAgentQueuedSubmissionsRequestSchema, StartAgentQueuedSubmissionResponseSchema, StartAgentQueuedSubmissionRequestSchema, AgentPromptInputSchema, AgentProviderConnectionRecordSchema, MAX_AGENT_IMAGES, MAX_AGENT_IMAGE_TOTAL_BYTES, MAX_AGENT_FILE_TOTAL_BYTES, ProjectGitStatusSchema, ProjectGitStatusQuerySchema, ProjectGitHistoryPageSchema, ProjectGitHistoryQuerySchema, ProjectGitCommitFilesPageSchema, ProjectGitCommitFilesQuerySchema, ProjectGitCommitFileDiffSchema, ProjectGitCommitFileDiffQuerySchema, SwitchProjectBranchRequestSchema, CreateProjectBranchRequestSchema, GenerateCommitMessageResponseSchema, GenerateCommitMessageRequestSchema, CommitProjectChangesResponseSchema, CommitProjectChangesRequestSchema, ProjectFileTreeSchema, ProjectFileTreeQuerySchema, ProjectFileSearchPageSchema, ProjectFileSearchQuerySchema, StopProjectFileSearchResponseSchema, StopProjectFileSearchRequestSchema, ProjectSourceFileQuerySchema, ProjectSourceFileSchema, AgentAttachmentUploadResponseSchema, HostFileKindSchema, ImportHostAttachmentRequestSchema, AgentAttachmentKindSchema, AgentTaskSettingsResponseSchema, AgentTaskSettingsSchema, ReloadAgentMcpServersResponseSchema, ReloadAgentMcpServersRequestSchema, ReviewAgentTaskResponseSchema, ReviewAgentTaskRequestSchema, CompactAgentTaskResponseSchema, CompactAgentTaskRequestSchema, ForkAgentTaskResponseSchema, ForkAgentTaskRequestSchema, UploadAgentFeedbackResponseSchema, UploadAgentFeedbackRequestSchema, OpenAgentTaskAttachmentResponseSchema, OpenAgentTaskAttachmentRequestSchema, UpdateAgentGoalResponseSchema, UpdateAgentGoalRequestSchema, ClearAgentGoalResponseSchema, AgentMessageAttachmentSchema, ProjectGitWorktreePageSchema, ProjectWorktreeMutationResponseSchema, CreateProjectWorktreeRequestSchema, SwitchProjectWorktreeRequestSchema, RenameProjectFileResponseSchema, RenameProjectFileRequestSchema, DeleteProjectFileResponseSchema, DeleteProjectFileRequestSchema, MAX_EVENT_BATCH_SIZE } from './chunk-P3ZQ3QOJ.js';
5
+ import { Type, SkillInstallScopeSchema, ScheduledTaskSchema, AgentTurnSchema, DEFAULT_COMMIT_MESSAGE_MODEL, TEMPORARY_TASK_API_PATH, TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_FILE_BYTES, AccessStatusResponseSchema, PairAccessRequestSchema, BingWallpaperCatalogSchema, HealthResponseSchema, AppInfoResponseSchema, AppUpdateProgressResponseSchema, AgentMutationErrorSchema, InstallAppUpdateResponseSchema, InstallAppUpdateRequestSchema, EventStreamMetricsResponseSchema, AgentCapabilitiesSchema, AgentModelPageSchema, AgentGlobalSettingsResponseSchema, AgentGlobalSettingsSchema, MAX_AGENT_IMAGE_BYTES, MAX_AGENT_TEXT_BYTES, GlobalInstructionsSchema, MemorySettingsSchema, AgentPreferencesSchema, SaveGlobalInstructionsSchema, MemorySettingsUpdateSchema, PersonalizationResetSchema, AgentProviderConnectionStatusSchema, StartOfficialProviderLoginResponseSchema, StartOfficialProviderLoginRequestSchema, AgentProviderConnectionMutationResponseSchema, CancelProviderLoginRequestSchema, ConfigureCustomProviderResponseSchema, ConfigureCustomProviderRequestSchema, WorkbenchPetCatalogResponseSchema, WorkbenchPetDownloadResponseSchema, WorkbenchPetDownloadRequestSchema, ProjectPageSchema, HostFileListingSchema, HostFileQuerySchema, ProjectDirectoryListingSchema, ProjectDirectoryQuerySchema, ProjectOpenCapabilitiesResponseSchema, OpenProjectResponseSchema, ProjectRootQuerySchema, OpenProjectRequestSchema, ReorderProjectsResponseSchema, ReorderProjectsRequestSchema, AgentSkillPageSchema, AgentProjectDefaultsResponseSchema, AgentProjectDefaultsSchema, AddProjectResponseSchema, AddProjectRequestSchema, RenameProjectResponseSchema, RenameProjectRequestSchema, RemoveProjectResponseSchema, RemoveProjectRequestSchema, InstalledSkillPageSchema, OfficialPluginPageSchema, OfficialPluginDetailSchema, OfficialPluginInstallResultSchema, OfficialPluginUninstallResultSchema, ClawhubSkillPageSchema, ClawhubSkillDetailSchema, ConfiguredMcpServerPageSchema, OpenSkillDirectoryResponseSchema, SetSkillEnabledResponseSchema, SetMcpServerEnabledResponseSchema, SkillInstallResultSchema, ScheduledTaskPreviewSchema, ScheduledTaskPreviewRequestSchema, ScheduledTaskPageSchema, ScheduledTaskMutationResponseSchema, ScheduledTaskInputSchema, DeleteScheduledTaskResponseSchema, SetScheduledTaskEnabledRequestSchema, AgentTaskPageSchema, UnsubscribeAgentTaskResponseSchema, AgentTaskSnapshotResponseSchema, AgentMcpServerPageSchema, AgentBackgroundTerminalPageSchema, TerminateAgentBackgroundTerminalResponseSchema, PinAgentTaskResponseSchema, PinAgentTaskRequestSchema, RenameAgentTaskResponseSchema, RenameAgentTaskRequestSchema, ArchiveAgentTaskResponseSchema, ArchiveAgentTaskRequestSchema, UnarchiveAgentTaskResponseSchema, UnarchiveAgentTaskRequestSchema, DeleteAgentTaskResponseSchema, DeleteAgentTaskRequestSchema, StartAgentTaskResponseSchema, StartAgentTaskRequestSchema, StartAgentTurnResponseSchema, StartAgentTurnRequestSchema, SteerAgentTurnResponseSchema, SteerAgentTurnRequestSchema, InterruptAgentTurnResponseSchema, InterruptAgentTurnRequestSchema, ResolvePendingRequestResponseSchema, ResolvePendingRequestRequestSchema, AgentQueuedSubmissionPageSchema, AddAgentQueuedSubmissionResponseSchema, AddAgentQueuedSubmissionRequestSchema, UpdateAgentQueuedSubmissionResponseSchema, UpdateAgentQueuedSubmissionRequestSchema, DeleteAgentQueuedSubmissionResponseSchema, ReorderAgentQueuedSubmissionsResponseSchema, ReorderAgentQueuedSubmissionsRequestSchema, StartAgentQueuedSubmissionResponseSchema, StartAgentQueuedSubmissionRequestSchema, AgentPromptInputSchema, AgentProviderConnectionRecordSchema, MAX_AGENT_IMAGES, MAX_AGENT_IMAGE_TOTAL_BYTES, MAX_AGENT_FILE_TOTAL_BYTES, ProjectGitStatusSchema, ProjectGitStatusQuerySchema, ProjectGitHistoryPageSchema, ProjectGitHistoryQuerySchema, ProjectGitCommitFilesPageSchema, ProjectGitCommitFilesQuerySchema, ProjectGitCommitFileDiffSchema, ProjectGitCommitFileDiffQuerySchema, SwitchProjectBranchRequestSchema, CreateProjectBranchRequestSchema, GenerateCommitMessageResponseSchema, GenerateCommitMessageRequestSchema, CommitProjectChangesResponseSchema, CommitProjectChangesRequestSchema, ProjectFileTreeSchema, ProjectFileTreeQuerySchema, ProjectFileSearchPageSchema, ProjectFileSearchQuerySchema, StopProjectFileSearchResponseSchema, StopProjectFileSearchRequestSchema, ProjectSourceFileQuerySchema, ProjectSourceFileSchema, AgentAttachmentUploadResponseSchema, HostFileKindSchema, ImportHostAttachmentRequestSchema, AgentAttachmentKindSchema, zonedDateTime, AgentTaskSettingsResponseSchema, AgentTaskSettingsSchema, ReloadAgentMcpServersResponseSchema, ReloadAgentMcpServersRequestSchema, ReviewAgentTaskResponseSchema, ReviewAgentTaskRequestSchema, CompactAgentTaskResponseSchema, CompactAgentTaskRequestSchema, ForkAgentTaskResponseSchema, ForkAgentTaskRequestSchema, UploadAgentFeedbackResponseSchema, UploadAgentFeedbackRequestSchema, OpenAgentTaskAttachmentResponseSchema, OpenAgentTaskAttachmentRequestSchema, UpdateAgentGoalResponseSchema, UpdateAgentGoalRequestSchema, ClearAgentGoalResponseSchema, AgentMessageAttachmentSchema, ProjectGitWorktreePageSchema, ProjectWorktreeMutationResponseSchema, CreateProjectWorktreeRequestSchema, SwitchProjectWorktreeRequestSchema, RenameProjectFileResponseSchema, RenameProjectFileRequestSchema, DeleteProjectFileResponseSchema, DeleteProjectFileRequestSchema, wallTimeToUnix, MAX_EVENT_BATCH_SIZE } from './chunk-M6GWGUSX.js';
6
6
  import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
7
7
  import { Buffer as Buffer$1 } from 'buffer';
8
8
  import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'crypto';
@@ -12,7 +12,7 @@ import { tmpdir, homedir } from 'os';
12
12
  import { join, isAbsolute, dirname, resolve, relative, sep, basename, extname, normalize, win32, posix } from 'path';
13
13
  import { Transform, Readable } from 'stream';
14
14
  import { pipeline } from 'stream/promises';
15
- import { TextDecoder as TextDecoder$1 } from 'util';
15
+ import { TextDecoder as TextDecoder$1, isDeepStrictEqual } from 'util';
16
16
  import { spawn } from 'child_process';
17
17
  import { EventEmitter } from 'events';
18
18
  import { createRequire as createRequire$1 } from 'module';
@@ -56608,7 +56608,14 @@ var AttachmentStore = class {
56608
56608
  }
56609
56609
  async releaseQueue(projectId, queuedSubmissionId) {
56610
56610
  const attachmentIds = this.#queueIndex.take(projectId, queuedSubmissionId);
56611
- await Promise.all(attachmentIds.map((attachmentId) => this.#delete(attachmentId)));
56611
+ await Promise.all(
56612
+ attachmentIds.map(async (attachmentId) => {
56613
+ const entry = this.#entries.get(attachmentId);
56614
+ if (entry?.projectId === projectId && entry.consumedTurnId === void 0) {
56615
+ await this.#delete(attachmentId);
56616
+ }
56617
+ })
56618
+ );
56612
56619
  }
56613
56620
  async discard(id) {
56614
56621
  await this.#delete(id);
@@ -61944,7 +61951,7 @@ function createUntrackedTextDiff(path, content) {
61944
61951
  );
61945
61952
  }
61946
61953
  function applyDiffBudget(changes, budget) {
61947
- return changes.map((change) => ({ ...change, diff: budget.takeDiff(change.diff) }));
61954
+ return changes.map((change2) => ({ ...change2, diff: budget.takeDiff(change2.diff) }));
61948
61955
  }
61949
61956
  function parseTrackedDiffs(output) {
61950
61957
  if (output === "") {
@@ -62214,8 +62221,8 @@ async function readRepositoryBranches(repositoryRoot, gitCommandExecutor) {
62214
62221
  }
62215
62222
  return { baseBranches: branches, branch, branches: localBranches };
62216
62223
  }
62217
- function prefixRepositoryPath(repositoryName, change) {
62218
- return { ...change, path: `${repositoryName}/${change.path}` };
62224
+ function prefixRepositoryPath(repositoryName, change2) {
62225
+ return { ...change2, path: `${repositoryName}/${change2.path}` };
62219
62226
  }
62220
62227
  async function readImmediateChildRepositoryStatuses(projectRoot, gitCommandExecutor, budget, includeDiff) {
62221
62228
  const childDirectories = (await readdir(projectRoot, { withFileTypes: true })).filter((entry) => entry.isDirectory()).toSorted((left, right) => left.name.localeCompare(right.name));
@@ -62251,9 +62258,9 @@ async function readImmediateChildRepositoryStatuses(projectRoot, gitCommandExecu
62251
62258
  budget,
62252
62259
  includeDiff
62253
62260
  );
62254
- staged.push(...status2.staged.map((change) => prefixRepositoryPath(repository.name, change)));
62261
+ staged.push(...status2.staged.map((change2) => prefixRepositoryPath(repository.name, change2)));
62255
62262
  unstaged.push(
62256
- ...status2.unstaged.map((change) => prefixRepositoryPath(repository.name, change))
62263
+ ...status2.unstaged.map((change2) => prefixRepositoryPath(repository.name, change2))
62257
62264
  );
62258
62265
  }
62259
62266
  }
@@ -62307,15 +62314,15 @@ async function readGitWorkingTreeStatus(projectRoot, gitCommandExecutor = execut
62307
62314
  const unstaged = status2.unstaged.toSorted(comparePaths);
62308
62315
  const snapshotHash = createHash("sha256");
62309
62316
  snapshotHash.update(repositoryBranches.branch ?? "").update("\0").update(repositoryMode);
62310
- const fingerprintChanges = async (location, changes) => mapWithConcurrency(changes, MAX_FILE_IO_CONCURRENCY, async (change) => {
62317
+ const fingerprintChanges = async (location, changes) => mapWithConcurrency(changes, MAX_FILE_IO_CONCURRENCY, async (change2) => {
62311
62318
  let metadata = "missing";
62312
62319
  try {
62313
- const stats = await lstat(join(resolvedProjectRoot, change.path), { bigint: true });
62320
+ const stats = await lstat(join(resolvedProjectRoot, change2.path), { bigint: true });
62314
62321
  metadata = [stats.mode, stats.size, stats.mtimeNs, stats.ctimeNs].join(":");
62315
62322
  } catch (error) {
62316
62323
  if (error.code !== "ENOENT") throw error;
62317
62324
  }
62318
- return `${location}\0${change.kind}\0${change.path}\0${metadata}\0`;
62325
+ return `${location}\0${change2.kind}\0${change2.path}\0${metadata}\0`;
62319
62326
  });
62320
62327
  for (const fingerprint of await fingerprintChanges("staged", staged)) {
62321
62328
  snapshotHash.update(fingerprint);
@@ -62455,7 +62462,7 @@ async function commitSelectedProjectChanges(projectRoot, request2) {
62455
62462
  if (status2.snapshot !== request2.expectedSnapshot) {
62456
62463
  throw new GitCommitError("GIT_STATUS_CHANGED", "Git changes changed before the commit");
62457
62464
  }
62458
- const changedPaths = new Set([...status2.staged, ...status2.unstaged].map((change) => change.path));
62465
+ const changedPaths = new Set([...status2.staged, ...status2.unstaged].map((change2) => change2.path));
62459
62466
  if (request2.paths.some((path) => !changedPaths.has(path))) {
62460
62467
  throw new GitCommitError(
62461
62468
  "GIT_PATH_UNAVAILABLE",
@@ -62463,7 +62470,7 @@ async function commitSelectedProjectChanges(projectRoot, request2) {
62463
62470
  );
62464
62471
  }
62465
62472
  const selectedPaths = request2.paths.map(literalPath);
62466
- const stagedPaths = new Set(status2.staged.map((change) => change.path));
62473
+ const stagedPaths = new Set(status2.staged.map((change2) => change2.path));
62467
62474
  const selectedStagedPaths = request2.paths.filter((path) => stagedPaths.has(path));
62468
62475
  const selectedUnstagedPaths = request2.paths.filter((path) => !stagedPaths.has(path));
62469
62476
  const temporaryIndexRoot = await mkdtemp(join(tmpdir(), "codexly-git-index-"));
@@ -62661,8 +62668,8 @@ var MAX_COMMIT_CHANGE_SUMMARY_BYTES = 20 * 1024;
62661
62668
  var MAX_COMMIT_DIFF_EXCERPT_BYTES = 36 * 1024;
62662
62669
  var MAX_EXCERPTED_COMMIT_CHANGES = 16;
62663
62670
  function selectedCommitChanges(status2, paths) {
62664
- const stagedByPath = new Map(status2.staged.map((change) => [change.path, change]));
62665
- const unstagedByPath = new Map(status2.unstaged.map((change) => [change.path, change]));
62671
+ const stagedByPath = new Map(status2.staged.map((change2) => [change2.path, change2]));
62672
+ const unstagedByPath = new Map(status2.unstaged.map((change2) => [change2.path, change2]));
62666
62673
  return paths.flatMap((path) => {
62667
62674
  const staged = stagedByPath.get(path);
62668
62675
  const unstaged = unstagedByPath.get(path);
@@ -62712,10 +62719,10 @@ function readDiffLineStats(diff) {
62712
62719
  return { additions, deletions };
62713
62720
  }
62714
62721
  function buildSelectedChangeSummary(changes) {
62715
- const lines = changes.map(({ change, location }) => {
62716
- const { additions, deletions } = readDiffLineStats(change.diff);
62717
- const binary = change.diff.includes("Binary files ") ? ", binary" : "";
62718
- return `[${location}] ${change.kind} ${change.path} (+${String(additions)} -${String(deletions)}, ${String(Buffer$1.byteLength(change.diff, "utf8"))} diff bytes${binary})`;
62722
+ const lines = changes.map(({ change: change2, location }) => {
62723
+ const { additions, deletions } = readDiffLineStats(change2.diff);
62724
+ const binary = change2.diff.includes("Binary files ") ? ", binary" : "";
62725
+ return `[${location}] ${change2.kind} ${change2.path} (+${String(additions)} -${String(deletions)}, ${String(Buffer$1.byteLength(change2.diff, "utf8"))} diff bytes${binary})`;
62719
62726
  });
62720
62727
  const completeSummary = lines.join("\n");
62721
62728
  if (Buffer$1.byteLength(completeSummary, "utf8") <= MAX_COMMIT_CHANGE_SUMMARY_BYTES) {
@@ -62746,7 +62753,7 @@ function representativeCommitChanges(changes) {
62746
62753
  { length: count },
62747
62754
  (_2, index) => Math.round(index * (changes.length - 1) / (count - 1))
62748
62755
  );
62749
- return indexes.map((index) => changes[index]).filter((change) => change !== void 0);
62756
+ return indexes.map((index) => changes[index]).filter((change2) => change2 !== void 0);
62750
62757
  }
62751
62758
  function compactDiff(diff, maximumBytes) {
62752
62759
  const diffBytes = Buffer$1.byteLength(diff, "utf8");
@@ -62771,28 +62778,28 @@ function buildSelectedDiffExcerpts(changes) {
62771
62778
  const perChangeBudget = Math.floor(
62772
62779
  (MAX_COMMIT_DIFF_EXCERPT_BYTES - separatorBytes) / representatives.length
62773
62780
  );
62774
- return representatives.map(({ change, location }) => {
62775
- const header = `[${location}] ${change.kind} ${change.path}
62781
+ return representatives.map(({ change: change2, location }) => {
62782
+ const header = `[${location}] ${change2.kind} ${change2.path}
62776
62783
  `;
62777
62784
  const headerBytes = Buffer$1.byteLength(header, "utf8");
62778
62785
  if (headerBytes >= perChangeBudget) {
62779
62786
  return takeUtf8Prefix(header, perChangeBudget);
62780
62787
  }
62781
- return `${header}${compactDiff(change.diff, perChangeBudget - headerBytes)}`;
62788
+ return `${header}${compactDiff(change2.diff, perChangeBudget - headerBytes)}`;
62782
62789
  }).join("\n\n");
62783
62790
  }
62784
62791
  function buildInlineSelectedDiff(changes) {
62785
62792
  const blocks = [];
62786
62793
  let bytes = 0;
62787
- for (const { change, location } of changes) {
62788
- const header = `[${location}] ${change.path}
62794
+ for (const { change: change2, location } of changes) {
62795
+ const header = `[${location}] ${change2.path}
62789
62796
  `;
62790
62797
  const separatorBytes = blocks.length === 0 ? 0 : 2;
62791
- bytes += separatorBytes + Buffer$1.byteLength(header, "utf8") + Buffer$1.byteLength(change.diff, "utf8");
62798
+ bytes += separatorBytes + Buffer$1.byteLength(header, "utf8") + Buffer$1.byteLength(change2.diff, "utf8");
62792
62799
  if (bytes > MAX_INLINE_COMMIT_DIFF_BYTES) {
62793
62800
  return void 0;
62794
62801
  }
62795
- blocks.push(`${header}${change.diff}`);
62802
+ blocks.push(`${header}${change2.diff}`);
62796
62803
  }
62797
62804
  return blocks.join("\n\n");
62798
62805
  }
@@ -63563,7 +63570,7 @@ function assertCommitSelection(status2, request2) {
63563
63570
  409
63564
63571
  );
63565
63572
  }
63566
- const changedPaths = new Set([...status2.staged, ...status2.unstaged].map((change) => change.path));
63573
+ const changedPaths = new Set([...status2.staged, ...status2.unstaged].map((change2) => change2.path));
63567
63574
  if (request2.paths.some((path) => !changedPaths.has(path))) {
63568
63575
  throw new MutationHttpError(
63569
63576
  "GIT_PATH_UNAVAILABLE",
@@ -65713,11 +65720,11 @@ async function readOrigin(target) {
65713
65720
  await readFile(join(target, ".clawhub/origin.json"), "utf8")
65714
65721
  );
65715
65722
  if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
65716
- const origin = value;
65717
- if (origin["version"] !== 1 || typeof origin["fingerprint"] !== "string" || typeof origin["installedVersion"] !== "string" || typeof origin["ownerHandle"] !== "string" || typeof origin["slug"] !== "string") {
65723
+ const origin2 = value;
65724
+ if (origin2["version"] !== 1 || typeof origin2["fingerprint"] !== "string" || typeof origin2["installedVersion"] !== "string" || typeof origin2["ownerHandle"] !== "string" || typeof origin2["slug"] !== "string") {
65718
65725
  return void 0;
65719
65726
  }
65720
- return origin;
65727
+ return origin2;
65721
65728
  } catch {
65722
65729
  return void 0;
65723
65730
  }
@@ -65752,18 +65759,18 @@ async function skillContentHash(root) {
65752
65759
  async function installClawhubArchive(archive, skillsRoot, owner, slug, version) {
65753
65760
  await mkdir(skillsRoot, { recursive: true });
65754
65761
  const target = join(skillsRoot, slug);
65755
- const origin = await readOrigin(target);
65762
+ const origin2 = await readOrigin(target);
65756
65763
  const targetExists = await stat(target).then(
65757
65764
  () => true,
65758
65765
  () => false
65759
65766
  );
65760
- if (targetExists && (origin === void 0 || origin.ownerHandle !== owner || origin.slug !== slug)) {
65767
+ if (targetExists && (origin2 === void 0 || origin2.ownerHandle !== owner || origin2.slug !== slug)) {
65761
65768
  throw new SkillMarketError("SKILL_MARKET_CONFLICT", "Skill directory contains unrelated files");
65762
65769
  }
65763
- if (targetExists && origin !== void 0 && await skillContentHash(target) !== origin.fingerprint) {
65770
+ if (targetExists && origin2 !== void 0 && await skillContentHash(target) !== origin2.fingerprint) {
65764
65771
  throw new SkillMarketError("SKILL_MARKET_CONFLICT", "Skill directory contains local changes");
65765
65772
  }
65766
- if (origin?.installedVersion === version) return { path: target, status: "current", version };
65773
+ if (origin2?.installedVersion === version) return { path: target, status: "current", version };
65767
65774
  const nonce = [String(process.pid), randomUUID()].join("-");
65768
65775
  const staging = join(skillsRoot, `.${slug}.codexly-${nonce}`);
65769
65776
  const backup = join(skillsRoot, `.${slug}.backup-${nonce}`);
@@ -65822,11 +65829,11 @@ async function readMarketplaceOrigin(path) {
65822
65829
  if ((await stat(originPath)).size > ORIGIN_LIMIT) return void 0;
65823
65830
  const value = JSON.parse(await readFile(originPath, "utf8"));
65824
65831
  if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
65825
- const origin = value;
65826
- return typeof origin["installedVersion"] === "string" && typeof origin["ownerHandle"] === "string" && typeof origin["slug"] === "string" ? {
65827
- installedVersion: origin["installedVersion"],
65828
- owner: origin["ownerHandle"],
65829
- slug: origin["slug"]
65832
+ const origin2 = value;
65833
+ return typeof origin2["installedVersion"] === "string" && typeof origin2["ownerHandle"] === "string" && typeof origin2["slug"] === "string" ? {
65834
+ installedVersion: origin2["installedVersion"],
65835
+ owner: origin2["ownerHandle"],
65836
+ slug: origin2["slug"]
65830
65837
  } : void 0;
65831
65838
  } catch {
65832
65839
  return void 0;
@@ -68524,6 +68531,30 @@ var registerPetRoutes = (app, { petProvider, runIdempotent }, done) => {
68524
68531
  );
68525
68532
  done();
68526
68533
  };
68534
+ var agentFields = [
68535
+ "approvalPolicy",
68536
+ "approvalsReviewer",
68537
+ "model",
68538
+ "reasoningEffort",
68539
+ "sandboxMode",
68540
+ "fastMode"
68541
+ ];
68542
+ function createGlobalSettingsWriter(context) {
68543
+ let queue = Promise.resolve();
68544
+ return (settings) => {
68545
+ const result = queue.catch(() => void 0).then(async () => {
68546
+ const current = await context.readEffectiveGlobalSettings();
68547
+ const changed = Object.fromEntries(
68548
+ agentFields.filter((key) => !isDeepStrictEqual(current[key], settings[key])).map((key) => [key, settings[key]])
68549
+ );
68550
+ if (Object.keys(changed).length > 0) await context.provider.updateDefaultSettings(changed);
68551
+ await context.settingsRepository.writeGlobalSettings(settings);
68552
+ return context.readEffectiveGlobalSettings();
68553
+ });
68554
+ queue = result;
68555
+ return result;
68556
+ };
68557
+ }
68527
68558
 
68528
68559
  // packages/server/src/bing-wallpaper.ts
68529
68560
  var BING_ORIGIN = "https://www.bing.com";
@@ -68628,6 +68659,104 @@ function createBingWallpaperService({
68628
68659
  };
68629
68660
  }
68630
68661
 
68662
+ // packages/server/src/bing-wallpaper-catalog.ts
68663
+ var origin = "https://www.bing.com";
68664
+ var metadataUrl = `${origin}/HPImageArchive.aspx?format=js&idx=0&n=8&mkt=zh-CN`;
68665
+ function parseCatalog(value) {
68666
+ if (!value || typeof value !== "object" || !("images" in value) || !Array.isArray(value.images))
68667
+ throw new Error("Invalid Bing wallpaper catalog");
68668
+ return value.images.slice(0, 9).map((item) => {
68669
+ if (!item || typeof item !== "object" || !("startdate" in item) || typeof item.startdate !== "string" || !/^\d{8}$/u.test(item.startdate) || !("url" in item) || typeof item.url !== "string" || !item.url.startsWith("/"))
68670
+ throw new Error("Invalid Bing wallpaper entry");
68671
+ const url = new URL(item.url, origin);
68672
+ if (url.origin !== origin || url.pathname !== "/th")
68673
+ throw new Error("Invalid Bing wallpaper URL");
68674
+ return {
68675
+ day: `${item.startdate.slice(0, 4)}-${item.startdate.slice(4, 6)}-${item.startdate.slice(6)}`,
68676
+ title: "title" in item && typeof item.title === "string" ? item.title : "",
68677
+ copyright: "copyright" in item && typeof item.copyright === "string" ? item.copyright : "",
68678
+ url: url.toString()
68679
+ };
68680
+ });
68681
+ }
68682
+ function createBingWallpaperCatalog(fetcher = (url, init) => fetch(url, init)) {
68683
+ let cached = [];
68684
+ let expires = 0;
68685
+ let pending;
68686
+ const images = /* @__PURE__ */ new Map();
68687
+ const readEntries = () => {
68688
+ if (Date.now() < expires) return Promise.resolve(cached);
68689
+ if (pending) return pending;
68690
+ pending = (async () => {
68691
+ const response = await fetcher(metadataUrl, {
68692
+ redirect: "error",
68693
+ signal: AbortSignal.timeout(1e4)
68694
+ });
68695
+ if (!response.headers.get("content-type")?.startsWith("application/json"))
68696
+ throw new Error("Invalid Bing metadata content type");
68697
+ const entries = parseCatalog(
68698
+ JSON.parse(
68699
+ (await readBoundedBody(response, 64 * 1024, "catalog")).toString("utf8")
68700
+ )
68701
+ );
68702
+ cached = entries;
68703
+ expires = Date.now() + 60 * 6e4;
68704
+ images.clear();
68705
+ return entries;
68706
+ })().finally(() => {
68707
+ pending = void 0;
68708
+ });
68709
+ return pending;
68710
+ };
68711
+ return {
68712
+ async list() {
68713
+ return (await readEntries()).map(({ day, title, copyright }) => ({ day, title, copyright }));
68714
+ },
68715
+ async read(day, thumbnail) {
68716
+ const entries = await readEntries();
68717
+ const entry = entries.find((item) => item.day === day);
68718
+ if (!entry)
68719
+ throw Object.assign(new Error("Bing wallpaper is no longer available"), {
68720
+ statusCode: 404
68721
+ });
68722
+ const key = `${day}:${String(thumbnail)}`;
68723
+ const existing = images.get(key);
68724
+ if (existing) return existing;
68725
+ const promise = (async () => {
68726
+ const url = new URL(entry.url);
68727
+ if (thumbnail) {
68728
+ url.searchParams.set("w", "480");
68729
+ url.searchParams.set("h", "270");
68730
+ }
68731
+ const response = await fetcher(url.toString(), {
68732
+ redirect: "error",
68733
+ signal: AbortSignal.timeout(1e4)
68734
+ });
68735
+ if (!response.headers.get("content-type")?.startsWith("image/jpeg"))
68736
+ throw new Error("Invalid Bing image content type");
68737
+ const body = await readBoundedBody(
68738
+ response,
68739
+ thumbnail ? 2 * 1024 * 1024 : 20 * 1024 * 1024,
68740
+ "image"
68741
+ );
68742
+ if (body.length < 4 || body[0] !== 255 || body[1] !== 216 || body[2] !== 255)
68743
+ throw new Error("Invalid Bing JPEG content");
68744
+ return body;
68745
+ })();
68746
+ images.set(key, promise);
68747
+ void promise.then(
68748
+ () => {
68749
+ if (!thumbnail) images.delete(key);
68750
+ },
68751
+ () => {
68752
+ images.delete(key);
68753
+ }
68754
+ );
68755
+ return promise;
68756
+ }
68757
+ };
68758
+ }
68759
+
68631
68760
  // packages/server/src/routes/runtime-routes.ts
68632
68761
  var APP_UPDATE_HANDLER_TIMEOUT_MS = 15e4;
68633
68762
  var BingWallpaperQuerySchema = {
@@ -68638,6 +68767,29 @@ var BingWallpaperQuerySchema = {
68638
68767
  };
68639
68768
  var registerRuntimeRoutes = (app, context, done) => {
68640
68769
  const bingWallpaper = createBingWallpaperService();
68770
+ const bingCatalog = createBingWallpaperCatalog();
68771
+ app.get(
68772
+ "/v1/workbench-background/bing/catalog",
68773
+ { schema: { response: { 200: BingWallpaperCatalogSchema } } },
68774
+ () => bingCatalog.list()
68775
+ );
68776
+ app.get(
68777
+ "/v1/workbench-background/bing/image",
68778
+ {
68779
+ schema: {
68780
+ querystring: {
68781
+ type: "object",
68782
+ additionalProperties: false,
68783
+ required: ["day"],
68784
+ properties: {
68785
+ day: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$" },
68786
+ thumbnail: { type: "boolean" }
68787
+ }
68788
+ }
68789
+ }
68790
+ },
68791
+ async (request2, reply) => reply.type("image/jpeg").send(await bingCatalog.read(request2.query.day, request2.query.thumbnail ?? false))
68792
+ );
68641
68793
  const {
68642
68794
  assertValidProjectDefaults: assertValidProjectDefaults2,
68643
68795
  capabilities,
@@ -68648,9 +68800,9 @@ var registerRuntimeRoutes = (app, context, done) => {
68648
68800
  readAppInfo,
68649
68801
  readAppUpdateProgress,
68650
68802
  readEffectiveGlobalSettings,
68651
- runIdempotent,
68652
- settingsRepository
68803
+ runIdempotent
68653
68804
  } = context;
68805
+ const writeGlobalSettings = createGlobalSettingsWriter(context);
68654
68806
  app.get("/v1/health", { schema: { response: { 200: HealthResponseSchema } } }, () => ({
68655
68807
  status: "ok",
68656
68808
  version: 1
@@ -68758,7 +68910,7 @@ var registerRuntimeRoutes = (app, context, done) => {
68758
68910
  async () => {
68759
68911
  assertValidProjectDefaults2(await listModels(), request2.body);
68760
68912
  return {
68761
- settings: await settingsRepository.writeGlobalSettings(request2.body)
68913
+ settings: await writeGlobalSettings(request2.body)
68762
68914
  };
68763
68915
  }
68764
68916
  )
@@ -73228,27 +73380,62 @@ function rdatesToString(param, rdates, tzid) {
73228
73380
  }).join(",");
73229
73381
  return "".concat(header).concat(dateString);
73230
73382
  }
73383
+
73384
+ // packages/server/src/scheduled-task-recurrence.ts
73231
73385
  var MIN_RECURRENCE_MS = 6e4;
73232
- function rruleDateTime(unixMs, timezone) {
73233
- const parts = new Intl.DateTimeFormat("en-CA", {
73234
- day: "2-digit",
73235
- hour: "2-digit",
73236
- hour12: false,
73237
- minute: "2-digit",
73238
- month: "2-digit",
73239
- second: "2-digit",
73240
- timeZone: timezone,
73241
- year: "numeric"
73242
- }).formatToParts(unixMs).reduce((result, part) => {
73243
- result[part.type] = part.value;
73244
- return result;
73245
- }, {});
73246
- const requiredPart = (name) => {
73247
- const value = parts[name];
73248
- if (value === void 0) throw new Error(`Scheduled task timezone part ${name} is unavailable`);
73249
- return value;
73386
+ function previewScheduledTask(schedule, afterUnixMs, limit = 5) {
73387
+ if (schedule.type === "once") return schedule.atUnixMs > afterUnixMs ? [schedule.atUnixMs] : [];
73388
+ const normalized = schedule.rrule.trim().replace(/^RRULE:/u, "");
73389
+ if (normalized === "" || /[\r\n]/u.test(normalized))
73390
+ throw new Error("Scheduled task RRULE is invalid");
73391
+ const start = zonedDateTime(schedule.startAtUnixMs, schedule.timezone).replace(/[-:]/gu, "");
73392
+ const rule = rrulestr(`DTSTART:${start}Z
73393
+ RRULE:${normalized}`, { cache: false });
73394
+ const until = rule.options.until?.getTime();
73395
+ const count = rule.options.count;
73396
+ if (!Number.isInteger(rule.options.interval) || rule.options.interval < 1)
73397
+ throw new Error("Scheduled task interval must be a positive integer");
73398
+ if (count !== null && (!Number.isInteger(count) || count < 1 || count > 1e4))
73399
+ throw new Error("Scheduled task count must be between 1 and 10000");
73400
+ if (until !== void 0) {
73401
+ rule.options.until = /* @__PURE__ */ new Date(`${zonedDateTime(until, schedule.timezone)}Z`);
73402
+ }
73403
+ const first2 = rule.all((_date, index) => index < 2);
73404
+ if (first2[0] !== void 0 && first2[1] !== void 0 && first2[1].getTime() - first2[0].getTime() < MIN_RECURRENCE_MS) {
73405
+ throw new Error("Scheduled task recurrence must be at least one minute");
73406
+ }
73407
+ if (until !== void 0 && until <= afterUnixMs) return [];
73408
+ const dates = [];
73409
+ const afterWall = Date.parse(`${zonedDateTime(afterUnixMs, schedule.timezone)}Z`);
73410
+ const lower = new Date(afterWall - 2 * 864e5);
73411
+ if (count === null) {
73412
+ const unit = rule.options.freq === RRule.HOURLY ? 36e5 : rule.options.freq === RRule.DAILY ? 864e5 : rule.options.freq === RRule.WEEKLY ? 7 * 864e5 : void 0;
73413
+ if (unit !== void 0) {
73414
+ const step = unit * rule.options.interval;
73415
+ const anchor = rule.options.dtstart.getTime();
73416
+ const cycles = Math.max(0, Math.floor((lower.getTime() - anchor) / step));
73417
+ rule.options.dtstart = new Date(anchor + cycles * step);
73418
+ }
73419
+ }
73420
+ if (count !== null) {
73421
+ rule.options.count = null;
73422
+ }
73423
+ let occurrences = 0;
73424
+ const accept = (date) => {
73425
+ const unixMs = wallTimeToUnix(date.toISOString().slice(0, 19), schedule.timezone);
73426
+ if (unixMs === void 0) return true;
73427
+ if (unixMs < schedule.startAtUnixMs) return true;
73428
+ if (until !== void 0 && unixMs > until) return false;
73429
+ occurrences += 1;
73430
+ if (unixMs > afterUnixMs) dates.push(unixMs);
73431
+ return dates.length < Math.min(limit, 5) && (count === null || occurrences < count);
73250
73432
  };
73251
- return `${requiredPart("year")}${requiredPart("month")}${requiredPart("day")}T${requiredPart("hour")}${requiredPart("minute")}${requiredPart("second")}`;
73433
+ if (count !== null) {
73434
+ rule.between(rule.options.dtstart, /* @__PURE__ */ new Date("9999-12-31T23:59:59Z"), true, accept);
73435
+ } else {
73436
+ rule.between(lower, /* @__PURE__ */ new Date("9999-12-31T23:59:59Z"), true, accept);
73437
+ }
73438
+ return dates;
73252
73439
  }
73253
73440
  function resolveNextScheduledRun(schedule, afterUnixMs) {
73254
73441
  if (schedule.type === "once") {
@@ -73256,22 +73443,9 @@ function resolveNextScheduledRun(schedule, afterUnixMs) {
73256
73443
  throw new Error("Scheduled task time must be in the future");
73257
73444
  return schedule.atUnixMs;
73258
73445
  }
73259
- const normalized = schedule.rrule.trim().replace(/^RRULE:/u, "");
73260
- if (normalized === "" || /[\r\n]/u.test(normalized)) {
73261
- throw new Error("Scheduled task RRULE is invalid");
73262
- }
73263
- const rule = rrulestr(
73264
- `DTSTART;TZID=${schedule.timezone}:${rruleDateTime(schedule.startAtUnixMs, schedule.timezone)}
73265
- RRULE:${normalized}`,
73266
- { forceset: true }
73267
- );
73268
- const first2 = rule.all((_date, index) => index < 2);
73269
- if (first2[0] !== void 0 && first2[1] !== void 0 && first2[1].getTime() - first2[0].getTime() < MIN_RECURRENCE_MS) {
73270
- throw new Error("Scheduled task recurrence must be at least one minute");
73271
- }
73272
- const next = rule.after(new Date(afterUnixMs), false);
73273
- if (next === null) throw new Error("Scheduled task RRULE has no future occurrence");
73274
- return next.getTime();
73446
+ const next = previewScheduledTask(schedule, afterUnixMs, 1)[0];
73447
+ if (next === void 0) throw new Error("Scheduled task RRULE has no future occurrence");
73448
+ return next;
73275
73449
  }
73276
73450
  function createScheduledTask2(id, input, nowUnixMs) {
73277
73451
  const name = input.name.trim();
@@ -73403,6 +73577,7 @@ function createMemoryScheduledTaskRepository() {
73403
73577
  };
73404
73578
  }
73405
73579
  var ScheduledTaskService = class {
73580
+ #listeners = /* @__PURE__ */ new Set();
73406
73581
  #inFlight = /* @__PURE__ */ new Set();
73407
73582
  #deleteTaskResources;
73408
73583
  #now;
@@ -73440,6 +73615,12 @@ var ScheduledTaskService = class {
73440
73615
  )
73441
73616
  );
73442
73617
  }
73618
+ subscribe(listener) {
73619
+ this.#listeners.add(listener);
73620
+ return () => {
73621
+ this.#listeners.delete(listener);
73622
+ };
73623
+ }
73443
73624
  create(input) {
73444
73625
  return this.#mutate(async () => {
73445
73626
  let task;
@@ -73516,6 +73697,7 @@ var ScheduledTaskService = class {
73516
73697
  }
73517
73698
  async close() {
73518
73699
  this.#closed = true;
73700
+ this.#listeners.clear();
73519
73701
  if (this.#timer !== void 0) clearTimeout(this.#timer);
73520
73702
  await Promise.allSettled(this.#inFlight);
73521
73703
  await this.#mutation;
@@ -73589,8 +73771,13 @@ var ScheduledTaskService = class {
73589
73771
  });
73590
73772
  }
73591
73773
  async #replace(tasks) {
73774
+ if (tasks.length === this.#tasks.length && tasks.every((task, index) => task === this.#tasks[index])) {
73775
+ this.#reschedule();
73776
+ return;
73777
+ }
73592
73778
  this.#tasks = await this.#repository.replaceScheduledTasks(tasks);
73593
73779
  this.#reschedule();
73780
+ for (const listener of this.#listeners) listener();
73594
73781
  }
73595
73782
  async #storeTask(tasks, task) {
73596
73783
  const previous = this.#tasks;
@@ -73612,6 +73799,62 @@ var ScheduledTaskService = class {
73612
73799
  }
73613
73800
  };
73614
73801
 
73802
+ // packages/server/src/routes/scheduled-task-events.ts
73803
+ var change = { type: "scheduled-tasks.changed" };
73804
+ var frame = JSON.stringify(change);
73805
+ function registerScheduledTaskEvents(app, context) {
73806
+ app.get("/v1/scheduled-tasks/events", { websocket: true }, (socket, request2) => {
73807
+ const expiresAt = context.accessService?.expiresAt(request2.cookies[ACCESS_SESSION_COOKIE]);
73808
+ if (context.accessService !== void 0 && expiresAt === void 0) {
73809
+ socket.close(1008, "Access session expired");
73810
+ return;
73811
+ }
73812
+ const cancelExpiry = expiresAt == null ? () => void 0 : scheduleSessionExpiry(socket, expiresAt);
73813
+ let queued = false;
73814
+ let closed = false;
73815
+ const send = () => {
73816
+ if (closed || socket.readyState !== 1) return;
73817
+ if (socket.bufferedAmount > 65536) {
73818
+ socket.close(1013, "Slow client");
73819
+ return;
73820
+ }
73821
+ socket.send(frame, (error) => {
73822
+ if (error) socket.terminate();
73823
+ });
73824
+ };
73825
+ const unsubscribe = context.scheduledTaskService.subscribe(() => {
73826
+ if (queued || closed) return;
73827
+ queued = true;
73828
+ queueMicrotask(() => {
73829
+ queued = false;
73830
+ send();
73831
+ });
73832
+ });
73833
+ let alive = true;
73834
+ socket.on("pong", () => {
73835
+ alive = true;
73836
+ });
73837
+ const heartbeat = setInterval(() => {
73838
+ if (!alive) {
73839
+ socket.terminate();
73840
+ return;
73841
+ }
73842
+ alive = false;
73843
+ socket.ping();
73844
+ }, 3e4);
73845
+ heartbeat.unref();
73846
+ const cleanup = () => {
73847
+ closed = true;
73848
+ unsubscribe();
73849
+ cancelExpiry();
73850
+ clearInterval(heartbeat);
73851
+ };
73852
+ socket.once("close", cleanup);
73853
+ socket.once("error", cleanup);
73854
+ send();
73855
+ });
73856
+ }
73857
+
73615
73858
  // packages/server/src/routes/scheduled-task-routes.ts
73616
73859
  var ParamsSchema = Type.Object(
73617
73860
  { taskId: Type.String({ minLength: 1 }) },
@@ -73623,11 +73866,32 @@ function mapError(error) {
73623
73866
  throw new MutationHttpError("INVALID_REQUEST", error.message, error.code === "busy" ? 409 : 400);
73624
73867
  }
73625
73868
  var registerScheduledTaskRoutes = (app, context, done) => {
73869
+ registerScheduledTaskEvents(app, context);
73626
73870
  const response = {
73627
73871
  400: AgentMutationErrorSchema,
73628
73872
  404: AgentMutationErrorSchema,
73629
73873
  409: AgentMutationErrorSchema
73630
73874
  };
73875
+ app.post(
73876
+ "/v1/scheduled-tasks/preview",
73877
+ {
73878
+ schema: {
73879
+ body: ScheduledTaskPreviewRequestSchema,
73880
+ response: { 200: ScheduledTaskPreviewSchema, 400: AgentMutationErrorSchema }
73881
+ }
73882
+ },
73883
+ (request2) => {
73884
+ try {
73885
+ return { dates: previewScheduledTask(request2.body.schedule, Date.now()) };
73886
+ } catch (error) {
73887
+ throw new MutationHttpError(
73888
+ "INVALID_REQUEST",
73889
+ error instanceof Error ? error.message : String(error),
73890
+ 400
73891
+ );
73892
+ }
73893
+ }
73894
+ );
73631
73895
  app.get(
73632
73896
  "/v1/scheduled-tasks",
73633
73897
  { schema: { response: { 200: ScheduledTaskPageSchema } } },
@@ -73995,9 +74259,9 @@ async function configureServerDelivery(app, options) {
73995
74259
  }
73996
74260
  const browserWrite = !["GET", "HEAD", "OPTIONS"].includes(request2.method) && (sessionId !== void 0 || request2.headers.origin !== void 0);
73997
74261
  if (websocket || browserWrite) {
73998
- const origin = request2.headers.origin;
74262
+ const origin2 = request2.headers.origin;
73999
74263
  try {
74000
- const parsedOrigin = origin === void 0 ? void 0 : new URL(origin);
74264
+ const parsedOrigin = origin2 === void 0 ? void 0 : new URL(origin2);
74001
74265
  if (parsedOrigin === void 0 || parsedOrigin.protocol !== "http:" && parsedOrigin.protocol !== "https:" || parsedOrigin.host !== requestHost.host) {
74002
74266
  throw new Error("Origin mismatch");
74003
74267
  }
@@ -74151,6 +74415,113 @@ function rewriteTemporaryTaskUrl(url) {
74151
74415
  return `/v1/projects/${TEMPORARY_TASK_SCOPE_ID}${suffix}${query}`;
74152
74416
  }
74153
74417
 
74418
+ // packages/server/src/routes/personalization-routes.ts
74419
+ var registerPersonalizationRoutes = (app, context, done) => {
74420
+ const provider = () => {
74421
+ if (!context.provider.personalization)
74422
+ throw new MutationHttpError("PROVIDER_ERROR", "Personalization is unavailable", 503, true);
74423
+ return context.provider.personalization;
74424
+ };
74425
+ const errors = {
74426
+ 409: AgentMutationErrorSchema,
74427
+ 502: AgentMutationErrorSchema,
74428
+ 503: AgentMutationErrorSchema
74429
+ };
74430
+ const run = (key, id, body, action) => context.runIdempotent([key], id, body, async () => {
74431
+ try {
74432
+ return await action();
74433
+ } catch (error) {
74434
+ if (error instanceof MutationHttpError) throw error;
74435
+ if (error instanceof Error && "code" in error && error.code === "GLOBAL_INSTRUCTIONS_CHANGED")
74436
+ throw new MutationHttpError("GLOBAL_INSTRUCTIONS_CHANGED", error.message, 409);
74437
+ throw new MutationHttpError(
74438
+ "PROVIDER_ERROR",
74439
+ error instanceof Error ? error.message : "Personalization request failed",
74440
+ 502,
74441
+ true
74442
+ );
74443
+ }
74444
+ });
74445
+ app.get(
74446
+ "/v1/personalization/instructions",
74447
+ { schema: { response: { 200: GlobalInstructionsSchema } } },
74448
+ () => provider().getGlobalInstructions()
74449
+ );
74450
+ app.get(
74451
+ "/v1/personalization/memories",
74452
+ { schema: { response: { 200: MemorySettingsSchema } } },
74453
+ () => provider().getMemorySettings()
74454
+ );
74455
+ app.get(
74456
+ "/v1/personalization/agent",
74457
+ { schema: { response: { 200: AgentPreferencesSchema } } },
74458
+ () => provider().getAgentPreferences()
74459
+ );
74460
+ app.put(
74461
+ "/v1/personalization/instructions",
74462
+ {
74463
+ schema: {
74464
+ body: SaveGlobalInstructionsSchema,
74465
+ headers: IdempotencyHeadersSchema,
74466
+ response: { 200: GlobalInstructionsSchema, ...errors }
74467
+ }
74468
+ },
74469
+ (request2) => run(
74470
+ "save-global-instructions",
74471
+ request2.headers["idempotency-key"],
74472
+ request2.body,
74473
+ () => provider().saveGlobalInstructions(request2.body)
74474
+ )
74475
+ );
74476
+ app.put(
74477
+ "/v1/personalization/memories",
74478
+ {
74479
+ schema: {
74480
+ body: MemorySettingsUpdateSchema,
74481
+ headers: IdempotencyHeadersSchema,
74482
+ response: { 200: MemorySettingsSchema, ...errors }
74483
+ }
74484
+ },
74485
+ (request2) => run(
74486
+ "update-memory-settings",
74487
+ request2.headers["idempotency-key"],
74488
+ request2.body,
74489
+ () => provider().updateMemorySettings(request2.body)
74490
+ )
74491
+ );
74492
+ app.put(
74493
+ "/v1/personalization/agent",
74494
+ {
74495
+ schema: {
74496
+ body: AgentPreferencesSchema,
74497
+ headers: IdempotencyHeadersSchema,
74498
+ response: { 200: AgentPreferencesSchema, ...errors }
74499
+ }
74500
+ },
74501
+ (request2) => run(
74502
+ "update-agent-preferences",
74503
+ request2.headers["idempotency-key"],
74504
+ request2.body,
74505
+ () => provider().updateAgentPreferences(request2.body)
74506
+ )
74507
+ );
74508
+ app.post(
74509
+ "/v1/personalization/memories/reset",
74510
+ {
74511
+ schema: {
74512
+ body: { type: "object", additionalProperties: false },
74513
+ headers: IdempotencyHeadersSchema,
74514
+ response: { 200: PersonalizationResetSchema, ...errors }
74515
+ }
74516
+ },
74517
+ (request2) => run("reset-memories", request2.headers["idempotency-key"], request2.body, async () => {
74518
+ await provider().resetMemories();
74519
+ return { success: true };
74520
+ })
74521
+ );
74522
+ done();
74523
+ };
74524
+
74154
74525
  // packages/server/src/app.ts
74155
74526
  async function createCodexlyServer(options) {
74156
74527
  const handlerTimeoutMs = options.handlerTimeoutMs ?? DEFAULT_HANDLER_TIMEOUT_MS;
@@ -74289,8 +74660,8 @@ async function createCodexlyServer(options) {
74289
74660
  const readEffectiveGlobalSettings = async (models) => {
74290
74661
  const catalog = models ?? await listModels();
74291
74662
  const stored = await options.settingsRepository.readGlobalSettings();
74292
- const runtimeDefaults = stored === void 0 ? await options.provider.readDefaultSettings() : {};
74293
- const requestedDefaults = stored ?? runtimeDefaults;
74663
+ const runtimeDefaults = await options.provider.readDefaultSettings();
74664
+ const requestedDefaults = { ...stored, ...runtimeDefaults };
74294
74665
  const effectiveModel = resolveProjectDefaults(
74295
74666
  catalog,
74296
74667
  requestedDefaults,
@@ -74312,7 +74683,7 @@ async function createCodexlyServer(options) {
74312
74683
  commitMessageModel: effectiveCommitModel.model,
74313
74684
  commitMessagePrompt: stored?.commitMessagePrompt ?? "",
74314
74685
  defaultOpenAppId: stored?.defaultOpenAppId ?? null,
74315
- fastMode: stored?.fastMode ?? false,
74686
+ fastMode: runtimeDefaults.fastMode ?? stored?.fastMode ?? false,
74316
74687
  followUpBehavior: stored?.followUpBehavior ?? "queue",
74317
74688
  pet: stored?.pet ?? { enabled: false, selectedPetId: null },
74318
74689
  ...effectiveModel
@@ -74499,6 +74870,7 @@ async function createCodexlyServer(options) {
74499
74870
  ...accessService === void 0 ? {} : { service: accessService }
74500
74871
  });
74501
74872
  await app.register(registerRuntimeRoutes, routeContext);
74873
+ await app.register(registerPersonalizationRoutes, routeContext);
74502
74874
  await app.register(registerProviderConnectionRoutes, routeContext);
74503
74875
  await app.register(registerPetRoutes, routeContext);
74504
74876
  await app.register(registerProjectRoutes, routeContext);