kolega-code 0.25.0__tar.gz → 0.25.2__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.
- {kolega_code-0.25.0 → kolega_code-0.25.2}/CHANGELOG.md +16 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/PKG-INFO +1 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/assets/coverage.svg +1 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/__init__.py +1 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/conversation.py +154 -10
- kolega_code-0.25.2/kolega_code/utils/images.py +309 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/pyproject.toml +1 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_effective_history.py +75 -2
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_coder_attachments.py +2 -1
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_history_adapter_thinking.py +14 -1
- kolega_code-0.25.2/tests/agent/test_history_image_blocks.py +574 -0
- kolega_code-0.25.2/tests/utils/test_images.py +302 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/uv.lock +2 -2
- kolega_code-0.25.0/kolega_code/utils/images.py +0 -143
- kolega_code-0.25.0/tests/agent/test_history_image_blocks.py +0 -221
- kolega_code-0.25.0/tests/utils/test_images.py +0 -90
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.env.example +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.githooks/pre-commit +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/codeql/codeql-config.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/dependabot.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/workflows/ci.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/workflows/codeql.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/workflows/docs.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.github/workflows/release.yml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.gitignore +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/.pre-commit-config.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/CONTRIBUTING.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/MIGRATION.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/README.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/RELEASING.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/SECURITY.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/README.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/__main__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/artifacts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/authoring.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/browser.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/browser_assets/app.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/browser_assets/index.html +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/browser_assets/styles.css +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/corpus.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/authoring-slots.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/cursed_renderer.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/exec_test.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/go.mod +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/key.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/logging.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/options.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/options_test.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/tea.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/tea_test.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/bubbletea-fc707bb7ea01/tree/tty.go +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/licenses/LICENSE-APACHE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/licenses/LICENSE-MIT +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/Cargo.toml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/builder/arg.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/builder/arg_group.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/builder/value_parser.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/derive.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/error/context.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/error/mod.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/output/help_template.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/parser/matches/arg_matches.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/clap-4a35e3bcabf7/tree/clap_builder/src/parser/parser.rs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/licenses/LICENSE.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/pyproject.toml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/_termui_impl.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/_winconsole.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/core.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/exceptions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/globals.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/termui.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/types.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/click-b67832c2167e/tree/src/click/utils.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/lib/request.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/package.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/Router.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/acceptance/resource.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/app.options.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/app.render.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/app.router.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/express.static.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/express-ae6dd37680e3/tree/test/express.text.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/CMakeLists.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/base.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/chrono.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/format-inl.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/format.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/os.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/ranges.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/include/fmt/std.h +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/fmt-a79df4504cd4/tree/src/fmt.cc +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/pom.xml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/FormattingStyle.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/Gson.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/GsonBuilder.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/JsonElement.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/internal/ReflectionAccessFilterHelper.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/com/google/gson/internal/bind/util/ISO8601Utils.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/gson-c9f3fd55854a/tree/gson/src/main/java/module-info.java +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/licenses/LICENSE.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/build.gradle.kts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/CipherSuite.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Headers.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/MultipartBody.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/MultipartReader.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/OkHttpClient.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/http2/Http2Connection.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/http2/Settings.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/okhttp-6a237f781144/tree/okhttp/src/jvmMain/kotlin/okhttp3/internal/platform/Jdk8WithJettyBootPlatform.kt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/licenses/MIT-LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/application.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/file_list.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/file_utils.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/file_utils_ext.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/loaders/makefile.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/rake_test_loader.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/task.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/lib/rake/task_manager.rb +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/rake-162f9f80cad8/tree/rake.gemspec +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/licenses/LICENSE.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Live/LiveDisplay.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Spectre.Console.csproj +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Widgets/Layout/Layout.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Widgets/Markup.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Widgets/Table/Table.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console/Widgets/Table/TableColumn.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console.Ansi/AnsiMarkup.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console.Ansi/AnsiWriter.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/spectre-console-3ba102309539/tree/src/Spectre.Console.Ansi/Utilities/StringBuffer.cs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/licenses/LICENSE.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Package.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Completions/BashCompletionsGenerator.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Completions/ZshCompletionsGenerator.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Parsable Properties/Flag.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Parsing/ArgumentDefinition.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Parsing/ArgumentSet.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Parsing/ParserError.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Usage/DumpHelpGenerator.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/swift-argument-parser-e579882f9557/tree/Sources/ArgumentParser/Utilities/SequenceExtensions.swift +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Application.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Descriptor/JsonDescriptor.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Helper/ProgressBar.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Helper/SymfonyQuestionHelper.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Helper/Table.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Helper/TableStyle.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Interaction/Interaction.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/Style/SymfonyStyle.php +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/symfony-console-9df1ce79867b/tree/composer.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/licenses/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/manifest.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/package.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v3/types.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/classic/schemas.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/checks.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/errors.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/json-schema-processors.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/regexes.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/schemas.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/core/util.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/snapshots/zod-912f0f51b0ce/tree/packages/zod/src/v4/mini/schemas.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/fixtures/sources.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/matrices/deepseek-v4.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/matrices/example.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/matrices/validity-slice.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/models.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/protocols.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/recipes.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/report.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/runner.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/scoring.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/suites/coder-agent.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/suites/core.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/suites/corpora/edit-core.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/suites/fixtures/smoke-tasks.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/suites/smoke.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/usage.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/verifier/Dockerfile +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/verifier/toolchains.lock.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/benchmarks/edit_tools/workspace.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/.gitignore +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/README.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/astro.config.mjs +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/package-lock.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/package.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/public/favicon.svg +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/assets/demo.gif +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/assets/kolega-dark.svg +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/assets/kolega-light.svg +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/cli/ask.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/cli/doctor.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/cli/overview.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/cli/sessions.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/cli/share.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/concepts/agents.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/concepts/how-it-works.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/concepts/tools.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/environment-variables.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/lsp.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/mcp.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/prompt-overrides.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/providers-and-models.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/configuration/sign-in-with-chatgpt.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/custom-agents.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/getting-started/installation.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/gigacode.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/goal.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/hooks.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/index.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/loop.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/skills.mdx +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/troubleshooting/diagnostics.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/troubleshooting/terminal-tmux.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/composer.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/interface.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/modes.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/project-memory.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/scratchpad.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content/docs/tui/slash-commands.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/content.config.ts +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/src/styles/brand.css +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/docs/tsconfig.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/manifest.json +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/references/examples.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/references/limitations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/references/operations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/references/quality.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/requirements.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/scripts/docx_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/docx/scripts/smoke_test.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/examples.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/limitations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/ocr.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/operations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/quality.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/references/redaction.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-paddle.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/requirements-ocr-surya.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/requirements.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/scripts/pdf_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pdf/scripts/smoke_test.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/references/examples.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/references/limitations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/references/operations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/requirements.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/scripts/pptx_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/pptx/scripts/smoke_test.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/review/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/review/references/github-publishing.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/skill-authoring/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/skill-authoring/references/review-checklist.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/LICENSE +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/SKILL.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/references/examples.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/references/limitations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/references/operations.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/references/quality.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/requirements.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/scripts/smoke_test.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/_bundled_skills/skills/xlsx/scripts/xlsx_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/baseagent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/context.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/custom_agents.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/edit_protocols.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/errors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/bridge.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/bundle-requirements.in +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/bundle-requirements.txt +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/env.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/js_kernel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/kernel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/prelude.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/prelude.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/protocol.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/py_kernel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/runner.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/eval/runner.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/goal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/model_routing.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/accounting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/context.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_dump.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_overrides.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/build_questions.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/current_plan_artifact.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/scratchpad.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list_readonly.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/codex_patch.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/edit_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/eval_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/hashline_v2.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/lsp_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/read_image_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/base.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/errors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/firecrawl.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/models.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/searxng.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_backends/tavily.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/snapshot_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/terminal_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/think_hard_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/answering.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/documents.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/extractors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/pipeline.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch/retrieval.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_fetch_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/web_search_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/auth/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/auth/_jwt.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/auth/chatgpt_oauth.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/auth/constants.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/auth/tokens.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/app.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/clipboard_image.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/cron.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/diagnostics.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/goal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/loop.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/main.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/messages.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/model_connection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/plan_artifacts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/provider_registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/session_event_store.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/session_journal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/settings.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/slash_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/agent_runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/app_base.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/changes_screen.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/command_handlers.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/constants.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/loop_runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/memory_screen.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/onboarding_screen.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/prompt_flows.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/session_diff.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/settings_panel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/settings_screen.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/status_dashboard.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/styles.tcss +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/sub_agent_screen.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/terminal_display.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/transcript.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/tui/widgets.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/events.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/git_env.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/instrumented_client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/chatgpt_oauth.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/openai_responses.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/providers/responses_common.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/accessors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/anthropic.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/dashscope.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/deepseek.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/fireworks.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/google.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/kimi_coding.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/moonshot.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/ollama_cloud.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/openai.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/openai_chatgpt.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/together.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/xai.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/catalog/zai.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/thinking.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/specs/types.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/timeouts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/local_state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/oauth.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/service.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/mcp/transport.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/identity.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/manager.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/manifest.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/markdown.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/models.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/protocol.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/memory/registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/permissions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/scratchpad.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/security/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/security/secrets.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/base.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/html.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/detector.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/diagnostics.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/edits.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/manager.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/lsp/registry.yaml +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/snapshots.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/services/workspace_scan.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/control.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/inmemory.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/projection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/recording.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/session/store.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/testing/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/testing/store_conformance.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/utils/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/assets/fold.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/assets/player.css +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/assets/player.html +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/assets/player.js +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/bundle.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/hosting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/redaction.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/server.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/singlefile.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/web/theme_css.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/kolega_code/worktrees.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/run_tests.sh +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/bench_hotpaths.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/bench_web_fetch.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/check-dev-hooks.sh +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/check_no_host_internals.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/count_loc.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/install-kolega-code.sh +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/setup-dev.sh +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/sync_bundled_skills.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/scripts/verify_bundled_skill_artifacts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/compaction_helpers.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/conftest.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_bridge.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_bundle_requirements.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_env.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_env_provisioning.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_js_kernel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_protocol.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/eval/test_py_kernel.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/_token_counting_utils.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_anthropic_local_token_counting_incremental.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_anthropic_token_counting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_billing_openai_cache.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_live.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_oauth_auth_config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_oauth_conversion.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_oauth_provider.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_oauth_provider_generate.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_chatgpt_oauth_streaming.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_client_live.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_client_runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_dashscope_mapping.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_edit_protocol_resolution.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_error_boundary.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_exceptions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_freeform_tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_freeform_tools_live.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_google_provider.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_google_thought_signature.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_google_tool_signature_live.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_instrumented_client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_instrumented_client_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_instrumented_client_stream.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_langfuse_normalization.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_live_providers.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_message_conversion.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_model_specs.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_cached_tokens.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_cached_tokens_stream.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_message_conversion.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_reasoning_replay.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_responses_provider.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_sdk_compatibility.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_stream_accumulation.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_token_counting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_openai_token_counting_incremental.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_provider_usage_mapping.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_streaming_timeouts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_supports_vision.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_thinking_effort.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_tool_execution_ids.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/llm/test_xai_prompt_cache_header.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/orchestration/test_accounting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/orchestration/test_orchestration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_browser.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_browser_console_logs.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_browser_content.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_browser_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_browser_parity.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_file_system.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_file_system_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_file_system_path.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_local_file_system.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_sandbox_terminal_input.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_terminal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_terminal_buffer.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/services/test_terminal_state_serializer.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_agent_tools_inventory.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_anthropic_history_validation.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_compaction.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_history_serialization.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_prompt_context.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_queued_injection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_role_overrides.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_tool_call_repair.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_tool_call_repair_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_base_agent_tool_execution.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_coder_prompt_extensions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compaction_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compaction_persistence.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compaction_subagent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compaction_tui_events.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compress_command.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_compression.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_conversation_compaction.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_custom_agents.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_duplicate_tool_results.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_edit_protocol_tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_empty_message_handling.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_event_emitter.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_general_agent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_gigacode_gating.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_goal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_goal_evaluate.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_hooks_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_html.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_image_compat.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_model_routing.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_parallel_tool_calls.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_permissions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_planning_agent.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_prompt_dump.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_prompt_overrides.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_prompt_provider.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_prompts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_read_image_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_scratchpad.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_collection_builtin_dispatch.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_collection_config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_collection_extensions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_collection_initialization.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_collection_memory.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tool_registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/test_worktrees.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_agent_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_base_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_browser_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_build_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_claude_edit.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_codex_apply_patch.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_edit_preview.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_edit_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_eval_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_glob_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_glob_tool_sandbox_parity.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_hashline_v2.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_list_directory_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_lsp_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_read_file_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_search_codebase_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_snapshot_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_terminal_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_think_hard_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_think_hard_streaming.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_think_hard_streaming_content.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_think_hard_streaming_errors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_think_hard_streaming_updates.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_web_fetch_answering.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_web_fetch_pipeline.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_web_fetch_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_web_search_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/agent/tool_backend/test_workflow_tool.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/auth/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/auth/test_chatgpt_oauth.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/auth/test_tokens.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_browser.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_corpus.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_protocols.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_providers.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_recipes.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_report.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_runner.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_scoring.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_edit_benchmark_workspace.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/benchmarks/test_live_edit_benchmark_providers.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/_app_test_utils.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_agent_wiring.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_bootstrap_settings.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_changes_inspector.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_compaction_restore.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_composer_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_composer_input.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_conversation_rendering.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_diagnostics.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_focus_behavior.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_goal_command.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_image_vision_warning.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_loop_command.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_lsp_settings_status.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_memory.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_mention_dropdown.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_misc_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_model_effort_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_model_switch_vision.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_modes_planning.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_navigation_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_permission_prompts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_persistence_history.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_plan_lifecycle.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_planning_questions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_planning_restore.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_entries.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_errors.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_scroll.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_selection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_status.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_streaming.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_terminal_logs.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rendering_window.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_rewind.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_scratchpad.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_session_diff_async.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_share.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_skill_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_slash_dropdown.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_status_modes.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_sub_agents_workflows.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_app_tmux_shortcuts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_ask_goal.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_ask_loop.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_bundled_skills.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_cli_config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_clipboard_image.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_connection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_cron.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_custom_agents_cli.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_diagnostics.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_file_index.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_loop_state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_main.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_main_share_export.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_mcp_cli.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_mcp_settings_formatting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_mentions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_model_connection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_plan_artifacts.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_provider_registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_session_diff.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_session_event_store.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_session_rewind.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_session_store.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_settings.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_skills.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_slash_commands.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_sub_agent_routing_state.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_sub_agent_stream_accumulation.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_terminal_display.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_theme_web_tokens.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_themes.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_transcript_streaming_render.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_tui_control_sanitization.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_tui_settings_screens.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_tui_stylesheet.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/cli/test_updater.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/conftest.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/hooks/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/hooks/test_hooks.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/mcp/test_config_state_tools.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/memory/test_backend.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/memory/test_project_memory_manager.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/security/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/security/test_secrets.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/_fake_server.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/conftest.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_client.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_detector.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_diagnostics.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_edits.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_lsp_edit_tool_integration.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_manager.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_project_config.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_registry.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/lsp/test_trust.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/test_snapshots.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/services/test_workspace_scan.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/session/test_control.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/session/test_projection.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/session/test_recording.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/session/test_runtime.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/session/test_store_conformance.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/test_agent_config_defaults.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/test_agent_config_serialization.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/test_git_env.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/test_mcp_permissions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/test_mcp_transport.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/tools/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/tools/test_definitions.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/utils/__init__.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/utils/test_images_ascii.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_bundle.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_fold_parity.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_hosting.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_player_live.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_player_rendering.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_server.py +0 -0
- {kolega_code-0.25.0 → kolega_code-0.25.2}/tests/web/test_singlefile.py +0 -0
|
@@ -6,6 +6,22 @@ This project uses GitHub Releases for detailed generated release notes. This fil
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.25.2 - 2026-07-28
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Downscaled outbound image copies to satisfy Anthropic's per-image dimensions
|
|
14
|
+
and aggregate request-size limit, preventing image-heavy conversations from
|
|
15
|
+
failing later turns while preserving full-resolution history and artifacts.
|
|
16
|
+
|
|
17
|
+
## 0.25.1 - 2026-07-28
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Resized oversized images only in outbound Anthropic request history while
|
|
22
|
+
preserving full originals in session artifacts and replay, preventing one
|
|
23
|
+
large image from breaking every later turn in a resumed conversation.
|
|
24
|
+
|
|
9
25
|
## 0.25.0 - 2026-07-28
|
|
10
26
|
|
|
11
27
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 82.
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20" role="img" aria-label="coverage: 82.41%"><title>coverage: 82.41%</title><filter id="blur"><feGaussianBlur stdDeviation="16"/></filter><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="114" height="20" rx="3"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="53" height="20" fill="#67ac09"/><rect width="114" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="315" y="150" fill-opacity=".8" filter="url(#blur)" textLength="510">coverage</text><text x="315" y="150" fill-opacity=".3" textLength="510">coverage</text></g><text x="315" y="140" textLength="510">coverage</text></g><g transform="scale(.1)"><g aria-hidden="true" fill="#010101"><text x="865" y="150" fill-opacity=".8" filter="url(#blur)" textLength="430">82.41%</text><text x="865" y="150" fill-opacity=".3" textLength="430">82.41%</text></g><text x="865" y="140" textLength="430">82.41%</text></g></g></svg>
|
|
@@ -23,6 +23,7 @@ from kolega_code.llm.models import (
|
|
|
23
23
|
ToolCall,
|
|
24
24
|
ToolResult,
|
|
25
25
|
)
|
|
26
|
+
from kolega_code.utils import images as image_utils
|
|
26
27
|
from kolega_code.agent.tool_backend.hashline_v2 import strip_hashline_read_output
|
|
27
28
|
|
|
28
29
|
logger = logging.getLogger(__name__)
|
|
@@ -33,18 +34,117 @@ def _image_placeholder(media_type: str, model_name: str) -> str:
|
|
|
33
34
|
return f"[An image ({media_type}) was shared earlier in this thread but is not visible to {model_name}.]"
|
|
34
35
|
|
|
35
36
|
|
|
36
|
-
def
|
|
37
|
-
"""
|
|
37
|
+
def _oversized_image_placeholder(media_type: str, model_name: str) -> str:
|
|
38
|
+
"""Text substituted when a provider-safe image derivative cannot be made."""
|
|
39
|
+
return (
|
|
40
|
+
f"[An earlier image ({media_type}) exceeded {model_name}'s request limit and could not be resized safely, "
|
|
41
|
+
"so it was omitted from this request.]"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _adapt_image_block_for_provider(
|
|
46
|
+
block: ImageBlock,
|
|
47
|
+
*,
|
|
48
|
+
target_provider: str,
|
|
49
|
+
target_model: str,
|
|
50
|
+
supports_vision: bool,
|
|
51
|
+
max_image_dimension: Optional[int],
|
|
52
|
+
max_image_base64_bytes: int,
|
|
53
|
+
) -> tuple[ContentBlock, bool]:
|
|
54
|
+
"""Return a request-safe image block without mutating stored history."""
|
|
55
|
+
if not supports_vision:
|
|
56
|
+
return TextBlock(text=_image_placeholder(block.media_type, target_model)), True
|
|
57
|
+
|
|
58
|
+
if target_provider != "anthropic" or block.image_type != "base64":
|
|
59
|
+
return block, False
|
|
60
|
+
|
|
61
|
+
result = image_utils.resize_base64_image_to_limit(
|
|
62
|
+
block.data,
|
|
63
|
+
block.media_type,
|
|
64
|
+
max_base64_bytes=max_image_base64_bytes,
|
|
65
|
+
max_dimension=max_image_dimension,
|
|
66
|
+
)
|
|
67
|
+
if not result.succeeded:
|
|
68
|
+
logger.warning(
|
|
69
|
+
"Omitting oversized Anthropic history image that could not be resized: %s",
|
|
70
|
+
result.error or "unknown image conversion error",
|
|
71
|
+
)
|
|
72
|
+
return (
|
|
73
|
+
TextBlock(
|
|
74
|
+
text=_oversized_image_placeholder(block.media_type, target_model),
|
|
75
|
+
cache_checkpoint=block.cache_checkpoint,
|
|
76
|
+
),
|
|
77
|
+
True,
|
|
78
|
+
)
|
|
79
|
+
if not result.resized:
|
|
80
|
+
return block, False
|
|
81
|
+
|
|
82
|
+
assert result.data is not None
|
|
83
|
+
assert result.media_type is not None
|
|
84
|
+
logger.info(
|
|
85
|
+
"Resized Anthropic history image from %d to %d base64 bytes",
|
|
86
|
+
len(block.data),
|
|
87
|
+
len(result.data),
|
|
88
|
+
)
|
|
89
|
+
return (
|
|
90
|
+
ImageBlock(
|
|
91
|
+
image_type="base64",
|
|
92
|
+
media_type=result.media_type,
|
|
93
|
+
data=result.data,
|
|
94
|
+
cache_checkpoint=block.cache_checkpoint,
|
|
95
|
+
),
|
|
96
|
+
True,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _image_block_stats(messages: List[Message]) -> tuple[int, List[int]]:
|
|
101
|
+
"""Return total image count and base64 lengths, including nested tool results."""
|
|
38
102
|
count = 0
|
|
103
|
+
base64_sizes: List[int] = []
|
|
39
104
|
for message in messages:
|
|
40
105
|
if not isinstance(message.content, list):
|
|
41
106
|
continue
|
|
42
107
|
for block in message.content:
|
|
43
108
|
if isinstance(block, ImageBlock):
|
|
44
109
|
count += 1
|
|
110
|
+
if block.image_type == "base64":
|
|
111
|
+
base64_sizes.append(len(block.data))
|
|
45
112
|
elif isinstance(block, ToolResult) and isinstance(block.content, list):
|
|
46
|
-
|
|
47
|
-
|
|
113
|
+
for inner in block.content:
|
|
114
|
+
if isinstance(inner, ImageBlock):
|
|
115
|
+
count += 1
|
|
116
|
+
if inner.image_type == "base64":
|
|
117
|
+
base64_sizes.append(len(inner.data))
|
|
118
|
+
return count, base64_sizes
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def count_image_blocks(messages: List[Message]) -> int:
|
|
122
|
+
"""Count ``ImageBlock`` instances across messages, including ones nested in tool results."""
|
|
123
|
+
return _image_block_stats(messages)[0]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _anthropic_image_base64_limit(base64_sizes: List[int]) -> int:
|
|
127
|
+
"""Return a shared per-image cap that keeps aggregate image data request-safe.
|
|
128
|
+
|
|
129
|
+
Images already below the shared cap remain byte-for-byte unchanged. Larger
|
|
130
|
+
images divide the remaining aggregate budget evenly after accounting for
|
|
131
|
+
those smaller images, avoiding unnecessary reductions when the request
|
|
132
|
+
already fits.
|
|
133
|
+
"""
|
|
134
|
+
per_image_limit = image_utils.ANTHROPIC_MAX_IMAGE_BASE64_BYTES
|
|
135
|
+
aggregate_limit = image_utils.ANTHROPIC_MAX_REQUEST_IMAGE_BASE64_BYTES
|
|
136
|
+
projected_sizes = sorted(min(size, per_image_limit) for size in base64_sizes)
|
|
137
|
+
if sum(projected_sizes) <= aggregate_limit:
|
|
138
|
+
return per_image_limit
|
|
139
|
+
|
|
140
|
+
remaining_budget = aggregate_limit
|
|
141
|
+
for index, size in enumerate(projected_sizes):
|
|
142
|
+
remaining_images = len(projected_sizes) - index
|
|
143
|
+
shared_limit = remaining_budget // remaining_images
|
|
144
|
+
if size > shared_limit:
|
|
145
|
+
return max(4, min(per_image_limit, shared_limit))
|
|
146
|
+
remaining_budget -= size
|
|
147
|
+
return per_image_limit
|
|
48
148
|
|
|
49
149
|
|
|
50
150
|
def _provider_value(provider: Any) -> str:
|
|
@@ -199,6 +299,8 @@ def _adapt_content_blocks_for_provider(
|
|
|
199
299
|
target_provider: str,
|
|
200
300
|
target_model: str,
|
|
201
301
|
supports_vision: bool,
|
|
302
|
+
max_image_dimension: Optional[int] = None,
|
|
303
|
+
max_image_base64_bytes: int = image_utils.ANTHROPIC_MAX_IMAGE_BASE64_BYTES,
|
|
202
304
|
target_edit_protocol: Optional[str] = None,
|
|
203
305
|
tool_call_providers: Optional[Dict[str, str]] = None,
|
|
204
306
|
tool_call_protocols: Optional[Dict[str, Optional[str]]] = None,
|
|
@@ -209,9 +311,17 @@ def _adapt_content_blocks_for_provider(
|
|
|
209
311
|
changed = False
|
|
210
312
|
|
|
211
313
|
for block in blocks:
|
|
212
|
-
if isinstance(block, ImageBlock)
|
|
213
|
-
|
|
214
|
-
|
|
314
|
+
if isinstance(block, ImageBlock):
|
|
315
|
+
adapted_block, image_changed = _adapt_image_block_for_provider(
|
|
316
|
+
block,
|
|
317
|
+
target_provider=target_provider,
|
|
318
|
+
target_model=target_model,
|
|
319
|
+
supports_vision=supports_vision,
|
|
320
|
+
max_image_dimension=max_image_dimension,
|
|
321
|
+
max_image_base64_bytes=max_image_base64_bytes,
|
|
322
|
+
)
|
|
323
|
+
adapted.append(adapted_block)
|
|
324
|
+
changed = changed or image_changed
|
|
215
325
|
elif isinstance(block, (ThinkingBlock, RedactedThinkingBlock, ResponsesReasoningBlock)):
|
|
216
326
|
if _preserve_reasoning_block(block, source_provider=source_provider, target_provider=target_provider):
|
|
217
327
|
adapted.append(block)
|
|
@@ -240,7 +350,26 @@ def _adapt_content_blocks_for_provider(
|
|
|
240
350
|
source_edit_protocol=call_protocol,
|
|
241
351
|
target_edit_protocol=target_edit_protocol,
|
|
242
352
|
):
|
|
243
|
-
|
|
353
|
+
if isinstance(block.content, list):
|
|
354
|
+
inner, inner_changed = _adapt_content_blocks_for_provider(
|
|
355
|
+
block.content,
|
|
356
|
+
source_provider=source_provider,
|
|
357
|
+
target_provider=target_provider,
|
|
358
|
+
target_model=target_model,
|
|
359
|
+
supports_vision=supports_vision,
|
|
360
|
+
max_image_dimension=max_image_dimension,
|
|
361
|
+
max_image_base64_bytes=max_image_base64_bytes,
|
|
362
|
+
target_edit_protocol=target_edit_protocol,
|
|
363
|
+
tool_call_providers=tool_call_providers,
|
|
364
|
+
tool_call_protocols=tool_call_protocols,
|
|
365
|
+
source_usage_metadata=source_usage_metadata,
|
|
366
|
+
# Nested tool-result content is tool output, never assistant prose.
|
|
367
|
+
message_role=None,
|
|
368
|
+
)
|
|
369
|
+
adapted.append(_tool_result_with_content(block, inner) if inner_changed else block)
|
|
370
|
+
changed = changed or inner_changed
|
|
371
|
+
else:
|
|
372
|
+
adapted.append(block)
|
|
244
373
|
else:
|
|
245
374
|
adapted.append(_freeform_result_placeholder(block, call_source))
|
|
246
375
|
changed = True
|
|
@@ -271,6 +400,8 @@ def _adapt_content_blocks_for_provider(
|
|
|
271
400
|
target_provider=target_provider,
|
|
272
401
|
target_model=target_model,
|
|
273
402
|
supports_vision=supports_vision,
|
|
403
|
+
max_image_dimension=max_image_dimension,
|
|
404
|
+
max_image_base64_bytes=max_image_base64_bytes,
|
|
274
405
|
target_edit_protocol=target_edit_protocol,
|
|
275
406
|
tool_call_providers=tool_call_providers,
|
|
276
407
|
tool_call_protocols=tool_call_protocols,
|
|
@@ -315,8 +446,9 @@ def adapt_history_for_provider(
|
|
|
315
446
|
blocks — substituting model-visible text there gets echoed back by the model
|
|
316
447
|
and then persisted as real history. Assistant text carrying placeholders
|
|
317
448
|
echoed by earlier builds is scrubbed for the same reason. Image blocks are
|
|
318
|
-
preserved for vision models
|
|
319
|
-
|
|
449
|
+
preserved for vision models, except that oversized base64 images get an
|
|
450
|
+
ephemeral provider-safe derivative for Anthropic. Non-vision models receive
|
|
451
|
+
placeholders, matching the previous image compatibility behavior.
|
|
320
452
|
|
|
321
453
|
An assistant message left with no content blocks is omitted from the returned
|
|
322
454
|
history. That orphans nothing: tool calls are never dropped by this pass, so
|
|
@@ -327,6 +459,16 @@ def adapt_history_for_provider(
|
|
|
327
459
|
target_provider = _provider_value(target_provider)
|
|
328
460
|
if target_edit_protocol is not None:
|
|
329
461
|
target_edit_protocol = _provider_value(target_edit_protocol)
|
|
462
|
+
max_image_dimension: Optional[int] = None
|
|
463
|
+
max_image_base64_bytes = image_utils.ANTHROPIC_MAX_IMAGE_BASE64_BYTES
|
|
464
|
+
if target_provider == "anthropic" and supports_vision:
|
|
465
|
+
image_count, base64_sizes = _image_block_stats(messages)
|
|
466
|
+
max_image_dimension = (
|
|
467
|
+
image_utils.ANTHROPIC_MANY_IMAGE_MAX_DIMENSION
|
|
468
|
+
if image_count > image_utils.ANTHROPIC_MANY_IMAGE_THRESHOLD
|
|
469
|
+
else image_utils.ANTHROPIC_MAX_IMAGE_DIMENSION
|
|
470
|
+
)
|
|
471
|
+
max_image_base64_bytes = _anthropic_image_base64_limit(base64_sizes)
|
|
330
472
|
result: List[Message] = []
|
|
331
473
|
changed_any = False
|
|
332
474
|
tool_call_providers: Dict[str, str] = {}
|
|
@@ -351,6 +493,8 @@ def adapt_history_for_provider(
|
|
|
351
493
|
target_provider=target_provider,
|
|
352
494
|
target_model=target_model,
|
|
353
495
|
supports_vision=supports_vision,
|
|
496
|
+
max_image_dimension=max_image_dimension,
|
|
497
|
+
max_image_base64_bytes=max_image_base64_bytes,
|
|
354
498
|
target_edit_protocol=target_edit_protocol,
|
|
355
499
|
tool_call_providers=tool_call_providers,
|
|
356
500
|
tool_call_protocols=tool_call_protocols,
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"""Shared image-encoding and MIME helpers for vision support.
|
|
2
|
+
|
|
3
|
+
Used by the CLI attachment paths (@-mention detection, ``/attach`` slash
|
|
4
|
+
command, clipboard paste, the ``ask --image`` flag) and by the agent
|
|
5
|
+
``read_image`` tool backend. Keeping the MIME map and base64 encoding in one
|
|
6
|
+
place avoids three copies of the logic and CLI<->agent import cycles.
|
|
7
|
+
|
|
8
|
+
``ascii_thumbnail_from_base64`` is the display-only renderer used by
|
|
9
|
+
``ImageBlock.to_markdown`` so that expanding an image tool call in the TUI
|
|
10
|
+
shows a small ASCII-art preview instead of a wall of base64.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import base64
|
|
16
|
+
import io
|
|
17
|
+
import math
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Dict, Optional, Union
|
|
21
|
+
|
|
22
|
+
from PIL import Image, ImageOps
|
|
23
|
+
|
|
24
|
+
# Supported image extensions -> MIME types. These are the common web image
|
|
25
|
+
# formats accepted by all four provider backends (Anthropic, OpenAI, Google,
|
|
26
|
+
# ChatGPT/Responses).
|
|
27
|
+
IMAGE_MIME_TYPES: Dict[str, str] = {
|
|
28
|
+
".png": "image/png",
|
|
29
|
+
".jpg": "image/jpeg",
|
|
30
|
+
".jpeg": "image/jpeg",
|
|
31
|
+
".gif": "image/gif",
|
|
32
|
+
".webp": "image/webp",
|
|
33
|
+
".bmp": "image/bmp",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Skip images larger than this to avoid blowing the context budget.
|
|
37
|
+
MAX_IMAGE_BYTES = 20 * 1024 * 1024
|
|
38
|
+
|
|
39
|
+
# Anthropic validates the encoded ``source.base64`` field itself, not the
|
|
40
|
+
# decoded image size. A raw image just under 10 MiB may therefore exceed this
|
|
41
|
+
# limit after base64's 4/3 expansion.
|
|
42
|
+
ANTHROPIC_MAX_IMAGE_BASE64_BYTES = 10 * 1024 * 1024
|
|
43
|
+
# Anthropic accepts images up to 8,000 px on either axis for ordinary
|
|
44
|
+
# requests. Once the request contains more than 20 images, every image must
|
|
45
|
+
# instead fit within 2,000 x 2,000 px.
|
|
46
|
+
ANTHROPIC_MAX_IMAGE_DIMENSION = 8_000
|
|
47
|
+
ANTHROPIC_MANY_IMAGE_THRESHOLD = 20
|
|
48
|
+
ANTHROPIC_MANY_IMAGE_MAX_DIMENSION = 2_000
|
|
49
|
+
# Anthropic rejects standard API requests above 32 MB. Keep aggregate base64
|
|
50
|
+
# image data at 24 MiB so JSON, system prompts, tools, and text history retain
|
|
51
|
+
# substantial request headroom.
|
|
52
|
+
ANTHROPIC_MAX_REQUEST_IMAGE_BASE64_BYTES = 24 * 1024 * 1024
|
|
53
|
+
|
|
54
|
+
# Leave headroom below the provider's hard boundary when producing a
|
|
55
|
+
# derivative. This avoids repeatedly re-encoding an image for tiny accounting
|
|
56
|
+
# differences and gives later request serialization a conservative margin.
|
|
57
|
+
_IMAGE_RESIZE_SAFETY_RATIO = 0.95
|
|
58
|
+
_IMAGE_RESIZE_MAX_ATTEMPTS = 12
|
|
59
|
+
# Bound decoded working memory before Pillow copies/converts a provider
|
|
60
|
+
# derivative. Forty megapixels can already require 160 MiB as RGBA.
|
|
61
|
+
_IMAGE_RESIZE_MAX_PIXELS = 40_000_000
|
|
62
|
+
|
|
63
|
+
# Dark -> light ramp for grayscale ASCII rendering. Index 0 (space) is the
|
|
64
|
+
# darkest pixel; the last char (``@``) is the brightest.
|
|
65
|
+
_ASCII_RAMP = " .:-=+*#%@"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass(frozen=True)
|
|
69
|
+
class ImageResizeResult:
|
|
70
|
+
"""Result of fitting a base64 image to a provider payload limit."""
|
|
71
|
+
|
|
72
|
+
data: Optional[str]
|
|
73
|
+
media_type: Optional[str]
|
|
74
|
+
resized: bool
|
|
75
|
+
error: Optional[str] = None
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def succeeded(self) -> bool:
|
|
79
|
+
return self.data is not None and self.media_type is not None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def base64_encoded_size(raw_size: int) -> int:
|
|
83
|
+
"""Return the exact base64 length for ``raw_size`` bytes."""
|
|
84
|
+
if raw_size < 0:
|
|
85
|
+
raise ValueError("raw_size must be non-negative")
|
|
86
|
+
return 4 * ((raw_size + 2) // 3)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def max_raw_size_for_base64_limit(encoded_limit: int) -> int:
|
|
90
|
+
"""Return the largest raw byte count whose base64 fits ``encoded_limit``."""
|
|
91
|
+
if encoded_limit < 0:
|
|
92
|
+
raise ValueError("encoded_limit must be non-negative")
|
|
93
|
+
return 3 * (encoded_limit // 4)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def resize_base64_image_to_limit(
|
|
97
|
+
data: str,
|
|
98
|
+
media_type: str,
|
|
99
|
+
*,
|
|
100
|
+
max_base64_bytes: int,
|
|
101
|
+
max_dimension: Optional[int] = None,
|
|
102
|
+
) -> ImageResizeResult:
|
|
103
|
+
"""Return a non-mutating provider-safe derivative of a base64 image.
|
|
104
|
+
|
|
105
|
+
Images already within the byte and optional dimension limits are returned
|
|
106
|
+
byte-for-byte unchanged. Oversized images are decoded and re-encoded as PNG
|
|
107
|
+
when transparency must be retained, or optimized JPEG otherwise.
|
|
108
|
+
Dimensions are reduced proportionally to the requested maximum first, then
|
|
109
|
+
iteratively until the payload has a safety margin below the provider limit.
|
|
110
|
+
Animated images use their first frame for the ephemeral provider copy.
|
|
111
|
+
"""
|
|
112
|
+
if max_base64_bytes <= 0:
|
|
113
|
+
raise ValueError("max_base64_bytes must be positive")
|
|
114
|
+
if max_dimension is not None and max_dimension <= 0:
|
|
115
|
+
raise ValueError("max_dimension must be positive")
|
|
116
|
+
|
|
117
|
+
if not data.isascii():
|
|
118
|
+
return ImageResizeResult(None, None, resized=False, error="Image payload is not ASCII base64")
|
|
119
|
+
encoded_size = len(data)
|
|
120
|
+
|
|
121
|
+
# Existing byte-only callers keep the cheap path and never decode a valid
|
|
122
|
+
# image that already fits. A dimension constraint requires reading the
|
|
123
|
+
# image header before the same unchanged decision can be made.
|
|
124
|
+
if encoded_size <= max_base64_bytes and max_dimension is None:
|
|
125
|
+
return ImageResizeResult(data, media_type, resized=False)
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
raw = base64.b64decode(data, validate=True)
|
|
129
|
+
with Image.open(io.BytesIO(raw)) as opened:
|
|
130
|
+
opened.seek(0)
|
|
131
|
+
width, height = opened.size
|
|
132
|
+
dimensions_fit = max_dimension is None or (width <= max_dimension and height <= max_dimension)
|
|
133
|
+
if encoded_size <= max_base64_bytes and dimensions_fit:
|
|
134
|
+
return ImageResizeResult(data, media_type, resized=False)
|
|
135
|
+
if width * height > _IMAGE_RESIZE_MAX_PIXELS:
|
|
136
|
+
return ImageResizeResult(
|
|
137
|
+
None,
|
|
138
|
+
None,
|
|
139
|
+
resized=False,
|
|
140
|
+
error=f"Image dimensions exceed the {_IMAGE_RESIZE_MAX_PIXELS:,}-pixel resize safety limit",
|
|
141
|
+
)
|
|
142
|
+
image = ImageOps.exif_transpose(opened).copy()
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
return ImageResizeResult(None, None, resized=False, error=f"Could not decode image: {exc}")
|
|
145
|
+
|
|
146
|
+
has_transparency = "A" in image.getbands() or "transparency" in image.info
|
|
147
|
+
if max_dimension is not None and (image.width > max_dimension or image.height > max_dimension):
|
|
148
|
+
image.thumbnail((max_dimension, max_dimension), Image.Resampling.LANCZOS)
|
|
149
|
+
|
|
150
|
+
if has_transparency:
|
|
151
|
+
image = image.convert("RGBA")
|
|
152
|
+
output_format = "PNG"
|
|
153
|
+
output_media_type = "image/png"
|
|
154
|
+
else:
|
|
155
|
+
image = image.convert("RGB")
|
|
156
|
+
output_format = "JPEG"
|
|
157
|
+
output_media_type = "image/jpeg"
|
|
158
|
+
|
|
159
|
+
target_size = int(max_base64_bytes * _IMAGE_RESIZE_SAFETY_RATIO)
|
|
160
|
+
target_size -= target_size % 4
|
|
161
|
+
if target_size < 4:
|
|
162
|
+
return ImageResizeResult(
|
|
163
|
+
None,
|
|
164
|
+
None,
|
|
165
|
+
resized=False,
|
|
166
|
+
error=f"Could not fit image below the {max_base64_bytes}-byte base64 limit",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
for _ in range(_IMAGE_RESIZE_MAX_ATTEMPTS):
|
|
170
|
+
output = io.BytesIO()
|
|
171
|
+
try:
|
|
172
|
+
if output_format == "PNG":
|
|
173
|
+
image.save(output, format=output_format, optimize=True, compress_level=9)
|
|
174
|
+
else:
|
|
175
|
+
image.save(output, format=output_format, quality=90, optimize=True, progressive=True)
|
|
176
|
+
except Exception as exc:
|
|
177
|
+
return ImageResizeResult(None, None, resized=False, error=f"Could not encode resized image: {exc}")
|
|
178
|
+
|
|
179
|
+
derivative = base64.b64encode(output.getvalue()).decode("ascii")
|
|
180
|
+
if len(derivative) <= target_size:
|
|
181
|
+
return ImageResizeResult(derivative, output_media_type, resized=True)
|
|
182
|
+
|
|
183
|
+
width, height = image.size
|
|
184
|
+
if width <= 1 and height <= 1:
|
|
185
|
+
break
|
|
186
|
+
|
|
187
|
+
# Encoded size trends with pixel area, so the square root estimates a
|
|
188
|
+
# useful one-step dimension ratio. The extra margin guarantees progress
|
|
189
|
+
# when compression ratios are nonlinear.
|
|
190
|
+
ratio = math.sqrt(target_size / len(derivative)) * 0.95
|
|
191
|
+
ratio = min(0.9, max(0.1, ratio))
|
|
192
|
+
next_width = max(1, int(width * ratio))
|
|
193
|
+
next_height = max(1, int(height * ratio))
|
|
194
|
+
if next_width == width and width > 1:
|
|
195
|
+
next_width -= 1
|
|
196
|
+
if next_height == height and height > 1:
|
|
197
|
+
next_height -= 1
|
|
198
|
+
image = image.resize((next_width, next_height), Image.Resampling.LANCZOS)
|
|
199
|
+
|
|
200
|
+
return ImageResizeResult(
|
|
201
|
+
None,
|
|
202
|
+
None,
|
|
203
|
+
resized=False,
|
|
204
|
+
error=f"Could not fit image below the {max_base64_bytes}-byte base64 limit",
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def image_media_type(path_or_suffix: Union[str, Path]) -> Optional[str]:
|
|
209
|
+
"""Return the MIME type for an image path/suffix, or ``None`` if unsupported.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
path_or_suffix: A file path (e.g. ``"assets/logo.png"``) or a bare
|
|
213
|
+
extension (e.g. ``".png"`` or ``"png"``). Case-insensitive.
|
|
214
|
+
"""
|
|
215
|
+
text = str(path_or_suffix).lower()
|
|
216
|
+
if text.startswith("."):
|
|
217
|
+
suffix = text
|
|
218
|
+
else:
|
|
219
|
+
suffix = Path(text).suffix.lower()
|
|
220
|
+
if not suffix: # bare extension like "png" with no dot or path sep
|
|
221
|
+
suffix = f".{text}" if "/" not in text and "\\" not in text else ""
|
|
222
|
+
return IMAGE_MIME_TYPES.get(suffix)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def is_supported_image(path: Union[str, Path]) -> bool:
|
|
226
|
+
"""True if ``path`` has a supported image extension."""
|
|
227
|
+
return image_media_type(path) is not None
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def encode_image_attachment(data: bytes, media_type: str, *, path: Optional[str] = None) -> Dict[str, Any]:
|
|
231
|
+
"""Build an image attachment dict from raw bytes.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
data: Raw image bytes.
|
|
235
|
+
media_type: MIME type (e.g. ``"image/png"``).
|
|
236
|
+
path: Optional source path included for display/debugging.
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
``{"type": "image", "media_type": ..., "data": "<base64>", ...}`` —
|
|
240
|
+
the shape consumed by ``BaseAgent._attachment_blocks``.
|
|
241
|
+
"""
|
|
242
|
+
attachment: Dict[str, Any] = {
|
|
243
|
+
"type": "image",
|
|
244
|
+
"media_type": media_type,
|
|
245
|
+
"data": base64.b64encode(data).decode("ascii"),
|
|
246
|
+
}
|
|
247
|
+
if path:
|
|
248
|
+
attachment["path"] = path
|
|
249
|
+
return attachment
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def encode_image_file(path: Union[str, Path]) -> Optional[Dict[str, Any]]:
|
|
253
|
+
"""Read, validate, and base64-encode an image file.
|
|
254
|
+
|
|
255
|
+
Returns ``None`` if the path is not a supported image format, the file is
|
|
256
|
+
missing/unreadable, or it exceeds ``MAX_IMAGE_BYTES`` (so callers can fall
|
|
257
|
+
back to a friendly message instead of crashing).
|
|
258
|
+
"""
|
|
259
|
+
path = Path(path)
|
|
260
|
+
media_type = image_media_type(path)
|
|
261
|
+
if media_type is None:
|
|
262
|
+
return None
|
|
263
|
+
try:
|
|
264
|
+
if not path.is_file():
|
|
265
|
+
return None
|
|
266
|
+
size = path.stat().st_size
|
|
267
|
+
except OSError:
|
|
268
|
+
return None
|
|
269
|
+
if size > MAX_IMAGE_BYTES:
|
|
270
|
+
return None
|
|
271
|
+
try:
|
|
272
|
+
data = path.read_bytes()
|
|
273
|
+
except OSError:
|
|
274
|
+
return None
|
|
275
|
+
return encode_image_attachment(data, media_type, path=str(path))
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def ascii_thumbnail_from_base64(data: str, media_type: str, *, width: int = 40, height: int = 20) -> str:
|
|
279
|
+
"""Render a grayscale ASCII-art thumbnail from a base64-encoded image.
|
|
280
|
+
|
|
281
|
+
Decodes the image with Pillow, converts to grayscale, downsamples to
|
|
282
|
+
``width`` x ``height``, and maps each pixel's brightness to a character
|
|
283
|
+
in ``_ASCII_RAMP`` (dark = space, light = ``@``).
|
|
284
|
+
|
|
285
|
+
Returns the multi-line ASCII string. If the image cannot be decoded
|
|
286
|
+
(corrupt data, unsupported format, etc.), returns a short placeholder
|
|
287
|
+
string instead of raising — a malformed image must never crash the TUI.
|
|
288
|
+
"""
|
|
289
|
+
try:
|
|
290
|
+
raw = base64.b64decode(data)
|
|
291
|
+
img = Image.open(io.BytesIO(raw))
|
|
292
|
+
img = img.convert("L").resize((width, height), Image.Resampling.LANCZOS)
|
|
293
|
+
except Exception:
|
|
294
|
+
return f"[Image — {media_type} — could not render preview]"
|
|
295
|
+
|
|
296
|
+
pixels = img.load()
|
|
297
|
+
if pixels is None:
|
|
298
|
+
return f"[Image — {media_type} — could not render preview]"
|
|
299
|
+
ramp_last = len(_ASCII_RAMP) - 1
|
|
300
|
+
lines: list[str] = []
|
|
301
|
+
for y in range(height):
|
|
302
|
+
chars: list[str] = []
|
|
303
|
+
for x in range(width):
|
|
304
|
+
v = pixels[x, y]
|
|
305
|
+
if isinstance(v, tuple):
|
|
306
|
+
v = v[0]
|
|
307
|
+
chars.append(_ASCII_RAMP[int(v) * ramp_last // 255])
|
|
308
|
+
lines.append("".join(chars))
|
|
309
|
+
return "\n".join(lines)
|