auto-coder-web 0.1.59__tar.gz → 0.1.61__tar.gz
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.
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/PKG-INFO +2 -2
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/proxy.py +2 -1
- auto_coder_web-0.1.61/src/auto_coder_web/routers/editable_preview_router.py +202 -0
- auto_coder_web-0.1.61/src/auto_coder_web/routers/mcp_router.py +188 -0
- auto_coder_web-0.1.61/src/auto_coder_web/version.py +1 -0
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/cssMode-l2jjsqtW.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/cssMode-DzQL_FdL.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/freemarker2-S4tCPD6N.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/freemarker2-B6aemwaC.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/handlebars-Wil-azPx.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/handlebars-C2cM4xS8.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/html-BHkmBm1e.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/html-Da2X74rm.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/htmlMode-BafxlJGB.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/htmlMode-Y3eBAl3y.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/index-Dwgw7mFY.css → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/index-CRXh98Y9.css +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/index-KrCRB6ZK.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/index-kyBHOjJU.js +394 -385
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/javascript-BN1li3Zy.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/javascript-zkPPW3gg.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/jsonMode-j073Sr5k.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/jsonMode-Ce8jLIxT.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/liquid-DnS5RM1s.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/liquid-CHrk1uPD.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/mdx-sr8FaC_m.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/mdx-B7AzIQ1K.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/python-Cz-JMHEr.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/python-D340AvYz.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/razor-Bit5V0We.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/razor-DfFnL0En.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/tsMode-72li3_GZ.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/tsMode-CwjVYPI2.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/typescript-CzReOdw4.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/typescript-JxFW6htN.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/xml-CDVdSTzU.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/xml-CY673mn0.js +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/web/assets/yaml-BCzkXue7.js → auto_coder_web-0.1.61/src/auto_coder_web/web/assets/yaml-D2wmMay7.js +1 -1
- auto_coder_web-0.1.61/src/auto_coder_web/web/bridge.js +189 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/index.html +2 -2
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/PKG-INFO +2 -2
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/SOURCES.txt +20 -17
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/requires.txt +1 -1
- auto_coder_web-0.1.59/src/auto_coder_web/version.py +0 -1
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/README.md +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/setup.cfg +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/setup.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/__init__.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/auto_coder_runner_wrapper.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/__init__.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/auto_coder_conf_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/chat_list_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/compiler_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/completions_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/file_group_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/file_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/common_router/model_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/expert_routers/__init__.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/expert_routers/history_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/file_group.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/file_manager.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/init_project.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/json_file_storage.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/lang.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/__init__.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/auto_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/chat_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/coding_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/commit_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/config_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/index_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/rag_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/settings_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/todo_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/routers/upload_router.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/terminal.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/types.py +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/abap-BrgZPUOV.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/apex-DyP6w7ZV.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/azcli-BaLxmfj-.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/bat-CFOPXBzS.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/bicep-BfEKNvv3.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/cameligo-BFG1Mk7z.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/clojure-DTECt2xU.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/codicon-DCmgc-ay.ttf +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/coffee-CDGzqUPQ.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/cpp-CLLBncYj.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/csharp-dUCx_-0o.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/csp-5Rap-vPy.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/css-D3h14YRZ.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/cypher-DrQuvNYM.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/dart-CFKIUWau.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/dockerfile-Zznr-cwX.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/ecl-Ce3n6wWz.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/elixir-deUWdS0T.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/flow9-i9-g7ZhI.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/fsharp-CzKuDChf.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/go-Cphgjts3.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/graphql-Cg7bfA9N.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/hcl-0cvrggvQ.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/ini-Drc7WvVn.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/java-B_fMsGYe.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/julia-Bqgm2twL.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/kotlin-BSkB5QuD.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/less-BsTHnhdd.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/lexon-YWi4-JPR.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/lua-nf6ki56Z.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/m3-Cpb6xl2v.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/markdown-DSZPf7rp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/mips-B_c3zf-v.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/msdax-rUNN04Wq.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/mysql-DDwshQtU.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/objective-c-B5zXfXm9.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/pascal-CXOwvkN_.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/pascaligo-Bc-ZgV77.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/perl-CwNk8-XU.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/pgsql-tGk8EFnU.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/php-CpIb_Oan.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/pla-B03wrqEc.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/postiats-BKlk5iyT.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/powerquery-Bhzvs7bI.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/powershell-Dd3NCNK9.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/protobuf-COyEY5Pt.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/pug-BaJupSGV.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/qsharp-DXyYeYxl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/r-CdQndTaG.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/redis-CVwtpugi.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/redshift-25W9uPmb.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/restructuredtext-DfzH4Xui.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/ruby-Cp1zYvxS.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/rust-D5C2fndG.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/sb-CDntyWJ8.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/scala-BoFRg7Ot.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/scheme-Bio4gycK.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/scss-4Ik7cdeQ.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/shell-CX-rkNHf.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/solidity-Tw7wswEv.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/sophia-C5WLch3f.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/sparql-DHaeiCBh.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/sql-CCSDG5nI.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/st-pnP8ivHi.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/swift-DwJ7jVG9.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/systemverilog-B9Xyijhd.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/tcl-DnHyzjbg.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/twig-CPajHgWi.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/typespec-D-MeaMDU.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/vb-DgyLZaXg.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/assets/wgsl-BIv9DU6q.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/favicon.ico +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/logo192.png +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/logo512.png +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/manifest.json +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/base/worker/workerMain.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/abap/abap.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/apex/apex.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/azcli/azcli.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bat/bat.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bicep/bicep.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/clojure/clojure.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/coffee/coffee.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cpp/cpp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csharp/csharp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csp/csp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/css/css.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cypher/cypher.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dart/dart.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ecl/ecl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/elixir/elixir.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/flow9/flow9.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/go/go.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/graphql/graphql.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/hcl/hcl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/html/html.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ini/ini.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/java/java.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/javascript/javascript.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/julia/julia.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/less/less.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lexon/lexon.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/liquid/liquid.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lua/lua.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/m3/m3.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/markdown/markdown.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mdx/mdx.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mips/mips.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/msdax/msdax.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mysql/mysql.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascal/pascal.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/perl/perl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/php/php.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pla/pla.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/postiats/postiats.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powershell/powershell.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pug/pug.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/python/python.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/r/r.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/razor/razor.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redis/redis.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redshift/redshift.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ruby/ruby.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/rust/rust.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sb/sb.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scala/scala.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scheme/scheme.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scss/scss.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/shell/shell.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/solidity/solidity.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sophia/sophia.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sparql/sparql.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sql/sql.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/st/st.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/swift/swift.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/tcl/tcl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/twig/twig.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typescript/typescript.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typespec/typespec.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/vb/vb.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/xml/xml.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/yaml/yaml.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.css +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssMode.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssWorker.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlMode.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlWorker.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/loader.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.de.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.es.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.fr.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.it.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ja.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ko.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ru.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-cn.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-tw.js +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web/web/robots.txt +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/dependency_links.txt +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/entry_points.txt +0 -0
- {auto_coder_web-0.1.59 → auto_coder_web-0.1.61}/src/auto_coder_web.egg-info/top_level.txt +0 -0
@@ -1,13 +1,13 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: auto_coder_web
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.61
|
4
4
|
Summary: auto-coder.web: A Python Project
|
5
5
|
Author: allwefantasy
|
6
6
|
Classifier: Programming Language :: Python :: 3.9
|
7
7
|
Classifier: Programming Language :: Python :: 3.10
|
8
8
|
Classifier: Programming Language :: Python :: 3.11
|
9
9
|
Description-Content-Type: text/markdown
|
10
|
-
Requires-Dist: auto-coder>=0.1.
|
10
|
+
Requires-Dist: auto-coder>=0.1.333
|
11
11
|
Requires-Dist: aiofiles
|
12
12
|
Requires-Dist: psutil
|
13
13
|
Requires-Dist: sse-starlette
|
@@ -19,7 +19,7 @@ import sys
|
|
19
19
|
from auto_coder_web.terminal import terminal_manager
|
20
20
|
from autocoder.common import AutoCoderArgs
|
21
21
|
from auto_coder_web.auto_coder_runner_wrapper import AutoCoderRunnerWrapper
|
22
|
-
from auto_coder_web.routers import todo_router, settings_router, auto_router, commit_router, chat_router, coding_router, index_router, config_router, upload_router, rag_router
|
22
|
+
from auto_coder_web.routers import todo_router, settings_router, auto_router, commit_router, chat_router, coding_router, index_router, config_router, upload_router, rag_router, editable_preview_router
|
23
23
|
from auto_coder_web.expert_routers import history_router
|
24
24
|
from auto_coder_web.common_router import completions_router, file_router, auto_coder_conf_router, chat_list_router, file_group_router, model_router, compiler_router
|
25
25
|
from rich.console import Console
|
@@ -100,6 +100,7 @@ class ProxyServer:
|
|
100
100
|
self.app.include_router(config_router.router)
|
101
101
|
self.app.include_router(upload_router.router)
|
102
102
|
self.app.include_router(rag_router.router)
|
103
|
+
self.app.include_router(editable_preview_router.router)
|
103
104
|
# self.app.include_router(rag_router.router)
|
104
105
|
|
105
106
|
@self.app.on_event("shutdown")
|
@@ -0,0 +1,202 @@
|
|
1
|
+
import logging
|
2
|
+
from pydantic import BaseModel
|
3
|
+
import requests
|
4
|
+
from fastapi import APIRouter, HTTPException, Request, Query, Body
|
5
|
+
from fastapi.responses import HTMLResponse
|
6
|
+
from bs4 import BeautifulSoup
|
7
|
+
from urllib.parse import urljoin, urlparse
|
8
|
+
import aiofiles
|
9
|
+
from pathlib import Path
|
10
|
+
import json
|
11
|
+
from datetime import datetime
|
12
|
+
import uuid
|
13
|
+
from loguru import logger as global_logger
|
14
|
+
|
15
|
+
logger = global_logger.bind(name="editable_preview")
|
16
|
+
router = APIRouter()
|
17
|
+
|
18
|
+
# --- Configuration ---
|
19
|
+
BRIDGE_SCRIPT_PATH = "/bridge.js" # Path where the frontend serves bridge.js
|
20
|
+
SAVED_PREVIEWS_DIR = Path(".auto-coder/auto-coder.web/editable-previews")
|
21
|
+
SAVED_PREVIEWS_DIR.mkdir(parents=True, exist_ok=True)
|
22
|
+
# --- End Configuration ---
|
23
|
+
|
24
|
+
|
25
|
+
def resolve_url(base_url: str, relative_url: str) -> str:
|
26
|
+
"""Resolves a relative URL against a base URL."""
|
27
|
+
try:
|
28
|
+
return urljoin(base_url, relative_url)
|
29
|
+
except ValueError:
|
30
|
+
# Handle cases where relative_url might be invalid
|
31
|
+
return relative_url
|
32
|
+
|
33
|
+
def rewrite_html_resources(soup: BeautifulSoup, base_url: str, proxy_base: str):
|
34
|
+
"""Rewrites relative URLs in common HTML tags to absolute URLs or proxy URLs."""
|
35
|
+
tags_attributes = {
|
36
|
+
'a': 'href',
|
37
|
+
'link': 'href',
|
38
|
+
'script': 'src',
|
39
|
+
'img': 'src',
|
40
|
+
'iframe': 'src',
|
41
|
+
'form': 'action',
|
42
|
+
# Add other tags/attributes as needed
|
43
|
+
}
|
44
|
+
|
45
|
+
for tag_name, attr_name in tags_attributes.items():
|
46
|
+
for tag in soup.find_all(tag_name):
|
47
|
+
attr_value = tag.get(attr_name)
|
48
|
+
if attr_value:
|
49
|
+
# Resolve relative URLs relative to the original page's base URL
|
50
|
+
absolute_url = resolve_url(base_url, attr_value)
|
51
|
+
|
52
|
+
# Optionally, rewrite to go through proxy (more complex, might break things)
|
53
|
+
# For simplicity now, just make them absolute to original domain
|
54
|
+
# proxy_url = f"{proxy_base}?url={absolute_url}" # Example proxy rewrite
|
55
|
+
# tag[attr_name] = proxy_url
|
56
|
+
tag[attr_name] = absolute_url # Keep original absolute for now
|
57
|
+
|
58
|
+
# Special handling for inline styles with url()
|
59
|
+
for tag in soup.find_all(style=True):
|
60
|
+
# Basic url() rewriting - might need a more robust CSS parser for complex cases
|
61
|
+
style_content = tag['style']
|
62
|
+
# This regex is basic, might need refinement
|
63
|
+
import re
|
64
|
+
def replace_url(match):
|
65
|
+
url = match.group(1).strip("'\"")
|
66
|
+
absolute_url = resolve_url(base_url, url)
|
67
|
+
return f"url('{absolute_url}')"
|
68
|
+
|
69
|
+
tag['style'] = re.sub(r"url\((.*?)\)", replace_url, style_content)
|
70
|
+
|
71
|
+
# Consider rewriting srcset for images as well if needed
|
72
|
+
|
73
|
+
@router.get("/api/editable-preview/proxy", response_class=HTMLResponse)
|
74
|
+
async def proxy_external_url(request: Request, url: str = Query(...)):
|
75
|
+
"""
|
76
|
+
Fetches an external URL, injects a bridge script, and returns the HTML.
|
77
|
+
Handles basic resource URL rewriting.
|
78
|
+
"""
|
79
|
+
if not url or not url.startswith(('http://', 'https://')):
|
80
|
+
raise HTTPException(status_code=400, detail="Invalid or missing URL parameter")
|
81
|
+
|
82
|
+
try:
|
83
|
+
headers = {
|
84
|
+
# Mimic a browser request
|
85
|
+
'User-Agent': request.headers.get('user-agent', 'Mozilla/5.0'),
|
86
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
|
87
|
+
'Accept-Language': 'en-US,en;q=0.5',
|
88
|
+
'Referer': urlparse(url).scheme + "://" + urlparse(url).netloc # Set referer to target domain
|
89
|
+
}
|
90
|
+
response = requests.get(url, headers=headers, timeout=15, allow_redirects=True)
|
91
|
+
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
|
92
|
+
|
93
|
+
# Check content type
|
94
|
+
content_type = response.headers.get('content-type', '').lower()
|
95
|
+
if 'text/html' not in content_type:
|
96
|
+
logger.warning(f"Proxied URL {url} returned non-HTML content-type: {content_type}")
|
97
|
+
# Return as is if not HTML, or raise error? Decide based on desired behavior.
|
98
|
+
# For now, let's try parsing anyway, but log a warning.
|
99
|
+
# raise HTTPException(status_code=400, detail=f"URL did not return HTML content. Content-Type: {content_type}")
|
100
|
+
|
101
|
+
# Parse HTML content
|
102
|
+
soup = BeautifulSoup(response.text, 'html.parser')
|
103
|
+
|
104
|
+
# --- Inject Bridge Script ---
|
105
|
+
bridge_script_tag = soup.new_tag("script")
|
106
|
+
bridge_script_tag["src"] = BRIDGE_SCRIPT_PATH
|
107
|
+
bridge_script_tag["defer"] = True # Load after HTML parsing but before DOMContentLoaded
|
108
|
+
|
109
|
+
# Try injecting into <head>, fallback to <body>
|
110
|
+
head = soup.find('head')
|
111
|
+
if head:
|
112
|
+
head.append(bridge_script_tag)
|
113
|
+
else:
|
114
|
+
body = soup.find('body')
|
115
|
+
if body:
|
116
|
+
body.append(bridge_script_tag)
|
117
|
+
else:
|
118
|
+
# If no head or body, append to the root (less ideal)
|
119
|
+
soup.append(bridge_script_tag)
|
120
|
+
# --- End Injection ---
|
121
|
+
|
122
|
+
# --- Rewrite Resource URLs ---
|
123
|
+
# Get the final URL after potential redirects
|
124
|
+
final_url = response.url
|
125
|
+
# Define the base for our proxy endpoint (needed if we decide to proxy resources)
|
126
|
+
proxy_base_url = str(request.base_url) + "api/editable-preview/proxy"
|
127
|
+
rewrite_html_resources(soup, final_url, proxy_base_url)
|
128
|
+
# --- End Rewriting ---
|
129
|
+
|
130
|
+
# Return modified HTML
|
131
|
+
modified_html = str(soup)
|
132
|
+
|
133
|
+
# Prepare response, try to remove X-Frame-Options
|
134
|
+
resp_headers = dict(response.headers)
|
135
|
+
# Remove security headers that prevent framing (use with caution)
|
136
|
+
resp_headers.pop('X-Frame-Options', None)
|
137
|
+
resp_headers.pop('Content-Security-Policy', None)
|
138
|
+
# Remove Content-Length header
|
139
|
+
resp_headers.pop('Content-Length', None)
|
140
|
+
# Ensure correct content type
|
141
|
+
resp_headers['Content-Type'] = 'text/html; charset=utf-8' # Force UTF-8
|
142
|
+
|
143
|
+
return HTMLResponse(content=modified_html, headers=resp_headers)
|
144
|
+
|
145
|
+
except requests.exceptions.Timeout:
|
146
|
+
raise HTTPException(status_code=504, detail=f"Timeout while fetching URL: {url}")
|
147
|
+
except requests.exceptions.RequestException as e:
|
148
|
+
logger.error(f"Error fetching URL {url}: {e}")
|
149
|
+
raise HTTPException(status_code=502, detail=f"Failed to fetch URL: {url}. Error: {str(e)}")
|
150
|
+
except Exception as e:
|
151
|
+
logger.error(f"Error processing proxy request for {url}: {e}", exc_info=True)
|
152
|
+
raise HTTPException(status_code=500, detail=f"Internal server error processing URL: {url}")
|
153
|
+
|
154
|
+
|
155
|
+
class SavePreviewRequest(BaseModel):
|
156
|
+
url: str
|
157
|
+
html_content: str
|
158
|
+
|
159
|
+
@router.post("/api/editable-preview/save")
|
160
|
+
async def save_edited_preview(payload: SavePreviewRequest = Body(...)):
|
161
|
+
"""Saves the edited HTML content for a given URL."""
|
162
|
+
try:
|
163
|
+
url = payload.url
|
164
|
+
html_content = payload.html_content
|
165
|
+
|
166
|
+
if not url or not html_content:
|
167
|
+
raise HTTPException(status_code=400, detail="Missing URL or HTML content")
|
168
|
+
|
169
|
+
# Generate a unique filename or use a hash of the URL
|
170
|
+
parsed_url = urlparse(url)
|
171
|
+
# Sanitize filename (basic example)
|
172
|
+
filename_base = f"{parsed_url.netloc}_{parsed_url.path}".replace('/', '_').replace('.', '_')
|
173
|
+
filename_base = "".join(c for c in filename_base if c.isalnum() or c in ('_', '-')).rstrip('_')[:100] # Limit length
|
174
|
+
|
175
|
+
save_id = str(uuid.uuid4())
|
176
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
177
|
+
filename = f"{filename_base}_{timestamp}_{save_id}.html"
|
178
|
+
filepath = SAVED_PREVIEWS_DIR / filename
|
179
|
+
|
180
|
+
metadata = {
|
181
|
+
"original_url": url,
|
182
|
+
"saved_at": datetime.now().isoformat(),
|
183
|
+
"save_id": save_id,
|
184
|
+
"filename": filename
|
185
|
+
}
|
186
|
+
meta_filepath = SAVED_PREVIEWS_DIR / f"{filename}.meta.json"
|
187
|
+
|
188
|
+
|
189
|
+
async with aiofiles.open(filepath, mode='w', encoding='utf-8') as f:
|
190
|
+
await f.write(html_content)
|
191
|
+
|
192
|
+
async with aiofiles.open(meta_filepath, mode='w', encoding='utf-8') as f:
|
193
|
+
await f.write(json.dumps(metadata, indent=2))
|
194
|
+
|
195
|
+
logger.info(f"Saved edited preview for URL '{url}' to '{filepath}'")
|
196
|
+
return {"status": "success", "save_id": save_id, "filename": filename}
|
197
|
+
|
198
|
+
except HTTPException:
|
199
|
+
raise # Re-raise HTTP exceptions
|
200
|
+
except Exception as e:
|
201
|
+
logger.error(f"Error saving edited preview for URL '{payload.url}': {e}", exc_info=True)
|
202
|
+
raise HTTPException(status_code=500, detail="Failed to save edited preview")
|
@@ -0,0 +1,188 @@
|
|
1
|
+
import asyncio
|
2
|
+
import json
|
3
|
+
import os
|
4
|
+
from fastapi import APIRouter, HTTPException, Request, Depends
|
5
|
+
from pydantic import BaseModel, Field
|
6
|
+
from typing import Dict, Any, Optional, List
|
7
|
+
from autocoder.common.mcp_server import (
|
8
|
+
get_mcp_server,
|
9
|
+
McpInstallRequest,
|
10
|
+
McpRemoveRequest,
|
11
|
+
McpListRequest,
|
12
|
+
McpListRunningRequest,
|
13
|
+
McpRefreshRequest,
|
14
|
+
McpServerInfoRequest,
|
15
|
+
McpResponse
|
16
|
+
)
|
17
|
+
from autocoder.common.printer import Printer # For messages
|
18
|
+
from autocoder.chat_auto_coder_lang import get_message_with_format # For formatted messages
|
19
|
+
from loguru import logger
|
20
|
+
from byzerllm.utils.langutil import asyncfy_with_semaphore
|
21
|
+
|
22
|
+
# Use asyncfy_with_semaphore to wrap the synchronous send_request method
|
23
|
+
async_send_request = asyncfy_with_semaphore(get_mcp_server().send_request, max_workers=5)
|
24
|
+
|
25
|
+
router = APIRouter()
|
26
|
+
printer = Printer() # Initialize printer for messages
|
27
|
+
|
28
|
+
# --- Pydantic Models for Requests ---
|
29
|
+
|
30
|
+
class McpAddRequest(BaseModel):
|
31
|
+
server_config: str = Field(..., description="Server configuration string (command-line style or JSON)")
|
32
|
+
|
33
|
+
class McpRemoveRequestModel(BaseModel):
|
34
|
+
server_name: str = Field(..., description="Name of the MCP server to remove")
|
35
|
+
|
36
|
+
class McpRefreshRequestModel(BaseModel):
|
37
|
+
server_name: Optional[str] = Field(None, description="Name of the MCP server to refresh (optional, refreshes all if None)")
|
38
|
+
|
39
|
+
class McpInfoRequestModel(BaseModel):
|
40
|
+
# Assuming model and product_mode might come from global config or request context later
|
41
|
+
# For now, let's make them optional or derive them if possible
|
42
|
+
model: Optional[str] = None
|
43
|
+
product_mode: Optional[str] = None # Example: "lite", "pro"
|
44
|
+
|
45
|
+
# --- Helper Function to Handle MCP Responses ---
|
46
|
+
|
47
|
+
async def handle_mcp_response(request: Any, success_key: str, error_key: str, **kwargs) -> Dict[str, Any]:
|
48
|
+
"""Handles sending request to MCP server and formatting the response."""
|
49
|
+
try:
|
50
|
+
response: McpResponse = await async_send_request(request)
|
51
|
+
if response.error:
|
52
|
+
logger.error(f"MCP Error ({error_key}): {response.error}")
|
53
|
+
# Use get_message_with_format if available, otherwise use the raw error
|
54
|
+
error_message = response.error
|
55
|
+
try:
|
56
|
+
# Attempt to format the error message if a key is provided
|
57
|
+
formatted_error = get_message_with_format(error_key, error=response.error)
|
58
|
+
if formatted_error: # Check if formatting was successful
|
59
|
+
error_message = formatted_error
|
60
|
+
except Exception: # Catch potential errors during formatting
|
61
|
+
pass # Stick with the original error message
|
62
|
+
raise HTTPException(status_code=400, detail=error_message)
|
63
|
+
else:
|
64
|
+
# Use get_message_with_format for success message if available
|
65
|
+
success_message = response.result
|
66
|
+
try:
|
67
|
+
formatted_success = get_message_with_format(success_key, result=response.result, **kwargs)
|
68
|
+
if formatted_success: # Check if formatting was successful
|
69
|
+
success_message = formatted_success
|
70
|
+
except Exception:
|
71
|
+
pass # Stick with the original result message
|
72
|
+
return {"status": "success", "message": success_message, "data": response.result} # Include raw data too
|
73
|
+
except HTTPException as http_exc:
|
74
|
+
raise http_exc # Re-raise HTTPException
|
75
|
+
except Exception as e:
|
76
|
+
logger.error(f"Unexpected error during MCP request ({error_key}): {str(e)}")
|
77
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
78
|
+
|
79
|
+
# --- API Endpoints ---
|
80
|
+
|
81
|
+
@router.post("/api/mcp/add")
|
82
|
+
async def add_mcp_server(request: McpAddRequest):
|
83
|
+
"""
|
84
|
+
Adds or updates an MCP server configuration.
|
85
|
+
Accepts command-line style args or a JSON string.
|
86
|
+
"""
|
87
|
+
mcp_request = McpInstallRequest(server_name_or_config=request.server_config)
|
88
|
+
return await handle_mcp_response(
|
89
|
+
mcp_request,
|
90
|
+
success_key="mcp_install_success",
|
91
|
+
error_key="mcp_install_error",
|
92
|
+
result=request.server_config # Pass original config for success message formatting
|
93
|
+
)
|
94
|
+
|
95
|
+
@router.post("/api/mcp/remove")
|
96
|
+
async def remove_mcp_server(request: McpRemoveRequestModel):
|
97
|
+
"""Removes an MCP server configuration by name."""
|
98
|
+
mcp_request = McpRemoveRequest(server_name=request.server_name)
|
99
|
+
return await handle_mcp_response(
|
100
|
+
mcp_request,
|
101
|
+
success_key="mcp_remove_success",
|
102
|
+
error_key="mcp_remove_error",
|
103
|
+
result=request.server_name # Pass server name for success message formatting
|
104
|
+
)
|
105
|
+
|
106
|
+
@router.get("/api/mcp/list")
|
107
|
+
async def list_mcp_servers():
|
108
|
+
"""Lists all available built-in and external MCP servers."""
|
109
|
+
mcp_request = McpListRequest()
|
110
|
+
# Specific handling for list as the result is the data itself
|
111
|
+
try:
|
112
|
+
response: McpResponse = await async_send_request(mcp_request)
|
113
|
+
if response.error:
|
114
|
+
logger.error(f"MCP Error (mcp_list_builtin_error): {response.error}")
|
115
|
+
error_message = get_message_with_format("mcp_list_builtin_error", error=response.error) or response.error
|
116
|
+
raise HTTPException(status_code=400, detail=error_message)
|
117
|
+
else:
|
118
|
+
# Split the result string into a list for better JSON representation
|
119
|
+
server_list = response.result.strip().split('\n') if response.result else []
|
120
|
+
return {"status": "success", "servers": server_list}
|
121
|
+
except HTTPException as http_exc:
|
122
|
+
raise http_exc
|
123
|
+
except Exception as e:
|
124
|
+
logger.error(f"Unexpected error during MCP list request: {str(e)}")
|
125
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
126
|
+
|
127
|
+
|
128
|
+
@router.get("/api/mcp/list_running")
|
129
|
+
async def list_running_mcp_servers():
|
130
|
+
"""Lists all currently running/connected MCP servers."""
|
131
|
+
mcp_request = McpListRunningRequest()
|
132
|
+
# Specific handling for list_running
|
133
|
+
try:
|
134
|
+
response: McpResponse = await async_send_request(mcp_request)
|
135
|
+
if response.error:
|
136
|
+
logger.error(f"MCP Error (mcp_list_running_error): {response.error}")
|
137
|
+
error_message = get_message_with_format("mcp_list_running_error", error=response.error) or response.error
|
138
|
+
raise HTTPException(status_code=400, detail=error_message)
|
139
|
+
else:
|
140
|
+
# Split the result string into a list
|
141
|
+
running_server_list = response.result.strip().split('\n') if response.result else []
|
142
|
+
# Clean up list (remove potential leading hyphens/spaces)
|
143
|
+
cleaned_list = [s.strip().lstrip('-').strip() for s in running_server_list if s.strip()]
|
144
|
+
return {"status": "success", "running_servers": cleaned_list}
|
145
|
+
except HTTPException as http_exc:
|
146
|
+
raise http_exc
|
147
|
+
except Exception as e:
|
148
|
+
logger.error(f"Unexpected error during MCP list_running request: {str(e)}")
|
149
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
150
|
+
|
151
|
+
@router.post("/api/mcp/refresh")
|
152
|
+
async def refresh_mcp_connections(request: McpRefreshRequestModel):
|
153
|
+
"""Refreshes connections to MCP servers (all or a specific one)."""
|
154
|
+
mcp_request = McpRefreshRequest(name=request.server_name)
|
155
|
+
return await handle_mcp_response(
|
156
|
+
mcp_request,
|
157
|
+
success_key="mcp_refresh_success",
|
158
|
+
error_key="mcp_refresh_error"
|
159
|
+
)
|
160
|
+
|
161
|
+
@router.get("/api/mcp/info")
|
162
|
+
async def get_mcp_server_info(model: Optional[str] = None, product_mode: Optional[str] = None):
|
163
|
+
"""Gets detailed information about connected MCP servers."""
|
164
|
+
# TODO: Determine how to get model/product_mode - from app state, global config, or request?
|
165
|
+
# Using optional query params for now.
|
166
|
+
mcp_request = McpServerInfoRequest(model=model, product_mode=product_mode)
|
167
|
+
# Specific handling for info
|
168
|
+
try:
|
169
|
+
response: McpResponse = await async_send_request(mcp_request)
|
170
|
+
if response.error:
|
171
|
+
logger.error(f"MCP Error (mcp_server_info_error): {response.error}")
|
172
|
+
error_message = get_message_with_format("mcp_server_info_error", error=response.error) or response.error
|
173
|
+
raise HTTPException(status_code=400, detail=error_message)
|
174
|
+
else:
|
175
|
+
# The result is likely a markdown string or complex structure. Return as is.
|
176
|
+
return {"status": "success", "info": response.result}
|
177
|
+
except HTTPException as http_exc:
|
178
|
+
raise http_exc
|
179
|
+
except Exception as e:
|
180
|
+
logger.error(f"Unexpected error during MCP info request: {str(e)}")
|
181
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
182
|
+
|
183
|
+
# Potentially add endpoints for direct tool calls or resource access if needed in the future
|
184
|
+
# @router.post("/api/mcp/call_tool")
|
185
|
+
# async def call_mcp_tool(...): ...
|
186
|
+
|
187
|
+
# @router.get("/api/mcp/read_resource")
|
188
|
+
# async def read_mcp_resource(...): ...
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.1.61"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as et}from"./index-
|
1
|
+
import{m as et}from"./index-kyBHOjJU.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as f}from"./index-
|
1
|
+
import{m as f}from"./index-kyBHOjJU.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as l}from"./index-
|
1
|
+
import{m as l}from"./index-kyBHOjJU.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as s}from"./index-
|
1
|
+
import{m as s}from"./index-kyBHOjJU.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{m as lt}from"./index-
|
1
|
+
import{m as lt}from"./index-kyBHOjJU.js";/*!-----------------------------------------------------------------------------
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
3
3
|
* Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1)
|
4
4
|
* Released under the MIT license
|