ayechat 0.39.0__tar.gz → 0.40.0__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 (157) hide show
  1. ayechat-0.40.0/.github/workflows/build-windows-installer.yml +147 -0
  2. {ayechat-0.39.0/src/ayechat.egg-info → ayechat-0.40.0}/PKG-INFO +1 -1
  3. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/config.py +2 -0
  4. {ayechat-0.39.0 → ayechat-0.40.0/src/ayechat.egg-info}/PKG-INFO +1 -1
  5. ayechat-0.39.0/.github/workflows/build-windows-installer.yml +0 -419
  6. {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  7. {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  8. {ayechat-0.39.0 → ayechat-0.40.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  9. {ayechat-0.39.0 → ayechat-0.40.0}/.github/dependabot.yml +0 -0
  10. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/message-releases-to-discord.yml +0 -0
  11. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/pylint.yml +0 -0
  12. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-publish-dev.yml +0 -0
  13. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-publish.yml +0 -0
  14. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/python-testing.yml +0 -0
  15. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-homebrew.yml +0 -0
  16. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-nix-github.yml +0 -0
  17. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-nix.yml +0 -0
  18. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/test-windows-installer.yml +0 -0
  19. {ayechat-0.39.0 → ayechat-0.40.0}/.github/workflows/update-homebrew.yml +0 -0
  20. {ayechat-0.39.0 → ayechat-0.40.0}/.gitignore +0 -0
  21. {ayechat-0.39.0 → ayechat-0.40.0}/.pylintrc +0 -0
  22. {ayechat-0.39.0 → ayechat-0.40.0}/BUILD.md +0 -0
  23. {ayechat-0.39.0 → ayechat-0.40.0}/DISCLAIMER +0 -0
  24. {ayechat-0.39.0 → ayechat-0.40.0}/Formula/aye-chat.rb +0 -0
  25. {ayechat-0.39.0 → ayechat-0.40.0}/LICENSE +0 -0
  26. {ayechat-0.39.0 → ayechat-0.40.0}/README.md +0 -0
  27. {ayechat-0.39.0 → ayechat-0.40.0}/assets/aye-chat.ico +0 -0
  28. {ayechat-0.39.0 → ayechat-0.40.0}/aye-chat.spec +0 -0
  29. {ayechat-0.39.0 → ayechat-0.40.0}/ayechat.nix +0 -0
  30. {ayechat-0.39.0 → ayechat-0.40.0}/flake.lock +0 -0
  31. {ayechat-0.39.0 → ayechat-0.40.0}/flake.nix +0 -0
  32. {ayechat-0.39.0 → ayechat-0.40.0}/installer.iss +0 -0
  33. {ayechat-0.39.0 → ayechat-0.40.0}/publish_pypi.sh +0 -0
  34. {ayechat-0.39.0 → ayechat-0.40.0}/pyproject.toml +0 -0
  35. {ayechat-0.39.0 → ayechat-0.40.0}/requirements.txt +0 -0
  36. {ayechat-0.39.0 → ayechat-0.40.0}/run_tests.cmd +0 -0
  37. {ayechat-0.39.0 → ayechat-0.40.0}/run_tests.sh +0 -0
  38. {ayechat-0.39.0 → ayechat-0.40.0}/setup.cfg +0 -0
  39. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/.gitignore +0 -0
  40. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__init__.py +0 -0
  41. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__main__.py +0 -0
  42. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/__main_chat__.py +0 -0
  43. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/__init__.py +0 -0
  44. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/command_handlers.py +0 -0
  45. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/commands.py +0 -0
  46. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/llm_handler.py +0 -0
  47. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/llm_invoker.py +0 -0
  48. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/plugin_manager.py +0 -0
  49. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/repl.py +0 -0
  50. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/tutorial.py +0 -0
  51. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/controller/util.py +0 -0
  52. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/__init__.py +0 -0
  53. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/api.py +0 -0
  54. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/ast_chunker.py +0 -0
  55. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/auth.py +0 -0
  56. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/autodiff_config.py +0 -0
  57. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/download_plugins.py +0 -0
  58. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/file_processor.py +0 -0
  59. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/ignore_patterns.py +0 -0
  60. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/__init__.py +0 -0
  61. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager.py +0 -0
  62. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_executor.py +0 -0
  63. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_file_ops.py +0 -0
  64. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_state.py +0 -0
  65. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/index_manager/index_manager_utils.py +0 -0
  66. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/json_extractor.py +0 -0
  67. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/models.py +0 -0
  68. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/offline_llm_manager.py +0 -0
  69. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/onnx_manager.py +0 -0
  70. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/__init__.py +0 -0
  71. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/base.py +0 -0
  72. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/file_backend.py +0 -0
  73. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/snapshot/git_ref_backend.py +0 -0
  74. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/source_collector.py +0 -0
  75. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/telemetry.py +0 -0
  76. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/vector_db.py +0 -0
  77. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/version_checker.py +0 -0
  78. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/model/write_validator.py +0 -0
  79. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/__init__.py +0 -0
  80. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/at_file_completer.py +0 -0
  81. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/auto_detect_mask.py +0 -0
  82. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/completer.py +0 -0
  83. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/databricks_model.py +0 -0
  84. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/local_model.py +0 -0
  85. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/offline_llm.py +0 -0
  86. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/plugin_base.py +0 -0
  87. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/shell_executor.py +0 -0
  88. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/plugins/slash_completer.py +0 -0
  89. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/__init__.py +0 -0
  90. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/cli_ui.py +0 -0
  91. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/diff_presenter.py +0 -0
  92. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/repl_ui.py +0 -0
  93. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/streaming_ui.py +0 -0
  94. {ayechat-0.39.0 → ayechat-0.40.0}/src/aye/presenter/ui_utils.py +0 -0
  95. {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/SOURCES.txt +0 -0
  96. {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/dependency_links.txt +0 -0
  97. {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/entry_points.txt +0 -0
  98. {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/requires.txt +0 -0
  99. {ayechat-0.39.0 → ayechat-0.40.0}/src/ayechat.egg-info/top_level.txt +0 -0
  100. {ayechat-0.39.0 → ayechat-0.40.0}/tests/.gitignore +0 -0
  101. {ayechat-0.39.0 → ayechat-0.40.0}/tests/config/unittest-env.sh +0 -0
  102. {ayechat-0.39.0 → ayechat-0.40.0}/tests/e2e/test_chat_workflow.py +0 -0
  103. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_api.py +0 -0
  104. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_ast_chunker.py +0 -0
  105. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_at_file_completer.py +0 -0
  106. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auth.py +0 -0
  107. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auth_uat_1.py +0 -0
  108. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_auto_detect_mask.py +0 -0
  109. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_chromadb_corruption_recovery.py +0 -0
  110. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_cli.py +0 -0
  111. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_command_handlers.py +0 -0
  112. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_commands.py +0 -0
  113. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_completer_plugin.py +0 -0
  114. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_config.py +0 -0
  115. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_diff_presenter.py +0 -0
  116. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_download_plugins.py +0 -0
  117. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_file_processor.py +0 -0
  118. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_git_ref_backend.py +0 -0
  119. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager.py +0 -0
  120. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_executor.py +0 -0
  121. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_more.py +0 -0
  122. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_state.py +0 -0
  123. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_index_manager_utils.py +0 -0
  124. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_llm_handler.py +0 -0
  125. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_llm_invoker.py +0 -0
  126. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_local_model_plugin.py +0 -0
  127. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_offline_llm.py +0 -0
  128. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_offline_llm_manager.py +0 -0
  129. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_onnx_manager.py +0 -0
  130. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_plugin_base.py +0 -0
  131. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_plugin_manager.py +0 -0
  132. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_presenter.py +0 -0
  133. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_rag_context_retrieval.py +0 -0
  134. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_repl.py +0 -0
  135. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_service.py +0 -0
  136. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_shell_executor_plugin.py +0 -0
  137. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_slash_completer.py +0 -0
  138. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_snapshot.py +0 -0
  139. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_source_collector.py +0 -0
  140. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_streaming_ui.py +0 -0
  141. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_telemetry.py +0 -0
  142. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_tutorial.py +0 -0
  143. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_ui_utils.py +0 -0
  144. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_util.py +0 -0
  145. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_vector_db.py +0 -0
  146. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_version_checker.py +0 -0
  147. {ayechat-0.39.0 → ayechat-0.40.0}/tests/test_write_validator.py +0 -0
  148. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/api_tests.md +0 -0
  149. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/auth_tests.md +0 -0
  150. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/demo_tests.md +0 -0
  151. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/download_plugins_tests.md +0 -0
  152. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/plugin_tests.md +0 -0
  153. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/service_tests.md +0 -0
  154. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/snapshot_tests.md +0 -0
  155. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/source_collector_tests.md +0 -0
  156. {ayechat-0.39.0 → ayechat-0.40.0}/tests/ua/ui_tests.md +0 -0
  157. {ayechat-0.39.0 → ayechat-0.40.0}/version_info.txt +0 -0
@@ -0,0 +1,147 @@
1
+ name: Build Windows Installer
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+ inputs:
8
+ version:
9
+ description: 'Version to build (e.g., 0.29.1)'
10
+ required: false
11
+ default: ''
12
+
13
+ jobs:
14
+ build:
15
+ runs-on: windows-latest
16
+
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: '3.12'
25
+
26
+ - name: Determine version
27
+ id: version
28
+ shell: bash
29
+ run: |
30
+ if [ -n "${{ github.event.inputs.version }}" ]; then
31
+ VERSION="${{ github.event.inputs.version }}"
32
+ elif [ "${{ github.event_name }}" = "release" ]; then
33
+ # Strip 'v' prefix if present
34
+ VERSION="${GITHUB_REF_NAME#v}"
35
+ else
36
+ VERSION="0.0.0"
37
+ fi
38
+ echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
39
+
40
+ # Parse version components and convert to integers to strip leading zeros
41
+ IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
42
+ # Default to 0 if empty, and convert to integer to strip leading zeros
43
+ MAJOR=$((MAJOR + 0))
44
+ MINOR=$((MINOR + 0))
45
+ PATCH=$((PATCH + 0))
46
+ NUMERIC_VERSION="${MAJOR}.${MINOR}.${PATCH}.0"
47
+ echo "NUMERIC_VERSION=$NUMERIC_VERSION" >> $GITHUB_OUTPUT
48
+ echo "MAJOR=$MAJOR" >> $GITHUB_OUTPUT
49
+ echo "MINOR=$MINOR" >> $GITHUB_OUTPUT
50
+ echo "PATCH=$PATCH" >> $GITHUB_OUTPUT
51
+
52
+ echo "Building version: $VERSION (numeric: $NUMERIC_VERSION)"
53
+
54
+ - name: Install dependencies
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ pip install pyinstaller
58
+ pip install -e .
59
+
60
+ - name: Generate version_info.txt
61
+ shell: bash
62
+ run: |
63
+ # Use the pre-parsed integer version components (no leading zeros)
64
+ MAJOR=${{ steps.version.outputs.MAJOR }}
65
+ MINOR=${{ steps.version.outputs.MINOR }}
66
+ PATCH=${{ steps.version.outputs.PATCH }}
67
+ VERSION=${{ steps.version.outputs.VERSION }}
68
+
69
+ cat > version_info.txt << EOF
70
+ # UTF-8
71
+ #
72
+ # Windows version info file for PyInstaller
73
+ # Auto-generated by CI/CD build.
74
+ #
75
+ VSVersionInfo(
76
+ ffi=FixedFileInfo(
77
+ filevers=(${MAJOR}, ${MINOR}, ${PATCH}, 0),
78
+ prodvers=(${MAJOR}, ${MINOR}, ${PATCH}, 0),
79
+ mask=0x3f,
80
+ flags=0x0,
81
+ OS=0x40004,
82
+ fileType=0x1,
83
+ subtype=0x0,
84
+ date=(0, 0)
85
+ ),
86
+ kids=[
87
+ StringFileInfo([
88
+ StringTable(
89
+ '040904B0',
90
+ [
91
+ StringStruct('CompanyName', 'Acrotron, Inc.'),
92
+ StringStruct('FileDescription', 'Aye Chat - Terminal-first AI Code Generator'),
93
+ StringStruct('FileVersion', '${VERSION}'),
94
+ StringStruct('InternalName', 'aye'),
95
+ StringStruct('LegalCopyright', 'Copyright (C) 2024-2025 Acrotron, Inc.'),
96
+ StringStruct('OriginalFilename', 'aye.exe'),
97
+ StringStruct('ProductName', 'Aye Chat'),
98
+ StringStruct('ProductVersion', '${VERSION}'),
99
+ ]
100
+ )
101
+ ]),
102
+ VarFileInfo([VarStruct('Translation', [1033, 1200])])
103
+ ]
104
+ )
105
+ EOF
106
+
107
+ echo "Generated version_info.txt:"
108
+ cat version_info.txt
109
+
110
+ - name: Generate frozen version module
111
+ shell: bash
112
+ run: |
113
+ VERSION=${{ steps.version.outputs.VERSION }}
114
+ mkdir -p src/aye
115
+ echo "__version__ = '${VERSION}'" > src/aye/_frozen_version.py
116
+ echo "Generated _frozen_version.py with version: ${VERSION}"
117
+
118
+ - name: Build with PyInstaller
119
+ run: |
120
+ pyinstaller aye-chat.spec --noconfirm
121
+
122
+ - name: Verify build
123
+ run: |
124
+ .\dist\aye-chat\aye.exe --version
125
+
126
+ - name: Install Inno Setup
127
+ run: |
128
+ choco install innosetup -y
129
+
130
+ - name: Build installer
131
+ run: |
132
+ $env:PATH += ";C:\Program Files (x86)\Inno Setup 6"
133
+ iscc installer.iss /DMyAppVersion=${{ steps.version.outputs.VERSION }} /DMyAppNumericVersion=${{ steps.version.outputs.NUMERIC_VERSION }}
134
+
135
+ - name: Upload installer artifact
136
+ uses: actions/upload-artifact@v4
137
+ with:
138
+ name: windows-installer
139
+ path: Output/*.exe
140
+
141
+ - name: Upload to release
142
+ if: github.event_name == 'release'
143
+ uses: softprops/action-gh-release@v1
144
+ with:
145
+ files: Output/*.exe
146
+ env:
147
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ayechat
3
- Version: 0.39.0
3
+ Version: 0.40.0
4
4
  Summary: Aye Chat: Terminal-first AI Code Generator
5
5
  Author-email: "Acrotron, Inc." <info@acrotron.com>
6
6
  License: MIT
@@ -152,8 +152,10 @@ MODELS = [
152
152
  {"id": "google/gemini-3-pro-preview", "name": "Google: Gemini 3 Pro Preview", "max_prompt_kb": 340, "max_output_tokens": 24000, "context_target_kb": 250},
153
153
  {"id": "anthropic/claude-sonnet-4.5", "name": "Anthropic: Claude Sonnet 4.5", "max_prompt_kb": 340, "max_output_tokens": 24000, "context_target_kb": 250},
154
154
  {"id": "openai/gpt-5.1-codex", "name": "OpenAI: GPT-5.1-Codex", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
155
+ {"id": "openai/gpt-5.2-codex", "name": "OpenAI: GPT-5.2-Codex", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
155
156
  {"id": "openai/gpt-5.2", "name": "OpenAI: GPT-5.2", "max_prompt_kb": 200, "max_output_tokens": 24000, "context_target_kb": 180},
156
157
  {"id": "anthropic/claude-opus-4.5", "name": "Anthropic: Claude Opus 4.5", "max_prompt_kb": 200, "max_output_tokens": 16000, "context_target_kb": 170},
158
+ {"id": "anthropic/claude-opus-4.6", "name": "Anthropic: Claude Opus 4.6", "max_prompt_kb": 200, "max_output_tokens": 16000, "context_target_kb": 170},
157
159
 
158
160
  # Offline models
159
161
  {"id": "offline/qwen2.5-coder-7b", "name": "Qwen2.5 Coder 7B (Offline)", "type": "offline", "size_gb": 4.7, "max_prompt_kb": 60, "max_output_tokens": 8000, "context_target_kb": 40},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ayechat
3
- Version: 0.39.0
3
+ Version: 0.40.0
4
4
  Summary: Aye Chat: Terminal-first AI Code Generator
5
5
  Author-email: "Acrotron, Inc." <info@acrotron.com>
6
6
  License: MIT
@@ -1,419 +0,0 @@
1
- name: Build Windows Installer
2
-
3
- on:
4
- push:
5
- branches: [ "dev" ]
6
- release:
7
- types: [published]
8
- workflow_dispatch:
9
- inputs:
10
- version:
11
- description: 'Version to build (e.g., 0.29.1). Leave empty to use latest tag.'
12
- required: false
13
- type: string
14
-
15
- permissions:
16
- contents: write
17
-
18
- jobs:
19
- build-installer:
20
- name: Build Windows Installer
21
- runs-on: windows-latest
22
-
23
- steps:
24
- - name: Checkout repository
25
- uses: actions/checkout@v4
26
- with:
27
- fetch-depth: 0 # Needed for setuptools-scm to get version from tags
28
-
29
- - name: Set up certificate
30
- run: |
31
- echo "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12
32
- shell: bash
33
-
34
- - name: Set variables
35
- id: variables
36
- run: |
37
- echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
38
- echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV"
39
- echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV"
40
- echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV"
41
- echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV"
42
- shell: bash
43
-
44
- - name: Force reg add to be non-interactive (auto-append /f)
45
- shell: pwsh
46
- run: |
47
- $wrapperDir = Join-Path $env:RUNNER_TEMP "reg-wrapper"
48
- New-Item -ItemType Directory -Force -Path $wrapperDir | Out-Null
49
-
50
- $wrapperPath = Join-Path $wrapperDir "reg.cmd"
51
-
52
- @'
53
- @echo off
54
- setlocal EnableExtensions EnableDelayedExpansion
55
-
56
- rem Wrapper around reg.exe to avoid interactive prompts.
57
- rem If called as: reg add ... (without /f), append /f.
58
-
59
- if /I "%~1"=="add" (
60
- set "all=%*"
61
- echo !all! | findstr /I /C:" /f" >nul
62
- if errorlevel 1 (
63
- "%SystemRoot%\System32\reg.exe" %* /f
64
- exit /b %errorlevel%
65
- )
66
- )
67
-
68
- "%SystemRoot%\System32\reg.exe" %*
69
- exit /b %errorlevel%
70
- '@ | Set-Content -Path $wrapperPath -Encoding ascii
71
-
72
- "${wrapperDir}" | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8
73
- Write-Host "Installed reg wrapper at: $wrapperPath"
74
- Write-Host "Wrapper directory added to PATH: $wrapperDir"
75
-
76
- - name: Setup Software Trust Manager (new)
77
- id: stm-setup
78
- uses: digicert/code-signing-software-trust-action@v1.0.1
79
-
80
- - name: Check PKCS11 config file
81
- run: |
82
- IF EXIST "${{ steps.stm-setup.outputs.PKCS11_CONFIG }}" (
83
- echo file exists: ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
84
- ) ELSE (
85
- echo !! file doesn't exist: ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
86
- )
87
- shell: cmd
88
-
89
- - name: Find smctl location
90
- run: where smctl
91
- shell: cmd
92
-
93
- - name: Debug certificate setup
94
- run: |
95
- echo "Checking if certificate file exists..."
96
- if [ -f "D:/Certificate_pkcs12.p12" ]; then
97
- echo "Certificate file exists"
98
- ls -la D:/Certificate_pkcs12.p12
99
- echo "Verifying certificate file format..."
100
- openssl pkcs12 -in D:/Certificate_pkcs12.p12 -info -nokeys -passin pass:${{ secrets.SM_CLIENT_CERT_PASSWORD }} 2>&1 | head -20 || echo "Failed to read certificate - may be wrong password or corrupted file"
101
- echo "Getting certificate fingerprint (SHA1)..."
102
- openssl pkcs12 -in D:/Certificate_pkcs12.p12 -passin pass:${{ secrets.SM_CLIENT_CERT_PASSWORD }} -nokeys 2>/dev/null | openssl x509 -fingerprint -sha1 -noout || echo "Failed to get fingerprint"
103
- else
104
- echo "Certificate file NOT found!"
105
- fi
106
- shell: bash
107
-
108
- - name: Verify secrets are set
109
- run: |
110
- echo Checking required secrets...
111
- if [ -z "${{ secrets.SM_HOST }}" ]; then echo "ERROR: SM_HOST is not set"; else echo "SM_HOST is set"; fi
112
- if [ -z "${{ secrets.SM_API_KEY }}" ]; then echo "ERROR: SM_API_KEY is not set"; else echo "SM_API_KEY is set (length: ${#SM_API_KEY})"; fi
113
- if [ -z "${{ secrets.SM_CLIENT_CERT_PASSWORD }}" ]; then echo "ERROR: SM_CLIENT_CERT_PASSWORD is not set"; else echo "SM_CLIENT_CERT_PASSWORD is set"; fi
114
- if [ -z "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" ]; then echo "ERROR: SM_CLIENT_CERT_FILE_B64 is not set"; else echo "SM_CLIENT_CERT_FILE_B64 is set"; fi
115
- if [ -z "${{ secrets.SM_CODE_SIGNING_CERT_SHA1_HASH }}" ]; then echo "ERROR: SM_CODE_SIGNING_CERT_SHA1_HASH is not set"; else echo "SM_CODE_SIGNING_CERT_SHA1_HASH is set"; fi
116
- if [ -z "${{ secrets.SM_KEYPAIR_ALIAS }}" ]; then echo "ERROR: SM_KEYPAIR_ALIAS is not set"; else echo "SM_KEYPAIR_ALIAS is set"; fi
117
- shell: bash
118
- env:
119
- SM_API_KEY: ${{ secrets.SM_API_KEY }}
120
-
121
- # - name: Verify Certificate (Debug)
122
- # run: |
123
- # smctl keypair ls
124
-
125
- # - name: Sync Certificates to Windows Store
126
- # run: smctl windows certsync
127
-
128
- # - name: Verify Certificate (Debug)
129
- # run: |
130
- # smctl keypair ls
131
-
132
- # - name: Stop for debugging
133
- # run: exit 1
134
-
135
- - name: Determine version
136
- id: version
137
- shell: pwsh
138
- run: |
139
- if ("${{ github.event.inputs.version }}" -ne "") {
140
- # Manual input - use as-is
141
- $version = "${{ github.event.inputs.version }}"
142
- } elseif ("${{ github.event_name }}" -eq "release") {
143
- # Release event - use tag directly (like python-publish.yml)
144
- $version = "${{ github.event.release.tag_name }}" -replace '^v', ''
145
- } else {
146
- # Dev branch push - generate dev version (like python-publish-dev.yml)
147
- # Get the latest tag, or use 0.0.0 if no tags exist
148
- $latestTag = git describe --tags --abbrev=0 2>$null
149
- if (-not $latestTag) { $latestTag = "0.0.0" }
150
- $latestTag = $latestTag -replace '^v', ''
151
-
152
- # Split version into major.minor.patch
153
- $parts = $latestTag.Split('.')
154
- $major = if ($parts.Length -gt 0) { $parts[0] } else { 0 }
155
- $minor = if ($parts.Length -gt 1) { $parts[1] } else { 0 }
156
- $patch = if ($parts.Length -gt 2) { ($parts[2] -replace '[^0-9].*', '') } else { 0 }
157
-
158
- # Increment patch version for dev releases
159
- $nextPatch = $patch + 1
160
- $nextVersion = "$major.$minor.$nextPatch"
161
-
162
- # Generate timestamp-based dev version
163
- $timestamp = Get-Date -Format "yyyyMMddHHmmss"
164
- $version = "$nextVersion.dev$timestamp"
165
-
166
- Write-Host "Latest release: $latestTag"
167
- }
168
-
169
- # Extract numeric version for Windows VersionInfo (X.X.X.X format)
170
- # Remove any non-numeric suffix like .devXXX
171
- $numericVersion = $version -replace '\.dev.*$', ''
172
- # Ensure we have at least X.X.X format, pad with .0 if needed
173
- $parts = $numericVersion.Split('.')
174
- while ($parts.Length -lt 3) { $parts += "0" }
175
- $numericVersion = ($parts[0..2] -join '.') + ".0"
176
-
177
- echo "VERSION=$version" >> $env:GITHUB_OUTPUT
178
- echo "NUMERIC_VERSION=$numericVersion" >> $env:GITHUB_OUTPUT
179
- echo "Building version: $version (numeric: $numericVersion)"
180
-
181
- - name: Set up Python
182
- uses: actions/setup-python@v6
183
- with:
184
- python-version: '3.12'
185
- cache: 'pip'
186
-
187
- - name: Install dependencies
188
- run: |
189
- python -m pip install --upgrade pip
190
- pip install pyinstaller
191
- pip install -e .
192
-
193
- - name: Create frozen version module
194
- shell: pwsh
195
- run: |
196
- $version = "${{ steps.version.outputs.VERSION }}"
197
- $content = "# Auto-generated by build-windows-installer.yml - DO NOT EDIT`n__version__ = `"$version`""
198
- $content | Set-Content -Path "src/aye/_frozen_version.py" -Encoding utf8NoBOM
199
- Write-Host "Created _frozen_version.py with version: $version"
200
- Get-Content -Path "src/aye/_frozen_version.py"
201
-
202
- - name: Create version info file
203
- shell: pwsh
204
- run: |
205
- $version = "${{ steps.version.outputs.VERSION }}"
206
- $parts = $version.Split('.')
207
- $major = if ($parts.Length -gt 0) { $parts[0] } else { "0" }
208
- $minor = if ($parts.Length -gt 1) { $parts[1] } else { "0" }
209
- $patch = if ($parts.Length -gt 2) { $parts[2] -replace '[^0-9].*', '' } else { "0" }
210
-
211
- $content = @"
212
- VSVersionInfo(
213
- ffi=FixedFileInfo(
214
- filevers=($major, $minor, $patch, 0),
215
- prodvers=($major, $minor, $patch, 0),
216
- mask=0x3f,
217
- flags=0x0,
218
- OS=0x40004,
219
- fileType=0x1,
220
- subtype=0x0,
221
- date=(0, 0)
222
- ),
223
- kids=[
224
- StringFileInfo([
225
- StringTable(
226
- '040904B0',
227
- [
228
- StringStruct('CompanyName', 'Acrotron, Inc.'),
229
- StringStruct('FileDescription', 'Aye Chat - Terminal-first AI Code Generator'),
230
- StringStruct('FileVersion', '$version'),
231
- StringStruct('InternalName', 'aye'),
232
- StringStruct('LegalCopyright', 'Copyright (C) 2024-2025 Acrotron, Inc.'),
233
- StringStruct('OriginalFilename', 'aye.exe'),
234
- StringStruct('ProductName', 'Aye Chat'),
235
- StringStruct('ProductVersion', '$version'),
236
- ]
237
- )
238
- ]),
239
- VarFileInfo([VarStruct('Translation', [1033, 1200])])
240
- ]
241
- )
242
- "@
243
-
244
- # Write without UTF-8 BOM (PowerShell-only fix)
245
- $content | Set-Content -Path version_info.txt -Encoding utf8NoBOM
246
-
247
- Write-Host "version_info.txt written. First 16 bytes:"
248
- Format-Hex -Path version_info.txt -Count 16
249
- Write-Host "First line of version_info.txt:"
250
- Get-Content -Path version_info.txt -TotalCount 1
251
-
252
- - name: Build with PyInstaller
253
- run: |
254
- pyinstaller aye-chat.spec --noconfirm
255
-
256
- - name: Verify build output
257
- shell: pwsh
258
- run: |
259
- if (!(Test-Path "dist/aye-chat/aye.exe")) {
260
- Write-Error "Build failed: aye.exe not found"
261
- exit 1
262
- }
263
- Write-Host "Build successful! Contents of dist/aye-chat:"
264
- Get-ChildItem -Path "dist/aye-chat" -Recurse | Select-Object FullName, Length
265
-
266
- - name: Test executable
267
- shell: pwsh
268
- run: |
269
- Write-Host "Testing aye.exe --version:"
270
- & "dist/aye-chat/aye.exe" --version
271
-
272
- - name: Build installer with Inno Setup
273
- id: inno-setup
274
- uses: Minionguyjpro/Inno-Setup-Action@v1.2.7
275
- with:
276
- path: installer.iss
277
- options: /DMyAppVersion=${{ steps.version.outputs.VERSION }} /DMyAppNumericVersion=${{ steps.version.outputs.NUMERIC_VERSION }}
278
-
279
- - name: Find installer executable
280
- id: find-installer
281
- shell: pwsh
282
- run: |
283
- $exe = Get-ChildItem -Path Output -Filter *.exe | Select-Object -First 1
284
- echo "INSTALLER_PATH=$($exe.FullName)" >> $env:GITHUB_OUTPUT
285
- echo "Found installer: $($exe.FullName)"
286
-
287
- - name: Add signtool to PATH
288
- shell: pwsh
289
- run: |
290
- $sdkPath = "C:\Program Files (x86)\Windows Kits\10\bin"
291
- $latestSdk = Get-ChildItem -Path $sdkPath -Directory | Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } | Sort-Object Name -Descending | Select-Object -First 1
292
- $signtoolPath = Join-Path $latestSdk.FullName "x64"
293
- echo "Adding to PATH: $signtoolPath"
294
- echo "$signtoolPath" >> $env:GITHUB_PATH
295
-
296
- - name: Sign installer with certificate
297
- if: github.event_name == 'release'
298
- run: |
299
- smctl sign --verbose --keypair-alias ${{ secrets.SM_KEYPAIR_ALIAS }} --input "${{ steps.find-installer.outputs.INSTALLER_PATH }}" --config-file ${{ steps.stm-setup.outputs.PKCS11_CONFIG }}
300
- shell: cmd
301
- env:
302
- SM_HOST: ${{ secrets.SM_HOST }}
303
- SM_API_KEY: ${{ secrets.SM_API_KEY }}
304
- SM_CLIENT_CERT_FILE: D:\Certificate_pkcs12.p12
305
- SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
306
-
307
- - name: Upload installer artifact
308
- uses: actions/upload-artifact@v6
309
- with:
310
- name: aye-chat-installer-${{ steps.version.outputs.VERSION }}
311
- path: Output/*.exe
312
- if-no-files-found: error
313
-
314
- - name: Upload to release
315
- if: github.event_name == 'release'
316
- uses: softprops/action-gh-release@v2
317
- with:
318
- files: Output/*.exe
319
- env:
320
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
321
-
322
- # Optional: Create a portable ZIP as well
323
- build-portable:
324
- name: Build Portable ZIP
325
- runs-on: windows-latest
326
-
327
- steps:
328
- - name: Checkout repository
329
- uses: actions/checkout@v4
330
- with:
331
- fetch-depth: 0
332
-
333
- - name: Determine version
334
- id: version
335
- shell: pwsh
336
- run: |
337
- if ("${{ github.event.inputs.version }}" -ne "") {
338
- # Manual input - use as-is
339
- $version = "${{ github.event.inputs.version }}"
340
- } elseif ("${{ github.event_name }}" -eq "release") {
341
- # Release event - use tag directly (like python-publish.yml)
342
- $version = "${{ github.event.release.tag_name }}" -replace '^v', ''
343
- } else {
344
- # Dev branch push - generate dev version (like python-publish-dev.yml)
345
- # Get the latest tag, or use 0.0.0 if no tags exist
346
- $latestTag = git describe --tags --abbrev=0 2>$null
347
- if (-not $latestTag) { $latestTag = "0.0.0" }
348
- $latestTag = $latestTag -replace '^v', ''
349
-
350
- # Split version into major.minor.patch
351
- $parts = $latestTag.Split('.')
352
- $major = if ($parts.Length -gt 0) { $parts[0] } else { 0 }
353
- $minor = if ($parts.Length -gt 1) { $parts[1] } else { 0 }
354
- $patch = if ($parts.Length -gt 2) { ($parts[2] -replace '[^0-9].*', '') } else { 0 }
355
-
356
- # Increment patch version for dev releases
357
- $nextPatch = $patch + 1
358
- $nextVersion = "$major.$minor.$nextPatch"
359
-
360
- # Generate timestamp-based dev version
361
- $timestamp = Get-Date -Format "yyyyMMddHHmmss"
362
- $version = "$nextVersion.dev$timestamp"
363
-
364
- Write-Host "Latest release: $latestTag"
365
- }
366
-
367
- # Extract numeric version for Windows VersionInfo (X.X.X.X format)
368
- # Remove any non-numeric suffix like .devXXX
369
- $numericVersion = $version -replace '\.dev.*$', ''
370
- # Ensure we have at least X.X.X format, pad with .0 if needed
371
- $parts = $numericVersion.Split('.')
372
- while ($parts.Length -lt 3) { $parts += "0" }
373
- $numericVersion = ($parts[0..2] -join '.') + ".0"
374
-
375
- echo "VERSION=$version" >> $env:GITHUB_OUTPUT
376
- echo "NUMERIC_VERSION=$numericVersion" >> $env:GITHUB_OUTPUT
377
- echo "Building version: $version (numeric: $numericVersion)"
378
-
379
- - name: Set up Python
380
- uses: actions/setup-python@v6
381
- with:
382
- python-version: '3.12'
383
- cache: 'pip'
384
-
385
- - name: Install dependencies
386
- run: |
387
- python -m pip install --upgrade pip
388
- pip install pyinstaller
389
- pip install -e .
390
-
391
- - name: Create frozen version module
392
- shell: pwsh
393
- run: |
394
- $version = "${{ steps.version.outputs.VERSION }}"
395
- $content = "# Auto-generated by build-windows-installer.yml - DO NOT EDIT`n__version__ = `"$version`""
396
- $content | Set-Content -Path "src/aye/_frozen_version.py" -Encoding utf8NoBOM
397
- Write-Host "Created _frozen_version.py with version: $version"
398
-
399
- - name: Build with PyInstaller
400
- run: pyinstaller aye-chat.spec --noconfirm
401
-
402
- - name: Create portable ZIP
403
- shell: pwsh
404
- run: |
405
- Compress-Archive -Path "dist/aye-chat/*" -DestinationPath "aye-chat-portable-win64.zip"
406
-
407
- - name: Upload portable artifact
408
- uses: actions/upload-artifact@v6
409
- with:
410
- name: aye-chat-portable-${{ steps.version.outputs.VERSION }}
411
- path: "*.zip"
412
- if-no-files-found: error
413
-
414
- - name: Upload to release
415
- if: github.event_name == 'release'
416
- uses: softprops/action-gh-release@v2
417
- with:
418
- files: "*.zip"
419
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes