bloby-bot 0.30.1 → 0.32.1

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 (348) hide show
  1. package/dist-bloby/assets/angular-html-DxXh-QMA.js +1 -0
  2. package/dist-bloby/assets/{angular-ts-BJPoZ_vo.js → angular-ts-BNEmshfa.js} +1 -1
  3. package/dist-bloby/assets/{apl-CyVuPSCb.js → apl-CD5excG6.js} +1 -1
  4. package/dist-bloby/assets/{astro-CKc3-gwH.js → astro-BsuvMd51.js} +1 -1
  5. package/dist-bloby/assets/{blade-DMAsVBaV.js → blade-BzCfsa5s.js} +1 -1
  6. package/dist-bloby/assets/{bloby-CqtSjokc.js → bloby-B1w9ReAR.js} +19 -19
  7. package/dist-bloby/assets/{bsl-B1qbqNES.js → bsl-BODK--Fo.js} +1 -1
  8. package/dist-bloby/assets/c-QpHxjkb9.js +1 -0
  9. package/dist-bloby/assets/{cairo-BDj8wWhy.js → cairo-BwpHIzLA.js} +1 -1
  10. package/dist-bloby/assets/{cobol-hBjMZW-R.js → cobol-Dvyhsqyz.js} +1 -1
  11. package/dist-bloby/assets/{coffee-B4OtR3w-.js → coffee-CyaHgmLy.js} +1 -1
  12. package/dist-bloby/assets/cpp-DlbkFQj0.js +1 -0
  13. package/dist-bloby/assets/{crystal-x3k4USY-.js → crystal-CR4Yni1K.js} +1 -1
  14. package/dist-bloby/assets/css-jgrsA6xW.js +1 -0
  15. package/dist-bloby/assets/{edge-B-9TrlZC.js → edge-CeStCG6d.js} +1 -1
  16. package/dist-bloby/assets/{elixir-CXCzbj1r.js → elixir-CNfWtFyr.js} +1 -1
  17. package/dist-bloby/assets/{elm-BdRiwmde.js → elm-WhyRrsYH.js} +1 -1
  18. package/dist-bloby/assets/{erb-C9tvRzx3.js → erb-BvJkfco6.js} +1 -1
  19. package/dist-bloby/assets/{erlang-Bc4hQuqa.js → erlang-CjZU-VwD.js} +1 -1
  20. package/dist-bloby/assets/{fortran-fixed-form-B02FOYI-.js → fortran-fixed-form-CLgNuKMV.js} +1 -1
  21. package/dist-bloby/assets/{fsharp-DhdR18vN.js → fsharp-kVgJ9XJy.js} +1 -1
  22. package/dist-bloby/assets/{gdresource-DgnrMPIx.js → gdresource-DDsMuL8p.js} +1 -1
  23. package/dist-bloby/assets/{git-commit-DGJi7qBD.js → git-commit-BKhxSJdF.js} +1 -1
  24. package/dist-bloby/assets/{git-rebase-HwDSB2qJ.js → git-rebase-C1GyNmcX.js} +1 -1
  25. package/dist-bloby/assets/{glimmer-js-B6LF_BMd.js → glimmer-js-Cl3u7vjy.js} +1 -1
  26. package/dist-bloby/assets/{glimmer-ts-Cn42BUKe.js → glimmer-ts-CtPlRgiA.js} +1 -1
  27. package/dist-bloby/assets/globals-B1T5ANQV.js +18 -0
  28. package/dist-bloby/assets/globals-CcIc79IH.css +2 -0
  29. package/dist-bloby/assets/glsl-Bz5r7Lln.js +1 -0
  30. package/dist-bloby/assets/graphql-IV9ZCUty.js +1 -0
  31. package/dist-bloby/assets/{hack-DDEqRjBe.js → hack-XsNdYtzr.js} +1 -1
  32. package/dist-bloby/assets/haml-BDRqXh7d.js +1 -0
  33. package/dist-bloby/assets/{handlebars-g9Qe0ao2.js → handlebars-Rv2-mTii.js} +1 -1
  34. package/dist-bloby/assets/highlighted-body-OFNGDK62-CHkKxiLr.js +1 -0
  35. package/dist-bloby/assets/html-BkYSbpwH.js +1 -0
  36. package/dist-bloby/assets/{html-derivative-D-XvNBA6.js → html-derivative-CNiypDIO.js} +1 -1
  37. package/dist-bloby/assets/{http-qlhghEti.js → http-Vgn8hmbu.js} +1 -1
  38. package/dist-bloby/assets/{hurl-CHIKfBKk.js → hurl-C_EA75yu.js} +1 -1
  39. package/dist-bloby/assets/{hxml-adC65L_J.js → hxml-YehGxZ3T.js} +1 -1
  40. package/dist-bloby/assets/java-div3J5pm.js +1 -0
  41. package/dist-bloby/assets/javascript-D7sYfeLa.js +1 -0
  42. package/dist-bloby/assets/{jinja-BHZt0_Dn.js → jinja-BovBDArb.js} +1 -1
  43. package/dist-bloby/assets/{jison-TqJYWKkW.js → jison-C7UZOdoh.js} +1 -1
  44. package/dist-bloby/assets/json-DsAnzN7U.js +1 -0
  45. package/dist-bloby/assets/jsx-CftCCFil.js +1 -0
  46. package/dist-bloby/assets/jsx-runtime-DsY8nUeV.js +1 -0
  47. package/dist-bloby/assets/{julia-CW07fy07.js → julia-D8hM3XBr.js} +1 -1
  48. package/dist-bloby/assets/{just-DBcWo9WY.js → just-CHnwfRRG.js} +1 -1
  49. package/dist-bloby/assets/{latex-D6lXiPTF.js → latex-Ccu-ZO0T.js} +1 -1
  50. package/dist-bloby/assets/{liquid-DhYYAQ41.js → liquid-BRbNyfzr.js} +1 -1
  51. package/dist-bloby/assets/lua-BcwT4KiU.js +1 -0
  52. package/dist-bloby/assets/{marko-xtrIBdcL.js → marko-Both7s0f.js} +1 -1
  53. package/dist-bloby/assets/{mdc-DyZVNnwP.js → mdc-7TpRllSI.js} +1 -1
  54. package/dist-bloby/assets/mermaid-GHXKKRXX-LsCge3XG.js +1 -0
  55. package/dist-bloby/assets/{nextflow-JEyYUlIq.js → nextflow-C2lnptGp.js} +1 -1
  56. package/dist-bloby/assets/{nginx-CGgm1VOJ.js → nginx-1MGd6YK-.js} +1 -1
  57. package/dist-bloby/assets/{nim-Br7S817Z.js → nim-CXWhMB6N.js} +1 -1
  58. package/dist-bloby/assets/onboard-DdL-0meC.js +1 -0
  59. package/dist-bloby/assets/{perl-DqDX-7VG.js → perl-s-whHxj8.js} +1 -1
  60. package/dist-bloby/assets/{php-DYSqNNGJ.js → php-KdIqqcNq.js} +1 -1
  61. package/dist-bloby/assets/{pug-Bob3gNio.js → pug-Cj_1QUAx.js} +1 -1
  62. package/dist-bloby/assets/{qml-CsMafcqN.js → qml-BQHwZF2t.js} +1 -1
  63. package/dist-bloby/assets/r-BW3neTZ6.js +1 -0
  64. package/dist-bloby/assets/{razor-B4PzhaZX.js → razor-D4oLdRr2.js} +1 -1
  65. package/dist-bloby/assets/regexp-CK2Vecnb.js +1 -0
  66. package/dist-bloby/assets/rolldown-runtime-C-57s9n3.js +1 -0
  67. package/dist-bloby/assets/{rst-BXuz-2b8.js → rst-kaCCXG10.js} +1 -1
  68. package/dist-bloby/assets/{ruby-CXP5_4kq.js → ruby-DIAu88GV.js} +1 -1
  69. package/dist-bloby/assets/{sas-Cov9PzAD.js → sas-DW2U5bKI.js} +1 -1
  70. package/dist-bloby/assets/scss-CpUwMEPb.js +1 -0
  71. package/dist-bloby/assets/{shaderlab-DZ3Lsiak.js → shaderlab-CCgEvKkt.js} +1 -1
  72. package/dist-bloby/assets/shellscript-BhywzMlr.js +1 -0
  73. package/dist-bloby/assets/{shellsession-BHLVblBB.js → shellsession-vB5Hy6UU.js} +1 -1
  74. package/dist-bloby/assets/{soy-e0u3-wIA.js → soy-BNDHXm4e.js} +1 -1
  75. package/dist-bloby/assets/{sparql-B9c85a_o.js → sparql-DH0hFmAi.js} +1 -1
  76. package/dist-bloby/assets/sql-D395ukne.js +1 -0
  77. package/dist-bloby/assets/{stata-B1mLEMrz.js → stata-BHXdpuN3.js} +1 -1
  78. package/dist-bloby/assets/{surrealql-BTKo2XFY.js → surrealql-eiBkI2Jy.js} +1 -1
  79. package/dist-bloby/assets/{svelte-B7URZ-wm.js → svelte-DcqzCcP6.js} +1 -1
  80. package/dist-bloby/assets/{templ-DVRYIgGq.js → templ-DpMCsFaT.js} +1 -1
  81. package/dist-bloby/assets/{tex-CdJ24HJj.js → tex-B71AZ6Vb.js} +1 -1
  82. package/dist-bloby/assets/{ts-tags-CCSbelDn.js → ts-tags-CRuJWBGV.js} +1 -1
  83. package/dist-bloby/assets/tsx-CEFbrBOd.js +1 -0
  84. package/dist-bloby/assets/{twig-Dn4ruiVl.js → twig-CuSIh_aH.js} +1 -1
  85. package/dist-bloby/assets/typescript-CV9iMaP7.js +1 -0
  86. package/dist-bloby/assets/{vue-D19cWHwY.js → vue-YbgnWnT2.js} +1 -1
  87. package/dist-bloby/assets/{vue-html-_j-KC7Cs.js → vue-html-CXsio3-X.js} +1 -1
  88. package/dist-bloby/assets/{vue-vine-BC03MN6c.js → vue-vine-C8pVogU0.js} +1 -1
  89. package/dist-bloby/assets/xml-Zmzpltp0.js +1 -0
  90. package/dist-bloby/assets/{xsl-DR-zOeBm.js → xsl-CqzL2w2F.js} +1 -1
  91. package/dist-bloby/assets/yaml-Dc_auW1I.js +1 -0
  92. package/dist-bloby/bloby.html +5 -4
  93. package/dist-bloby/onboard.html +5 -4
  94. package/package.json +1 -1
  95. package/supervisor/bloby-agent.ts +65 -633
  96. package/supervisor/chat/OnboardWizard.tsx +315 -69
  97. package/supervisor/harnesses/claude.ts +684 -0
  98. package/supervisor/harnesses/codex.ts +73 -0
  99. package/supervisor/harnesses/types.ts +81 -0
  100. package/supervisor/index.ts +1 -1
  101. package/worker/codex-auth.ts +362 -137
  102. package/worker/index.ts +30 -4
  103. package/dist-bloby/assets/angular-html-olSuI25H.js +0 -1
  104. package/dist-bloby/assets/c-BvB8CVo8.js +0 -1
  105. package/dist-bloby/assets/cpp-BblbpnyR.js +0 -1
  106. package/dist-bloby/assets/css-zY4NE9yA.js +0 -1
  107. package/dist-bloby/assets/globals-LpXKrQgt.css +0 -2
  108. package/dist-bloby/assets/globals-zKQhzQOX.js +0 -18
  109. package/dist-bloby/assets/glsl-CEMf-THb.js +0 -1
  110. package/dist-bloby/assets/graphql-dBCd2Czl.js +0 -1
  111. package/dist-bloby/assets/haml-Ck5pVAEG.js +0 -1
  112. package/dist-bloby/assets/highlighted-body-OFNGDK62-B0W8hCx-.js +0 -1
  113. package/dist-bloby/assets/html-CzX0w7K_.js +0 -1
  114. package/dist-bloby/assets/java-BqKEu7zh.js +0 -1
  115. package/dist-bloby/assets/javascript-CzjRtS1s.js +0 -1
  116. package/dist-bloby/assets/json-CdFmZMJc.js +0 -1
  117. package/dist-bloby/assets/jsx-BL6Wh6Qw.js +0 -1
  118. package/dist-bloby/assets/jsx-runtime-C0W9Wf2W.js +0 -1
  119. package/dist-bloby/assets/lua-B4ezzssg.js +0 -1
  120. package/dist-bloby/assets/mermaid-GHXKKRXX-Dr8I7wwH.js +0 -1
  121. package/dist-bloby/assets/onboard-C1yXK8uT.js +0 -1
  122. package/dist-bloby/assets/r-CGji9_vM.js +0 -1
  123. package/dist-bloby/assets/regexp-CvWG4lI-.js +0 -1
  124. package/dist-bloby/assets/scss-Efq7Dmbs.js +0 -1
  125. package/dist-bloby/assets/shellscript-BbEstezf.js +0 -1
  126. package/dist-bloby/assets/sql-CB6kO6Km.js +0 -1
  127. package/dist-bloby/assets/tsx-DrzBggF8.js +0 -1
  128. package/dist-bloby/assets/typescript-COZIw7xM.js +0 -1
  129. package/dist-bloby/assets/xml-BlDEvPia.js +0 -1
  130. package/dist-bloby/assets/yaml-iUXljnLs.js +0 -1
  131. /package/dist-bloby/assets/{abap-smLpETzL.js → abap--vzi7Rxy.js} +0 -0
  132. /package/dist-bloby/assets/{actionscript-3-o-aRvjY5.js → actionscript-3-CV21uODD.js} +0 -0
  133. /package/dist-bloby/assets/{ada-D5RRX1i4.js → ada-DpXSEmbw.js} +0 -0
  134. /package/dist-bloby/assets/{andromeeda-N4z3YzmR.js → andromeeda-C1V0Cb0M.js} +0 -0
  135. /package/dist-bloby/assets/{apache-DttKlSqg.js → apache-CRmVjs8c.js} +0 -0
  136. /package/dist-bloby/assets/{apex-DL7j-a2n.js → apex-DIIc4r7E.js} +0 -0
  137. /package/dist-bloby/assets/{applescript-DCbL_2FX.js → applescript-DMX6NGuU.js} +0 -0
  138. /package/dist-bloby/assets/{ara-DqheWJCe.js → ara-3SArX2Zn.js} +0 -0
  139. /package/dist-bloby/assets/{asciidoc-BH2sf2K4.js → asciidoc-CnVFjb7X.js} +0 -0
  140. /package/dist-bloby/assets/{asm-rfjOMz3U.js → asm-Cb-CgaBD.js} +0 -0
  141. /package/dist-bloby/assets/{aurora-x-CND-FqEb.js → aurora-x-CjvoFyi0.js} +0 -0
  142. /package/dist-bloby/assets/{awk-CMV5n9Z7.js → awk-BYjsWVhV.js} +0 -0
  143. /package/dist-bloby/assets/{ayu-dark-on7xzq_B.js → ayu-dark-C4UVdT_g.js} +0 -0
  144. /package/dist-bloby/assets/{ayu-light-DnGeGGc2.js → ayu-light-CFJ-dST-.js} +0 -0
  145. /package/dist-bloby/assets/{ayu-mirage-DG3LlYC_.js → ayu-mirage-BxM9D2Mi.js} +0 -0
  146. /package/dist-bloby/assets/{ballerina-BjMqJjlr.js → ballerina-BsKCUtAm.js} +0 -0
  147. /package/dist-bloby/assets/{bat-BaVbo_qw.js → bat-CJlQOahT.js} +0 -0
  148. /package/dist-bloby/assets/{beancount-DBt5Mbc_.js → beancount-Cyf6Xlzd.js} +0 -0
  149. /package/dist-bloby/assets/{berry-Cyjuxiss.js → berry-DHYmFnza.js} +0 -0
  150. /package/dist-bloby/assets/{bibtex-BV_0nsPq.js → bibtex-BUB9btZd.js} +0 -0
  151. /package/dist-bloby/assets/{bicep-C2gEwu4J.js → bicep-CNVX4dQj.js} +0 -0
  152. /package/dist-bloby/assets/{bird2-BRyaEJd0.js → bird2-LZP25z1s.js} +0 -0
  153. /package/dist-bloby/assets/{c3-DTTbp5N2.js → c3-BI41OB2W.js} +0 -0
  154. /package/dist-bloby/assets/{cadence-CPz83cmI.js → cadence-BDnzkZFt.js} +0 -0
  155. /package/dist-bloby/assets/{catppuccin-frappe-Dr22sraq.js → catppuccin-frappe-DpT1lCYX.js} +0 -0
  156. /package/dist-bloby/assets/{catppuccin-latte-C57EeX8c.js → catppuccin-latte-qMMse1WJ.js} +0 -0
  157. /package/dist-bloby/assets/{catppuccin-macchiato-CpheI4uD.js → catppuccin-macchiato-DMu0Ac9B.js} +0 -0
  158. /package/dist-bloby/assets/{catppuccin-mocha-D8Lmdks_.js → catppuccin-mocha-DicTaD9V.js} +0 -0
  159. /package/dist-bloby/assets/{clarity-CFJ2Yc3q.js → clarity-CPz-yzAn.js} +0 -0
  160. /package/dist-bloby/assets/{clojure-6R01QgJC.js → clojure-BxJLFKTj.js} +0 -0
  161. /package/dist-bloby/assets/{cmake-D5rSbMir.js → cmake-BmC4o4J9.js} +0 -0
  162. /package/dist-bloby/assets/{codeowners-_3A-ClkN.js → codeowners-BPHDuybI.js} +0 -0
  163. /package/dist-bloby/assets/{codeql-DlIhJTR7.js → codeql-DYWyWzRY.js} +0 -0
  164. /package/dist-bloby/assets/{common-lisp-BvQzz173.js → common-lisp-CsDdrwfa.js} +0 -0
  165. /package/dist-bloby/assets/{coq-DTNXReIC.js → coq-BZNwxllS.js} +0 -0
  166. /package/dist-bloby/assets/{csharp-BDKQY1K9.js → csharp-BLhQzhUA.js} +0 -0
  167. /package/dist-bloby/assets/{csv-DNUpVBxl.js → csv-DPc9UZFt.js} +0 -0
  168. /package/dist-bloby/assets/{cue-DDdBc2s3.js → cue-Bat8Mt8Y.js} +0 -0
  169. /package/dist-bloby/assets/{cypher-CguaznO2.js → cypher-CTnWkM4Y.js} +0 -0
  170. /package/dist-bloby/assets/{d-CHcoyjv3.js → d-CccbtpLU.js} +0 -0
  171. /package/dist-bloby/assets/{dark-plus-CqeW_0kH.js → dark-plus-CKh7uIvz.js} +0 -0
  172. /package/dist-bloby/assets/{dart-RM3aRphk.js → dart-SbRHwU1n.js} +0 -0
  173. /package/dist-bloby/assets/{dax-nbnY1d79.js → dax-vVKSTwd9.js} +0 -0
  174. /package/dist-bloby/assets/{desktop-BD76cvxT.js → desktop-rdWGepy4.js} +0 -0
  175. /package/dist-bloby/assets/{diff-CdkWtnkL.js → diff-G5H-0DNT.js} +0 -0
  176. /package/dist-bloby/assets/{docker-ZyPHc6zB.js → docker-CC20slQp.js} +0 -0
  177. /package/dist-bloby/assets/{dotenv-BdJZEwA6.js → dotenv-C36c6TdP.js} +0 -0
  178. /package/dist-bloby/assets/{dracula-CtqCPLGa.js → dracula-nNMQZYa7.js} +0 -0
  179. /package/dist-bloby/assets/{dracula-soft-DmBpwRAy.js → dracula-soft-BPmUsSlJ.js} +0 -0
  180. /package/dist-bloby/assets/{dream-maker-BJL4qlg3.js → dream-maker-DleGc9Hy.js} +0 -0
  181. /package/dist-bloby/assets/{emacs-lisp-_LyYa2Ky.js → emacs-lisp-D_QlcMHs.js} +0 -0
  182. /package/dist-bloby/assets/{everforest-dark-CrbyKk4n.js → everforest-dark-FkVvIMUl.js} +0 -0
  183. /package/dist-bloby/assets/{everforest-light-DRbSh8Tm.js → everforest-light-d3V1wTAd.js} +0 -0
  184. /package/dist-bloby/assets/{fennel-CC2BkRsS.js → fennel-BEssPROc.js} +0 -0
  185. /package/dist-bloby/assets/{fish-D2ZCzqcE.js → fish-Cz5yLEyJ.js} +0 -0
  186. /package/dist-bloby/assets/{fluent-DKAm3m7q.js → fluent-TGO8KajN.js} +0 -0
  187. /package/dist-bloby/assets/{fortran-free-form-BPTf0lbT.js → fortran-free-form-CHQXX5JB.js} +0 -0
  188. /package/dist-bloby/assets/{gdscript-CsadCSaZ.js → gdscript-DBkVGsC6.js} +0 -0
  189. /package/dist-bloby/assets/{gdshader-PfnN_8tR.js → gdshader-CWQhZP7Q.js} +0 -0
  190. /package/dist-bloby/assets/{genie-Bj-orPAV.js → genie-7iw14YxB.js} +0 -0
  191. /package/dist-bloby/assets/{gherkin-COVWpJ-Q.js → gherkin-D4AlAQSH.js} +0 -0
  192. /package/dist-bloby/assets/{github-dark-ipGuFGYC.js → github-dark-CpBni1SQ.js} +0 -0
  193. /package/dist-bloby/assets/{github-dark-default-DX3IG_X0.js → github-dark-default-Cr5Q59Ad.js} +0 -0
  194. /package/dist-bloby/assets/{github-dark-dimmed-CH6p_7ez.js → github-dark-dimmed-WEORr92a.js} +0 -0
  195. /package/dist-bloby/assets/{github-dark-high-contrast-Bg2sSao5.js → github-dark-high-contrast-uM2plAzl.js} +0 -0
  196. /package/dist-bloby/assets/{github-light-BxjqOQl0.js → github-light-BROm54vS.js} +0 -0
  197. /package/dist-bloby/assets/{github-light-default-DwpDd1IQ.js → github-light-default-jSwgX00f.js} +0 -0
  198. /package/dist-bloby/assets/{github-light-high-contrast-C0QeixPf.js → github-light-high-contrast-Bp9ESXtp.js} +0 -0
  199. /package/dist-bloby/assets/{gleam-BF2NigGj.js → gleam-D1LXnIj0.js} +0 -0
  200. /package/dist-bloby/assets/{gn-CMIt9roj.js → gn-CReOiE5m.js} +0 -0
  201. /package/dist-bloby/assets/{gnuplot-DgWlRTEj.js → gnuplot-DufViamc.js} +0 -0
  202. /package/dist-bloby/assets/{go-DLnOLj8q.js → go-DC_Zm44P.js} +0 -0
  203. /package/dist-bloby/assets/{groovy-B9qLWIkE.js → groovy-DEGDVBi0.js} +0 -0
  204. /package/dist-bloby/assets/{gruvbox-dark-hard-BIMX9ePb.js → gruvbox-dark-hard-C-zANgxR.js} +0 -0
  205. /package/dist-bloby/assets/{gruvbox-dark-medium-DxuwyVzM.js → gruvbox-dark-medium-DY7Z6TBK.js} +0 -0
  206. /package/dist-bloby/assets/{gruvbox-dark-soft-ba2fjht0.js → gruvbox-dark-soft-Bpj6owGh.js} +0 -0
  207. /package/dist-bloby/assets/{gruvbox-light-hard-DAJK2PqC.js → gruvbox-light-hard-DVwTvHam.js} +0 -0
  208. /package/dist-bloby/assets/{gruvbox-light-medium-WRifDAJD.js → gruvbox-light-medium-98PeoD5Y.js} +0 -0
  209. /package/dist-bloby/assets/{gruvbox-light-soft-B0dBOoVB.js → gruvbox-light-soft-BHI2PZTB.js} +0 -0
  210. /package/dist-bloby/assets/{haskell-BaGpmm_c.js → haskell-B-K-GoPf.js} +0 -0
  211. /package/dist-bloby/assets/{haxe-DfXTCEOz.js → haxe-md5t_Y_E.js} +0 -0
  212. /package/dist-bloby/assets/{hcl-CbCtpSbi.js → hcl-qSvp9jTg.js} +0 -0
  213. /package/dist-bloby/assets/{hjson-_4-w-pHU.js → hjson-BNeV6JDA.js} +0 -0
  214. /package/dist-bloby/assets/{hlsl-DpuYn7pp.js → hlsl-CFf5czm3.js} +0 -0
  215. /package/dist-bloby/assets/{horizon-C5RtD1fY.js → horizon-C4a2pCDo.js} +0 -0
  216. /package/dist-bloby/assets/{horizon-bright-pEOice34.js → horizon-bright-Bgpx-0aF.js} +0 -0
  217. /package/dist-bloby/assets/{houston-A0zg9vNP.js → houston-BZHNDhe5.js} +0 -0
  218. /package/dist-bloby/assets/{hy-t9zDXBje.js → hy-hI-CUgFt.js} +0 -0
  219. /package/dist-bloby/assets/{imba-Bxu-TDfw.js → imba-Dr5pZl3x.js} +0 -0
  220. /package/dist-bloby/assets/{ini-D-v34c8N.js → ini-KxzJ-qxg.js} +0 -0
  221. /package/dist-bloby/assets/{json5-D0XL1D5m.js → json5-SRM7tKmT.js} +0 -0
  222. /package/dist-bloby/assets/{jsonc-BBgf3TX3.js → jsonc-Cix1XnqC.js} +0 -0
  223. /package/dist-bloby/assets/{jsonl-KrKLbtB7.js → jsonl-BzKwo-fD.js} +0 -0
  224. /package/dist-bloby/assets/{jsonnet-B2ZwWMOt.js → jsonnet-DaiLv8or.js} +0 -0
  225. /package/dist-bloby/assets/{jssm-ByRpI9-B.js → jssm-B1pV58QJ.js} +0 -0
  226. /package/dist-bloby/assets/{kanagawa-dragon-CtPmcCMp.js → kanagawa-dragon-BihvT_N-.js} +0 -0
  227. /package/dist-bloby/assets/{kanagawa-lotus-DpOXEGCa.js → kanagawa-lotus-DQN_bzSt.js} +0 -0
  228. /package/dist-bloby/assets/{kanagawa-wave-CLVCyc-n.js → kanagawa-wave-Bvz_F3hD.js} +0 -0
  229. /package/dist-bloby/assets/{kdl-6FPPEH4H.js → kdl-DupMG4Bk.js} +0 -0
  230. /package/dist-bloby/assets/{kotlin-D4L3Nd2D.js → kotlin-rOGI_fXV.js} +0 -0
  231. /package/dist-bloby/assets/{kusto-D-mmc07O.js → kusto-CHXnQR8L.js} +0 -0
  232. /package/dist-bloby/assets/{laserwave-7fEj4XGb.js → laserwave-CPMyzJF3.js} +0 -0
  233. /package/dist-bloby/assets/{lean-BMVMuP2E.js → lean-B76KugVy.js} +0 -0
  234. /package/dist-bloby/assets/{less-C95PyOu0.js → less-DwUMKQAG.js} +0 -0
  235. /package/dist-bloby/assets/{light-plus-DHI2dh3p.js → light-plus-C6sdUQiS.js} +0 -0
  236. /package/dist-bloby/assets/{llvm-Dy3qORTl.js → llvm-DumY6MCH.js} +0 -0
  237. /package/dist-bloby/assets/{log-BQop7fzg.js → log-DdP6k-FU.js} +0 -0
  238. /package/dist-bloby/assets/{logo-DKtnYmrp.js → logo-Cx0gX691.js} +0 -0
  239. /package/dist-bloby/assets/{luau-Dha4KG0q.js → luau-CI4wJBxI.js} +0 -0
  240. /package/dist-bloby/assets/{make-DfmS6buu.js → make-BlyBJiAs.js} +0 -0
  241. /package/dist-bloby/assets/{markdown-BaI9LyM4.js → markdown-BFgBvytj.js} +0 -0
  242. /package/dist-bloby/assets/{material-theme-Dm6ETY8i.js → material-theme-CyGvAAeY.js} +0 -0
  243. /package/dist-bloby/assets/{material-theme-darker-BeyjmM5Z.js → material-theme-darker-DJAOSarR.js} +0 -0
  244. /package/dist-bloby/assets/{material-theme-lighter-CCOYYzKL.js → material-theme-lighter-Cb7t96j2.js} +0 -0
  245. /package/dist-bloby/assets/{material-theme-ocean-CUtPiiX3.js → material-theme-ocean-EZZ55_HD.js} +0 -0
  246. /package/dist-bloby/assets/{material-theme-palenight-2L4zMwIM.js → material-theme-palenight-DtmMSfya.js} +0 -0
  247. /package/dist-bloby/assets/{matlab-BT79Cq_j.js → matlab-BFLobVcp.js} +0 -0
  248. /package/dist-bloby/assets/{mdx-CxGBwLNt.js → mdx-Baux4qlv.js} +0 -0
  249. /package/dist-bloby/assets/{mermaid-DLf3axBN.js → mermaid-DHr7T0Rt.js} +0 -0
  250. /package/dist-bloby/assets/{min-dark-B8TUPGHg.js → min-dark-C9N1U4-e.js} +0 -0
  251. /package/dist-bloby/assets/{min-light-BDOoBxcA.js → min-light-Ce9oxBvH.js} +0 -0
  252. /package/dist-bloby/assets/{mipsasm-DXuU_0cI.js → mipsasm-Cgb1v7yV.js} +0 -0
  253. /package/dist-bloby/assets/{mojo-1Omp2pIo.js → mojo-BnTBKscO.js} +0 -0
  254. /package/dist-bloby/assets/{monokai-E_VBmXGZ.js → monokai-BGD_YBH-.js} +0 -0
  255. /package/dist-bloby/assets/{moonbit-DZzq699o.js → moonbit-HXw0ZM4h.js} +0 -0
  256. /package/dist-bloby/assets/{move-DxDAOJVd.js → move-DG2efXqI.js} +0 -0
  257. /package/dist-bloby/assets/{narrat-CxDcPPb9.js → narrat-BSasSB5t.js} +0 -0
  258. /package/dist-bloby/assets/{nextflow-groovy-wvmJO4hi.js → nextflow-groovy-DXLl8k8E.js} +0 -0
  259. /package/dist-bloby/assets/{night-owl-DefhalNX.js → night-owl-DxqNTXDa.js} +0 -0
  260. /package/dist-bloby/assets/{night-owl-light-byb3AbEn.js → night-owl-light-MPn8GCyh.js} +0 -0
  261. /package/dist-bloby/assets/{nix-DsFTDHWT.js → nix-BpnttlWr.js} +0 -0
  262. /package/dist-bloby/assets/{nord-D5rQzHT-.js → nord-Mt6M_qHE.js} +0 -0
  263. /package/dist-bloby/assets/{nushell-BQ_rO0AM.js → nushell-CS7Mvg-G.js} +0 -0
  264. /package/dist-bloby/assets/{objective-c-BMq6JT_m.js → objective-c-U4EuJXJs.js} +0 -0
  265. /package/dist-bloby/assets/{objective-cpp-DRwojuGv.js → objective-cpp-CE_PrXRW.js} +0 -0
  266. /package/dist-bloby/assets/{ocaml-e4_gKO6E.js → ocaml-ZsxDKzyv.js} +0 -0
  267. /package/dist-bloby/assets/{odin-mdTPwYOg.js → odin-CDoDiNYU.js} +0 -0
  268. /package/dist-bloby/assets/{one-dark-pro-DxXww9jg.js → one-dark-pro-B9P_I1yh.js} +0 -0
  269. /package/dist-bloby/assets/{one-light-D9c03w7t.js → one-light-Cv3j6GXq.js} +0 -0
  270. /package/dist-bloby/assets/{openscad-D2aTdNfr.js → openscad-CfJwW9dY.js} +0 -0
  271. /package/dist-bloby/assets/{pascal-D4n_G8vj.js → pascal-CjE0UTC7.js} +0 -0
  272. /package/dist-bloby/assets/{pkl-DcjhAp0L.js → pkl-BN6EkHr9.js} +0 -0
  273. /package/dist-bloby/assets/{plastic-uOsw7z1x.js → plastic-BCnZnfMk.js} +0 -0
  274. /package/dist-bloby/assets/{plsql-BSy3Ag0J.js → plsql-1LW-CqWM.js} +0 -0
  275. /package/dist-bloby/assets/{po-Be96RYkA.js → po-Cf5hRC9x.js} +0 -0
  276. /package/dist-bloby/assets/{poimandres-CyO4HORD.js → poimandres-B_zC30Vt.js} +0 -0
  277. /package/dist-bloby/assets/{polar-BmhMKWum.js → polar-S6fWkEw8.js} +0 -0
  278. /package/dist-bloby/assets/{postcss-BTQso3H9.js → postcss-cZXfRCsF.js} +0 -0
  279. /package/dist-bloby/assets/{powerquery-DVyQv3M2.js → powerquery-CoRQQdNP.js} +0 -0
  280. /package/dist-bloby/assets/{powershell-BmtCGJVD.js → powershell-B2VxwRch.js} +0 -0
  281. /package/dist-bloby/assets/{prisma-CCFA9rEj.js → prisma-sLrt38jj.js} +0 -0
  282. /package/dist-bloby/assets/{prolog-DWGEEo78.js → prolog-CL99toUJ.js} +0 -0
  283. /package/dist-bloby/assets/{proto-C3eop1kM.js → proto-CtiBQJNn.js} +0 -0
  284. /package/dist-bloby/assets/{puppet-C0_7Nv5A.js → puppet-BlbpxWq2.js} +0 -0
  285. /package/dist-bloby/assets/{purescript-Bv-B8yRw.js → purescript-DPcVkoDV.js} +0 -0
  286. /package/dist-bloby/assets/{python-CKg5r0C3.js → python-BLpCXkJ6.js} +0 -0
  287. /package/dist-bloby/assets/{qmldir-Cqfb4Lox.js → qmldir-BcwbwUc8.js} +0 -0
  288. /package/dist-bloby/assets/{qss-Csho9BH8.js → qss-erDfnnzG.js} +0 -0
  289. /package/dist-bloby/assets/{racket-D8-uWeQH.js → racket-Dch6VQku.js} +0 -0
  290. /package/dist-bloby/assets/{raku-Cj4JSa8p.js → raku-Db8mfsiE.js} +0 -0
  291. /package/dist-bloby/assets/{red-z4H4llUY.js → red-DWyyM82l.js} +0 -0
  292. /package/dist-bloby/assets/{reg-DXGFiJSl.js → reg-3F9yjO5J.js} +0 -0
  293. /package/dist-bloby/assets/{rel-CunnVTBK.js → rel-CQq8nxxL.js} +0 -0
  294. /package/dist-bloby/assets/{riscv-C8BcOCkS.js → riscv-CsUwotvK.js} +0 -0
  295. /package/dist-bloby/assets/{ron-DiDyR9oa.js → ron-BwlS4rWu.js} +0 -0
  296. /package/dist-bloby/assets/{rose-pine-BADquuIH.js → rose-pine-DEj8gOox.js} +0 -0
  297. /package/dist-bloby/assets/{rose-pine-dawn-BLcEeBoh.js → rose-pine-dawn-DjarqQ2I.js} +0 -0
  298. /package/dist-bloby/assets/{rose-pine-moon-BK_tLY1Y.js → rose-pine-moon-D7ffkR_D.js} +0 -0
  299. /package/dist-bloby/assets/{rosmsg-CHmL1Uyj.js → rosmsg-BmwwVMq5.js} +0 -0
  300. /package/dist-bloby/assets/{rust-DjJFInu3.js → rust-DsIgDjpj.js} +0 -0
  301. /package/dist-bloby/assets/{sass-D3xZ5o-v.js → sass-CkIFK_bT.js} +0 -0
  302. /package/dist-bloby/assets/{scala-B0IRml5w.js → scala-C0TSxhxD.js} +0 -0
  303. /package/dist-bloby/assets/{scheme-BhwcV3Av.js → scheme-e-5nJ58U.js} +0 -0
  304. /package/dist-bloby/assets/{sdbl-BmWYR-pI.js → sdbl-DOe8Nral.js} +0 -0
  305. /package/dist-bloby/assets/{slack-dark-DOnVms5P.js → slack-dark-CClHvLju.js} +0 -0
  306. /package/dist-bloby/assets/{slack-ochin-DcRTft4q.js → slack-ochin-DwCpSVBI.js} +0 -0
  307. /package/dist-bloby/assets/{smalltalk-DVQuUMII.js → smalltalk-fjkC4HKG.js} +0 -0
  308. /package/dist-bloby/assets/{snazzy-light-x9CLJ1W9.js → snazzy-light-2nD216w0.js} +0 -0
  309. /package/dist-bloby/assets/{solarized-dark-BB1sh-pe.js → solarized-dark-BkxMSETv.js} +0 -0
  310. /package/dist-bloby/assets/{solarized-light-9-RPS998.js → solarized-light-BScqQ1C4.js} +0 -0
  311. /package/dist-bloby/assets/{solidity-gQ4WXILB.js → solidity-DbOxJfAY.js} +0 -0
  312. /package/dist-bloby/assets/{splunk-OB48_RcD.js → splunk-BW0l10cw.js} +0 -0
  313. /package/dist-bloby/assets/{ssh-config-DA9YMRGV.js → ssh-config-XN7RWvZy.js} +0 -0
  314. /package/dist-bloby/assets/{stylus-sKwvsUaC.js → stylus-D69is74S.js} +0 -0
  315. /package/dist-bloby/assets/{swift-C72NbAtg.js → swift-CqNHAbQB.js} +0 -0
  316. /package/dist-bloby/assets/{synthwave-84-eJ9uRN_S.js → synthwave-84-Ct3Np89a.js} +0 -0
  317. /package/dist-bloby/assets/{system-verilog-CnWMF7Nq.js → system-verilog-CHbvBf8h.js} +0 -0
  318. /package/dist-bloby/assets/{systemd-DMzItW5N.js → systemd-BBC3Z_R4.js} +0 -0
  319. /package/dist-bloby/assets/{talonscript-DopQCWDL.js → talonscript-DhYQB2ic.js} +0 -0
  320. /package/dist-bloby/assets/{tasl-C28SYKbq.js → tasl-CNtai3BH.js} +0 -0
  321. /package/dist-bloby/assets/{tcl-DHq7zmoF.js → tcl-DFzyQSXW.js} +0 -0
  322. /package/dist-bloby/assets/{terraform-CogS1YKX.js → terraform-BijD6Khb.js} +0 -0
  323. /package/dist-bloby/assets/{tokyo-night-B9N7LyrF.js → tokyo-night-Dd5BGAxh.js} +0 -0
  324. /package/dist-bloby/assets/{toml-BH_iPsgK.js → toml-DZofdujH.js} +0 -0
  325. /package/dist-bloby/assets/{tsv-BIkdBZX1.js → tsv-DOp6g7sz.js} +0 -0
  326. /package/dist-bloby/assets/{turtle-CqNXyJWZ.js → turtle-BKcRDROw.js} +0 -0
  327. /package/dist-bloby/assets/{typespec-CQ9LYD_e.js → typespec-Mmt3-2Cw.js} +0 -0
  328. /package/dist-bloby/assets/{typst-T-Fsk-Sv.js → typst-CndOdNo_.js} +0 -0
  329. /package/dist-bloby/assets/{v-BhMEOw9x.js → v-DjlZIA0C.js} +0 -0
  330. /package/dist-bloby/assets/{vala-DzajMnwt.js → vala-C5Nm5NXo.js} +0 -0
  331. /package/dist-bloby/assets/{vb-7Xr8dEYW.js → vb-zZeWbE2_.js} +0 -0
  332. /package/dist-bloby/assets/{verilog-AvXtwZir.js → verilog-CyZIVfoz.js} +0 -0
  333. /package/dist-bloby/assets/{vesper-CtgQQ2sf.js → vesper-B0BMGbco.js} +0 -0
  334. /package/dist-bloby/assets/{vhdl-BHu0zg1P.js → vhdl-DH1mJdjZ.js} +0 -0
  335. /package/dist-bloby/assets/{viml-Di0QpLfC.js → viml-e-oP1x-l.js} +0 -0
  336. /package/dist-bloby/assets/{vitesse-black-jXdfyqgD.js → vitesse-black-BRAUsA4Q.js} +0 -0
  337. /package/dist-bloby/assets/{vitesse-dark-B88PxG1r.js → vitesse-dark-Dyg71HnT.js} +0 -0
  338. /package/dist-bloby/assets/{vitesse-light-BXxZh2iV.js → vitesse-light-BJKZKqvd.js} +0 -0
  339. /package/dist-bloby/assets/{vyper-C3R5yXgx.js → vyper-BRPzCrki.js} +0 -0
  340. /package/dist-bloby/assets/{wasm-Chsuwt1A.js → wasm-DYMpDie-.js} +0 -0
  341. /package/dist-bloby/assets/{wasm-CEUrWlVz.js → wasm-Drz0Uqci.js} +0 -0
  342. /package/dist-bloby/assets/{wenyan-BonVcr2i.js → wenyan-BiJ0NePu.js} +0 -0
  343. /package/dist-bloby/assets/{wgsl-D59WYmNq.js → wgsl-CNe_V6SG.js} +0 -0
  344. /package/dist-bloby/assets/{wikitext-ariTI2Wk.js → wikitext-DZrjZKWn.js} +0 -0
  345. /package/dist-bloby/assets/{wit-EA4fa3Dt.js → wit-BUTESHa8.js} +0 -0
  346. /package/dist-bloby/assets/{wolfram-DDp7LhyU.js → wolfram-COEZldPx.js} +0 -0
  347. /package/dist-bloby/assets/{zenscript-4WaROUyc.js → zenscript-DThCxjUC.js} +0 -0
  348. /package/dist-bloby/assets/{zig-CJoLJGwV.js → zig-Bu6QWpR2.js} +0 -0
@@ -57,12 +57,15 @@ const MODELS: Record<string, { id: string; label: string }[]> = {
57
57
  { id: 'claude-haiku-4-5', label: 'Haiku 4.5' },
58
58
  ],
59
59
  openai: [
60
- { id: 'gpt-5.2-codex:medium', label: 'GPT-5.2 Codex Medium' },
61
- { id: 'gpt-5.2-codex:high', label: 'GPT-5.2 Codex High' },
62
- { id: 'gpt-5.2-codex:xhigh', label: 'GPT-5.2 Codex Extra High' },
63
- { id: 'gpt-5.3-codex:medium', label: 'GPT-5.3 Codex Medium (Pro)' },
64
- { id: 'gpt-5.3-codex:high', label: 'GPT-5.3 Codex High (Pro)' },
65
- { id: 'gpt-5.3-codex:xhigh', label: 'GPT-5.3 Codex Extra High (Pro)' },
60
+ { id: 'gpt-5.5:high', label: 'GPT-5.5 High' },
61
+ { id: 'gpt-5.5:medium', label: 'GPT-5.5 Medium' },
62
+ { id: 'gpt-5.5:xhigh', label: 'GPT-5.5 Extra High' },
63
+ { id: 'gpt-5.4:medium', label: 'GPT-5.4 Medium' },
64
+ { id: 'gpt-5.4:high', label: 'GPT-5.4 High' },
65
+ { id: 'gpt-5.4:xhigh', label: 'GPT-5.4 Extra High' },
66
+ { id: 'gpt-5.4-mini:medium', label: 'GPT-5.4-Mini Medium' },
67
+ { id: 'gpt-5.4-mini:high', label: 'GPT-5.4-Mini High' },
68
+ { id: 'gpt-5.4-mini:xhigh', label: 'GPT-5.4-Mini Extra High' },
66
69
  ],
67
70
  };
68
71
 
@@ -77,22 +80,39 @@ const HANDLES = [
77
80
 
78
81
  function ModelDropdown({ models, value, onChange }: { models: { id: string; label: string }[]; value: string; onChange: (id: string) => void }) {
79
82
  const [open, setOpen] = useState(false);
80
- const ref = useRef<HTMLDivElement>(null);
83
+ const [pos, setPos] = useState<{ top: number; left: number; width: number } | null>(null);
84
+ const btnRef = useRef<HTMLButtonElement>(null);
85
+ const menuRef = useRef<HTMLDivElement>(null);
81
86
 
82
87
  useEffect(() => {
83
88
  if (!open) return;
89
+ const recalc = () => {
90
+ const r = btnRef.current?.getBoundingClientRect();
91
+ if (r) setPos({ top: r.bottom + 4, left: r.left, width: r.width });
92
+ };
93
+ recalc();
84
94
  const handler = (e: MouseEvent) => {
85
- if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);
95
+ const t = e.target as Node;
96
+ if (btnRef.current?.contains(t)) return;
97
+ if (menuRef.current?.contains(t)) return;
98
+ setOpen(false);
86
99
  };
87
100
  document.addEventListener('mousedown', handler);
88
- return () => document.removeEventListener('mousedown', handler);
101
+ window.addEventListener('resize', recalc);
102
+ window.addEventListener('scroll', recalc, true);
103
+ return () => {
104
+ document.removeEventListener('mousedown', handler);
105
+ window.removeEventListener('resize', recalc);
106
+ window.removeEventListener('scroll', recalc, true);
107
+ };
89
108
  }, [open]);
90
109
 
91
110
  const selected = models.find((m) => m.id === value);
92
111
 
93
112
  return (
94
- <div className="relative" ref={ref}>
113
+ <div className="relative">
95
114
  <button
115
+ ref={btnRef}
96
116
  type="button"
97
117
  onClick={() => setOpen((o) => !o)}
98
118
  className="w-full flex items-center justify-between bg-white/[0.03] border border-white/[0.08] text-white rounded-xl px-4 py-2.5 text-[13px] outline-none hover:border-white/15 focus:border-[#AF27E3]/30 transition-colors"
@@ -102,8 +122,12 @@ function ModelDropdown({ models, value, onChange }: { models: { id: string; labe
102
122
  </span>
103
123
  <ChevronDown className={`h-4 w-4 text-white/30 transition-transform ${open ? 'rotate-180' : ''}`} />
104
124
  </button>
105
- {open && (
106
- <div className="absolute left-0 right-0 top-full mt-1 bg-[#222] border border-white/[0.08] rounded-xl shadow-xl py-1 z-10 max-h-48 overflow-y-auto">
125
+ {open && pos && (
126
+ <div
127
+ ref={menuRef}
128
+ style={{ position: 'fixed', top: pos.top, left: pos.left, width: pos.width, zIndex: 60 }}
129
+ className="bg-[#222] border border-white/[0.08] rounded-xl shadow-xl py-1 max-h-[320px] overflow-y-auto"
130
+ >
107
131
  {models.map((m) => (
108
132
  <button
109
133
  key={m.id}
@@ -155,8 +179,24 @@ export default function OnboardWizard({ onComplete, isInitialSetup = false, onSa
155
179
  const [anthropicChecking, setAnthropicChecking] = useState(false);
156
180
 
157
181
  // OpenAI/Codex-specific
158
- const [openaiWaiting, setOpenaiWaiting] = useState(false);
182
+ // Two flows are supported: device-code (default, headless-friendly) and
183
+ // paste-back (fallback for users who prefer the browser-callback flow).
184
+ const [codexFlow, setCodexFlow] = useState<'device' | 'paste'>('device');
185
+
186
+ // Device-code flow
187
+ const [codexDeviceState, setCodexDeviceState] = useState<'idle' | 'pending' | 'success' | 'error'>('idle');
188
+ const [codexUserCode, setCodexUserCode] = useState('');
189
+ const [codexVerificationUrl, setCodexVerificationUrl] = useState('');
190
+ const [codexDeviceStarting, setCodexDeviceStarting] = useState(false);
191
+ const [codexCodeCopied, setCodexCodeCopied] = useState(false);
192
+
193
+ // Paste-back flow
194
+ const [codexOauthStarted, setCodexOauthStarted] = useState(false);
195
+ const [codexCode, setCodexCode] = useState('');
196
+ const [codexExchanging, setCodexExchanging] = useState(false);
197
+
159
198
  const [openaiError, setOpenaiError] = useState<string | undefined>();
199
+ const [codexChecking, setCodexChecking] = useState(false);
160
200
 
161
201
  // Bot name + Handle (step 2)
162
202
  const [botName, setBotName] = useState('');
@@ -342,21 +382,6 @@ export default function OnboardWizard({ onComplete, isInitialSetup = false, onSa
342
382
  .catch(() => {});
343
383
  }, [provider]);
344
384
 
345
- // Poll for Codex auth completion while waiting
346
- useEffect(() => {
347
- if (!openaiWaiting) return;
348
- const interval = setInterval(async () => {
349
- try {
350
- const res = await fetch('/api/auth/codex/status');
351
- const data = await res.json();
352
- if (data.authenticated) {
353
- setOpenaiWaiting(false);
354
- setAuthState((s) => ({ ...s, openai: 'connected' }));
355
- }
356
- } catch {}
357
- }, 2000);
358
- return () => clearInterval(interval);
359
- }, [openaiWaiting]);
360
385
 
361
386
  // Handle availability check (debounced, per-tier)
362
387
  // Skip when the current botName matches the existing registered handle
@@ -529,16 +554,21 @@ export default function OnboardWizard({ onComplete, isInitialSetup = false, onSa
529
554
  };
530
555
 
531
556
  const handleProviderChange = (id: string) => {
532
- if (provider === 'openai' && id !== 'openai' && openaiWaiting) {
533
- fetch('/api/auth/codex/cancel', { method: 'POST' });
534
- setOpenaiWaiting(false);
557
+ if (provider === 'openai' && id !== 'openai') {
558
+ if (codexOauthStarted) fetch('/api/auth/codex/cancel', { method: 'POST' });
559
+ if (codexDeviceState === 'pending') fetch('/api/auth/codex/device/cancel', { method: 'POST' });
535
560
  }
536
561
  setProvider(id);
537
- setModel('');
562
+ setModel(id === 'openai' ? 'gpt-5.5:high' : '');
538
563
  setOauthStarted(false);
539
564
  setAnthropicCode('');
540
565
  setAnthropicError(undefined);
541
- setOpenaiWaiting(false);
566
+ setCodexOauthStarted(false);
567
+ setCodexCode('');
568
+ setCodexDeviceState('idle');
569
+ setCodexUserCode('');
570
+ setCodexVerificationUrl('');
571
+ setCodexFlow('device');
542
572
  setOpenaiError(undefined);
543
573
  };
544
574
 
@@ -623,29 +653,128 @@ export default function OnboardWizard({ onComplete, isInitialSetup = false, onSa
623
653
  }
624
654
  };
625
655
 
626
- /* ── Auth handlers: OpenAI/Codex ── */
656
+ /* ── Auth handlers: OpenAI/Codex (device-code flow — default) ── */
657
+
658
+ const handleOpenAIDeviceStart = async () => {
659
+ setOpenaiError(undefined);
660
+ setCodexDeviceStarting(true);
661
+ setCodexDeviceState('pending');
662
+ try {
663
+ const res = await fetch('/api/auth/codex/device/start', { method: 'POST' });
664
+ const data = await res.json();
665
+ if (data.success) {
666
+ setCodexUserCode(data.userCode || '');
667
+ setCodexVerificationUrl(data.verificationUrl || '');
668
+ if (data.verificationUrl) openExternal(data.verificationUrl);
669
+ } else {
670
+ setCodexDeviceState('error');
671
+ setOpenaiError(data.error || 'Failed to start device-code login');
672
+ }
673
+ } catch (err: any) {
674
+ setCodexDeviceState('error');
675
+ setOpenaiError(err.message);
676
+ } finally {
677
+ setCodexDeviceStarting(false);
678
+ }
679
+ };
680
+
681
+ const handleOpenAIDeviceCancel = async () => {
682
+ try { await fetch('/api/auth/codex/device/cancel', { method: 'POST' }); } catch {}
683
+ setCodexDeviceState('idle');
684
+ setCodexUserCode('');
685
+ setCodexVerificationUrl('');
686
+ };
687
+
688
+ const handleCopyUserCode = async () => {
689
+ try {
690
+ await navigator.clipboard.writeText(codexUserCode);
691
+ setCodexCodeCopied(true);
692
+ setTimeout(() => setCodexCodeCopied(false), 1500);
693
+ } catch { /* clipboard denied */ }
694
+ };
695
+
696
+ // Poll device-code status while pending
697
+ useEffect(() => {
698
+ if (codexDeviceState !== 'pending' || !codexUserCode) return;
699
+ const interval = setInterval(async () => {
700
+ try {
701
+ const res = await fetch('/api/auth/codex/device/status');
702
+ const data = await res.json();
703
+ if (data.state === 'success') {
704
+ setCodexDeviceState('success');
705
+ setAuthState((s) => ({ ...s, openai: 'connected' }));
706
+ } else if (data.state === 'error') {
707
+ setCodexDeviceState('error');
708
+ setOpenaiError(data.error || 'Device-code login failed');
709
+ }
710
+ } catch {}
711
+ }, 2000);
712
+ return () => clearInterval(interval);
713
+ }, [codexDeviceState, codexUserCode]);
714
+
715
+ /* ── Auth handlers: OpenAI/Codex (paste-back flow — fallback) ── */
627
716
 
628
717
  const handleOpenAIAuth = async () => {
629
- setOpenaiWaiting(true);
630
718
  setOpenaiError(undefined);
631
719
  try {
632
720
  const res = await fetch('/api/auth/codex/start', { method: 'POST' });
633
721
  const data = await res.json();
634
722
  if (data.success && data.authUrl) {
635
723
  openExternal(data.authUrl);
724
+ setCodexOauthStarted(true);
636
725
  } else {
637
- setOpenaiWaiting(false);
638
726
  setOpenaiError(data.error || 'Failed to start authentication');
639
727
  }
640
728
  } catch (err: any) {
641
- setOpenaiWaiting(false);
642
729
  setOpenaiError(err.message);
643
730
  }
644
731
  };
645
732
 
646
- const handleOpenAICancel = () => {
647
- setOpenaiWaiting(false);
648
- fetch('/api/auth/codex/cancel', { method: 'POST' });
733
+ const handleOpenAIConnect = async () => {
734
+ if (!codexCode.trim()) return;
735
+ setCodexExchanging(true);
736
+ setOpenaiError(undefined);
737
+ try {
738
+ const res = await fetch('/api/auth/codex/exchange', {
739
+ method: 'POST',
740
+ headers: { 'Content-Type': 'application/json' },
741
+ body: JSON.stringify({ code: codexCode.trim() }),
742
+ });
743
+ const data = await res.json();
744
+ if (data.success) {
745
+ setAuthState((s) => ({ ...s, openai: 'connected' }));
746
+ setCodexCode('');
747
+ } else {
748
+ setOpenaiError(data.error || 'Code exchange failed');
749
+ }
750
+ } catch (err: any) {
751
+ setOpenaiError(err.message);
752
+ } finally {
753
+ setCodexExchanging(false);
754
+ }
755
+ };
756
+
757
+ const handleOpenAIPaste = async () => {
758
+ try {
759
+ const text = await navigator.clipboard.readText();
760
+ if (text) setCodexCode(text.trim());
761
+ } catch { /* clipboard denied */ }
762
+ };
763
+
764
+ const handleOpenAICheckAuth = async () => {
765
+ setCodexChecking(true);
766
+ setOpenaiError(undefined);
767
+ try {
768
+ const res = await fetch('/api/auth/codex/status');
769
+ const data = await res.json();
770
+ if (data.authenticated) {
771
+ setAuthState((s) => ({ ...s, openai: 'connected' }));
772
+ } else {
773
+ setOpenaiError('No active session found. Please authenticate first.');
774
+ }
775
+ } catch {} finally {
776
+ setCodexChecking(false);
777
+ }
649
778
  };
650
779
 
651
780
  /* ── Navigation ── */
@@ -2077,38 +2206,155 @@ export default function OnboardWizard({ onComplete, isInitialSetup = false, onSa
2077
2206
  </div>
2078
2207
  )}
2079
2208
 
2080
- <div className="space-y-1.5">
2081
- {[
2082
- 'Click the button below — your browser will open for ChatGPT sign-in',
2083
- 'Sign in with your ChatGPT Plus or Pro account',
2084
- 'Authentication completes automatically — no code to copy',
2085
- ].map((text, i) => (
2086
- <div key={i} className="flex items-start gap-2">
2087
- <span className="flex-shrink-0 w-[18px] h-[18px] rounded-full bg-white/[0.06] text-white/30 text-[10px] font-medium flex items-center justify-center mt-px">{i + 1}</span>
2088
- <p className="text-white/40 text-[12px] leading-relaxed">{text}</p>
2209
+ {/* ── Device-code flow (default) ── */}
2210
+ {codexFlow === 'device' && codexDeviceState !== 'pending' && (
2211
+ <>
2212
+ <div className="space-y-1.5">
2213
+ {[
2214
+ 'Click below — we\'ll open auth.openai.com/codex/device for you',
2215
+ 'Sign in with your ChatGPT Plus or Pro account',
2216
+ 'Type the one-time code shown here on that page',
2217
+ ].map((text, i) => (
2218
+ <div key={i} className="flex items-start gap-2">
2219
+ <span className="flex-shrink-0 w-[18px] h-[18px] rounded-full bg-white/[0.06] text-white/30 text-[10px] font-medium flex items-center justify-center mt-px">{i + 1}</span>
2220
+ <p className="text-white/40 text-[12px] leading-relaxed">{text}</p>
2221
+ </div>
2222
+ ))}
2089
2223
  </div>
2090
- ))}
2091
- </div>
2092
2224
 
2093
- <button
2094
- onClick={handleOpenAIAuth}
2095
- disabled={openaiWaiting}
2096
- className="w-full py-2.5 px-4 bg-white/[0.06] hover:bg-white/[0.09] text-white text-[13px] font-medium rounded-xl transition-colors flex items-center justify-center gap-2 disabled:opacity-60"
2097
- >
2098
- {openaiWaiting ? (
2099
- <><LoaderCircle className="h-3.5 w-3.5 animate-spin opacity-60" />Waiting for sign-in...</>
2100
- ) : (
2101
- <>Authenticate with ChatGPT<ArrowRight className="h-3.5 w-3.5 opacity-60" /></>
2102
- )}
2103
- </button>
2225
+ <button
2226
+ onClick={handleOpenAIDeviceStart}
2227
+ disabled={codexDeviceStarting}
2228
+ className="w-full py-2.5 px-4 bg-gradient-brand hover:opacity-90 text-white text-[13px] font-medium rounded-xl transition-colors flex items-center justify-center gap-2 disabled:opacity-60"
2229
+ >
2230
+ {codexDeviceStarting ? (
2231
+ <><LoaderCircle className="h-3.5 w-3.5 animate-spin" />Requesting code...</>
2232
+ ) : (
2233
+ <>Sign in with ChatGPT<ArrowRight className="h-3.5 w-3.5 opacity-60" /></>
2234
+ )}
2235
+ </button>
2236
+ </>
2237
+ )}
2104
2238
 
2105
- {openaiWaiting && (
2106
- <button
2107
- onClick={handleOpenAICancel}
2108
- className="w-full py-1.5 text-white/25 text-[11px] hover:text-white/40 transition-colors"
2109
- >
2110
- Cancel
2111
- </button>
2239
+ {codexFlow === 'device' && codexDeviceState === 'pending' && codexUserCode && (
2240
+ <div className="space-y-3">
2241
+ <div className="bg-white/[0.03] border border-white/[0.06] rounded-xl p-4">
2242
+ <p className="text-[11px] text-white/40 mb-1">1. Open this URL in any browser</p>
2243
+ <button
2244
+ onClick={() => openExternal(codexVerificationUrl)}
2245
+ className="w-full text-left py-2 px-3 bg-white/[0.04] hover:bg-white/[0.07] rounded-lg text-[12px] font-mono text-white/80 flex items-center justify-between transition-colors"
2246
+ >
2247
+ <span className="truncate">{codexVerificationUrl}</span>
2248
+ <ExternalLink className="h-3.5 w-3.5 ml-2 opacity-60 shrink-0" />
2249
+ </button>
2250
+
2251
+ <p className="text-[11px] text-white/40 mt-3 mb-1">2. Enter this code</p>
2252
+ <button
2253
+ onClick={handleCopyUserCode}
2254
+ className="w-full py-3 px-3 bg-white/[0.04] hover:bg-white/[0.07] rounded-lg text-center transition-colors flex items-center justify-center gap-3 group"
2255
+ >
2256
+ <span className="text-[20px] font-mono font-semibold text-white tracking-widest">{codexUserCode}</span>
2257
+ {codexCodeCopied ? (
2258
+ <Check className="h-4 w-4 text-emerald-400" />
2259
+ ) : (
2260
+ <Copy className="h-4 w-4 text-white/30 group-hover:text-white/60" />
2261
+ )}
2262
+ </button>
2263
+
2264
+ <div className="flex items-center justify-center gap-2 mt-3 text-[11px] text-white/40">
2265
+ <LoaderCircle className="h-3 w-3 animate-spin" />
2266
+ Waiting for you to approve...
2267
+ </div>
2268
+ </div>
2269
+
2270
+ <button
2271
+ onClick={handleOpenAIDeviceCancel}
2272
+ className="w-full py-1.5 text-white/25 text-[11px] hover:text-white/40 transition-colors"
2273
+ >
2274
+ Cancel
2275
+ </button>
2276
+ </div>
2277
+ )}
2278
+
2279
+ {/* ── Paste-back flow (fallback) ── */}
2280
+ {codexFlow === 'paste' && (
2281
+ <>
2282
+ <div className="space-y-1.5">
2283
+ {[
2284
+ 'Click below to open ChatGPT sign-in',
2285
+ 'Sign in with your ChatGPT Plus or Pro account',
2286
+ 'Your browser will say "site can\'t be reached" — that\'s expected. Copy the FULL URL from the address bar and paste it below.',
2287
+ ].map((text, i) => (
2288
+ <div key={i} className="flex items-start gap-2">
2289
+ <span className="flex-shrink-0 w-[18px] h-[18px] rounded-full bg-white/[0.06] text-white/30 text-[10px] font-medium flex items-center justify-center mt-px">{i + 1}</span>
2290
+ <p className="text-white/40 text-[12px] leading-relaxed">{text}</p>
2291
+ </div>
2292
+ ))}
2293
+ </div>
2294
+
2295
+ <button
2296
+ onClick={handleOpenAIAuth}
2297
+ className="w-full py-2.5 px-4 bg-gradient-brand hover:opacity-90 text-white text-[13px] font-medium rounded-xl transition-colors flex items-center justify-center gap-2"
2298
+ >
2299
+ {codexOauthStarted ? (
2300
+ <><ExternalLink className="h-3.5 w-3.5 opacity-60" />Open authentication page again</>
2301
+ ) : (
2302
+ <>Authenticate with ChatGPT<ArrowRight className="h-3.5 w-3.5 opacity-60" /></>
2303
+ )}
2304
+ </button>
2305
+
2306
+ <div className="relative">
2307
+ <input
2308
+ type="text"
2309
+ value={codexCode}
2310
+ onChange={(e) => setCodexCode(e.target.value)}
2311
+ onKeyDown={(e) => e.key === 'Enter' && handleOpenAIConnect()}
2312
+ placeholder="Paste callback URL or code here..."
2313
+ className={inputSmCls + ' pr-10 font-mono'}
2314
+ />
2315
+ <button
2316
+ onClick={handleOpenAIPaste}
2317
+ className="absolute right-3 top-1/2 -translate-y-1/2 text-white/20 hover:text-white/50 transition-colors"
2318
+ >
2319
+ <ClipboardPaste className="h-3.5 w-3.5" />
2320
+ </button>
2321
+ </div>
2322
+
2323
+ <button
2324
+ onClick={handleOpenAIConnect}
2325
+ disabled={!codexCode.trim() || codexExchanging}
2326
+ className="w-full py-2.5 px-4 bg-gradient-brand hover:opacity-90 text-white text-[13px] font-medium rounded-xl transition-colors flex items-center justify-center gap-2 disabled:opacity-40"
2327
+ >
2328
+ {codexExchanging ? (<><LoaderCircle className="h-3.5 w-3.5 animate-spin" />Verifying...</>) : 'Connect'}
2329
+ </button>
2330
+ </>
2331
+ )}
2332
+
2333
+ {/* ── Flow toggle + already-authenticated ── */}
2334
+ {codexDeviceState !== 'pending' && (
2335
+ <div className="flex items-center justify-between pt-1">
2336
+ <button
2337
+ onClick={() => {
2338
+ setOpenaiError(undefined);
2339
+ setCodexFlow(codexFlow === 'device' ? 'paste' : 'device');
2340
+ }}
2341
+ className="text-white/25 text-[11px] hover:text-white/40 transition-colors"
2342
+ >
2343
+ {codexFlow === 'device' ? 'Use callback URL instead' : 'Use device code instead'}
2344
+ </button>
2345
+ <button
2346
+ onClick={handleOpenAICheckAuth}
2347
+ disabled={codexChecking}
2348
+ className="text-white/25 text-[11px] hover:text-white/40 transition-colors flex items-center gap-1.5 disabled:opacity-50"
2349
+ >
2350
+ {codexChecking ? (
2351
+ <LoaderCircle className="h-3 w-3 animate-spin" />
2352
+ ) : (
2353
+ <RefreshCw className="h-3 w-3" />
2354
+ )}
2355
+ {codexChecking ? 'Checking...' : 'I\'m already authenticated'}
2356
+ </button>
2357
+ </div>
2112
2358
  )}
2113
2359
  </>
2114
2360
  )}