@bryanhu/codexly 0.3.0 → 0.5.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 (253) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README.md +3 -1
  3. package/README.zh-CN.md +3 -1
  4. package/dist/{chunk-Y7HG5THF.js → chunk-4PA52XB7.js} +938 -83
  5. package/dist/{chunk-VZLNYRY3.js → chunk-AGMOIRX4.js} +1 -1
  6. package/dist/{chunk-3OBVX5TN.js → chunk-RNTA4MFS.js} +9 -1
  7. package/dist/{chunk-6HXWAD7A.js → chunk-UAJCHOZK.js} +1260 -466
  8. package/dist/{chunk-DR6HEQ7V.js → chunk-ZSWNUDDK.js} +123 -7
  9. package/dist/cli.js +10 -6
  10. package/dist/client/index.js +35 -5
  11. package/dist/core/index.js +1 -1
  12. package/dist/protocol/index.js +1 -1
  13. package/dist/providers/codex/index.js +3 -3
  14. package/dist/server/index.js +5 -5
  15. package/dist/sqlite-state-worker.js +117 -7
  16. package/dist/web/.vite/manifest.json +406 -273
  17. package/dist/web/.vite/manifest.json.br +0 -0
  18. package/dist/web/.vite/manifest.json.gz +0 -0
  19. package/dist/web/assets/button-group-GolVMDRO.js +1 -0
  20. package/dist/web/assets/button-group-GolVMDRO.js.br +0 -0
  21. package/dist/web/assets/button-group-GolVMDRO.js.gz +0 -0
  22. package/dist/web/assets/check-DufG-ZUa.js +1 -0
  23. package/dist/web/assets/check-DufG-ZUa.js.br +0 -0
  24. package/dist/web/assets/check-DufG-ZUa.js.gz +0 -0
  25. package/dist/web/assets/checkbox-37DlWLBa.js +1 -0
  26. package/dist/web/assets/checkbox-37DlWLBa.js.br +0 -0
  27. package/dist/web/assets/checkbox-37DlWLBa.js.gz +0 -0
  28. package/dist/web/assets/{chunk-BO2N2NFS-Cv0xdEIU.js → chunk-BO2N2NFS-C9R62W5i.js} +4 -4
  29. package/dist/web/assets/chunk-BO2N2NFS-C9R62W5i.js.br +0 -0
  30. package/dist/web/assets/chunk-BO2N2NFS-C9R62W5i.js.gz +0 -0
  31. package/dist/web/assets/{code-highlighter-XA2cEb7n.js → code-highlighter-B_sQt157.js} +1 -1
  32. package/dist/web/assets/code-highlighter-B_sQt157.js.br +0 -0
  33. package/dist/web/assets/code-highlighter-B_sQt157.js.gz +0 -0
  34. package/dist/web/assets/code-languages-lQDTaxNN.js +2 -0
  35. package/dist/web/assets/code-languages-lQDTaxNN.js.br +0 -0
  36. package/dist/web/assets/code-languages-lQDTaxNN.js.gz +0 -0
  37. package/dist/web/assets/context-menu-Dag_JnAP.js +1 -0
  38. package/dist/web/assets/context-menu-Dag_JnAP.js.br +0 -0
  39. package/dist/web/assets/context-menu-Dag_JnAP.js.gz +0 -0
  40. package/dist/web/assets/cpp-DrC1WCyF.js +1 -0
  41. package/dist/web/assets/cpp-DrC1WCyF.js.br +0 -0
  42. package/dist/web/assets/cpp-DrC1WCyF.js.gz +0 -0
  43. package/dist/web/assets/cpp-DuI2J82L.js +1 -0
  44. package/dist/web/assets/cpp-DuI2J82L.js.br +0 -0
  45. package/dist/web/assets/cpp-DuI2J82L.js.gz +0 -0
  46. package/dist/web/assets/dist-D75B5EEW.js +1 -0
  47. package/dist/web/assets/dist-D75B5EEW.js.br +0 -0
  48. package/dist/web/assets/dist-D75B5EEW.js.gz +0 -0
  49. package/dist/web/assets/dist-rI8Y0b5t.js +1 -0
  50. package/dist/web/assets/dist-rI8Y0b5t.js.br +0 -0
  51. package/dist/web/assets/dist-rI8Y0b5t.js.gz +0 -0
  52. package/dist/web/assets/{engine-compile-DQ0HPfe0.js → engine-compile-Bqjaa_8Z.js} +14 -14
  53. package/dist/web/assets/engine-compile-Bqjaa_8Z.js.br +0 -0
  54. package/dist/web/assets/engine-compile-Bqjaa_8Z.js.gz +0 -0
  55. package/dist/web/assets/es2015-Bu8fG2VP.js +41 -0
  56. package/dist/web/assets/es2015-Bu8fG2VP.js.br +0 -0
  57. package/dist/web/assets/es2015-Bu8fG2VP.js.gz +0 -0
  58. package/dist/web/assets/file-code-corner-BfUyC-bF.js +1 -0
  59. package/dist/web/assets/file-code-corner-BfUyC-bF.js.br +1 -0
  60. package/dist/web/assets/file-code-corner-BfUyC-bF.js.gz +0 -0
  61. package/dist/web/assets/file-navigation-view-preference-De4_ih3I.js +1 -0
  62. package/dist/web/assets/file-navigation-view-preference-De4_ih3I.js.br +0 -0
  63. package/dist/web/assets/file-navigation-view-preference-De4_ih3I.js.gz +0 -0
  64. package/dist/web/assets/file-review-dialog-D6itznUk.js +2 -0
  65. package/dist/web/assets/file-review-dialog-D6itznUk.js.br +0 -0
  66. package/dist/web/assets/file-review-dialog-D6itznUk.js.gz +0 -0
  67. package/dist/web/assets/file-tree-CFUaXf_b.js +1 -0
  68. package/dist/web/assets/file-tree-CFUaXf_b.js.br +0 -0
  69. package/dist/web/assets/file-tree-CFUaXf_b.js.gz +0 -0
  70. package/dist/web/assets/git-commit-horizontal-BsjVPZ9W.js +1 -0
  71. package/dist/web/assets/git-commit-horizontal-BsjVPZ9W.js.br +0 -0
  72. package/dist/web/assets/git-commit-horizontal-BsjVPZ9W.js.gz +0 -0
  73. package/dist/web/assets/git-history-panel-DIr_4cfP.js +2 -0
  74. package/dist/web/assets/git-history-panel-DIr_4cfP.js.br +0 -0
  75. package/dist/web/assets/git-history-panel-DIr_4cfP.js.gz +0 -0
  76. package/dist/web/assets/global-settings-dialog-CWeXTy89.js +1 -0
  77. package/dist/web/assets/global-settings-dialog-CWeXTy89.js.br +0 -0
  78. package/dist/web/assets/global-settings-dialog-CWeXTy89.js.gz +0 -0
  79. package/dist/web/assets/grammar-cpp-support-CH6jZNJS.js +1 -0
  80. package/dist/web/assets/grammar-cpp-support-CH6jZNJS.js.br +0 -0
  81. package/dist/web/assets/grammar-cpp-support-CH6jZNJS.js.gz +0 -0
  82. package/dist/web/assets/{highlighted-body-OFNGDK62-3Xd1uGCw.js → highlighted-body-OFNGDK62-J6vd4AIe.js} +1 -1
  83. package/dist/web/assets/highlighted-body-OFNGDK62-J6vd4AIe.js.br +0 -0
  84. package/dist/web/assets/highlighted-body-OFNGDK62-J6vd4AIe.js.gz +0 -0
  85. package/dist/web/assets/index-CMCPev5S.js +4 -0
  86. package/dist/web/assets/index-CMCPev5S.js.br +0 -0
  87. package/dist/web/assets/index-CMCPev5S.js.gz +0 -0
  88. package/dist/web/assets/index-CcSDzrvO.css +2 -0
  89. package/dist/web/assets/index-CcSDzrvO.css.br +0 -0
  90. package/dist/web/assets/index-CcSDzrvO.css.gz +0 -0
  91. package/dist/web/assets/lazy-message-response-kziUJe0I.js +2 -0
  92. package/dist/web/assets/lazy-message-response-kziUJe0I.js.br +0 -0
  93. package/dist/web/assets/lazy-message-response-kziUJe0I.js.gz +0 -0
  94. package/dist/web/assets/loader-circle-DUyazd0N.js +1 -0
  95. package/dist/web/assets/loader-circle-DUyazd0N.js.br +0 -0
  96. package/dist/web/assets/loader-circle-DUyazd0N.js.gz +0 -0
  97. package/dist/web/assets/mermaid-GHXKKRXX-6KIGYUKQ.js +1 -0
  98. package/dist/web/assets/mermaid-GHXKKRXX-6KIGYUKQ.js.br +0 -0
  99. package/dist/web/assets/mermaid-GHXKKRXX-6KIGYUKQ.js.gz +0 -0
  100. package/dist/web/assets/message-response-BH1WLiOG.js +7 -0
  101. package/dist/web/assets/message-response-BH1WLiOG.js.br +0 -0
  102. package/dist/web/assets/message-response-BH1WLiOG.js.gz +0 -0
  103. package/dist/web/assets/{patch-diff-viewer-DHfvCO4S.js → patch-diff-viewer-BP7d9z00.js} +2 -2
  104. package/dist/web/assets/patch-diff-viewer-BP7d9z00.js.br +0 -0
  105. package/dist/web/assets/patch-diff-viewer-BP7d9z00.js.gz +0 -0
  106. package/dist/web/assets/{perl-Br95gH8g.js → perl-C4NAnH_t.js} +1 -1
  107. package/dist/web/assets/perl-C4NAnH_t.js.br +0 -0
  108. package/dist/web/assets/{perl-Br95gH8g.js.gz → perl-C4NAnH_t.js.gz} +0 -0
  109. package/dist/web/assets/{php-CYrBA5iX.js → php-CQT4wx5i.js} +1 -1
  110. package/dist/web/assets/php-CQT4wx5i.js.br +0 -0
  111. package/dist/web/assets/{php-CYrBA5iX.js.gz → php-CQT4wx5i.js.gz} +0 -0
  112. package/dist/web/assets/project-file-popup-page-BqEZEv1s.js +1 -0
  113. package/dist/web/assets/project-file-popup-page-BqEZEv1s.js.br +0 -0
  114. package/dist/web/assets/project-file-popup-page-BqEZEv1s.js.gz +0 -0
  115. package/dist/web/assets/project-source-panel-BkRa6eOs.js +3 -0
  116. package/dist/web/assets/project-source-panel-BkRa6eOs.js.br +0 -0
  117. package/dist/web/assets/project-source-panel-BkRa6eOs.js.gz +0 -0
  118. package/dist/web/assets/prompt-input-controls-5tCLhg2X.js +1 -0
  119. package/dist/web/assets/prompt-input-controls-5tCLhg2X.js.br +0 -0
  120. package/dist/web/assets/prompt-input-controls-5tCLhg2X.js.gz +0 -0
  121. package/dist/web/assets/prompt-reference-token-Dnq6GpIQ.js +1 -0
  122. package/dist/web/assets/prompt-reference-token-Dnq6GpIQ.js.br +3 -0
  123. package/dist/web/assets/prompt-reference-token-Dnq6GpIQ.js.gz +0 -0
  124. package/dist/web/assets/provider-connection-queries-BPczkhUT.js +1 -0
  125. package/dist/web/assets/provider-connection-queries-BPczkhUT.js.br +0 -0
  126. package/dist/web/assets/provider-connection-queries-BPczkhUT.js.gz +0 -0
  127. package/dist/web/assets/{ruby-CbXu8Ywv.js → ruby-Oh3ZbUP2.js} +1 -1
  128. package/dist/web/assets/ruby-Oh3ZbUP2.js.br +0 -0
  129. package/dist/web/assets/ruby-Oh3ZbUP2.js.gz +0 -0
  130. package/dist/web/assets/{shiki-bundle-CNYWcrCX.js → shiki-bundle-VSjMZiOC.js} +1 -1
  131. package/dist/web/assets/shiki-bundle-VSjMZiOC.js.br +0 -0
  132. package/dist/web/assets/shiki-bundle-VSjMZiOC.js.gz +0 -0
  133. package/dist/web/assets/swift-CyEgAFGc.js +1 -0
  134. package/dist/web/assets/swift-CyEgAFGc.js.br +0 -0
  135. package/dist/web/assets/swift-CyEgAFGc.js.gz +0 -0
  136. package/dist/web/assets/tooltip-jGsHGylL.js +1 -0
  137. package/dist/web/assets/tooltip-jGsHGylL.js.br +0 -0
  138. package/dist/web/assets/tooltip-jGsHGylL.js.gz +0 -0
  139. package/dist/web/assets/upload-D6X3pnK5.js +1 -0
  140. package/dist/web/assets/upload-D6X3pnK5.js.br +0 -0
  141. package/dist/web/assets/upload-D6X3pnK5.js.gz +0 -0
  142. package/dist/web/assets/useInfiniteQuery-Bs3l5hx7.js +1 -0
  143. package/dist/web/assets/useInfiniteQuery-Bs3l5hx7.js.br +0 -0
  144. package/dist/web/assets/useInfiniteQuery-Bs3l5hx7.js.gz +0 -0
  145. package/dist/web/assets/{vue-BpAUjojh.js → vue-BcFuTOIy.js} +1 -1
  146. package/dist/web/assets/vue-BcFuTOIy.js.br +0 -0
  147. package/dist/web/assets/vue-BcFuTOIy.js.gz +0 -0
  148. package/dist/web/assets/workbench-inspector-changes-BbHDvE9x.js +2 -0
  149. package/dist/web/assets/workbench-inspector-changes-BbHDvE9x.js.br +0 -0
  150. package/dist/web/assets/workbench-inspector-changes-BbHDvE9x.js.gz +0 -0
  151. package/dist/web/assets/workbench-pet-canvas-DRzsdZ1c.js +1 -0
  152. package/dist/web/assets/workbench-pet-canvas-DRzsdZ1c.js.br +0 -0
  153. package/dist/web/assets/workbench-pet-canvas-DRzsdZ1c.js.gz +0 -0
  154. package/dist/web/assets/workbench-shell-wnOOfeVI.js +15 -0
  155. package/dist/web/assets/workbench-shell-wnOOfeVI.js.br +0 -0
  156. package/dist/web/assets/workbench-shell-wnOOfeVI.js.gz +0 -0
  157. package/dist/web/index.html +12 -8
  158. package/dist/web/index.html.br +0 -0
  159. package/dist/web/index.html.gz +0 -0
  160. package/package.json +7 -10
  161. package/dist/web/assets/button-B0Zy5xUw.js +0 -1
  162. package/dist/web/assets/button-B0Zy5xUw.js.br +0 -0
  163. package/dist/web/assets/button-B0Zy5xUw.js.gz +0 -0
  164. package/dist/web/assets/button-group-Czp67RFV.js +0 -1
  165. package/dist/web/assets/button-group-Czp67RFV.js.br +0 -0
  166. package/dist/web/assets/button-group-Czp67RFV.js.gz +0 -0
  167. package/dist/web/assets/checkbox-J-dVFT8h.js +0 -1
  168. package/dist/web/assets/checkbox-J-dVFT8h.js.br +0 -0
  169. package/dist/web/assets/checkbox-J-dVFT8h.js.gz +0 -0
  170. package/dist/web/assets/chunk-BO2N2NFS-Cv0xdEIU.js.br +0 -0
  171. package/dist/web/assets/chunk-BO2N2NFS-Cv0xdEIU.js.gz +0 -0
  172. package/dist/web/assets/code-highlighter-XA2cEb7n.js.br +0 -0
  173. package/dist/web/assets/code-highlighter-XA2cEb7n.js.gz +0 -0
  174. package/dist/web/assets/code-languages-B1bG8xP9.js +0 -2
  175. package/dist/web/assets/code-languages-B1bG8xP9.js.br +0 -0
  176. package/dist/web/assets/code-languages-B1bG8xP9.js.gz +0 -0
  177. package/dist/web/assets/cpp-BcHBJY00.js +0 -1
  178. package/dist/web/assets/cpp-BcHBJY00.js.br +0 -0
  179. package/dist/web/assets/cpp-BcHBJY00.js.gz +0 -0
  180. package/dist/web/assets/cpp-CIkEvbIe.js +0 -1
  181. package/dist/web/assets/cpp-CIkEvbIe.js.br +0 -0
  182. package/dist/web/assets/cpp-CIkEvbIe.js.gz +0 -0
  183. package/dist/web/assets/engine-compile-DQ0HPfe0.js.br +0 -0
  184. package/dist/web/assets/engine-compile-DQ0HPfe0.js.gz +0 -0
  185. package/dist/web/assets/es2015-D1QRD4rq.js +0 -41
  186. package/dist/web/assets/es2015-D1QRD4rq.js.br +0 -0
  187. package/dist/web/assets/es2015-D1QRD4rq.js.gz +0 -0
  188. package/dist/web/assets/file-fDjkn3KE.js +0 -1
  189. package/dist/web/assets/file-fDjkn3KE.js.br +0 -2
  190. package/dist/web/assets/file-fDjkn3KE.js.gz +0 -0
  191. package/dist/web/assets/file-review-dialog-a4LVk4QA.js +0 -2
  192. package/dist/web/assets/file-review-dialog-a4LVk4QA.js.br +0 -0
  193. package/dist/web/assets/file-review-dialog-a4LVk4QA.js.gz +0 -0
  194. package/dist/web/assets/file-tree-Dh8mZi4H.js +0 -1
  195. package/dist/web/assets/file-tree-Dh8mZi4H.js.br +0 -0
  196. package/dist/web/assets/file-tree-Dh8mZi4H.js.gz +0 -0
  197. package/dist/web/assets/git-commit-horizontal-DqCudnTd.js +0 -1
  198. package/dist/web/assets/git-commit-horizontal-DqCudnTd.js.br +0 -0
  199. package/dist/web/assets/git-commit-horizontal-DqCudnTd.js.gz +0 -0
  200. package/dist/web/assets/git-history-panel-C0BqsVJw.js +0 -2
  201. package/dist/web/assets/git-history-panel-C0BqsVJw.js.br +0 -0
  202. package/dist/web/assets/git-history-panel-C0BqsVJw.js.gz +0 -0
  203. package/dist/web/assets/global-settings-dialog-DAk0qzab.js +0 -1
  204. package/dist/web/assets/global-settings-dialog-DAk0qzab.js.br +0 -0
  205. package/dist/web/assets/global-settings-dialog-DAk0qzab.js.gz +0 -0
  206. package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js +0 -1
  207. package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js.br +0 -0
  208. package/dist/web/assets/grammar-cpp-support-CV8oNpIY.js.gz +0 -0
  209. package/dist/web/assets/highlighted-body-OFNGDK62-3Xd1uGCw.js.br +0 -0
  210. package/dist/web/assets/highlighted-body-OFNGDK62-3Xd1uGCw.js.gz +0 -0
  211. package/dist/web/assets/index-C9MtcGVc.js +0 -4
  212. package/dist/web/assets/index-C9MtcGVc.js.br +0 -0
  213. package/dist/web/assets/index-C9MtcGVc.js.gz +0 -0
  214. package/dist/web/assets/index-DAs_avwK.css +0 -2
  215. package/dist/web/assets/index-DAs_avwK.css.br +0 -0
  216. package/dist/web/assets/index-DAs_avwK.css.gz +0 -0
  217. package/dist/web/assets/lazy-message-response-BDqsH4Ww.js +0 -2
  218. package/dist/web/assets/lazy-message-response-BDqsH4Ww.js.br +0 -0
  219. package/dist/web/assets/lazy-message-response-BDqsH4Ww.js.gz +0 -0
  220. package/dist/web/assets/mermaid-GHXKKRXX-Cp6mRHuL.js +0 -1
  221. package/dist/web/assets/mermaid-GHXKKRXX-Cp6mRHuL.js.br +0 -0
  222. package/dist/web/assets/mermaid-GHXKKRXX-Cp6mRHuL.js.gz +0 -0
  223. package/dist/web/assets/message-response-DyFE9GSy.js +0 -7
  224. package/dist/web/assets/message-response-DyFE9GSy.js.br +0 -0
  225. package/dist/web/assets/message-response-DyFE9GSy.js.gz +0 -0
  226. package/dist/web/assets/patch-diff-viewer-DHfvCO4S.js.br +0 -0
  227. package/dist/web/assets/patch-diff-viewer-DHfvCO4S.js.gz +0 -0
  228. package/dist/web/assets/perl-Br95gH8g.js.br +0 -0
  229. package/dist/web/assets/php-CYrBA5iX.js.br +0 -0
  230. package/dist/web/assets/prompt-input-controls-CLj9lxlf.js +0 -1
  231. package/dist/web/assets/prompt-input-controls-CLj9lxlf.js.br +0 -0
  232. package/dist/web/assets/prompt-input-controls-CLj9lxlf.js.gz +0 -0
  233. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js +0 -1
  234. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.br +0 -0
  235. package/dist/web/assets/prompt-reference-token-Cxx6C-IR.js.gz +0 -0
  236. package/dist/web/assets/provider-connection-queries-C2Fn0xx2.js +0 -1
  237. package/dist/web/assets/provider-connection-queries-C2Fn0xx2.js.br +0 -0
  238. package/dist/web/assets/provider-connection-queries-C2Fn0xx2.js.gz +0 -0
  239. package/dist/web/assets/ruby-CbXu8Ywv.js.br +0 -0
  240. package/dist/web/assets/ruby-CbXu8Ywv.js.gz +0 -0
  241. package/dist/web/assets/shiki-bundle-CNYWcrCX.js.br +0 -0
  242. package/dist/web/assets/shiki-bundle-CNYWcrCX.js.gz +0 -0
  243. package/dist/web/assets/swift-DonLKvLd.js +0 -1
  244. package/dist/web/assets/swift-DonLKvLd.js.br +0 -0
  245. package/dist/web/assets/swift-DonLKvLd.js.gz +0 -0
  246. package/dist/web/assets/vue-BpAUjojh.js.br +0 -0
  247. package/dist/web/assets/vue-BpAUjojh.js.gz +0 -0
  248. package/dist/web/assets/workbench-inspector-changes-fibkZGwp.js +0 -1
  249. package/dist/web/assets/workbench-inspector-changes-fibkZGwp.js.br +0 -0
  250. package/dist/web/assets/workbench-inspector-changes-fibkZGwp.js.gz +0 -0
  251. package/dist/web/assets/workbench-shell-eo1pFJFk.js +0 -13
  252. package/dist/web/assets/workbench-shell-eo1pFJFk.js.br +0 -0
  253. package/dist/web/assets/workbench-shell-eo1pFJFk.js.gz +0 -0
@@ -1,14 +1,14 @@
1
1
  import { createRequire } from 'node:module';
2
- import { PendingRequestResolutionError } from './chunk-3OBVX5TN.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-DR6HEQ7V.js';
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-ZSWNUDDK.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';
7
- import { access, readdir, lstat, readFile, realpath, opendir, stat } from 'fs/promises';
7
+ import { readFile, mkdir, writeFile, rename, rm, readdir, realpath, stat, access, lstat, opendir } from 'fs/promises';
8
8
  import { createRequire as createRequire$1 } from 'module';
9
- import { resolve, basename, dirname, win32, posix, join, isAbsolute, relative, extname } from 'path';
9
+ import { resolve, basename, dirname, join, relative, sep, win32, posix, isAbsolute, extname } from 'path';
10
10
  import { promisify } from 'util';
11
- import { createHash, randomUUID } from 'crypto';
11
+ import { randomUUID, createHash } from 'crypto';
12
12
  import { Buffer as Buffer$1 } from 'buffer';
13
13
  import { tmpdir, homedir } from 'os';
14
14
  import { StringDecoder } from 'string_decoder';
@@ -1250,7 +1250,7 @@ var require_sonic_boom = __commonJS({
1250
1250
  if (!(this instanceof SonicBoom)) {
1251
1251
  return new SonicBoom(opts);
1252
1252
  }
1253
- let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir, retryEAGAIN, fsync, contentMode, mode } = opts || {};
1253
+ let { fd, dest, minLength, maxLength, maxWrite, periodicFlush, sync, append = true, mkdir: mkdir2, retryEAGAIN, fsync, contentMode, mode } = opts || {};
1254
1254
  fd = fd || dest;
1255
1255
  this._len = 0;
1256
1256
  this.fd = -1;
@@ -1275,7 +1275,7 @@ var require_sonic_boom = __commonJS({
1275
1275
  this.append = append || false;
1276
1276
  this.mode = mode;
1277
1277
  this.retryEAGAIN = retryEAGAIN || (() => true);
1278
- this.mkdir = mkdir || false;
1278
+ this.mkdir = mkdir2 || false;
1279
1279
  let fsWriteSync;
1280
1280
  let fsWrite;
1281
1281
  if (contentMode === kContentModeBuffer) {
@@ -1983,7 +1983,7 @@ var require_thread_stream = __commonJS({
1983
1983
  var { version } = require_package();
1984
1984
  var { EventEmitter } = __require("events");
1985
1985
  var { Worker: Worker2 } = __require("worker_threads");
1986
- var { join: join5 } = __require("path");
1986
+ var { join: join6 } = __require("path");
1987
1987
  var { pathToFileURL } = __require("url");
1988
1988
  var { wait } = require_wait();
1989
1989
  var {
@@ -2034,7 +2034,7 @@ var require_thread_stream = __commonJS({
2034
2034
  function createWorker(stream, opts) {
2035
2035
  const { filename, workerData } = opts;
2036
2036
  const bundlerOverrides = "__bundlerPathsOverrides" in globalThis ? globalThis.__bundlerPathsOverrides : {};
2037
- const toExecute = bundlerOverrides["thread-stream-worker"] || join5(__dirname, "lib", "worker.js");
2037
+ const toExecute = bundlerOverrides["thread-stream-worker"] || join6(__dirname, "lib", "worker.js");
2038
2038
  const worker = new Worker2(toExecute, {
2039
2039
  ...opts.workerOpts,
2040
2040
  name: opts.workerOpts?.name || "thread-stream",
@@ -2501,7 +2501,7 @@ var require_transport = __commonJS({
2501
2501
  var { createRequire: createRequire2 } = __require("module");
2502
2502
  var { existsSync } = __require("fs");
2503
2503
  var getCallers = require_caller();
2504
- var { join: join5, isAbsolute: isAbsolute6, sep } = __require("path");
2504
+ var { join: join6, isAbsolute: isAbsolute7, sep: sep3 } = __require("path");
2505
2505
  var { fileURLToPath } = __require("url");
2506
2506
  var sleep = require_atomic_sleep();
2507
2507
  var onExit = require_on_exit_leak_free();
@@ -2573,7 +2573,7 @@ var require_transport = __commonJS({
2573
2573
  return false;
2574
2574
  }
2575
2575
  }
2576
- return isAbsolute6(path) && !existsSync(path);
2576
+ return isAbsolute7(path) && !existsSync(path);
2577
2577
  }
2578
2578
  function stripQuotes(value) {
2579
2579
  const first = value[0];
@@ -2654,7 +2654,7 @@ var require_transport = __commonJS({
2654
2654
  throw new Error("only one of target or targets can be specified");
2655
2655
  }
2656
2656
  if (targets) {
2657
- target = bundlerOverrides["pino-worker"] || join5(__dirname, "worker.js");
2657
+ target = bundlerOverrides["pino-worker"] || join6(__dirname, "worker.js");
2658
2658
  options.targets = targets.filter((dest) => dest.target).map((dest) => {
2659
2659
  return {
2660
2660
  ...dest,
@@ -2672,7 +2672,7 @@ var require_transport = __commonJS({
2672
2672
  });
2673
2673
  });
2674
2674
  } else if (pipeline) {
2675
- target = bundlerOverrides["pino-worker"] || join5(__dirname, "worker.js");
2675
+ target = bundlerOverrides["pino-worker"] || join6(__dirname, "worker.js");
2676
2676
  options.pipelines = [pipeline.map((dest) => {
2677
2677
  return {
2678
2678
  ...dest,
@@ -2691,16 +2691,16 @@ var require_transport = __commonJS({
2691
2691
  return buildStream(fixTarget(target), options, worker, sync, name);
2692
2692
  function fixTarget(origin) {
2693
2693
  origin = bundlerOverrides[origin] || origin;
2694
- if (isAbsolute6(origin) || origin.indexOf("file://") === 0) {
2694
+ if (isAbsolute7(origin) || origin.indexOf("file://") === 0) {
2695
2695
  return origin;
2696
2696
  }
2697
2697
  if (origin === "pino/file") {
2698
- return join5(__dirname, "..", "file.js");
2698
+ return join6(__dirname, "..", "file.js");
2699
2699
  }
2700
2700
  let fixTarget2;
2701
2701
  for (const filePath of callers) {
2702
2702
  try {
2703
- const context = filePath === "node:repl" ? process.cwd() + sep : filePath;
2703
+ const context = filePath === "node:repl" ? process.cwd() + sep3 : filePath;
2704
2704
  fixTarget2 = createRequire2(context).resolve(origin);
2705
2705
  break;
2706
2706
  } catch (err) {
@@ -3670,7 +3670,7 @@ var require_safe_stable_stringify = __commonJS({
3670
3670
  return circularValue;
3671
3671
  }
3672
3672
  let res = "";
3673
- let join5 = ",";
3673
+ let join6 = ",";
3674
3674
  const originalIndentation = indentation;
3675
3675
  if (Array.isArray(value)) {
3676
3676
  if (value.length === 0) {
@@ -3684,7 +3684,7 @@ var require_safe_stable_stringify = __commonJS({
3684
3684
  indentation += spacer;
3685
3685
  res += `
3686
3686
  ${indentation}`;
3687
- join5 = `,
3687
+ join6 = `,
3688
3688
  ${indentation}`;
3689
3689
  }
3690
3690
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -3692,13 +3692,13 @@ ${indentation}`;
3692
3692
  for (; i < maximumValuesToStringify - 1; i++) {
3693
3693
  const tmp2 = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
3694
3694
  res += tmp2 !== void 0 ? tmp2 : "null";
3695
- res += join5;
3695
+ res += join6;
3696
3696
  }
3697
3697
  const tmp = stringifyFnReplacer(String(i), value, stack, replacer, spacer, indentation);
3698
3698
  res += tmp !== void 0 ? tmp : "null";
3699
3699
  if (value.length - 1 > maximumBreadth) {
3700
3700
  const removedKeys = value.length - maximumBreadth - 1;
3701
- res += `${join5}"... ${getItemCount(removedKeys)} not stringified"`;
3701
+ res += `${join6}"... ${getItemCount(removedKeys)} not stringified"`;
3702
3702
  }
3703
3703
  if (spacer !== "") {
3704
3704
  res += `
@@ -3719,7 +3719,7 @@ ${originalIndentation}`;
3719
3719
  let separator = "";
3720
3720
  if (spacer !== "") {
3721
3721
  indentation += spacer;
3722
- join5 = `,
3722
+ join6 = `,
3723
3723
  ${indentation}`;
3724
3724
  whitespace = " ";
3725
3725
  }
@@ -3733,13 +3733,13 @@ ${indentation}`;
3733
3733
  const tmp = stringifyFnReplacer(key2, value, stack, replacer, spacer, indentation);
3734
3734
  if (tmp !== void 0) {
3735
3735
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
3736
- separator = join5;
3736
+ separator = join6;
3737
3737
  }
3738
3738
  }
3739
3739
  if (keyLength > maximumBreadth) {
3740
3740
  const removedKeys = keyLength - maximumBreadth;
3741
3741
  res += `${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`;
3742
- separator = join5;
3742
+ separator = join6;
3743
3743
  }
3744
3744
  if (spacer !== "" && separator.length > 1) {
3745
3745
  res = `
@@ -3780,7 +3780,7 @@ ${originalIndentation}`;
3780
3780
  }
3781
3781
  const originalIndentation = indentation;
3782
3782
  let res = "";
3783
- let join5 = ",";
3783
+ let join6 = ",";
3784
3784
  if (Array.isArray(value)) {
3785
3785
  if (value.length === 0) {
3786
3786
  return "[]";
@@ -3793,7 +3793,7 @@ ${originalIndentation}`;
3793
3793
  indentation += spacer;
3794
3794
  res += `
3795
3795
  ${indentation}`;
3796
- join5 = `,
3796
+ join6 = `,
3797
3797
  ${indentation}`;
3798
3798
  }
3799
3799
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
@@ -3801,13 +3801,13 @@ ${indentation}`;
3801
3801
  for (; i < maximumValuesToStringify - 1; i++) {
3802
3802
  const tmp2 = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
3803
3803
  res += tmp2 !== void 0 ? tmp2 : "null";
3804
- res += join5;
3804
+ res += join6;
3805
3805
  }
3806
3806
  const tmp = stringifyArrayReplacer(String(i), value[i], stack, replacer, spacer, indentation);
3807
3807
  res += tmp !== void 0 ? tmp : "null";
3808
3808
  if (value.length - 1 > maximumBreadth) {
3809
3809
  const removedKeys = value.length - maximumBreadth - 1;
3810
- res += `${join5}"... ${getItemCount(removedKeys)} not stringified"`;
3810
+ res += `${join6}"... ${getItemCount(removedKeys)} not stringified"`;
3811
3811
  }
3812
3812
  if (spacer !== "") {
3813
3813
  res += `
@@ -3820,7 +3820,7 @@ ${originalIndentation}`;
3820
3820
  let whitespace = "";
3821
3821
  if (spacer !== "") {
3822
3822
  indentation += spacer;
3823
- join5 = `,
3823
+ join6 = `,
3824
3824
  ${indentation}`;
3825
3825
  whitespace = " ";
3826
3826
  }
@@ -3829,7 +3829,7 @@ ${indentation}`;
3829
3829
  const tmp = stringifyArrayReplacer(key2, value[key2], stack, replacer, spacer, indentation);
3830
3830
  if (tmp !== void 0) {
3831
3831
  res += `${separator}${strEscape(key2)}:${whitespace}${tmp}`;
3832
- separator = join5;
3832
+ separator = join6;
3833
3833
  }
3834
3834
  }
3835
3835
  if (spacer !== "" && separator.length > 1) {
@@ -3887,20 +3887,20 @@ ${originalIndentation}`;
3887
3887
  indentation += spacer;
3888
3888
  let res2 = `
3889
3889
  ${indentation}`;
3890
- const join6 = `,
3890
+ const join7 = `,
3891
3891
  ${indentation}`;
3892
3892
  const maximumValuesToStringify = Math.min(value.length, maximumBreadth);
3893
3893
  let i = 0;
3894
3894
  for (; i < maximumValuesToStringify - 1; i++) {
3895
3895
  const tmp2 = stringifyIndent(String(i), value[i], stack, spacer, indentation);
3896
3896
  res2 += tmp2 !== void 0 ? tmp2 : "null";
3897
- res2 += join6;
3897
+ res2 += join7;
3898
3898
  }
3899
3899
  const tmp = stringifyIndent(String(i), value[i], stack, spacer, indentation);
3900
3900
  res2 += tmp !== void 0 ? tmp : "null";
3901
3901
  if (value.length - 1 > maximumBreadth) {
3902
3902
  const removedKeys = value.length - maximumBreadth - 1;
3903
- res2 += `${join6}"... ${getItemCount(removedKeys)} not stringified"`;
3903
+ res2 += `${join7}"... ${getItemCount(removedKeys)} not stringified"`;
3904
3904
  }
3905
3905
  res2 += `
3906
3906
  ${originalIndentation}`;
@@ -3916,16 +3916,16 @@ ${originalIndentation}`;
3916
3916
  return '"[Object]"';
3917
3917
  }
3918
3918
  indentation += spacer;
3919
- const join5 = `,
3919
+ const join6 = `,
3920
3920
  ${indentation}`;
3921
3921
  let res = "";
3922
3922
  let separator = "";
3923
3923
  let maximumPropertiesToStringify = Math.min(keyLength, maximumBreadth);
3924
3924
  if (isTypedArrayWithEntries(value)) {
3925
- res += stringifyTypedArray(value, join5, maximumBreadth);
3925
+ res += stringifyTypedArray(value, join6, maximumBreadth);
3926
3926
  keys = keys.slice(value.length);
3927
3927
  maximumPropertiesToStringify -= value.length;
3928
- separator = join5;
3928
+ separator = join6;
3929
3929
  }
3930
3930
  if (deterministic) {
3931
3931
  keys = sort(keys, comparator);
@@ -3936,13 +3936,13 @@ ${indentation}`;
3936
3936
  const tmp = stringifyIndent(key2, value[key2], stack, spacer, indentation);
3937
3937
  if (tmp !== void 0) {
3938
3938
  res += `${separator}${strEscape(key2)}: ${tmp}`;
3939
- separator = join5;
3939
+ separator = join6;
3940
3940
  }
3941
3941
  }
3942
3942
  if (keyLength > maximumBreadth) {
3943
3943
  const removedKeys = keyLength - maximumBreadth;
3944
3944
  res += `${separator}"...": "${getItemCount(removedKeys)} not stringified"`;
3945
- separator = join5;
3945
+ separator = join6;
3946
3946
  }
3947
3947
  if (separator !== "") {
3948
3948
  res = `
@@ -5434,38 +5434,73 @@ function mapFileChangeKind(value) {
5434
5434
  }
5435
5435
  throw new CodexProtocolMappingError("Codex file change kind is invalid");
5436
5436
  }
5437
- function sliceUtf8Tail(value, maxBytes) {
5437
+ function countNewlines(value) {
5438
+ let count = 0;
5439
+ for (let index = 0; index < value.length; index += 1) {
5440
+ if (value.charCodeAt(index) === 10) count += 1;
5441
+ }
5442
+ return count;
5443
+ }
5444
+ function retainHeadTailLines(value, totalNewlines) {
5445
+ const totalLines = value.length === 0 ? 0 : totalNewlines + 1;
5446
+ if (totalLines <= MAX_COMMAND_OUTPUT_LINES) return value;
5447
+ const headLines = Math.ceil(MAX_COMMAND_OUTPUT_LINES / 2);
5448
+ const tailLines = MAX_COMMAND_OUTPUT_LINES - headLines;
5449
+ let prefixEnd = 0;
5450
+ let seenHeadNewlines = 0;
5451
+ for (; prefixEnd < value.length; prefixEnd += 1) {
5452
+ if (value.charCodeAt(prefixEnd) !== 10) continue;
5453
+ seenHeadNewlines += 1;
5454
+ if (seenHeadNewlines === headLines) break;
5455
+ }
5456
+ let suffixStart = value.length;
5457
+ let seenTailNewlines = 0;
5458
+ for (; suffixStart > 0; suffixStart -= 1) {
5459
+ if (value.charCodeAt(suffixStart - 1) !== 10) continue;
5460
+ seenTailNewlines += 1;
5461
+ if (seenTailNewlines === tailLines) break;
5462
+ }
5463
+ return `${value.slice(0, prefixEnd)}
5464
+ ${value.slice(suffixStart)}`;
5465
+ }
5466
+ function trimTrailingPartialUtf8(value) {
5467
+ let index = value.length - 1;
5468
+ while (index >= 0 && ((value[index] ?? 0) & 192) === 128 && value.length - index <= 3) {
5469
+ index -= 1;
5470
+ }
5471
+ if (index < 0) return value;
5472
+ const lead = value[index] ?? 0;
5473
+ const expected = lead < 128 ? 1 : lead < 224 ? 2 : lead < 240 ? 3 : lead < 248 ? 4 : 0;
5474
+ return expected > 0 && value.length - index < expected ? value.subarray(0, index) : value;
5475
+ }
5476
+ function trimLeadingContinuationUtf8(value) {
5477
+ let index = 0;
5478
+ while (index < value.length && ((value[index] ?? 0) & 192) === 128) index += 1;
5479
+ return value.subarray(index);
5480
+ }
5481
+ function retainHeadTailBytes(value) {
5438
5482
  const encoded = Buffer$1.from(value, "utf8");
5439
- let start = Math.max(0, encoded.length - maxBytes);
5440
- while (start < encoded.length) {
5441
- const byte = encoded[start];
5442
- if (byte === void 0 || (byte & 192) !== 128) {
5443
- break;
5444
- }
5445
- start += 1;
5446
- }
5447
- return encoded.subarray(start).toString("utf8");
5483
+ if (encoded.length <= MAX_COMMAND_OUTPUT_BYTES) return value;
5484
+ const headBytes = Math.ceil(MAX_COMMAND_OUTPUT_BYTES / 2);
5485
+ const tailBytes = MAX_COMMAND_OUTPUT_BYTES - headBytes;
5486
+ const head = trimTrailingPartialUtf8(encoded.subarray(0, headBytes)).toString("utf8");
5487
+ const tail = trimLeadingContinuationUtf8(encoded.subarray(encoded.length - tailBytes)).toString(
5488
+ "utf8"
5489
+ );
5490
+ return `${head}${tail}`;
5448
5491
  }
5449
5492
  function boundCommandOutput(value) {
5450
- let output = value;
5451
- let outputTruncated = false;
5452
- let newlineCount = 0;
5453
- for (let index = output.length - 1; index >= 0; index -= 1) {
5454
- if (output.charCodeAt(index) !== 10) {
5455
- continue;
5456
- }
5457
- newlineCount += 1;
5458
- if (newlineCount === MAX_COMMAND_OUTPUT_LINES) {
5459
- output = output.slice(index + 1);
5460
- outputTruncated = true;
5461
- break;
5493
+ const originalBytes = Buffer$1.byteLength(value, "utf8");
5494
+ const originalLines = countNewlines(value);
5495
+ const lineBounded = retainHeadTailLines(value, originalLines);
5496
+ const output = retainHeadTailBytes(lineBounded);
5497
+ return {
5498
+ output,
5499
+ outputOmitted: {
5500
+ bytes: originalBytes - Buffer$1.byteLength(output, "utf8"),
5501
+ lines: originalLines - countNewlines(output)
5462
5502
  }
5463
- }
5464
- if (Buffer$1.byteLength(output, "utf8") > MAX_COMMAND_OUTPUT_BYTES) {
5465
- output = sliceUtf8Tail(output, MAX_COMMAND_OUTPUT_BYTES);
5466
- outputTruncated = true;
5467
- }
5468
- return { output, outputTruncated };
5503
+ };
5469
5504
  }
5470
5505
  function mapToolError(value) {
5471
5506
  if (value === null || value === void 0) {
@@ -6304,7 +6339,7 @@ function mapAgentItem(value, subagentNicknames = /* @__PURE__ */ new Map(), mapI
6304
6339
  ...exitCode === void 0 ? {} : { exitCode },
6305
6340
  id,
6306
6341
  ...output === void 0 ? {} : { output: output.output },
6307
- outputTruncated: output?.outputTruncated ?? false,
6342
+ outputOmitted: output?.outputOmitted ?? { bytes: 0, lines: 0 },
6308
6343
  status: mapItemStatus(item["status"]),
6309
6344
  type: "command"
6310
6345
  };
@@ -7070,8 +7105,8 @@ var JsonlFrameProcessor = class {
7070
7105
  const id = this.#nextRequestId++;
7071
7106
  const transferable = Uint8Array.from(frame);
7072
7107
  const transferredBuffer = transferable.buffer;
7073
- return new Promise((resolve5, reject) => {
7074
- this.#pending.set(id, { reject, resolve: resolve5 });
7108
+ return new Promise((resolve7, reject) => {
7109
+ this.#pending.set(id, { reject, resolve: resolve7 });
7075
7110
  this.#worker.postMessage({ frame: transferredBuffer, id }, [transferredBuffer]);
7076
7111
  });
7077
7112
  }
@@ -7181,7 +7216,7 @@ function parseRpcError(value) {
7181
7216
  function writeRpcMessage(output, message, timeoutMs) {
7182
7217
  const frame = `${JSON.stringify(message)}
7183
7218
  `;
7184
- return new Promise((resolve5, reject) => {
7219
+ return new Promise((resolve7, reject) => {
7185
7220
  const timer = setTimeout(() => {
7186
7221
  reject(new RpcConnectionClosedError(`RPC write timed out after ${String(timeoutMs)}ms`));
7187
7222
  }, timeoutMs);
@@ -7192,7 +7227,7 @@ function writeRpcMessage(output, message, timeoutMs) {
7192
7227
  reject(new RpcConnectionClosedError(`RPC write failed: ${error.message}`));
7193
7228
  return;
7194
7229
  }
7195
- resolve5();
7230
+ resolve7();
7196
7231
  });
7197
7232
  });
7198
7233
  }
@@ -7366,7 +7401,7 @@ var JsonlRpcClient = class {
7366
7401
  }
7367
7402
  const id = this.#nextRequestId++;
7368
7403
  const request = params === void 0 ? { id, method } : { id, method, params };
7369
- return new Promise((resolve5, reject) => {
7404
+ return new Promise((resolve7, reject) => {
7370
7405
  const pending = new RpcPendingRequest({
7371
7406
  onTimeout: () => {
7372
7407
  if (this.#removePending(id, pending)) {
@@ -7375,7 +7410,7 @@ var JsonlRpcClient = class {
7375
7410
  },
7376
7411
  reject,
7377
7412
  request,
7378
- resolve: resolve5,
7413
+ resolve: resolve7,
7379
7414
  timeoutMs
7380
7415
  });
7381
7416
  this.#pending.set(id, pending);
@@ -9427,6 +9462,7 @@ var CodexAgentProviderQueue = class extends CodexAgentProviderBase {
9427
9462
  ),
9428
9463
  id: expectString(queued["id"], "thread queue submission id"),
9429
9464
  skills,
9465
+ status: "queued",
9430
9466
  text: content.text
9431
9467
  };
9432
9468
  }
@@ -9579,8 +9615,8 @@ var CodexAgentProviderTurns = class extends CodexAgentProviderQueue {
9579
9615
  );
9580
9616
  }
9581
9617
  let resolveStartedTurn = () => void 0;
9582
- const startedTurn = new Promise((resolve5) => {
9583
- resolveStartedTurn = resolve5;
9618
+ const startedTurn = new Promise((resolve7) => {
9619
+ resolveStartedTurn = resolve7;
9584
9620
  });
9585
9621
  const listener = (event) => {
9586
9622
  if (event.taskId === taskId && event.type === "turn.started") {
@@ -11401,7 +11437,7 @@ var CodexFuzzyFileSearchService = class {
11401
11437
  throw abortError("File search request was aborted");
11402
11438
  }
11403
11439
  this.#clearIdleTimer(session);
11404
- return new Promise((resolve5, reject) => {
11440
+ return new Promise((resolve7, reject) => {
11405
11441
  const cachedSnapshot = session.lastSnapshot?.query === input.query ? session.lastSnapshot : void 0;
11406
11442
  const request = {
11407
11443
  data: cachedSnapshot?.data ?? [],
@@ -11409,7 +11445,7 @@ var CodexFuzzyFileSearchService = class {
11409
11445
  query: input.query,
11410
11446
  receivedUpdate: cachedSnapshot !== void 0,
11411
11447
  reject,
11412
- resolve: resolve5,
11448
+ resolve: resolve7,
11413
11449
  settled: false
11414
11450
  };
11415
11451
  request.detachAbort = this.#listenForAbort(session, request, input.signal);
@@ -12143,8 +12179,8 @@ var CodexAppServerShutdownError = class extends RpcConnectionClosedError {
12143
12179
  }
12144
12180
  };
12145
12181
  function delay(milliseconds) {
12146
- return new Promise((resolve5) => {
12147
- const timer = setTimeout(resolve5, milliseconds);
12182
+ return new Promise((resolve7) => {
12183
+ const timer = setTimeout(resolve7, milliseconds);
12148
12184
  timer.unref();
12149
12185
  });
12150
12186
  }
@@ -12177,8 +12213,8 @@ var CodexAppServerProcess = class {
12177
12213
  child.stderr.on("data", (chunk) => {
12178
12214
  this.#appendStderr(typeof chunk === "string" ? chunk : chunk.toString("utf8"));
12179
12215
  });
12180
- this.#spawnPromise = new Promise((resolve5, reject) => {
12181
- child.once("spawn", resolve5);
12216
+ this.#spawnPromise = new Promise((resolve7, reject) => {
12217
+ child.once("spawn", resolve7);
12182
12218
  child.once("error", (error) => {
12183
12219
  const spawnError = new CodexAppServerSpawnError(
12184
12220
  `Failed to start Codex App Server: ${error.message}`,
@@ -12194,10 +12230,10 @@ var CodexAppServerProcess = class {
12194
12230
  this.client.close(new CodexAppServerExitedError({ code, signal }, this.#stderr.trim()));
12195
12231
  }
12196
12232
  });
12197
- this.#exitPromise = new Promise((resolve5) => {
12233
+ this.#exitPromise = new Promise((resolve7) => {
12198
12234
  child.once("close", (code, signal) => {
12199
12235
  this.#closed = true;
12200
- resolve5({ code, signal });
12236
+ resolve7({ code, signal });
12201
12237
  });
12202
12238
  });
12203
12239
  this.client.onError(() => {
@@ -12662,4 +12698,823 @@ var CodexProjectRepository = class {
12662
12698
  }
12663
12699
  };
12664
12700
 
12665
- export { CodexAppServerExitedError, CodexAppServerProcess, CodexAppServerShutdownError, CodexAppServerSpawnError, CodexProjectRepository, CodexProtocolMappingError, CodexProviderConnectionError, CodexProviderConnectionService, CodexRuntimeProvider, JsonlRpcClient, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError, SUPPORTED_CODEX_VERSION, checkCodexVersion, createCodexRuntimeProvider, locateCodexBinary, require_pino, startCodexAppServer };
12701
+ // packages/provider-codex/src/workbench-pet-catalog.ts
12702
+ var PET_PACK_VERSION = "v1";
12703
+ var PET_CDN_BASE_URL = "https://persistent.oaistatic.com/codex/pets/v1";
12704
+ var PET_FRAME = { columns: 8, height: 208, rows: 9, width: 192 };
12705
+ var PET_SPRITESHEET = { height: 1872, width: 1536 };
12706
+ var BUILTIN_PETS = [
12707
+ {
12708
+ description: "The original Codex companion",
12709
+ displayName: "Codex",
12710
+ file: "codex-spritesheet-v4.webp",
12711
+ id: "codex"
12712
+ },
12713
+ {
12714
+ description: "A tidy duck for calm workspace days",
12715
+ displayName: "Dewey",
12716
+ file: "dewey-spritesheet-v4.webp",
12717
+ id: "dewey"
12718
+ },
12719
+ {
12720
+ description: "Hot path energy for fast iteration",
12721
+ displayName: "Fireball",
12722
+ file: "fireball-spritesheet-v4.webp",
12723
+ id: "fireball"
12724
+ },
12725
+ {
12726
+ description: "A steady rock when the diff gets large",
12727
+ displayName: "Rocky",
12728
+ file: "rocky-spritesheet-v4.webp",
12729
+ id: "rocky"
12730
+ },
12731
+ {
12732
+ description: "Small green shoots for new ideas",
12733
+ displayName: "Seedy",
12734
+ file: "seedy-spritesheet-v4.webp",
12735
+ id: "seedy"
12736
+ },
12737
+ {
12738
+ description: "A balanced stack for deep work",
12739
+ displayName: "Stacky",
12740
+ file: "stacky-spritesheet-v4.webp",
12741
+ id: "stacky"
12742
+ },
12743
+ {
12744
+ description: "A tiny blue-screen gremlin",
12745
+ displayName: "BSOD",
12746
+ file: "bsod-spritesheet-v4.webp",
12747
+ id: "bsod"
12748
+ },
12749
+ {
12750
+ description: "Quiet signal from the void",
12751
+ displayName: "Null Signal",
12752
+ file: "null-signal-spritesheet-v4.webp",
12753
+ id: "null-signal"
12754
+ }
12755
+ ];
12756
+ var idleFrames = [
12757
+ [0, 1680],
12758
+ [1, 660],
12759
+ [2, 660],
12760
+ [3, 840],
12761
+ [4, 840],
12762
+ [5, 1920]
12763
+ ];
12764
+ function idleAnimation() {
12765
+ return {
12766
+ fallback: "idle",
12767
+ frames: idleFrames.map(([spriteIndex, durationMs]) => ({ durationMs, spriteIndex })),
12768
+ loopStart: 0
12769
+ };
12770
+ }
12771
+ function stateAnimation(row, frameCount, durationMs, finalDurationMs) {
12772
+ const primary = Array.from({ length: frameCount }, (_, column) => ({
12773
+ durationMs: column === frameCount - 1 ? finalDurationMs : durationMs,
12774
+ spriteIndex: row * PET_FRAME.columns + column
12775
+ }));
12776
+ return {
12777
+ fallback: "idle",
12778
+ frames: [...primary, ...primary, ...primary, ...idleAnimation().frames],
12779
+ loopStart: primary.length * 3
12780
+ };
12781
+ }
12782
+ function createDefaultPetAnimations() {
12783
+ const tracks = {
12784
+ failed: stateAnimation(5, 8, 140, 240),
12785
+ idle: idleAnimation(),
12786
+ jumping: stateAnimation(4, 5, 140, 280),
12787
+ review: stateAnimation(8, 6, 150, 280),
12788
+ "running-left": stateAnimation(2, 8, 120, 220),
12789
+ "running-right": stateAnimation(1, 8, 120, 220),
12790
+ running: stateAnimation(7, 6, 120, 220),
12791
+ waiting: stateAnimation(6, 6, 150, 260),
12792
+ waving: stateAnimation(3, 4, 140, 280)
12793
+ };
12794
+ return {
12795
+ ...tracks,
12796
+ bounce: tracks.jumping,
12797
+ move_left: tracks["running-left"],
12798
+ move_right: tracks["running-right"],
12799
+ sad: tracks.failed,
12800
+ wave: tracks.waving
12801
+ };
12802
+ }
12803
+ function createBuiltinDescriptor(pet, assetId, availability) {
12804
+ return {
12805
+ animations: createDefaultPetAnimations(),
12806
+ assetId,
12807
+ availability,
12808
+ description: pet.description,
12809
+ displayName: pet.displayName,
12810
+ frame: PET_FRAME,
12811
+ id: pet.id,
12812
+ source: "builtin"
12813
+ };
12814
+ }
12815
+
12816
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/utilities.js
12817
+ function isValidOffsetToRead(dataView, offset, bytesToRead) {
12818
+ return dataView.byteLength >= offset + bytesToRead;
12819
+ }
12820
+ function getUint32(dataView, offset, littleEndian = false) {
12821
+ if (isValidOffsetToRead(dataView, offset, 4)) {
12822
+ return dataView.getUint32(offset, littleEndian);
12823
+ }
12824
+ }
12825
+ function getUint16(dataView, offset, littleEndian = false) {
12826
+ if (isValidOffsetToRead(dataView, offset, 2)) {
12827
+ return dataView.getUint16(offset, littleEndian);
12828
+ }
12829
+ }
12830
+ function getIsobmffFtypBrands(bytes) {
12831
+ if (bytes.length < 16) {
12832
+ return;
12833
+ }
12834
+ const isFtyp = bytes[4] === 102 && bytes[5] === 116 && bytes[6] === 121 && bytes[7] === 112;
12835
+ if (!isFtyp) {
12836
+ return;
12837
+ }
12838
+ const dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
12839
+ const size = getUint32(dataView, 0);
12840
+ if (size === void 0 || size < 16 || size > bytes.length) {
12841
+ return;
12842
+ }
12843
+ const brands = [];
12844
+ brands.push(String.fromCodePoint(...bytes.slice(8, 12)));
12845
+ for (let i = 16; i + 4 <= size; i += 4) {
12846
+ brands.push(String.fromCodePoint(...bytes.slice(i, i + 4)));
12847
+ }
12848
+ return brands;
12849
+ }
12850
+ function unboxIsobmffBox(data, offset) {
12851
+ const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);
12852
+ const size = getUint32(dataView, offset);
12853
+ if (size === void 0) {
12854
+ return;
12855
+ }
12856
+ if (data.length < size + offset || size < 8) {
12857
+ return;
12858
+ }
12859
+ return {
12860
+ type: String.fromCodePoint(...data.slice(offset + 4, offset + 8)),
12861
+ data: data.slice(offset + 8, offset + size),
12862
+ tail: offset + size
12863
+ };
12864
+ }
12865
+ function getIsobmffIspeSizesFromMeta(data) {
12866
+ const sizes = [];
12867
+ let offset = 0;
12868
+ while (offset < data.length) {
12869
+ const box = unboxIsobmffBox(data, offset);
12870
+ if (!box) {
12871
+ break;
12872
+ }
12873
+ if (box.type === "meta") {
12874
+ parseIsobmffMetaBox(box.data, sizes);
12875
+ }
12876
+ offset = box.tail;
12877
+ }
12878
+ return sizes;
12879
+ }
12880
+ function parseIsobmffMetaBox(data, sizes) {
12881
+ let offset = 4;
12882
+ while (offset < data.length) {
12883
+ const box = unboxIsobmffBox(data, offset);
12884
+ if (!box) {
12885
+ break;
12886
+ }
12887
+ if (box.type === "iprp") {
12888
+ parseIsobmffIprpBox(box.data, sizes);
12889
+ }
12890
+ offset = box.tail;
12891
+ }
12892
+ return sizes;
12893
+ }
12894
+ function parseIsobmffIprpBox(data, sizes) {
12895
+ let offset = 0;
12896
+ while (offset < data.length) {
12897
+ const box = unboxIsobmffBox(data, offset);
12898
+ if (!box) {
12899
+ break;
12900
+ }
12901
+ if (box.type === "ipco") {
12902
+ parseIsobmffIpcoBox(box.data, sizes);
12903
+ }
12904
+ offset = box.tail;
12905
+ }
12906
+ }
12907
+ function parseIsobmffIpcoBox(data, sizes) {
12908
+ let offset = 0;
12909
+ while (offset < data.length) {
12910
+ const box = unboxIsobmffBox(data, offset);
12911
+ if (!box) {
12912
+ break;
12913
+ }
12914
+ if (box.type === "ispe") {
12915
+ const dataView = new DataView(box.data.buffer, box.data.byteOffset, box.data.byteLength);
12916
+ const width = getUint32(dataView, 4);
12917
+ const height = getUint32(dataView, 8);
12918
+ if (width === void 0 || height === void 0) {
12919
+ return;
12920
+ }
12921
+ sizes.push({
12922
+ width,
12923
+ height
12924
+ });
12925
+ }
12926
+ offset = box.tail;
12927
+ }
12928
+ }
12929
+ function getLargestAreaSize(sizes) {
12930
+ let maxSize = sizes[0];
12931
+ for (const size of sizes) {
12932
+ if (size.width * size.height > maxSize.width * maxSize.height) {
12933
+ maxSize = size;
12934
+ }
12935
+ }
12936
+ return maxSize;
12937
+ }
12938
+
12939
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/png.js
12940
+ var isPng = (bytes) => bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71 && bytes[4] === 13 && bytes[5] === 10 && bytes[6] === 26 && bytes[7] === 10;
12941
+ var isAppleMinifiedPng = (bytes) => bytes[12] === 67 && bytes[13] === 103 && bytes[14] === 66 && bytes[15] === 73;
12942
+ function png(bytes) {
12943
+ if (!isPng(bytes)) {
12944
+ return;
12945
+ }
12946
+ const dataView = new DataView(bytes.buffer);
12947
+ const isAppleMinified = isAppleMinifiedPng(bytes);
12948
+ const width = getUint32(dataView, isAppleMinified ? 32 : 16, false);
12949
+ const height = getUint32(dataView, isAppleMinified ? 36 : 20, false);
12950
+ if (width === void 0 || height === void 0) {
12951
+ return;
12952
+ }
12953
+ return {
12954
+ width,
12955
+ height,
12956
+ type: "png"
12957
+ };
12958
+ }
12959
+
12960
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/jpeg.js
12961
+ var SOF0 = 65472;
12962
+ var SOF3 = 65475;
12963
+ var jsJpeg = (bytes) => bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255;
12964
+ function jpeg(bytes) {
12965
+ if (!jsJpeg(bytes)) {
12966
+ return;
12967
+ }
12968
+ const dataView = new DataView(bytes.buffer);
12969
+ let offset = 2;
12970
+ while (isValidOffsetToRead(dataView, offset, 2)) {
12971
+ const marker = dataView.getUint16(offset);
12972
+ offset += 2;
12973
+ if (marker >= SOF0 && marker <= SOF3) {
12974
+ const height = getUint16(dataView, offset + 3, false);
12975
+ const width = getUint16(dataView, offset + 5, false);
12976
+ if (height === void 0 || width === void 0) {
12977
+ return;
12978
+ }
12979
+ return {
12980
+ height,
12981
+ width,
12982
+ type: "jpeg"
12983
+ };
12984
+ }
12985
+ const segmentLength = getUint16(dataView, offset);
12986
+ if (segmentLength === void 0) {
12987
+ return;
12988
+ }
12989
+ offset += segmentLength;
12990
+ if (offset > dataView.byteLength) {
12991
+ return;
12992
+ }
12993
+ }
12994
+ }
12995
+
12996
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/gif.js
12997
+ var isGif = (bytes) => bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56 && (bytes[4] === 55 || bytes[4] === 57) && bytes[5] === 97;
12998
+ function gif(bytes) {
12999
+ if (!isGif(bytes)) {
13000
+ return;
13001
+ }
13002
+ const dataView = new DataView(bytes.buffer);
13003
+ const width = getUint16(dataView, 6, true);
13004
+ const height = getUint16(dataView, 8, true);
13005
+ if (width === void 0 || height === void 0) {
13006
+ return;
13007
+ }
13008
+ return {
13009
+ width,
13010
+ height,
13011
+ type: "gif"
13012
+ };
13013
+ }
13014
+
13015
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/webp.js
13016
+ var isWebp = (bytes) => (
13017
+ // RIFF
13018
+ bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80
13019
+ );
13020
+ var isVP8Lossy = (bytes) => (
13021
+ // `VP8 ` (note the space)
13022
+ bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 32
13023
+ );
13024
+ var isVP8Lossless = (bytes) => (
13025
+ // `VP8L`
13026
+ bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 76
13027
+ );
13028
+ var isVP8Extended = (bytes) => (
13029
+ // `VP8X`
13030
+ bytes[12] === 86 && bytes[13] === 80 && bytes[14] === 56 && bytes[15] === 88
13031
+ );
13032
+ function readUInt24LE(dataView, offset) {
13033
+ const byte1 = dataView.getUint8(offset);
13034
+ const byte2 = dataView.getUint8(offset + 1);
13035
+ const byte3 = dataView.getUint8(offset + 2);
13036
+ return byte3 << 16 | byte2 << 8 | byte1;
13037
+ }
13038
+ function webp(bytes) {
13039
+ if (!isWebp(bytes)) {
13040
+ return;
13041
+ }
13042
+ const dataView = new DataView(bytes.buffer);
13043
+ const maxSize = 16383;
13044
+ if (isVP8Lossy(bytes)) {
13045
+ if (!isValidOffsetToRead(dataView, 28, 2)) {
13046
+ return;
13047
+ }
13048
+ return {
13049
+ // eslint-disable-next-line no-bitwise
13050
+ width: dataView.getUint16(26, true) & maxSize,
13051
+ // eslint-disable-next-line no-bitwise
13052
+ height: dataView.getUint16(28, true) & maxSize,
13053
+ type: "webp"
13054
+ };
13055
+ }
13056
+ if (isVP8Lossless(bytes)) {
13057
+ const bits = getUint32(dataView, 21, true);
13058
+ if (bits === void 0) {
13059
+ return;
13060
+ }
13061
+ return {
13062
+ // eslint-disable-next-line no-bitwise
13063
+ width: (bits & maxSize) + 1,
13064
+ // eslint-disable-next-line no-bitwise
13065
+ height: (bits >> 14 & maxSize) + 1,
13066
+ type: "webp"
13067
+ };
13068
+ }
13069
+ if (isVP8Extended(bytes)) {
13070
+ if (!isValidOffsetToRead(dataView, 27, 3)) {
13071
+ return;
13072
+ }
13073
+ return {
13074
+ width: readUInt24LE(dataView, 24) + 1,
13075
+ height: readUInt24LE(dataView, 27) + 1,
13076
+ type: "webp"
13077
+ };
13078
+ }
13079
+ }
13080
+
13081
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/avif.js
13082
+ var avifBrands = /* @__PURE__ */ new Set([
13083
+ "avif",
13084
+ "avis",
13085
+ "avio"
13086
+ ]);
13087
+ var isAvif = (bytes) => {
13088
+ const brands = getIsobmffFtypBrands(bytes);
13089
+ if (!brands) {
13090
+ return false;
13091
+ }
13092
+ return brands.some((brand) => avifBrands.has(brand));
13093
+ };
13094
+ function avif(bytes) {
13095
+ if (!isAvif(bytes)) {
13096
+ return;
13097
+ }
13098
+ const sizes = getIsobmffIspeSizesFromMeta(bytes);
13099
+ if (sizes.length === 0) {
13100
+ return;
13101
+ }
13102
+ return {
13103
+ ...getLargestAreaSize(sizes),
13104
+ type: "avif"
13105
+ };
13106
+ }
13107
+
13108
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/types/heic.js
13109
+ var heifBrands = /* @__PURE__ */ new Set([
13110
+ "mif1",
13111
+ "msf1",
13112
+ "heic",
13113
+ "heix",
13114
+ "hevc",
13115
+ "hevx",
13116
+ "heim",
13117
+ "heis",
13118
+ "hevm",
13119
+ "hevs"
13120
+ ]);
13121
+ var isHeic = (bytes) => {
13122
+ const brands = getIsobmffFtypBrands(bytes);
13123
+ if (!brands) {
13124
+ return false;
13125
+ }
13126
+ return brands.some((brand) => heifBrands.has(brand));
13127
+ };
13128
+ function heic(bytes) {
13129
+ if (!isHeic(bytes)) {
13130
+ return;
13131
+ }
13132
+ const sizes = getIsobmffIspeSizesFromMeta(bytes);
13133
+ if (sizes.length === 0) {
13134
+ return;
13135
+ }
13136
+ return {
13137
+ ...getLargestAreaSize(sizes),
13138
+ type: "heic"
13139
+ };
13140
+ }
13141
+
13142
+ // node_modules/.pnpm/image-dimensions@2.5.1/node_modules/image-dimensions/index.js
13143
+ function imageDimensionsFromData(bytes) {
13144
+ if (bytes.length < 3) {
13145
+ return;
13146
+ }
13147
+ bytes = new Uint8Array(bytes);
13148
+ return png(bytes) ?? gif(bytes) ?? jpeg(bytes) ?? webp(bytes) ?? avif(bytes) ?? heic(bytes);
13149
+ }
13150
+
13151
+ // packages/provider-codex/src/workbench-pet-image.ts
13152
+ function readWebpDimensions(data) {
13153
+ const dimensions = imageDimensionsFromData(data);
13154
+ if (dimensions?.type !== "webp") {
13155
+ throw new Error("Pet spritesheet must be a valid WebP image");
13156
+ }
13157
+ return dimensions;
13158
+ }
13159
+ async function readWebpDimensionsFromFile(path) {
13160
+ return readWebpDimensions(await readFile(path));
13161
+ }
13162
+ var MAX_MANIFEST_BYTES = 64 * 1024;
13163
+ var MAX_CUSTOM_ASSET_BYTES = 16 * 1024 * 1024;
13164
+ var MAX_FRAMES = 256;
13165
+ var MAX_FPS = 60;
13166
+ async function loadCustomPet(input) {
13167
+ const baseDirectory = await realpath(input.directory);
13168
+ const manifestPath = resolve(baseDirectory, input.manifestName);
13169
+ const manifestStats = await stat(manifestPath);
13170
+ if (!manifestStats.isFile() || manifestStats.size > MAX_MANIFEST_BYTES) {
13171
+ throw new Error("Pet manifest is missing or too large");
13172
+ }
13173
+ const raw = await readFile(manifestPath, "utf8");
13174
+ const manifest = parseRecord(JSON.parse(raw), "Pet manifest");
13175
+ const spritesheetPath = readOptionalString(manifest, "spritesheetPath") ?? "spritesheet.webp";
13176
+ if (isAbsolute(spritesheetPath) || spritesheetPath.split(/[\\/]/u).includes("..")) {
13177
+ throw new Error("Pet spritesheet must stay inside its directory");
13178
+ }
13179
+ const path = await realpath(resolve(baseDirectory, spritesheetPath));
13180
+ assertContained(baseDirectory, path);
13181
+ const assetStats = await stat(path);
13182
+ if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
13183
+ throw new Error("Pet spritesheet is missing or too large");
13184
+ }
13185
+ const dimensions = await readWebpDimensionsFromFile(path);
13186
+ const frame = parseFrame(manifest["frame"]);
13187
+ const frameCount = validateFrame(frame, dimensions.width, dimensions.height);
13188
+ const animations = parseAnimations(manifest["animations"], frameCount);
13189
+ const manifestId = readOptionalString(manifest, "id");
13190
+ return {
13191
+ assetId: input.assetId,
13192
+ baseDirectory,
13193
+ descriptor: {
13194
+ animations,
13195
+ assetId: input.assetId,
13196
+ availability: "ready",
13197
+ description: readOptionalString(manifest, "description") ?? "",
13198
+ displayName: readOptionalString(manifest, "displayName") ?? manifestId ?? input.folder,
13199
+ frame,
13200
+ id: `custom:${input.folder}`,
13201
+ source: input.source
13202
+ },
13203
+ path
13204
+ };
13205
+ }
13206
+ async function validatePetAsset(record) {
13207
+ const [baseDirectory, resolved] = await Promise.all([
13208
+ realpath(record.baseDirectory),
13209
+ realpath(record.path)
13210
+ ]);
13211
+ assertContained(baseDirectory, resolved);
13212
+ const assetStats = await stat(resolved);
13213
+ if (!assetStats.isFile() || assetStats.size > MAX_CUSTOM_ASSET_BYTES) {
13214
+ throw new Error("Pet spritesheet is unavailable");
13215
+ }
13216
+ const dimensions = await readWebpDimensionsFromFile(resolved);
13217
+ validateFrame(record.descriptor.frame, dimensions.width, dimensions.height);
13218
+ return { mtimeMs: assetStats.mtimeMs, size: assetStats.size };
13219
+ }
13220
+ function parseFrame(value) {
13221
+ if (value === void 0 || value === null) return PET_FRAME;
13222
+ const frame = parseRecord(value, "Pet frame");
13223
+ return {
13224
+ columns: readPositiveInteger(frame, "columns"),
13225
+ height: readPositiveInteger(frame, "height"),
13226
+ rows: readPositiveInteger(frame, "rows"),
13227
+ width: readPositiveInteger(frame, "width")
13228
+ };
13229
+ }
13230
+ function validateFrame(frame, width, height) {
13231
+ if (width === void 0 || height === void 0 || frame.width * frame.columns !== width || frame.height * frame.rows !== height) {
13232
+ throw new Error("Pet frame grid must cover the spritesheet exactly");
13233
+ }
13234
+ const frameCount = frame.columns * frame.rows;
13235
+ if (frameCount > MAX_FRAMES) throw new Error("Pet frame count exceeds the maximum");
13236
+ return frameCount;
13237
+ }
13238
+ function parseAnimations(value, frameCount) {
13239
+ const defaults = createDefaultPetAnimations();
13240
+ if (value === void 0 || value === null) return defaults;
13241
+ const source = parseRecord(value, "Pet animations");
13242
+ if (Object.keys(source).length === 0) return defaults;
13243
+ const animations = { ...defaults };
13244
+ for (const [name, raw] of Object.entries(source)) {
13245
+ const spec = parseRecord(raw, `Pet animation ${name}`);
13246
+ const frames = spec["frames"];
13247
+ if (!Array.isArray(frames) || frames.length === 0) {
13248
+ throw new Error(`Pet animation ${name} requires frames`);
13249
+ }
13250
+ const spriteIndices = frames.map((frame) => {
13251
+ if (!Number.isInteger(frame) || Number(frame) < 0 || Number(frame) >= frameCount) {
13252
+ throw new Error(`Pet animation ${name} has an invalid frame`);
13253
+ }
13254
+ return Number(frame);
13255
+ });
13256
+ const fps = spec["fps"] === void 0 ? 8 : Number(spec["fps"]);
13257
+ if (!Number.isFinite(fps) || fps <= 0 || fps > MAX_FPS) {
13258
+ throw new Error(`Pet animation ${name} has an invalid fps`);
13259
+ }
13260
+ const loops = spec["loop"] === void 0 ? true : spec["loop"];
13261
+ if (typeof loops !== "boolean") throw new Error(`Pet animation ${name} has an invalid loop`);
13262
+ animations[name] = {
13263
+ fallback: readOptionalString(spec, "fallback") ?? "idle",
13264
+ frames: spriteIndices.map((spriteIndex) => ({
13265
+ durationMs: Math.max(1, Math.round(1e3 / fps)),
13266
+ spriteIndex
13267
+ })),
13268
+ loopStart: loops ? 0 : null
13269
+ };
13270
+ }
13271
+ for (const [name, animation] of Object.entries(animations)) {
13272
+ if (animations[animation.fallback] === void 0) {
13273
+ throw new Error(`Pet animation ${name} has an unknown fallback`);
13274
+ }
13275
+ }
13276
+ return animations;
13277
+ }
13278
+ function assertContained(base, target) {
13279
+ const child = relative(base, target);
13280
+ if (child === "" || !child.startsWith(`..${sep}`) && child !== ".." && !isAbsolute(child)) {
13281
+ return;
13282
+ }
13283
+ throw new Error("Pet asset escapes its directory");
13284
+ }
13285
+ function parseRecord(value, label) {
13286
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
13287
+ throw new Error(`${label} must be an object`);
13288
+ }
13289
+ return value;
13290
+ }
13291
+ function readOptionalString(record, key) {
13292
+ const value = record[key];
13293
+ if (value === void 0 || value === null) return void 0;
13294
+ if (typeof value !== "string") throw new Error(`Pet ${key} must be a string`);
13295
+ const normalized = value.trim();
13296
+ return normalized.length === 0 ? void 0 : normalized;
13297
+ }
13298
+ function readPositiveInteger(record, key) {
13299
+ const value = record[key];
13300
+ if (!Number.isInteger(value) || Number(value) <= 0) {
13301
+ throw new Error(`Pet frame ${key} must be a positive integer`);
13302
+ }
13303
+ return Number(value);
13304
+ }
13305
+
13306
+ // packages/provider-codex/src/workbench-pets.ts
13307
+ var MAX_DOWNLOAD_BYTES = 4 * 1024 * 1024;
13308
+ var DOWNLOAD_TIMEOUT_MS = 6e4;
13309
+ var MAX_CONCURRENT_DOWNLOADS = 2;
13310
+ var CodexWorkbenchPetProvider = class {
13311
+ #assetRecords = /* @__PURE__ */ new Map();
13312
+ #codexHome;
13313
+ #fetch;
13314
+ #inFlight = /* @__PURE__ */ new Map();
13315
+ #logger;
13316
+ #downloadWaiters = [];
13317
+ #activeDownloads = 0;
13318
+ constructor(options) {
13319
+ this.#codexHome = resolve(options.codexHome);
13320
+ this.#fetch = options.fetch ?? globalThis.fetch;
13321
+ this.#logger = options.logger;
13322
+ }
13323
+ async listPets() {
13324
+ this.#assetRecords.clear();
13325
+ const builtins = await Promise.all(BUILTIN_PETS.map((pet) => this.#describeBuiltin(pet)));
13326
+ const preferred = await this.#scanCustomRoot("pets", "pet.json", "custom");
13327
+ const preferredFolders = new Set(preferred.map((record) => record.descriptor.id));
13328
+ const legacy = (await this.#scanCustomRoot("avatars", "avatar.json", "legacy")).filter(
13329
+ (record) => !preferredFolders.has(record.descriptor.id)
13330
+ );
13331
+ for (const record of [...preferred, ...legacy]) this.#assetRecords.set(record.assetId, record);
13332
+ return [...builtins, ...preferred, ...legacy].map(
13333
+ (item) => "descriptor" in item ? item.descriptor : item
13334
+ );
13335
+ }
13336
+ ensurePetAsset(petId) {
13337
+ if (petId.startsWith("custom:")) {
13338
+ return Promise.reject(
13339
+ new WorkbenchPetProviderError("invalid", "Only built-in pets can be downloaded")
13340
+ );
13341
+ }
13342
+ const pet = BUILTIN_PETS.find((candidate) => candidate.id === petId);
13343
+ if (pet === void 0) {
13344
+ return Promise.reject(new WorkbenchPetProviderError("not_found", "Unknown built-in pet"));
13345
+ }
13346
+ const existing = this.#inFlight.get(petId);
13347
+ if (existing !== void 0) return existing;
13348
+ const promise = this.#ensureBuiltin(pet).finally(() => this.#inFlight.delete(petId));
13349
+ this.#inFlight.set(petId, promise);
13350
+ return promise;
13351
+ }
13352
+ async openPetAsset(assetId) {
13353
+ let record = this.#assetRecords.get(assetId);
13354
+ if (record === void 0) {
13355
+ await this.listPets();
13356
+ record = this.#assetRecords.get(assetId);
13357
+ }
13358
+ if (record?.descriptor.availability !== "ready") return void 0;
13359
+ try {
13360
+ const metadata = await validatePetAsset(record);
13361
+ const content = await readFile(record.path);
13362
+ return {
13363
+ content,
13364
+ contentType: "image/webp",
13365
+ etag: `W/"${String(metadata.size)}-${String(Math.trunc(metadata.mtimeMs))}"`,
13366
+ size: metadata.size
13367
+ };
13368
+ } catch {
13369
+ throw new WorkbenchPetProviderError("invalid", "Pet asset is invalid");
13370
+ }
13371
+ }
13372
+ async #describeBuiltin(pet) {
13373
+ const assetId = stableAssetId(`builtin:${PET_PACK_VERSION}:${pet.id}:${pet.file}`);
13374
+ const path = this.#builtinPath(pet);
13375
+ const baseDirectory = dirname(path);
13376
+ let availability = "downloadable";
13377
+ try {
13378
+ await validateBuiltinFile(path);
13379
+ availability = "ready";
13380
+ } catch {
13381
+ }
13382
+ const descriptor = createBuiltinDescriptor(pet, assetId, availability);
13383
+ this.#assetRecords.set(assetId, { assetId, baseDirectory, descriptor, path });
13384
+ return descriptor;
13385
+ }
13386
+ async #ensureBuiltin(pet) {
13387
+ const cached = await this.#describeBuiltin(pet);
13388
+ if (cached.availability === "ready") return cached;
13389
+ await this.#acquireDownloadSlot();
13390
+ const destination = this.#builtinPath(pet);
13391
+ const staging = join(dirname(destination), `.${pet.file}.download-${randomUUID()}.webp`);
13392
+ try {
13393
+ const secondCheck = await this.#describeBuiltin(pet);
13394
+ if (secondCheck.availability === "ready") return secondCheck;
13395
+ const bytes = await this.#download(pet);
13396
+ await mkdir(dirname(destination), { recursive: true });
13397
+ await writeFile(staging, bytes, { flag: "wx" });
13398
+ await validateBuiltinFile(staging);
13399
+ try {
13400
+ await rename(staging, destination);
13401
+ } catch {
13402
+ await rm(destination, { force: true });
13403
+ await rename(staging, destination);
13404
+ }
13405
+ return await this.#describeBuiltin(pet);
13406
+ } catch (cause) {
13407
+ throw new WorkbenchPetProviderError(
13408
+ "download_failed",
13409
+ cause instanceof Error ? cause.message : "Pet asset download failed"
13410
+ );
13411
+ } finally {
13412
+ await rm(staging, { force: true });
13413
+ this.#releaseDownloadSlot();
13414
+ }
13415
+ }
13416
+ async #download(pet) {
13417
+ const url = `${PET_CDN_BASE_URL}/${pet.file}`;
13418
+ const response = await this.#fetch(url, {
13419
+ redirect: "follow",
13420
+ signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS)
13421
+ });
13422
+ if (!response.ok) throw new Error(`Pet asset download failed with ${String(response.status)}`);
13423
+ if (response.url.length > 0) validateDownloadUrl(response.url);
13424
+ const contentLength = Number(response.headers.get("content-length"));
13425
+ if (Number.isFinite(contentLength) && contentLength > MAX_DOWNLOAD_BYTES) {
13426
+ throw new Error("Pet asset download exceeded 4MiB");
13427
+ }
13428
+ if (response.body === null) throw new Error("Pet asset download returned no body");
13429
+ const body = response.body;
13430
+ const reader = body.getReader();
13431
+ const chunks = [];
13432
+ let size = 0;
13433
+ for (; ; ) {
13434
+ const result = await reader.read();
13435
+ if (result.done) break;
13436
+ size += result.value.byteLength;
13437
+ if (size > MAX_DOWNLOAD_BYTES) {
13438
+ await reader.cancel();
13439
+ throw new Error("Pet asset download exceeded 4MiB");
13440
+ }
13441
+ chunks.push(result.value);
13442
+ }
13443
+ const bytes = new Uint8Array(size);
13444
+ let offset = 0;
13445
+ for (const chunk of chunks) {
13446
+ bytes.set(chunk, offset);
13447
+ offset += chunk.byteLength;
13448
+ }
13449
+ const dimensions = readWebpDimensions(bytes);
13450
+ if (dimensions.width !== PET_SPRITESHEET.width || dimensions.height !== PET_SPRITESHEET.height) {
13451
+ throw new Error("Pet asset has invalid dimensions");
13452
+ }
13453
+ return bytes;
13454
+ }
13455
+ async #scanCustomRoot(rootName, manifestName, source) {
13456
+ const root = join(this.#codexHome, rootName);
13457
+ let entries;
13458
+ try {
13459
+ entries = await readdir(root, { withFileTypes: true });
13460
+ } catch {
13461
+ return [];
13462
+ }
13463
+ const records = [];
13464
+ for (const entry of entries) {
13465
+ if (!entry.isDirectory()) continue;
13466
+ try {
13467
+ const directory = join(root, entry.name);
13468
+ const assetId = stableAssetId(`${source}:${entry.name}`);
13469
+ records.push(
13470
+ await loadCustomPet({ assetId, directory, folder: entry.name, manifestName, source })
13471
+ );
13472
+ } catch {
13473
+ this.#logger?.warn(`Skipped invalid ${source} pet ${entry.name}`);
13474
+ }
13475
+ }
13476
+ return records;
13477
+ }
13478
+ #builtinPath(pet) {
13479
+ return join(this.#codexHome, "cache", "tui-pets", PET_PACK_VERSION, "assets", pet.file);
13480
+ }
13481
+ async #acquireDownloadSlot() {
13482
+ if (this.#activeDownloads < MAX_CONCURRENT_DOWNLOADS) {
13483
+ this.#activeDownloads += 1;
13484
+ return;
13485
+ }
13486
+ await new Promise((resolveWaiter) => this.#downloadWaiters.push(resolveWaiter));
13487
+ this.#activeDownloads += 1;
13488
+ }
13489
+ #releaseDownloadSlot() {
13490
+ this.#activeDownloads -= 1;
13491
+ this.#downloadWaiters.shift()?.();
13492
+ }
13493
+ };
13494
+ function createCodexWorkbenchPetProvider(options) {
13495
+ return new CodexWorkbenchPetProvider(options);
13496
+ }
13497
+ async function validateBuiltinFile(path) {
13498
+ const [root, resolved] = await Promise.all([realpath(dirname(path)), realpath(path)]);
13499
+ const child = relative(root, resolved);
13500
+ if (child === ".." || child.startsWith(`..${sep}`)) throw new Error("Pet cache path escaped");
13501
+ const metadata = await stat(resolved);
13502
+ if (!metadata.isFile() || metadata.size > MAX_DOWNLOAD_BYTES) {
13503
+ throw new Error("Pet cache file is invalid");
13504
+ }
13505
+ const dimensions = await readWebpDimensionsFromFile(resolved);
13506
+ if (dimensions.width !== PET_SPRITESHEET.width || dimensions.height !== PET_SPRITESHEET.height) {
13507
+ throw new Error("Pet cache file has invalid dimensions");
13508
+ }
13509
+ }
13510
+ function stableAssetId(value) {
13511
+ return createHash("sha256").update(value).digest("hex");
13512
+ }
13513
+ function validateDownloadUrl(value) {
13514
+ const url = new URL(value);
13515
+ if (url.protocol !== "https:" || url.hostname !== "persistent.oaistatic.com") {
13516
+ throw new Error("Pet asset download redirected outside the allowed host");
13517
+ }
13518
+ }
13519
+
13520
+ 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 };