auto-coder-web 0.1.26__tar.gz → 0.1.27__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.26 → auto_coder_web-0.1.27}/PKG-INFO +1 -1
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/auto_coder_runner_wrapper.py +5 -1
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/chat_list_router.py +24 -14
- auto_coder_web-0.1.27/src/auto_coder_web/common_router/completions_router.py +166 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/file_group_router.py +21 -4
- auto_coder_web-0.1.27/src/auto_coder_web/lang.py +35 -0
- auto_coder_web-0.1.27/src/auto_coder_web/proxy.py +304 -0
- auto_coder_web-0.1.27/src/auto_coder_web/version.py +1 -0
- auto_coder_web-0.1.27/src/auto_coder_web/web/asset-manifest.json +15 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/index.html +1 -1
- auto_coder_web-0.1.27/src/auto_coder_web/web/static/css/main.8a602674.css +6 -0
- auto_coder_web-0.1.27/src/auto_coder_web/web/static/css/main.8a602674.css.map +1 -0
- auto_coder_web-0.1.26/src/auto_coder_web/web/static/js/main.a707a18c.js → auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js +3 -3
- auto_coder_web-0.1.26/src/auto_coder_web/web/static/js/main.a707a18c.js.map → auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js.map +1 -1
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/PKG-INFO +1 -1
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/SOURCES.txt +6 -5
- auto_coder_web-0.1.26/src/auto_coder_web/common_router/completions_router.py +0 -53
- auto_coder_web-0.1.26/src/auto_coder_web/proxy.py +0 -546
- auto_coder_web-0.1.26/src/auto_coder_web/version.py +0 -1
- auto_coder_web-0.1.26/src/auto_coder_web/web/asset-manifest.json +0 -15
- auto_coder_web-0.1.26/src/auto_coder_web/web/static/css/main.b9764291.css +0 -6
- auto_coder_web-0.1.26/src/auto_coder_web/web/static/css/main.b9764291.css.map +0 -1
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/README.md +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/setup.cfg +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/setup.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/__init__.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/auto_coder_runner.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/__init__.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/auto_coder_conf_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/file_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/file_group.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/file_manager.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/json_file_storage.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/__init__.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/auto_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/chat_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/coding_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/commit_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/config_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/settings_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/todo_router.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/terminal.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/types.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/favicon.ico +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/logo192.png +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/logo512.png +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/manifest.json +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/base/worker/workerMain.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/abap/abap.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/apex/apex.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/azcli/azcli.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bat/bat.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bicep/bicep.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/clojure/clojure.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/coffee/coffee.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cpp/cpp.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csharp/csharp.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csp/csp.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/css/css.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cypher/cypher.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dart/dart.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ecl/ecl.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/elixir/elixir.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/flow9/flow9.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/go/go.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/graphql/graphql.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/hcl/hcl.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/html/html.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ini/ini.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/java/java.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/javascript/javascript.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/julia/julia.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/less/less.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lexon/lexon.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/liquid/liquid.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lua/lua.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/m3/m3.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/markdown/markdown.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mdx/mdx.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mips/mips.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/msdax/msdax.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mysql/mysql.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascal/pascal.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/perl/perl.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/php/php.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pla/pla.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/postiats/postiats.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powershell/powershell.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pug/pug.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/python/python.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/r/r.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/razor/razor.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redis/redis.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redshift/redshift.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ruby/ruby.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/rust/rust.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sb/sb.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scala/scala.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scheme/scheme.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scss/scss.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/shell/shell.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/solidity/solidity.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sophia/sophia.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sparql/sparql.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sql/sql.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/st/st.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/swift/swift.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/tcl/tcl.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/twig/twig.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typescript/typescript.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typespec/typespec.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/vb/vb.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/xml/xml.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/yaml/yaml.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.css +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssMode.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssWorker.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlMode.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlWorker.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/loader.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.de.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.es.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.fr.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.it.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ja.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ko.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ru.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-cn.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-tw.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/robots.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/static/js/453.d855a71b.chunk.js +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/web/static/js/453.d855a71b.chunk.js.map +0 -0
- /auto_coder_web-0.1.26/src/auto_coder_web/web/static/js/main.a707a18c.js.LICENSE.txt → /auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js.LICENSE.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/dependency_links.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/entry_points.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/requires.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/top_level.txt +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/expert_routers/__init__.py +0 -0
- {auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/expert_routers/history_router.py +0 -0
{auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/auto_coder_runner_wrapper.py
RENAMED
@@ -45,7 +45,11 @@ class AutoCoderRunnerWrapper:
|
|
45
45
|
return auto_command(command,params)
|
46
46
|
|
47
47
|
def configure_wrapper(self,conf: str, skip_print=False ):
|
48
|
-
return configure(conf, skip_print)
|
48
|
+
return configure(conf, skip_print)
|
49
|
+
|
50
|
+
def get_conf_wrapper(self):
|
51
|
+
memory = get_memory()
|
52
|
+
return memory["conf"]
|
49
53
|
|
50
54
|
|
51
55
|
def coding_wapper(self,query):
|
{auto_coder_web-0.1.26 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/chat_list_router.py
RENAMED
@@ -1,31 +1,39 @@
|
|
1
1
|
import os
|
2
2
|
import json
|
3
|
-
from fastapi import APIRouter, HTTPException
|
3
|
+
from fastapi import APIRouter, HTTPException, Request, Depends
|
4
4
|
import aiofiles
|
5
5
|
from auto_coder_web.types import ChatList
|
6
6
|
|
7
|
+
|
8
|
+
async def get_project_path(request: Request) -> str:
|
9
|
+
"""
|
10
|
+
从FastAPI请求上下文中获取项目路径
|
11
|
+
"""
|
12
|
+
return request.app.state.project_path
|
13
|
+
|
7
14
|
router = APIRouter()
|
8
15
|
|
16
|
+
|
9
17
|
@router.post("/api/chat-lists/save")
|
10
|
-
async def save_chat_list(chat_list: ChatList):
|
18
|
+
async def save_chat_list(chat_list: ChatList, project_path: str = Depends(get_project_path)):
|
11
19
|
try:
|
12
|
-
chat_lists_dir = os.path.join(
|
13
|
-
|
20
|
+
chat_lists_dir = os.path.join(project_path,
|
21
|
+
".auto-coder", "auto-coder.web", "chat-lists")
|
14
22
|
os.makedirs(chat_lists_dir, exist_ok=True)
|
15
23
|
|
16
|
-
file_path = os.path.join(
|
17
|
-
chat_lists_dir, f"{chat_list.name}.json")
|
24
|
+
file_path = os.path.join(chat_lists_dir, f"{chat_list.name}.json")
|
18
25
|
async with aiofiles.open(file_path, 'w') as f:
|
19
|
-
await f.write(json.dumps({"messages": chat_list.messages}, indent=2))
|
26
|
+
await f.write(json.dumps({"messages": chat_list.messages}, indent=2, ensure_ascii=False))
|
20
27
|
return {"status": "success", "message": f"Chat list {chat_list.name} saved successfully"}
|
21
28
|
except Exception as e:
|
22
29
|
raise HTTPException(status_code=500, detail=str(e))
|
23
30
|
|
31
|
+
|
24
32
|
@router.get("/api/chat-lists")
|
25
|
-
async def get_chat_lists():
|
33
|
+
async def get_chat_lists(project_path: str = Depends(get_project_path)):
|
26
34
|
try:
|
27
35
|
chat_lists_dir = os.path.join(
|
28
|
-
".auto-coder", "auto-coder.web", "chat-lists")
|
36
|
+
project_path, ".auto-coder", "auto-coder.web", "chat-lists")
|
29
37
|
os.makedirs(chat_lists_dir, exist_ok=True)
|
30
38
|
|
31
39
|
# Get files with their modification times
|
@@ -45,11 +53,12 @@ async def get_chat_lists():
|
|
45
53
|
except Exception as e:
|
46
54
|
raise HTTPException(status_code=500, detail=str(e))
|
47
55
|
|
56
|
+
|
48
57
|
@router.get("/api/chat-lists/{name}")
|
49
|
-
async def get_chat_list(name: str):
|
58
|
+
async def get_chat_list(name: str, project_path: str = Depends(get_project_path)):
|
50
59
|
try:
|
51
60
|
file_path = os.path.join(
|
52
|
-
".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
|
61
|
+
project_path, ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
|
53
62
|
if not os.path.exists(file_path):
|
54
63
|
raise HTTPException(
|
55
64
|
status_code=404, detail=f"Chat list {name} not found")
|
@@ -60,11 +69,12 @@ async def get_chat_list(name: str):
|
|
60
69
|
except Exception as e:
|
61
70
|
raise HTTPException(status_code=500, detail=str(e))
|
62
71
|
|
72
|
+
|
63
73
|
@router.delete("/api/chat-lists/{name}")
|
64
|
-
async def delete_chat_list(name: str):
|
74
|
+
async def delete_chat_list(name: str, project_path: str = Depends(get_project_path)):
|
65
75
|
try:
|
66
76
|
file_path = os.path.join(
|
67
|
-
".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
|
77
|
+
project_path, ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
|
68
78
|
if not os.path.exists(file_path):
|
69
79
|
raise HTTPException(
|
70
80
|
status_code=404, detail=f"Chat list {name} not found")
|
@@ -72,4 +82,4 @@ async def delete_chat_list(name: str):
|
|
72
82
|
os.remove(file_path)
|
73
83
|
return {"status": "success", "message": f"Chat list {name} deleted successfully"}
|
74
84
|
except Exception as e:
|
75
|
-
raise HTTPException(status_code=500, detail=str(e))
|
85
|
+
raise HTTPException(status_code=500, detail=str(e))
|
@@ -0,0 +1,166 @@
|
|
1
|
+
import os
|
2
|
+
import glob
|
3
|
+
import json
|
4
|
+
from typing import List
|
5
|
+
from pydantic import BaseModel
|
6
|
+
from fastapi import APIRouter, Query, Request, Depends
|
7
|
+
from auto_coder_web.types import CompletionItem, CompletionResponse
|
8
|
+
from autocoder.index.symbols_utils import (
|
9
|
+
extract_symbols,
|
10
|
+
symbols_info_to_str,
|
11
|
+
SymbolsInfo,
|
12
|
+
SymbolType,
|
13
|
+
)
|
14
|
+
|
15
|
+
from autocoder.auto_coder_runner import get_memory
|
16
|
+
import json
|
17
|
+
import asyncio
|
18
|
+
|
19
|
+
|
20
|
+
router = APIRouter()
|
21
|
+
|
22
|
+
class SymbolItem(BaseModel):
|
23
|
+
symbol_name: str
|
24
|
+
symbol_type: SymbolType
|
25
|
+
file_name: str
|
26
|
+
|
27
|
+
async def get_auto_coder_runner(request: Request):
|
28
|
+
"""获取AutoCoderRunner实例作为依赖"""
|
29
|
+
return request.app.state.auto_coder_runner
|
30
|
+
|
31
|
+
|
32
|
+
async def get_project_path(request: Request):
|
33
|
+
"""获取项目路径作为依赖"""
|
34
|
+
return request.app.state.project_path
|
35
|
+
|
36
|
+
def find_files_in_project(patterns: List[str], project_path: str) -> List[str]:
|
37
|
+
memory = get_memory()
|
38
|
+
default_exclude_dirs = [".git", "node_modules", "dist", "build", "__pycache__",".venv"]
|
39
|
+
active_file_list = memory["current_files"]["files"]
|
40
|
+
|
41
|
+
project_root = project_path
|
42
|
+
matched_files = []
|
43
|
+
|
44
|
+
if len(patterns) == 1 and patterns[0] == "":
|
45
|
+
return active_file_list
|
46
|
+
|
47
|
+
for pattern in patterns:
|
48
|
+
for file_path in active_file_list:
|
49
|
+
if pattern in os.path.basename(file_path):
|
50
|
+
matched_files.append(file_path)
|
51
|
+
|
52
|
+
final_exclude_dirs = default_exclude_dirs + \
|
53
|
+
memory.get("exclude_dirs", [])
|
54
|
+
|
55
|
+
for pattern in patterns:
|
56
|
+
if "*" in pattern or "?" in pattern:
|
57
|
+
for file_path in glob.glob(pattern, recursive=True):
|
58
|
+
if os.path.isfile(file_path):
|
59
|
+
abs_path = os.path.abspath(file_path)
|
60
|
+
if not any(
|
61
|
+
exclude_dir in abs_path.split(os.sep)
|
62
|
+
for exclude_dir in final_exclude_dirs
|
63
|
+
):
|
64
|
+
matched_files.append(abs_path)
|
65
|
+
else:
|
66
|
+
is_added = False
|
67
|
+
for root, dirs, files in os.walk(project_root, followlinks=True):
|
68
|
+
dirs[:] = [d for d in dirs if d not in final_exclude_dirs]
|
69
|
+
if pattern in files:
|
70
|
+
matched_files.append(os.path.join(root, pattern))
|
71
|
+
is_added = True
|
72
|
+
else:
|
73
|
+
for file in files:
|
74
|
+
if pattern in os.path.join(root, file):
|
75
|
+
matched_files.append(os.path.join(root, file))
|
76
|
+
is_added = True
|
77
|
+
if not is_added:
|
78
|
+
matched_files.append(pattern)
|
79
|
+
|
80
|
+
return list(set(matched_files))
|
81
|
+
|
82
|
+
def get_symbol_list(project_path: str) -> List[SymbolItem]:
|
83
|
+
list_of_symbols = []
|
84
|
+
index_file = os.path.join(
|
85
|
+
project_path, ".auto-coder", "index.json")
|
86
|
+
|
87
|
+
if os.path.exists(index_file):
|
88
|
+
with open(index_file, "r") as file:
|
89
|
+
index_data = json.load(file)
|
90
|
+
else:
|
91
|
+
index_data = {}
|
92
|
+
|
93
|
+
for item in index_data.values():
|
94
|
+
symbols_str = item["symbols"]
|
95
|
+
module_name = item["module_name"]
|
96
|
+
info1 = extract_symbols(symbols_str)
|
97
|
+
for name in info1.classes:
|
98
|
+
list_of_symbols.append(
|
99
|
+
SymbolItem(
|
100
|
+
symbol_name=name,
|
101
|
+
symbol_type=SymbolType.CLASSES,
|
102
|
+
file_name=module_name,
|
103
|
+
)
|
104
|
+
)
|
105
|
+
for name in info1.functions:
|
106
|
+
list_of_symbols.append(
|
107
|
+
SymbolItem(
|
108
|
+
symbol_name=name,
|
109
|
+
symbol_type=SymbolType.FUNCTIONS,
|
110
|
+
file_name=module_name,
|
111
|
+
)
|
112
|
+
)
|
113
|
+
for name in info1.variables:
|
114
|
+
list_of_symbols.append(
|
115
|
+
SymbolItem(
|
116
|
+
symbol_name=name,
|
117
|
+
symbol_type=SymbolType.VARIABLES,
|
118
|
+
file_name=module_name,
|
119
|
+
)
|
120
|
+
)
|
121
|
+
return list_of_symbols
|
122
|
+
|
123
|
+
@router.get("/api/completions/files")
|
124
|
+
async def get_file_completions(
|
125
|
+
name: str = Query(...),
|
126
|
+
project_path: str = Depends(get_project_path)
|
127
|
+
):
|
128
|
+
"""获取文件名补全"""
|
129
|
+
patterns = [name]
|
130
|
+
matches = await asyncio.to_thread(find_files_in_project, patterns,project_path)
|
131
|
+
completions = []
|
132
|
+
project_root = project_path
|
133
|
+
for file_name in matches:
|
134
|
+
path_parts = file_name.split(os.sep)
|
135
|
+
# 只显示最后三层路径,让显示更简洁
|
136
|
+
display_name = os.sep.join(
|
137
|
+
path_parts[-3:]) if len(path_parts) > 3 else file_name
|
138
|
+
relative_path = os.path.relpath(file_name, project_root)
|
139
|
+
|
140
|
+
completions.append(CompletionItem(
|
141
|
+
name=relative_path, # 给补全项一个唯一标识
|
142
|
+
path=relative_path, # 实际用于替换的路径
|
143
|
+
display=display_name, # 显示的简短路径
|
144
|
+
location=relative_path # 完整的相对路径信息
|
145
|
+
))
|
146
|
+
return CompletionResponse(completions=completions)
|
147
|
+
|
148
|
+
@router.get("/api/completions/symbols")
|
149
|
+
async def get_symbol_completions(
|
150
|
+
name: str = Query(...),
|
151
|
+
project_path: str = Depends(get_project_path)
|
152
|
+
):
|
153
|
+
"""获取符号补全"""
|
154
|
+
symbols = await asyncio.to_thread(get_symbol_list, project_path)
|
155
|
+
matches = []
|
156
|
+
|
157
|
+
for symbol in symbols:
|
158
|
+
if name.lower() in symbol.symbol_name.lower():
|
159
|
+
relative_path = os.path.relpath(
|
160
|
+
symbol.file_name, project_path)
|
161
|
+
matches.append(CompletionItem(
|
162
|
+
name=symbol.symbol_name,
|
163
|
+
path=relative_path,
|
164
|
+
display=f"{symbol.symbol_name}(location: {relative_path})"
|
165
|
+
))
|
166
|
+
return CompletionResponse(completions=matches)
|
@@ -64,12 +64,20 @@ def _get_groups(project_path: str):
|
|
64
64
|
]
|
65
65
|
return v
|
66
66
|
|
67
|
-
def _switch_groups(group_names: List[str]):
|
67
|
+
def _switch_groups(group_names: List[str], file_paths: List[str] = None):
|
68
68
|
memory = get_memory()
|
69
69
|
new_files = []
|
70
70
|
for group_name in group_names:
|
71
71
|
files = memory["current_files"]["groups"][group_name]
|
72
72
|
new_files.extend(files)
|
73
|
+
|
74
|
+
# Add individual file paths if provided
|
75
|
+
if file_paths:
|
76
|
+
for file_path in file_paths:
|
77
|
+
# Only add unique paths
|
78
|
+
if file_path not in new_files:
|
79
|
+
new_files.append(file_path)
|
80
|
+
|
73
81
|
memory["current_files"]["files"] = new_files
|
74
82
|
memory["current_files"]["current_groups"] = group_names
|
75
83
|
save_memory()
|
@@ -139,12 +147,21 @@ async def auto_create_groups(
|
|
139
147
|
|
140
148
|
@router.post("/api/file-groups/switch")
|
141
149
|
async def switch_file_groups(
|
142
|
-
request: Request
|
150
|
+
request: Request,
|
151
|
+
project_path: str = Depends(get_project_path)
|
143
152
|
):
|
144
153
|
data = await request.json()
|
145
154
|
group_names = data.get("group_names", [])
|
146
|
-
|
147
|
-
|
155
|
+
file_paths = data.get("file_paths", [])
|
156
|
+
|
157
|
+
# Convert relative file paths to absolute paths
|
158
|
+
absolute_file_paths = []
|
159
|
+
for file_path in file_paths:
|
160
|
+
absolute_path = os.path.join(project_path, file_path)
|
161
|
+
absolute_file_paths.append(absolute_path)
|
162
|
+
|
163
|
+
await asyncio.to_thread(_switch_groups, group_names, absolute_file_paths)
|
164
|
+
return {"status": "success", "message": f"Switched to groups: {group_names} and additional files"}
|
148
165
|
|
149
166
|
|
150
167
|
@router.delete("/api/file-groups/{name}")
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import locale
|
2
|
+
from byzerllm.utils import format_str_jinja2
|
3
|
+
|
4
|
+
MESSAGES = {
|
5
|
+
"project_not_initialized": {
|
6
|
+
"en":"Warning: Project not initialized.",
|
7
|
+
"zh":"警告:项目未初始化。"
|
8
|
+
},
|
9
|
+
"run_auto_coder_chat": {
|
10
|
+
"en":"Please run 'auto-coder.chat' to initialize the project first.",
|
11
|
+
"zh":"请先运行 'auto-coder.chat' 来初始化项目。"
|
12
|
+
},
|
13
|
+
"human_as_model_warning": {
|
14
|
+
"en":"Warning: Project is configured to use human as model, auto-coder.web will not work, we will set human_as_model to false",
|
15
|
+
"zh":"警告:项目配置为使用人类作为模型,auto-coder.web 将无法工作,我们将设置 human_as_model 为 false"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
|
20
|
+
def get_system_language():
|
21
|
+
try:
|
22
|
+
return locale.getdefaultlocale()[0][:2]
|
23
|
+
except:
|
24
|
+
return 'en'
|
25
|
+
|
26
|
+
|
27
|
+
def get_message(key):
|
28
|
+
lang = get_system_language()
|
29
|
+
if key in MESSAGES:
|
30
|
+
return MESSAGES[key].get(lang, MESSAGES[key].get("en", ""))
|
31
|
+
return ""
|
32
|
+
|
33
|
+
|
34
|
+
def get_message_with_format(msg_key: str, **kwargs):
|
35
|
+
return format_str_jinja2(get_message(msg_key), **kwargs)
|
@@ -0,0 +1,304 @@
|
|
1
|
+
from autocoder.run_context import get_run_context,RunMode
|
2
|
+
|
3
|
+
# Set run mode to web
|
4
|
+
get_run_context().set_mode(RunMode.WEB)
|
5
|
+
|
6
|
+
from fastapi import FastAPI, Request, HTTPException, Response, Query
|
7
|
+
from fastapi.responses import HTMLResponse, JSONResponse
|
8
|
+
from fastapi import WebSocket
|
9
|
+
from fastapi.middleware.cors import CORSMiddleware
|
10
|
+
from fastapi.staticfiles import StaticFiles
|
11
|
+
import uvicorn
|
12
|
+
import httpx
|
13
|
+
import uuid
|
14
|
+
import os
|
15
|
+
import argparse
|
16
|
+
import aiofiles
|
17
|
+
import pkg_resources
|
18
|
+
import sys
|
19
|
+
from auto_coder_web.auto_coder_runner import AutoCoderRunner
|
20
|
+
from .types import (
|
21
|
+
FileContentResponse,
|
22
|
+
)
|
23
|
+
from .terminal import terminal_manager
|
24
|
+
from autocoder.common import AutoCoderArgs
|
25
|
+
from auto_coder_web.auto_coder_runner_wrapper import AutoCoderRunnerWrapper
|
26
|
+
from .routers import todo_router, settings_router, auto_router, commit_router, chat_router, coding_router
|
27
|
+
from expert_routers import history_router
|
28
|
+
from .common_router import completions_router, file_router, auto_coder_conf_router, chat_list_router, file_group_router
|
29
|
+
from rich.console import Console
|
30
|
+
from loguru import logger
|
31
|
+
from auto_coder_web.lang import get_message
|
32
|
+
|
33
|
+
class ProxyServer:
|
34
|
+
def __init__(self, project_path: str, quick: bool = False, product_mode: str = "pro"):
|
35
|
+
self.app = FastAPI()
|
36
|
+
self.setup_middleware()
|
37
|
+
|
38
|
+
self.setup_static_files()
|
39
|
+
self.project_path = project_path
|
40
|
+
|
41
|
+
# Check if project is initialized
|
42
|
+
self.is_initialized = self.check_project_initialization()
|
43
|
+
if not self.is_initialized:
|
44
|
+
logger.warning(get_message("project_not_initialized"))
|
45
|
+
logger.warning(get_message("run_auto_coder_chat"))
|
46
|
+
sys.exit(1)
|
47
|
+
|
48
|
+
self.auto_coder_runner = AutoCoderRunnerWrapper(project_path, product_mode=product_mode)
|
49
|
+
|
50
|
+
|
51
|
+
self.setup_routes()
|
52
|
+
self.client = httpx.AsyncClient()
|
53
|
+
|
54
|
+
def setup_middleware(self):
|
55
|
+
self.app.add_middleware(
|
56
|
+
CORSMiddleware,
|
57
|
+
allow_origins=["*"],
|
58
|
+
allow_credentials=True,
|
59
|
+
allow_methods=["*"],
|
60
|
+
allow_headers=["*"],
|
61
|
+
)
|
62
|
+
|
63
|
+
def setup_static_files(self):
|
64
|
+
self.index_html_path = pkg_resources.resource_filename(
|
65
|
+
"auto_coder_web", "web/index.html")
|
66
|
+
self.resource_dir = os.path.dirname(self.index_html_path)
|
67
|
+
self.static_dir = os.path.join(self.resource_dir, "static")
|
68
|
+
|
69
|
+
self.app.mount(
|
70
|
+
"/static", StaticFiles(directory=self.static_dir), name="static")
|
71
|
+
|
72
|
+
self.app.mount(
|
73
|
+
"/monaco-editor", StaticFiles(directory=os.path.join(self.resource_dir, "monaco-editor")), name="monaco-editor")
|
74
|
+
|
75
|
+
def setup_routes(self):
|
76
|
+
|
77
|
+
# Store project_path in app state for dependency injection
|
78
|
+
self.app.state.project_path = self.project_path
|
79
|
+
# Store auto_coder_runner in app state for dependency injection
|
80
|
+
self.app.state.auto_coder_runner = self.auto_coder_runner
|
81
|
+
# Store initialization status
|
82
|
+
self.app.state.is_initialized = self.is_initialized
|
83
|
+
|
84
|
+
self.app.include_router(todo_router.router)
|
85
|
+
self.app.include_router(settings_router.router)
|
86
|
+
self.app.include_router(auto_router.router)
|
87
|
+
self.app.include_router(commit_router.router)
|
88
|
+
self.app.include_router(chat_router.router)
|
89
|
+
self.app.include_router(coding_router.router)
|
90
|
+
self.app.include_router(history_router)
|
91
|
+
self.app.include_router(completions_router.router)
|
92
|
+
self.app.include_router(file_router.router)
|
93
|
+
self.app.include_router(auto_coder_conf_router.router)
|
94
|
+
self.app.include_router(chat_list_router.router)
|
95
|
+
self.app.include_router(file_group_router.router)
|
96
|
+
|
97
|
+
@self.app.on_event("shutdown")
|
98
|
+
async def shutdown_event():
|
99
|
+
await self.client.aclose()
|
100
|
+
|
101
|
+
@self.app.websocket("/ws/terminal")
|
102
|
+
async def terminal_websocket(websocket: WebSocket):
|
103
|
+
session_id = str(uuid.uuid4())
|
104
|
+
await terminal_manager.handle_websocket(websocket, session_id)
|
105
|
+
|
106
|
+
@self.app.get("/", response_class=HTMLResponse)
|
107
|
+
async def read_root():
|
108
|
+
if os.path.exists(self.index_html_path):
|
109
|
+
async with aiofiles.open(self.index_html_path, "r") as f:
|
110
|
+
content = await f.read()
|
111
|
+
|
112
|
+
# If project is not initialized, inject a warning banner
|
113
|
+
if not self.is_initialized:
|
114
|
+
init_warning = f"""
|
115
|
+
<div style="background-color: #fff3cd; color: #856404; padding: 15px; margin: 15px; border-radius: 5px; text-align: center; font-weight: bold;">
|
116
|
+
<p>⚠️ {get_message("project_not_initialized")}</p>
|
117
|
+
<p>{get_message("run_auto_coder_chat")}</p>
|
118
|
+
</div>
|
119
|
+
"""
|
120
|
+
# Insert the warning after the body tag
|
121
|
+
content = content.replace("<body>", "<body>" + init_warning)
|
122
|
+
|
123
|
+
return HTMLResponse(content=content)
|
124
|
+
return HTMLResponse(content="<h1>Welcome to Proxy Server</h1>")
|
125
|
+
|
126
|
+
|
127
|
+
@self.app.get("/api/project-path")
|
128
|
+
async def get_project_path():
|
129
|
+
return {"project_path": self.project_path}
|
130
|
+
|
131
|
+
def get_project_runner(project_path: str) -> AutoCoderRunner:
|
132
|
+
return self.projects[project_path]
|
133
|
+
|
134
|
+
@self.app.get("/api/os")
|
135
|
+
async def get_os():
|
136
|
+
return {"os": os.name}
|
137
|
+
|
138
|
+
@self.app.get("/api/conf/keys")
|
139
|
+
async def get_conf_keys():
|
140
|
+
"""Get all available configuration keys from AutoCoderArgs"""
|
141
|
+
field_info = AutoCoderArgs.model_fields
|
142
|
+
keys = []
|
143
|
+
for field_name, field in field_info.items():
|
144
|
+
field_type = field.annotation
|
145
|
+
type_str = str(field_type)
|
146
|
+
if "Optional" in type_str:
|
147
|
+
# Extract the inner type for Optional fields
|
148
|
+
inner_type = type_str.split("[")[1].split("]")[0]
|
149
|
+
if "Union" in inner_type:
|
150
|
+
# Handle Union types
|
151
|
+
types = [t.strip() for t in inner_type.split(",")[
|
152
|
+
:-1]] # Remove Union
|
153
|
+
type_str = " | ".join(types)
|
154
|
+
else:
|
155
|
+
type_str = inner_type
|
156
|
+
|
157
|
+
keys.append({
|
158
|
+
"key": field_name,
|
159
|
+
"type": type_str,
|
160
|
+
"description": field.description or "",
|
161
|
+
"default": field.default
|
162
|
+
})
|
163
|
+
return {"keys": keys}
|
164
|
+
|
165
|
+
@self.app.post("/api/revert")
|
166
|
+
async def revert():
|
167
|
+
try:
|
168
|
+
result = self.auto_coder_runner.revert()
|
169
|
+
return result
|
170
|
+
except Exception as e:
|
171
|
+
raise HTTPException(status_code=500, detail=str(e))
|
172
|
+
|
173
|
+
@self.app.get("/api/active-files")
|
174
|
+
async def get_active_files():
|
175
|
+
"""获取当前活动文件列表"""
|
176
|
+
active_files = self.auto_coder_runner.get_active_files()
|
177
|
+
return active_files
|
178
|
+
|
179
|
+
@self.app.post("/api/commit")
|
180
|
+
async def commit():
|
181
|
+
try:
|
182
|
+
result = self.auto_coder_runner.commit()
|
183
|
+
return result
|
184
|
+
except Exception as e:
|
185
|
+
raise HTTPException(status_code=500, detail=str(e))
|
186
|
+
|
187
|
+
@self.app.get("/api/last-yaml")
|
188
|
+
async def get_last_yaml():
|
189
|
+
"""Get information about the last YAML file"""
|
190
|
+
return JSONResponse(content=self.auto_coder_runner.get_last_yaml_info())
|
191
|
+
|
192
|
+
@self.app.get("/api/history/file-content/{file_number}", response_model=FileContentResponse)
|
193
|
+
async def get_file_content(file_number: int):
|
194
|
+
"""获取指定编号文件的完整内容"""
|
195
|
+
auto_coder_dir = "actions"
|
196
|
+
file_name = f"{file_number}_chat_action.yml"
|
197
|
+
file_path = ""
|
198
|
+
|
199
|
+
# 搜索文件
|
200
|
+
for root, _, files in os.walk(auto_coder_dir):
|
201
|
+
if file_name in files:
|
202
|
+
file_path = os.path.join(root, file_name)
|
203
|
+
break
|
204
|
+
|
205
|
+
if not file_path:
|
206
|
+
return FileContentResponse(
|
207
|
+
success=False,
|
208
|
+
message=f"找不到文件: {file_name}"
|
209
|
+
)
|
210
|
+
|
211
|
+
try:
|
212
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
213
|
+
content = f.read()
|
214
|
+
return FileContentResponse(
|
215
|
+
success=True,
|
216
|
+
content=content
|
217
|
+
)
|
218
|
+
except Exception as e:
|
219
|
+
return FileContentResponse(
|
220
|
+
success=False,
|
221
|
+
message=f"读取文件出错: {str(e)}"
|
222
|
+
)
|
223
|
+
|
224
|
+
@self.app.get("/api/initialization-status")
|
225
|
+
async def get_initialization_status():
|
226
|
+
"""Get the project initialization status"""
|
227
|
+
return {
|
228
|
+
"initialized": self.is_initialized,
|
229
|
+
"message": None if self.is_initialized else get_message("run_auto_coder_chat")
|
230
|
+
}
|
231
|
+
|
232
|
+
def check_project_initialization(self) -> bool:
|
233
|
+
"""Check if the project has been initialized with auto-coder.chat"""
|
234
|
+
auto_coder_dir = os.path.join(self.project_path, ".auto-coder")
|
235
|
+
actions_dir = os.path.join(self.project_path, "actions")
|
236
|
+
return os.path.exists(auto_coder_dir) and os.path.exists(actions_dir)
|
237
|
+
|
238
|
+
def check_project_conf(self):
|
239
|
+
conf = self.auto_coder_runner.get_conf_wrapper()
|
240
|
+
if conf.get("human_as_model","false") in ["true","True","TRUE"]:
|
241
|
+
logger.warning(get_message("human_as_model_warning"))
|
242
|
+
self.auto_coder_runner.configure_wrapper("human_as_model=false")
|
243
|
+
|
244
|
+
|
245
|
+
def main():
|
246
|
+
from autocoder.rag.variable_holder import VariableHolder
|
247
|
+
from tokenizers import Tokenizer
|
248
|
+
try:
|
249
|
+
tokenizer_path = pkg_resources.resource_filename(
|
250
|
+
"autocoder", "data/tokenizer.json"
|
251
|
+
)
|
252
|
+
VariableHolder.TOKENIZER_PATH = tokenizer_path
|
253
|
+
VariableHolder.TOKENIZER_MODEL = Tokenizer.from_file(tokenizer_path)
|
254
|
+
except FileNotFoundError:
|
255
|
+
tokenizer_path = None
|
256
|
+
|
257
|
+
parser = argparse.ArgumentParser(description="Proxy Server")
|
258
|
+
parser.add_argument(
|
259
|
+
"--port",
|
260
|
+
type=int,
|
261
|
+
default=8007,
|
262
|
+
help="Port to run the proxy server on (default: 8007)",
|
263
|
+
)
|
264
|
+
parser.add_argument(
|
265
|
+
"--host",
|
266
|
+
type=str,
|
267
|
+
default="0.0.0.0",
|
268
|
+
help="Host to run the proxy server on (default: 0.0.0.0)",
|
269
|
+
)
|
270
|
+
parser.add_argument(
|
271
|
+
"--quick",
|
272
|
+
action="store_true",
|
273
|
+
help="Skip environment check",
|
274
|
+
)
|
275
|
+
parser.add_argument(
|
276
|
+
"--product_mode",
|
277
|
+
type=str,
|
278
|
+
default="lite",
|
279
|
+
help="The mode of the auto-coder.chat, lite/pro default is lite",
|
280
|
+
)
|
281
|
+
parser.add_argument(
|
282
|
+
"--lite",
|
283
|
+
action="store_true",
|
284
|
+
help="Run in lite mode (equivalent to --product_mode lite)",
|
285
|
+
)
|
286
|
+
parser.add_argument(
|
287
|
+
"--pro",
|
288
|
+
action="store_true",
|
289
|
+
help="Run in pro mode (equivalent to --product_mode pro)",
|
290
|
+
)
|
291
|
+
args = parser.parse_args()
|
292
|
+
|
293
|
+
# Handle lite/pro flags
|
294
|
+
if args.lite:
|
295
|
+
args.product_mode = "lite"
|
296
|
+
elif args.pro:
|
297
|
+
args.product_mode = "pro"
|
298
|
+
|
299
|
+
proxy_server = ProxyServer(quick=args.quick, project_path=os.getcwd(), product_mode=args.product_mode)
|
300
|
+
uvicorn.run(proxy_server.app, host=args.host, port=args.port)
|
301
|
+
|
302
|
+
|
303
|
+
if __name__ == "__main__":
|
304
|
+
main()
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.1.27"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
{
|
2
|
+
"files": {
|
3
|
+
"main.css": "/static/css/main.8a602674.css",
|
4
|
+
"main.js": "/static/js/main.c14e8b91.js",
|
5
|
+
"static/js/453.d855a71b.chunk.js": "/static/js/453.d855a71b.chunk.js",
|
6
|
+
"index.html": "/index.html",
|
7
|
+
"main.8a602674.css.map": "/static/css/main.8a602674.css.map",
|
8
|
+
"main.c14e8b91.js.map": "/static/js/main.c14e8b91.js.map",
|
9
|
+
"453.d855a71b.chunk.js.map": "/static/js/453.d855a71b.chunk.js.map"
|
10
|
+
},
|
11
|
+
"entrypoints": [
|
12
|
+
"static/css/main.8a602674.css",
|
13
|
+
"static/js/main.c14e8b91.js"
|
14
|
+
]
|
15
|
+
}
|