auto-coder-web 0.1.92__tar.gz → 0.1.94__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 (258) hide show
  1. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/PKG-INFO +2 -2
  2. auto_coder_web-0.1.94/src/auto_coder_web/common_router/chat_list_manager.py +194 -0
  3. auto_coder_web-0.1.94/src/auto_coder_web/common_router/chat_list_router.py +142 -0
  4. auto_coder_web-0.1.94/src/auto_coder_web/common_router/chat_session_manager.py +111 -0
  5. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/file_group_router.py +55 -2
  6. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/proxy.py +3 -2
  7. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/auto_router.py +44 -29
  8. auto_coder_web-0.1.94/src/auto_coder_web/routers/chat_panels_router.py +159 -0
  9. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/chat_router.py +120 -1
  10. auto_coder_web-0.1.94/src/auto_coder_web/routers/code_editor_tabs_router.py +191 -0
  11. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/coding_router.py +28 -26
  12. auto_coder_web-0.1.94/src/auto_coder_web/version.py +1 -0
  13. auto_coder_web-0.1.92/src/auto_coder_web/web/assets/main-edBorJ-r.css → auto_coder_web-0.1.94/src/auto_coder_web/web/assets/main-D8cC7hK1.css +1 -1
  14. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/main.js +382 -382
  15. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/index.html +1 -1
  16. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web.egg-info/PKG-INFO +2 -2
  17. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web.egg-info/SOURCES.txt +5 -4
  18. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web.egg-info/requires.txt +1 -1
  19. auto_coder_web-0.1.92/src/auto_coder_web/common_router/chat_list_router.py +0 -202
  20. auto_coder_web-0.1.92/src/auto_coder_web/file_cacher/filecacher.py +0 -195
  21. auto_coder_web-0.1.92/src/auto_coder_web/file_group.py +0 -69
  22. auto_coder_web-0.1.92/src/auto_coder_web/routers/__init__.py +0 -0
  23. auto_coder_web-0.1.92/src/auto_coder_web/version.py +0 -1
  24. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/README.md +0 -0
  25. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/setup.cfg +0 -0
  26. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/setup.py +0 -0
  27. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/__init__.py +0 -0
  28. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/auto_coder_runner_wrapper.py +0 -0
  29. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/__init__.py +0 -0
  30. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/active_context_router.py +0 -0
  31. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/auto_coder_conf_router.py +0 -0
  32. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/compiler_router.py +0 -0
  33. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/completions_router.py +0 -0
  34. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/file_router.py +0 -0
  35. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/filecacher.py +0 -0
  36. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/common_router/model_router.py +0 -0
  37. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/expert_routers/__init__.py +0 -0
  38. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/expert_routers/history_router.py +0 -0
  39. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/file_manager.py +0 -0
  40. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/init_project.py +0 -0
  41. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/json_file_storage.py +0 -0
  42. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/lang.py +0 -0
  43. {auto_coder_web-0.1.92/src/auto_coder_web/file_cacher → auto_coder_web-0.1.94/src/auto_coder_web/routers}/__init__.py +0 -0
  44. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/commit_router.py +0 -0
  45. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/config_router.py +0 -0
  46. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/direct_chat_router.py +0 -0
  47. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/editable_preview_router.py +0 -0
  48. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/index_router.py +0 -0
  49. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/mcp_router.py +0 -0
  50. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/rag_router.py +0 -0
  51. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/rules_router.py +0 -0
  52. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/settings_router.py +0 -0
  53. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/todo_router.py +0 -0
  54. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/routers/upload_router.py +0 -0
  55. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/terminal.py +0 -0
  56. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/types.py +0 -0
  57. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/HistoryPanel-B59ay4X7.js +0 -0
  58. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/abap-BrgZPUOV.js +0 -0
  59. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/apex-DyP6w7ZV.js +0 -0
  60. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/azcli-BaLxmfj-.js +0 -0
  61. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/bat-CFOPXBzS.js +0 -0
  62. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/bicep-BfEKNvv3.js +0 -0
  63. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/cameligo-BFG1Mk7z.js +0 -0
  64. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/clojure-DTECt2xU.js +0 -0
  65. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/codicon-DCmgc-ay.ttf +0 -0
  66. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/coffee-CDGzqUPQ.js +0 -0
  67. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/cpp-CLLBncYj.js +0 -0
  68. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/csharp-dUCx_-0o.js +0 -0
  69. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/csp-5Rap-vPy.js +0 -0
  70. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/css-D3h14YRZ.js +0 -0
  71. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/cssMode-dfzmIRw_.js +0 -0
  72. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/cypher-DrQuvNYM.js +0 -0
  73. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/dart-CFKIUWau.js +0 -0
  74. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/dockerfile-Zznr-cwX.js +0 -0
  75. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/ecl-Ce3n6wWz.js +0 -0
  76. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/elixir-deUWdS0T.js +0 -0
  77. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/flow9-i9-g7ZhI.js +0 -0
  78. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/freemarker2-CD79_SV-.js +0 -0
  79. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/fsharp-CzKuDChf.js +0 -0
  80. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/go-Cphgjts3.js +0 -0
  81. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/graphql-Cg7bfA9N.js +0 -0
  82. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/handlebars-B_inQ7Ga.js +0 -0
  83. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/hcl-0cvrggvQ.js +0 -0
  84. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/html-s8IXsV2v.js +0 -0
  85. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/htmlMode-BNdCO4Um.js +0 -0
  86. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/ini-Drc7WvVn.js +0 -0
  87. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/java-B_fMsGYe.js +0 -0
  88. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/javascript-D_ZBRKl9.js +0 -0
  89. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/jsonMode-lWocgRYn.js +0 -0
  90. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/julia-Bqgm2twL.js +0 -0
  91. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/kotlin-BSkB5QuD.js +0 -0
  92. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/less-BsTHnhdd.js +0 -0
  93. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/lexon-YWi4-JPR.js +0 -0
  94. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/liquid-CPaH0eVF.js +0 -0
  95. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/lua-nf6ki56Z.js +0 -0
  96. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/m3-Cpb6xl2v.js +0 -0
  97. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/markdown-DSZPf7rp.js +0 -0
  98. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/mdx-DRx1b0qs.js +0 -0
  99. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/mips-B_c3zf-v.js +0 -0
  100. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/msdax-rUNN04Wq.js +0 -0
  101. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/mysql-DDwshQtU.js +0 -0
  102. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/objective-c-B5zXfXm9.js +0 -0
  103. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/pascal-CXOwvkN_.js +0 -0
  104. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/pascaligo-Bc-ZgV77.js +0 -0
  105. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/perl-CwNk8-XU.js +0 -0
  106. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/pgsql-tGk8EFnU.js +0 -0
  107. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/php-CpIb_Oan.js +0 -0
  108. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/pla-B03wrqEc.js +0 -0
  109. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/postiats-BKlk5iyT.js +0 -0
  110. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/powerquery-Bhzvs7bI.js +0 -0
  111. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/powershell-Dd3NCNK9.js +0 -0
  112. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/protobuf-COyEY5Pt.js +0 -0
  113. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/pug-BaJupSGV.js +0 -0
  114. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/python-5rTPwuda.js +0 -0
  115. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/qsharp-DXyYeYxl.js +0 -0
  116. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/r-CdQndTaG.js +0 -0
  117. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/razor-zn6WfQ9V.js +0 -0
  118. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/redis-CVwtpugi.js +0 -0
  119. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/redshift-25W9uPmb.js +0 -0
  120. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/restructuredtext-DfzH4Xui.js +0 -0
  121. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/ruby-Cp1zYvxS.js +0 -0
  122. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/rust-D5C2fndG.js +0 -0
  123. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/sb-CDntyWJ8.js +0 -0
  124. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/scala-BoFRg7Ot.js +0 -0
  125. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/scheme-Bio4gycK.js +0 -0
  126. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/scss-4Ik7cdeQ.js +0 -0
  127. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/shell-CX-rkNHf.js +0 -0
  128. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/solidity-Tw7wswEv.js +0 -0
  129. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/sophia-C5WLch3f.js +0 -0
  130. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/sparql-DHaeiCBh.js +0 -0
  131. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/sql-CCSDG5nI.js +0 -0
  132. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/st-pnP8ivHi.js +0 -0
  133. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/swift-DwJ7jVG9.js +0 -0
  134. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/systemverilog-B9Xyijhd.js +0 -0
  135. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/tcl-DnHyzjbg.js +0 -0
  136. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/tsMode-CkhihvQ0.js +0 -0
  137. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/twig-CPajHgWi.js +0 -0
  138. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/typescript-DH2E4fY1.js +0 -0
  139. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/typespec-D-MeaMDU.js +0 -0
  140. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/vb-DgyLZaXg.js +0 -0
  141. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/wgsl-BIv9DU6q.js +0 -0
  142. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/xml-kipCCfsB.js +0 -0
  143. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/assets/yaml-BI9EB_1X.js +0 -0
  144. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/bridge.js +0 -0
  145. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/favicon.ico +0 -0
  146. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/logo192.png +0 -0
  147. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/logo512.png +0 -0
  148. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/manifest.json +0 -0
  149. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  150. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/base/worker/workerMain.js +0 -0
  151. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/abap/abap.js +0 -0
  152. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/apex/apex.js +0 -0
  153. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/azcli/azcli.js +0 -0
  154. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bat/bat.js +0 -0
  155. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bicep/bicep.js +0 -0
  156. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js +0 -0
  157. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/clojure/clojure.js +0 -0
  158. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/coffee/coffee.js +0 -0
  159. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cpp/cpp.js +0 -0
  160. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csharp/csharp.js +0 -0
  161. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csp/csp.js +0 -0
  162. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/css/css.js +0 -0
  163. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cypher/cypher.js +0 -0
  164. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dart/dart.js +0 -0
  165. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js +0 -0
  166. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ecl/ecl.js +0 -0
  167. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/elixir/elixir.js +0 -0
  168. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/flow9/flow9.js +0 -0
  169. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js +0 -0
  170. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js +0 -0
  171. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/go/go.js +0 -0
  172. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/graphql/graphql.js +0 -0
  173. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js +0 -0
  174. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/hcl/hcl.js +0 -0
  175. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/html/html.js +0 -0
  176. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ini/ini.js +0 -0
  177. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/java/java.js +0 -0
  178. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/javascript/javascript.js +0 -0
  179. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/julia/julia.js +0 -0
  180. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js +0 -0
  181. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/less/less.js +0 -0
  182. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lexon/lexon.js +0 -0
  183. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/liquid/liquid.js +0 -0
  184. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lua/lua.js +0 -0
  185. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/m3/m3.js +0 -0
  186. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/markdown/markdown.js +0 -0
  187. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mdx/mdx.js +0 -0
  188. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mips/mips.js +0 -0
  189. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/msdax/msdax.js +0 -0
  190. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mysql/mysql.js +0 -0
  191. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js +0 -0
  192. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascal/pascal.js +0 -0
  193. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js +0 -0
  194. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/perl/perl.js +0 -0
  195. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js +0 -0
  196. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/php/php.js +0 -0
  197. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pla/pla.js +0 -0
  198. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/postiats/postiats.js +0 -0
  199. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js +0 -0
  200. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powershell/powershell.js +0 -0
  201. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js +0 -0
  202. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pug/pug.js +0 -0
  203. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/python/python.js +0 -0
  204. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js +0 -0
  205. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/r/r.js +0 -0
  206. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/razor/razor.js +0 -0
  207. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redis/redis.js +0 -0
  208. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redshift/redshift.js +0 -0
  209. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -0
  210. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ruby/ruby.js +0 -0
  211. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/rust/rust.js +0 -0
  212. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sb/sb.js +0 -0
  213. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scala/scala.js +0 -0
  214. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scheme/scheme.js +0 -0
  215. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scss/scss.js +0 -0
  216. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/shell/shell.js +0 -0
  217. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/solidity/solidity.js +0 -0
  218. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sophia/sophia.js +0 -0
  219. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sparql/sparql.js +0 -0
  220. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sql/sql.js +0 -0
  221. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/st/st.js +0 -0
  222. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/swift/swift.js +0 -0
  223. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js +0 -0
  224. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/tcl/tcl.js +0 -0
  225. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/twig/twig.js +0 -0
  226. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typescript/typescript.js +0 -0
  227. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typespec/typespec.js +0 -0
  228. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/vb/vb.js +0 -0
  229. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js +0 -0
  230. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/xml/xml.js +0 -0
  231. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/yaml/yaml.js +0 -0
  232. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.css +0 -0
  233. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.js +0 -0
  234. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssMode.js +0 -0
  235. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssWorker.js +0 -0
  236. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlMode.js +0 -0
  237. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlWorker.js +0 -0
  238. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js +0 -0
  239. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js +0 -0
  240. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js +0 -0
  241. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js +0 -0
  242. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/loader.js +0 -0
  243. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.de.js +0 -0
  244. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.es.js +0 -0
  245. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.fr.js +0 -0
  246. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.it.js +0 -0
  247. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ja.js +0 -0
  248. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ko.js +0 -0
  249. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ru.js +0 -0
  250. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-cn.js +0 -0
  251. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-tw.js +0 -0
  252. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/robots.txt +0 -0
  253. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/sounds/ding-dong.wav +0 -0
  254. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/sounds/gentle-notification.wav +0 -0
  255. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web/web/sounds/soft-chime.wav +0 -0
  256. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web.egg-info/dependency_links.txt +0 -0
  257. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/src/auto_coder_web.egg-info/entry_points.txt +0 -0
  258. {auto_coder_web-0.1.92 → auto_coder_web-0.1.94}/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.92
3
+ Version: 0.1.94
4
4
  Summary: auto-coder.web: A Python Project
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
7
7
  Classifier: Programming Language :: Python :: 3.11
8
8
  Classifier: Programming Language :: Python :: 3.12
9
9
  Description-Content-Type: text/markdown
10
- Requires-Dist: auto-coder>=0.1.361
10
+ Requires-Dist: auto-coder>=0.1.364
11
11
  Requires-Dist: aiofiles
12
12
  Requires-Dist: psutil
13
13
  Requires-Dist: watchdog
@@ -0,0 +1,194 @@
1
+ import os
2
+ import json
3
+ import asyncio
4
+ import aiofiles
5
+ from typing import List, Dict, Any, Tuple
6
+ from loguru import logger
7
+
8
+ def _get_chat_lists_dir(project_path: str) -> str:
9
+ """获取聊天列表目录的路径,并确保目录存在"""
10
+ chat_lists_dir = os.path.join(project_path, ".auto-coder", "auto-coder.web", "chat-lists")
11
+ os.makedirs(chat_lists_dir, exist_ok=True)
12
+ return chat_lists_dir
13
+
14
+ def _get_chat_list_file_path(project_path: str, name: str) -> str:
15
+ """获取特定聊天列表文件的完整路径"""
16
+ chat_lists_dir = _get_chat_lists_dir(project_path)
17
+ return os.path.join(chat_lists_dir, f"{name}.json")
18
+
19
+ async def save_chat_list(project_path: str, name: str, messages: List[Dict[str, Any]]) -> None:
20
+ """
21
+ 保存聊天列表到文件
22
+
23
+ Args:
24
+ project_path: 项目路径
25
+ name: 聊天列表名称
26
+ messages: 聊天消息列表
27
+
28
+ Raises:
29
+ Exception: 如果保存失败
30
+ """
31
+ file_path = _get_chat_list_file_path(project_path, name)
32
+ try:
33
+ async with aiofiles.open(file_path, 'w') as f:
34
+ await f.write(json.dumps({"messages": messages}, indent=2, ensure_ascii=False))
35
+ except Exception as e:
36
+ logger.error(f"Error saving chat list {name}: {str(e)}")
37
+ raise e
38
+
39
+ async def get_chat_lists(project_path: str) -> List[str]:
40
+ """
41
+ 获取所有聊天列表的名称,按修改时间倒序排列(最新的在前)
42
+
43
+ Args:
44
+ project_path: 项目路径
45
+
46
+ Returns:
47
+ 聊天列表名称列表
48
+
49
+ Raises:
50
+ Exception: 如果获取列表失败
51
+ """
52
+ chat_lists_dir = _get_chat_lists_dir(project_path)
53
+
54
+ try:
55
+ # 获取文件及其修改时间
56
+ chat_lists = []
57
+ files = await asyncio.to_thread(os.listdir, chat_lists_dir)
58
+ for file in files:
59
+ if file.endswith('.json'):
60
+ file_path = os.path.join(chat_lists_dir, file)
61
+ mod_time = os.path.getmtime(file_path)
62
+ # 存储(名称, 修改时间)的元组
63
+ chat_lists.append((file[:-5], mod_time))
64
+
65
+ # 按修改时间倒序排序(最新的在前)
66
+ chat_lists.sort(key=lambda x: x[1], reverse=True)
67
+
68
+ # 只返回聊天列表名称
69
+ return [name for name, _ in chat_lists]
70
+ except Exception as e:
71
+ logger.error(f"Error getting chat lists: {str(e)}")
72
+ raise e
73
+
74
+ async def get_chat_list(project_path: str, name: str) -> Dict[str, Any]:
75
+ """
76
+ 获取特定聊天列表的内容
77
+
78
+ Args:
79
+ project_path: 项目路径
80
+ name: 聊天列表名称
81
+
82
+ Returns:
83
+ 聊天列表内容
84
+
85
+ Raises:
86
+ FileNotFoundError: 如果聊天列表不存在
87
+ Exception: 如果读取失败
88
+ """
89
+ file_path = _get_chat_list_file_path(project_path, name)
90
+ if not os.path.exists(file_path):
91
+ raise FileNotFoundError(f"Chat list {name} not found")
92
+
93
+ try:
94
+ async with aiofiles.open(file_path, 'r') as f:
95
+ content = await f.read()
96
+ return json.loads(content)
97
+ except json.JSONDecodeError as e:
98
+ logger.error(f"Invalid JSON in chat list {name}: {str(e)}")
99
+ raise Exception(f"Invalid JSON in chat list file: {str(e)}")
100
+ except Exception as e:
101
+ logger.error(f"Error reading chat list {name}: {str(e)}")
102
+ raise e
103
+
104
+ def get_chat_list_sync(project_path: str, name: str) -> Dict[str, Any]:
105
+ """
106
+ 获取特定聊天列表的内容(同步版本)
107
+
108
+ Args:
109
+ project_path: 项目路径
110
+ name: 聊天列表名称
111
+
112
+ Returns:
113
+ 聊天列表内容
114
+
115
+ Raises:
116
+ FileNotFoundError: 如果聊天列表不存在
117
+ Exception: 如果读取失败
118
+ """
119
+ file_path = _get_chat_list_file_path(project_path, name)
120
+ if not os.path.exists(file_path):
121
+ raise FileNotFoundError(f"Chat list {name} not found")
122
+
123
+ try:
124
+ with open(file_path, 'r', encoding='utf-8') as f:
125
+ content = f.read()
126
+ return json.loads(content)
127
+ except json.JSONDecodeError as e:
128
+ logger.error(f"Invalid JSON in chat list {name}: {str(e)}")
129
+ raise Exception(f"Invalid JSON in chat list file: {str(e)}")
130
+ except Exception as e:
131
+ logger.error(f"Error reading chat list {name}: {str(e)}")
132
+ raise e
133
+
134
+ async def delete_chat_list(project_path: str, name: str) -> None:
135
+ """
136
+ 删除聊天列表
137
+
138
+ Args:
139
+ project_path: 项目路径
140
+ name: 聊天列表名称
141
+
142
+ Raises:
143
+ FileNotFoundError: 如果聊天列表不存在
144
+ Exception: 如果删除失败
145
+ """
146
+ file_path = _get_chat_list_file_path(project_path, name)
147
+ if not os.path.exists(file_path):
148
+ raise FileNotFoundError(f"Chat list {name} not found")
149
+
150
+ try:
151
+ os.remove(file_path)
152
+ except Exception as e:
153
+ logger.error(f"Error deleting chat list {name}: {str(e)}")
154
+ raise e
155
+
156
+ async def rename_chat_list(project_path: str, old_name: str, new_name: str) -> None:
157
+ """
158
+ 重命名聊天列表
159
+
160
+ Args:
161
+ project_path: 项目路径
162
+ old_name: 旧的聊天列表名称
163
+ new_name: 新的聊天列表名称
164
+
165
+ Raises:
166
+ FileNotFoundError: 如果原聊天列表不存在
167
+ FileExistsError: 如果新名称的聊天列表已存在
168
+ Exception: 如果重命名失败
169
+ """
170
+ old_file_path = _get_chat_list_file_path(project_path, old_name)
171
+ new_file_path = _get_chat_list_file_path(project_path, new_name)
172
+
173
+ # 检查旧文件是否存在
174
+ if not os.path.exists(old_file_path):
175
+ raise FileNotFoundError(f"Chat list {old_name} not found")
176
+
177
+ # 检查新文件名是否已存在
178
+ if os.path.exists(new_file_path):
179
+ raise FileExistsError(f"Chat list with name {new_name} already exists")
180
+
181
+ try:
182
+ # 读取旧文件内容
183
+ async with aiofiles.open(old_file_path, 'r') as f:
184
+ content = await f.read()
185
+
186
+ # 写入新文件
187
+ async with aiofiles.open(new_file_path, 'w') as f:
188
+ await f.write(content)
189
+
190
+ # 删除旧文件
191
+ os.remove(old_file_path)
192
+ except Exception as e:
193
+ logger.error(f"Error renaming chat list from {old_name} to {new_name}: {str(e)}")
194
+ raise e
@@ -0,0 +1,142 @@
1
+ import os
2
+ import json
3
+ from fastapi import APIRouter, HTTPException, Request, Depends
4
+ import aiofiles
5
+ from auto_coder_web.types import ChatList
6
+ from pydantic import BaseModel
7
+ import asyncio
8
+ from loguru import logger
9
+ # 导入会话管理函数
10
+ from .chat_session_manager import read_session_name, write_session_name
11
+ # 导入聊天列表管理函数
12
+ from .chat_list_manager import save_chat_list, get_chat_lists, get_chat_list, delete_chat_list, rename_chat_list
13
+
14
+ class SessionNameRequest(BaseModel):
15
+ session_name: str
16
+ panel_id: str = "" # 添加panel_id字段,默认为空字符串
17
+
18
+
19
+ class RenameChatListRequest(BaseModel):
20
+ old_name: str
21
+ new_name: str
22
+
23
+
24
+ async def get_project_path(request: Request) -> str:
25
+ """
26
+ 从FastAPI请求上下文中获取项目路径
27
+ """
28
+ return request.app.state.project_path
29
+
30
+ router = APIRouter()
31
+
32
+
33
+ @router.post("/api/chat-lists/save")
34
+ async def save_chat_list_endpoint(chat_list: ChatList, project_path: str = Depends(get_project_path)):
35
+ try:
36
+ # 调用管理模块保存聊天列表
37
+ await save_chat_list(project_path, chat_list.name, chat_list.messages)
38
+ return {"status": "success", "message": f"Chat list {chat_list.name} saved successfully"}
39
+ except Exception as e:
40
+ raise HTTPException(status_code=500, detail=str(e))
41
+
42
+
43
+ @router.get("/api/chat-lists")
44
+ async def get_chat_lists_endpoint(project_path: str = Depends(get_project_path)):
45
+ try:
46
+ # 调用管理模块获取聊天列表
47
+ chat_lists = await get_chat_lists(project_path)
48
+ return {"chat_lists": chat_lists}
49
+ except Exception as e:
50
+ raise HTTPException(status_code=500, detail=str(e))
51
+
52
+
53
+ @router.get("/api/chat-lists/{name}")
54
+ async def get_chat_list_endpoint(name: str, project_path: str = Depends(get_project_path)):
55
+ try:
56
+ # 调用管理模块获取特定聊天列表
57
+ return await get_chat_list(project_path, name)
58
+ except FileNotFoundError:
59
+ raise HTTPException(status_code=404, detail=f"Chat list {name} not found")
60
+ except Exception as e:
61
+ raise HTTPException(status_code=500, detail=str(e))
62
+
63
+
64
+ @router.delete("/api/chat-lists/{name}")
65
+ async def delete_chat_list_endpoint(name: str, project_path: str = Depends(get_project_path)):
66
+ try:
67
+ # 调用管理模块删除聊天列表
68
+ await delete_chat_list(project_path, name)
69
+ return {"status": "success", "message": f"Chat list {name} deleted successfully"}
70
+ except FileNotFoundError:
71
+ raise HTTPException(status_code=404, detail=f"Chat list {name} not found")
72
+ except Exception as e:
73
+ raise HTTPException(status_code=500, detail=str(e))
74
+
75
+
76
+ @router.get("/api/chat-session/name")
77
+ async def get_current_session_name(panel_id: str = "", project_path: str = Depends(get_project_path)):
78
+ """
79
+ 获取当前会话名称
80
+
81
+ Args:
82
+ panel_id: 可选的面板ID,用于区分不同的聊天面板
83
+ project_path: 项目路径
84
+ """
85
+ try:
86
+ # 调用新的函数读取会话名称
87
+ session_name = await read_session_name(project_path, panel_id)
88
+ return {"session_name": session_name}
89
+
90
+ except Exception as e:
91
+ # 如果发生错误,记录错误但返回空会话名 (read_session_name内部已处理部分错误)
92
+ logger.error(f"Error in get_current_session_name endpoint: {str(e)}")
93
+ return {"session_name": ""}
94
+
95
+
96
+ @router.post("/api/chat-session/name")
97
+ async def set_current_session_name(request: SessionNameRequest, project_path: str = Depends(get_project_path)):
98
+ """
99
+ 设置当前会话名称
100
+
101
+ Args:
102
+ request: 包含会话名称和可选面板ID的请求
103
+ project_path: 项目路径
104
+ """
105
+ try:
106
+ # 调用新的函数写入会话名称
107
+ await write_session_name(project_path, request.session_name, request.panel_id)
108
+ return {"status": "success", "message": "Current session name updated"}
109
+
110
+ except Exception as e:
111
+ raise HTTPException(status_code=500, detail=f"Failed to set current session name: {str(e)}")
112
+
113
+
114
+ @router.post("/api/chat-lists/rename")
115
+ async def rename_chat_list_endpoint(request: RenameChatListRequest, project_path: str = Depends(get_project_path)):
116
+ """
117
+ 重命名聊天列表
118
+
119
+ 将现有聊天列表从旧名称重命名为新名称
120
+ """
121
+ try:
122
+ # 调用管理模块重命名聊天列表
123
+ await rename_chat_list(project_path, request.old_name, request.new_name)
124
+
125
+ # 如果当前会话名称是旧名称,则更新为新名称
126
+ # 注意:这里只更新默认的会话文件(panel_id="")
127
+ # 如果需要根据panel_id更新所有相关会话文件,逻辑会更复杂
128
+ try:
129
+ current_session_name = await read_session_name(project_path, panel_id="") # P读取默认会话
130
+ if current_session_name == request.old_name:
131
+ await write_session_name(project_path, request.new_name, panel_id="") # 更新默认会话
132
+ except Exception as e:
133
+ # 记录错误,但不影响重命名操作的主要流程
134
+ logger.error(f"Error updating default current session name during rename: {str(e)}")
135
+
136
+ return {"status": "success", "message": f"Chat list renamed from {request.old_name} to {request.new_name}"}
137
+ except FileNotFoundError:
138
+ raise HTTPException(status_code=404, detail=f"Chat list {request.old_name} not found")
139
+ except FileExistsError:
140
+ raise HTTPException(status_code=409, detail=f"Chat list with name {request.new_name} already exists")
141
+ except Exception as e:
142
+ raise HTTPException(status_code=500, detail=f"Failed to rename chat list: {str(e)}")
@@ -0,0 +1,111 @@
1
+ import os
2
+ import json
3
+ import aiofiles
4
+ from loguru import logger
5
+
6
+ def _get_session_file_path(project_path: str, panel_id: str = "") -> str:
7
+ """获取会话信息文件的完整路径"""
8
+ session_dir = os.path.join(project_path, ".auto-coder", "auto-coder.web")
9
+ os.makedirs(session_dir, exist_ok=True)
10
+ file_name = "current-session.json" if not panel_id else f"current-session-{panel_id}.json"
11
+ return os.path.join(session_dir, file_name)
12
+
13
+ async def read_session_name(project_path: str, panel_id: str = "") -> str:
14
+ """
15
+ 从文件读取当前会话名称
16
+
17
+ Args:
18
+ project_path: 项目路径
19
+ panel_id: 可选的面板ID
20
+
21
+ Returns:
22
+ 当前会话名称,如果文件不存在或出错则返回空字符串
23
+ """
24
+ session_file = _get_session_file_path(project_path, panel_id)
25
+
26
+ if not os.path.exists(session_file):
27
+ return ""
28
+
29
+ try:
30
+ async with aiofiles.open(session_file, 'r') as f:
31
+ content = await f.read()
32
+ session_data = json.loads(content)
33
+ return session_data.get("session_name", "")
34
+ except Exception as e:
35
+ logger.error(f"Error reading session name from {session_file}: {str(e)}")
36
+ return ""
37
+
38
+ def read_session_name_sync(project_path: str, panel_id: str = "") -> str:
39
+ """
40
+ 从文件读取当前会话名称(同步版本)
41
+
42
+ Args:
43
+ project_path: 项目路径
44
+ panel_id: 可选的面板ID
45
+
46
+ Returns:
47
+ 当前会话名称,如果文件不存在或出错则返回空字符串
48
+ """
49
+ session_file = _get_session_file_path(project_path, panel_id)
50
+
51
+ if not os.path.exists(session_file):
52
+ return ""
53
+
54
+ try:
55
+ with open(session_file, 'r', encoding='utf-8') as f:
56
+ content = f.read()
57
+ session_data = json.loads(content)
58
+ return session_data.get("session_name", "")
59
+ except Exception as e:
60
+ logger.error(f"Error reading session name from {session_file}: {str(e)}")
61
+ return ""
62
+
63
+ async def write_session_name(project_path: str, session_name: str, panel_id: str = ""):
64
+ """
65
+ 将当前会话名称写入文件
66
+
67
+ Args:
68
+ project_path: 项目路径
69
+ session_name: 要写入的会话名称
70
+ panel_id: 可选的面板ID
71
+
72
+ Raises:
73
+ Exception: 如果写入文件失败
74
+ """
75
+ session_file = _get_session_file_path(project_path, panel_id)
76
+
77
+ session_data = {
78
+ "session_name": session_name,
79
+ "panel_id": panel_id
80
+ }
81
+ try:
82
+ async with aiofiles.open(session_file, 'w') as f:
83
+ await f.write(json.dumps(session_data, indent=2, ensure_ascii=False))
84
+ except Exception as e:
85
+ logger.error(f"Error writing session name to {session_file}: {str(e)}")
86
+ raise e
87
+
88
+ def write_session_name_sync(project_path: str, session_name: str, panel_id: str = ""):
89
+ """
90
+ 将当前会话名称写入文件(同步版本)
91
+
92
+ Args:
93
+ project_path: 项目路径
94
+ session_name: 要写入的会话名称
95
+ panel_id: 可选的面板ID
96
+
97
+ Raises:
98
+ Exception: 如果写入文件失败
99
+ """
100
+ session_file = _get_session_file_path(project_path, panel_id)
101
+
102
+ session_data = {
103
+ "session_name": session_name,
104
+ "panel_id": panel_id
105
+ }
106
+ try:
107
+ with open(session_file, 'w', encoding='utf-8') as f:
108
+ f.write(json.dumps(session_data, indent=2, ensure_ascii=False))
109
+ except Exception as e:
110
+ logger.error(f"Error writing session name to {session_file}: {str(e)}")
111
+ raise e
@@ -4,8 +4,10 @@ from fastapi import APIRouter, Request, HTTPException, Depends
4
4
  from autocoder.agent.auto_filegroup import AutoFileGroup
5
5
  from autocoder.utils import operate_config_api
6
6
  from autocoder.auto_coder_runner import get_memory,save_memory, load_memory
7
- import json
8
7
  import os
8
+ from autocoder.rag.token_counter import count_tokens
9
+ import aiofiles
10
+ from loguru import logger
9
11
 
10
12
  router = APIRouter()
11
13
 
@@ -145,6 +147,31 @@ async def auto_create_groups(
145
147
  raise HTTPException(status_code=500, detail=str(e))
146
148
 
147
149
 
150
+ async def count_tokens_from_file(file_path: str) -> int:
151
+ """异步计算文件的token数
152
+
153
+ Args:
154
+ file_path: 文件的绝对路径
155
+
156
+ Returns:
157
+ int: token数量,出错时返回0
158
+ """
159
+ try:
160
+ if not os.path.exists(file_path):
161
+ logger.warning(f"文件不存在: {file_path}")
162
+ return 0
163
+
164
+ logger.info(f"计算文件token: {file_path}")
165
+ async with aiofiles.open(file_path, 'r', encoding='utf-8') as f:
166
+ content = await f.read()
167
+
168
+ file_tokens = count_tokens(content)
169
+ return file_tokens if file_tokens > 0 else 0
170
+ except Exception as e:
171
+ logger.error(f"读取或计算文件token出错: {file_path}, 错误: {str(e)}")
172
+ return 0
173
+
174
+
148
175
  @router.post("/api/file-groups/switch")
149
176
  async def switch_file_groups(
150
177
  request: Request,
@@ -156,12 +183,38 @@ async def switch_file_groups(
156
183
 
157
184
  # Convert relative file paths to absolute paths
158
185
  absolute_file_paths = []
186
+ total_tokens = 0
187
+
159
188
  for file_path in file_paths:
160
189
  absolute_path = os.path.join(project_path, file_path)
161
190
  absolute_file_paths.append(absolute_path)
162
191
 
192
+ # 计算所有文件的tokens
193
+ token_tasks = []
194
+
195
+ # 收集组里的文件
196
+ for group_name in group_names:
197
+ memory = get_memory()
198
+ files = memory["current_files"]["groups"].get(group_name, [])
199
+ for file_path in files:
200
+ token_tasks.append(count_tokens_from_file(file_path))
201
+
202
+ # 收集额外的文件
203
+ for file_path in absolute_file_paths:
204
+ token_tasks.append(count_tokens_from_file(file_path))
205
+
206
+ # 异步等待所有token计算任务完成
207
+ if token_tasks:
208
+ token_results = await asyncio.gather(*token_tasks)
209
+ total_tokens = sum(token_results)
210
+
163
211
  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"}
212
+ return {
213
+ "status": "success",
214
+ "message": f"Switched to groups: {group_names} and additional files",
215
+ "total_tokens": total_tokens,
216
+ "absolute_file_paths": absolute_file_paths
217
+ }
165
218
 
166
219
 
167
220
  @router.delete("/api/file-groups/{name}")
@@ -19,14 +19,13 @@ 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, editable_preview_router, mcp_router, direct_chat_router, rules_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, direct_chat_router, rules_router, chat_panels_router, code_editor_tabs_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 auto_coder_web.common_router import active_context_router
26
26
  from rich.console import Console
27
27
  from loguru import logger
28
28
  from auto_coder_web.lang import get_message
29
- from auto_coder_web.file_cacher.filecacher import FileCacher
30
29
 
31
30
  class ProxyServer:
32
31
  def __init__(self, project_path: str, quick: bool = False, product_mode: str = "pro"):
@@ -111,6 +110,8 @@ class ProxyServer:
111
110
  self.app.include_router(active_context_router.router)
112
111
  self.app.include_router(direct_chat_router.router)
113
112
  self.app.include_router(rules_router.router)
113
+ self.app.include_router(chat_panels_router.router)
114
+ self.app.include_router(code_editor_tabs_router.router)
114
115
 
115
116
  @self.app.on_event("shutdown")
116
117
  async def shutdown_event():
@@ -14,8 +14,13 @@ from autocoder.events import event_content as EventContentCreator
14
14
  from autocoder.events.event_types import EventType
15
15
  from byzerllm.utils.langutil import asyncfy_with_semaphore
16
16
  from autocoder.common.global_cancel import global_cancel, CancelRequestedException
17
+ from autocoder.common.file_checkpoint.manager import FileChangeManager
17
18
  from loguru import logger
18
19
  import byzerllm
20
+ # 导入聊天会话和聊天列表管理器
21
+ from auto_coder_web.common_router.chat_session_manager import read_session_name_sync
22
+ from auto_coder_web.common_router.chat_list_manager import get_chat_list_sync
23
+
19
24
  router = APIRouter()
20
25
 
21
26
  # 创建线程池
@@ -25,6 +30,7 @@ class AutoCommandRequest(BaseModel):
25
30
  command: str
26
31
  include_conversation_history: bool = True
27
32
  buildin_conversation_history: bool = False
33
+ panel_id: Optional[str] = None
28
34
 
29
35
  class EventPollRequest(BaseModel):
30
36
  event_file_id:str
@@ -102,40 +108,39 @@ async def auto_command(request: AutoCommandRequest, project_path: str = Depends(
102
108
 
103
109
  if request.include_conversation_history:
104
110
  # 获取当前会话名称
105
- current_session_file = os.path.join(project_path, ".auto-coder", "auto-coder.web", "current-session.json")
111
+ panel_id = request.panel_id or ""
106
112
  current_session_name = ""
107
- if os.path.exists(current_session_file):
108
- try:
109
- with open(current_session_file, 'r',encoding="utf-8") as f:
110
- session_data = json.load(f)
111
- current_session_name = session_data.get("session_name", "")
112
- except Exception as e:
113
- logger.error(f"Error reading current session: {str(e)}")
114
- logger.exception(e)
113
+ try:
114
+ # 使用chat_session_manager模块获取当前会话名称
115
+ # 使用同步版本的函数,避免在线程中使用asyncio.run
116
+ current_session_name = read_session_name_sync(project_path, panel_id)
117
+ except Exception as e:
118
+ logger.error(f"Error reading current session: {str(e)}")
119
+ logger.exception(e)
115
120
 
116
121
  # 获取历史消息
117
122
  messages = []
118
123
  if current_session_name:
119
- chat_list_file = os.path.join(project_path, ".auto-coder", "auto-coder.web", "chat-lists", f"{current_session_name}.json")
120
- logger.info(f"loading chat history from {chat_list_file}")
121
- if os.path.exists(chat_list_file):
122
- try:
123
- with open(chat_list_file, 'r', encoding="utf-8") as f:
124
- chat_data = json.load(f)
125
- # 从聊天历史中提取消息
126
- for msg in chat_data.get("messages", []):
127
- # if msg.get("metadata",{}).get("stream_out_type","") == "/agent/edit":
128
- # messages.append(msg)
129
- # continue
130
-
131
- # if msg.get("type","") not in ["USER_RESPONSE","RESULT","COMPLETION"]:
132
- # continue
133
- if msg.get("contentType","") in ["token_stat"]:
134
- continue
135
- messages.append(msg)
136
- except Exception as e:
137
- logger.error(f"Error reading chat history: {str(e)}")
138
- logger.exception(e)
124
+ try:
125
+ # 使用chat_list_manager模块获取聊天列表内容
126
+ logger.info(f"Loading chat history for session: {current_session_name}")
127
+ # 使用同步版本的函数,避免在线程中使用asyncio.run
128
+ chat_data = get_chat_list_sync(project_path, current_session_name)
129
+
130
+ # 从聊天历史中提取消息
131
+ for msg in chat_data.get("messages", []):
132
+ # if msg.get("metadata",{}).get("stream_out_type","") == "/agent/edit":
133
+ # messages.append(msg)
134
+ # continue
135
+
136
+ # if msg.get("type","") not in ["USER_RESPONSE","RESULT","COMPLETION"]:
137
+ # continue
138
+ if msg.get("contentType","") in ["token_stat"]:
139
+ continue
140
+ messages.append(msg)
141
+ except Exception as e:
142
+ logger.error(f"Error reading chat history: {str(e)}")
143
+ logger.exception(e)
139
144
 
140
145
  if messages:
141
146
  # 调用coding_prompt生成包含历史消息的提示
@@ -380,6 +385,16 @@ async def cancel_task(request: CancelTaskRequest, project_path: str = Depends(ge
380
385
  event_file = get_event_file_path(file_id=event_file_id, project_path=project_path)
381
386
  global_cancel.set(token=event_file)
382
387
  event_manager = get_event_manager(event_file)
388
+ file_change_manager = FileChangeManager(project_dir=project_path,
389
+ backup_dir=os.path.join(project_path,".auto-coder","checkpoint"),
390
+ store_dir=os.path.join(project_path,".auto-coder","checkpoint_store"),
391
+ max_history=50)
392
+ undo_result = file_change_manager.undo_change_group(group_id=event_file)
393
+ if not undo_result.success:
394
+ logger.error(f"Error in undo change group: {undo_result.errors}")
395
+ raise Exception(f"Error in undo change group: {undo_result.errors}")
396
+ else:
397
+ logger.info(f"Undo change group {event_file} successfully {undo_result.restored_files}")
383
398
 
384
399
  # 向事件流写入取消事件
385
400
  event_manager.write_error(