auto-coder-web 0.1.60__tar.gz → 0.1.62__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.
Files changed (248) hide show
  1. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/PKG-INFO +2 -2
  2. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/auto_coder_conf_router.py +3 -3
  3. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/completions_router.py +15 -8
  4. auto_coder_web-0.1.62/src/auto_coder_web/common_router/file_router.py +104 -0
  5. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/expert_routers/history_router.py +1 -1
  6. auto_coder_web-0.1.62/src/auto_coder_web/file_manager.py +289 -0
  7. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/proxy.py +3 -1
  8. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/auto_router.py +1 -1
  9. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/chat_router.py +2 -2
  10. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/coding_router.py +3 -3
  11. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/commit_router.py +1 -1
  12. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/config_router.py +9 -4
  13. auto_coder_web-0.1.62/src/auto_coder_web/routers/editable_preview_router.py +202 -0
  14. auto_coder_web-0.1.62/src/auto_coder_web/routers/mcp_router.py +413 -0
  15. auto_coder_web-0.1.62/src/auto_coder_web/version.py +1 -0
  16. auto_coder_web-0.1.62/src/auto_coder_web/web/HistoryPanel-WXEMtQ1V.js +1 -0
  17. auto_coder_web-0.1.62/src/auto_coder_web/web/bridge.js +189 -0
  18. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/cssMode-C28WkqEl.js → auto_coder_web-0.1.62/src/auto_coder_web/web/cssMode-CQYz0o1d.js +1 -1
  19. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/freemarker2-ZqPV3OAn.js → auto_coder_web-0.1.62/src/auto_coder_web/web/freemarker2-BJU3cSen.js +1 -1
  20. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/handlebars-BeVH6MoZ.js → auto_coder_web-0.1.62/src/auto_coder_web/web/handlebars-VxUdciXQ.js +1 -1
  21. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/html-CbnuufYM.js → auto_coder_web-0.1.62/src/auto_coder_web/web/html-DEgskwXL.js +1 -1
  22. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/htmlMode-CpsZVLwy.js → auto_coder_web-0.1.62/src/auto_coder_web/web/htmlMode-58cXxJlI.js +1 -1
  23. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/index.html +2 -2
  24. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/javascript-CUA7SFHC.js → auto_coder_web-0.1.62/src/auto_coder_web/web/javascript-DbZlm-ig.js +1 -1
  25. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/jsonMode-BzAAFwlN.js → auto_coder_web-0.1.62/src/auto_coder_web/web/jsonMode-C2HKgmE0.js +1 -1
  26. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/liquid-B1UkAnrE.js → auto_coder_web-0.1.62/src/auto_coder_web/web/liquid-BFft-XkQ.js +1 -1
  27. auto_coder_web-0.1.62/src/auto_coder_web/web/main-DxnFm18B.css +32 -0
  28. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/index-U694gZ5i.js → auto_coder_web-0.1.62/src/auto_coder_web/web/main.js +372 -359
  29. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/mdx-2eOqd4a8.js → auto_coder_web-0.1.62/src/auto_coder_web/web/mdx-DZdDhrJW.js +1 -1
  30. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/python-DadwP7sa.js → auto_coder_web-0.1.62/src/auto_coder_web/web/python-DOHUGzLU.js +1 -1
  31. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/razor-CCybM3Rs.js → auto_coder_web-0.1.62/src/auto_coder_web/web/razor-Dh5mSHi2.js +1 -1
  32. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/tsMode-Bk47zhhf.js → auto_coder_web-0.1.62/src/auto_coder_web/web/tsMode-tyI6CeIR.js +1 -1
  33. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/typescript-vvCv9Db5.js → auto_coder_web-0.1.62/src/auto_coder_web/web/typescript-DZzM_VgT.js +1 -1
  34. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/xml-CLM5-Fko.js → auto_coder_web-0.1.62/src/auto_coder_web/web/xml-Dl6413Na.js +1 -1
  35. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/yaml-BF217FNY.js → auto_coder_web-0.1.62/src/auto_coder_web/web/yaml-DML583wh.js +1 -1
  36. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web.egg-info/PKG-INFO +2 -2
  37. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web.egg-info/SOURCES.txt +91 -88
  38. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web.egg-info/requires.txt +1 -1
  39. auto_coder_web-0.1.60/src/auto_coder_web/common_router/file_router.py +0 -79
  40. auto_coder_web-0.1.60/src/auto_coder_web/file_manager.py +0 -114
  41. auto_coder_web-0.1.60/src/auto_coder_web/routers/mcp_router.py +0 -188
  42. auto_coder_web-0.1.60/src/auto_coder_web/version.py +0 -1
  43. auto_coder_web-0.1.60/src/auto_coder_web/web/assets/index-Bnnll9cx.css +0 -32
  44. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/README.md +0 -0
  45. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/setup.cfg +0 -0
  46. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/setup.py +0 -0
  47. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/__init__.py +0 -0
  48. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/auto_coder_runner_wrapper.py +0 -0
  49. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/__init__.py +0 -0
  50. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/chat_list_router.py +0 -0
  51. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/compiler_router.py +0 -0
  52. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/file_group_router.py +0 -0
  53. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/common_router/model_router.py +0 -0
  54. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/expert_routers/__init__.py +0 -0
  55. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/file_group.py +0 -0
  56. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/init_project.py +0 -0
  57. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/json_file_storage.py +0 -0
  58. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/lang.py +0 -0
  59. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/__init__.py +0 -0
  60. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/index_router.py +0 -0
  61. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/rag_router.py +0 -0
  62. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/settings_router.py +0 -0
  63. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/todo_router.py +0 -0
  64. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/routers/upload_router.py +0 -0
  65. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/terminal.py +0 -0
  66. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/types.py +0 -0
  67. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/abap-BrgZPUOV.js +0 -0
  68. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/apex-DyP6w7ZV.js +0 -0
  69. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/azcli-BaLxmfj-.js +0 -0
  70. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/bat-CFOPXBzS.js +0 -0
  71. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/bicep-BfEKNvv3.js +0 -0
  72. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/cameligo-BFG1Mk7z.js +0 -0
  73. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/clojure-DTECt2xU.js +0 -0
  74. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/codicon-DCmgc-ay.ttf +0 -0
  75. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/coffee-CDGzqUPQ.js +0 -0
  76. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/cpp-CLLBncYj.js +0 -0
  77. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/csharp-dUCx_-0o.js +0 -0
  78. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/csp-5Rap-vPy.js +0 -0
  79. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/css-D3h14YRZ.js +0 -0
  80. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/cypher-DrQuvNYM.js +0 -0
  81. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/dart-CFKIUWau.js +0 -0
  82. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/dockerfile-Zznr-cwX.js +0 -0
  83. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/ecl-Ce3n6wWz.js +0 -0
  84. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/elixir-deUWdS0T.js +0 -0
  85. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/favicon.ico +0 -0
  86. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/flow9-i9-g7ZhI.js +0 -0
  87. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/fsharp-CzKuDChf.js +0 -0
  88. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/go-Cphgjts3.js +0 -0
  89. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/graphql-Cg7bfA9N.js +0 -0
  90. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/hcl-0cvrggvQ.js +0 -0
  91. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/ini-Drc7WvVn.js +0 -0
  92. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/java-B_fMsGYe.js +0 -0
  93. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/julia-Bqgm2twL.js +0 -0
  94. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/kotlin-BSkB5QuD.js +0 -0
  95. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/less-BsTHnhdd.js +0 -0
  96. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/lexon-YWi4-JPR.js +0 -0
  97. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/logo192.png +0 -0
  98. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/logo512.png +0 -0
  99. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/lua-nf6ki56Z.js +0 -0
  100. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/m3-Cpb6xl2v.js +0 -0
  101. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/manifest.json +0 -0
  102. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/markdown-DSZPf7rp.js +0 -0
  103. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/mips-B_c3zf-v.js +0 -0
  104. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  105. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/base/worker/workerMain.js +0 -0
  106. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/abap/abap.js +0 -0
  107. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/apex/apex.js +0 -0
  108. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/azcli/azcli.js +0 -0
  109. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bat/bat.js +0 -0
  110. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bicep/bicep.js +0 -0
  111. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js +0 -0
  112. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/clojure/clojure.js +0 -0
  113. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/coffee/coffee.js +0 -0
  114. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cpp/cpp.js +0 -0
  115. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csharp/csharp.js +0 -0
  116. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csp/csp.js +0 -0
  117. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/css/css.js +0 -0
  118. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cypher/cypher.js +0 -0
  119. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dart/dart.js +0 -0
  120. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js +0 -0
  121. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ecl/ecl.js +0 -0
  122. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/elixir/elixir.js +0 -0
  123. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/flow9/flow9.js +0 -0
  124. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js +0 -0
  125. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js +0 -0
  126. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/go/go.js +0 -0
  127. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/graphql/graphql.js +0 -0
  128. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js +0 -0
  129. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/hcl/hcl.js +0 -0
  130. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/html/html.js +0 -0
  131. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ini/ini.js +0 -0
  132. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/java/java.js +0 -0
  133. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/javascript/javascript.js +0 -0
  134. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/julia/julia.js +0 -0
  135. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js +0 -0
  136. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/less/less.js +0 -0
  137. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lexon/lexon.js +0 -0
  138. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/liquid/liquid.js +0 -0
  139. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lua/lua.js +0 -0
  140. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/m3/m3.js +0 -0
  141. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/markdown/markdown.js +0 -0
  142. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mdx/mdx.js +0 -0
  143. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mips/mips.js +0 -0
  144. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/msdax/msdax.js +0 -0
  145. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mysql/mysql.js +0 -0
  146. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js +0 -0
  147. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascal/pascal.js +0 -0
  148. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js +0 -0
  149. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/perl/perl.js +0 -0
  150. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js +0 -0
  151. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/php/php.js +0 -0
  152. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pla/pla.js +0 -0
  153. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/postiats/postiats.js +0 -0
  154. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js +0 -0
  155. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powershell/powershell.js +0 -0
  156. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js +0 -0
  157. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pug/pug.js +0 -0
  158. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/python/python.js +0 -0
  159. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js +0 -0
  160. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/r/r.js +0 -0
  161. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/razor/razor.js +0 -0
  162. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redis/redis.js +0 -0
  163. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redshift/redshift.js +0 -0
  164. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -0
  165. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ruby/ruby.js +0 -0
  166. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/rust/rust.js +0 -0
  167. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sb/sb.js +0 -0
  168. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scala/scala.js +0 -0
  169. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scheme/scheme.js +0 -0
  170. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scss/scss.js +0 -0
  171. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/shell/shell.js +0 -0
  172. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/solidity/solidity.js +0 -0
  173. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sophia/sophia.js +0 -0
  174. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sparql/sparql.js +0 -0
  175. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sql/sql.js +0 -0
  176. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/st/st.js +0 -0
  177. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/swift/swift.js +0 -0
  178. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js +0 -0
  179. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/tcl/tcl.js +0 -0
  180. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/twig/twig.js +0 -0
  181. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typescript/typescript.js +0 -0
  182. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typespec/typespec.js +0 -0
  183. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/vb/vb.js +0 -0
  184. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js +0 -0
  185. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/xml/xml.js +0 -0
  186. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/yaml/yaml.js +0 -0
  187. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.css +0 -0
  188. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.js +0 -0
  189. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssMode.js +0 -0
  190. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssWorker.js +0 -0
  191. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlMode.js +0 -0
  192. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlWorker.js +0 -0
  193. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js +0 -0
  194. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js +0 -0
  195. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js +0 -0
  196. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js +0 -0
  197. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/loader.js +0 -0
  198. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.de.js +0 -0
  199. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.es.js +0 -0
  200. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.fr.js +0 -0
  201. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.it.js +0 -0
  202. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ja.js +0 -0
  203. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ko.js +0 -0
  204. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ru.js +0 -0
  205. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-cn.js +0 -0
  206. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-tw.js +0 -0
  207. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/msdax-rUNN04Wq.js +0 -0
  208. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/mysql-DDwshQtU.js +0 -0
  209. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/objective-c-B5zXfXm9.js +0 -0
  210. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/pascal-CXOwvkN_.js +0 -0
  211. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/pascaligo-Bc-ZgV77.js +0 -0
  212. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/perl-CwNk8-XU.js +0 -0
  213. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/pgsql-tGk8EFnU.js +0 -0
  214. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/php-CpIb_Oan.js +0 -0
  215. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/pla-B03wrqEc.js +0 -0
  216. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/postiats-BKlk5iyT.js +0 -0
  217. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/powerquery-Bhzvs7bI.js +0 -0
  218. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/powershell-Dd3NCNK9.js +0 -0
  219. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/protobuf-COyEY5Pt.js +0 -0
  220. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/pug-BaJupSGV.js +0 -0
  221. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/qsharp-DXyYeYxl.js +0 -0
  222. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/r-CdQndTaG.js +0 -0
  223. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/redis-CVwtpugi.js +0 -0
  224. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/redshift-25W9uPmb.js +0 -0
  225. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/restructuredtext-DfzH4Xui.js +0 -0
  226. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web/web/robots.txt +0 -0
  227. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/ruby-Cp1zYvxS.js +0 -0
  228. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/rust-D5C2fndG.js +0 -0
  229. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/sb-CDntyWJ8.js +0 -0
  230. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/scala-BoFRg7Ot.js +0 -0
  231. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/scheme-Bio4gycK.js +0 -0
  232. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/scss-4Ik7cdeQ.js +0 -0
  233. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/shell-CX-rkNHf.js +0 -0
  234. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/solidity-Tw7wswEv.js +0 -0
  235. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/sophia-C5WLch3f.js +0 -0
  236. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/sparql-DHaeiCBh.js +0 -0
  237. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/sql-CCSDG5nI.js +0 -0
  238. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/st-pnP8ivHi.js +0 -0
  239. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/swift-DwJ7jVG9.js +0 -0
  240. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/systemverilog-B9Xyijhd.js +0 -0
  241. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/tcl-DnHyzjbg.js +0 -0
  242. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/twig-CPajHgWi.js +0 -0
  243. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/typespec-D-MeaMDU.js +0 -0
  244. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/vb-DgyLZaXg.js +0 -0
  245. {auto_coder_web-0.1.60/src/auto_coder_web/web/assets → auto_coder_web-0.1.62/src/auto_coder_web/web}/wgsl-BIv9DU6q.js +0 -0
  246. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web.egg-info/dependency_links.txt +0 -0
  247. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/src/auto_coder_web.egg-info/entry_points.txt +0 -0
  248. {auto_coder_web-0.1.60 → auto_coder_web-0.1.62}/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.60
3
+ Version: 0.1.62
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.332
10
+ Requires-Dist: auto-coder>=0.1.335
11
11
  Requires-Dist: aiofiles
12
12
  Requires-Dist: psutil
13
13
  Requires-Dist: sse-starlette
@@ -1,5 +1,6 @@
1
1
  from fastapi import APIRouter, Request, HTTPException, Depends
2
2
  from autocoder.auto_coder_runner import get_memory, configure
3
+ import asyncio
3
4
 
4
5
  router = APIRouter()
5
6
 
@@ -19,19 +20,18 @@ async def config(
19
20
  data = await request.json()
20
21
  try:
21
22
  for key, value in data.items():
22
- configure(f"{key}:{str(value)}")
23
+ await asyncio.to_thread(configure, f"{key}:{str(value)}")
23
24
  return {"status": "success"}
24
25
  except Exception as e:
25
26
  raise HTTPException(status_code=400, detail=str(e))
26
27
 
27
-
28
28
  @router.delete("/api/conf/{key}")
29
29
  async def delete_config(
30
30
  key: str
31
31
  ):
32
32
  """删除配置项"""
33
33
  try:
34
- configure(f"/drop {key}")
34
+ await asyncio.to_thread(configure, f"/drop {key}")
35
35
  return {"status": "success"}
36
36
  except ValueError as e:
37
37
  raise HTTPException(status_code=404, detail=str(e))
@@ -15,6 +15,8 @@ from autocoder.index.symbols_utils import (
15
15
  from autocoder.auto_coder_runner import get_memory
16
16
  import json
17
17
  import asyncio
18
+ import aiofiles
19
+ import aiofiles.os
18
20
 
19
21
 
20
22
  router = APIRouter()
@@ -98,14 +100,19 @@ def find_files_in_project(patterns: List[str], project_path: str) -> List[str]:
98
100
 
99
101
  return list(matched_files)
100
102
 
101
- def get_symbol_list(project_path: str) -> List[SymbolItem]:
103
+ async def get_symbol_list_async(project_path: str) -> List[SymbolItem]:
104
+ """Asynchronously reads the index file and extracts symbols."""
102
105
  list_of_symbols = []
103
- index_file = os.path.join(
104
- project_path, ".auto-coder", "index.json")
105
-
106
- if os.path.exists(index_file):
107
- with open(index_file, "r") as file:
108
- index_data = json.load(file)
106
+ index_file = os.path.join(project_path, ".auto-coder", "index.json")
107
+
108
+ if await aiofiles.os.path.exists(index_file):
109
+ try:
110
+ async with aiofiles.open(index_file, "r", encoding='utf-8') as file:
111
+ content = await file.read()
112
+ index_data = json.loads(content)
113
+ except (IOError, json.JSONDecodeError):
114
+ # Handle file reading or JSON parsing errors
115
+ index_data = {}
109
116
  else:
110
117
  index_data = {}
111
118
 
@@ -169,7 +176,7 @@ async def get_symbol_completions(
169
176
  project_path: str = Depends(get_project_path)
170
177
  ):
171
178
  """获取符号补全"""
172
- symbols = await asyncio.to_thread(get_symbol_list, project_path)
179
+ symbols = await get_symbol_list_async(project_path)
173
180
  matches = []
174
181
 
175
182
  for symbol in symbols:
@@ -0,0 +1,104 @@
1
+ import os
2
+ import shutil
3
+ import aiofiles
4
+ import aiofiles.os
5
+ from fastapi import APIRouter, Request, HTTPException, Depends
6
+ from auto_coder_web.file_manager import (
7
+ get_directory_tree_async,
8
+ read_file_content_async,
9
+ )
10
+
11
+ router = APIRouter()
12
+
13
+ async def get_project_path(request: Request) -> str:
14
+ """获取项目路径作为依赖"""
15
+ return request.app.state.project_path
16
+
17
+ async def get_auto_coder_runner(request: Request):
18
+ """获取AutoCoderRunner实例作为依赖"""
19
+ return request.app.state.auto_coder_runner
20
+
21
+ @router.delete("/api/files/{path:path}")
22
+ async def delete_file(
23
+ path: str,
24
+ project_path: str = Depends(get_project_path)
25
+ ):
26
+ try:
27
+ full_path = os.path.join(project_path, path)
28
+ if await aiofiles.os.path.exists(full_path):
29
+ if await aiofiles.os.path.isdir(full_path):
30
+ # Use shutil.rmtree for directories as aiofiles doesn't have a recursive delete
31
+ # Consider adding a custom async recursive delete if performance is critical
32
+ shutil.rmtree(full_path)
33
+ else:
34
+ await aiofiles.os.remove(full_path)
35
+ return {"message": f"Successfully deleted {path}"}
36
+ else:
37
+ raise HTTPException(
38
+ status_code=404, detail="File not found")
39
+ except Exception as e:
40
+ raise HTTPException(status_code=500, detail=str(e))
41
+
42
+ @router.get("/api/files")
43
+ async def get_files(
44
+ request: Request, # Need request to access project_path if not using Depends
45
+ path: str = None, # Optional path parameter for lazy loading
46
+ lazy: bool = False, # Optional lazy parameter
47
+ project_path: str = Depends(get_project_path)
48
+ ):
49
+ try:
50
+ # Pass path and lazy parameters if provided in the query
51
+ query_params = request.query_params
52
+ path_param = query_params.get("path")
53
+ lazy_param = query_params.get("lazy", "false").lower() == "true"
54
+
55
+ tree = await get_directory_tree_async(project_path, path=path_param, lazy=lazy_param)
56
+ return {"tree": tree}
57
+ except Exception as e:
58
+ # Log the error e
59
+ raise HTTPException(status_code=500, detail=f"Failed to get directory tree: {str(e)}")
60
+
61
+ @router.put("/api/file/{path:path}")
62
+ async def update_file(
63
+ path: str,
64
+ request: Request,
65
+ project_path: str = Depends(get_project_path)
66
+ ):
67
+ try:
68
+ data = await request.json()
69
+ content = data.get("content")
70
+ if content is None:
71
+ raise HTTPException(
72
+ status_code=400, detail="Content is required")
73
+
74
+ full_path = os.path.join(project_path, path)
75
+ dir_path = os.path.dirname(full_path)
76
+
77
+ # Ensure the directory exists asynchronously
78
+ if not await aiofiles.os.path.exists(dir_path):
79
+ await aiofiles.os.makedirs(dir_path, exist_ok=True)
80
+ elif not await aiofiles.os.path.isdir(dir_path):
81
+ raise HTTPException(status_code=400, detail=f"Path conflict: {dir_path} exists but is not a directory.")
82
+
83
+
84
+ # Write the file content asynchronously
85
+ async with aiofiles.open(full_path, 'w', encoding='utf-8') as f:
86
+ await f.write(content)
87
+
88
+ return {"message": f"Successfully updated {path}"}
89
+ except HTTPException as http_exc: # Re-raise HTTP exceptions
90
+ raise http_exc
91
+ except Exception as e:
92
+ raise HTTPException(status_code=500, detail=str(e))
93
+
94
+ @router.get("/api/file/{path:path}")
95
+ async def get_file_content(
96
+ path: str,
97
+ project_path: str = Depends(get_project_path)
98
+ ):
99
+ content = await read_file_content_async(project_path, path)
100
+ if content is None:
101
+ raise HTTPException(
102
+ status_code=404, detail="File not found or cannot be read")
103
+
104
+ return {"content": content}
@@ -87,7 +87,7 @@ async def validate_and_load_history(
87
87
  历史记录查询列表
88
88
  """
89
89
  # 定义在线程中执行的函数
90
- def load_history_task(project_path, max_history_count=50):
90
+ def load_history_task(project_path, max_history_count=10):
91
91
  try:
92
92
  # 过滤出聊天动作事件
93
93
  action_manager = ActionYmlFileManager(project_path)
@@ -0,0 +1,289 @@
1
+ import os
2
+ import json
3
+ import asyncio
4
+ import aiofiles
5
+ import aiofiles.os
6
+ from typing import List, Dict, Any, Optional
7
+
8
+
9
+ def get_directory_tree(root_path: str, path: str = None, lazy: bool = False) -> List[Dict[str, Any]]:
10
+ """
11
+ Generate a directory tree structure while ignoring common directories and files
12
+ that should not be included in version control or IDE specific files.
13
+
14
+ Args:
15
+ root_path: The root directory path to start traversing from
16
+ path: Optional path relative to root_path to get children for
17
+ lazy: If True, only return immediate children for directories
18
+
19
+ Returns:
20
+ A list of dictionaries representing the directory tree structure
21
+ """
22
+ # Common directories and files to ignore
23
+ IGNORE_PATTERNS = {
24
+ # Version control
25
+ '.git', '.svn', '.hg',
26
+ # Dependencies
27
+ 'node_modules', 'venv', '.venv', 'env', '.env',
28
+ '__pycache__', '.pytest_cache',
29
+ # Build outputs
30
+ 'dist', 'build', 'target',
31
+ # IDE specific
32
+ '.idea', '.vscode', '.vs',
33
+ # OS specific
34
+ '.DS_Store', 'Thumbs.db',
35
+ # Other common patterns
36
+ 'coverage', '.coverage', 'htmlcov',
37
+ # Hidden directories (start with .)
38
+ '.*'
39
+ }
40
+
41
+ def should_ignore(name: str) -> bool:
42
+ """Check if a file or directory should be ignored"""
43
+ # Ignore hidden files/directories
44
+ if name.startswith('.'):
45
+ return True
46
+ # Ignore exact matches and pattern matches
47
+ return name in IGNORE_PATTERNS
48
+
49
+ def build_tree(current_path: str) -> List[Dict[str, Any]]:
50
+ """Recursively build the directory tree"""
51
+ items = []
52
+ try:
53
+ for name in sorted(os.listdir(current_path)):
54
+ if should_ignore(name):
55
+ continue
56
+
57
+ full_path = os.path.join(current_path, name)
58
+ relative_path = os.path.relpath(full_path, root_path)
59
+
60
+ if os.path.isdir(full_path):
61
+ if lazy:
62
+ # For lazy loading, just check if directory has any visible children
63
+ has_children = False
64
+ for child_name in os.listdir(full_path):
65
+ if not should_ignore(child_name):
66
+ has_children = True
67
+ break
68
+
69
+ items.append({
70
+ 'title': name,
71
+ 'key': relative_path,
72
+ 'children': [], # Empty children array for lazy loading
73
+ 'isLeaf': False,
74
+ 'hasChildren': has_children
75
+ })
76
+ else:
77
+ children = build_tree(full_path)
78
+ if children: # Only add non-empty directories
79
+ items.append({
80
+ 'title': name,
81
+ 'key': relative_path,
82
+ 'children': children,
83
+ 'isLeaf': False,
84
+ 'hasChildren': True
85
+ })
86
+ else:
87
+ items.append({
88
+ 'title': name,
89
+ 'key': relative_path,
90
+ 'isLeaf': True,
91
+ 'hasChildren': False
92
+ })
93
+ except PermissionError:
94
+ # Skip directories we don't have permission to read
95
+ pass
96
+
97
+ return items
98
+
99
+ if path:
100
+ # If path is provided, get children of that specific directory
101
+ target_path = os.path.join(root_path, path)
102
+ if os.path.isdir(target_path):
103
+ return build_tree(target_path)
104
+ return []
105
+
106
+ # If no path provided, build tree from root
107
+ # If lazy is True, only immediate children are returned.
108
+ # If lazy is False, the full tree is built recursively.
109
+ # If no path provided, build tree from root
110
+ # If lazy is True, only immediate children are returned.
111
+ # If lazy is False, the full tree is built recursively.
112
+ return build_tree(root_path)
113
+
114
+
115
+ async def get_directory_tree_async(root_path: str, path: str = None, lazy: bool = False) -> List[Dict[str, Any]]:
116
+ """
117
+ Asynchronously generate a directory tree structure using aiofiles while ignoring common directories and files
118
+ that should not be included in version control or IDE specific files.
119
+
120
+ Args:
121
+ root_path: The root directory path to start traversing from
122
+ path: Optional path relative to root_path to get children for
123
+ lazy: If True, only return immediate children for directories
124
+
125
+ Returns:
126
+ A list of dictionaries representing the directory tree structure
127
+ """
128
+ # Common directories and files to ignore (same as synchronous version)
129
+ IGNORE_PATTERNS = {
130
+ # Version control
131
+ '.git', '.svn', '.hg',
132
+ # Dependencies
133
+ 'node_modules', 'venv', '.venv', 'env', '.env',
134
+ '__pycache__', '.pytest_cache',
135
+ # Build outputs
136
+ 'dist', 'build', 'target',
137
+ # IDE specific
138
+ '.idea', '.vscode', '.vs',
139
+ # OS specific
140
+ '.DS_Store', 'Thumbs.db',
141
+ # Other common patterns
142
+ 'coverage', '.coverage', 'htmlcov',
143
+ # Hidden directories (start with .) - Note: This logic is slightly different now
144
+ # '.hidden_file', '.hidden_dir' # Example explicit hidden items if needed
145
+ }
146
+
147
+ def should_ignore(name: str) -> bool:
148
+ """Check if a file or directory should be ignored"""
149
+ # Ignore hidden files/directories (starting with '.')
150
+ if name.startswith('.'):
151
+ return True
152
+ # Ignore exact matches
153
+ return name in IGNORE_PATTERNS
154
+
155
+ async def build_tree(current_path: str) -> List[Dict[str, Any]]:
156
+ """Recursively build the directory tree asynchronously using aiofiles"""
157
+ items = []
158
+ try:
159
+ # Use aiofiles.os.listdir
160
+ child_names = await aiofiles.os.listdir(current_path)
161
+ tasks = []
162
+ for name in sorted(child_names):
163
+ if should_ignore(name):
164
+ continue
165
+ tasks.append(process_item(current_path, name))
166
+
167
+ results = await asyncio.gather(*tasks)
168
+ items = [item for item in results if item is not None] # Filter out None results from ignored items or errors
169
+
170
+ except PermissionError:
171
+ # Skip directories we don't have permission to read
172
+ pass
173
+ except FileNotFoundError:
174
+ # Handle case where directory doesn't exist during processing
175
+ pass
176
+
177
+ return items
178
+
179
+ async def process_item(current_path: str, name: str) -> Optional[Dict[str, Any]]:
180
+ """Process a single directory item asynchronously"""
181
+ try:
182
+ full_path = os.path.join(current_path, name)
183
+ relative_path = os.path.relpath(full_path, root_path)
184
+
185
+ # Use aiofiles.os.path.isdir
186
+ is_dir = await aiofiles.os.path.isdir(full_path)
187
+
188
+ if is_dir:
189
+ if lazy:
190
+ # For lazy loading, check if directory has any visible children asynchronously
191
+ has_children = False
192
+ try:
193
+ # Use aiofiles.os.listdir
194
+ for child_name in await aiofiles.os.listdir(full_path):
195
+ if not should_ignore(child_name):
196
+ has_children = True
197
+ break
198
+ except (PermissionError, FileNotFoundError):
199
+ pass # Ignore errors checking for children, assume no visible children
200
+
201
+ return {
202
+ 'title': name,
203
+ 'key': relative_path,
204
+ 'children': [], # Empty children array for lazy loading
205
+ 'isLeaf': False,
206
+ 'hasChildren': has_children
207
+ }
208
+ else:
209
+ children = await build_tree(full_path)
210
+ if children: # Only add non-empty directories
211
+ return {
212
+ 'title': name,
213
+ 'key': relative_path,
214
+ 'children': children,
215
+ 'isLeaf': False,
216
+ 'hasChildren': True
217
+ }
218
+ else: # Represent empty directories as leaves if not lazy loading
219
+ return {
220
+ 'title': name,
221
+ 'key': relative_path,
222
+ 'isLeaf': True,
223
+ 'hasChildren': False
224
+ }
225
+ else:
226
+ return {
227
+ 'title': name,
228
+ 'key': relative_path,
229
+ 'isLeaf': True,
230
+ 'hasChildren': False
231
+ }
232
+ except (PermissionError, FileNotFoundError):
233
+ # Skip items we can't process
234
+ return None
235
+
236
+
237
+ target_path = root_path
238
+ if path:
239
+ # If path is provided, get children of that specific directory
240
+ potential_target_path = os.path.join(root_path, path)
241
+ # Use aiofiles.os.path.isdir for the check
242
+ if await aiofiles.os.path.isdir(potential_target_path):
243
+ target_path = potential_target_path
244
+ else:
245
+ return [] # Path does not point to a valid directory
246
+
247
+ return await build_tree(target_path)
248
+
249
+
250
+ def read_file_content(project_path: str, file_path: str) -> str:
251
+ """Read the content of a file"""
252
+ try:
253
+ full_path = os.path.join(project_path, file_path)
254
+ # Check if the path exists and is a file before attempting to open
255
+ if not os.path.exists(full_path) or not os.path.isfile(full_path):
256
+ return None # Or raise a specific error like FileNotFoundError
257
+ with open(full_path, 'r', encoding='utf-8', errors='ignore') as f: # Added errors='ignore' for robustness
258
+ return f.read()
259
+ except IOError: # Catching only IOError, as UnicodeDecodeError is handled by errors='ignore'
260
+ # Log the error here if needed
261
+ return None
262
+ except Exception as e:
263
+ # Catch any other unexpected error
264
+ # Log e
265
+ return None
266
+
267
+
268
+ async def read_file_content_async(project_path: str, file_path: str) -> Optional[str]:
269
+ """Asynchronously read the content of a file using aiofiles"""
270
+ full_path = os.path.join(project_path, file_path)
271
+ try:
272
+ # Check if the path exists and is a file before attempting to open using aiofiles.os
273
+ path_exists = await aiofiles.os.path.exists(full_path)
274
+ is_file = await aiofiles.os.path.isfile(full_path)
275
+
276
+ if not path_exists or not is_file:
277
+ return None # Or raise a specific error like FileNotFoundError
278
+
279
+ # Use aiofiles for asynchronous file reading
280
+ async with aiofiles.open(full_path, mode='r', encoding='utf-8', errors='ignore') as f:
281
+ content = await f.read()
282
+ return content
283
+ except (IOError, FileNotFoundError): # Catch file-related errors
284
+ # Log the error here if needed
285
+ return None
286
+ except Exception as e:
287
+ # Catch any other unexpected error during path checks or reading
288
+ # Log e
289
+ return None
@@ -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,mcp_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,8 @@ 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)
104
+ self.app.include_router(mcp_router.router)
103
105
  # self.app.include_router(rag_router.router)
104
106
 
105
107
  @self.app.on_event("shutdown")
@@ -87,7 +87,7 @@ async def auto_command(request: AutoCommandRequest, project_path: str = Depends(
87
87
  except Exception as e:
88
88
  logger.error(f"Error executing auto command {file_id}: {str(e)}")
89
89
  get_event_manager(event_file).write_error(
90
- EventContentCreator.create_error("500", "error", str(e)).to_dict()
90
+ EventContentCreator.create_error(error_code="500", error_message=str(e), details={}).to_dict()
91
91
  )
92
92
 
93
93
  # 创建并启动线程
@@ -80,7 +80,7 @@ async def chat_command(request: ChatCommandRequest, project_path: str = Depends(
80
80
  except Exception as e:
81
81
  logger.error(f"Error executing chat command {file_id}: {str(e)}")
82
82
  get_event_manager(event_file).write_error(
83
- EventContentCreator.create_error("500", "error", str(e)).to_dict()
83
+ EventContentCreator.create_error(error_code="500", error_message=str(e), details={}).to_dict()
84
84
  )
85
85
 
86
86
  # 创建并启动线程
@@ -313,7 +313,7 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
313
313
  # 写入取消事件
314
314
  event_manager.write_error(
315
315
  EventContentCreator.create_error(
316
- "499", "cancelled", "Task cancelled by user").to_dict()
316
+ error_code="499", error_message="cancelled", details={}).to_dict()
317
317
  )
318
318
 
319
319
  logger.info(f"Task {request.event_file_id} cancelled successfully")
@@ -146,7 +146,7 @@ async def coding_command(request: CodingCommandRequest, project_path: str = Depe
146
146
  except Exception as e:
147
147
  logger.error(f"Error executing coding command {file_id}: {str(e)}")
148
148
  get_event_manager(event_file).write_error(
149
- EventContentCreator.create_error("500", "error", str(e)).to_dict()
149
+ EventContentCreator.create_error(error_code="500", error_message=str(e), details={}).to_dict()
150
150
  )
151
151
 
152
152
  # 创建并启动线程
@@ -371,7 +371,7 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
371
371
  def cancel_in_thread():
372
372
  try:
373
373
  # 设置全局取消标志
374
- global_cancel.set_cancel(request.event_file_id)
374
+ global_cancel.set()
375
375
 
376
376
  # 获取事件管理器
377
377
  event_manager = get_event_manager(event_file)
@@ -379,7 +379,7 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
379
379
  # 写入取消事件
380
380
  event_manager.write_error(
381
381
  EventContentCreator.create_error(
382
- "499", "cancelled", "Task cancelled by user").to_dict()
382
+ error_code="499", error_message="cancelled", details={}).to_dict()
383
383
  )
384
384
 
385
385
  logger.info(f"Task {request.event_file_id} cancelled successfully")
@@ -50,7 +50,7 @@ def get_repo(project_path: str) -> Repo:
50
50
 
51
51
  @router.get("/api/commits")
52
52
  async def get_commits(
53
- limit: int = 50,
53
+ limit: int = 10,
54
54
  skip: int = 0,
55
55
  project_path: str = Depends(get_project_path)
56
56
  ):
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import json
3
+ import aiofiles
3
4
  from fastapi import APIRouter, HTTPException, Request, Depends
4
5
  from pydantic import BaseModel
5
6
  from pathlib import Path
@@ -27,16 +28,20 @@ async def load_config(config_path: Path) -> UIConfig:
27
28
  return UIConfig()
28
29
 
29
30
  try:
30
- with open(config_path, 'r') as f:
31
- config_data = json.load(f)
31
+ async with aiofiles.open(config_path, mode='r', encoding='utf-8') as f:
32
+ content = await f.read()
33
+ config_data = json.loads(content)
32
34
  return UIConfig(**config_data)
35
+ except FileNotFoundError:
36
+ return UIConfig()
33
37
  except json.JSONDecodeError:
38
+ # Handle cases where the file is corrupted or empty
34
39
  return UIConfig()
35
40
 
36
41
  async def save_config(config: UIConfig, config_path: Path):
37
42
  """保存配置"""
38
- with open(config_path, 'w') as f:
39
- json.dump(config.dict(), f)
43
+ async with aiofiles.open(config_path, mode='w', encoding='utf-8') as f:
44
+ await f.write(json.dumps(config.dict()))
40
45
 
41
46
  @router.get("/api/config/ui/mode")
42
47
  async def get_ui_mode(request: Request):