auto-coder-web 0.1.25__tar.gz → 0.1.27__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/PKG-INFO +1 -1
  2. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/auto_coder_runner_wrapper.py +5 -1
  3. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/auto_coder_conf_router.py +11 -14
  4. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/chat_list_router.py +24 -14
  5. auto_coder_web-0.1.27/src/auto_coder_web/common_router/completions_router.py +166 -0
  6. auto_coder_web-0.1.27/src/auto_coder_web/common_router/file_group_router.py +209 -0
  7. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/file_router.py +1 -0
  8. auto_coder_web-0.1.27/src/auto_coder_web/lang.py +35 -0
  9. auto_coder_web-0.1.27/src/auto_coder_web/proxy.py +304 -0
  10. auto_coder_web-0.1.27/src/auto_coder_web/version.py +1 -0
  11. auto_coder_web-0.1.27/src/auto_coder_web/web/asset-manifest.json +15 -0
  12. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/index.html +1 -1
  13. auto_coder_web-0.1.27/src/auto_coder_web/web/static/css/main.8a602674.css +6 -0
  14. auto_coder_web-0.1.27/src/auto_coder_web/web/static/css/main.8a602674.css.map +1 -0
  15. auto_coder_web-0.1.25/src/auto_coder_web/web/static/js/main.66c37ccf.js → auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js +3 -3
  16. auto_coder_web-0.1.25/src/auto_coder_web/web/static/js/main.66c37ccf.js.LICENSE.txt → auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js.LICENSE.txt +4 -2
  17. auto_coder_web-0.1.25/src/auto_coder_web/web/static/js/main.66c37ccf.js.map → auto_coder_web-0.1.27/src/auto_coder_web/web/static/js/main.c14e8b91.js.map +1 -1
  18. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/PKG-INFO +1 -1
  19. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/SOURCES.txt +6 -5
  20. auto_coder_web-0.1.25/src/auto_coder_web/common_router/completions_router.py +0 -53
  21. auto_coder_web-0.1.25/src/auto_coder_web/common_router/file_group_router.py +0 -120
  22. auto_coder_web-0.1.25/src/auto_coder_web/proxy.py +0 -551
  23. auto_coder_web-0.1.25/src/auto_coder_web/version.py +0 -1
  24. auto_coder_web-0.1.25/src/auto_coder_web/web/asset-manifest.json +0 -15
  25. auto_coder_web-0.1.25/src/auto_coder_web/web/static/css/main.95277c5f.css +0 -6
  26. auto_coder_web-0.1.25/src/auto_coder_web/web/static/css/main.95277c5f.css.map +0 -1
  27. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/README.md +0 -0
  28. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/setup.cfg +0 -0
  29. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/setup.py +0 -0
  30. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/__init__.py +0 -0
  31. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/auto_coder_runner.py +0 -0
  32. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/common_router/__init__.py +0 -0
  33. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/file_group.py +0 -0
  34. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/file_manager.py +0 -0
  35. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/json_file_storage.py +0 -0
  36. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/__init__.py +0 -0
  37. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/auto_router.py +0 -0
  38. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/chat_router.py +0 -0
  39. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/coding_router.py +0 -0
  40. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/commit_router.py +0 -0
  41. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/config_router.py +0 -0
  42. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/settings_router.py +0 -0
  43. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/routers/todo_router.py +0 -0
  44. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/terminal.py +0 -0
  45. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/types.py +0 -0
  46. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/favicon.ico +0 -0
  47. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/logo192.png +0 -0
  48. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/logo512.png +0 -0
  49. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/manifest.json +0 -0
  50. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  51. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/base/worker/workerMain.js +0 -0
  52. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/abap/abap.js +0 -0
  53. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/apex/apex.js +0 -0
  54. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/azcli/azcli.js +0 -0
  55. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bat/bat.js +0 -0
  56. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/bicep/bicep.js +0 -0
  57. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cameligo/cameligo.js +0 -0
  58. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/clojure/clojure.js +0 -0
  59. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/coffee/coffee.js +0 -0
  60. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cpp/cpp.js +0 -0
  61. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csharp/csharp.js +0 -0
  62. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/csp/csp.js +0 -0
  63. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/css/css.js +0 -0
  64. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/cypher/cypher.js +0 -0
  65. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dart/dart.js +0 -0
  66. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/dockerfile/dockerfile.js +0 -0
  67. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ecl/ecl.js +0 -0
  68. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/elixir/elixir.js +0 -0
  69. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/flow9/flow9.js +0 -0
  70. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/freemarker2/freemarker2.js +0 -0
  71. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/fsharp/fsharp.js +0 -0
  72. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/go/go.js +0 -0
  73. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/graphql/graphql.js +0 -0
  74. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/handlebars/handlebars.js +0 -0
  75. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/hcl/hcl.js +0 -0
  76. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/html/html.js +0 -0
  77. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ini/ini.js +0 -0
  78. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/java/java.js +0 -0
  79. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/javascript/javascript.js +0 -0
  80. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/julia/julia.js +0 -0
  81. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/kotlin/kotlin.js +0 -0
  82. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/less/less.js +0 -0
  83. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lexon/lexon.js +0 -0
  84. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/liquid/liquid.js +0 -0
  85. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/lua/lua.js +0 -0
  86. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/m3/m3.js +0 -0
  87. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/markdown/markdown.js +0 -0
  88. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mdx/mdx.js +0 -0
  89. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mips/mips.js +0 -0
  90. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/msdax/msdax.js +0 -0
  91. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/mysql/mysql.js +0 -0
  92. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/objective-c/objective-c.js +0 -0
  93. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascal/pascal.js +0 -0
  94. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pascaligo/pascaligo.js +0 -0
  95. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/perl/perl.js +0 -0
  96. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pgsql/pgsql.js +0 -0
  97. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/php/php.js +0 -0
  98. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pla/pla.js +0 -0
  99. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/postiats/postiats.js +0 -0
  100. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powerquery/powerquery.js +0 -0
  101. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/powershell/powershell.js +0 -0
  102. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/protobuf/protobuf.js +0 -0
  103. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/pug/pug.js +0 -0
  104. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/python/python.js +0 -0
  105. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/qsharp/qsharp.js +0 -0
  106. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/r/r.js +0 -0
  107. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/razor/razor.js +0 -0
  108. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redis/redis.js +0 -0
  109. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/redshift/redshift.js +0 -0
  110. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/restructuredtext/restructuredtext.js +0 -0
  111. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/ruby/ruby.js +0 -0
  112. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/rust/rust.js +0 -0
  113. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sb/sb.js +0 -0
  114. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scala/scala.js +0 -0
  115. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scheme/scheme.js +0 -0
  116. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/scss/scss.js +0 -0
  117. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/shell/shell.js +0 -0
  118. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/solidity/solidity.js +0 -0
  119. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sophia/sophia.js +0 -0
  120. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sparql/sparql.js +0 -0
  121. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/sql/sql.js +0 -0
  122. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/st/st.js +0 -0
  123. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/swift/swift.js +0 -0
  124. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/systemverilog/systemverilog.js +0 -0
  125. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/tcl/tcl.js +0 -0
  126. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/twig/twig.js +0 -0
  127. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typescript/typescript.js +0 -0
  128. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/typespec/typespec.js +0 -0
  129. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/vb/vb.js +0 -0
  130. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/wgsl/wgsl.js +0 -0
  131. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/xml/xml.js +0 -0
  132. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/basic-languages/yaml/yaml.js +0 -0
  133. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.css +0 -0
  134. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/editor/editor.main.js +0 -0
  135. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssMode.js +0 -0
  136. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/css/cssWorker.js +0 -0
  137. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlMode.js +0 -0
  138. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/html/htmlWorker.js +0 -0
  139. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonMode.js +0 -0
  140. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/json/jsonWorker.js +0 -0
  141. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsMode.js +0 -0
  142. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/language/typescript/tsWorker.js +0 -0
  143. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/loader.js +0 -0
  144. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.de.js +0 -0
  145. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.es.js +0 -0
  146. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.fr.js +0 -0
  147. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.it.js +0 -0
  148. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ja.js +0 -0
  149. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ko.js +0 -0
  150. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.ru.js +0 -0
  151. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-cn.js +0 -0
  152. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/monaco-editor/min/vs/nls.messages.zh-tw.js +0 -0
  153. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/robots.txt +0 -0
  154. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/static/js/453.d855a71b.chunk.js +0 -0
  155. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web/web/static/js/453.d855a71b.chunk.js.map +0 -0
  156. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/dependency_links.txt +0 -0
  157. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/entry_points.txt +0 -0
  158. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/requires.txt +0 -0
  159. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/auto_coder_web.egg-info/top_level.txt +0 -0
  160. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/expert_routers/__init__.py +0 -0
  161. {auto_coder_web-0.1.25 → auto_coder_web-0.1.27}/src/expert_routers/history_router.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto_coder_web
3
- Version: 0.1.25
3
+ Version: 0.1.27
4
4
  Summary: auto-coder.web: A Python Project
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.9
@@ -45,7 +45,11 @@ class AutoCoderRunnerWrapper:
45
45
  return auto_command(command,params)
46
46
 
47
47
  def configure_wrapper(self,conf: str, skip_print=False ):
48
- return configure(conf, skip_print)
48
+ return configure(conf, skip_print)
49
+
50
+ def get_conf_wrapper(self):
51
+ memory = get_memory()
52
+ return memory["conf"]
49
53
 
50
54
 
51
55
  def coding_wapper(self,query):
@@ -1,42 +1,39 @@
1
1
  from fastapi import APIRouter, Request, HTTPException, Depends
2
+ from autocoder.auto_coder_runner import get_memory, configure
2
3
 
3
4
  router = APIRouter()
4
5
 
5
- async def get_auto_coder_runner(request: Request):
6
- """获取AutoCoderRunner实例作为依赖"""
7
- return request.app.state.auto_coder_runner
8
6
 
9
7
  @router.get("/api/conf")
10
- async def get_conf(
11
- auto_coder_runner = Depends(get_auto_coder_runner)
12
- ):
8
+ async def get_conf():
13
9
  """获取配置信息"""
14
- return {"conf": auto_coder_runner.get_config()}
10
+ memory = get_memory()
11
+ return {"conf": memory["conf"]}
12
+
15
13
 
16
14
  @router.post("/api/conf")
17
15
  async def config(
18
16
  request: Request,
19
- auto_coder_runner = Depends(get_auto_coder_runner)
20
17
  ):
21
18
  """更新配置信息"""
22
19
  data = await request.json()
23
20
  try:
24
21
  for key, value in data.items():
25
- auto_coder_runner.configure(key, str(value))
22
+ configure(f"{key}:{str(value)}")
26
23
  return {"status": "success"}
27
24
  except Exception as e:
28
25
  raise HTTPException(status_code=400, detail=str(e))
29
26
 
27
+
30
28
  @router.delete("/api/conf/{key}")
31
29
  async def delete_config(
32
- key: str,
33
- auto_coder_runner = Depends(get_auto_coder_runner)
30
+ key: str
34
31
  ):
35
32
  """删除配置项"""
36
33
  try:
37
- result = auto_coder_runner.drop_config(key)
38
- return result
34
+ configure(f"/drop {key}")
35
+ return {"status": "success"}
39
36
  except ValueError as e:
40
37
  raise HTTPException(status_code=404, detail=str(e))
41
38
  except Exception as e:
42
- raise HTTPException(status_code=400, detail=str(e))
39
+ raise HTTPException(status_code=400, detail=str(e))
@@ -1,31 +1,39 @@
1
1
  import os
2
2
  import json
3
- from fastapi import APIRouter, HTTPException
3
+ from fastapi import APIRouter, HTTPException, Request, Depends
4
4
  import aiofiles
5
5
  from auto_coder_web.types import ChatList
6
6
 
7
+
8
+ async def get_project_path(request: Request) -> str:
9
+ """
10
+ 从FastAPI请求上下文中获取项目路径
11
+ """
12
+ return request.app.state.project_path
13
+
7
14
  router = APIRouter()
8
15
 
16
+
9
17
  @router.post("/api/chat-lists/save")
10
- async def save_chat_list(chat_list: ChatList):
18
+ async def save_chat_list(chat_list: ChatList, project_path: str = Depends(get_project_path)):
11
19
  try:
12
- chat_lists_dir = os.path.join(
13
- ".auto-coder", "auto-coder.web", "chat-lists")
20
+ chat_lists_dir = os.path.join(project_path,
21
+ ".auto-coder", "auto-coder.web", "chat-lists")
14
22
  os.makedirs(chat_lists_dir, exist_ok=True)
15
23
 
16
- file_path = os.path.join(
17
- chat_lists_dir, f"{chat_list.name}.json")
24
+ file_path = os.path.join(chat_lists_dir, f"{chat_list.name}.json")
18
25
  async with aiofiles.open(file_path, 'w') as f:
19
- await f.write(json.dumps({"messages": chat_list.messages}, indent=2))
26
+ await f.write(json.dumps({"messages": chat_list.messages}, indent=2, ensure_ascii=False))
20
27
  return {"status": "success", "message": f"Chat list {chat_list.name} saved successfully"}
21
28
  except Exception as e:
22
29
  raise HTTPException(status_code=500, detail=str(e))
23
30
 
31
+
24
32
  @router.get("/api/chat-lists")
25
- async def get_chat_lists():
33
+ async def get_chat_lists(project_path: str = Depends(get_project_path)):
26
34
  try:
27
35
  chat_lists_dir = os.path.join(
28
- ".auto-coder", "auto-coder.web", "chat-lists")
36
+ project_path, ".auto-coder", "auto-coder.web", "chat-lists")
29
37
  os.makedirs(chat_lists_dir, exist_ok=True)
30
38
 
31
39
  # Get files with their modification times
@@ -45,11 +53,12 @@ async def get_chat_lists():
45
53
  except Exception as e:
46
54
  raise HTTPException(status_code=500, detail=str(e))
47
55
 
56
+
48
57
  @router.get("/api/chat-lists/{name}")
49
- async def get_chat_list(name: str):
58
+ async def get_chat_list(name: str, project_path: str = Depends(get_project_path)):
50
59
  try:
51
60
  file_path = os.path.join(
52
- ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
61
+ project_path, ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
53
62
  if not os.path.exists(file_path):
54
63
  raise HTTPException(
55
64
  status_code=404, detail=f"Chat list {name} not found")
@@ -60,11 +69,12 @@ async def get_chat_list(name: str):
60
69
  except Exception as e:
61
70
  raise HTTPException(status_code=500, detail=str(e))
62
71
 
72
+
63
73
  @router.delete("/api/chat-lists/{name}")
64
- async def delete_chat_list(name: str):
74
+ async def delete_chat_list(name: str, project_path: str = Depends(get_project_path)):
65
75
  try:
66
76
  file_path = os.path.join(
67
- ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
77
+ project_path, ".auto-coder", "auto-coder.web", "chat-lists", f"{name}.json")
68
78
  if not os.path.exists(file_path):
69
79
  raise HTTPException(
70
80
  status_code=404, detail=f"Chat list {name} not found")
@@ -72,4 +82,4 @@ async def delete_chat_list(name: str):
72
82
  os.remove(file_path)
73
83
  return {"status": "success", "message": f"Chat list {name} deleted successfully"}
74
84
  except Exception as e:
75
- raise HTTPException(status_code=500, detail=str(e))
85
+ raise HTTPException(status_code=500, detail=str(e))
@@ -0,0 +1,166 @@
1
+ import os
2
+ import glob
3
+ import json
4
+ from typing import List
5
+ from pydantic import BaseModel
6
+ from fastapi import APIRouter, Query, Request, Depends
7
+ from auto_coder_web.types import CompletionItem, CompletionResponse
8
+ from autocoder.index.symbols_utils import (
9
+ extract_symbols,
10
+ symbols_info_to_str,
11
+ SymbolsInfo,
12
+ SymbolType,
13
+ )
14
+
15
+ from autocoder.auto_coder_runner import get_memory
16
+ import json
17
+ import asyncio
18
+
19
+
20
+ router = APIRouter()
21
+
22
+ class SymbolItem(BaseModel):
23
+ symbol_name: str
24
+ symbol_type: SymbolType
25
+ file_name: str
26
+
27
+ async def get_auto_coder_runner(request: Request):
28
+ """获取AutoCoderRunner实例作为依赖"""
29
+ return request.app.state.auto_coder_runner
30
+
31
+
32
+ async def get_project_path(request: Request):
33
+ """获取项目路径作为依赖"""
34
+ return request.app.state.project_path
35
+
36
+ def find_files_in_project(patterns: List[str], project_path: str) -> List[str]:
37
+ memory = get_memory()
38
+ default_exclude_dirs = [".git", "node_modules", "dist", "build", "__pycache__",".venv"]
39
+ active_file_list = memory["current_files"]["files"]
40
+
41
+ project_root = project_path
42
+ matched_files = []
43
+
44
+ if len(patterns) == 1 and patterns[0] == "":
45
+ return active_file_list
46
+
47
+ for pattern in patterns:
48
+ for file_path in active_file_list:
49
+ if pattern in os.path.basename(file_path):
50
+ matched_files.append(file_path)
51
+
52
+ final_exclude_dirs = default_exclude_dirs + \
53
+ memory.get("exclude_dirs", [])
54
+
55
+ for pattern in patterns:
56
+ if "*" in pattern or "?" in pattern:
57
+ for file_path in glob.glob(pattern, recursive=True):
58
+ if os.path.isfile(file_path):
59
+ abs_path = os.path.abspath(file_path)
60
+ if not any(
61
+ exclude_dir in abs_path.split(os.sep)
62
+ for exclude_dir in final_exclude_dirs
63
+ ):
64
+ matched_files.append(abs_path)
65
+ else:
66
+ is_added = False
67
+ for root, dirs, files in os.walk(project_root, followlinks=True):
68
+ dirs[:] = [d for d in dirs if d not in final_exclude_dirs]
69
+ if pattern in files:
70
+ matched_files.append(os.path.join(root, pattern))
71
+ is_added = True
72
+ else:
73
+ for file in files:
74
+ if pattern in os.path.join(root, file):
75
+ matched_files.append(os.path.join(root, file))
76
+ is_added = True
77
+ if not is_added:
78
+ matched_files.append(pattern)
79
+
80
+ return list(set(matched_files))
81
+
82
+ def get_symbol_list(project_path: str) -> List[SymbolItem]:
83
+ list_of_symbols = []
84
+ index_file = os.path.join(
85
+ project_path, ".auto-coder", "index.json")
86
+
87
+ if os.path.exists(index_file):
88
+ with open(index_file, "r") as file:
89
+ index_data = json.load(file)
90
+ else:
91
+ index_data = {}
92
+
93
+ for item in index_data.values():
94
+ symbols_str = item["symbols"]
95
+ module_name = item["module_name"]
96
+ info1 = extract_symbols(symbols_str)
97
+ for name in info1.classes:
98
+ list_of_symbols.append(
99
+ SymbolItem(
100
+ symbol_name=name,
101
+ symbol_type=SymbolType.CLASSES,
102
+ file_name=module_name,
103
+ )
104
+ )
105
+ for name in info1.functions:
106
+ list_of_symbols.append(
107
+ SymbolItem(
108
+ symbol_name=name,
109
+ symbol_type=SymbolType.FUNCTIONS,
110
+ file_name=module_name,
111
+ )
112
+ )
113
+ for name in info1.variables:
114
+ list_of_symbols.append(
115
+ SymbolItem(
116
+ symbol_name=name,
117
+ symbol_type=SymbolType.VARIABLES,
118
+ file_name=module_name,
119
+ )
120
+ )
121
+ return list_of_symbols
122
+
123
+ @router.get("/api/completions/files")
124
+ async def get_file_completions(
125
+ name: str = Query(...),
126
+ project_path: str = Depends(get_project_path)
127
+ ):
128
+ """获取文件名补全"""
129
+ patterns = [name]
130
+ matches = await asyncio.to_thread(find_files_in_project, patterns,project_path)
131
+ completions = []
132
+ project_root = project_path
133
+ for file_name in matches:
134
+ path_parts = file_name.split(os.sep)
135
+ # 只显示最后三层路径,让显示更简洁
136
+ display_name = os.sep.join(
137
+ path_parts[-3:]) if len(path_parts) > 3 else file_name
138
+ relative_path = os.path.relpath(file_name, project_root)
139
+
140
+ completions.append(CompletionItem(
141
+ name=relative_path, # 给补全项一个唯一标识
142
+ path=relative_path, # 实际用于替换的路径
143
+ display=display_name, # 显示的简短路径
144
+ location=relative_path # 完整的相对路径信息
145
+ ))
146
+ return CompletionResponse(completions=completions)
147
+
148
+ @router.get("/api/completions/symbols")
149
+ async def get_symbol_completions(
150
+ name: str = Query(...),
151
+ project_path: str = Depends(get_project_path)
152
+ ):
153
+ """获取符号补全"""
154
+ symbols = await asyncio.to_thread(get_symbol_list, project_path)
155
+ matches = []
156
+
157
+ for symbol in symbols:
158
+ if name.lower() in symbol.symbol_name.lower():
159
+ relative_path = os.path.relpath(
160
+ symbol.file_name, project_path)
161
+ matches.append(CompletionItem(
162
+ name=symbol.symbol_name,
163
+ path=relative_path,
164
+ display=f"{symbol.symbol_name}(location: {relative_path})"
165
+ ))
166
+ return CompletionResponse(completions=matches)
@@ -0,0 +1,209 @@
1
+ from typing import List
2
+ import asyncio
3
+ from fastapi import APIRouter, Request, HTTPException, Depends
4
+ from autocoder.agent.auto_filegroup import AutoFileGroup
5
+ from autocoder.utils import operate_config_api
6
+ from autocoder.auto_coder_runner import get_memory,save_memory, load_memory
7
+ import json
8
+ import os
9
+
10
+ router = APIRouter()
11
+
12
+
13
+ async def get_project_path(request: Request):
14
+ """获取项目路径作为依赖"""
15
+ return request.app.state.project_path
16
+
17
+
18
+ def _create_file_group(group_name: str, description: str):
19
+ memory = get_memory()
20
+ if group_name in memory["current_files"]["groups"]:
21
+ return None
22
+
23
+ memory["current_files"]["groups"][group_name] = []
24
+
25
+ if "groups_info" not in memory["current_files"]:
26
+ memory["current_files"]["groups_info"] = {}
27
+
28
+ memory["current_files"]["groups_info"][group_name] = {
29
+ "query_prefix": description
30
+ }
31
+ save_memory()
32
+
33
+
34
+ def _add_files_to_group(project_path: str, name: str, files: List[str]):
35
+ memory = get_memory()
36
+ for file in files:
37
+ memory["current_files"]["groups"][name].append(
38
+ os.path.join(project_path, file))
39
+ save_memory()
40
+
41
+
42
+ def _remove_file_from_group(project_path: str, name: str, files: List[str]):
43
+ memory = get_memory()
44
+ for file in files:
45
+ memory["current_files"]["groups"][name].remove(
46
+ os.path.join(project_path, file))
47
+ save_memory()
48
+
49
+
50
+ def _update_group_description(name: str, description: str):
51
+ memory = get_memory()
52
+ memory["current_files"]["groups_info"][name]["query_prefix"] = description
53
+ save_memory()
54
+
55
+
56
+ def _get_groups(project_path: str):
57
+ memory = get_memory()
58
+ v = [
59
+ {
60
+ "name": group_name,
61
+ "files": memory["current_files"]["groups"][group_name],
62
+ "description": memory["current_files"]["groups_info"][group_name]["query_prefix"]
63
+ } for group_name in memory["current_files"]["groups"]
64
+ ]
65
+ return v
66
+
67
+ def _switch_groups(group_names: List[str], file_paths: List[str] = None):
68
+ memory = get_memory()
69
+ new_files = []
70
+ for group_name in group_names:
71
+ files = memory["current_files"]["groups"][group_name]
72
+ new_files.extend(files)
73
+
74
+ # Add individual file paths if provided
75
+ if file_paths:
76
+ for file_path in file_paths:
77
+ # Only add unique paths
78
+ if file_path not in new_files:
79
+ new_files.append(file_path)
80
+
81
+ memory["current_files"]["files"] = new_files
82
+ memory["current_files"]["current_groups"] = group_names
83
+ save_memory()
84
+
85
+
86
+ def _delete_file_group(project_path: str, group_name: str):
87
+ memory = get_memory()
88
+ if group_name not in memory["current_files"]["groups"]:
89
+ return None
90
+ del memory["current_files"]["groups"][group_name]
91
+ if group_name in memory["current_files"]["groups_info"]:
92
+ del memory["current_files"]["groups_info"][group_name]
93
+ save_memory()
94
+
95
+
96
+ @router.post("/api/file-groups")
97
+ async def create_file_group(
98
+ request: Request
99
+ ):
100
+ data = await request.json()
101
+ group_name = data.get("name")
102
+ description = data.get("description", "")
103
+ await asyncio.to_thread(_create_file_group, group_name, description)
104
+ return {"status": "success", "message": f"Created group: {group_name}"}
105
+
106
+
107
+ @router.post("/api/file-groups/auto")
108
+ async def auto_create_groups(
109
+ request: Request,
110
+ project_path: str = Depends(get_project_path)
111
+ ):
112
+ try:
113
+ memory = get_memory()
114
+ data = await request.json()
115
+ file_size_limit = data.get("file_size_limit", 100)
116
+ skip_diff = data.get("skip_diff", False)
117
+ group_num_limit = data.get("group_num_limit", 10)
118
+
119
+ # Create AutoFileGroup instance
120
+ auto_grouper = AutoFileGroup(
121
+ operate_config_api.get_llm(memory),
122
+ project_path,
123
+ skip_diff=skip_diff,
124
+ file_size_limit=file_size_limit,
125
+ group_num_limit=group_num_limit
126
+ )
127
+
128
+ # Get groups
129
+ groups = auto_grouper.group_files()
130
+
131
+ # Create groups using file_group_manager
132
+ for group in groups:
133
+ await asyncio.to_thread(_create_file_group,
134
+ name=group.name,
135
+ description=group.description
136
+ )
137
+ # Add files to the group
138
+ await asyncio.to_thread(_add_files_to_group,
139
+ group.name,
140
+ group.urls
141
+ )
142
+
143
+ return {"status": "success", "message": f"Created {len(groups)} groups"}
144
+ except Exception as e:
145
+ raise HTTPException(status_code=500, detail=str(e))
146
+
147
+
148
+ @router.post("/api/file-groups/switch")
149
+ async def switch_file_groups(
150
+ request: Request,
151
+ project_path: str = Depends(get_project_path)
152
+ ):
153
+ data = await request.json()
154
+ group_names = data.get("group_names", [])
155
+ file_paths = data.get("file_paths", [])
156
+
157
+ # Convert relative file paths to absolute paths
158
+ absolute_file_paths = []
159
+ for file_path in file_paths:
160
+ absolute_path = os.path.join(project_path, file_path)
161
+ absolute_file_paths.append(absolute_path)
162
+
163
+ await asyncio.to_thread(_switch_groups, group_names, absolute_file_paths)
164
+ return {"status": "success", "message": f"Switched to groups: {group_names} and additional files"}
165
+
166
+
167
+ @router.delete("/api/file-groups/{name}")
168
+ async def delete_file_group(
169
+ name: str,
170
+ project_path: str = Depends(get_project_path)
171
+ ):
172
+ await asyncio.to_thread(_delete_file_group, project_path, name)
173
+ return {"status": "success", "message": f"Deleted group: {name}"}
174
+
175
+
176
+ @router.post("/api/file-groups/{name}/files")
177
+ async def add_files_to_group(
178
+ name: str,
179
+ request: Request,
180
+ project_path: str = Depends(get_project_path)
181
+ ):
182
+ data = await request.json()
183
+ files = data.get("files", [])
184
+ description = data.get("description")
185
+ if description is not None:
186
+ await asyncio.to_thread(_update_group_description, name, description)
187
+ else:
188
+ await asyncio.to_thread(_add_files_to_group, project_path, name, files)
189
+ return {"status": "success", "message": f"Added files to group: {name}"}
190
+
191
+
192
+ @router.delete("/api/file-groups/{name}/files")
193
+ async def remove_files_from_group(
194
+ name: str,
195
+ request: Request,
196
+ project_path: str = Depends(get_project_path)
197
+ ):
198
+ data = await request.json()
199
+ files = data.get("files", [])
200
+ await asyncio.to_thread(_remove_file_from_group, project_path, name, files)
201
+ return {"status": "success", "message": f"Removed files from group: {name}"}
202
+
203
+
204
+ @router.get("/api/file-groups")
205
+ async def get_file_groups(
206
+ project_path: str = Depends(get_project_path)
207
+ ):
208
+ groups = await asyncio.to_thread(_get_groups, project_path)
209
+ return {"groups": groups}
@@ -37,6 +37,7 @@ async def get_files(
37
37
  project_path: str = Depends(get_project_path)
38
38
  ):
39
39
  tree = get_directory_tree(project_path)
40
+ # print(tree)
40
41
  return {"tree": tree}
41
42
 
42
43
  @router.put("/api/file/{path:path}")
@@ -0,0 +1,35 @@
1
+ import locale
2
+ from byzerllm.utils import format_str_jinja2
3
+
4
+ MESSAGES = {
5
+ "project_not_initialized": {
6
+ "en":"Warning: Project not initialized.",
7
+ "zh":"警告:项目未初始化。"
8
+ },
9
+ "run_auto_coder_chat": {
10
+ "en":"Please run 'auto-coder.chat' to initialize the project first.",
11
+ "zh":"请先运行 'auto-coder.chat' 来初始化项目。"
12
+ },
13
+ "human_as_model_warning": {
14
+ "en":"Warning: Project is configured to use human as model, auto-coder.web will not work, we will set human_as_model to false",
15
+ "zh":"警告:项目配置为使用人类作为模型,auto-coder.web 将无法工作,我们将设置 human_as_model 为 false"
16
+ }
17
+ }
18
+
19
+
20
+ def get_system_language():
21
+ try:
22
+ return locale.getdefaultlocale()[0][:2]
23
+ except:
24
+ return 'en'
25
+
26
+
27
+ def get_message(key):
28
+ lang = get_system_language()
29
+ if key in MESSAGES:
30
+ return MESSAGES[key].get(lang, MESSAGES[key].get("en", ""))
31
+ return ""
32
+
33
+
34
+ def get_message_with_format(msg_key: str, **kwargs):
35
+ return format_str_jinja2(get_message(msg_key), **kwargs)