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.
- package/dist-bloby/assets/angular-html-DxXh-QMA.js +1 -0
- package/dist-bloby/assets/{angular-ts-BJPoZ_vo.js → angular-ts-BNEmshfa.js} +1 -1
- package/dist-bloby/assets/{apl-CyVuPSCb.js → apl-CD5excG6.js} +1 -1
- package/dist-bloby/assets/{astro-CKc3-gwH.js → astro-BsuvMd51.js} +1 -1
- package/dist-bloby/assets/{blade-DMAsVBaV.js → blade-BzCfsa5s.js} +1 -1
- package/dist-bloby/assets/{bloby-CqtSjokc.js → bloby-B1w9ReAR.js} +19 -19
- package/dist-bloby/assets/{bsl-B1qbqNES.js → bsl-BODK--Fo.js} +1 -1
- package/dist-bloby/assets/c-QpHxjkb9.js +1 -0
- package/dist-bloby/assets/{cairo-BDj8wWhy.js → cairo-BwpHIzLA.js} +1 -1
- package/dist-bloby/assets/{cobol-hBjMZW-R.js → cobol-Dvyhsqyz.js} +1 -1
- package/dist-bloby/assets/{coffee-B4OtR3w-.js → coffee-CyaHgmLy.js} +1 -1
- package/dist-bloby/assets/cpp-DlbkFQj0.js +1 -0
- package/dist-bloby/assets/{crystal-x3k4USY-.js → crystal-CR4Yni1K.js} +1 -1
- package/dist-bloby/assets/css-jgrsA6xW.js +1 -0
- package/dist-bloby/assets/{edge-B-9TrlZC.js → edge-CeStCG6d.js} +1 -1
- package/dist-bloby/assets/{elixir-CXCzbj1r.js → elixir-CNfWtFyr.js} +1 -1
- package/dist-bloby/assets/{elm-BdRiwmde.js → elm-WhyRrsYH.js} +1 -1
- package/dist-bloby/assets/{erb-C9tvRzx3.js → erb-BvJkfco6.js} +1 -1
- package/dist-bloby/assets/{erlang-Bc4hQuqa.js → erlang-CjZU-VwD.js} +1 -1
- package/dist-bloby/assets/{fortran-fixed-form-B02FOYI-.js → fortran-fixed-form-CLgNuKMV.js} +1 -1
- package/dist-bloby/assets/{fsharp-DhdR18vN.js → fsharp-kVgJ9XJy.js} +1 -1
- package/dist-bloby/assets/{gdresource-DgnrMPIx.js → gdresource-DDsMuL8p.js} +1 -1
- package/dist-bloby/assets/{git-commit-DGJi7qBD.js → git-commit-BKhxSJdF.js} +1 -1
- package/dist-bloby/assets/{git-rebase-HwDSB2qJ.js → git-rebase-C1GyNmcX.js} +1 -1
- package/dist-bloby/assets/{glimmer-js-B6LF_BMd.js → glimmer-js-Cl3u7vjy.js} +1 -1
- package/dist-bloby/assets/{glimmer-ts-Cn42BUKe.js → glimmer-ts-CtPlRgiA.js} +1 -1
- package/dist-bloby/assets/globals-B1T5ANQV.js +18 -0
- package/dist-bloby/assets/globals-CcIc79IH.css +2 -0
- package/dist-bloby/assets/glsl-Bz5r7Lln.js +1 -0
- package/dist-bloby/assets/graphql-IV9ZCUty.js +1 -0
- package/dist-bloby/assets/{hack-DDEqRjBe.js → hack-XsNdYtzr.js} +1 -1
- package/dist-bloby/assets/haml-BDRqXh7d.js +1 -0
- package/dist-bloby/assets/{handlebars-g9Qe0ao2.js → handlebars-Rv2-mTii.js} +1 -1
- package/dist-bloby/assets/highlighted-body-OFNGDK62-CHkKxiLr.js +1 -0
- package/dist-bloby/assets/html-BkYSbpwH.js +1 -0
- package/dist-bloby/assets/{html-derivative-D-XvNBA6.js → html-derivative-CNiypDIO.js} +1 -1
- package/dist-bloby/assets/{http-qlhghEti.js → http-Vgn8hmbu.js} +1 -1
- package/dist-bloby/assets/{hurl-CHIKfBKk.js → hurl-C_EA75yu.js} +1 -1
- package/dist-bloby/assets/{hxml-adC65L_J.js → hxml-YehGxZ3T.js} +1 -1
- package/dist-bloby/assets/java-div3J5pm.js +1 -0
- package/dist-bloby/assets/javascript-D7sYfeLa.js +1 -0
- package/dist-bloby/assets/{jinja-BHZt0_Dn.js → jinja-BovBDArb.js} +1 -1
- package/dist-bloby/assets/{jison-TqJYWKkW.js → jison-C7UZOdoh.js} +1 -1
- package/dist-bloby/assets/json-DsAnzN7U.js +1 -0
- package/dist-bloby/assets/jsx-CftCCFil.js +1 -0
- package/dist-bloby/assets/jsx-runtime-DsY8nUeV.js +1 -0
- package/dist-bloby/assets/{julia-CW07fy07.js → julia-D8hM3XBr.js} +1 -1
- package/dist-bloby/assets/{just-DBcWo9WY.js → just-CHnwfRRG.js} +1 -1
- package/dist-bloby/assets/{latex-D6lXiPTF.js → latex-Ccu-ZO0T.js} +1 -1
- package/dist-bloby/assets/{liquid-DhYYAQ41.js → liquid-BRbNyfzr.js} +1 -1
- package/dist-bloby/assets/lua-BcwT4KiU.js +1 -0
- package/dist-bloby/assets/{marko-xtrIBdcL.js → marko-Both7s0f.js} +1 -1
- package/dist-bloby/assets/{mdc-DyZVNnwP.js → mdc-7TpRllSI.js} +1 -1
- package/dist-bloby/assets/mermaid-GHXKKRXX-LsCge3XG.js +1 -0
- package/dist-bloby/assets/{nextflow-JEyYUlIq.js → nextflow-C2lnptGp.js} +1 -1
- package/dist-bloby/assets/{nginx-CGgm1VOJ.js → nginx-1MGd6YK-.js} +1 -1
- package/dist-bloby/assets/{nim-Br7S817Z.js → nim-CXWhMB6N.js} +1 -1
- package/dist-bloby/assets/onboard-DdL-0meC.js +1 -0
- package/dist-bloby/assets/{perl-DqDX-7VG.js → perl-s-whHxj8.js} +1 -1
- package/dist-bloby/assets/{php-DYSqNNGJ.js → php-KdIqqcNq.js} +1 -1
- package/dist-bloby/assets/{pug-Bob3gNio.js → pug-Cj_1QUAx.js} +1 -1
- package/dist-bloby/assets/{qml-CsMafcqN.js → qml-BQHwZF2t.js} +1 -1
- package/dist-bloby/assets/r-BW3neTZ6.js +1 -0
- package/dist-bloby/assets/{razor-B4PzhaZX.js → razor-D4oLdRr2.js} +1 -1
- package/dist-bloby/assets/regexp-CK2Vecnb.js +1 -0
- package/dist-bloby/assets/rolldown-runtime-C-57s9n3.js +1 -0
- package/dist-bloby/assets/{rst-BXuz-2b8.js → rst-kaCCXG10.js} +1 -1
- package/dist-bloby/assets/{ruby-CXP5_4kq.js → ruby-DIAu88GV.js} +1 -1
- package/dist-bloby/assets/{sas-Cov9PzAD.js → sas-DW2U5bKI.js} +1 -1
- package/dist-bloby/assets/scss-CpUwMEPb.js +1 -0
- package/dist-bloby/assets/{shaderlab-DZ3Lsiak.js → shaderlab-CCgEvKkt.js} +1 -1
- package/dist-bloby/assets/shellscript-BhywzMlr.js +1 -0
- package/dist-bloby/assets/{shellsession-BHLVblBB.js → shellsession-vB5Hy6UU.js} +1 -1
- package/dist-bloby/assets/{soy-e0u3-wIA.js → soy-BNDHXm4e.js} +1 -1
- package/dist-bloby/assets/{sparql-B9c85a_o.js → sparql-DH0hFmAi.js} +1 -1
- package/dist-bloby/assets/sql-D395ukne.js +1 -0
- package/dist-bloby/assets/{stata-B1mLEMrz.js → stata-BHXdpuN3.js} +1 -1
- package/dist-bloby/assets/{surrealql-BTKo2XFY.js → surrealql-eiBkI2Jy.js} +1 -1
- package/dist-bloby/assets/{svelte-B7URZ-wm.js → svelte-DcqzCcP6.js} +1 -1
- package/dist-bloby/assets/{templ-DVRYIgGq.js → templ-DpMCsFaT.js} +1 -1
- package/dist-bloby/assets/{tex-CdJ24HJj.js → tex-B71AZ6Vb.js} +1 -1
- package/dist-bloby/assets/{ts-tags-CCSbelDn.js → ts-tags-CRuJWBGV.js} +1 -1
- package/dist-bloby/assets/tsx-CEFbrBOd.js +1 -0
- package/dist-bloby/assets/{twig-Dn4ruiVl.js → twig-CuSIh_aH.js} +1 -1
- package/dist-bloby/assets/typescript-CV9iMaP7.js +1 -0
- package/dist-bloby/assets/{vue-D19cWHwY.js → vue-YbgnWnT2.js} +1 -1
- package/dist-bloby/assets/{vue-html-_j-KC7Cs.js → vue-html-CXsio3-X.js} +1 -1
- package/dist-bloby/assets/{vue-vine-BC03MN6c.js → vue-vine-C8pVogU0.js} +1 -1
- package/dist-bloby/assets/xml-Zmzpltp0.js +1 -0
- package/dist-bloby/assets/{xsl-DR-zOeBm.js → xsl-CqzL2w2F.js} +1 -1
- package/dist-bloby/assets/yaml-Dc_auW1I.js +1 -0
- package/dist-bloby/bloby.html +5 -4
- package/dist-bloby/onboard.html +5 -4
- package/package.json +1 -1
- package/supervisor/bloby-agent.ts +65 -633
- package/supervisor/chat/OnboardWizard.tsx +315 -69
- package/supervisor/harnesses/claude.ts +684 -0
- package/supervisor/harnesses/codex.ts +73 -0
- package/supervisor/harnesses/types.ts +81 -0
- package/supervisor/index.ts +1 -1
- package/worker/codex-auth.ts +362 -137
- package/worker/index.ts +30 -4
- package/dist-bloby/assets/angular-html-olSuI25H.js +0 -1
- package/dist-bloby/assets/c-BvB8CVo8.js +0 -1
- package/dist-bloby/assets/cpp-BblbpnyR.js +0 -1
- package/dist-bloby/assets/css-zY4NE9yA.js +0 -1
- package/dist-bloby/assets/globals-LpXKrQgt.css +0 -2
- package/dist-bloby/assets/globals-zKQhzQOX.js +0 -18
- package/dist-bloby/assets/glsl-CEMf-THb.js +0 -1
- package/dist-bloby/assets/graphql-dBCd2Czl.js +0 -1
- package/dist-bloby/assets/haml-Ck5pVAEG.js +0 -1
- package/dist-bloby/assets/highlighted-body-OFNGDK62-B0W8hCx-.js +0 -1
- package/dist-bloby/assets/html-CzX0w7K_.js +0 -1
- package/dist-bloby/assets/java-BqKEu7zh.js +0 -1
- package/dist-bloby/assets/javascript-CzjRtS1s.js +0 -1
- package/dist-bloby/assets/json-CdFmZMJc.js +0 -1
- package/dist-bloby/assets/jsx-BL6Wh6Qw.js +0 -1
- package/dist-bloby/assets/jsx-runtime-C0W9Wf2W.js +0 -1
- package/dist-bloby/assets/lua-B4ezzssg.js +0 -1
- package/dist-bloby/assets/mermaid-GHXKKRXX-Dr8I7wwH.js +0 -1
- package/dist-bloby/assets/onboard-C1yXK8uT.js +0 -1
- package/dist-bloby/assets/r-CGji9_vM.js +0 -1
- package/dist-bloby/assets/regexp-CvWG4lI-.js +0 -1
- package/dist-bloby/assets/scss-Efq7Dmbs.js +0 -1
- package/dist-bloby/assets/shellscript-BbEstezf.js +0 -1
- package/dist-bloby/assets/sql-CB6kO6Km.js +0 -1
- package/dist-bloby/assets/tsx-DrzBggF8.js +0 -1
- package/dist-bloby/assets/typescript-COZIw7xM.js +0 -1
- package/dist-bloby/assets/xml-BlDEvPia.js +0 -1
- package/dist-bloby/assets/yaml-iUXljnLs.js +0 -1
- /package/dist-bloby/assets/{abap-smLpETzL.js → abap--vzi7Rxy.js} +0 -0
- /package/dist-bloby/assets/{actionscript-3-o-aRvjY5.js → actionscript-3-CV21uODD.js} +0 -0
- /package/dist-bloby/assets/{ada-D5RRX1i4.js → ada-DpXSEmbw.js} +0 -0
- /package/dist-bloby/assets/{andromeeda-N4z3YzmR.js → andromeeda-C1V0Cb0M.js} +0 -0
- /package/dist-bloby/assets/{apache-DttKlSqg.js → apache-CRmVjs8c.js} +0 -0
- /package/dist-bloby/assets/{apex-DL7j-a2n.js → apex-DIIc4r7E.js} +0 -0
- /package/dist-bloby/assets/{applescript-DCbL_2FX.js → applescript-DMX6NGuU.js} +0 -0
- /package/dist-bloby/assets/{ara-DqheWJCe.js → ara-3SArX2Zn.js} +0 -0
- /package/dist-bloby/assets/{asciidoc-BH2sf2K4.js → asciidoc-CnVFjb7X.js} +0 -0
- /package/dist-bloby/assets/{asm-rfjOMz3U.js → asm-Cb-CgaBD.js} +0 -0
- /package/dist-bloby/assets/{aurora-x-CND-FqEb.js → aurora-x-CjvoFyi0.js} +0 -0
- /package/dist-bloby/assets/{awk-CMV5n9Z7.js → awk-BYjsWVhV.js} +0 -0
- /package/dist-bloby/assets/{ayu-dark-on7xzq_B.js → ayu-dark-C4UVdT_g.js} +0 -0
- /package/dist-bloby/assets/{ayu-light-DnGeGGc2.js → ayu-light-CFJ-dST-.js} +0 -0
- /package/dist-bloby/assets/{ayu-mirage-DG3LlYC_.js → ayu-mirage-BxM9D2Mi.js} +0 -0
- /package/dist-bloby/assets/{ballerina-BjMqJjlr.js → ballerina-BsKCUtAm.js} +0 -0
- /package/dist-bloby/assets/{bat-BaVbo_qw.js → bat-CJlQOahT.js} +0 -0
- /package/dist-bloby/assets/{beancount-DBt5Mbc_.js → beancount-Cyf6Xlzd.js} +0 -0
- /package/dist-bloby/assets/{berry-Cyjuxiss.js → berry-DHYmFnza.js} +0 -0
- /package/dist-bloby/assets/{bibtex-BV_0nsPq.js → bibtex-BUB9btZd.js} +0 -0
- /package/dist-bloby/assets/{bicep-C2gEwu4J.js → bicep-CNVX4dQj.js} +0 -0
- /package/dist-bloby/assets/{bird2-BRyaEJd0.js → bird2-LZP25z1s.js} +0 -0
- /package/dist-bloby/assets/{c3-DTTbp5N2.js → c3-BI41OB2W.js} +0 -0
- /package/dist-bloby/assets/{cadence-CPz83cmI.js → cadence-BDnzkZFt.js} +0 -0
- /package/dist-bloby/assets/{catppuccin-frappe-Dr22sraq.js → catppuccin-frappe-DpT1lCYX.js} +0 -0
- /package/dist-bloby/assets/{catppuccin-latte-C57EeX8c.js → catppuccin-latte-qMMse1WJ.js} +0 -0
- /package/dist-bloby/assets/{catppuccin-macchiato-CpheI4uD.js → catppuccin-macchiato-DMu0Ac9B.js} +0 -0
- /package/dist-bloby/assets/{catppuccin-mocha-D8Lmdks_.js → catppuccin-mocha-DicTaD9V.js} +0 -0
- /package/dist-bloby/assets/{clarity-CFJ2Yc3q.js → clarity-CPz-yzAn.js} +0 -0
- /package/dist-bloby/assets/{clojure-6R01QgJC.js → clojure-BxJLFKTj.js} +0 -0
- /package/dist-bloby/assets/{cmake-D5rSbMir.js → cmake-BmC4o4J9.js} +0 -0
- /package/dist-bloby/assets/{codeowners-_3A-ClkN.js → codeowners-BPHDuybI.js} +0 -0
- /package/dist-bloby/assets/{codeql-DlIhJTR7.js → codeql-DYWyWzRY.js} +0 -0
- /package/dist-bloby/assets/{common-lisp-BvQzz173.js → common-lisp-CsDdrwfa.js} +0 -0
- /package/dist-bloby/assets/{coq-DTNXReIC.js → coq-BZNwxllS.js} +0 -0
- /package/dist-bloby/assets/{csharp-BDKQY1K9.js → csharp-BLhQzhUA.js} +0 -0
- /package/dist-bloby/assets/{csv-DNUpVBxl.js → csv-DPc9UZFt.js} +0 -0
- /package/dist-bloby/assets/{cue-DDdBc2s3.js → cue-Bat8Mt8Y.js} +0 -0
- /package/dist-bloby/assets/{cypher-CguaznO2.js → cypher-CTnWkM4Y.js} +0 -0
- /package/dist-bloby/assets/{d-CHcoyjv3.js → d-CccbtpLU.js} +0 -0
- /package/dist-bloby/assets/{dark-plus-CqeW_0kH.js → dark-plus-CKh7uIvz.js} +0 -0
- /package/dist-bloby/assets/{dart-RM3aRphk.js → dart-SbRHwU1n.js} +0 -0
- /package/dist-bloby/assets/{dax-nbnY1d79.js → dax-vVKSTwd9.js} +0 -0
- /package/dist-bloby/assets/{desktop-BD76cvxT.js → desktop-rdWGepy4.js} +0 -0
- /package/dist-bloby/assets/{diff-CdkWtnkL.js → diff-G5H-0DNT.js} +0 -0
- /package/dist-bloby/assets/{docker-ZyPHc6zB.js → docker-CC20slQp.js} +0 -0
- /package/dist-bloby/assets/{dotenv-BdJZEwA6.js → dotenv-C36c6TdP.js} +0 -0
- /package/dist-bloby/assets/{dracula-CtqCPLGa.js → dracula-nNMQZYa7.js} +0 -0
- /package/dist-bloby/assets/{dracula-soft-DmBpwRAy.js → dracula-soft-BPmUsSlJ.js} +0 -0
- /package/dist-bloby/assets/{dream-maker-BJL4qlg3.js → dream-maker-DleGc9Hy.js} +0 -0
- /package/dist-bloby/assets/{emacs-lisp-_LyYa2Ky.js → emacs-lisp-D_QlcMHs.js} +0 -0
- /package/dist-bloby/assets/{everforest-dark-CrbyKk4n.js → everforest-dark-FkVvIMUl.js} +0 -0
- /package/dist-bloby/assets/{everforest-light-DRbSh8Tm.js → everforest-light-d3V1wTAd.js} +0 -0
- /package/dist-bloby/assets/{fennel-CC2BkRsS.js → fennel-BEssPROc.js} +0 -0
- /package/dist-bloby/assets/{fish-D2ZCzqcE.js → fish-Cz5yLEyJ.js} +0 -0
- /package/dist-bloby/assets/{fluent-DKAm3m7q.js → fluent-TGO8KajN.js} +0 -0
- /package/dist-bloby/assets/{fortran-free-form-BPTf0lbT.js → fortran-free-form-CHQXX5JB.js} +0 -0
- /package/dist-bloby/assets/{gdscript-CsadCSaZ.js → gdscript-DBkVGsC6.js} +0 -0
- /package/dist-bloby/assets/{gdshader-PfnN_8tR.js → gdshader-CWQhZP7Q.js} +0 -0
- /package/dist-bloby/assets/{genie-Bj-orPAV.js → genie-7iw14YxB.js} +0 -0
- /package/dist-bloby/assets/{gherkin-COVWpJ-Q.js → gherkin-D4AlAQSH.js} +0 -0
- /package/dist-bloby/assets/{github-dark-ipGuFGYC.js → github-dark-CpBni1SQ.js} +0 -0
- /package/dist-bloby/assets/{github-dark-default-DX3IG_X0.js → github-dark-default-Cr5Q59Ad.js} +0 -0
- /package/dist-bloby/assets/{github-dark-dimmed-CH6p_7ez.js → github-dark-dimmed-WEORr92a.js} +0 -0
- /package/dist-bloby/assets/{github-dark-high-contrast-Bg2sSao5.js → github-dark-high-contrast-uM2plAzl.js} +0 -0
- /package/dist-bloby/assets/{github-light-BxjqOQl0.js → github-light-BROm54vS.js} +0 -0
- /package/dist-bloby/assets/{github-light-default-DwpDd1IQ.js → github-light-default-jSwgX00f.js} +0 -0
- /package/dist-bloby/assets/{github-light-high-contrast-C0QeixPf.js → github-light-high-contrast-Bp9ESXtp.js} +0 -0
- /package/dist-bloby/assets/{gleam-BF2NigGj.js → gleam-D1LXnIj0.js} +0 -0
- /package/dist-bloby/assets/{gn-CMIt9roj.js → gn-CReOiE5m.js} +0 -0
- /package/dist-bloby/assets/{gnuplot-DgWlRTEj.js → gnuplot-DufViamc.js} +0 -0
- /package/dist-bloby/assets/{go-DLnOLj8q.js → go-DC_Zm44P.js} +0 -0
- /package/dist-bloby/assets/{groovy-B9qLWIkE.js → groovy-DEGDVBi0.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-dark-hard-BIMX9ePb.js → gruvbox-dark-hard-C-zANgxR.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-dark-medium-DxuwyVzM.js → gruvbox-dark-medium-DY7Z6TBK.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-dark-soft-ba2fjht0.js → gruvbox-dark-soft-Bpj6owGh.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-light-hard-DAJK2PqC.js → gruvbox-light-hard-DVwTvHam.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-light-medium-WRifDAJD.js → gruvbox-light-medium-98PeoD5Y.js} +0 -0
- /package/dist-bloby/assets/{gruvbox-light-soft-B0dBOoVB.js → gruvbox-light-soft-BHI2PZTB.js} +0 -0
- /package/dist-bloby/assets/{haskell-BaGpmm_c.js → haskell-B-K-GoPf.js} +0 -0
- /package/dist-bloby/assets/{haxe-DfXTCEOz.js → haxe-md5t_Y_E.js} +0 -0
- /package/dist-bloby/assets/{hcl-CbCtpSbi.js → hcl-qSvp9jTg.js} +0 -0
- /package/dist-bloby/assets/{hjson-_4-w-pHU.js → hjson-BNeV6JDA.js} +0 -0
- /package/dist-bloby/assets/{hlsl-DpuYn7pp.js → hlsl-CFf5czm3.js} +0 -0
- /package/dist-bloby/assets/{horizon-C5RtD1fY.js → horizon-C4a2pCDo.js} +0 -0
- /package/dist-bloby/assets/{horizon-bright-pEOice34.js → horizon-bright-Bgpx-0aF.js} +0 -0
- /package/dist-bloby/assets/{houston-A0zg9vNP.js → houston-BZHNDhe5.js} +0 -0
- /package/dist-bloby/assets/{hy-t9zDXBje.js → hy-hI-CUgFt.js} +0 -0
- /package/dist-bloby/assets/{imba-Bxu-TDfw.js → imba-Dr5pZl3x.js} +0 -0
- /package/dist-bloby/assets/{ini-D-v34c8N.js → ini-KxzJ-qxg.js} +0 -0
- /package/dist-bloby/assets/{json5-D0XL1D5m.js → json5-SRM7tKmT.js} +0 -0
- /package/dist-bloby/assets/{jsonc-BBgf3TX3.js → jsonc-Cix1XnqC.js} +0 -0
- /package/dist-bloby/assets/{jsonl-KrKLbtB7.js → jsonl-BzKwo-fD.js} +0 -0
- /package/dist-bloby/assets/{jsonnet-B2ZwWMOt.js → jsonnet-DaiLv8or.js} +0 -0
- /package/dist-bloby/assets/{jssm-ByRpI9-B.js → jssm-B1pV58QJ.js} +0 -0
- /package/dist-bloby/assets/{kanagawa-dragon-CtPmcCMp.js → kanagawa-dragon-BihvT_N-.js} +0 -0
- /package/dist-bloby/assets/{kanagawa-lotus-DpOXEGCa.js → kanagawa-lotus-DQN_bzSt.js} +0 -0
- /package/dist-bloby/assets/{kanagawa-wave-CLVCyc-n.js → kanagawa-wave-Bvz_F3hD.js} +0 -0
- /package/dist-bloby/assets/{kdl-6FPPEH4H.js → kdl-DupMG4Bk.js} +0 -0
- /package/dist-bloby/assets/{kotlin-D4L3Nd2D.js → kotlin-rOGI_fXV.js} +0 -0
- /package/dist-bloby/assets/{kusto-D-mmc07O.js → kusto-CHXnQR8L.js} +0 -0
- /package/dist-bloby/assets/{laserwave-7fEj4XGb.js → laserwave-CPMyzJF3.js} +0 -0
- /package/dist-bloby/assets/{lean-BMVMuP2E.js → lean-B76KugVy.js} +0 -0
- /package/dist-bloby/assets/{less-C95PyOu0.js → less-DwUMKQAG.js} +0 -0
- /package/dist-bloby/assets/{light-plus-DHI2dh3p.js → light-plus-C6sdUQiS.js} +0 -0
- /package/dist-bloby/assets/{llvm-Dy3qORTl.js → llvm-DumY6MCH.js} +0 -0
- /package/dist-bloby/assets/{log-BQop7fzg.js → log-DdP6k-FU.js} +0 -0
- /package/dist-bloby/assets/{logo-DKtnYmrp.js → logo-Cx0gX691.js} +0 -0
- /package/dist-bloby/assets/{luau-Dha4KG0q.js → luau-CI4wJBxI.js} +0 -0
- /package/dist-bloby/assets/{make-DfmS6buu.js → make-BlyBJiAs.js} +0 -0
- /package/dist-bloby/assets/{markdown-BaI9LyM4.js → markdown-BFgBvytj.js} +0 -0
- /package/dist-bloby/assets/{material-theme-Dm6ETY8i.js → material-theme-CyGvAAeY.js} +0 -0
- /package/dist-bloby/assets/{material-theme-darker-BeyjmM5Z.js → material-theme-darker-DJAOSarR.js} +0 -0
- /package/dist-bloby/assets/{material-theme-lighter-CCOYYzKL.js → material-theme-lighter-Cb7t96j2.js} +0 -0
- /package/dist-bloby/assets/{material-theme-ocean-CUtPiiX3.js → material-theme-ocean-EZZ55_HD.js} +0 -0
- /package/dist-bloby/assets/{material-theme-palenight-2L4zMwIM.js → material-theme-palenight-DtmMSfya.js} +0 -0
- /package/dist-bloby/assets/{matlab-BT79Cq_j.js → matlab-BFLobVcp.js} +0 -0
- /package/dist-bloby/assets/{mdx-CxGBwLNt.js → mdx-Baux4qlv.js} +0 -0
- /package/dist-bloby/assets/{mermaid-DLf3axBN.js → mermaid-DHr7T0Rt.js} +0 -0
- /package/dist-bloby/assets/{min-dark-B8TUPGHg.js → min-dark-C9N1U4-e.js} +0 -0
- /package/dist-bloby/assets/{min-light-BDOoBxcA.js → min-light-Ce9oxBvH.js} +0 -0
- /package/dist-bloby/assets/{mipsasm-DXuU_0cI.js → mipsasm-Cgb1v7yV.js} +0 -0
- /package/dist-bloby/assets/{mojo-1Omp2pIo.js → mojo-BnTBKscO.js} +0 -0
- /package/dist-bloby/assets/{monokai-E_VBmXGZ.js → monokai-BGD_YBH-.js} +0 -0
- /package/dist-bloby/assets/{moonbit-DZzq699o.js → moonbit-HXw0ZM4h.js} +0 -0
- /package/dist-bloby/assets/{move-DxDAOJVd.js → move-DG2efXqI.js} +0 -0
- /package/dist-bloby/assets/{narrat-CxDcPPb9.js → narrat-BSasSB5t.js} +0 -0
- /package/dist-bloby/assets/{nextflow-groovy-wvmJO4hi.js → nextflow-groovy-DXLl8k8E.js} +0 -0
- /package/dist-bloby/assets/{night-owl-DefhalNX.js → night-owl-DxqNTXDa.js} +0 -0
- /package/dist-bloby/assets/{night-owl-light-byb3AbEn.js → night-owl-light-MPn8GCyh.js} +0 -0
- /package/dist-bloby/assets/{nix-DsFTDHWT.js → nix-BpnttlWr.js} +0 -0
- /package/dist-bloby/assets/{nord-D5rQzHT-.js → nord-Mt6M_qHE.js} +0 -0
- /package/dist-bloby/assets/{nushell-BQ_rO0AM.js → nushell-CS7Mvg-G.js} +0 -0
- /package/dist-bloby/assets/{objective-c-BMq6JT_m.js → objective-c-U4EuJXJs.js} +0 -0
- /package/dist-bloby/assets/{objective-cpp-DRwojuGv.js → objective-cpp-CE_PrXRW.js} +0 -0
- /package/dist-bloby/assets/{ocaml-e4_gKO6E.js → ocaml-ZsxDKzyv.js} +0 -0
- /package/dist-bloby/assets/{odin-mdTPwYOg.js → odin-CDoDiNYU.js} +0 -0
- /package/dist-bloby/assets/{one-dark-pro-DxXww9jg.js → one-dark-pro-B9P_I1yh.js} +0 -0
- /package/dist-bloby/assets/{one-light-D9c03w7t.js → one-light-Cv3j6GXq.js} +0 -0
- /package/dist-bloby/assets/{openscad-D2aTdNfr.js → openscad-CfJwW9dY.js} +0 -0
- /package/dist-bloby/assets/{pascal-D4n_G8vj.js → pascal-CjE0UTC7.js} +0 -0
- /package/dist-bloby/assets/{pkl-DcjhAp0L.js → pkl-BN6EkHr9.js} +0 -0
- /package/dist-bloby/assets/{plastic-uOsw7z1x.js → plastic-BCnZnfMk.js} +0 -0
- /package/dist-bloby/assets/{plsql-BSy3Ag0J.js → plsql-1LW-CqWM.js} +0 -0
- /package/dist-bloby/assets/{po-Be96RYkA.js → po-Cf5hRC9x.js} +0 -0
- /package/dist-bloby/assets/{poimandres-CyO4HORD.js → poimandres-B_zC30Vt.js} +0 -0
- /package/dist-bloby/assets/{polar-BmhMKWum.js → polar-S6fWkEw8.js} +0 -0
- /package/dist-bloby/assets/{postcss-BTQso3H9.js → postcss-cZXfRCsF.js} +0 -0
- /package/dist-bloby/assets/{powerquery-DVyQv3M2.js → powerquery-CoRQQdNP.js} +0 -0
- /package/dist-bloby/assets/{powershell-BmtCGJVD.js → powershell-B2VxwRch.js} +0 -0
- /package/dist-bloby/assets/{prisma-CCFA9rEj.js → prisma-sLrt38jj.js} +0 -0
- /package/dist-bloby/assets/{prolog-DWGEEo78.js → prolog-CL99toUJ.js} +0 -0
- /package/dist-bloby/assets/{proto-C3eop1kM.js → proto-CtiBQJNn.js} +0 -0
- /package/dist-bloby/assets/{puppet-C0_7Nv5A.js → puppet-BlbpxWq2.js} +0 -0
- /package/dist-bloby/assets/{purescript-Bv-B8yRw.js → purescript-DPcVkoDV.js} +0 -0
- /package/dist-bloby/assets/{python-CKg5r0C3.js → python-BLpCXkJ6.js} +0 -0
- /package/dist-bloby/assets/{qmldir-Cqfb4Lox.js → qmldir-BcwbwUc8.js} +0 -0
- /package/dist-bloby/assets/{qss-Csho9BH8.js → qss-erDfnnzG.js} +0 -0
- /package/dist-bloby/assets/{racket-D8-uWeQH.js → racket-Dch6VQku.js} +0 -0
- /package/dist-bloby/assets/{raku-Cj4JSa8p.js → raku-Db8mfsiE.js} +0 -0
- /package/dist-bloby/assets/{red-z4H4llUY.js → red-DWyyM82l.js} +0 -0
- /package/dist-bloby/assets/{reg-DXGFiJSl.js → reg-3F9yjO5J.js} +0 -0
- /package/dist-bloby/assets/{rel-CunnVTBK.js → rel-CQq8nxxL.js} +0 -0
- /package/dist-bloby/assets/{riscv-C8BcOCkS.js → riscv-CsUwotvK.js} +0 -0
- /package/dist-bloby/assets/{ron-DiDyR9oa.js → ron-BwlS4rWu.js} +0 -0
- /package/dist-bloby/assets/{rose-pine-BADquuIH.js → rose-pine-DEj8gOox.js} +0 -0
- /package/dist-bloby/assets/{rose-pine-dawn-BLcEeBoh.js → rose-pine-dawn-DjarqQ2I.js} +0 -0
- /package/dist-bloby/assets/{rose-pine-moon-BK_tLY1Y.js → rose-pine-moon-D7ffkR_D.js} +0 -0
- /package/dist-bloby/assets/{rosmsg-CHmL1Uyj.js → rosmsg-BmwwVMq5.js} +0 -0
- /package/dist-bloby/assets/{rust-DjJFInu3.js → rust-DsIgDjpj.js} +0 -0
- /package/dist-bloby/assets/{sass-D3xZ5o-v.js → sass-CkIFK_bT.js} +0 -0
- /package/dist-bloby/assets/{scala-B0IRml5w.js → scala-C0TSxhxD.js} +0 -0
- /package/dist-bloby/assets/{scheme-BhwcV3Av.js → scheme-e-5nJ58U.js} +0 -0
- /package/dist-bloby/assets/{sdbl-BmWYR-pI.js → sdbl-DOe8Nral.js} +0 -0
- /package/dist-bloby/assets/{slack-dark-DOnVms5P.js → slack-dark-CClHvLju.js} +0 -0
- /package/dist-bloby/assets/{slack-ochin-DcRTft4q.js → slack-ochin-DwCpSVBI.js} +0 -0
- /package/dist-bloby/assets/{smalltalk-DVQuUMII.js → smalltalk-fjkC4HKG.js} +0 -0
- /package/dist-bloby/assets/{snazzy-light-x9CLJ1W9.js → snazzy-light-2nD216w0.js} +0 -0
- /package/dist-bloby/assets/{solarized-dark-BB1sh-pe.js → solarized-dark-BkxMSETv.js} +0 -0
- /package/dist-bloby/assets/{solarized-light-9-RPS998.js → solarized-light-BScqQ1C4.js} +0 -0
- /package/dist-bloby/assets/{solidity-gQ4WXILB.js → solidity-DbOxJfAY.js} +0 -0
- /package/dist-bloby/assets/{splunk-OB48_RcD.js → splunk-BW0l10cw.js} +0 -0
- /package/dist-bloby/assets/{ssh-config-DA9YMRGV.js → ssh-config-XN7RWvZy.js} +0 -0
- /package/dist-bloby/assets/{stylus-sKwvsUaC.js → stylus-D69is74S.js} +0 -0
- /package/dist-bloby/assets/{swift-C72NbAtg.js → swift-CqNHAbQB.js} +0 -0
- /package/dist-bloby/assets/{synthwave-84-eJ9uRN_S.js → synthwave-84-Ct3Np89a.js} +0 -0
- /package/dist-bloby/assets/{system-verilog-CnWMF7Nq.js → system-verilog-CHbvBf8h.js} +0 -0
- /package/dist-bloby/assets/{systemd-DMzItW5N.js → systemd-BBC3Z_R4.js} +0 -0
- /package/dist-bloby/assets/{talonscript-DopQCWDL.js → talonscript-DhYQB2ic.js} +0 -0
- /package/dist-bloby/assets/{tasl-C28SYKbq.js → tasl-CNtai3BH.js} +0 -0
- /package/dist-bloby/assets/{tcl-DHq7zmoF.js → tcl-DFzyQSXW.js} +0 -0
- /package/dist-bloby/assets/{terraform-CogS1YKX.js → terraform-BijD6Khb.js} +0 -0
- /package/dist-bloby/assets/{tokyo-night-B9N7LyrF.js → tokyo-night-Dd5BGAxh.js} +0 -0
- /package/dist-bloby/assets/{toml-BH_iPsgK.js → toml-DZofdujH.js} +0 -0
- /package/dist-bloby/assets/{tsv-BIkdBZX1.js → tsv-DOp6g7sz.js} +0 -0
- /package/dist-bloby/assets/{turtle-CqNXyJWZ.js → turtle-BKcRDROw.js} +0 -0
- /package/dist-bloby/assets/{typespec-CQ9LYD_e.js → typespec-Mmt3-2Cw.js} +0 -0
- /package/dist-bloby/assets/{typst-T-Fsk-Sv.js → typst-CndOdNo_.js} +0 -0
- /package/dist-bloby/assets/{v-BhMEOw9x.js → v-DjlZIA0C.js} +0 -0
- /package/dist-bloby/assets/{vala-DzajMnwt.js → vala-C5Nm5NXo.js} +0 -0
- /package/dist-bloby/assets/{vb-7Xr8dEYW.js → vb-zZeWbE2_.js} +0 -0
- /package/dist-bloby/assets/{verilog-AvXtwZir.js → verilog-CyZIVfoz.js} +0 -0
- /package/dist-bloby/assets/{vesper-CtgQQ2sf.js → vesper-B0BMGbco.js} +0 -0
- /package/dist-bloby/assets/{vhdl-BHu0zg1P.js → vhdl-DH1mJdjZ.js} +0 -0
- /package/dist-bloby/assets/{viml-Di0QpLfC.js → viml-e-oP1x-l.js} +0 -0
- /package/dist-bloby/assets/{vitesse-black-jXdfyqgD.js → vitesse-black-BRAUsA4Q.js} +0 -0
- /package/dist-bloby/assets/{vitesse-dark-B88PxG1r.js → vitesse-dark-Dyg71HnT.js} +0 -0
- /package/dist-bloby/assets/{vitesse-light-BXxZh2iV.js → vitesse-light-BJKZKqvd.js} +0 -0
- /package/dist-bloby/assets/{vyper-C3R5yXgx.js → vyper-BRPzCrki.js} +0 -0
- /package/dist-bloby/assets/{wasm-Chsuwt1A.js → wasm-DYMpDie-.js} +0 -0
- /package/dist-bloby/assets/{wasm-CEUrWlVz.js → wasm-Drz0Uqci.js} +0 -0
- /package/dist-bloby/assets/{wenyan-BonVcr2i.js → wenyan-BiJ0NePu.js} +0 -0
- /package/dist-bloby/assets/{wgsl-D59WYmNq.js → wgsl-CNe_V6SG.js} +0 -0
- /package/dist-bloby/assets/{wikitext-ariTI2Wk.js → wikitext-DZrjZKWn.js} +0 -0
- /package/dist-bloby/assets/{wit-EA4fa3Dt.js → wit-BUTESHa8.js} +0 -0
- /package/dist-bloby/assets/{wolfram-DDp7LhyU.js → wolfram-COEZldPx.js} +0 -0
- /package/dist-bloby/assets/{zenscript-4WaROUyc.js → zenscript-DThCxjUC.js} +0 -0
- /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.
|
|
61
|
-
{ id: 'gpt-5.
|
|
62
|
-
{ id: 'gpt-5.
|
|
63
|
-
{ id: 'gpt-5.
|
|
64
|
-
{ id: 'gpt-5.
|
|
65
|
-
{ id: 'gpt-5.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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
|
|
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
|
-
|
|
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'
|
|
533
|
-
fetch('/api/auth/codex/cancel', { method: 'POST' });
|
|
534
|
-
|
|
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
|
-
|
|
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
|
|
647
|
-
|
|
648
|
-
|
|
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
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
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
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
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
|
-
{
|
|
2106
|
-
<
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
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
|
)}
|