@bryanhu/codexly 0.11.1 → 0.12.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 (302) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +5 -3
  3. package/README.zh-CN.md +4 -2
  4. package/dist/{chunk-HHEP4NNE.js → chunk-7C6JMXNO.js} +16870 -3650
  5. package/dist/{chunk-YMFGL4ZR.js → chunk-LZVKMW5Y.js} +422 -130
  6. package/dist/{chunk-GUHYAMAQ.js → chunk-PBPNBQQH.js} +1 -1
  7. package/dist/{chunk-2NJ4CTQP.js → chunk-RGRRUTMD.js} +974 -756
  8. package/dist/cli.js +7 -5
  9. package/dist/client/index.js +113 -4
  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/sqlite-state-worker.js +66 -0
  14. package/dist/web/.vite/manifest.json +392 -280
  15. package/dist/web/.vite/manifest.json.br +0 -0
  16. package/dist/web/.vite/manifest.json.gz +0 -0
  17. package/dist/web/assets/button-group-C4BuwxSd.js +1 -0
  18. package/dist/web/assets/button-group-C4BuwxSd.js.br +0 -0
  19. package/dist/web/assets/button-group-C4BuwxSd.js.gz +0 -0
  20. package/dist/web/assets/{chunk-BO2N2NFS-ng4dbem1.js → chunk-BO2N2NFS-CiutqNGv.js} +7 -7
  21. package/dist/web/assets/chunk-BO2N2NFS-CiutqNGv.js.br +0 -0
  22. package/dist/web/assets/chunk-BO2N2NFS-CiutqNGv.js.gz +0 -0
  23. package/dist/web/assets/{code-highlighter-BMwFeSBd.js → code-highlighter-Bp23lvQ1.js} +1 -1
  24. package/dist/web/assets/code-highlighter-Bp23lvQ1.js.br +0 -0
  25. package/dist/web/assets/code-highlighter-Bp23lvQ1.js.gz +0 -0
  26. package/dist/web/assets/code-languages-DVcuYjhn.js +2 -0
  27. package/dist/web/assets/code-languages-DVcuYjhn.js.br +0 -0
  28. package/dist/web/assets/code-languages-DVcuYjhn.js.gz +0 -0
  29. package/dist/web/assets/context-menu-DBdIkdO8.js +1 -0
  30. package/dist/web/assets/context-menu-DBdIkdO8.js.br +0 -0
  31. package/dist/web/assets/context-menu-DBdIkdO8.js.gz +0 -0
  32. package/dist/web/assets/dist-B5i0uBCy.js +1 -0
  33. package/dist/web/assets/dist-B5i0uBCy.js.br +0 -0
  34. package/dist/web/assets/dist-B5i0uBCy.js.gz +0 -0
  35. package/dist/web/assets/download-iHkzQYEd.js +1 -0
  36. package/dist/web/assets/download-iHkzQYEd.js.br +0 -0
  37. package/dist/web/assets/download-iHkzQYEd.js.gz +0 -0
  38. package/dist/web/assets/{engine-compile-Bqjaa_8Z.js → engine-compile-DcaAFSGO.js} +1 -1
  39. package/dist/web/assets/engine-compile-DcaAFSGO.js.br +0 -0
  40. package/dist/web/assets/engine-compile-DcaAFSGO.js.gz +0 -0
  41. package/dist/web/assets/external-link-xbPJFZkP.js +1 -0
  42. package/dist/web/assets/external-link-xbPJFZkP.js.br +0 -0
  43. package/dist/web/assets/external-link-xbPJFZkP.js.gz +0 -0
  44. package/dist/web/assets/file-code-corner-CYF-BidF.js +1 -0
  45. package/dist/web/assets/file-code-corner-CYF-BidF.js.br +0 -0
  46. package/dist/web/assets/file-code-corner-CYF-BidF.js.gz +0 -0
  47. package/dist/web/assets/file-navigation-view-preference-BRWa_l_a.js +1 -0
  48. package/dist/web/assets/file-navigation-view-preference-BRWa_l_a.js.br +0 -0
  49. package/dist/web/assets/file-navigation-view-preference-BRWa_l_a.js.gz +0 -0
  50. package/dist/web/assets/file-pen-line-B05lVjWh.js +1 -0
  51. package/dist/web/assets/file-pen-line-B05lVjWh.js.br +0 -0
  52. package/dist/web/assets/file-pen-line-B05lVjWh.js.gz +0 -0
  53. package/dist/web/assets/file-review-dialog-CfW8qcnH.js +2 -0
  54. package/dist/web/assets/file-review-dialog-CfW8qcnH.js.br +0 -0
  55. package/dist/web/assets/file-review-dialog-CfW8qcnH.js.gz +0 -0
  56. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js +1 -0
  57. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js.br +0 -0
  58. package/dist/web/assets/git-commit-horizontal-CV-KjCHw.js.gz +0 -0
  59. package/dist/web/assets/git-history-panel-DDCwLZ_v.js +2 -0
  60. package/dist/web/assets/git-history-panel-DDCwLZ_v.js.br +0 -0
  61. package/dist/web/assets/git-history-panel-DDCwLZ_v.js.gz +0 -0
  62. package/dist/web/assets/global-settings-dialog-Cw-2IvEc.js +1 -0
  63. package/dist/web/assets/global-settings-dialog-Cw-2IvEc.js.br +0 -0
  64. package/dist/web/assets/global-settings-dialog-Cw-2IvEc.js.gz +0 -0
  65. package/dist/web/assets/{highlighted-body-OFNGDK62-UIjGvJpu.js → highlighted-body-OFNGDK62-jfqTT7Zz.js} +1 -1
  66. package/dist/web/assets/highlighted-body-OFNGDK62-jfqTT7Zz.js.br +0 -0
  67. package/dist/web/assets/highlighted-body-OFNGDK62-jfqTT7Zz.js.gz +0 -0
  68. package/dist/web/assets/index-DZEhkOZz.js +4 -0
  69. package/dist/web/assets/index-DZEhkOZz.js.br +0 -0
  70. package/dist/web/assets/index-DZEhkOZz.js.gz +0 -0
  71. package/dist/web/assets/index-mb9dY6_F.css +2 -0
  72. package/dist/web/assets/index-mb9dY6_F.css.br +0 -0
  73. package/dist/web/assets/index-mb9dY6_F.css.gz +0 -0
  74. package/dist/web/assets/initial-deps-BsEyuMB0.js +1 -0
  75. package/dist/web/assets/initial-deps-BsEyuMB0.js.br +0 -0
  76. package/dist/web/assets/initial-deps-BsEyuMB0.js.gz +0 -0
  77. package/dist/web/assets/initial-deps-Bx4af_YG.js +1 -0
  78. package/dist/web/assets/initial-deps-Bx4af_YG.js.br +0 -0
  79. package/dist/web/assets/initial-deps-Bx4af_YG.js.gz +0 -0
  80. package/dist/web/assets/initial-deps-CNK9MBOP.js +1 -0
  81. package/dist/web/assets/initial-deps-CNK9MBOP.js.br +0 -0
  82. package/dist/web/assets/initial-deps-CNK9MBOP.js.gz +0 -0
  83. package/dist/web/assets/initial-deps-CTprc_pY.js +1 -0
  84. package/dist/web/assets/initial-deps-CTprc_pY.js.br +0 -0
  85. package/dist/web/assets/initial-deps-CTprc_pY.js.gz +0 -0
  86. package/dist/web/assets/initial-deps-Ccn2HMTB.js +1 -0
  87. package/dist/web/assets/initial-deps-Ccn2HMTB.js.br +0 -0
  88. package/dist/web/assets/initial-deps-Ccn2HMTB.js.gz +0 -0
  89. package/dist/web/assets/initial-deps-Cq4pSOi-.js +1 -0
  90. package/dist/web/assets/initial-deps-Cq4pSOi-.js.br +0 -0
  91. package/dist/web/assets/initial-deps-Cq4pSOi-.js.gz +0 -0
  92. package/dist/web/assets/initial-deps-D1tR2tqv.js +1 -0
  93. package/dist/web/assets/initial-deps-D1tR2tqv.js.br +0 -0
  94. package/dist/web/assets/initial-deps-D1tR2tqv.js.gz +0 -0
  95. package/dist/web/assets/initial-deps-DqJTHr9A.js +41 -0
  96. package/dist/web/assets/initial-deps-DqJTHr9A.js.br +0 -0
  97. package/dist/web/assets/initial-deps-DqJTHr9A.js.gz +0 -0
  98. package/dist/web/assets/lazy-message-response-SxI8Oz6v.js +2 -0
  99. package/dist/web/assets/lazy-message-response-SxI8Oz6v.js.br +0 -0
  100. package/dist/web/assets/lazy-message-response-SxI8Oz6v.js.gz +0 -0
  101. package/dist/web/assets/{lib-DrPFkMXk.js → lib-DE0ZEvGM.js} +1 -1
  102. package/dist/web/assets/lib-DE0ZEvGM.js.br +0 -0
  103. package/dist/web/assets/lib-DE0ZEvGM.js.gz +0 -0
  104. package/dist/web/assets/mermaid-GHXKKRXX-BNLLThfI.js +1 -0
  105. package/dist/web/assets/mermaid-GHXKKRXX-BNLLThfI.js.br +0 -0
  106. package/dist/web/assets/mermaid-GHXKKRXX-BNLLThfI.js.gz +0 -0
  107. package/dist/web/assets/message-response-CTSQq8Ae.js +7 -0
  108. package/dist/web/assets/message-response-CTSQq8Ae.js.br +0 -0
  109. package/dist/web/assets/message-response-CTSQq8Ae.js.gz +0 -0
  110. package/dist/web/assets/{patch-diff-viewer-BnoOysqK.js → patch-diff-viewer-CwDRm5oN.js} +3 -3
  111. package/dist/web/assets/patch-diff-viewer-CwDRm5oN.js.br +0 -0
  112. package/dist/web/assets/patch-diff-viewer-CwDRm5oN.js.gz +0 -0
  113. package/dist/web/assets/{project-file-popup-page-C5dOvxw_.js → project-file-popup-page-DX-AlvxF.js} +1 -1
  114. package/dist/web/assets/project-file-popup-page-DX-AlvxF.js.br +0 -0
  115. package/dist/web/assets/project-file-popup-page-DX-AlvxF.js.gz +0 -0
  116. package/dist/web/assets/project-source-panel-i4xpffAa.js +3 -0
  117. package/dist/web/assets/project-source-panel-i4xpffAa.js.br +0 -0
  118. package/dist/web/assets/project-source-panel-i4xpffAa.js.gz +0 -0
  119. package/dist/web/assets/prompt-input-CL1AA6_U.js +1 -0
  120. package/dist/web/assets/prompt-input-CL1AA6_U.js.br +0 -0
  121. package/dist/web/assets/prompt-input-CL1AA6_U.js.gz +0 -0
  122. package/dist/web/assets/prompt-input-controls-Qsp2rk3i.js +1 -0
  123. package/dist/web/assets/prompt-input-controls-Qsp2rk3i.js.br +0 -0
  124. package/dist/web/assets/prompt-input-controls-Qsp2rk3i.js.gz +0 -0
  125. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js +1 -0
  126. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.br +0 -0
  127. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.gz +0 -0
  128. package/dist/web/assets/{react-runtime-CVaUQXZF.js → react-runtime-DaCTDC27.js} +1 -1
  129. package/dist/web/assets/react-runtime-DaCTDC27.js.br +0 -0
  130. package/dist/web/assets/react-runtime-DaCTDC27.js.gz +0 -0
  131. package/dist/web/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  132. package/dist/web/assets/rolldown-runtime-CNC7AqOf.js.br +0 -0
  133. package/dist/web/assets/rolldown-runtime-CNC7AqOf.js.gz +0 -0
  134. package/dist/web/assets/scheduled-task-date-time-picker-B2_XJQa7.js +1 -0
  135. package/dist/web/assets/scheduled-task-date-time-picker-B2_XJQa7.js.br +0 -0
  136. package/dist/web/assets/scheduled-task-date-time-picker-B2_XJQa7.js.gz +0 -0
  137. package/dist/web/assets/scheduled-task-date-time-picker-Wk3Ob2xl.css +1 -0
  138. package/dist/web/assets/scheduled-task-date-time-picker-Wk3Ob2xl.css.br +0 -0
  139. package/dist/web/assets/scheduled-task-date-time-picker-Wk3Ob2xl.css.gz +0 -0
  140. package/dist/web/assets/scheduled-task-floating-ui~index~workbench-shell~skills-market-container~workbench-inspecto~y5cwo2qi-DAfditVv.js +1 -0
  141. package/dist/web/assets/scheduled-task-floating-ui~index~workbench-shell~skills-market-container~workbench-inspecto~y5cwo2qi-DAfditVv.js.br +0 -0
  142. package/dist/web/assets/scheduled-task-floating-ui~index~workbench-shell~skills-market-container~workbench-inspecto~y5cwo2qi-DAfditVv.js.gz +0 -0
  143. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-BQ-Lfxrf.js +1 -0
  144. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-BQ-Lfxrf.js.br +0 -0
  145. package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-BQ-Lfxrf.js.gz +0 -0
  146. package/dist/web/assets/scheduled-task-schedule-DVyf2brf.js +1 -0
  147. package/dist/web/assets/scheduled-task-schedule-DVyf2brf.js.br +0 -0
  148. package/dist/web/assets/scheduled-task-schedule-DVyf2brf.js.gz +0 -0
  149. package/dist/web/assets/scheduled-tasks-container-DWk8eU-x.js +2 -0
  150. package/dist/web/assets/scheduled-tasks-container-DWk8eU-x.js.br +0 -0
  151. package/dist/web/assets/scheduled-tasks-container-DWk8eU-x.js.gz +0 -0
  152. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css +1 -0
  153. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css.br +0 -0
  154. package/dist/web/assets/scheduled-tasks-container-xtJWjMjU.css.gz +0 -0
  155. package/dist/web/assets/{shiki-bundle-CGkIRfLa.js → shiki-bundle-DdeD2OLK.js} +1 -1
  156. package/dist/web/assets/shiki-bundle-DdeD2OLK.js.br +0 -0
  157. package/dist/web/assets/shiki-bundle-DdeD2OLK.js.gz +0 -0
  158. package/dist/web/assets/skills-market-container-C9djEXQt.css +1 -0
  159. package/dist/web/assets/skills-market-container-C9djEXQt.css.br +0 -0
  160. package/dist/web/assets/skills-market-container-C9djEXQt.css.gz +0 -0
  161. package/dist/web/assets/skills-market-container-DGLB9mLM.js +1 -0
  162. package/dist/web/assets/skills-market-container-DGLB9mLM.js.br +0 -0
  163. package/dist/web/assets/skills-market-container-DGLB9mLM.js.gz +0 -0
  164. package/dist/web/assets/sparkles-BLY9rqMO.js +1 -0
  165. package/dist/web/assets/sparkles-BLY9rqMO.js.br +0 -0
  166. package/dist/web/assets/sparkles-BLY9rqMO.js.gz +0 -0
  167. package/dist/web/assets/upload-D_8Uk8f-.js +1 -0
  168. package/dist/web/assets/upload-D_8Uk8f-.js.br +0 -0
  169. package/dist/web/assets/upload-D_8Uk8f-.js.gz +0 -0
  170. package/dist/web/assets/workbench-composer-BD9Ki4HB.js +10 -0
  171. package/dist/web/assets/workbench-composer-BD9Ki4HB.js.br +0 -0
  172. package/dist/web/assets/workbench-composer-BD9Ki4HB.js.gz +0 -0
  173. package/dist/web/assets/workbench-inspector-changes-DAh6jOqk.js +2 -0
  174. package/dist/web/assets/workbench-inspector-changes-DAh6jOqk.js.br +0 -0
  175. package/dist/web/assets/workbench-inspector-changes-DAh6jOqk.js.gz +0 -0
  176. package/dist/web/assets/workbench-pet-canvas-BDehkHlv.js +1 -0
  177. package/dist/web/assets/workbench-pet-canvas-BDehkHlv.js.br +0 -0
  178. package/dist/web/assets/workbench-pet-canvas-BDehkHlv.js.gz +0 -0
  179. package/dist/web/assets/workbench-shell-3eEtoMzo.js +8 -0
  180. package/dist/web/assets/workbench-shell-3eEtoMzo.js.br +0 -0
  181. package/dist/web/assets/workbench-shell-3eEtoMzo.js.gz +0 -0
  182. package/dist/web/index.html +13 -15
  183. package/dist/web/index.html.br +0 -0
  184. package/dist/web/index.html.gz +0 -0
  185. package/package.json +2 -2
  186. package/dist/web/assets/bundle-mjs-rHxsej31.js +0 -1
  187. package/dist/web/assets/bundle-mjs-rHxsej31.js.br +0 -0
  188. package/dist/web/assets/bundle-mjs-rHxsej31.js.gz +0 -0
  189. package/dist/web/assets/button-group-Bt_Rr9-f.js +0 -1
  190. package/dist/web/assets/button-group-Bt_Rr9-f.js.br +0 -0
  191. package/dist/web/assets/button-group-Bt_Rr9-f.js.gz +0 -0
  192. package/dist/web/assets/check-C92ZHwwX.js +0 -1
  193. package/dist/web/assets/check-C92ZHwwX.js.br +0 -0
  194. package/dist/web/assets/check-C92ZHwwX.js.gz +0 -0
  195. package/dist/web/assets/checkbox-BBHD70U-.js +0 -1
  196. package/dist/web/assets/checkbox-BBHD70U-.js.br +0 -0
  197. package/dist/web/assets/checkbox-BBHD70U-.js.gz +0 -0
  198. package/dist/web/assets/chunk-BO2N2NFS-ng4dbem1.js.br +0 -0
  199. package/dist/web/assets/chunk-BO2N2NFS-ng4dbem1.js.gz +0 -0
  200. package/dist/web/assets/code-highlighter-BMwFeSBd.js.br +0 -0
  201. package/dist/web/assets/code-highlighter-BMwFeSBd.js.gz +0 -0
  202. package/dist/web/assets/code-languages-rKSHZYzu.js +0 -2
  203. package/dist/web/assets/code-languages-rKSHZYzu.js.br +0 -0
  204. package/dist/web/assets/code-languages-rKSHZYzu.js.gz +0 -0
  205. package/dist/web/assets/context-menu-03SuSeWI.js +0 -1
  206. package/dist/web/assets/context-menu-03SuSeWI.js.br +0 -0
  207. package/dist/web/assets/context-menu-03SuSeWI.js.gz +0 -0
  208. package/dist/web/assets/dist-B_DB3jSu.js +0 -1
  209. package/dist/web/assets/dist-B_DB3jSu.js.br +0 -0
  210. package/dist/web/assets/dist-B_DB3jSu.js.gz +0 -0
  211. package/dist/web/assets/dist-DBbCRukl.js +0 -1
  212. package/dist/web/assets/dist-DBbCRukl.js.br +0 -0
  213. package/dist/web/assets/dist-DBbCRukl.js.gz +0 -0
  214. package/dist/web/assets/engine-compile-Bqjaa_8Z.js.br +0 -0
  215. package/dist/web/assets/engine-compile-Bqjaa_8Z.js.gz +0 -0
  216. package/dist/web/assets/es2015-BUwabepB.js +0 -41
  217. package/dist/web/assets/es2015-BUwabepB.js.br +0 -0
  218. package/dist/web/assets/es2015-BUwabepB.js.gz +0 -0
  219. package/dist/web/assets/file-code-corner-CJDhFrYy.js +0 -1
  220. package/dist/web/assets/file-code-corner-CJDhFrYy.js.br +0 -3
  221. package/dist/web/assets/file-code-corner-CJDhFrYy.js.gz +0 -0
  222. package/dist/web/assets/file-navigation-view-preference-DeIXQ8c4.js +0 -1
  223. package/dist/web/assets/file-navigation-view-preference-DeIXQ8c4.js.br +0 -0
  224. package/dist/web/assets/file-navigation-view-preference-DeIXQ8c4.js.gz +0 -0
  225. package/dist/web/assets/file-review-dialog-L7snJJP8.js +0 -2
  226. package/dist/web/assets/file-review-dialog-L7snJJP8.js.br +0 -0
  227. package/dist/web/assets/file-review-dialog-L7snJJP8.js.gz +0 -0
  228. package/dist/web/assets/file-tree-DvTv0Re2.js +0 -1
  229. package/dist/web/assets/file-tree-DvTv0Re2.js.br +0 -0
  230. package/dist/web/assets/file-tree-DvTv0Re2.js.gz +0 -0
  231. package/dist/web/assets/git-commit-horizontal-hgIO8zJZ.js +0 -1
  232. package/dist/web/assets/git-commit-horizontal-hgIO8zJZ.js.br +0 -0
  233. package/dist/web/assets/git-commit-horizontal-hgIO8zJZ.js.gz +0 -0
  234. package/dist/web/assets/git-history-panel-DZY20FzY.js +0 -2
  235. package/dist/web/assets/git-history-panel-DZY20FzY.js.br +0 -0
  236. package/dist/web/assets/git-history-panel-DZY20FzY.js.gz +0 -0
  237. package/dist/web/assets/global-settings-dialog-cA1SWDdi.js +0 -1
  238. package/dist/web/assets/global-settings-dialog-cA1SWDdi.js.br +0 -0
  239. package/dist/web/assets/global-settings-dialog-cA1SWDdi.js.gz +0 -0
  240. package/dist/web/assets/highlighted-body-OFNGDK62-UIjGvJpu.js.br +0 -0
  241. package/dist/web/assets/highlighted-body-OFNGDK62-UIjGvJpu.js.gz +0 -0
  242. package/dist/web/assets/index-CldcNq0q.css +0 -2
  243. package/dist/web/assets/index-CldcNq0q.css.br +0 -0
  244. package/dist/web/assets/index-CldcNq0q.css.gz +0 -0
  245. package/dist/web/assets/index-WZ8-8oYp.js +0 -4
  246. package/dist/web/assets/index-WZ8-8oYp.js.br +0 -0
  247. package/dist/web/assets/index-WZ8-8oYp.js.gz +0 -0
  248. package/dist/web/assets/lazy-message-response-SjU6ZsaR.js +0 -2
  249. package/dist/web/assets/lazy-message-response-SjU6ZsaR.js.br +0 -0
  250. package/dist/web/assets/lazy-message-response-SjU6ZsaR.js.gz +0 -0
  251. package/dist/web/assets/lib-DrPFkMXk.js.br +0 -0
  252. package/dist/web/assets/lib-DrPFkMXk.js.gz +0 -0
  253. package/dist/web/assets/loader-circle-CJOhkEC8.js +0 -1
  254. package/dist/web/assets/loader-circle-CJOhkEC8.js.br +0 -0
  255. package/dist/web/assets/loader-circle-CJOhkEC8.js.gz +0 -0
  256. package/dist/web/assets/mermaid-GHXKKRXX-CDYc39nv.js +0 -1
  257. package/dist/web/assets/mermaid-GHXKKRXX-CDYc39nv.js.br +0 -0
  258. package/dist/web/assets/mermaid-GHXKKRXX-CDYc39nv.js.gz +0 -0
  259. package/dist/web/assets/message-response-BXln58hx.js +0 -7
  260. package/dist/web/assets/message-response-BXln58hx.js.br +0 -0
  261. package/dist/web/assets/message-response-BXln58hx.js.gz +0 -0
  262. package/dist/web/assets/patch-diff-viewer-BnoOysqK.js.br +0 -0
  263. package/dist/web/assets/patch-diff-viewer-BnoOysqK.js.gz +0 -0
  264. package/dist/web/assets/project-file-popup-page-C5dOvxw_.js.br +0 -0
  265. package/dist/web/assets/project-file-popup-page-C5dOvxw_.js.gz +0 -0
  266. package/dist/web/assets/project-source-panel-CDrU5_qN.js +0 -3
  267. package/dist/web/assets/project-source-panel-CDrU5_qN.js.br +0 -0
  268. package/dist/web/assets/project-source-panel-CDrU5_qN.js.gz +0 -0
  269. package/dist/web/assets/prompt-input-controls-C_Zm2pL8.js +0 -1
  270. package/dist/web/assets/prompt-input-controls-C_Zm2pL8.js.br +0 -0
  271. package/dist/web/assets/prompt-input-controls-C_Zm2pL8.js.gz +0 -0
  272. package/dist/web/assets/prompt-reference-token-XDhhAENk.js +0 -1
  273. package/dist/web/assets/prompt-reference-token-XDhhAENk.js.br +0 -0
  274. package/dist/web/assets/prompt-reference-token-XDhhAENk.js.gz +0 -0
  275. package/dist/web/assets/provider-connection-queries-BBs1XjP6.js +0 -1
  276. package/dist/web/assets/provider-connection-queries-BBs1XjP6.js.br +0 -0
  277. package/dist/web/assets/provider-connection-queries-BBs1XjP6.js.gz +0 -0
  278. package/dist/web/assets/react-runtime-CVaUQXZF.js.br +0 -0
  279. package/dist/web/assets/react-runtime-CVaUQXZF.js.gz +0 -0
  280. package/dist/web/assets/rolldown-runtime-QTnfLwEv.js +0 -1
  281. package/dist/web/assets/rolldown-runtime-QTnfLwEv.js.br +0 -0
  282. package/dist/web/assets/rolldown-runtime-QTnfLwEv.js.gz +0 -0
  283. package/dist/web/assets/shiki-bundle-CGkIRfLa.js.br +0 -0
  284. package/dist/web/assets/shiki-bundle-CGkIRfLa.js.gz +0 -0
  285. package/dist/web/assets/tooltip-BPVbHVEF.js +0 -1
  286. package/dist/web/assets/tooltip-BPVbHVEF.js.br +0 -0
  287. package/dist/web/assets/tooltip-BPVbHVEF.js.gz +0 -0
  288. package/dist/web/assets/upload-Bz26q2Ar.js +0 -1
  289. package/dist/web/assets/upload-Bz26q2Ar.js.br +0 -0
  290. package/dist/web/assets/upload-Bz26q2Ar.js.gz +0 -0
  291. package/dist/web/assets/useInfiniteQuery-DJg78OO5.js +0 -1
  292. package/dist/web/assets/useInfiniteQuery-DJg78OO5.js.br +0 -0
  293. package/dist/web/assets/useInfiniteQuery-DJg78OO5.js.gz +0 -0
  294. package/dist/web/assets/workbench-inspector-changes-B4eOJNJh.js +0 -2
  295. package/dist/web/assets/workbench-inspector-changes-B4eOJNJh.js.br +0 -0
  296. package/dist/web/assets/workbench-inspector-changes-B4eOJNJh.js.gz +0 -0
  297. package/dist/web/assets/workbench-pet-canvas-C_XAi7ez.js +0 -1
  298. package/dist/web/assets/workbench-pet-canvas-C_XAi7ez.js.br +0 -0
  299. package/dist/web/assets/workbench-pet-canvas-C_XAi7ez.js.gz +0 -0
  300. package/dist/web/assets/workbench-shell-DQbj_ooS.js +0 -15
  301. package/dist/web/assets/workbench-shell-DQbj_ooS.js.br +0 -0
  302. package/dist/web/assets/workbench-shell-DQbj_ooS.js.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'node:module';
2
2
  import { WorkbenchPetProviderError, PendingRequestResolutionError } from './chunk-RNTA4MFS.js';
3
- import { TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_HISTORY_IMAGE_TOTAL_BYTES, isAgentFastModeAvailable, MAX_REALTIME_FILE_CHANGES, MAX_REALTIME_DIFF_BYTES, stripLeadingAgentSkillReferences, MAX_AGENT_HISTORY_IMAGES, MAX_AGENT_TEXT_BYTES } from './chunk-2NJ4CTQP.js';
3
+ import { TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_HISTORY_IMAGE_TOTAL_BYTES, isAgentFastModeAvailable, MAX_REALTIME_FILE_CHANGES, MAX_REALTIME_DIFF_BYTES, stripLeadingAgentSkillReferences, MAX_AGENT_HISTORY_IMAGES, MAX_AGENT_TEXT_BYTES } from './chunk-RGRRUTMD.js';
4
4
  import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
5
5
  import { execFile, spawn } from 'child_process';
6
6
  import { constants, mkdtempSync, rmSync, createReadStream, mkdirSync, unlinkSync, renameSync, writeFileSync, openSync, readSync, closeSync, statSync } from 'fs';
@@ -4466,7 +4466,8 @@ var require_pino = __commonJS({
4466
4466
  }
4467
4467
  });
4468
4468
  var execFileAsync = promisify(execFile);
4469
- var SUPPORTED_CODEX_VERSION = "0.151.0";
4469
+ var SUPPORTED_CODEX_VERSION = "0.153.4";
4470
+ var SUPPORTED_CODEX_VERSION_RANGE = ">=0.153.4,<0.154.0";
4470
4471
  var BUNDLED_CODEX_TARGETS = {
4471
4472
  "darwin-arm64": {
4472
4473
  executableName: "codex",
@@ -4580,7 +4581,9 @@ async function locateCodexBinary(options = {}) {
4580
4581
  if (pathBinary) {
4581
4582
  return { path: resolve(pathBinary), source: "path" };
4582
4583
  }
4583
- throw new Error("Codex binary was not found; install @openai/codex or configure --codex-bin");
4584
+ throw new Error(
4585
+ `Codex binary was not found; install @openai/codex@${SUPPORTED_CODEX_VERSION} or configure --codex-bin`
4586
+ );
4584
4587
  }
4585
4588
  async function executeCodexVersion(binaryPath) {
4586
4589
  const { stdout } = await execFileAsync(binaryPath, ["--version"], {
@@ -4604,8 +4607,12 @@ async function checkCodexVersion(binaryPath, options = {}) {
4604
4607
  if (!version) {
4605
4608
  throw new Error(`Invalid Codex version output: ${raw || "<empty>"}`);
4606
4609
  }
4607
- if (version !== SUPPORTED_CODEX_VERSION) {
4608
- throw new Error(`Unsupported Codex version ${version}; expected ${SUPPORTED_CODEX_VERSION}`);
4610
+ const [major, minor, patch] = version.split("-", 1)[0]?.split(".").map(Number) ?? [];
4611
+ const isPrerelease = version.includes("-");
4612
+ if (major !== 0 || minor !== 153 || patch === void 0 || patch < 4 || isPrerelease) {
4613
+ throw new Error(
4614
+ `Unsupported Codex version ${version}; expected ${SUPPORTED_CODEX_VERSION_RANGE}`
4615
+ );
4609
4616
  }
4610
4617
  return { raw, version };
4611
4618
  }
@@ -4617,6 +4624,7 @@ var CodexProtocolMappingError = class extends Error {
4617
4624
  };
4618
4625
  var MAX_COMMAND_OUTPUT_BYTES = 1048576;
4619
4626
  var MAX_COMMAND_OUTPUT_LINES = 1e4;
4627
+ var CODEX_THREAD_CONFIG = Object.freeze({ "tools.update_plan.enabled": true });
4620
4628
  var CODEX_MAPPED_NOTIFICATION_METHODS = /* @__PURE__ */ new Set([
4621
4629
  "error",
4622
4630
  "guardianWarning",
@@ -4674,6 +4682,8 @@ var CODEX_IGNORED_NOTIFICATION_METHODS = /* @__PURE__ */ new Set([
4674
4682
  "item/fileChange/outputDelta",
4675
4683
  "mcpServer/oauthLogin/completed",
4676
4684
  "mcpServer/event/stream/notification",
4685
+ "modelProvider/authRecoveryCompleted",
4686
+ "modelProvider/authRecoveryStarted",
4677
4687
  "process/exited",
4678
4688
  "process/outputDelta",
4679
4689
  "rawResponse/completed",
@@ -5094,7 +5104,7 @@ function mapMcpServerElicitationRequest(serverRequest, project) {
5094
5104
  type: "mcp_elicitation"
5095
5105
  };
5096
5106
  const mode = expectString(params["mode"], "MCP elicitation mode");
5097
- const request = mode === "form" ? { ...identity, fields: mapFormFields(params["requestedSchema"]), mode } : mode === "url" ? { ...identity, mode, url: mapSafeUrl(params["url"]) } : mode === "openai/form" ? { ...identity, mode: "unsupported" } : (() => {
5107
+ const request = mode === "form" ? { ...identity, fields: mapFormFields(params["requestedSchema"]), mode } : mode === "url" ? { ...identity, mode, url: mapSafeUrl(params["url"]) } : mode === "openai/form" || mode === "openaiForm" ? { ...identity, mode: "unsupported" } : (() => {
5098
5108
  throw new CodexProtocolMappingError("MCP elicitation mode is unsupported");
5099
5109
  })();
5100
5110
  return { providerRequestId: serverRequest.id, request };
@@ -6291,6 +6301,37 @@ function mapApprovalReviewAction(value) {
6291
6301
  }
6292
6302
  throw new CodexProtocolMappingError("Codex automatic approval review action type is invalid");
6293
6303
  }
6304
+ function mapAsyncUserInputQuestions(value) {
6305
+ if (value === null) {
6306
+ return void 0;
6307
+ }
6308
+ if (!Array.isArray(value)) {
6309
+ throw new CodexProtocolMappingError("Codex agent message questions must be an array or null");
6310
+ }
6311
+ return value.map((questionValue) => {
6312
+ const question = expectRecord(questionValue, "Codex asynchronous user input question");
6313
+ const title = expectString(question["title"], "Codex asynchronous user input question title");
6314
+ const options = question["options"];
6315
+ if (options !== null && !Array.isArray(options)) {
6316
+ throw new CodexProtocolMappingError(
6317
+ "Codex asynchronous user input question options must be an array or null"
6318
+ );
6319
+ }
6320
+ if (Array.isArray(options)) {
6321
+ for (const option of options) {
6322
+ if (typeof option !== "string") {
6323
+ throw new CodexProtocolMappingError(
6324
+ "Codex asynchronous user input question options must contain only strings"
6325
+ );
6326
+ }
6327
+ }
6328
+ }
6329
+ return {
6330
+ title,
6331
+ options: options === null ? null : options.map((option) => expectString(option, "Codex asynchronous user input option"))
6332
+ };
6333
+ });
6334
+ }
6294
6335
  function mapApprovalReviewItem(params) {
6295
6336
  const review = expectRecord(params["review"], "Codex automatic approval review");
6296
6337
  const riskLevel = optionalString(review["riskLevel"]);
@@ -6334,6 +6375,7 @@ function mapAgentItem(value, subagentNicknames = /* @__PURE__ */ new Map(), mapI
6334
6375
  }
6335
6376
  case "agentMessage": {
6336
6377
  const text = expectString(item["text"], "Codex agent message text");
6378
+ const questions = mapAsyncUserInputQuestions(item["questions"]);
6337
6379
  if (item["delivery"] !== null && item["delivery"] !== "async") {
6338
6380
  throw new CodexProtocolMappingError("Codex agent message delivery must be async or null");
6339
6381
  }
@@ -6341,6 +6383,7 @@ function mapAgentItem(value, subagentNicknames = /* @__PURE__ */ new Map(), mapI
6341
6383
  return {
6342
6384
  id,
6343
6385
  ...phase === void 0 ? {} : { phase },
6386
+ ...questions === void 0 ? {} : { questions },
6344
6387
  role: "assistant",
6345
6388
  text,
6346
6389
  type: "message"
@@ -6482,6 +6525,60 @@ function normalizedTitle(thread) {
6482
6525
  const preview = optionalString(thread["preview"])?.trim().split(/\r?\n/u)[0]?.trim();
6483
6526
  return preview?.length ? preview : "\u65B0\u804A\u5929";
6484
6527
  }
6528
+ var CODEX_PINNED_THREAD_SECTION_ID = "01984de2-8f74-7c91-a3b2-5c5e937cf318";
6529
+ function isPinnedThreadSection(value) {
6530
+ if (value === null) return false;
6531
+ const section = expectRecord(value, "Codex thread section");
6532
+ const sectionId = expectString(section["id"], "Codex thread section id");
6533
+ expectString(section["name"], "Codex thread section name");
6534
+ const appearance = section["appearance"];
6535
+ if (appearance !== null && (!isRecord(appearance) || appearance["icon"] !== null && typeof appearance["icon"] !== "string" || appearance["color"] !== null && typeof appearance["color"] !== "string")) {
6536
+ throw new CodexProtocolMappingError("Codex thread section appearance is invalid");
6537
+ }
6538
+ return sectionId === CODEX_PINNED_THREAD_SECTION_ID;
6539
+ }
6540
+ function isProjectThread(thread, project) {
6541
+ const nativeProjectId = thread["projectId"];
6542
+ if (nativeProjectId !== null && typeof nativeProjectId !== "string") {
6543
+ throw new CodexProtocolMappingError("Codex thread projectId must be a string or null");
6544
+ }
6545
+ if (project.kind === "project") {
6546
+ return nativeProjectId === project.id;
6547
+ }
6548
+ if (nativeProjectId !== null) {
6549
+ return false;
6550
+ }
6551
+ return true;
6552
+ }
6553
+ function assertProjectThread(thread, project) {
6554
+ if (!isProjectThread(thread, project)) {
6555
+ return Promise.reject(
6556
+ new CodexProtocolMappingError("Codex thread does not belong to the active project")
6557
+ );
6558
+ }
6559
+ return Promise.resolve();
6560
+ }
6561
+ async function mapAgentTask(thread, project) {
6562
+ await assertProjectThread(thread, project);
6563
+ if (thread["model"] !== null && typeof thread["model"] !== "string") {
6564
+ throw new CodexProtocolMappingError("Codex thread model must be a string or null");
6565
+ }
6566
+ if (thread["reasoningEffort"] !== null && typeof thread["reasoningEffort"] !== "string") {
6567
+ throw new CodexProtocolMappingError("Codex thread reasoningEffort must be a string or null");
6568
+ }
6569
+ return {
6570
+ id: expectString(thread["id"], "Codex thread id"),
6571
+ pinned: isPinnedThreadSection(thread["section"]),
6572
+ projectId: project.id,
6573
+ // 线程配置来自原生元数据,与应用内保存的下次提交设置分别保留。
6574
+ threadConfiguration: {
6575
+ model: thread["model"],
6576
+ reasoningEffort: thread["reasoningEffort"]
6577
+ },
6578
+ title: normalizedTitle(thread),
6579
+ updatedAt: toDateTime(thread["updatedAt"], "Codex thread updatedAt")
6580
+ };
6581
+ }
6485
6582
  function mapAgentModel(value) {
6486
6583
  const model = expectRecord(value, "Codex model");
6487
6584
  const multiAgentVersion = model["multiAgentVersion"];
@@ -8991,20 +9088,6 @@ async function releaseCodexProjectThreads(client, logger, projectId, taskIds) {
8991
9088
  }
8992
9089
 
8993
9090
  // packages/provider-codex/src/agent-provider-base.ts
8994
- var CODEX_PINNED_THREAD_SECTION_ID = "01984de2-8f74-7c91-a3b2-5c5e937cf318";
8995
- function isPinnedThreadSection(value) {
8996
- if (value === null) {
8997
- return false;
8998
- }
8999
- const section = expectRecord(value, "Codex thread section");
9000
- const sectionId = expectString(section["id"], "Codex thread section id");
9001
- expectString(section["name"], "Codex thread section name");
9002
- const appearance = section["appearance"];
9003
- if (appearance !== null && (!isRecord(appearance) || appearance["icon"] !== null && typeof appearance["icon"] !== "string" || appearance["color"] !== null && typeof appearance["color"] !== "string")) {
9004
- throw new CodexProtocolMappingError("Codex thread section appearance is invalid");
9005
- }
9006
- return sectionId === CODEX_PINNED_THREAD_SECTION_ID;
9007
- }
9008
9091
  async function canonicalPathIdentity(path) {
9009
9092
  try {
9010
9093
  return normalizedPathIdentity(await realpath(path));
@@ -9019,27 +9102,6 @@ async function isSameCanonicalPath(left, right) {
9019
9102
  ]);
9020
9103
  return leftIdentity === rightIdentity;
9021
9104
  }
9022
- function isProjectThread(thread, project) {
9023
- const nativeProjectId = thread["projectId"];
9024
- if (nativeProjectId !== null && typeof nativeProjectId !== "string") {
9025
- throw new CodexProtocolMappingError("Codex thread projectId must be a string or null");
9026
- }
9027
- if (project.kind === "project") {
9028
- return nativeProjectId === project.id;
9029
- }
9030
- if (nativeProjectId !== null) {
9031
- return false;
9032
- }
9033
- return true;
9034
- }
9035
- function assertProjectThread(thread, project) {
9036
- if (!isProjectThread(thread, project)) {
9037
- return Promise.reject(
9038
- new CodexProtocolMappingError("Codex thread does not belong to the active project")
9039
- );
9040
- }
9041
- return Promise.resolve();
9042
- }
9043
9105
  function isThreadNotLoadedError(error) {
9044
9106
  return error instanceof RpcResponseError && error.code === -32600 && error.message.startsWith("thread not loaded:");
9045
9107
  }
@@ -9065,16 +9127,6 @@ function createUnmaterializedTaskSnapshot(task) {
9065
9127
  turnsNextCursor: null
9066
9128
  };
9067
9129
  }
9068
- async function mapAgentTask(thread, project) {
9069
- await assertProjectThread(thread, project);
9070
- return {
9071
- id: expectString(thread["id"], "Codex thread id"),
9072
- pinned: isPinnedThreadSection(thread["section"]),
9073
- projectId: project.id,
9074
- title: normalizedTitle(thread),
9075
- updatedAt: toDateTime(thread["updatedAt"], "Codex thread updatedAt")
9076
- };
9077
- }
9078
9130
  var CodexAgentProviderBase = class {
9079
9131
  client;
9080
9132
  eventListenersIncludingEphemeral = /* @__PURE__ */ new Set();
@@ -9201,6 +9253,7 @@ var CodexAgentProviderBase = class {
9201
9253
  this.assertKnownProjectTask(taskId);
9202
9254
  const response = expectRecord(
9203
9255
  await this.client.request("thread/fork", {
9256
+ config: CODEX_THREAD_CONFIG,
9204
9257
  // 仅返回元数据并覆盖完整运行时根;历史统一分页读取,避免单个 JSONL 帧过大。
9205
9258
  excludeTurns: true,
9206
9259
  ...lastTurnId === void 0 ? {} : { lastTurnId },
@@ -9394,10 +9447,10 @@ var CodexAgentProviderQueue = class extends CodexAgentProviderBase {
9394
9447
  return { name: skill.name, path: skill.path, type: "skill" };
9395
9448
  });
9396
9449
  const images = input.images.map((image) => {
9397
- if (!image.url.startsWith(`data:${image.mediaType};base64,`)) {
9398
- throw new CodexProtocolMappingError("Provider image URL does not match its media type");
9450
+ if (image.path.length === 0) {
9451
+ throw new CodexProtocolMappingError("Provider image path must not be empty");
9399
9452
  }
9400
- return { type: "image", url: image.url };
9453
+ return { detail: image.detail, path: image.path, type: "localImage" };
9401
9454
  });
9402
9455
  const files = input.files.map(createCodexFileTextInput);
9403
9456
  const textAttachments = input.textAttachments.map((attachment) => ({
@@ -9567,6 +9620,7 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
9567
9620
  async startTask(options = {}) {
9568
9621
  const response = expectRecord(
9569
9622
  await this.client.request("thread/start", {
9623
+ config: CODEX_THREAD_CONFIG,
9570
9624
  historyMode: "paginated",
9571
9625
  ...this.project.kind === "temporary" ? {} : {
9572
9626
  cwd: this.project.rootPath,
@@ -9766,6 +9820,22 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
9766
9820
  "turn/interrupt response"
9767
9821
  );
9768
9822
  }
9823
+ async updateTurnApprovalsReviewer(taskId, turnId, reviewer) {
9824
+ this.assertKnownProjectTask(taskId);
9825
+ const response = expectRecord(
9826
+ await this.client.request("turn/settings/update", {
9827
+ threadId: taskId,
9828
+ turnId,
9829
+ approvalsReviewer: reviewer
9830
+ }),
9831
+ "turn/settings/update response"
9832
+ );
9833
+ const status = response["status"];
9834
+ if (status !== "applied" && status !== "targetUnavailable") {
9835
+ throw new CodexProtocolMappingError("Codex turn settings update status is invalid");
9836
+ }
9837
+ return status;
9838
+ }
9769
9839
  async listBackgroundTerminals(taskId) {
9770
9840
  this.assertKnownProjectTask(taskId);
9771
9841
  const terminals = [];
@@ -9826,6 +9896,9 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
9826
9896
  }
9827
9897
  }
9828
9898
  async listTasks(input = {}) {
9899
+ if (input.completed === true) {
9900
+ return this.listCompletedTasks(input);
9901
+ }
9829
9902
  const response = expectRecord(
9830
9903
  await this.client.request("thread/list", {
9831
9904
  ...input.archived === true ? { archived: true } : {},
@@ -9862,6 +9935,49 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
9862
9935
  const data = [...pendingTasks, ...nativeTasks];
9863
9936
  return { data, nextCursor: nextCursor ?? null };
9864
9937
  }
9938
+ async listCompletedTasks(input) {
9939
+ const limit = Math.min(100, Math.max(1, input.limit ?? 10));
9940
+ const requestedCursors = /* @__PURE__ */ new Set();
9941
+ const data = [];
9942
+ let cursor = input.cursor;
9943
+ while (data.length < limit) {
9944
+ const response = expectRecord(
9945
+ await this.client.request("thread/list", {
9946
+ ...cursor === void 0 ? {} : { cursor },
9947
+ limit: limit - data.length,
9948
+ ...this.project.kind === "temporary" ? { projectId: null } : { projectId: this.project.id },
9949
+ sortDirection: "desc",
9950
+ sortKey: "updated_at"
9951
+ }),
9952
+ "thread/list response"
9953
+ );
9954
+ if (!Array.isArray(response["data"])) {
9955
+ throw new CodexProtocolMappingError("thread/list data must be an array");
9956
+ }
9957
+ for (const value of response["data"]) {
9958
+ const thread = expectRecord(value, "Codex thread");
9959
+ const status = expectString(
9960
+ expectRecord(thread["status"], "Codex thread status")["type"],
9961
+ "Codex thread status type"
9962
+ );
9963
+ if (status !== "idle" && status !== "notLoaded") continue;
9964
+ data.push(await mapAgentTask(thread, this.project));
9965
+ if (data.length === limit) break;
9966
+ }
9967
+ const nextCursor = response["nextCursor"];
9968
+ if (nextCursor === null || nextCursor === void 0) {
9969
+ return { data, nextCursor: null };
9970
+ }
9971
+ const next = expectString(nextCursor, "thread/list nextCursor");
9972
+ if (requestedCursors.has(next)) {
9973
+ throw new CodexProtocolMappingError("thread/list returned a repeated cursor");
9974
+ }
9975
+ requestedCursors.add(next);
9976
+ cursor = next;
9977
+ if (data.length === limit) return { data, nextCursor: next };
9978
+ }
9979
+ return { data, nextCursor: null };
9980
+ }
9865
9981
  };
9866
9982
 
9867
9983
  // packages/provider-codex/src/task-history-pagination.ts
@@ -10584,6 +10700,7 @@ var CodexAgentProviderEvents = class extends CodexAgentProviderTasks {
10584
10700
  const resumePromise = (async () => {
10585
10701
  const response = expectRecord(
10586
10702
  await this.client.request("thread/resume", {
10703
+ config: CODEX_THREAD_CONFIG,
10587
10704
  // 恢复只负责加载运行时,Snapshot 历史继续通过分页接口获取。
10588
10705
  excludeTurns: true,
10589
10706
  // 恢复 Project Task 时覆盖旧运行时配置,使全部根立即生效。
@@ -10611,7 +10728,10 @@ var CodexAgentProviderEvents = class extends CodexAgentProviderTasks {
10611
10728
  async resumeReviewWorker(workerTaskId) {
10612
10729
  try {
10613
10730
  const response = expectRecord(
10614
- await this.client.request("thread/resume", { threadId: workerTaskId }),
10731
+ await this.client.request("thread/resume", {
10732
+ config: CODEX_THREAD_CONFIG,
10733
+ threadId: workerTaskId
10734
+ }),
10615
10735
  "review worker thread/resume response"
10616
10736
  );
10617
10737
  const thread = expectRecord(response["thread"], "review worker thread/resume thread");
@@ -10812,12 +10932,99 @@ var CodexNativeStateSnapshot = class {
10812
10932
  }
10813
10933
  };
10814
10934
 
10935
+ // packages/provider-codex/src/provider-connection-config.ts
10936
+ var DEFAULT_CUSTOM_PROVIDER_ID = "OpenAI";
10937
+ function isRecord6(value) {
10938
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10939
+ }
10940
+ function optionalString3(value, maxLength) {
10941
+ return typeof value === "string" ? value.slice(0, maxLength) : null;
10942
+ }
10943
+ function nonEmptyString(value) {
10944
+ return typeof value === "string" && value.trim().length > 0 ? value : null;
10945
+ }
10946
+ function readConfiguredProviderId(config) {
10947
+ return nonEmptyString(config["model_provider"]);
10948
+ }
10949
+ function readModelProviderConfig(config, providerId) {
10950
+ const providers = isRecord6(config["model_providers"]) ? config["model_providers"] : null;
10951
+ const provider = providers?.[providerId];
10952
+ return isRecord6(provider) ? provider : null;
10953
+ }
10954
+ function readActiveProvider(config) {
10955
+ const providerId = readConfiguredProviderId(config) ?? "openai";
10956
+ const openaiBaseUrl = optionalString3(config["openai_base_url"], 2048);
10957
+ if (providerId === "openai") {
10958
+ return openaiBaseUrl === null || openaiBaseUrl.length === 0 ? { customBaseUrl: null, mode: "official" } : { customBaseUrl: openaiBaseUrl, mode: "custom" };
10959
+ }
10960
+ const provider = readModelProviderConfig(config, providerId);
10961
+ const baseUrl = optionalString3(provider?.["base_url"], 2048);
10962
+ return {
10963
+ customBaseUrl: baseUrl === null || baseUrl.length === 0 ? null : baseUrl,
10964
+ mode: "custom"
10965
+ };
10966
+ }
10967
+ function createCustomProviderConfigUpdate(config, baseUrl, hasApiKey) {
10968
+ const configuredProviderId = readConfiguredProviderId(config);
10969
+ const existingProviderId = readActiveProvider(config).mode === "custom" ? configuredProviderId : null;
10970
+ const providerId = existingProviderId ?? DEFAULT_CUSTOM_PROVIDER_ID;
10971
+ if (providerId === "openai") {
10972
+ return {
10973
+ edits: [{ keyPath: "openai_base_url", mergeStrategy: "upsert", value: baseUrl }],
10974
+ providerId,
10975
+ requiresOpenaiAuth: true,
10976
+ rollbackEdits: [
10977
+ {
10978
+ keyPath: "openai_base_url",
10979
+ mergeStrategy: "replace",
10980
+ value: config["openai_base_url"] ?? null
10981
+ }
10982
+ ]
10983
+ };
10984
+ }
10985
+ const previousProvider = readModelProviderConfig(config, providerId);
10986
+ const previousRequiresOpenaiAuth = previousProvider?.["requires_openai_auth"];
10987
+ const requiresOpenaiAuth = hasApiKey ? true : typeof previousRequiresOpenaiAuth === "boolean" ? previousRequiresOpenaiAuth : false;
10988
+ const configuredName = nonEmptyString(previousProvider?.["name"]);
10989
+ const edits = [
10990
+ {
10991
+ keyPath: `model_providers.${providerId}`,
10992
+ mergeStrategy: "upsert",
10993
+ value: {
10994
+ base_url: baseUrl,
10995
+ name: configuredName ?? providerId,
10996
+ requires_openai_auth: requiresOpenaiAuth,
10997
+ wire_api: "responses"
10998
+ }
10999
+ }
11000
+ ];
11001
+ const rollbackEdits = [
11002
+ {
11003
+ keyPath: `model_providers.${providerId}`,
11004
+ mergeStrategy: "replace",
11005
+ value: previousProvider
11006
+ }
11007
+ ];
11008
+ if (existingProviderId === null) {
11009
+ edits.push({
11010
+ keyPath: "model_provider",
11011
+ mergeStrategy: "upsert",
11012
+ value: DEFAULT_CUSTOM_PROVIDER_ID
11013
+ });
11014
+ rollbackEdits.push({
11015
+ keyPath: "model_provider",
11016
+ mergeStrategy: "replace",
11017
+ value: config["model_provider"] ?? null
11018
+ });
11019
+ }
11020
+ return { edits, providerId, requiresOpenaiAuth, rollbackEdits };
11021
+ }
11022
+
10815
11023
  // packages/provider-codex/src/provider-connection.ts
10816
- var CUSTOM_PROVIDER_ID = "codexly_custom";
10817
11024
  var DEFAULT_MODEL_REQUEST_TIMEOUT_MS = 1e4;
10818
11025
  var DEFAULT_MODEL_RESPONSE_MAX_BYTES = 1 * 1024 * 1024;
10819
11026
  var DEFAULT_MODEL_COUNT_LIMIT = 1e3;
10820
- function isRecord6(value) {
11027
+ function isRecord7(value) {
10821
11028
  return typeof value === "object" && value !== null && !Array.isArray(value);
10822
11029
  }
10823
11030
  function requiredString(value, field) {
@@ -10826,7 +11033,7 @@ function requiredString(value, field) {
10826
11033
  }
10827
11034
  return value;
10828
11035
  }
10829
- function optionalString3(value, maxLength) {
11036
+ function optionalString4(value, maxLength) {
10830
11037
  return typeof value === "string" ? value.slice(0, maxLength) : null;
10831
11038
  }
10832
11039
  function normalizeBaseUrl(value) {
@@ -10866,39 +11073,25 @@ async function readBoundedBody(response, maximumBytes) {
10866
11073
  return Buffer$1.concat(chunks, total);
10867
11074
  }
10868
11075
  function mapAccount(value) {
10869
- if (!isRecord6(value)) return null;
11076
+ if (!isRecord7(value)) return null;
10870
11077
  if (value["type"] === "apiKey") return { type: "apiKey" };
10871
11078
  if (value["type"] === "chatgpt") {
10872
11079
  return {
10873
- email: optionalString3(value["email"], 320),
10874
- planType: optionalString3(value["planType"], 64),
11080
+ email: optionalString4(value["email"], 320),
11081
+ planType: optionalString4(value["planType"], 64),
10875
11082
  type: "chatgpt"
10876
11083
  };
10877
11084
  }
10878
11085
  return null;
10879
11086
  }
10880
11087
  function readConfig(response) {
10881
- if (!isRecord6(response) || !isRecord6(response["config"])) {
11088
+ if (!isRecord7(response) || !isRecord7(response["config"])) {
10882
11089
  throw new CodexProviderConnectionError("Codex returned an invalid config response");
10883
11090
  }
10884
11091
  return response["config"];
10885
11092
  }
10886
- function readActiveProvider(config) {
10887
- const providerId = typeof config["model_provider"] === "string" ? config["model_provider"] : "openai";
10888
- const openaiBaseUrl = optionalString3(config["openai_base_url"], 2048);
10889
- if (providerId === "openai") {
10890
- return openaiBaseUrl === null || openaiBaseUrl.length === 0 ? { customBaseUrl: null, mode: "official" } : { customBaseUrl: openaiBaseUrl, mode: "custom" };
10891
- }
10892
- const providers = isRecord6(config["model_providers"]) ? config["model_providers"] : null;
10893
- const provider = providers && isRecord6(providers[providerId]) ? providers[providerId] : null;
10894
- const baseUrl = optionalString3(provider?.["base_url"], 2048);
10895
- return {
10896
- customBaseUrl: baseUrl === null || baseUrl.length === 0 ? null : baseUrl,
10897
- mode: "custom"
10898
- };
10899
- }
10900
11093
  function readAccountResponse(response) {
10901
- if (!isRecord6(response) || typeof response["requiresOpenaiAuth"] !== "boolean") {
11094
+ if (!isRecord7(response) || typeof response["requiresOpenaiAuth"] !== "boolean") {
10902
11095
  throw new CodexProviderConnectionError("Codex returned an invalid account response");
10903
11096
  }
10904
11097
  return {
@@ -10917,12 +11110,8 @@ function createConnectionStatus(config, accountState, pendingLogin) {
10917
11110
  state: pendingLogin?.state ?? (connected ? "connected" : "disconnected")
10918
11111
  };
10919
11112
  }
10920
- function readCustomProviderConfig(config) {
10921
- const providers = isRecord6(config["model_providers"]) ? config["model_providers"] : null;
10922
- return providers?.[CUSTOM_PROVIDER_ID] ?? null;
10923
- }
10924
11113
  function readProviderCapabilities(response) {
10925
- if (!isRecord6(response) || typeof response["namespaceTools"] !== "boolean" || typeof response["imageGeneration"] !== "boolean" || typeof response["webSearch"] !== "boolean") {
11114
+ if (!isRecord7(response) || typeof response["namespaceTools"] !== "boolean" || typeof response["imageGeneration"] !== "boolean" || typeof response["webSearch"] !== "boolean") {
10926
11115
  throw new CodexProviderConnectionError("Codex returned invalid model provider capabilities");
10927
11116
  }
10928
11117
  }
@@ -10949,13 +11138,13 @@ var CodexProviderConnectionService = class {
10949
11138
  if (method === "account/updated") {
10950
11139
  this.#nativeState.clear();
10951
11140
  }
10952
- if (method === "account/updated" && isRecord6(params) && params["authMode"] === "chatgpt") {
11141
+ if (method === "account/updated" && isRecord7(params) && params["authMode"] === "chatgpt") {
10953
11142
  this.#pendingLogin = null;
10954
11143
  return;
10955
11144
  }
10956
11145
  if (method !== "account/login/completed") return;
10957
11146
  this.#nativeState.clear();
10958
- if (!isRecord6(params)) return;
11147
+ if (!isRecord7(params)) return;
10959
11148
  const loginId = params["loginId"];
10960
11149
  if (typeof loginId !== "string" || this.#pendingLogin?.loginId !== loginId) return;
10961
11150
  if (params["success"] === true) {
@@ -10963,7 +11152,7 @@ var CodexProviderConnectionService = class {
10963
11152
  return;
10964
11153
  }
10965
11154
  this.#pendingLogin = {
10966
- error: optionalString3(params["error"], 1e3) ?? "Login failed",
11155
+ error: optionalString4(params["error"], 1e3) ?? "Login failed",
10967
11156
  loginId,
10968
11157
  state: "failed"
10969
11158
  };
@@ -10988,7 +11177,7 @@ var CodexProviderConnectionService = class {
10988
11177
  type: "chatgpt",
10989
11178
  useHostedLoginSuccessPage: true
10990
11179
  });
10991
- if (!isRecord6(response) || response["type"] !== "chatgpt") {
11180
+ if (!isRecord7(response) || response["type"] !== "chatgpt") {
10992
11181
  throw new CodexProviderConnectionError("Codex returned an invalid login response");
10993
11182
  }
10994
11183
  const loginId = requiredString(response["loginId"], "login id");
@@ -11012,21 +11201,26 @@ var CodexProviderConnectionService = class {
11012
11201
  async readConfig() {
11013
11202
  return this.#nativeState.readConfig();
11014
11203
  }
11015
- async configureCustom(input) {
11204
+ async configureCustom(input, persistedModels) {
11016
11205
  const baseUrl = normalizeBaseUrl(input.baseUrl);
11017
11206
  const apiKey = input.apiKey;
11018
11207
  if (apiKey?.trim().length === 0) {
11019
11208
  throw new CodexProviderConnectionError("Custom API key cannot be blank");
11020
11209
  }
11021
11210
  const manualModels = normalizeManualModels(input.models ?? [], this.#modelCountLimit);
11022
- let discoveredModels;
11023
- try {
11024
- discoveredModels = await this.#discoverModels(baseUrl, apiKey);
11025
- } catch (error) {
11026
- if (manualModels.length === 0) throw error;
11027
- discoveredModels = [];
11211
+ let models;
11212
+ if (input.models === void 0 && persistedModels !== void 0) {
11213
+ models = persistedModels;
11214
+ } else {
11215
+ let discoveredModels;
11216
+ try {
11217
+ discoveredModels = await this.#discoverModels(baseUrl, apiKey);
11218
+ } catch (error) {
11219
+ if (manualModels.length === 0) throw error;
11220
+ discoveredModels = [];
11221
+ }
11222
+ models = mapCustomModels([...discoveredModels, ...manualModels], this.#modelCountLimit);
11028
11223
  }
11029
- const models = mapCustomModels([...discoveredModels, ...manualModels], this.#modelCountLimit);
11030
11224
  this.#nativeState.clear();
11031
11225
  const [configResponse, accountResponse] = await Promise.all([
11032
11226
  this.#client.request("config/read", { includeLayers: false }),
@@ -11034,20 +11228,13 @@ var CodexProviderConnectionService = class {
11034
11228
  ]);
11035
11229
  const previousConfig = readConfig(configResponse);
11036
11230
  const previousAccountState = readAccountResponse(accountResponse);
11231
+ const configUpdate = createCustomProviderConfigUpdate(
11232
+ previousConfig,
11233
+ baseUrl,
11234
+ apiKey !== void 0
11235
+ );
11037
11236
  await this.#client.request("config/batchWrite", {
11038
- edits: [
11039
- {
11040
- keyPath: `model_providers.${CUSTOM_PROVIDER_ID}`,
11041
- mergeStrategy: "upsert",
11042
- value: {
11043
- base_url: baseUrl,
11044
- name: "Codexly Custom API",
11045
- requires_openai_auth: apiKey !== void 0,
11046
- wire_api: "responses"
11047
- }
11048
- },
11049
- { keyPath: "model_provider", mergeStrategy: "upsert", value: CUSTOM_PROVIDER_ID }
11050
- ]
11237
+ edits: configUpdate.edits
11051
11238
  });
11052
11239
  this.#nativeState.clear();
11053
11240
  try {
@@ -11057,7 +11244,7 @@ var CodexProviderConnectionService = class {
11057
11244
  apiKey,
11058
11245
  type: "apiKey"
11059
11246
  });
11060
- if (!isRecord6(loginResponse) || loginResponse["type"] !== "apiKey") {
11247
+ if (!isRecord7(loginResponse) || loginResponse["type"] !== "apiKey") {
11061
11248
  throw new CodexProviderConnectionError(
11062
11249
  "Codex returned an invalid API key login response"
11063
11250
  );
@@ -11066,18 +11253,7 @@ var CodexProviderConnectionService = class {
11066
11253
  } catch (error) {
11067
11254
  try {
11068
11255
  await this.#client.request("config/batchWrite", {
11069
- edits: [
11070
- {
11071
- keyPath: `model_providers.${CUSTOM_PROVIDER_ID}`,
11072
- mergeStrategy: "replace",
11073
- value: readCustomProviderConfig(previousConfig)
11074
- },
11075
- {
11076
- keyPath: "model_provider",
11077
- mergeStrategy: "replace",
11078
- value: previousConfig["model_provider"] ?? null
11079
- }
11080
- ]
11256
+ edits: configUpdate.rollbackEdits
11081
11257
  });
11082
11258
  this.#nativeState.clear();
11083
11259
  } catch {
@@ -11089,13 +11265,16 @@ var CodexProviderConnectionService = class {
11089
11265
  }
11090
11266
  this.#pendingLogin = null;
11091
11267
  this.#nativeState.clear();
11092
- const activeConfig = {
11093
- model_provider: CUSTOM_PROVIDER_ID,
11268
+ const activeConfig = configUpdate.providerId === "openai" ? { model_provider: "openai", openai_base_url: baseUrl } : {
11269
+ model_provider: configUpdate.providerId,
11094
11270
  model_providers: {
11095
- [CUSTOM_PROVIDER_ID]: { base_url: baseUrl }
11271
+ [configUpdate.providerId]: { base_url: baseUrl }
11096
11272
  }
11097
11273
  };
11098
- const activeAccountState = apiKey === void 0 ? { account: previousAccountState.account, requiresOpenaiAuth: false } : { account: { type: "apiKey" }, requiresOpenaiAuth: true };
11274
+ const activeAccountState = apiKey === void 0 ? {
11275
+ account: previousAccountState.account,
11276
+ requiresOpenaiAuth: configUpdate.requiresOpenaiAuth
11277
+ } : { account: { type: "apiKey" }, requiresOpenaiAuth: true };
11099
11278
  return {
11100
11279
  models,
11101
11280
  status: createConnectionStatus(activeConfig, activeAccountState, null)
@@ -11224,6 +11403,10 @@ var CodexRuntimeProjectProvider = class {
11224
11403
  this.#runtime.assertTaskOwner(this.#project, taskId);
11225
11404
  return this.#delegate.interruptTurn(taskId, turnId);
11226
11405
  }
11406
+ updateTurnApprovalsReviewer(taskId, turnId, reviewer) {
11407
+ this.#runtime.assertTaskOwner(this.#project, taskId);
11408
+ return this.#delegate.updateTurnApprovalsReviewer(taskId, turnId, reviewer);
11409
+ }
11227
11410
  async listBackgroundTerminals(taskId) {
11228
11411
  await this.#ensureTaskOwner(taskId);
11229
11412
  return this.#delegate.listBackgroundTerminals(taskId);
@@ -11621,7 +11804,7 @@ var CodexFuzzyFileSearchService = class {
11621
11804
  var DEFAULT_CHANGE_DEBOUNCE_MS = 100;
11622
11805
  var MAX_GIT_REPOSITORIES_PER_ROOT = 32;
11623
11806
  var MAX_CODEX_GIT_METADATA_WATCHES = 128;
11624
- function isRecord7(value) {
11807
+ function isRecord8(value) {
11625
11808
  return typeof value === "object" && value !== null && !Array.isArray(value);
11626
11809
  }
11627
11810
  async function pathExists(path) {
@@ -11750,7 +11933,7 @@ var CodexGitMetadataWatchService = class {
11750
11933
  await state.operation;
11751
11934
  }
11752
11935
  receiveNotification(method, params) {
11753
- if (method !== "fs/changed" || !isRecord7(params) || typeof params["watchId"] !== "string" || !Array.isArray(params["changedPaths"]) || !params["changedPaths"].every((path) => typeof path === "string")) {
11936
+ if (method !== "fs/changed" || !isRecord8(params) || typeof params["watchId"] !== "string" || !Array.isArray(params["changedPaths"]) || !params["changedPaths"].every((path) => typeof path === "string")) {
11754
11937
  return;
11755
11938
  }
11756
11939
  const owner = this.#watchOwners.get(params["watchId"]);
@@ -11817,7 +12000,7 @@ var CodexGitMetadataWatchService = class {
11817
12000
  path: descriptor.path,
11818
12001
  watchId
11819
12002
  });
11820
- if (!isRecord7(response) || typeof response["path"] !== "string") {
12003
+ if (!isRecord8(response) || typeof response["path"] !== "string") {
11821
12004
  throw new TypeError("fs/watch response path is invalid");
11822
12005
  }
11823
12006
  } catch {
@@ -11861,6 +12044,95 @@ var CodexGitMetadataWatchService = class {
11861
12044
  }
11862
12045
  };
11863
12046
 
12047
+ // packages/provider-codex/src/skill-market-provider.ts
12048
+ async function listCodexInstalledSkills(client, projects, forceReload) {
12049
+ const roots = projects.flatMap(
12050
+ (project) => project.roots.map((root) => ({ path: root.path, project }))
12051
+ );
12052
+ const rootsByPath = new Map(roots.map((root) => [root.path, root]));
12053
+ const response = expectRecord(
12054
+ await client.request("skills/list", {
12055
+ cwds: roots.map((root) => root.path),
12056
+ forceReload
12057
+ }),
12058
+ "skills/list response"
12059
+ );
12060
+ if (!Array.isArray(response["data"])) {
12061
+ throw new CodexProtocolMappingError("skills/list data must be an array");
12062
+ }
12063
+ const seenPaths = /* @__PURE__ */ new Set();
12064
+ const data = [];
12065
+ for (const value of response["data"]) {
12066
+ const entry = expectRecord(value, "skills/list entry");
12067
+ const cwd = expectString(entry["cwd"], "skills/list cwd");
12068
+ if (!Array.isArray(entry["skills"])) {
12069
+ throw new CodexProtocolMappingError("skills/list skills must be an array");
12070
+ }
12071
+ for (const rawSkill of entry["skills"]) {
12072
+ const skill = mapCodexSkill(rawSkill);
12073
+ if (seenPaths.has(skill.path)) continue;
12074
+ seenPaths.add(skill.path);
12075
+ const root = skill.scope === "repo" ? rootsByPath.get(cwd) : void 0;
12076
+ data.push({
12077
+ ...skill,
12078
+ ...root === void 0 ? {} : {
12079
+ projectId: root.project.id,
12080
+ projectName: root.project.name,
12081
+ rootPath: root.path
12082
+ },
12083
+ source: "local"
12084
+ });
12085
+ }
12086
+ }
12087
+ return { data, nextCursor: null };
12088
+ }
12089
+ async function setCodexSkillEnabled(client, path, enabled) {
12090
+ const response = expectRecord(
12091
+ await client.request("skills/config/write", { enabled, name: null, path }),
12092
+ "skills/config/write response"
12093
+ );
12094
+ return {
12095
+ effectiveEnabled: expectBoolean(
12096
+ response["effectiveEnabled"],
12097
+ "skills/config/write effectiveEnabled"
12098
+ )
12099
+ };
12100
+ }
12101
+ async function listCodexConfiguredMcpServers(client) {
12102
+ const response = expectRecord(
12103
+ await client.request("config/read", { includeLayers: false }),
12104
+ "config/read response"
12105
+ );
12106
+ const config = expectRecord(response["config"], "config/read config");
12107
+ const rawServers = config["mcp_servers"];
12108
+ if (rawServers === void 0) return { data: [] };
12109
+ const servers = expectRecord(rawServers, "config/read mcp_servers");
12110
+ return {
12111
+ data: Object.entries(servers).map(([name, value]) => {
12112
+ const server = expectRecord(value, `config/read mcp_servers.${name}`);
12113
+ const configuredEnabled = server["enabled"];
12114
+ if (configuredEnabled !== void 0 && typeof configuredEnabled !== "boolean") {
12115
+ throw new CodexProtocolMappingError(`config/read mcp_servers.${name}.enabled is invalid`);
12116
+ }
12117
+ return { enabled: configuredEnabled ?? true, name };
12118
+ }).toSorted((left, right) => left.name.localeCompare(right.name))
12119
+ };
12120
+ }
12121
+ function quoteConfigKeySegment(value) {
12122
+ return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
12123
+ }
12124
+ async function setCodexMcpServerEnabled(client, name, enabled) {
12125
+ await client.request("config/value/write", {
12126
+ expectedVersion: null,
12127
+ filePath: null,
12128
+ keyPath: `mcp_servers.${quoteConfigKeySegment(name)}.enabled`,
12129
+ mergeStrategy: "replace",
12130
+ value: enabled
12131
+ });
12132
+ await client.request("config/mcpServer/reload");
12133
+ return { enabled };
12134
+ }
12135
+
11864
12136
  // packages/provider-codex/src/runtime-provider.ts
11865
12137
  function optionalNonEmptyString(value) {
11866
12138
  return typeof value === "string" && value.length > 0 ? value : void 0;
@@ -11981,8 +12253,8 @@ var CodexRuntimeProvider = class {
11981
12253
  cancelProviderLogin(loginId) {
11982
12254
  return this.#providerConnection.cancelLogin(loginId);
11983
12255
  }
11984
- configureCustomProvider(input) {
11985
- return this.#providerConnection.configureCustom(input);
12256
+ configureCustomProvider(input, persistedModels) {
12257
+ return this.#providerConnection.configureCustom(input, persistedModels);
11986
12258
  }
11987
12259
  forProject(project) {
11988
12260
  const primaryRoot = project.roots[0];
@@ -12058,6 +12330,12 @@ var CodexRuntimeProvider = class {
12058
12330
  subscribeRpc: false
12059
12331
  }).listModels();
12060
12332
  }
12333
+ listConfiguredMcpServers() {
12334
+ return listCodexConfiguredMcpServers(this.#client);
12335
+ }
12336
+ listInstalledSkills(projects, forceReload) {
12337
+ return listCodexInstalledSkills(this.#client, projects, forceReload);
12338
+ }
12061
12339
  logoutProvider() {
12062
12340
  return this.#providerConnection.logout();
12063
12341
  }
@@ -12107,6 +12385,12 @@ var CodexRuntimeProvider = class {
12107
12385
  startOfficialProviderLogin() {
12108
12386
  return this.#providerConnection.startOfficialLogin();
12109
12387
  }
12388
+ setMcpServerEnabled(name, enabled) {
12389
+ return setCodexMcpServerEnabled(this.#client, name, enabled);
12390
+ }
12391
+ setSkillEnabled(path, enabled) {
12392
+ return setCodexSkillEnabled(this.#client, path, enabled);
12393
+ }
12110
12394
  beginTaskRead(project, taskId) {
12111
12395
  return this.#owners.beginTaskRead(project, taskId);
12112
12396
  }
@@ -12340,6 +12624,13 @@ function mapUnixSeconds(value, context) {
12340
12624
  }
12341
12625
  return date.toISOString();
12342
12626
  }
12627
+ function validateNullableUnixSeconds(value, context) {
12628
+ if (value === null) return;
12629
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
12630
+ throw new CodexProtocolMappingError(`${context} must be a Unix timestamp or null`);
12631
+ }
12632
+ mapUnixSeconds(value, context);
12633
+ }
12343
12634
  function mapProjectRoot(value, index) {
12344
12635
  const root = expectRecord(value, `Codex project root ${String(index)}`);
12345
12636
  const path = expectNonEmptyString2(root["path"], `Codex project root ${String(index)} path`);
@@ -12369,6 +12660,7 @@ function mapCodexProject(value) {
12369
12660
  }
12370
12661
  validateMetadata(nativeProject["metadata"]);
12371
12662
  mapUnixSeconds(nativeProject["updatedAt"], "Codex project updatedAt");
12663
+ validateNullableUnixSeconds(nativeProject["recencyAt"], "Codex project recencyAt");
12372
12664
  return {
12373
12665
  position: expectSafeInteger(nativeProject["position"], "Codex project position"),
12374
12666
  project: {
@@ -13540,4 +13832,4 @@ function validateDownloadUrl(value) {
13540
13832
  }
13541
13833
  }
13542
13834
 
13543
- export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, require_pino, require_safe_stable_stringify, startCodexAppServer };
13835
+ export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, CodexWorkbenchPetProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, SUPPORTED_CODEX_VERSION_RANGE, checkCodexVersion, createCodexRuntimeProvider, createCodexWorkbenchPetProvider, locateCodexBinary, require_pino, require_safe_stable_stringify, startCodexAppServer };