ayechat-dev 0.36.9.20260204011001__tar.gz → 0.36.9.20260204171331__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 (156) hide show
  1. {ayechat_dev-0.36.9.20260204011001/src/ayechat_dev.egg-info → ayechat_dev-0.36.9.20260204171331}/PKG-INFO +1 -1
  2. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/pyproject.toml +1 -1
  3. ayechat_dev-0.36.9.20260204171331/src/aye/plugins/databricks_model.py +311 -0
  4. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331/src/ayechat_dev.egg-info}/PKG-INFO +1 -1
  5. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/ayechat_dev.egg-info/SOURCES.txt +1 -0
  6. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  7. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  8. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  9. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/dependabot.yml +0 -0
  10. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/build-windows-installer.yml +0 -0
  11. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/message-releases-to-discord.yml +0 -0
  12. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/pylint.yml +0 -0
  13. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/python-publish-dev.yml +0 -0
  14. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/python-publish.yml +0 -0
  15. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/python-testing.yml +0 -0
  16. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/test-homebrew.yml +0 -0
  17. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/test-nix-github.yml +0 -0
  18. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/test-nix.yml +0 -0
  19. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/test-windows-installer.yml +0 -0
  20. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.github/workflows/update-homebrew.yml +0 -0
  21. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.gitignore +0 -0
  22. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/.pylintrc +0 -0
  23. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/BUILD.md +0 -0
  24. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/DISCLAIMER +0 -0
  25. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/Formula/aye-chat.rb +0 -0
  26. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/LICENSE +0 -0
  27. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/README.md +0 -0
  28. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/assets/aye-chat.ico +0 -0
  29. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/aye-chat.spec +0 -0
  30. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/ayechat.nix +0 -0
  31. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/flake.lock +0 -0
  32. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/flake.nix +0 -0
  33. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/installer.iss +0 -0
  34. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/publish_pypi.sh +0 -0
  35. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/requirements.txt +0 -0
  36. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/run_tests.cmd +0 -0
  37. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/run_tests.sh +0 -0
  38. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/setup.cfg +0 -0
  39. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/.gitignore +0 -0
  40. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/__init__.py +0 -0
  41. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/__main__.py +0 -0
  42. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/__main_chat__.py +0 -0
  43. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/__init__.py +0 -0
  44. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/command_handlers.py +0 -0
  45. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/commands.py +0 -0
  46. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/llm_handler.py +0 -0
  47. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/llm_invoker.py +0 -0
  48. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/plugin_manager.py +0 -0
  49. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/repl.py +0 -0
  50. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/tutorial.py +0 -0
  51. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/controller/util.py +0 -0
  52. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/__init__.py +0 -0
  53. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/api.py +0 -0
  54. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/ast_chunker.py +0 -0
  55. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/auth.py +0 -0
  56. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/autodiff_config.py +0 -0
  57. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/config.py +0 -0
  58. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/download_plugins.py +0 -0
  59. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/file_processor.py +0 -0
  60. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/ignore_patterns.py +0 -0
  61. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/__init__.py +0 -0
  62. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/index_manager.py +0 -0
  63. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/index_manager_executor.py +0 -0
  64. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/index_manager_file_ops.py +0 -0
  65. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/index_manager_state.py +0 -0
  66. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/index_manager/index_manager_utils.py +0 -0
  67. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/json_extractor.py +0 -0
  68. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/models.py +0 -0
  69. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/offline_llm_manager.py +0 -0
  70. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/onnx_manager.py +0 -0
  71. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/snapshot/__init__.py +0 -0
  72. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/snapshot/base.py +0 -0
  73. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/snapshot/file_backend.py +0 -0
  74. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/snapshot/git_ref_backend.py +0 -0
  75. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/source_collector.py +0 -0
  76. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/telemetry.py +0 -0
  77. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/vector_db.py +0 -0
  78. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/version_checker.py +0 -0
  79. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/model/write_validator.py +0 -0
  80. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/__init__.py +0 -0
  81. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/at_file_completer.py +0 -0
  82. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/auto_detect_mask.py +0 -0
  83. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/completer.py +0 -0
  84. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/local_model.py +0 -0
  85. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/offline_llm.py +0 -0
  86. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/plugin_base.py +0 -0
  87. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/shell_executor.py +0 -0
  88. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/plugins/slash_completer.py +0 -0
  89. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/__init__.py +0 -0
  90. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/cli_ui.py +0 -0
  91. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/diff_presenter.py +0 -0
  92. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/repl_ui.py +0 -0
  93. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/streaming_ui.py +0 -0
  94. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/aye/presenter/ui_utils.py +0 -0
  95. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/ayechat_dev.egg-info/dependency_links.txt +0 -0
  96. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/ayechat_dev.egg-info/entry_points.txt +0 -0
  97. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/ayechat_dev.egg-info/requires.txt +0 -0
  98. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/src/ayechat_dev.egg-info/top_level.txt +0 -0
  99. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/.gitignore +0 -0
  100. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/config/unittest-env.sh +0 -0
  101. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/e2e/test_chat_workflow.py +0 -0
  102. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_api.py +0 -0
  103. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_ast_chunker.py +0 -0
  104. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_at_file_completer.py +0 -0
  105. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_auth.py +0 -0
  106. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_auth_uat_1.py +0 -0
  107. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_auto_detect_mask.py +0 -0
  108. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_chromadb_corruption_recovery.py +0 -0
  109. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_cli.py +0 -0
  110. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_command_handlers.py +0 -0
  111. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_commands.py +0 -0
  112. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_completer_plugin.py +0 -0
  113. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_config.py +0 -0
  114. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_diff_presenter.py +0 -0
  115. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_download_plugins.py +0 -0
  116. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_file_processor.py +0 -0
  117. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_git_ref_backend.py +0 -0
  118. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_index_manager.py +0 -0
  119. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_index_manager_executor.py +0 -0
  120. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_index_manager_more.py +0 -0
  121. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_index_manager_state.py +0 -0
  122. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_index_manager_utils.py +0 -0
  123. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_llm_handler.py +0 -0
  124. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_llm_invoker.py +0 -0
  125. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_local_model_plugin.py +0 -0
  126. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_offline_llm.py +0 -0
  127. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_offline_llm_manager.py +0 -0
  128. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_onnx_manager.py +0 -0
  129. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_plugin_base.py +0 -0
  130. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_plugin_manager.py +0 -0
  131. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_presenter.py +0 -0
  132. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_rag_context_retrieval.py +0 -0
  133. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_repl.py +0 -0
  134. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_service.py +0 -0
  135. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_shell_executor_plugin.py +0 -0
  136. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_slash_completer.py +0 -0
  137. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_snapshot.py +0 -0
  138. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_source_collector.py +0 -0
  139. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_streaming_ui.py +0 -0
  140. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_telemetry.py +0 -0
  141. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_tutorial.py +0 -0
  142. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_ui_utils.py +0 -0
  143. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_util.py +0 -0
  144. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_vector_db.py +0 -0
  145. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_version_checker.py +0 -0
  146. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/test_write_validator.py +0 -0
  147. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/api_tests.md +0 -0
  148. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/auth_tests.md +0 -0
  149. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/demo_tests.md +0 -0
  150. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/download_plugins_tests.md +0 -0
  151. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/plugin_tests.md +0 -0
  152. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/service_tests.md +0 -0
  153. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/snapshot_tests.md +0 -0
  154. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/source_collector_tests.md +0 -0
  155. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/tests/ua/ui_tests.md +0 -0
  156. {ayechat_dev-0.36.9.20260204011001 → ayechat_dev-0.36.9.20260204171331}/version_info.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ayechat-dev
3
- Version: 0.36.9.20260204011001
3
+ Version: 0.36.9.20260204171331
4
4
  Summary: Aye Chat: Terminal-first AI Code Generator
5
5
  Author-email: "Acrotron, Inc." <info@acrotron.com>
6
6
  License: MIT
@@ -8,7 +8,7 @@ description = "Aye Chat: Terminal-first AI Code Generator"
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.10, <3.14"
10
10
  dependencies = [ "typer>=0.20.0", "httpx>=0.28.1", "keyring>=25.7.0", "prompt-toolkit>=3.0.52", "pathspec>=0.12.1", "chromadb>=1.3.5", "rapidfuzz",]
11
- version = "0.36.9.20260204011001"
11
+ version = "0.36.9.20260204171331"
12
12
  [[project.authors]]
13
13
  name = "Acrotron, Inc."
14
14
  email = "info@acrotron.com"
@@ -0,0 +1,311 @@
1
+ import os
2
+ import json
3
+ from typing import Dict, Any, Optional
4
+ import httpx
5
+ from pathlib import Path
6
+ import traceback
7
+
8
+ from rich import print as rprint
9
+
10
+ from .plugin_base import Plugin
11
+ from aye.model.config import SYSTEM_PROMPT, MODELS, DEFAULT_MAX_OUTPUT_TOKENS
12
+ from aye.model.auth import get_user_config
13
+ from aye.controller.util import is_truncated_json
14
+
15
+ LLM_TIMEOUT = 600.0
16
+
17
+
18
+ # Message shown when LLM response is truncated due to output token limits
19
+ TRUNCATED_RESPONSE_MESSAGE = (
20
+ "It looks like my response was cut off because it exceeded the output limit. "
21
+ "This usually happens when you ask me to generate or modify many files at once.\n\n"
22
+ "**To fix this, please try:**\n"
23
+ "1. Break your request into smaller parts (e.g., one file at a time)\n"
24
+ "2. Use the `with` command to focus on specific files: `with file1.py, file2.py: your request`\n"
25
+ "3. Ask me to work on fewer files or smaller changes in each request\n\n"
26
+ "For example, instead of 'update all files to add logging', try:\n"
27
+ " `with src/main.py: add logging to this file`"
28
+ )
29
+
30
+
31
+ def _get_model_config(model_id: str) -> Optional[Dict[str, Any]]:
32
+ """Get configuration for a specific model."""
33
+ for model in MODELS:
34
+ if model["id"] == model_id:
35
+ return model
36
+ return None
37
+
38
+
39
+ def _extract_json_object(raw_response: str, prefer_last: bool = True, require_keys=None):
40
+ """
41
+ Best-effort extraction of a JSON object (dict) from a raw LLM response.
42
+
43
+ Handles common failure modes where the model returns:
44
+ - extra commentary before/after JSON
45
+ - multiple JSON objects (e.g., an invalid attempt + a corrected attempt)
46
+
47
+ Args:
48
+ raw_response: raw LLM response string
49
+ prefer_last: when multiple JSON objects exist, return the last parsed object
50
+ require_keys: optional iterable of keys; if provided, only consider objects
51
+ that contain all of these keys
52
+
53
+ Returns:
54
+ dict or None
55
+ """
56
+ # 1) Direct JSON parse
57
+ try:
58
+ obj = json.loads(raw_response)
59
+ if isinstance(obj, dict):
60
+ if require_keys and not all(k in obj for k in require_keys):
61
+ return None
62
+ return obj
63
+ except Exception:
64
+ pass
65
+
66
+ text = str(raw_response)
67
+
68
+ # 2) Scan for balanced JSON object candidates (string/escape-aware)
69
+ candidates = []
70
+ depth = 0
71
+ start = None
72
+ in_str = False
73
+ escape = False
74
+
75
+ for i, ch in enumerate(text):
76
+ if in_str:
77
+ if escape:
78
+ escape = False
79
+ elif ch == '\\':
80
+ escape = True
81
+ elif ch == '"':
82
+ in_str = False
83
+ continue
84
+
85
+ # not in string
86
+ if ch == '"':
87
+ in_str = True
88
+ continue
89
+
90
+ if ch == '{':
91
+ if depth == 0:
92
+ start = i
93
+ depth += 1
94
+ elif ch == '}' and depth > 0:
95
+ depth -= 1
96
+ if depth == 0 and start is not None:
97
+ candidates.append(text[start : i + 1])
98
+ start = None
99
+
100
+ parsed = []
101
+ for cand in candidates:
102
+ try:
103
+ obj = json.loads(cand)
104
+ if not isinstance(obj, dict):
105
+ continue
106
+ if require_keys and not all(k in obj for k in require_keys):
107
+ continue
108
+ parsed.append(obj)
109
+ except Exception:
110
+ continue
111
+
112
+ if not parsed:
113
+ return None
114
+
115
+ return parsed[-1] if prefer_last else parsed[0]
116
+
117
+
118
+ class DatabricksModelPlugin(Plugin):
119
+ name = "databricks_model"
120
+ version = "1.0.0"
121
+ premium = "free"
122
+
123
+ def __init__(self):
124
+ super().__init__()
125
+ self.chat_history: Dict[str, list] = {}
126
+ self.history_file: Optional[Path] = None
127
+
128
+ def init(self, cfg: Dict[str, Any]) -> None:
129
+ """Initialize the local model plugin."""
130
+ super().init(cfg)
131
+ if self.debug:
132
+ rprint(f"[bold yellow]Initializing {self.name} v{self.version}[/]")
133
+
134
+ def _load_history(self) -> None:
135
+ """Load chat history from disk."""
136
+ if not self.history_file:
137
+ if self.verbose:
138
+ rprint("[yellow]History file path not set for local model. Skipping load.[/]")
139
+ self.chat_history = {}
140
+ return
141
+
142
+ if self.history_file.exists():
143
+ try:
144
+ data = json.loads(self.history_file.read_text(encoding="utf-8"))
145
+ self.chat_history = data.get("conversations", {})
146
+ except Exception as e:
147
+ if self.verbose:
148
+ rprint(f"[yellow]Could not load chat history: {e}[/]")
149
+ self.chat_history = {}
150
+ else:
151
+ self.chat_history = {}
152
+
153
+ def _save_history(self) -> None:
154
+ """Save chat history to disk."""
155
+ if not self.history_file:
156
+ if self.verbose:
157
+ rprint("[yellow]History file path not set for local model. Skipping save.[/]")
158
+ return
159
+
160
+ try:
161
+ self.history_file.parent.mkdir(parents=True, exist_ok=True)
162
+ data = {"conversations": self.chat_history}
163
+ self.history_file.write_text(json.dumps(data, indent=2), encoding="utf-8")
164
+ except Exception as e:
165
+ if self.verbose:
166
+ rprint(f"[yellow]Could not save chat history: {e}[/]")
167
+
168
+ def _get_conversation_id(self, chat_id: Optional[int] = None) -> str:
169
+ """Get conversation ID for history tracking."""
170
+ return str(chat_id) if chat_id and chat_id > 0 else "default"
171
+
172
+ def _build_user_message(self, prompt: str, source_files: Dict[str, str]) -> str:
173
+ """Build the user message with optional source files appended."""
174
+ user_message = prompt
175
+ if source_files:
176
+ user_message += "\n\n--- Source files are below. ---\n"
177
+ for file_name, content in source_files.items():
178
+ user_message += f"\n** {file_name} **\n```\n{content}\n```\n"
179
+ return user_message
180
+
181
+ def _parse_llm_response(self, generated_text: str) -> Dict[str, Any]:
182
+ """Parse LLM response text and convert to expected format."""
183
+ try:
184
+ llm_response = json.loads(generated_text)
185
+ except json.JSONDecodeError:
186
+ # Check if this looks like a truncated response
187
+ #if is_truncated_json(generated_text):
188
+ # return {
189
+ # "summary": TRUNCATED_RESPONSE_MESSAGE,
190
+ # "updated_files": []
191
+ # }
192
+
193
+ # Not truncated, just malformed - return as plain text
194
+ llm_response = {
195
+ "answer_summary": generated_text,
196
+ "source_files": []
197
+ }
198
+
199
+ return {
200
+ "summary": llm_response.get("answer_summary", ""),
201
+ "updated_files": [
202
+ {
203
+ "file_name": f.get("file_name"),
204
+ "file_content": f.get("file_content")
205
+ }
206
+ for f in llm_response.get("source_files", [])
207
+ ]
208
+ }
209
+
210
+ def _create_error_response(self, error_msg: str) -> Dict[str, Any]:
211
+ """Create a standardized error response."""
212
+ if self.verbose:
213
+ rprint(f"[red]{error_msg}[/]")
214
+ return {
215
+ "summary": error_msg,
216
+ "updated_files": []
217
+ }
218
+
219
+ def _handle_databricks(self, prompt: str, source_files: Dict[str, str], chat_id: Optional[int] = None, system_prompt: Optional[str] = None, max_output_tokens: int = DEFAULT_MAX_OUTPUT_TOKENS) -> Optional[Dict[str, Any]]:
220
+ api_url = os.environ.get("AYE_DBX_API_URL")
221
+ api_key = os.environ.get("AYE_DBX_API_KEY")
222
+ model_name = os.environ.get("AYE_DBX_MODEL", "gpt-3.5-turbo")
223
+
224
+ if not api_url or not api_key:
225
+ return None
226
+
227
+ conv_id = self._get_conversation_id(chat_id)
228
+ if conv_id not in self.chat_history:
229
+ self.chat_history[conv_id] = []
230
+
231
+ user_message = self._build_user_message(prompt, source_files)
232
+ effective_system_prompt = system_prompt if system_prompt else SYSTEM_PROMPT
233
+
234
+ messages_json = [{"role": "system", "content": effective_system_prompt}] + self.chat_history[conv_id] + [{"role": "user", "content": user_message}]
235
+ messages = messages_json # json.dumps(messages_json)
236
+ if self.debug:
237
+ print(">>>>>>>>>>>>>>>>")
238
+ print(self.chat_history[conv_id])
239
+ print(">>>>>>>>>>>>>>>>")
240
+
241
+ headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"}
242
+ #payload = {"model": model_name, "messages": messages, "temperature": 0.7, "max_tokens": max_output_tokens, "response_format": {"type": "json_object"}}
243
+ payload = {"model": model_name, "messages": messages, "temperature": 0.7, "max_tokens": max_output_tokens}
244
+
245
+ try:
246
+ with httpx.Client(timeout=LLM_TIMEOUT) as client:
247
+ response = client.post(api_url, json=payload, headers=headers)
248
+ if self.debug:
249
+ print("-----------------")
250
+ print(response.text)
251
+ print("-----------------")
252
+ response.raise_for_status()
253
+ result = response.json()
254
+ if result.get("choices") and result["choices"][0].get("message"):
255
+ raw_response = result["choices"][0]["message"]["content"]
256
+ generated_json = _extract_json_object(raw_response)
257
+ generated_text = json.dumps(generated_json)
258
+ if self.debug:
259
+ print("-----------------")
260
+ print(response.text)
261
+ print("-----------------")
262
+ print(generated_text)
263
+ print("-----------------")
264
+ #generated_text = result["choices"][0]["message"]["content"][1]["text"]
265
+ self.chat_history[conv_id].append({"role": "user", "content": user_message})
266
+ self.chat_history[conv_id].append({"role": "assistant", "content": generated_text})
267
+ self._save_history()
268
+ #return json.dumps(generated_text)
269
+ return self._parse_llm_response(generated_text)
270
+ return self._create_error_response("Failed to get a valid response from the Databricks API")
271
+ except httpx.HTTPStatusError as e:
272
+ traceback.print_exc()
273
+ error_msg = f"DBX API error: {e.response.status_code}"
274
+ try:
275
+ error_detail = e.response.json()
276
+ if "error" in error_detail:
277
+ error_msg += f" - {error_detail['error'].get('message', str(error_detail['error']))}"
278
+ except: error_msg += f" - {e.response.text[:200]}"
279
+ return self._create_error_response(error_msg)
280
+ except Exception as e:
281
+ traceback.print_exc()
282
+ return self._create_error_response(f"Error calling Databricks API: {str(e)}")
283
+
284
+
285
+ def on_command(self, command_name: str, params: Dict[str, Any]) -> Optional[Dict[str, Any]]:
286
+ if command_name == "new_chat":
287
+ root = params.get("root")
288
+ history_file = Path(root) / ".aye" / "chat_history.json" if root else Path.cwd() / ".aye" / "chat_history.json"
289
+ history_file.unlink(missing_ok=True)
290
+ self.chat_history = {}
291
+ if self.verbose: rprint("[yellow]Local model chat history cleared.[/]")
292
+ return {"status": "local_history_cleared"}
293
+
294
+ if command_name == "local_model_invoke":
295
+ prompt = params.get("prompt", "").strip()
296
+ model_id = params.get("model_id", "")
297
+ source_files = params.get("source_files", {})
298
+ chat_id = params.get("chat_id")
299
+ root = params.get("root")
300
+ system_prompt = params.get("system_prompt")
301
+ max_output_tokens = params.get("max_output_tokens", DEFAULT_MAX_OUTPUT_TOKENS)
302
+
303
+ self.history_file = Path(root) / ".aye" / "chat_history.json" if root else Path.cwd() / ".aye" / "chat_history.json"
304
+ self._load_history()
305
+
306
+ result = self._handle_databricks(prompt, source_files, chat_id, system_prompt, max_output_tokens)
307
+ if result is not None: return result
308
+
309
+ return None
310
+
311
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ayechat-dev
3
- Version: 0.36.9.20260204011001
3
+ Version: 0.36.9.20260204171331
4
4
  Summary: Aye Chat: Terminal-first AI Code Generator
5
5
  Author-email: "Acrotron, Inc." <info@acrotron.com>
6
6
  License: MIT
@@ -77,6 +77,7 @@ src/aye/plugins/__init__.py
77
77
  src/aye/plugins/at_file_completer.py
78
78
  src/aye/plugins/auto_detect_mask.py
79
79
  src/aye/plugins/completer.py
80
+ src/aye/plugins/databricks_model.py
80
81
  src/aye/plugins/local_model.py
81
82
  src/aye/plugins/offline_llm.py
82
83
  src/aye/plugins/plugin_base.py