main
843 次代码提交
| 作者 | SHA1 | 备注 | 提交日期 | |
|---|---|---|---|---|
|
|
e614c49cf0 |
Make configuration guidance easier to scan (#1227)
CI / Ban suppressions and legacy annotations (push) Has been cancelled
CI / pytest (push) Has been cancelled
CI / ruff-check (push) Has been cancelled
CI / ruff-format (push) Has been cancelled
CI / ty (push) Has been cancelled
## Problem Provider setup, reasoning choices, and uninstall boundaries were embedded in dense paragraphs, making customer guidance harder to scan. ## Changes | Before | After | | --- | --- | | Provider setup compressed every action into one paragraph. | Provider setup follows a four-step workflow. | | Reasoning guidance mixed user choices with provider translation internals. | Reasoning guidance presents only user-facing behaviors in a compact table. | | Uninstall boundaries were buried in prose. | Uninstall guidance separates what FCC removes from what it keeps. | |
||
|
|
cdc08c5572 |
Structure startup instructions by platform (#1226)
## Problem The startup section combines Windows, macOS, Linux, desktop, and terminal behavior in one block, making each platform's launch path harder to scan. ## Changes | Before | After | | --- | --- | | Startup instructions mixed all platforms in one paragraph. | Startup instructions use separate Windows, macOS, and Linux subsections. | | Desktop and terminal details interrupted the platform-specific steps. | Shared desktop and terminal details follow the platform-specific steps. | |
||
|
|
d98a6b0ca0 |
Add a native FCC desktop launcher for Windows and macOS (#1225)
## Problem Free Claude Code currently has to remain attached to a terminal, so closing that window stops the proxy and users have no native way to reopen Admin or control the background server. The contributed Windows wrapper also would have introduced a second bundled server lifecycle instead of reusing FCC's cleanup and restart ownership. Fixes #1147. ## Changes | Before | After | | --- | --- | | Users keep `fcc-server` running in a terminal. | Windows and macOS users can launch a console-free FCC Desktop host from a desktop/application shortcut and control it from the tray or menu bar. | | A wrapper would need to spawn and terminate a child server. | The terminal and desktop paths share one in-process supervisor, one graceful runtime shutdown path, and an OS-held singleton lock. | | Installers manage only command entry points. | Windows installs desktop and Start-menu shortcuts; macOS installs a per-user app bundle and owned desktop link; uninstallers remove only those FCC artifacts. | | Desktop behavior had no contract coverage. | Lifecycle, duplicate launch, restart/quit, GUI packaging, Windows shortcuts, macOS bundle creation, quoting, and ownership boundaries are covered alongside the full CI suite. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds a native FCC desktop launcher for Windows and macOS. The main changes are: - A shared server supervisor for terminal and desktop launches. - A singleton desktop host with tray or menu-bar controls. - Windows shortcuts and a per-user macOS app bundle. - Ownership checks for launcher installation and removal. - Tests for lifecycle, packaging, shortcuts, and uninstall behavior. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. Startup restart requests are reserved before the worker starts. macOS bundle operations verify ownership before modifying or deleting files. Windows shortcut operations verify their targets before replacement or removal. No blocking issues were found in the updated code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Compared the pre-change contract test results against the parent commit f81af55630aa1adb518b748b9e6985c73c4c4775 and observed 3 failures and 4 passes, indicating the missing scheduled-startup lifecycle contract. - Executed the after-state contract validation with uv run pytest -n 0 tests/cli/test\_desktop.py -q and confirmed the run finished with 7 passes and an exit code of 0. - Verified that no real proxy or native GUI dependency was started during the after-state run. - Inspected the two log artifacts that accompany the proof to corroborate the test outcomes. <a href="https://app.greptile.com/trex/runs/15235588/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/commands.py | Adds the shared server supervisor and scheduled-run state for startup restart requests. | | src/free_claude_code/cli/desktop.py | Adds singleton locking and coordinates the tray loop with the server worker. | | scripts/install.sh | Creates the macOS app bundle only when an existing bundle is FCC-owned. | | scripts/uninstall.sh | Removes the macOS launcher only on macOS and only with the expected ownership marker. | | scripts/install.ps1 | Creates Windows shortcuts while preserving shortcuts with unrelated targets. | | scripts/uninstall.ps1 | Removes Windows shortcuts only when their targets match an FCC desktop entry point. | </details> <sub>Reviews (3): Last reviewed commit: ["fix: coalesce desktop startup restarts"](https://github.com/alishahryar1/free-claude-code/commit/b9554729770e08a58818d677de39757c751e760e) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45925660)</sub> <!-- /greptile_comment --> |
||
|
|
2a676cc6d9 |
Make ProviderModelInfo the sole model-catalog contract (#1222)
## Problem Provider model discovery consumes metadata, but providers and the cache still expose a parallel IDs-only contract. The duplicate contract adds adapters and lets tests bypass capability metadata. ## Changes | Before | After | | --- | --- | | `BaseProvider` exposed `list_model_ids()` plus a metadata adapter. | `BaseProvider` exposes only abstract `list_model_infos()` returning application-owned metadata. | | Ordinary providers parsed IDs and converted them later. | Ordinary providers parse OpenAI-compatible catalogs directly into `ProviderModelInfo` values. | | OpenRouter, Cloudflare, and GitHub Models maintained redundant IDs-only wrappers. | Provider-specific filters and capability metadata have one return path. | | Vertex returned paginated IDs for the base adapter to wrap. | Vertex returns metadata after completing the same paginated discovery flow. | | The runtime cache exposed test-only raw-ID write and prefixed-ID read helpers. | The runtime cache accepts and returns metadata while retaining its production admin-status ID projection. | | Provider tests asserted the parallel IDs-only API. | Provider tests enforce the metadata-only contract and preserve provider-specific discovery behavior. | | The package version was `4.11.6`. | The package version is `4.11.7` with an updated lockfile. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR makes provider metadata the only model-catalog contract. The main changes are: - Makes `list_model_infos()` the abstract provider discovery API. - Migrates provider parsers and implementations to `ProviderModelInfo`. - Removes IDs-only cache and parser helpers. - Updates provider tests, architecture documentation, and package metadata. </details> <h3>Confidence Score: 4/5</h3> The catalog migration is consistent, but the release version must reflect the incompatible API removal. Repository provider and cache call paths use the new metadata shape consistently. Existing external consumers of the removed contracts can fail after a patch upgrade. The repository rules classify incompatible API removals as a major release. pyproject.toml and the matching package entry in uv.lock <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The external-consumer compatibility probe was run against both revisions, confirming the base still supports the legacy provider contract, while head fails with a TypeError due to the missing list\_model\_infos method, and runtime metadata shows head at version 4.11.7, indicating the removal is a patch transition rather than a major change. - An automated test suite completed successfully with 83 tests passing in 3.31 seconds. <a href="https://app.greptile.com/trex/runs/15207030/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/base.py | Replaces the IDs-only provider API with an abstract metadata-only contract. | | src/free_claude_code/providers/model_listing.py | Consolidates OpenAI-compatible parsing into ProviderModelInfo results and removes IDs-only helpers. | | src/free_claude_code/providers/runtime/model_cache.py | Removes raw-ID helpers while retaining metadata storage and the admin ID projection. | | src/free_claude_code/providers/openai_chat/provider.py | Provides the metadata discovery implementation inherited by ordinary OpenAI-compatible providers. | | src/free_claude_code/providers/vertex/client.py | Preserves paginated discovery while returning metadata values. | | pyproject.toml | Uses a patch bump for a release that removes callable and importable contracts. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart LR A[Provider catalog endpoint] --> B[list_model_infos] B --> C[ProviderModelInfo set] C --> D[Provider model discovery] D --> E[ProviderModelCache] E --> F[Metadata-aware catalog] E --> G[Admin ID projection] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart LR A[Provider catalog endpoint] --> B[list_model_infos] B --> C[ProviderModelInfo set] C --> D[Provider model discovery] D --> E[ProviderModelCache] E --> F[Metadata-aware catalog] E --> G[Admin ID projection] ``` </a> </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fprovider-model-info-contract%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fprovider-model-info-contract%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Apyproject.toml%3A7%0A**Breaking%20Contract%20Ships%20as%20Patch**%0A%0AThis%20release%20removes%20%60BaseProvider.list_model_ids%28%29%60%20and%20cache%2Fparser%20methods%20that%20existing%20integrations%20can%20import%20or%20call.%20Such%20consumers%20will%20fail%20with%20%60TypeError%60%2C%20%60AttributeError%60%2C%20or%20%60ImportError%60%20after%20a%20patch%20upgrade%2C%20so%20this%20incompatible%20API%20change%20requires%20a%20major%20version%20bump%20under%20the%20repository's%20versioning%20rules.%0A%0A%60%60%60suggestion%0Aversion%20%3D%20%225.0.0%22%0A%60%60%60%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1222&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Make ProviderModelInfo the sole catalog ..."](https://github.com/alishahryar1/free-claude-code/commit/5c543eadc114201a4085d38885a27ac49153ca29) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45869248)</sub> > Greptile also left **1 inline comment** on this PR. **Context used:** - Context used - CLAUDE.md ([source](https://app.greptile.com/alishahryar1/github/Alishahryar1/free-claude-code/-/custom-context?memory=d2fd24d8-0dec-4faf-8ee4-e085e215a2f8)) <!-- /greptile_comment --> |
||
|
|
1a476562fc |
Make provider model discovery the sole catalog owner (#1221)
## Problem Startup model-list I/O was split between a non-enforcing configured-model validator and the real discovery path. Both queried providers and populated the same cache even though synchronous cache warm-up was the validator's only required effect. ## Changes | Before | After | | --- | --- | | Validation and discovery independently resolved providers, queried model lists, and cached results. | `ProviderModelDiscovery` solely owns model-list queries, failure reporting, and cache population. | | Startup ran configured-model validation and then launched discovery. | Startup synchronously warms referenced providers through discovery, then launches the existing missing-provider background pass. | | Absence from a provider catalog produced a non-enforcing missing-model warning. | Provider catalogs remain discovery metadata and provider execution remains authoritative. | | Configured model references retained environment-source metadata for validator diagnostics. | Configured model references retain only routing data. | | Successful startup providers could be represented by two separate subsystems. | Focused tests enforce concurrent warm-up, single successful queries, failed-query eligibility, and warm-before-background ordering. | | The package version was `4.11.5`. | The package version is `4.11.6` with an updated lockfile. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR makes provider discovery the sole owner of model catalogs. The main changes are: - Warms routed provider catalogs before background discovery starts. - Reuses successful warm results while retrying failed providers. - Removes configured-model catalog validation and source metadata. - Moves query-failure reporting into the discovery module. - Updates focused tests, architecture docs, and package version. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. Provider failures remain isolated and eligible for background retry. Successful warm results are not queried again by the missing-provider pass. Lease release and startup cleanup remain protected by existing control flow. None. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - \`test\_runtime\_warm\_queries\_referenced\_providers\_concurrently\`, \`test\_startup\_discovery\_queries\_each\_successful\_provider\_once\`, \`test\_failed\_startup\_warm\_remains\_eligible\_for\_background\_refresh\`, \`test\_runtime\_warm\_caches\_all\_referenced\_provider\_models\`, and \`test\_runtime\_startup\_warms\_catalog\_before\_background\_refresh\` all passed. - The complete verbose HEAD run, including command, working directory, exit code, test nodes, and summary, is preserved in \`trex-artifacts/provider-discovery-startup-validation.log\` and the paired after artifact. <a href="https://app.greptile.com/trex/runs/15203372/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/runtime/discovery.py | Centralizes catalog queries, failure reporting, referenced-provider warming, and cache population. | | src/free_claude_code/runtime/provider_manager.py | Replaces validation with discovery-based warming under a generation lease. | | src/free_claude_code/runtime/application.py | Warms referenced catalogs before launching the missing-provider background pass. | | src/free_claude_code/config/model_refs.py | Removes validation-only source metadata while preserving deterministic deduplication. | | tests/providers/test_model_discovery.py | Covers concurrent warming, partial failures, retry eligibility, and single successful queries. | </details> <details open><summary><h3>Sequence Diagram</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% sequenceDiagram participant App as ApplicationRuntime participant Manager as ProviderRuntimeManager participant Discovery as ProviderModelDiscovery participant Provider participant Cache as ProviderModelCache App->>Manager: warm_referenced_model_cache() Manager->>Discovery: warm referenced providers par Provider queries Discovery->>Provider: list_model_infos() end Provider-->>Discovery: metadata or failure Discovery->>Cache: cache successful results Discovery-->>Manager: refresh result Manager-->>App: warm complete App->>Manager: start_model_list_refresh() Manager->>Discovery: refresh only missing providers Discovery->>Cache: cache remaining catalogs ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant App as ApplicationRuntime participant Manager as ProviderRuntimeManager participant Discovery as ProviderModelDiscovery participant Provider participant Cache as ProviderModelCache App->>Manager: warm_referenced_model_cache() Manager->>Discovery: warm referenced providers par Provider queries Discovery->>Provider: list_model_infos() end Provider-->>Discovery: metadata or failure Discovery->>Cache: cache successful results Discovery-->>Manager: refresh result Manager-->>App: warm complete App->>Manager: start_model_list_refresh() Manager->>Discovery: refresh only missing providers Discovery->>Cache: cache remaining catalogs ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["Unify provider model discovery ownership"](https://github.com/alishahryar1/free-claude-code/commit/33f68e4338fd2326a7d8fd3e7e28246b47fa4210) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45862060)</sub> <!-- /greptile_comment --> |
||
|
|
5305bd7e08 |
Remove obsolete init and server alias commands (#1220)
## Problem
FCC still publishes `fcc-init` and the `free-claude-code` server alias
from an obsolete installation flow. Configuration creation now belongs
to the Admin UI, while `fcc-server` owns startup and legacy migration.
## Changes
| Before | After |
| --- | --- |
| The package installs six console commands. | The package installs only
`fcc-server`, `fcc-claude`, `fcc-codex`, and `fcc-pi`. |
| `fcc-init` duplicates configuration creation outside the Admin UI. |
The Admin UI exclusively creates managed configuration, and server
startup retains legacy migration. |
| Smoke contracts and architecture describe the retired commands. |
Smoke contracts and architecture describe the supported command surface.
|
| Installer safety lists contain unexplained retired names. | Installer
safety lists document why retired names remain detectable during updates
and uninstall. |
| The package version is `4.11.4`. | The package version is `4.11.5`. |
<!-- greptile_comment -->
<details open><summary><h3>Greptile Summary</h3></summary>
This PR retires the obsolete initialization command and server alias.
The main changes are:
- Removes `fcc-init` and `free-claude-code` from package scripts.
- Moves fresh configuration creation exclusively to the Admin UI.
- Keeps legacy environment migration in `fcc-server` startup.
- Updates smoke coverage, installer comments, documentation, and package
metadata.
</details>
<h3>Confidence Score: 4/5</h3>
The CLI removal needs a compatible release version or temporary aliases
before merging.
Existing automation can lose `fcc-init` and `free-claude-code` after a
patch upgrade. Fresh installs can still start the server and create
configuration through the Admin UI.
pyproject.toml and uv.lock; legacy configuration migration remains
before settings loading.
<details><summary><h3><a href="https://www.greptile.com/trex"><img
alt="T-Rex"
src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg"
height="20" align="absmiddle"></a> T-Rex Logs</h3></summary>
**What T-Rex did**
- I reproduced the patch upgrade path by installing base revision
|
||
|
|
d37b34b02f |
Improve issue version triage and remove title prefixes (#1217)
## Problem Bug-report validation rejected useful prose even when the FCC version was unambiguous, and older installations received no update guidance. Issue forms also duplicated their existing labels with forced title prefixes. ## Changes | Before | After | | --- | --- | | The FCC version field accepted only a bare version, copied command output, or `None`. | The field accepts exactly one standalone `number.number.number` value anywhere in the text, while preserving exact `None` and rejecting ambiguous input. | | Valid versions were not compared with the currently installable code. | The workflow reads the live issue and project version from the default branch, then compares numeric components safely. | | Older reports received no update guidance. | One bot-owned comment asks the reporter to update; edits update or remove that comment without labels or issue closure. | | Bug and feature forms forced `[Bug]` and `[Feature]` title prefixes. | Existing `bug` and `enhancement` labels own classification without changing the reporter's title. | | Contract coverage inspected only workflow source fragments. | Contract coverage executes the JavaScript lifecycle and protects label-only issue classification. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR improves issue classification and FCC version triage. The main changes are: - Removes forced title prefixes from bug and feature forms. - Accepts one unambiguous numeric FCC version within descriptive text. - Compares reported versions with the default branch project version. - Reconciles invalid-version and update-guidance comments after edits. - Adds executable workflow lifecycle and issue-form contract tests. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. Corrected version fields now remove stale invalid-version comments. Common valid TOML quote and comment formats are handled. No blocking issues remain in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - I reviewed the pre-change contract-validation baseline for forms, which showed 12 failures and 18 passes under origin/main. - I executed the post-change contract-validation test run with the environment set for the project and the pytest suite targeting the contract tests, and it completed with exit code 0 and 30 passes. <a href="https://app.greptile.com/trex/runs/15163869/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | .github/workflows/validate-bug-report-version.yml | Adds live issue reconciliation, project-version parsing, numeric comparison, and managed invalid and outdated comments. | | tests/contracts/test_issue_form_version_validation.py | Adds executable coverage for version extraction, TOML parsing, numeric comparison, and comment reconciliation. | | .github/ISSUE_TEMPLATE/bug-report.yml | Removes the title prefix and allows one numeric version within descriptive text. | | .github/ISSUE_TEMPLATE/feature-request.yml | Removes the title prefix while retaining enhancement classification. | | tests/contracts/test_issue_forms.py | Checks that issue forms use labels instead of title prefixes. | </details> <sub>Reviews (3): Last reviewed commit: ["Reconcile bug version triage state"](https://github.com/alishahryar1/free-claude-code/commit/8efe7aaf95bd2a96719b1d0811afb83b06c5d79c) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45775911)</sub> <!-- /greptile_comment --> |
||
|
|
36bb282558 |
Recover Claude sessions from provider context overflow (#1215)
## Problem NVIDIA NIM can report context exhaustion as a 400 `BadRequestError` saying its derived `max_tokens` is negative. FCC treated that as a generic invalid request, so Claude Code could not recognize the smaller upstream context window, compact the conversation, and replay the interrupted turn. LM Studio also encoded Claude's recovery phrase inside provider code instead of reporting a protocol-neutral failure. Fixes #1198. ## Changes - Add one protocol-neutral `context_window_exceeded` execution failure with a non-retryable 400 contract. - Narrowly classify only NVIDIA NIM's negative derived-`max_tokens` signature while preserving the complete redacted provider diagnostic and request ID. - Let the Anthropic serializer alone add Claude's `prompt is too long` compaction trigger; OpenAI Responses keeps a standard invalid-request envelope. - Migrate LM Studio's existing context preflight to the same neutral semantic and document the ownership boundary. - Add provider, protocol, API, trace, near-miss, and real Claude compaction/replay coverage; bump FCC to 4.11.4. | Before | After | | --- | --- | | Context overflow appeared as an ordinary provider 400 and ended the Claude turn. | Claude receives a typed 400 with its recognized compaction trigger, compacts once, and replays the interrupted turn without an FCC or SDK retry loop. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds protocol-neutral recovery from provider context-window exhaustion. The main changes are: - Classify NVIDIA NIM negative derived-`max_tokens` errors as context-window failures. - Move Claude's compaction trigger into the Anthropic serializer. - Migrate LM Studio context preflight to the neutral failure type. - Preserve the standard OpenAI Responses invalid-request envelope. - Add provider, protocol, API, trace, and recovery tests. - Bump the package version to 4.11.4. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. - No blocking issues found in the changed code. - The new failure kind is covered by both protocol mappings. - Provider classification remains narrow and non-retryable. - The protocol-specific compaction phrase stays at the Anthropic boundary. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the narrow pytest command from /home/user/repo without live provider credentials or services, and observed a clean test run with all tests passing. <a href="https://app.greptile.com/trex/runs/15073403/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/nvidia_nim/client.py | Adds narrow context-window classification for nested and top-level NVIDIA NIM error bodies. | | src/free_claude_code/providers/lmstudio/client.py | Migrates context-budget preflight failures to the canonical context-window failure. | | src/free_claude_code/core/anthropic/errors.py | Adds Anthropic mapping and injects Claude's compaction phrase at the wire boundary. | | src/free_claude_code/core/openai_responses/errors.py | Maps context exhaustion to the standard OpenAI invalid-request error. | | src/free_claude_code/providers/failure_policy.py | Adds the canonical non-retryable status-400 context-window failure factory. | | src/free_claude_code/core/failures.py | Adds the protocol-neutral context-window failure category. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart TD A[Provider detects context exhaustion] --> B[Context-window ExecutionFailure] B --> C{Protocol adapter} C -->|Anthropic Messages| D[400 invalid_request_error] D --> E[Add prompt is too long trigger] E --> F[Claude compacts and replays] C -->|OpenAI Responses| G[400 invalid_request_error] G --> H[Keep neutral provider message] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart TD A[Provider detects context exhaustion] --> B[Context-window ExecutionFailure] B --> C{Protocol adapter} C -->|Anthropic Messages| D[400 invalid_request_error] D --> E[Add prompt is too long trigger] E --> F[Claude compacts and replays] C -->|OpenAI Responses| G[400 invalid_request_error] G --> H[Keep neutral provider message] ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["Normalize provider context overflow for ..."](https://github.com/alishahryar1/free-claude-code/commit/29c89a4c1011d986284e9d163855174d1d433293) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45603631)</sub> <!-- /greptile_comment --> |
||
|
|
258ed3e7ed |
Keep FCC-local traffic off outbound proxies (#1214)
## Problem FCC-local health and model-catalog requests inherited machine proxy settings, so an outbound proxy could return HTTP 502 even while `fcc-server` was healthy. Spawned agents inherited the same missing loopback bypass. Fixes #1199. ## Changes | Before | After | | --- | --- | | Launcher probes used the process-wide urllib proxy policy. | FCC-local probes use one proxy-disabled transport owner. | | Codex catalog loading could leave through an outbound proxy. | Codex catalog loading uses the same direct local transport. | | Claude, Codex, Pi, and managed messaging inherited incomplete bypass lists. | Spawned clients preserve outbound proxies while merging FCC and loopback hosts into `NO_PROXY` and `no_proxy`. | | Local and upstream proxy responsibilities overlapped. | CLI-local transport and provider-specific upstream proxies have explicit separate owners. | | Tests mocked launcher reachability without exercising proxy interception. | A real fake-proxy regression proves loopback traffic never reaches the proxy, and an ownership contract prevents raw local transports from returning. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR keeps FCC-local traffic separate from configured outbound proxies. The main changes are: - Adds one direct HTTP transport for FCC health and model-catalog requests. - Adds FCC and loopback hosts to spawned clients' proxy-bypass environments. - Updates Claude, Codex, and Pi launcher integration. - Adds proxy-interception and transport-ownership tests. - Documents the boundary and bumps the package version. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. Updated callers supply the new Codex environment argument. The direct opener changes proxy handling while retaining urllib's standard request handlers. Tests cover real proxy interception and preservation of existing bypass policy. No changed files need additional attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex validated the contract by comparing preflight and forward-proxy state before and after HEAD, noting the preflight result moved from HTTP 502 and the forward-proxy hits to a clean health-check state. - T-Rex confirmed all three tests in tests/cli/test\_local\_http.py passed. <a href="https://app.greptile.com/trex/runs/15066178/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/local_http.py | Adds the shared direct opener and proxy-bypass environment policy. | | src/free_claude_code/cli/launchers/common.py | Routes FCC health checks through the direct local transport. | | src/free_claude_code/cli/launchers/codex.py | Routes catalog requests directly and adds local bypass entries to the Codex environment. | | src/free_claude_code/cli/claude_env.py | Adds FCC and loopback proxy bypasses to Claude environments. | | src/free_claude_code/cli/launchers/pi.py | Adds FCC and loopback proxy bypasses to Pi environments. | | tests/cli/test_local_http.py | Tests direct local access, proxy interception, environment merging, and deduplication. | | tests/contracts/test_import_boundaries.py | Enforces one owner for direct local transports and proxy-bypass variables. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart LR L[Launcher] --> R[FCC health or catalog request] R --> D[Direct local opener] D --> F[FCC server] L --> E[Build child environment] E --> N[Merge FCC and loopback hosts into NO_PROXY] N --> C[Claude, Codex, or Pi] C -->|FCC-local traffic| F C -->|Other outbound traffic| P[Configured outbound proxy] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart LR L[Launcher] --> R[FCC health or catalog request] R --> D[Direct local opener] D --> F[FCC server] L --> E[Build child environment] E --> N[Merge FCC and loopback hosts into NO_PROXY] N --> C[Claude, Codex, or Pi] C -->|FCC-local traffic| F C -->|Other outbound traffic| P[Configured outbound proxy] ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["Keep FCC-local traffic off outbound prox..."](https://github.com/alishahryar1/free-claude-code/commit/072cc4b7474c1b33bfc368d148da5c1aa24914b6) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45589926)</sub> <!-- /greptile_comment --> |
||
|
|
fe40548a30 |
Give Google reasoning controls one owner (#1211)
## Problem Gemini requests with FCC reasoning could send both `reasoning_effort` and `extra_body.google.thinking_config`, which [Google documents as mutually exclusive](https://ai.google.dev/gemini-api/docs/openai#thinking). Google reasoning and thought-signature postprocessing had overlapping request ownership. Fixes #1206. ## Changes | Before | After | | --- | --- | | Shared Google quirks injected thought output independently of the profile encoder. | One provider-selected Google encoder owns every reasoning wire field. | | Gemini could send named effort beside a custom thinking config. | Gemini selects one channel, with exact budgets taking precedence over named effort. | | Vertex reasoning and thought-signature behavior shared one quirks module. | Vertex retains its budget mapping while thought signatures have a separate owner. | | Caller-native Google controls could collide with FCC controls. | Native controls are preserved only under provider-default reasoning; controlled collisions fail preflight. | | Regression coverage inspected isolated body fragments. | Policy matrices, SDK-merge assertions, and an ownership contract enforce the final wire shape. | | The reported Gemini 3.5 Flash path failed upstream with HTTP 400. | The same live path streams to a normal terminal stop with one reasoning channel. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR gives each Google provider one owner for reasoning request fields. The main changes are: - Adds dedicated Gemini and Vertex reasoning encoders. - Separates thought-signature replay from reasoning serialization. - Validates caller-provided Google configuration before encoding. - Adds request-policy and final wire-shape tests. - Bumps the package version to 4.11.2. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. The request pipeline keeps thought signatures and reasoning fields separate. Tests cover the supported reasoning policies and caller configuration conflicts. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The focused validation suite was executed and completed with 78 passed in 4.57s. - Before the change, adaptive/high emitted two channels: reasoning\_effort: high and thinking\_config.include\_thoughts: true. - After the change, the same request emits exactly one channel: reasoning\_effort: high, with thinking\_config: null. <a href="https://app.greptile.com/trex/runs/15056242/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/google_openai/reasoning.py | Adds exclusive Gemini and Vertex reasoning encoders and validates caller-native thinking configuration. | | src/free_claude_code/providers/google_openai/provider.py | Separates message signature replay from profile-owned reasoning encoding. | | src/free_claude_code/providers/google_openai/thought_signatures.py | Narrows the former quirks module to tool-call thought-signature replay. | | src/free_claude_code/providers/gemini/client.py | Selects the Gemini encoder and enables validated extra-body forwarding. | | src/free_claude_code/providers/vertex/client.py | Selects the Vertex encoder while retaining budget-based reasoning controls. | | tests/providers/test_gemini.py | Covers channel exclusivity, budget precedence, native configuration, conflicts, and SDK merging. | | tests/providers/test_vertex.py | Covers Vertex policy mapping, native configuration, conflicts, and final wire shape. | | tests/contracts/test_import_boundaries.py | Enforces one source owner for Google reasoning wire fields. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart TD A[Messages request] --> B[Resolve reasoning policy] A --> C[Validate and copy extra_body] B --> D{Google provider profile} C --> E[Build OpenAI request body] E --> F[Replay thought signatures] F --> D D -->|Gemini| G[Gemini reasoning encoder] D -->|Vertex| H[Vertex reasoning encoder] G --> I[One Gemini reasoning channel] H --> J[Google thinking configuration] I --> K[Final SDK request] J --> K ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart TD A[Messages request] --> B[Resolve reasoning policy] A --> C[Validate and copy extra_body] B --> D{Google provider profile} C --> E[Build OpenAI request body] E --> F[Replay thought signatures] F --> D D -->|Gemini| G[Gemini reasoning encoder] D -->|Vertex| H[Vertex reasoning encoder] G --> I[One Gemini reasoning channel] H --> J[Google thinking configuration] I --> K[Final SDK request] J --> K ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["Give Google reasoning controls one owner"](https://github.com/alishahryar1/free-claude-code/commit/cdfba8273878d5075ac8d6afb702e0f76224cba4) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45569811)</sub> <!-- /greptile_comment --> |
||
|
|
af12e7b2bb |
Coordinate provider recovery under concurrent load (#1205)
## Problem Concurrent transient failures could start independent retry, replay, continuation, and repair loops while holding provider concurrency slots. This multiplied upstream attempts and could delay or strand terminal errors under fan-out. ## Changes | Before | After | | --- | --- | | Retry paths owned separate attempt budgets. | One logical-execution session caps all upstream work at five attempts. | | Concurrent failures backed off independently. | One provider-owned recovery episode elects a single half-open probe while followers coalesce. | | Backoff occupied stream concurrency. | Concurrency is held only while an upstream operation or stream is active. | | Provider catalog calls and stream creation used separate admission paths. | Every upstream operation uses one provider-generation admission controller. | | Cancellation could leave recovery ownership or follower state unresolved. | Cancellation releases permits, transfers probe ownership, and unregisters waiting followers. | | Late in-flight failures could cross an exhausted episode boundary. | Every coalesced execution retains that generation's terminal outcome. | | Replay tests allowed loose lifecycle assertions. | Exact SSE contracts prove retries and continuations emit one unduplicated response. | | Recovery wrappers could mask final diagnostics. | Final responses and traces retain the raw provider failure and request ID. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR coordinates provider recovery and retry work under concurrent load. The main changes are: - One five-attempt budget for each logical execution. - Provider-wide recovery episodes with one elected probe. - Shared admission for streams, catalog calls, rate limits, and concurrency. - Concurrency permits held only during active upstream work. - Cancellation-safe probe ownership and preserved final diagnostics. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Reviewed the coordinated-recovery-01-before.log to understand how the exhausted generation outcome was not preserved in a late in-flight failure. - Reviewed the coordinated-recovery-02-after.log to confirm that the updated implementation preserves the exhausted generation outcome for the same focused contract set. - Validated that the provider-admission-full-current.log shows the complete requested test file passed under Python 3.14 with uv run pytest -n 0. <a href="https://app.greptile.com/trex/runs/15050270/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/admission.py | Adds shared admission, retry budgets, recovery episodes, probe election, and cancellation handling. | | src/free_claude_code/providers/openai_chat/provider.py | Moves stream creation, replay, continuation, and repair onto one admission-owned retry session. | | src/free_claude_code/providers/stream_recovery.py | Selects replay, continuation, repair, or final failure using the remaining shared attempt budget. | | src/free_claude_code/providers/failure_policy.py | Adds recovery exhaustion handling and preserves the underlying provider error for final classification. | | src/free_claude_code/providers/runtime/factory.py | Creates one admission controller per provider generation and passes it through provider factories. | </details> <details open><summary><h3>Sequence Diagram</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% sequenceDiagram participant E as Execution participant A as Admission controller participant P as Provider participant F as Concurrent follower E->>A: Open attempt A->>P: Send upstream request P-->>E: Retryable failure E->>A: Open recovery episode F->>A: Request admission A-->>F: Coalesce and wait E->>A: Claim probe A->>P: Send half-open probe alt Probe succeeds P-->>E: Valid response E->>A: Close recovery episode A-->>F: Release waiter else Probe fails P-->>E: Retryable failure E->>A: Schedule next probe or finalize error end ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant E as Execution participant A as Admission controller participant P as Provider participant F as Concurrent follower E->>A: Open attempt A->>P: Send upstream request P-->>E: Retryable failure E->>A: Open recovery episode F->>A: Request admission A-->>F: Coalesce and wait E->>A: Claim probe A->>P: Send half-open probe alt Probe succeeds P-->>E: Valid response E->>A: Close recovery episode A-->>F: Release waiter else Probe fails P-->>E: Retryable failure E->>A: Schedule next probe or finalize error end ``` </a> </details> <sub>Reviews (2): Last reviewed commit: ["Harden coordinated retry lifecycle invar..."](https://github.com/alishahryar1/free-claude-code/commit/2e871c8649d148b5eb71d21f80bf870ae2d11708) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45554917)</sub> <!-- /greptile_comment --> |
||
|
|
a0f62c598c |
Add Google Vertex AI with renewable ADC (#1193)
## Problem | Before | After | | --- | --- | | FCC supported Google AI Studio API keys but could not route coding agents through a Google Cloud Vertex AI project. | `vertex/...` routes through Google's [documented OpenAI-compatible Chat Completions endpoint](https://cloud.google.com/vertex-ai/generative-ai/docs/start/openai), using the global endpoint by default or an explicitly configured region. | | A pasted Vertex access token would expire, while Application Default Credentials were not part of provider construction. | FCC loads [Application Default Credentials](https://cloud.google.com/docs/authentication/application-default-credentials), supplies a renewable credential callback to the OpenAI transport, coalesces concurrent refreshes, and returns typed authentication or transient failures. | | Vertex does not expose its model catalog through the compatible OpenAI `/models` route. | FCC translates its generic discovery operation to Google's paginated [publisher-model list API](https://cloud.google.com/vertex-ai/docs/reference/rest/v1beta1/publishers.models/list) and converts resource names into the model IDs accepted by Chat Completions. | | Google thought signatures were owned by the AI Studio adapter even though Vertex shares the same protocol behavior. | A neutral Google OpenAI family owns shared thought-signature and request behavior; AI Studio and Vertex retain separate endpoint and authentication ownership. | ## Changes - Added the Vertex provider, `VERTEX_PROJECT_ID`, optional `VERTEX_LOCATION` and `VERTEX_PROXY`, Admin UI configuration, model-picker discovery, smoke metadata, and customer setup documentation. - Added renewable ADC access tokens with refresh coalescing, proxy-aware refresh, sanitized failure classification, and project quota headers. - Added global/regional endpoint composition plus native model-catalog pagination, strict response validation, response cleanup, and repeated-page protection. - Generalized provider readiness around declared configuration fields so project-based and multi-field providers no longer pretend every remote provider is configured by one API key. - Moved shared Google request quirks out of the Gemini adapter, preserved AI Studio behavior, and bumped the package to `4.11.0`. <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Google Vertex AI as a new provider using Application Default Credentials. The main changes are: - New `vertex` provider with project/location endpoint construction. - Renewable ADC access-token loading with refresh coalescing and proxy-aware refresh. - Native Vertex publisher-model discovery with pagination and response validation. - Shared Google OpenAI-compatible request behavior for Gemini and Vertex. - Admin UI, settings, smoke config, docs, version, lockfile, and tests for the new provider. </details> <h3>Confidence Score: 5/5</h3> Safe to merge with low risk. No blocking correctness or security issues were identified. The new provider follows the existing provider-runtime and Admin configuration patterns. Endpoint, auth, model parsing, readiness, docs, version, lockfile, and tests are updated together. No files require special attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The T-Rex test suite was executed to validate the code-execution proof-of-work, generating a full verbose pytest log and recording the run metadata, and the run completed with EXIT\_CODE: 0. <a href="https://app.greptile.com/trex/runs/14991235/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/vertex/client.py | Adds the Vertex provider with OpenAI-compatible chat routing and native paginated model discovery. | | src/free_claude_code/providers/vertex/auth.py | Implements renewable ADC token loading, proxy-aware refresh, coalescing, and sanitized auth failures. | | src/free_claude_code/providers/vertex/endpoint.py | Builds validated Vertex global/regional service, chat, and model-list endpoints. | | src/free_claude_code/providers/vertex/models.py | Parses Vertex publisher-model pages into OpenAI-compatible model IDs with malformed-response checks. | | src/free_claude_code/providers/google_openai/provider.py | Adds shared Google thought-signature caching and thinking-budget request body handling. | | src/free_claude_code/providers/google_openai/quirks.py | Renames Gemini-specific quirks to shared Google quirks and exposes model-neutral thinking config helpers. | | src/free_claude_code/providers/openai_chat/provider.py | Allows OpenAI-chat providers to pass an async API-key callback into the OpenAI SDK. | | src/free_claude_code/providers/runtime/discovery.py | Uses descriptor-defined readiness to choose providers eligible for model cache/discovery. | | src/free_claude_code/config/provider_catalog.py | Adds the Vertex descriptor and required settings metadata, and makes Cloudflare readiness require both token and account ID. | | src/free_claude_code/config/admin/status.py | Generalizes Admin provider readiness status to use each descriptor's configuration attributes. | | src/free_claude_code/config/admin/provider_manifest.py | Adds Admin UI fields for Vertex project and location alongside generated provider fields. | | tests/providers/test_vertex.py | Adds targeted tests for Vertex endpoints, ADC token refresh, reasoning mapping, and model discovery pagination. | </details> <details open><summary><h3>Sequence Diagram</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% sequenceDiagram participant User as User / Admin UI participant Settings as Settings + Provider Catalog participant Runtime as Provider Runtime participant Vertex as VertexProvider participant ADC as Google ADC participant OpenAI as OpenAI-compatible Chat Endpoint participant Models as Vertex Publisher Models API User->>Settings: Set VERTEX_PROJECT_ID / VERTEX_LOCATION / VERTEX_PROXY Settings->>Runtime: Descriptor reports vertex configured by project id Runtime->>Vertex: Construct with project, location, proxy, rate limiter Vertex->>ADC: Load/refresh Application Default Credentials ADC-->>Vertex: Renewable access token Vertex->>OpenAI: Stream chat completion with bearer token + x-goog-user-project OpenAI-->>Vertex: Streaming chat chunks Vertex-->>Runtime: Normalized provider stream Runtime->>Vertex: Refresh model list Vertex->>Models: GET paginated publishers/google/models Models-->>Vertex: publisherModels + nextPageToken Vertex-->>Runtime: Prefixed model IDs for cache/model picker ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant User as User / Admin UI participant Settings as Settings + Provider Catalog participant Runtime as Provider Runtime participant Vertex as VertexProvider participant ADC as Google ADC participant OpenAI as OpenAI-compatible Chat Endpoint participant Models as Vertex Publisher Models API User->>Settings: Set VERTEX_PROJECT_ID / VERTEX_LOCATION / VERTEX_PROXY Settings->>Runtime: Descriptor reports vertex configured by project id Runtime->>Vertex: Construct with project, location, proxy, rate limiter Vertex->>ADC: Load/refresh Application Default Credentials ADC-->>Vertex: Renewable access token Vertex->>OpenAI: Stream chat completion with bearer token + x-goog-user-project OpenAI-->>Vertex: Streaming chat chunks Vertex-->>Runtime: Normalized provider stream Runtime->>Vertex: Refresh model list Vertex->>Models: GET paginated publishers/google/models Models-->>Vertex: publisherModels + nextPageToken Vertex-->>Runtime: Prefixed model IDs for cache/model picker ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["feat: add Google Vertex AI provider"](https://github.com/alishahryar1/free-claude-code/commit/97e753f0772e60377865876ca59b2fd8888d922e) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45405432)</sub> <!-- /greptile_comment --> |
||
|
|
af658287bd |
Add Amazon Bedrock Mantle support (#1192)
## Problem FCC cannot route coding-agent requests through Amazon Bedrock even though Bedrock Mantle exposes an OpenAI-compatible streaming Chat Completions API. Users currently need a separate compatibility layer, and FCC has no catalog, Admin UI, model-discovery, or smoke-test contract for Bedrock. Fixes #863. ## Changes | Before | After | | --- | --- | | Amazon Bedrock was absent from provider routing. | `bedrock/` uses the existing OpenAI Chat provider with AWS's [Bedrock Mantle endpoint](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-chat-completions-mantle.html). | | Bedrock integration would have implied a new AWS-native transport. | The ordinary profile owns streaming, tools, retries, and `/models` discovery without boto3, SigV4, Converse, or Invoke machinery. | | FCC had no Bedrock authentication or regional endpoint configuration. | `AWS_BEARER_TOKEN_BEDROCK`, `BEDROCK_BASE_URL`, and `BEDROCK_PROXY` are available through environment and Admin UI configuration, with the current `us-east-1` Mantle URL as the default. | | Heterogeneous Bedrock models had no safe provider-wide reasoning control. | FCC replays prior reasoning through portable think tags and leaves model-specific reasoning parameters upstream-owned. | | Smoke configuration duplicated credential checks for every provider. | Smoke configuration reads primary credentials and configurable endpoints from the provider catalog, retaining only Cloudflare's two-field exception. | | Bedrock behavior had no deterministic coverage or release documentation. | Provider requests, regional URL normalization, model discovery, Admin persistence, smoke selection, README usage, architecture boundaries, and version 4.10.0 cover the new capability. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Amazon Bedrock Mantle as an OpenAI-compatible provider. The main changes are: - Bedrock catalog, settings, proxy, and regional base-URL configuration. - OpenAI Chat routing with portable reasoning replay and model discovery. - Admin UI fields and configuration persistence. - Catalog-driven smoke configuration and Bedrock smoke coverage. - Provider documentation and a version bump to 4.10.0. </details> <h3>Confidence Score: 5/5</h3> The provider flow looks mergeable after handling an explicitly empty Bedrock base URL. Catalog, runtime, Admin, and smoke wiring are consistent. Regional URLs with or without `/v1` are normalized correctly. src/free_claude_code/config/settings.py: an empty `BEDROCK_BASE_URL` can still create a client with an invalid endpoint. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Before the change, bedrock was rejected as an unknown provider with exit code 1. - After the change, the fake service captured the normalized URL, Bearer trex...oken, portable Chat Completions JSON, one tool, think-tag history, and no reasoning\_effort, reasoning, or thinking fields; exit code 0. - Focused pytest validation completed with 6/6 passing tests. <a href="https://app.greptile.com/trex/runs/14988686/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/config/provider_catalog.py | Adds the Bedrock provider descriptor, regional default endpoint, credential mapping, and proxy metadata. | | src/free_claude_code/config/settings.py | Adds Bedrock settings, but an explicitly empty base URL bypasses the regional default. | | src/free_claude_code/providers/openai_chat/profiles.py | Registers Bedrock with URL normalization, think-tag replay, and no provider-wide reasoning parameter. | | src/free_claude_code/config/admin/provider_manifest.py | Generalizes provider base-URL fields and adds Bedrock-specific labels and help text. | | smoke/lib/config.py | Adds Bedrock smoke defaults and replaces provider-specific checks with catalog-driven configuration checks. | | tests/providers/test_bedrock.py | Covers Bedrock URL normalization, request fields, reasoning replay, tool calls, and model discovery. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart LR Config[Environment or Admin config] --> Settings[Settings] Catalog[Provider catalog] --> Runtime[Provider runtime] Settings --> Runtime Runtime --> Profile[Bedrock OpenAI Chat profile] Profile --> Client[AsyncOpenAI client] Client --> Mantle[Regional Bedrock Mantle endpoint] Catalog --> Admin[Admin manifest] Catalog --> Smoke[Smoke selection] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart LR Config[Environment or Admin config] --> Settings[Settings] Catalog[Provider catalog] --> Runtime[Provider runtime] Settings --> Runtime Runtime --> Profile[Bedrock OpenAI Chat profile] Profile --> Client[AsyncOpenAI client] Client --> Mantle[Regional Bedrock Mantle endpoint] Catalog --> Admin[Admin manifest] Catalog --> Smoke[Smoke selection] ``` </a> </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fadd-bedrock-mantle%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fadd-bedrock-mantle%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fconfig%2Fsettings.py%3A60-63%0A**Empty%20Override%20Bypasses%20Default%20URL**%0A%0AWhen%20%60BEDROCK_BASE_URL%60%20is%20present%20but%20empty%2C%20settings%20keep%20the%20empty%20string%20instead%20of%20using%20%60BEDROCK_DEFAULT_BASE%60.%20Clearing%20this%20field%20through%20environment%20or%20Admin%20configuration%20therefore%20builds%20the%20Bedrock%20client%20with%20an%20invalid%20base%20URL%2C%20and%20Bedrock%20requests%20and%20model%20discovery%20fail%20instead%20of%20using%20the%20documented%20default.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1192&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Add Amazon Bedrock Mantle provider"](https://github.com/alishahryar1/free-claude-code/commit/f40b539c99c9f6a888762b8da69d5a738a4f4d70) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45400300)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
b89e849fff |
Add Kimi Code subscription support (#1183)
## Problem FCC's existing `kimi` provider targets Kimi Open Platform credits. Kimi Code subscription keys use a separate coding-agent endpoint, so subscribers cannot currently use their plan or select its K3 and coding models. Fixes #1161. ## Changes | Before | After | | --- | --- | | `KIMI_API_KEY` was the only Kimi contract and routed to the credit-based API platform. | `KIMI_API_KEY` remains unchanged, while `KIMI_CODE_API_KEY` routes the separate [Kimi Code subscription](https://www.kimi.com/code/docs/en/) through `https://api.kimi.com/coding/v1`. | | OpenAI-chat profiles could not declare an upstream client identity. | The Kimi Code profile sends an honest `free-claude-code` user agent as required by [Kimi's integration policy](https://www.kimi.com/code/docs/en/kimi-code/community-guidelines.html), without adding a specialized provider class. | | FCC's fallback output limit and generic token field would override Kimi's default when the client omitted a limit. | Explicit client limits become `max_completion_tokens`; omitted limits remain upstream-owned, and learned cap recovery still handles model-specific rejections. | | Kimi Code reasoning and history had no provider contract. | The profile maps FCC intent to Kimi's documented `low`, `high`, `max`, and `none` efforts and replays prior thinking through `reasoning_content`, with no model-name branching. | | Admin, model discovery, and smoke coverage knew only the credit-based Kimi provider. | Catalog-derived Admin fields, `/models` discovery, README setup, smoke configuration, and deterministic provider/runtime contracts cover `kimi_code`; the release is bumped to 4.9.0. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Kimi Code subscription support as a separate provider. The main changes are: - Adds dedicated API key, proxy, endpoint, and Admin settings. - Adds Kimi-specific reasoning, token-limit, history, and user-agent behavior. - Extends model discovery and smoke configuration for `kimi_code`. - Adds provider contract tests and updates documentation. - Bumps the package and lockfile version to 4.9.0. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The contract validation compared the Kimi code HTTP flow before and after the change and confirmed the after state exits with code 0 and includes Bearer authentication, User-Agent: free-claude-code, model discovery, max\_completion\_tokens, Kimi reasoning effort max, reasoning\_content replay, and omission of token/reasoning fields when unspecified. - Focused tests for the Kimi code HTTP flow were run, and 88 tests passed with exit code 0. - Artifacts document both the initial failure scenario and the successful post-change state, along with the focused tests results. <a href="https://app.greptile.com/trex/runs/14945625/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/config/provider_catalog.py | Registers Kimi Code with its dedicated credential, endpoint, and proxy setting. | | src/free_claude_code/config/settings.py | Adds environment-backed fields for the Kimi Code subscription key and proxy. | | src/free_claude_code/providers/openai_chat/__init__.py | Passes an optional profile user agent into the shared OpenAI-compatible client. | | src/free_claude_code/providers/openai_chat/profiles.py | Defines Kimi Code reasoning, token-limit, history replay, extra-body, and user-agent behavior. | | smoke/lib/config.py | Adds Kimi Code configuration detection and its default smoke model. | | tests/providers/test_kimi_code.py | Covers the new endpoint, headers, request mapping, reasoning behavior, and model discovery. | </details> <sub>Reviews (1): Last reviewed commit: ["Add Kimi Code subscription provider"](https://github.com/alishahryar1/free-claude-code/commit/dfc66f2755e5885775a77f5c91b4b9a82eb8fd1d) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45309322)</sub> <!-- /greptile_comment --> |
||
|
|
fa39a1d45a |
Fail safely when FCC is running during installation (#1182)
## Problem A running Free Claude Code command can make `uv tool install --force` fail after partially deleting the installed tool environment. The installers did not detect this precondition, and the POSIX fallback relied on truncated process names. ## Changes | Before | After | | --- | --- | | Installers entered tool replacement while FCC commands were running. | Installers report matching FCC commands and PIDs, then exit before mutation. | | A process starting during client or uv setup could reach tool replacement. | Installers recheck immediately before `uv tool install`. | | The no-`pgrep` fallback compared truncated `comm` names. | Install and uninstall fallbacks match full command lines. | | Running-process coverage existed only for uninstallers. | Cross-platform tests cover every FCC entry point, late starts, similar names, and fallback detection. | | The package version was 4.8.7. | The package version is 4.8.8. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR prevents tool replacement while Free Claude Code commands are running. The main changes are: - Adds early and pre-install process checks to both installers. - Uses full process arguments in the POSIX fallback. - Adds tests for all FCC commands, late process starts, and similarly named processes. - Bumps the package version to 4.8.8. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. The updated fallback checks full process arguments instead of the truncated process name. Tests cover direct and interpreter-launched command lines. No blocking issues were found in the updated code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Before the changes, the parent installer failed all six active-entry-point checks and the late-start check (7 failed, 1 passed). - After applying the changes, the installer passed all eight targeted tests (8 passed, 70 deselected, exit code 0). - The harness assertions verified that blocking cases do not mutate state and the late-start case never invokes the uv tool install. <a href="https://app.greptile.com/trex/runs/14936764/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | scripts/install.sh | Adds early and late process guards with full-command-line fallback matching. | | scripts/uninstall.sh | Replaces truncated process-name matching with PID and argument inspection. | | scripts/install.ps1 | Adds running-process checks before setup and tool replacement. | | tests/scripts/test_installers.py | Covers all FCC commands, late process starts, similar names, and POSIX fallback matching. | | tests/scripts/test_uninstallers.py | Covers full-command-line matching in the POSIX uninstaller fallback. | </details> <sub>Reviews (2): Last reviewed commit: ["Fail safely when FCC is running during i..."](https://github.com/alishahryar1/free-claude-code/commit/589d983bc936ae28c914b7cb713c6b0775ab8a39) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45286907)</sub> <!-- /greptile_comment --> |
||
|
|
ac2ccbdd16 |
Report output-limit truncation as incomplete Responses (#1180)
## Problem Responses streams discarded the canonical Anthropic `max_tokens` stop reason and emitted `response.completed`. Codex therefore treated truncated provider output as a successful end and could stop midway without explaining why. Fixes #1178. ## Changes | Before | After | | --- | --- | | The Responses boundary discarded `message_delta.stop_reason`. | The Responses assembler retains the canonical terminal stop reason. | | Output-limit streams ended with `response.completed`. | Output-limit streams end with `response.incomplete` and `incomplete_details.reason=max_output_tokens`. | | Truncated output had no dedicated Responses contract coverage. | Core and API tests cover partial-output and zero-visible-output truncation while preserving response ID and usage. | | The package version was `4.8.6`. | The patch release is `4.8.7`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR reports Anthropic output-limit termination as an incomplete Responses result. The main changes are: - Retains the canonical `message_delta.stop_reason` until stream finalization. - Emits `response.incomplete` with `max_output_tokens` details for `max_tokens` termination. - Preserves partial output, usage, and response identity. - Adds core and API tests for visible and empty truncated output. - Updates the package and lockfile version to 4.8.7. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. Terminal failure handling still takes precedence over incomplete completion. Tests cover both partial-output and zero-visible-output truncation. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Validated that after the change, both requests end with response.incomplete instead of response.completed. - Observed that partial output remains as 3/4/7 and zero-visible output remains as 3/64/67, confirming the output retention behavior after the change. - Confirmed that created and terminal response IDs match in every after-change case. - Reviewed the Python contract-validation artifact to support the conclusions. <a href="https://app.greptile.com/trex/runs/14931704/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/core/openai_responses/streaming/assembler.py | Retains the provider stop reason and emits an incomplete terminal response when output reaches the token limit. | | src/free_claude_code/core/openai_responses/streaming/event_builders.py | Adds the Responses SSE envelope for `response.incomplete`. | | tests/core/openai_responses/test_sse.py | Covers truncated streams with partial output and no visible output. | | tests/api/test_openai_responses.py | Covers output-limit reporting through the public Responses API route. | | pyproject.toml | Bumps the package patch version to 4.8.7. | | uv.lock | Synchronizes the locked editable package version. | </details> <sub>Reviews (1): Last reviewed commit: ["Fix Responses output-limit terminal stat..."](https://github.com/alishahryar1/free-claude-code/commit/d41767572b0820481e3e7555c5b361b184c139c0) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45277818)</sub> <!-- /greptile_comment --> |
||
|
|
776a6a4c5f |
Enable uv malware checks on every CI runner (#1177)
## Problem Dependabot updates passed CI without uv checking their locked packages against known malware advisories. The supported uv minimum also predated this capability. ## Changes | Before | After | | --- | --- | | Project, installers, and CI allowed uv versions without malware checking. | All supported surfaces require uv `0.11.16` or newer. | | Parallel CI runners synchronized dependencies without an OSV malware check. | Workflow-wide uv environment settings enable the check independently on every runner. | | Installers treated prerelease builds as their equivalent stable version. | Installers accept stable uv releases only while preserving valid build metadata. | | uv security-policy values and edge behavior could drift between maintained surfaces. | Contract and installer tests enforce the shared policy. | | FCC reported version `4.8.5`. | FCC reports patch version `4.8.6`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR enables uv malware checks across CI and raises the supported uv baseline. The main changes are: - Requires uv `0.11.16` across project, installer, and CI configuration. - Enables the malware-check preview policy at workflow scope. - Rejects prerelease uv versions in both installers. - Adds policy and installer tests for the updated behavior. - Bumps the package and lockfile version to `4.8.6`. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. The installer fix preserves prerelease suffixes and rejects them before numeric comparison. Both installer variants cover stable releases, build metadata, and prerelease versions. No blocking issues remain in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Policy declarations were verified to include uv 0.11.16 in the pyproject, in both installers, and in CI setup, along with workflow-level malware variables. - The installer dry run printed all planned stages and ended with the message "Dry run complete. No changes were made.". - PowerShell execution was intentionally not attempted on Linux as part of the contract validation. - A set of 10 log artifacts was collected to support inspection of policy coverage, dry-run results, and environment constraints. <a href="https://app.greptile.com/trex/runs/14927224/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | .github/workflows/tests.yml | Enables the uv malware-check policy at workflow scope and installs uv 0.11.16. | | pyproject.toml | Raises the required uv version and bumps the package patch version. | | scripts/install.sh | Rejects prerelease uv versions while accepting stable versions with build metadata. | | scripts/install.ps1 | Applies the same stable-version requirement to the PowerShell installer. | | tests/contracts/test_uv_policy.py | Checks uv minimum consistency and workflow-wide malware policy placement. | | tests/scripts/test_installers.py | Adds stable, build-metadata, and prerelease cases for both installers. | | uv.lock | Synchronizes the locked project version with the package version bump. | </details> <sub>Reviews (2): Last reviewed commit: ["Reject prerelease uv in installers"](https://github.com/alishahryar1/free-claude-code/commit/d35d9d44d68d78ab2f00af0cb7297ffd7b7c4c3f) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45238978)</sub> <!-- /greptile_comment --> |
||
|
|
98274739da |
build(deps): bump the minor-and-patch group with 7 updates (#1174)
[//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps the minor-and-patch group with 7 updates: | Package | From | To | | --- | --- | --- | | [uvicorn](https://github.com/Kludex/uvicorn) | `0.50.0` | `0.51.0` | | [openai](https://github.com/openai/openai-python) | `2.44.0` | `2.46.0` | | [grpcio](https://github.com/grpc/grpc) | `1.81.1` | `1.82.1` | | [torch](https://github.com/pytorch/pytorch) | `2.12.1+cu130` | `2.13.0` | | [transformers](https://github.com/huggingface/transformers) | `5.13.0` | `5.14.1` | | [ty](https://github.com/astral-sh/ty) | `0.0.56` | `0.0.60` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.20` | `0.15.22` | Updates `uvicorn` from 0.50.0 to 0.51.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/releases">uvicorn's releases</a>.</em></p> <blockquote> <h2>Version 0.51.0</h2> <h2>What's Changed</h2> <ul> <li>Restart workers with overlap on SIGHUP for near-zero-downtime reloads by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/3025">Kludex/uvicorn#3025</a></li> <li>Remove colorama from the standard extra by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/3027">Kludex/uvicorn#3027</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.50.2...0.51.0">https://github.com/Kludex/uvicorn/compare/0.50.2...0.51.0</a></p> <h2>Version 0.50.1</h2> <h2>What's Changed</h2> <ul> <li>Split comma-separated <code>Sec-WebSocket-Protocol</code> values in the websockets-sansio implementation by <a href="https://github.com/Aayush7352"><code>@Aayush7352</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/3019">Kludex/uvicorn#3019</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Aayush7352"><code>@Aayush7352</code></a> made their first contribution in <a href="https://redirect.github.com/Kludex/uvicorn/pull/3019">Kludex/uvicorn#3019</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.50.0...0.50.1">https://github.com/Kludex/uvicorn/compare/0.50.0...0.50.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md">uvicorn's changelog</a>.</em></p> <blockquote> <h2>0.51.0 (July 8, 2026)</h2> <h3>Added</h3> <ul> <li>Restart workers one at a time on <code>SIGHUP</code>, bringing each replacement up before retiring the old worker, so reloads no longer drop requests (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3025">#3025</a>)</li> </ul> <h3>Removed</h3> <ul> <li>Remove <code>colorama</code> from the <code>standard</code> extra (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3027">#3027</a>)</li> </ul> <h2>0.50.2 (July 6, 2026)</h2> <h3>Fixed</h3> <ul> <li>Require <code>websockets>=13.0</code>, which the default <code>websockets-sansio</code> implementation needs (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3021">#3021</a>)</li> </ul> <h2>0.50.1 (July 6, 2026)</h2> <h3>Fixed</h3> <ul> <li>Split comma-separated <code>Sec-WebSocket-Protocol</code> values in the <code>websockets-sansio</code> implementation (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3019">#3019</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Kludex/uvicorn/commit/e4d0b05eb8c6459b7ba27ad13a2c2f4f8d4ece50"><code>e4d0b05</code></a> Version 0.51.0 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3028">#3028</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/944e43ddbf715aea7c587f2738cd94c3f9106110"><code>944e43d</code></a> Remove colorama from the standard extra (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3027">#3027</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/2e787704f2610133059e76d56bbd60f48edd34a3"><code>2e78770</code></a> Restart workers with overlap on SIGHUP for near-zero-downtime reloads (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3025">#3025</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/a1b570cf577d512bfd396b64d72313233e9c3325"><code>a1b570c</code></a> Version 0.50.2 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3022">#3022</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/83c7da7332ac3100171c258071de40d5dde35e13"><code>83c7da7</code></a> Require websockets>=13.0 for the default sansio implementation (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3021">#3021</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/b4d011668a75d02370353f34de6dea59692dcad2"><code>b4d0116</code></a> Version 0.50.1 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3020">#3020</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/2a9151d0e763df2c56da2bfe8c5dcead4fe5a276"><code>2a9151d</code></a> Split comma-separated <code>Sec-WebSocket-Protocol</code> values in the websockets-sansi...</li> <li><a href="https://github.com/Kludex/uvicorn/commit/1bf3ab42e3aba1cf4acd1ef0c29d8ad9a599d333"><code>1bf3ab4</code></a> Cover the excluded-directory branch in <code>FileFilter</code> with a direct test (<a href="https://redirect.github.com/Kludex/uvicorn/issues/3014">#3014</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/837b5f960dbe2f03e9f12feb9955ce2217211ad8"><code>837b5f9</code></a> Deflake multiprocess, reload, and signal supervisor tests (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2975">#2975</a>)</li> <li>See full diff in <a href="https://github.com/Kludex/uvicorn/compare/0.50.0...0.51.0">compare view</a></li> </ul> </details> <br /> Updates `openai` from 2.44.0 to 2.46.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/openai/openai-python/releases">openai's releases</a>.</em></p> <blockquote> <h2>v2.46.0</h2> <h2>2.46.0 (2026-07-17)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v2.45.0...v2.46.0">v2.45.0...v2.46.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> /organization/projects/{project_id}/service_accounts/{service_account_id}/api_keys" endpoint (<a href="https://github.com/openai/openai-python/commit/5a0094194eac9c605c8ca84d47d1c5518f8e2131">5a00941</a>)</li> <li><strong>api:</strong> add owner_project_access to APIKeyListParams (<a href="https://github.com/openai/openai-python/commit/f589d04bf9f377ecb1f54335ab3ab9d825b5dfee">f589d04</a>)</li> <li><strong>api:</strong> manual updates (<a href="https://github.com/openai/openai-python/commit/980f176e83ee5d991bf9e8e4def80d9905ade5ec">980f176</a>)</li> <li><strong>api:</strong> manual updates (<a href="https://github.com/openai/openai-python/commit/2eae984315580cdbf9ceb14d6cb568c581baa768">2eae984</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> preserve generated type compatibility (<a href="https://github.com/openai/openai-python/commit/00bd72adbe03f4b5c4b89d91b8d317f11b58bbdf">00bd72a</a>)</li> <li><strong>api:</strong> remove beta annotation compatibility aliases (<a href="https://github.com/openai/openai-python/commit/99dbd15ff3ad1628b94a729a6b688212d4655908">99dbd15</a>)</li> </ul> <h2>v2.45.0</h2> <h2>2.45.0 (2026-07-09)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v2.44.0...v2.45.0">v2.44.0...v2.45.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> gpt-5.6-sol updates (<a href="https://github.com/openai/openai-python/commit/039d1feb264a2dca7195ba5028e9fb47a5e04987">039d1fe</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> restore beta resource accessors (<a href="https://github.com/openai/openai-python/commit/2dfc130b8f0fdb0049e075aac21aaef29482b4e3">2dfc130</a>)</li> </ul> <h3>Chores</h3> <ul> <li>retrigger release automation (<a href="https://github.com/openai/openai-python/commit/7b61351b014bb6ca4623ff6cce7f32f45038a92e">7b61351</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/openai/openai-python/blob/main/CHANGELOG.md">openai's changelog</a>.</em></p> <blockquote> <h2>2.46.0 (2026-07-17)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v2.45.0...v2.46.0">v2.45.0...v2.46.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> /organization/projects/{project_id}/service_accounts/{service_account_id}/api_keys" endpoint (<a href="https://github.com/openai/openai-python/commit/5a0094194eac9c605c8ca84d47d1c5518f8e2131">5a00941</a>)</li> <li><strong>api:</strong> add owner_project_access to APIKeyListParams (<a href="https://github.com/openai/openai-python/commit/f589d04bf9f377ecb1f54335ab3ab9d825b5dfee">f589d04</a>)</li> <li><strong>api:</strong> manual updates (<a href="https://github.com/openai/openai-python/commit/980f176e83ee5d991bf9e8e4def80d9905ade5ec">980f176</a>)</li> <li><strong>api:</strong> manual updates (<a href="https://github.com/openai/openai-python/commit/2eae984315580cdbf9ceb14d6cb568c581baa768">2eae984</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> preserve generated type compatibility (<a href="https://github.com/openai/openai-python/commit/00bd72adbe03f4b5c4b89d91b8d317f11b58bbdf">00bd72a</a>)</li> <li><strong>api:</strong> remove beta annotation compatibility aliases (<a href="https://github.com/openai/openai-python/commit/99dbd15ff3ad1628b94a729a6b688212d4655908">99dbd15</a>)</li> </ul> <h2>2.45.0 (2026-07-09)</h2> <p>Full Changelog: <a href="https://github.com/openai/openai-python/compare/v2.44.0...v2.45.0">v2.44.0...v2.45.0</a></p> <h3>Features</h3> <ul> <li><strong>api:</strong> gpt-5.6-sol updates (<a href="https://github.com/openai/openai-python/commit/039d1feb264a2dca7195ba5028e9fb47a5e04987">039d1fe</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>api:</strong> restore beta resource accessors (<a href="https://github.com/openai/openai-python/commit/2dfc130b8f0fdb0049e075aac21aaef29482b4e3">2dfc130</a>)</li> </ul> <h3>Chores</h3> <ul> <li>retrigger release automation (<a href="https://github.com/openai/openai-python/commit/7b61351b014bb6ca4623ff6cce7f32f45038a92e">7b61351</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/openai/openai-python/commit/0e6adb15adc1e74087bcb402de7a75e4fbc0aecb"><code>0e6adb1</code></a> release: 2.46.0 (<a href="https://redirect.github.com/openai/openai-python/issues/3501">#3501</a>)</li> <li><a href="https://github.com/openai/openai-python/commit/f16fbbd2bd25dc1ff150b5f78dbd15ff6bab6d91"><code>f16fbbd</code></a> release: 2.45.0 (<a href="https://redirect.github.com/openai/openai-python/issues/3478">#3478</a>)</li> <li>See full diff in <a href="https://github.com/openai/openai-python/compare/v2.44.0...v2.46.0">compare view</a></li> </ul> </details> <br /> Updates `grpcio` from 1.81.1 to 1.82.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/grpc/grpc/releases">grpcio's releases</a>.</em></p> <blockquote> <h2>Release v1.82.1</h2> <p>This is release gRPC Core 1.82.1 (glacier).</p> <p>For gRPC documentation, see <a href="https://grpc.io/">grpc.io</a>. For previous releases, see <a href="https://github.com/grpc/grpc/releases">Releases</a>.</p> <p>This release contains refinements, improvements, and bug fixes.</p> <h2>What's Changed</h2> <h3>Python</h3> <ul> <li>[Backport][v1.82.x][Python] Update lower bound for protobuf from 6.33.5 to 7.35.1 by <a href="https://github.com/asheshvidyut"><code>@asheshvidyut</code></a> in <a href="https://redirect.github.com/grpc/grpc/pull/42920">grpc/grpc#42920</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/grpc/grpc/compare/v1.82.0...v1.82.1">https://github.com/grpc/grpc/compare/v1.82.0...v1.82.1</a></p> <h2>Release v1.82.0</h2> <p>This is release gRPC Core 1.82.0 (glacier).</p> <p>For gRPC documentation, see <a href="https://grpc.io/">grpc.io</a>. For previous releases, see <a href="https://github.com/grpc/grpc/releases">Releases</a>.</p> <p>This release contains refinements, improvements, and bug fixes. This is release 1.82.0 (<a href="https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md">glacier</a>) of gRPC Core.</p> <p>For gRPC documentation, see <a href="https://grpc.io/">grpc.io</a>. For previous releases, see <a href="https://github.com/grpc/grpc/releases">Releases</a>.</p> <p>This release contains refinements, improvements, and bug fixes, with highlights listed below.</p> <h2>Core</h2> <ul> <li>[call creds] Add support for looking up and attaching regional access boundary policy metadata. (<a href="https://redirect.github.com/grpc/grpc/pull/41594">#41594</a>)</li> <li>Unregister CFStream callbacks during endpoint shutdown. (<a href="https://redirect.github.com/grpc/grpc/pull/42211">#42211</a>)</li> <li>Fix fd 0 incorrectly treated as invalid across POSIX socket code. (<a href="https://redirect.github.com/grpc/grpc/pull/41764">#41764</a>)</li> <li>[xDS] enable new ORCA-to-LRS propagation behavior (gRFC A85). (<a href="https://redirect.github.com/grpc/grpc/pull/42411">#42411</a>)</li> <li>[RetryFilter::LegacyCallData]: avoid tripping abseil nullopt assertion. (<a href="https://redirect.github.com/grpc/grpc/pull/42405">#42405</a>)</li> <li>[xds] Implement A114: WRR support for custom backend metrics. (<a href="https://redirect.github.com/grpc/grpc/pull/41750">#41750</a>)</li> <li>[Core] Upgrade to protobuf 35 (<a href="https://redirect.github.com/grpc/grpc/pull/42512">#42512</a>)</li> </ul> <h2>PHP</h2> <ul> <li>[Backport][v1.82.x][PHP] Add PIE support for PHP extention. (<a href="https://redirect.github.com/grpc/grpc/pull/42873">#42873</a>)</li> </ul> <h2>Python</h2> <p><em>Added 2026-07-12: CAUTION! This gRPC Python release <code>1.82.0</code> was yanked from PyPI on 2026-07-07 due to issue <a href="https://redirect.github.com/grpc/grpc/issues/42906">grpc/grpc#42906</a>.</em></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/grpc/grpc/commit/acccf84c0df20487d64101f528e5d426541ca4e5"><code>acccf84</code></a> [Release] Bump version to 1.82.1 (on v1.82.x branch) (<a href="https://redirect.github.com/grpc/grpc/issues/42924">#42924</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/4f356a0d84b411dff806605c9f50652eeb2bfdaa"><code>4f356a0</code></a> [Backport][v1.82.x][Python] Update lower bound for protobuf from 6.33.5 to 7....</li> <li><a href="https://github.com/grpc/grpc/commit/742600a76f5717044cde93ba424500c680e2002a"><code>742600a</code></a> [Release] Bump version to 1.82.0 (on v1.82.x branch) (<a href="https://redirect.github.com/grpc/grpc/issues/42876">#42876</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/1a59ee28dc04f53dafe5142dd8b320048abecc6d"><code>1a59ee2</code></a> [Backport][v1.82.x][PHP] Add PIE support for PHP extention (<a href="https://redirect.github.com/grpc/grpc/issues/42873">#42873</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/6c34462e5632293ed0b32cb89d32d438b2961aa5"><code>6c34462</code></a> [Release] Bump version to 1.82.0-pre2 (on v1.82.x branch) (<a href="https://redirect.github.com/grpc/grpc/issues/42789">#42789</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/0ddb5775dbb2cf8494b4bb72f125975fb61e83b8"><code>0ddb577</code></a> [Backport][v1.82.x] Memory optimization experiments (<a href="https://redirect.github.com/grpc/grpc/issues/42788">#42788</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/b3580d626718c650b9b18cdbd47da0a0b9c2246d"><code>b3580d6</code></a> [Backport][v1.82.x][PSM interop] adds python kokoro config file for regional ...</li> <li><a href="https://github.com/grpc/grpc/commit/d8183a895fc2133bdf98556401a83d687b0f9515"><code>d8183a8</code></a> [Backport][v1.82.x][PSM interop] adds kokoro config file for regional TD test...</li> <li><a href="https://github.com/grpc/grpc/commit/f3289ea4eba5cc9656bf6141d33172a0cd0b0790"><code>f3289ea</code></a> [Release] Bump version to 1.82.0-pre1 (on v1.82.x branch) (<a href="https://redirect.github.com/grpc/grpc/issues/42639">#42639</a>)</li> <li><a href="https://github.com/grpc/grpc/commit/9a7455fd5eec75d9f33a3ca4cb6530865264b031"><code>9a7455f</code></a> [Release] Bump core version to 55.0.0 for upcoming release (<a href="https://redirect.github.com/grpc/grpc/issues/42626">#42626</a>)</li> <li>Additional commits viewable in <a href="https://github.com/grpc/grpc/compare/v1.81.1...v1.82.1">compare view</a></li> </ul> </details> <br /> Updates `torch` from 2.12.1+cu130 to 2.13.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pytorch/pytorch/releases">torch's releases</a>.</em></p> <blockquote> <h1>PyTorch 2.13.0 Release Notes</h1> <ul> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#highlights">Highlights</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#backwards-incompatible-changes">Backwards Incompatible Changes</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#deprecations">Deprecations</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#new-features">New Features</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#improvements">Improvements</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#bug-fixes">Bug fixes</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#performance">Performance</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#documentation">Documentation</a></li> <li><a href="https://github.com/pytorch/pytorch/blob/HEAD/#developers">Developers</a></li> </ul> <h1>Highlights</h1> <!-- raw HTML omitted --> <p>For more details about these highlighted features, you can look at the release blogpost. Below are the full release notes for this release.</p> <h1>Tracked Regressions</h1> <h3>ROCm wheels break <code>torch.compile</code> on CPU in environments without a GPU</h3> <p>Running a <code>torch==2.13.0+rocm7.2</code> wheel in an environment where no GPU is available (<code>torch.cuda.is_available()</code> is <code>False</code>) breaks <code>torch.compile</code> on the CPU path: the first compile raises <code>RuntimeError: Can't detect vectorized ISA for CPU</code> (<a href="https://redirect.github.com/pytorch/pytorch/issues/189194">#189194</a>). This is a regression from <code>torch==2.12.1+rocm7.2</code>, which compiles CPU code fine (detecting e.g. <code>VecAVX2</code>) in the same setup. The 2.13 ROCm wheel appears to rely on something present in the ROCm builder image to detect the CPU vectorized ISA, so it works when run on a ROCm image but fails on a plain CPU-only image.</p> <p>Workaround: run the <code>+rocm</code> wheel on a ROCm image, or install a standard CPU/CUDA build for GPU-less environments.</p> <h1>Backwards Incompatible Changes</h1> <ul> <li> <p>Stop building CPython 3.13t (free-threaded) binaries (<a href="https://redirect.github.com/pytorch/pytorch/issues/182951">#182951</a>)</p> <p>Upstream <code>pypa/manylinux</code> removed CPython 3.13t (free-threaded) on 2026-05-07, because 3.13t was experimental and has been superseded by the now-non-experimental CPython 3.14t. As a result, PyTorch 2.13 no longer ships <code>cp313t</code> wheels (Linux, Triton, and related artifacts). Users on the free-threaded interpreter should move to Python 3.14t.</p> <p>PyTorch 2.12:</p> <pre lang="bash"><code># cp313t (free-threaded 3.13) wheels were available python3.13t -m pip install torch </code></pre> <p>PyTorch 2.13:</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/pytorch/pytorch/commits/v2.13.0">compare view</a></li> </ul> </details> <br /> Updates `transformers` from 5.13.0 to 5.14.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/huggingface/transformers/releases">transformers's releases</a>.</em></p> <blockquote> <h2>Patch release: v5.14.1</h2> <h1>Patch release v5.14.1</h1> <p>This patch solves a few issues which appeared when integrating Inkling model, most notably an issue affecting models using EncoderDecoderCache during assisted generation. It also fixes an issue that could appear during prefill with StaticCache and sdpa without padding for Inkling which uses a position_bias. It contains the following commits:</p> <ul> <li>Fix sdpa prefill with position_bias (<a href="https://redirect.github.com/huggingface/transformers/issues/47359">#47359</a>) by <a href="https://github.com/Cyrilvallez"><code>@Cyrilvallez</code></a></li> <li>Fix assisted decoding for models with EncoderDecoder cache & OlmoHybrid (<a href="https://redirect.github.com/huggingface/transformers/issues/47361">#47361</a>) by <a href="https://github.com/Cyrilvallez"><code>@Cyrilvallez</code></a></li> <li>[FP8] Bump kernels version (<a href="https://redirect.github.com/huggingface/transformers/issues/47344">#47344</a>) by <a href="https://github.com/vasqu"><code>@vasqu</code></a></li> <li>Fix deepgemm on multiple devices (<a href="https://redirect.github.com/huggingface/transformers/issues/47323">#47323</a>) by <a href="https://github.com/IlyasMoutawwakil"><code>@IlyasMoutawwakil</code></a></li> </ul> <h1>Release v5.14.0</h1> <h2>New Model additions</h2> <h3>Inkling (fresh from Thinking Machines): 975B total, 41B active</h3> <ul> <li>Add Inkling model <a href="https://redirect.github.com/huggingface/transformers/issues/47347">#47347</a> by <a href="https://github.com/molbap"><code>@molbap</code></a> <a href="https://github.com/Cyrilvallez"><code>@Cyrilvallez</code></a> <a href="https://github.com/eustlb"><code>@eustlb</code></a> and <a href="https://github.com/zucchini-nlp"><code>@zucchini-nlp</code></a></li> </ul> <!-- raw HTML omitted --> <p>Inkling is a general-purpose multimodal model that accepts text, image and audio inputs and generates text outputs. It is intended for use in English and other languages, and across multiple coding languages. The model is designed to be used by developers building AI- powered applications, including agentic and tool-use systems, coding assistants, chatbots, and retrieval-augmented generation systems, and is suitable for general-purpose conversational use, instruction-following, and other natural language and multimodal tasks. It is released with open weights to support research, fine-tuning and integration into third-party products by downstream developers.</p> <h3>TIPSv2</h3> <!-- raw HTML omitted --> <p><strong>Links:</strong> <a href="https://huggingface.co/docs/transformers/main/en/model_doc/tipsv2">Documentation</a></p> <ul> <li>Add TIPSv2 (<a href="https://redirect.github.com/huggingface/transformers/issues/46347">#46347</a>) by <a href="https://github.com/Ternura143"><code>@Ternura143</code></a> in <a href="https://redirect.github.com/huggingface/transformers/pull/46347">#46347</a></li> </ul> <h3>TIPSv2 DPT</h3> <!-- raw HTML omitted --> <p><strong>Links:</strong> <a href="https://huggingface.co/docs/transformers/main/en/model_doc/tipsv2_dpt">Documentation</a></p> <ul> <li>Add TIPSv2 (<a href="https://redirect.github.com/huggingface/transformers/issues/46347">#46347</a>) by <a href="https://github.com/Ternura143"><code>@Ternura143</code></a> in <a href="https://redirect.github.com/huggingface/transformers/pull/46347">#46347</a></li> </ul> <h2>🚨 Breaking changes</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/huggingface/transformers/commit/a08ace4bbd97e721c98751deec37d87b026acadc"><code>a08ace4</code></a> Release: v4.14.1</li> <li><a href="https://github.com/huggingface/transformers/commit/1ccf4f1594d4e64ebf9cea5c2af246e6e18de72f"><code>1ccf4f1</code></a> Fix deepgemm on multiple devices (<a href="https://redirect.github.com/huggingface/transformers/issues/47323">#47323</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/c98cc10ea7521cef2752ac1514a56825cba9f852"><code>c98cc10</code></a> [<code>FP8</code>] Bump kernels version (<a href="https://redirect.github.com/huggingface/transformers/issues/47344">#47344</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/e035e45e454b47de3efbbf46987f01fdc20f3c2b"><code>e035e45</code></a> Fix assisted decoding for models with EncoderDecoder cache & OlmoHybrid (<a href="https://redirect.github.com/huggingface/transformers/issues/47361">#47361</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/0eb5e032a1a01cb4e9fd657601127870a9fc81b2"><code>0eb5e03</code></a> Fix sdpa prefill with position_bias (<a href="https://redirect.github.com/huggingface/transformers/issues/47359">#47359</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/2fa8c195a03938aa148febcc5a696435b4327a47"><code>2fa8c19</code></a> v5.14.0</li> <li><a href="https://github.com/huggingface/transformers/commit/6c9318ea9694cbc9237de49b3209002f80472b80"><code>6c9318e</code></a> fix feature extraction</li> <li><a href="https://github.com/huggingface/transformers/commit/8f233302785242cb738e8910fa31e980b209cbfb"><code>8f23330</code></a> Small improvement (<a href="https://redirect.github.com/huggingface/transformers/issues/47348">#47348</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/76613e651b25ceee4c7f05a7a16572bed22b808c"><code>76613e6</code></a> Add Inkling model (<a href="https://redirect.github.com/huggingface/transformers/issues/47347">#47347</a>)</li> <li><a href="https://github.com/huggingface/transformers/commit/f5a67a468c6c3c382eaab2ce07491ae713d1279f"><code>f5a67a4</code></a> 🚨 Pass tp_plan from lm_heads (<a href="https://redirect.github.com/huggingface/transformers/issues/47253">#47253</a>)</li> <li>Additional commits viewable in <a href="https://github.com/huggingface/transformers/compare/v5.13.0...v5.14.1">compare view</a></li> </ul> </details> <br /> Updates `ty` from 0.0.56 to 0.0.60 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/releases">ty's releases</a>.</em></p> <blockquote> <h2>0.0.60</h2> <h2>Release Notes</h2> <p>Released on 2026-07-15.</p> <h3>Bug fixes</h3> <ul> <li>Expand transparent callable workaround with overloads and <code>Awaitable[T]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26761">#26761</a>)</li> <li>Separate type-mapping caches by transformation mode (<a href="https://redirect.github.com/astral-sh/ruff/pull/26857">#26857</a>)</li> <li>Avoid recursive protocol union redundancy checks (<a href="https://redirect.github.com/astral-sh/ruff/pull/26689">#26689</a>)</li> <li>Handle recursive protocols in redundant-cast checks (<a href="https://redirect.github.com/astral-sh/ruff/pull/26708">#26708</a>)</li> </ul> <h3>LSP server</h3> <ul> <li>Prevent type that is written with a code span from being incorrectly re-wrapped during docstring Markdown rendering (<a href="https://redirect.github.com/astral-sh/ruff/pull/26723">#26723</a>)</li> </ul> <h3>Library support</h3> <ul> <li>Pydantic: Support <code>populate_by_name</code> and custom initializers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26764">#26764</a>)</li> <li>Pydantic: Warn about immediately discarded extra arguments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26762">#26762</a>)</li> </ul> <h3>Diagnostics</h3> <ul> <li>Narrow TypeGuard keyword arguments and remove <code>invalid-type-guard-call</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26809">#26809</a>)</li> <li>Support own-line suppression comments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26785">#26785</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Derive descriptor setter domains for protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/26683">#26683</a>)</li> <li>Handle cycles in derived constraint relations (<a href="https://redirect.github.com/astral-sh/ruff/pull/26814">#26814</a>)</li> <li>Implement unified generic call inference (<a href="https://redirect.github.com/astral-sh/ruff/pull/26141">#26141</a>)</li> <li>Preserve constraints from bound receivers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26776">#26776</a>)</li> <li>Project exact-length narrowing through TypeVars (<a href="https://redirect.github.com/astral-sh/ruff/pull/26852">#26852</a>)</li> <li>Resolve PEP 695 aliases in type[...] annotations (<a href="https://redirect.github.com/astral-sh/ruff/pull/26842">#26842</a>)</li> <li>Retain sequence pattern narrowing in successful <code>match</code> cases (<a href="https://redirect.github.com/astral-sh/ruff/pull/26807">#26807</a>)</li> <li>Support class and static protocol methods (<a href="https://redirect.github.com/astral-sh/ruff/pull/26574">#26574</a>)</li> <li>Support class objects satisfying instance-method protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/26789">#26789</a>)</li> <li>Support <code>type[Protocol]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26649">#26649</a>)</li> <li>Sync vendored typeshed stubs (<a href="https://redirect.github.com/astral-sh/ruff/pull/26840">#26840</a>). <a href="https://github.com/python/typeshed/compare/b9090e99745ac1511d8efd828622b11a9a3623e8...b00c387c669cb50d5d388d77b74c2e832e147fe8">Typeshed diff</a></li> <li>Treat transparent callable decorators consistently in class assignments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26720">#26720</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Compare overloaded protocol method returns pairwise (<a href="https://redirect.github.com/astral-sh/ruff/pull/26684">#26684</a>)</li> <li>Extend <code>PathBounds</code> fast-path to support both upper and lower bounds (<a href="https://redirect.github.com/astral-sh/ruff/pull/26782">#26782</a>)</li> <li>Skip <code>Self</code> type scans for non-generic instances (<a href="https://redirect.github.com/astral-sh/ruff/pull/26703">#26703</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ty/blob/main/CHANGELOG.md">ty's changelog</a>.</em></p> <blockquote> <h2>0.0.60</h2> <p>Released on 2026-07-15.</p> <h3>Bug fixes</h3> <ul> <li>Expand transparent callable workaround with overloads and <code>Awaitable[T]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26761">#26761</a>)</li> <li>Separate type-mapping caches by transformation mode (<a href="https://redirect.github.com/astral-sh/ruff/pull/26857">#26857</a>)</li> <li>Avoid recursive protocol union redundancy checks (<a href="https://redirect.github.com/astral-sh/ruff/pull/26689">#26689</a>)</li> <li>Handle recursive protocols in redundant-cast checks (<a href="https://redirect.github.com/astral-sh/ruff/pull/26708">#26708</a>)</li> </ul> <h3>LSP server</h3> <ul> <li>Prevent type that is written with a code span from being incorrectly re-wrapped during docstring Markdown rendering (<a href="https://redirect.github.com/astral-sh/ruff/pull/26723">#26723</a>)</li> </ul> <h3>Library support</h3> <ul> <li>Pydantic: Support <code>populate_by_name</code> and custom initializers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26764">#26764</a>)</li> <li>Pydantic: Warn about immediately discarded extra arguments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26762">#26762</a>)</li> </ul> <h3>Diagnostics</h3> <ul> <li>Narrow TypeGuard keyword arguments and remove <code>invalid-type-guard-call</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26809">#26809</a>)</li> <li>Support own-line suppression comments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26785">#26785</a>)</li> </ul> <h3>Core type checking</h3> <ul> <li>Derive descriptor setter domains for protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/26683">#26683</a>)</li> <li>Handle cycles in derived constraint relations (<a href="https://redirect.github.com/astral-sh/ruff/pull/26814">#26814</a>)</li> <li>Implement unified generic call inference (<a href="https://redirect.github.com/astral-sh/ruff/pull/26141">#26141</a>)</li> <li>Preserve constraints from bound receivers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26776">#26776</a>)</li> <li>Project exact-length narrowing through TypeVars (<a href="https://redirect.github.com/astral-sh/ruff/pull/26852">#26852</a>)</li> <li>Resolve PEP 695 aliases in type[...] annotations (<a href="https://redirect.github.com/astral-sh/ruff/pull/26842">#26842</a>)</li> <li>Retain sequence pattern narrowing in successful <code>match</code> cases (<a href="https://redirect.github.com/astral-sh/ruff/pull/26807">#26807</a>)</li> <li>Support class and static protocol methods (<a href="https://redirect.github.com/astral-sh/ruff/pull/26574">#26574</a>)</li> <li>Support class objects satisfying instance-method protocols (<a href="https://redirect.github.com/astral-sh/ruff/pull/26789">#26789</a>)</li> <li>Support <code>type[Protocol]</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/26649">#26649</a>)</li> <li>Sync vendored typeshed stubs (<a href="https://redirect.github.com/astral-sh/ruff/pull/26840">#26840</a>). <a href="https://github.com/python/typeshed/compare/b9090e99745ac1511d8efd828622b11a9a3623e8...b00c387c669cb50d5d388d77b74c2e832e147fe8">Typeshed diff</a></li> <li>Treat transparent callable decorators consistently in class assignments (<a href="https://redirect.github.com/astral-sh/ruff/pull/26720">#26720</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Compare overloaded protocol method returns pairwise (<a href="https://redirect.github.com/astral-sh/ruff/pull/26684">#26684</a>)</li> <li>Extend <code>PathBounds</code> fast-path to support both upper and lower bounds (<a href="https://redirect.github.com/astral-sh/ruff/pull/26782">#26782</a>)</li> <li>Skip <code>Self</code> type scans for non-generic instances (<a href="https://redirect.github.com/astral-sh/ruff/pull/26703">#26703</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> <li><a href="https://github.com/mtshiba"><code>@mtshiba</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ty/commit/ae554ec78e195a51e89ef1d01b517914e186b544"><code>ae554ec</code></a> Bump version to 0.0.60 (<a href="https://redirect.github.com/astral-sh/ty/issues/4008">#4008</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/4f78ec596f4c0b8a65ab5966d0791f57c39b69a2"><code>4f78ec5</code></a> Update astral-sh/setup-uv action to v8.3.2 (<a href="https://redirect.github.com/astral-sh/ty/issues/3997">#3997</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/0f9b58781df1cf3675ce8aca522bc86a6cf7bbd4"><code>0f9b587</code></a> Update prek dependencies (<a href="https://redirect.github.com/astral-sh/ty/issues/3999">#3999</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/9afd3736029e81973bf39f55cf980b2f99ed3b5d"><code>9afd373</code></a> Update dependency prek to v0.4.8 (<a href="https://redirect.github.com/astral-sh/ty/issues/3998">#3998</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/391f499a8e92a2e086555e4a61df89d4fb510265"><code>391f499</code></a> Update docker/build-push-action action to v7.3.0 (<a href="https://redirect.github.com/astral-sh/ty/issues/4000">#4000</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/990dfce9b8aba17b4dc1eefba2a1929ec85e9827"><code>990dfce</code></a> Update docker/login-action action to v4.4.0 (<a href="https://redirect.github.com/astral-sh/ty/issues/4001">#4001</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/1b1e87359d5759d523bd525539f78d530b5919e7"><code>1b1e873</code></a> Update docker/metadata-action action to v6.2.0 (<a href="https://redirect.github.com/astral-sh/ty/issues/4002">#4002</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/aece09f47215f624c8e21586e3d157a93b158409"><code>aece09f</code></a> Update docker/setup-buildx-action action to v4.2.0 (<a href="https://redirect.github.com/astral-sh/ty/issues/4003">#4003</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/71bdf3104da401a9726f0a81ad0b10e51f7206ab"><code>71bdf31</code></a> Bump version to 0.0.59 (<a href="https://redirect.github.com/astral-sh/ty/issues/3979">#3979</a>)</li> <li><a href="https://github.com/astral-sh/ty/commit/17d3f6db5a3d637bd144d4c9d00d3c1616929617"><code>17d3f6d</code></a> Bump version to 0.0.58 (<a href="https://redirect.github.com/astral-sh/ty/issues/3955">#3955</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ty/compare/0.0.56...0.0.60">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.20 to 0.15.22 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.15.22</h2> <h2>Release Notes</h2> <p>Released on 2026-07-16.</p> <h3>Preview features</h3> <ul> <li>[<code>pycodestyle</code>] Add an autofix for <code>E402</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/22212">#22212</a>)</li> <li>[<code>refurb</code>] Allow subclassing builtins in stub files (<code>FURB189</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26812">#26812</a>)</li> <li>[<code>ruff</code>] Add rule to replace <code>noqa</code> comments with <code>ruff:ignore</code> (<code>RUF105</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26423">#26423</a>)</li> <li>[<code>ruff</code>] Add rule to use human-readable names in <code>ruff:ignore</code> comments (<code>RUF106</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26682">#26682</a>)</li> <li>[<code>ruff</code>] Add rule to use human-readable names in configuration selectors (<code>RUF201</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26772">#26772</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-pyi</code>] Fix false positive in <code>__all__</code> (<code>PYI053</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26872">#26872</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pylint</code>] Ignore mutable type updates in <code>redefined-loop-name</code> (<code>PLW2901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25733">#25733</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant lexer token bookkeeping (<a href="https://redirect.github.com/astral-sh/ruff/pull/26765">#26765</a>)</li> <li>Avoid redundant pending-indentation writes (<a href="https://redirect.github.com/astral-sh/ruff/pull/26774">#26774</a>)</li> <li>Avoid unnecessary identifier lookahead (<a href="https://redirect.github.com/astral-sh/ruff/pull/26525">#26525</a>)</li> <li>Reuse parser scratch buffers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26798">#26798</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Document argfile support (<a href="https://redirect.github.com/astral-sh/ruff/pull/26803">#26803</a>)</li> <li>[<code>flake8-datetimez</code>] Clarify naming guidance for <code>datetime.today</code> (<code>DTZ002</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26658">#26658</a>)</li> <li>[<code>pycodestyle</code>] Document <code>E731</code> fix safety (<a href="https://redirect.github.com/astral-sh/ruff/pull/26847">#26847</a>)</li> <li>[<code>ruff</code>] Clarify intentional async contexts for <code>unused-async</code> (<code>RUF029</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26641">#26641</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dwego"><code>@dwego</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> <li><a href="https://github.com/Joosboy"><code>@Joosboy</code></a></li> <li><a href="https://github.com/KaufmanDmitriy"><code>@KaufmanDmitriy</code></a></li> <li><a href="https://github.com/PeterJCLaw"><code>@PeterJCLaw</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> </ul> <h2>Install ruff 0.15.22</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code></tr></table> </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.15.22</h2> <p>Released on 2026-07-16.</p> <h3>Preview features</h3> <ul> <li>[<code>pycodestyle</code>] Add an autofix for <code>E402</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/22212">#22212</a>)</li> <li>[<code>refurb</code>] Allow subclassing builtins in stub files (<code>FURB189</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26812">#26812</a>)</li> <li>[<code>ruff</code>] Add rule to replace <code>noqa</code> comments with <code>ruff:ignore</code> (<code>RUF105</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26423">#26423</a>)</li> <li>[<code>ruff</code>] Add rule to use human-readable names in <code>ruff:ignore</code> comments (<code>RUF106</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26682">#26682</a>)</li> <li>[<code>ruff</code>] Add rule to use human-readable names in configuration selectors (<code>RUF201</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26772">#26772</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-pyi</code>] Fix false positive in <code>__all__</code> (<code>PYI053</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26872">#26872</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pylint</code>] Ignore mutable type updates in <code>redefined-loop-name</code> (<code>PLW2901</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25733">#25733</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid redundant lexer token bookkeeping (<a href="https://redirect.github.com/astral-sh/ruff/pull/26765">#26765</a>)</li> <li>Avoid redundant pending-indentation writes (<a href="https://redirect.github.com/astral-sh/ruff/pull/26774">#26774</a>)</li> <li>Avoid unnecessary identifier lookahead (<a href="https://redirect.github.com/astral-sh/ruff/pull/26525">#26525</a>)</li> <li>Reuse parser scratch buffers (<a href="https://redirect.github.com/astral-sh/ruff/pull/26798">#26798</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Document argfile support (<a href="https://redirect.github.com/astral-sh/ruff/pull/26803">#26803</a>)</li> <li>[<code>flake8-datetimez</code>] Clarify naming guidance for <code>datetime.today</code> (<code>DTZ002</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26658">#26658</a>)</li> <li>[<code>pycodestyle</code>] Document <code>E731</code> fix safety (<a href="https://redirect.github.com/astral-sh/ruff/pull/26847">#26847</a>)</li> <li>[<code>ruff</code>] Clarify intentional async contexts for <code>unused-async</code> (<code>RUF029</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26641">#26641</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dwego"><code>@dwego</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> <li><a href="https://github.com/Joosboy"><code>@Joosboy</code></a></li> <li><a href="https://github.com/KaufmanDmitriy"><code>@KaufmanDmitriy</code></a></li> <li><a href="https://github.com/PeterJCLaw"><code>@PeterJCLaw</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> </ul> <h2>0.15.21</h2> <p>Released on 2026-07-09.</p> <h3>Preview features</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/0177a7e0d2c4a3805afa1960f106d72878766cbc"><code>0177a7e</code></a> Bump 0.15.22 (<a href="https://redirect.github.com/astral-sh/ruff/issues/26884">#26884</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/fe8ba85a55b76d838e6058d813b64468b5f81eca"><code>fe8ba85</code></a> [<code>pycodestyle</code>] Document <code>E731</code> fix safety (<a href="https://redirect.github.com/astral-sh/ruff/issues/26847">#26847</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/f3cf7c81fa35f8b819a719303bf1789714f1c780"><code>f3cf7c8</code></a> [<code>ruff</code>] Add <code>rule-codes-in-selectors</code> (<code>RUF201</code>) (<a href="https://redirect.github.com/astral-sh/ruff/issues/26772">#26772</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/d244fd75e9036e61be4896b823fe760d7aa632a3"><code>d244fd7</code></a> Document argfile support (<a href="https://redirect.github.com/astral-sh/ruff/issues/26803">#26803</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/f23975849a0db64a2851029c68fc054799d5e7da"><code>f239758</code></a> [<code>flake8-pyi</code>] Fix false positive in <code>__all__</code> (<code>PYI053</code>) (<a href="https://redirect.github.com/astral-sh/ruff/issues/26872">#26872</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/54acbcde56d76bc47b0b3dfe61e57fbaadd2c06b"><code>54acbcd</code></a> [ty] Support <code>TypeVarTuple</code> and <code>Unpack</code> (<a href="https://redirect.github.com/astral-sh/ruff/issues/25240">#25240</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/87fc38cacd7e2bd906674c6dc5b8be97aa3a5bc3"><code>87fc38c</code></a> [ty] Parallelize subtype hierarchy search (<a href="https://redirect.github.com/astral-sh/ruff/issues/26875">#26875</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/e454f91fa63bd745d874ead751ad15d9f521195a"><code>e454f91</code></a> [ty] Share interned query keys across Salsa queries (<a href="https://redirect.github.com/astral-sh/ruff/issues/26794">#26794</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/6f361a74a232ad283cc6e5e5d3a62109802aab65"><code>6f361a7</code></a> [ty] only collect expected types for files open in the editor (<a href="https://redirect.github.com/astral-sh/ruff/issues/25546">#25546</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/6d6b2b37686da8b1ee56e54fd99831f1f5fa0381"><code>6d6b2b3</code></a> [ty] Avoid allocations during Salsa interned lookups (<a href="https://redirect.github.com/astral-sh/ruff/issues/26877">#26877</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.20...0.15.22">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Co-authored-by: Alishahryar1 <alishahryar2@gmail.com> |
||
|
|
5cb2739f99 |
build(deps): update fastapi[standard] requirement from >=0.139.0 to >=0.139.2 (#1175)
Updates the requirements on [fastapi[standard]](https://github.com/fastapi/fastapi) to permit the latest version. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/fastapi/fastapi/releases">fastapi[standard]'s releases</a>.</em></p> <blockquote> <h2>0.139.2</h2> <h3>Fixes</h3> <ul> <li>🐛 Refactor router route building to make it thread-safe, mainly relevant for tests running in parallel threads (uncommon). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/16013">#16013</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/fastapi/fastapi/commit/866b7a3d0ce1025a3811f23aea4846d01a2b16a8"><code>866b7a3</code></a> 🔖 Release version 0.139.2 (<a href="https://redirect.github.com/fastapi/fastapi/issues/16014">#16014</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/7b3effea754619f0c305af576be23a51865292a3"><code>7b3effe</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/7fe315c21afb8a57a2b559772e0f7ced7e5d071a"><code>7fe315c</code></a> 🐛 Refactor router route building to make it thread-safe, mainly relevant for ...</li> <li><a href="https://github.com/fastapi/fastapi/commit/c48e67b1ce9c03fc9bd4b1ac72350e51ad5a6e8a"><code>c48e67b</code></a> 🔖 Release version 0.139.1 (<a href="https://redirect.github.com/fastapi/fastapi/issues/16012">#16012</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/2acc4fbf155caf016e3bd2602c0d2ec52723e635"><code>2acc4fb</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/eb75fd078e83aed935016bcdf0705cd58bbf0d0e"><code>eb75fd0</code></a> 🐛 Fix frontend fallback support for doted paths like <code>/users/john.doe</code> (<a href="https://redirect.github.com/fastapi/fastapi/issues/16011">#16011</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/9b8410bdc9fa1fd679ea7e65b926535c7045ab87"><code>9b8410b</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/e24d44cce4092a33b64e9536e96e7608a7dcb9b8"><code>e24d44c</code></a> 📝 Fix topic repository list not being displayed and <code>skip_users</code> not being ap...</li> <li><a href="https://github.com/fastapi/fastapi/commit/93b78f8646dea4543cc4d938f7e29b8547749a99"><code>93b78f8</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/b959b443577c5f2b870cdef13219b98aa32f8943"><code>b959b44</code></a> 📝 Update release notes</li> <li>Additional commits viewable in <a href="https://github.com/fastapi/fastapi/compare/0.139.0...0.139.2">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alishahryar1 <alishahryar2@gmail.com> |
||
|
|
3418ddb8ce |
build(deps): bump actions/github-script from 8.0.0 to 9.0.0 (#1173)
Bumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/github-script/releases">actions/github-script's releases</a>.</em></p> <blockquote> <h2>v9.0.0</h2> <p><strong>New features:</strong></p> <ul> <li><strong><code>getOctokit</code> factory function</strong> — Available directly in the script context. Create additional authenticated Octokit clients with different tokens for multi-token workflows, GitHub App tokens, and cross-org access. See <a href="https://github.com/actions/github-script#creating-additional-clients-with-getoctokit">Creating additional clients with <code>getOctokit</code></a> for details and examples.</li> <li><strong>Orchestration ID in user-agent</strong> — The <code>ACTIONS_ORCHESTRATION_ID</code> environment variable is automatically appended to the user-agent string for request tracing.</li> </ul> <p><strong>Breaking changes:</strong></p> <ul> <li><strong><code>require('@actions/github')</code> no longer works in scripts.</strong> The upgrade to <code>@actions/github</code> v9 (ESM-only) means <code>require('@actions/github')</code> will fail at runtime. If you previously used patterns like <code>const { getOctokit } = require('@actions/github')</code> to create secondary clients, use the new injected <code>getOctokit</code> function instead — it's available directly in the script context with no imports needed.</li> <li><code>getOctokit</code> is now an injected function parameter. Scripts that declare <code>const getOctokit = ...</code> or <code>let getOctokit = ...</code> will get a <code>SyntaxError</code> because JavaScript does not allow <code>const</code>/<code>let</code> redeclaration of function parameters. Use the injected <code>getOctokit</code> directly, or use <code>var getOctokit = ...</code> if you need to redeclare it.</li> <li>If your script accesses other <code>@actions/github</code> internals beyond the standard <code>github</code>/<code>octokit</code> client, you may need to update those references for v9 compatibility.</li> </ul> <h2>What's Changed</h2> <ul> <li>Add ACTIONS_ORCHESTRATION_ID to user-agent string by <a href="https://github.com/Copilot"><code>@Copilot</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li> <li>ci: use deployment: false for integration test environments by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/712">actions/github-script#712</a></li> <li>feat!: add getOctokit to script context, upgrade <code>@actions/github</code> v9, <code>@octokit/core</code> v7, and related packages by <a href="https://github.com/salmanmkc"><code>@salmanmkc</code></a> in <a href="https://redirect.github.com/actions/github-script/pull/700">actions/github-script#700</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Copilot"><code>@Copilot</code></a> made their first contribution in <a href="https://redirect.github.com/actions/github-script/pull/695">actions/github-script#695</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/github-script/compare/v8.0.0...v9.0.0">https://github.com/actions/github-script/compare/v8.0.0...v9.0.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/github-script/commit/3a2844b7e9c422d3c10d287c895573f7108da1b3"><code>3a2844b</code></a> Merge pull request <a href="https://redirect.github.com/actions/github-script/issues/700">#700</a> from actions/salmanmkc/expose-getoctokit + prepare re...</li> <li><a href="https://github.com/actions/github-script/commit/ca10bbdd1a7739de09e99a200c7a59f5d73a4079"><code>ca10bbd</code></a> fix: use <code>@octokit/core/</code>types import for v7 compatibility</li> <li><a href="https://github.com/actions/github-script/commit/86e48e20ac85c970ed1f96e718fd068173948b7b"><code>86e48e2</code></a> merge: incorporate main branch changes</li> <li><a href="https://github.com/actions/github-script/commit/c1084728b5b935ec4ddc1e4cee877b01797b3ff9"><code>c108472</code></a> chore: rebuild dist for v9 upgrade and getOctokit factory</li> <li><a href="https://github.com/actions/github-script/commit/afff112e4f8b57c718168af75b89ce00bc8d091d"><code>afff112</code></a> Merge pull request <a href="https://redirect.github.com/actions/github-script/issues/712">#712</a> from actions/salmanmkc/deployment-false + fix user-ag...</li> <li><a href="https://github.com/actions/github-script/commit/ff8117e5b78c415f814f39ad6998f424fee7b817"><code>ff8117e</code></a> ci: fix user-agent test to handle orchestration ID</li> <li><a href="https://github.com/actions/github-script/commit/81c6b7876079abe10ff715951c9fc7b3e1ab389d"><code>81c6b78</code></a> ci: use deployment: false to suppress deployment noise from integration tests</li> <li><a href="https://github.com/actions/github-script/commit/3953caf8858d318f37b6cc53a9f5708859b5a7b7"><code>3953caf</code></a> docs: update README examples from <a href="https://github.com/v8"><code>@v8</code></a> to <a href="https://github.com/v9"><code>@v9</code></a>, add getOctokit docs and v9 brea...</li> <li><a href="https://github.com/actions/github-script/commit/c17d55b90dcdb3d554d0027a6c180a7adc2daf78"><code>c17d55b</code></a> ci: add getOctokit integration test job</li> <li><a href="https://github.com/actions/github-script/commit/a047196d9a02fe92098771cafbb98c2f1814e408"><code>a047196</code></a> test: add getOctokit integration tests via callAsyncFunction</li> <li>Additional commits viewable in <a href="https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
e14d8402a1 |
Prevent the admin UI from being served from cache (#1160)
## Problem Browsers could retain the local admin page, assets, or error responses, leaving users on stale UI state after an FCC update. ## Changes | Before | After | | --- | --- | | Admin responses had no complete cache policy, and route-level handling missed exception responses. | A dedicated admin response boundary sends `Cache-Control: no-store` for every `/admin` response, including 403, 404, validation, and unexpected errors. | | Admin API fetches used the browser's default cache mode. | Admin API fetches explicitly use `cache: "no-store"`. | | Cache behavior was untested. | Tests cover HTML, assets, JSON, failure responses, and path scoping. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR prevents browsers from retaining stale admin UI responses. The main changes are: - Adds `Cache-Control: no-store` to successful and error responses under `/admin`. - Sets admin API fetches to use the browser's `no-store` cache mode. - Adds tests for HTML, assets, API responses, errors, and path matching. - Bumps the package patch version and updates the lockfile. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. The middleware covers normal and handled error responses under the admin path. The explicit fallback covers general admin error responses. Tests cover successful responses and the relevant 403, 404, 422, and 500 paths. No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The runtime probe script admin-cache-runtime-probe.py was executed to exercise the repository's create\_test\_app() application. - The admin-cache-http-01-before.log log captured three endpoint responses without Cache-Control before the change. - The admin-cache-http-02-after.log log captured the same endpoints after applying Cache-Control: no-store. - The focused test evidence in admin-cache-02-after.log recorded the exact command, working directory, exit code, and verbose results. <a href="https://app.greptile.com/trex/runs/14828301/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/api/admin_cache.py | Adds middleware and an error-response fallback that apply `Cache-Control: no-store` to the admin surface. | | src/free_claude_code/api/app.py | Registers the cache middleware and applies the policy to general admin error responses. | | src/free_claude_code/api/admin_static/admin.js | Configures admin API fetches to bypass the browser cache. | | tests/api/test_admin.py | Covers cache headers on successful, missing, denied, invalid, and failed admin requests. | </details> <sub>Reviews (2): Last reviewed commit: ["Cover admin error responses with no-stor..."](https://github.com/alishahryar1/free-claude-code/commit/06c92fc4325ee7bcd96641051d19d5b83462322b) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45057666)</sub> <!-- /greptile_comment --> |
||
|
|
65a342ede4 |
Honor reasoning tiers on numeric-budget providers (#1150)
## Problem FCC preserved named reasoning effort but numeric-budget providers received no intensity unless a client supplied an exact token budget. NIM and llama.cpp therefore treated Low through Max like the same provider default. ## Changes | Before | After | | --- | --- | | Named effort had no FCC-owned numeric meaning. | FCC maps Low, Medium, High, X-High, and Max to 512, 1,024, 2,048, 4,096, and 8,192 tokens. | | NIM received only thinking booleans for named effort. | [NIM](https://docs.nvidia.com/nim/large-language-models/1.15.0/thinking-budget-control.html) receives thinking booleans plus the mapped `reasoning_budget`, retaining its existing retry without rejected budget control. | | llama.cpp forwarded only exact client budgets. | [llama.cpp](https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md) receives the mapped `thinking_budget_tokens` value. | | Named, boolean, and provider-default adapters shared no explicit numeric contract. | Named adapters keep words, boolean adapters keep on/off, and only numeric-budget adapters consume the FCC scale. | | Documentation prohibited every named-effort budget conversion. | Documentation defines the product scale, exact-budget precedence, and model-independent ownership boundary. | | Version 4.8.0 exposed tiers that collapsed on numeric providers. | Version 4.8.1 completes the tiers; all five local CI checks pass with 2,383 tests passed and 40 skipped. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR gives named reasoning tiers numeric budgets for providers that require token counts. The main changes are: - Adds one shared tier-to-token scale with exact-budget precedence. - Sends mapped budgets to NVIDIA NIM and llama.cpp. - Removes conflicting client-supplied NIM budget fields. - Adds focused provider and policy tests. - Updates documentation and bumps the package to 4.8.1. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. The NIM fix removes both conflicting budget locations while preserving unrelated nested options. No blocking issue remains in the changed paths. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex ran a pre-change focused validation against the budget logic and observed 16 failures and 2 passes, establishing the baseline. - T-Rex ran a post-change focused validation (head run) and confirmed all 18 cases passed, including the mocked NIM retry paths. - T-Rex executed the full focused validation after the change and produced a verbose log showing 91/91 passing. <a href="https://app.greptile.com/trex/runs/14800553/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/core/reasoning.py | Adds the shared effort-to-token scale and preserves exact client budgets as the higher-priority value. | | src/free_claude_code/providers/nvidia_nim/request_options.py | Removes top-level and nested client budgets before inserting one policy-derived NIM budget. | | src/free_claude_code/providers/openai_chat/reasoning.py | Extends llama.cpp request encoding to send mapped named-effort budgets. | </details> <sub>Reviews (2): Last reviewed commit: ["fix: canonicalize NIM reasoning budgets"](https://github.com/alishahryar1/free-claude-code/commit/368f1a88d3f1404fcab2365703cca89f1077f1ea) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44998377)</sub> <!-- /greptile_comment --> |
||
|
|
0de7608b52 |
Keep inline system reminders cache-stable across providers (#1154)
## Problem Inline Anthropic system reminders were forwarded as mid-conversation OpenAI system roles. Compatible provider chat templates could reposition those roles, changing prior prompt tokens and causing periodic full cache misses. Fixes #1152. ## Changes | Before | After | | --- | --- | | Top-level and inline system content both used downstream system roles. | Only top-level system content uses the leading downstream system role. | | Inline system reminders could trigger provider-side prompt retemplating. | Inline system reminders keep their text and position as downstream user messages. | | Provider policies could reinterpret the shared role mapping. | Shared conversion owns one provider-independent role mapping. | | Cache-prefix coverage allowed mid-conversation system roles. | Cache-prefix coverage requires append-only user-encoded reminders. | | The package version was 4.8.0. | The package version is 4.8.1. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR keeps inline system reminders stable across OpenAI-compatible providers. The main changes are: - Maps only the top-level system prompt to the downstream system role. - Encodes inline system reminders as ordered user content. - Coalesces adjacent user messages after transcript ordering. - Adds tests for text, multimodal content, cache-prefix stability, and tool-result ordering. - Updates the architecture notes and bumps the package to 4.8.1. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. Adjacent user messages are combined after assistant and tool dependencies are ordered. Multimodal content keeps its part order. No blocking issues were found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Before capture, the converted prefix roles were shown as system, user, and assistant. - After capture, the same prefix appeared, followed by a user continuation containing a second question and a system-reminder tag; all runtime assertions passed. - The preserved harness documents and reproduces the public-builder validation. <a href="https://app.greptile.com/trex/runs/14803290/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/core/anthropic/conversion.py | Maps inline system reminders to user content and coalesces adjacent user messages after transcript ordering. | | tests/providers/test_converter.py | Adds tests for inline reminders, multimodal content, cache-prefix stability, and tool-result ordering. | | ARCHITECTURE.md | Documents the shared role-mapping and adjacent-user coalescing rules. | | pyproject.toml | Bumps the package version to 4.8.1. | | uv.lock | Synchronizes the locked editable package version with 4.8.1. | </details> <sub>Reviews (2): Last reviewed commit: ["fix: coalesce adjacent provider user tur..."](https://github.com/alishahryar1/free-claude-code/commit/7af6327c79fa15c0f4922bad8864f1c6656b2814) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=45005803)</sub> <!-- /greptile_comment --> |
||
|
|
6455c63e1d |
Make reasoning policy provider-neutral and client-aware (#1148)
## Problem FCC reduced reasoning to global and route booleans, mixing client intent, configuration, provider wire capabilities, output visibility, and history replay. That discarded named client efforts, encouraged model-name checks, and made provider behavior inconsistent. ## Changes | Before | After | | --- | --- | | Admin exposed global and route thinking toggles. | Admin exposes **Off**, **From client**, **Low**, **Medium**, **High**, **X-High**, and **Max**; Fable, Opus, Sonnet, and Haiku also expose **Inherit**. | | Request intent was repeatedly reduced to a boolean across routing and providers. | The application boundary resolves one immutable `ReasoningPolicy` with independent control, named effort, and exact positive token budget. | | Provider adapters could infer reasoning behavior from upstream model names or versions. | Provider profiles translate only documented provider-wide wire capabilities; architecture and contributor rules prohibit model-specific reasoning branches. | | Gateway reasoning controls were ad hoc. | [OpenRouter](https://openrouter.ai/docs/guides/best-practices/reasoning-tokens) and [Vercel AI Gateway](https://vercel.com/docs/ai-gateway/models-and-providers) use documented reasoning objects, including exact budgets where representable. | | Named effort forwarding was inconsistent or absent. | [Gemini](https://ai.google.dev/gemini-api/docs/openai), [Ollama](https://docs.ollama.com/api/openai-compatibility), [LM Studio](https://lmstudio.ai/changelog/lmstudio-v0.4.8), [Fireworks](https://docs.fireworks.ai/guides/querying-text-models/reasoning), [Cohere](https://docs.cohere.com/docs/compatibility-api), [Wafer](https://docs.wafer.ai/serverless/api-reference), [Groq](https://console.groq.com/docs/reasoning), [Cerebras](https://inference-docs.cerebras.ai/capabilities/reasoning), [SambaNova](https://docs.sambanova.ai/docs/api-reference/chat-completions/create-chat-based-completion), and [Mistral](https://docs.mistral.ai/studio-api/conversations/reasoning) receive their documented named vocabularies with explicit provider-owned downgrades. | | Boolean thinking controls were mixed into shared conversion. | [DeepSeek](https://api-docs.deepseek.com/guides/thinking_mode/), [Kimi](https://platform.kimi.ai/docs/guide/use-kimi-k2-thinking-model), [Z.ai](https://docs.z.ai/guides/capabilities/thinking-mode), [Cloudflare Workers AI](https://developers.cloudflare.com/changelog/post/2026-04-20-kimi-k2-6-workers-ai/), and [NVIDIA NIM](https://docs.nvidia.com/nim/large-language-models/1.15.0/thinking-budget-control.html) use provider-owned thinking-object or chat-template controls. | | Effort names and output limits could become fabricated reasoning budgets. | Exact budgets remain exact and are forwarded only through documented fields for OpenRouter, Fireworks, LM Studio, NIM, and [llama.cpp](https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md); named efforts and output limits are never converted into token budgets. | | New-turn reasoning and prior-turn replay shared one switch. | Every profile independently declares native reasoning replay, `<think>` tag replay, provider-specific replay, or no replay; **Off** suppresses new reasoning output without corrupting required history. | | Providers without a stable generic compute control received guessed controls. | [MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api) requests split output only, while [GitHub Models](https://docs.github.com/en/rest/models/inference), [Hugging Face Inference Providers](https://huggingface.co/docs/inference-providers/en/tasks/chat-completion), Codestral, and OpenCode keep provider defaults and use only their explicit replay profile. | | OpenAI Responses effort became a lossy Anthropic thinking boolean. | Responses preserves `reasoning.effort` through `output_config`, then resolves it through the same application policy as Messages without inventing a budget. | | Legacy booleans remained the persisted contract. | FCC-owned dotenv files migrate to typed `REASONING_*` values, explicit env files receive an actionable warning, documentation describes the ownership boundary, and the package advances to 4.8.0. | | Reasoning behavior was covered by scattered boolean assertions. | New policy, routing, encoder, provider, Admin, migration, Responses, and smoke contracts pass all five local CI checks: 2,368 tests passed, 40 skipped; 92 smoke tests collect and both live config migration checks pass. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR makes reasoning policy client-aware and independent of provider model names. The main changes are: - Adds one immutable reasoning policy resolved at the application boundary. - Adds typed root and route reasoning settings with Admin UI support. - Moves wire controls and history replay behavior into provider profiles. - Migrates owned dotenv files from legacy thinking booleans. - Expands provider, routing, migration, API, and smoke coverage. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the contract-validation test suite with the specified test modules, and the tests reported 78 passed in 1.53s with exit code 0. - Reviewed the complete captured output artifact reasoning-contract-02-after.log to verify the final test outcomes and successful contract validation. <a href="https://app.greptile.com/trex/runs/14792858/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/config/env_migrations.py | Migrates legacy reasoning booleans in owned dotenv files and warns for explicit environment files. | | src/free_claude_code/application/reasoning.py | Resolves client controls and configured preferences into one provider-neutral reasoning policy. | | src/free_claude_code/application/routing.py | Carries route-level reasoning preferences into request-scoped policy resolution. | | src/free_claude_code/providers/openai_chat/reasoning.py | Provides shared provider encoders for reasoning controls and replay behavior. | </details> <sub>Reviews (2): Last reviewed commit: ["chore: release reasoning controls as 4.8..."](https://github.com/alishahryar1/free-claude-code/commit/9d4be767f7dbdca5709474012f43dcdc6f4347e3) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44984039)</sub> <!-- /greptile_comment --> |
||
|
|
f77fe8581c |
Add LOG_LEVEL env var to control log verbosity (#1142)
## Problem The server always writes DEBUG logs, producing detailed request traces customers rarely need and allowing rotated files to accumulate without a retention cap. Supervised restarts also need to apply changed logging settings consistently. Closes #1141. ## Changes | Before | After | | --- | --- | | The file sink always starts at `DEBUG`. | `LOG_LEVEL` supports `DEBUG`, `INFO`, `WARNING`, `ERROR`, and `CRITICAL`, with a customer-friendly `INFO` default. | | Structured request traces are emitted at `INFO`. | Structured request traces are emitted at `DEBUG` and remain available for opt-in diagnostics. | | Logs rotate at 50 MB without a retention limit. | Logs retain five rotated files, bounding normal usage to roughly 300 MB including the active file. | | Supervised restarts can keep stale sink and third-party logger levels. | Supervised restarts replace the sink or third-party levels only when their effective settings change. | | The package version is `4.7.2`. | The package version is `4.7.3`. | <!-- greptile_comment --> <h3>Greptile Summary</h3> This PR adds configurable file-log verbosity and improves logging behavior across supervised restarts. The main changes are: - Adds a validated `LOG_LEVEL` setting with an `INFO` default. - Moves structured request traces from `INFO` to `DEBUG`. - Retains five rotated log files. - Replaces the file sink when its normalized path or level changes. - Updates third-party logger levels when verbose logging changes. - Bumps the package version to `4.7.3`. <h3>Confidence Score: 5/5</h3> This looks safe to merge. The supervised restart path now replaces the sink when its normalized path or level changes. Verbosity-only changes update third-party logger levels without replacing the file sink. No blocking issues were found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex captured the baseline parent-revision import failure in runtime-logging-01-before.log. - T-Rex re-created the virtual environment for the current revision and captured runtime-logging-02-after.log, which shows the same import failure after uv reinstallation. - T-Rex verified the uv-managed Python 3.14 environment exists but cannot import loguru, as shown in runtime-logging-environment-blocker.log. - Artifacts corresponding to the three runtime-logging logs and the Python artifact were prepared for review. <a href="https://app.greptile.com/trex/runs/14767708/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <h3>Important Files Changed</h3> | Filename | Overview | |----------|----------| | src/free_claude_code/config/logging_config.py | Tracks the active sink path, level, verbosity, and identifier so supervised restarts apply changed logging settings. | | src/free_claude_code/config/settings.py | Adds and validates the `LOG_LEVEL` environment setting. | | src/free_claude_code/runtime/bootstrap.py | Passes the configured log level and third-party verbosity into logging setup. | | src/free_claude_code/core/trace.py | Emits structured request traces at `DEBUG` instead of `INFO`. | | tests/config/test_logging_config.py | Covers path, level, and verbosity changes along with default filtering and retention. | <sub>Reviews (6): Last reviewed commit: ["Make customer logging configurable and s..."](https://github.com/alishahryar1/free-claude-code/commit/0cae08607ee8b92a51b5094de9e01cc89478dbfd) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44854591)</sub> <!-- /greptile_comment --> --------- Co-authored-by: Alishahryar1 <alishahryar2@gmail.com> |
||
|
|
a610a3d433 |
Remove unreliable Star History embed (#1145)
## Problem GitHub's stargazer access restrictions prevent Star History from reliably rebuilding the repository timeline. The README can therefore display stale or unavailable growth data. ## Changes | Before | After | | --- | --- | | The README embedded a Star History chart backed by restricted stargazer data. | The README omits the unreliable Star History section. | | The top project badges appeared above the Star History chart. | The top project badges remain unchanged above the usage content. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR removes the unreliable Star History chart from the README. - Deletes the Star History heading and external embed. - Leaves the surrounding badges, screenshots, and usage content unchanged. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed documentation. The removed block is self-contained, and the surrounding README remains valid. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The general contract validation proof showed that both captures identify the actual source path, clean worktree state, commit, SHA-256, checked patterns, occurrence counts, H2 sequence, and README lines 3–54. - The proof also confirms that both executions completed with OVERALL=PASS and exit code 0. <a href="https://app.greptile.com/trex/runs/14746868/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | README.md | Removes a self-contained external chart block without leaving broken Markdown, HTML, navigation, or repository references. | </details> <sub>Reviews (1): Last reviewed commit: ["Remove broken Star History embed"](https://github.com/alishahryar1/free-claude-code/commit/a266b8cdbb585d4c644aaaf4e4d57ece7669ab17) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44896601)</sub> <!-- /greptile_comment --> |
||
|
|
cba7ed23c5 |
Fix Cerebras reasoning serialization (#1138)
## Problem Cerebras rejects multi-turn Claude conversations because FCC serializes prior assistant thinking as the unsupported `reasoning_content` field. Cerebras also streams reasoning through `delta.reasoning`, so FCC can miss reasoning output. Fixes #1136. ## Changes | Before | After | | --- | --- | | Cerebras replayed assistant thinking through `reasoning_content`. | Cerebras replays assistant thinking as `<think>`-tagged assistant content. | | Cerebras parsed streamed reasoning from `delta.reasoning_content`. | Cerebras parses streamed reasoning from `delta.reasoning`. | | The disabled-thinking test checked an impossible message role. | Regression tests inspect serialized fields, preserve tool history, and cover disabled thinking. | | The package version was `4.7.1`. | The package version is `4.7.2`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR fixes reasoning serialization for Cerebras conversations. The main changes are: - Replays prior assistant reasoning as `<think>`-tagged content. - Reads streamed reasoning from `delta.reasoning`. - Adds tests for tool history and disabled thinking. - Bumps the package version to `4.7.2`. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. - No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The pre-change run showed HEAD^ failed the tagged-reasoning replay and delta.reasoning streaming tests, with 2 failures and 9 successes. - The post-change head checkout completed successfully, with 11 tests passing in 0.73s and exit code 0. <a href="https://app.greptile.com/trex/runs/14672360/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/openai_chat/profiles.py | Updates Cerebras reasoning replay and streaming field configuration. | | tests/providers/test_cerebras.py | Covers tagged reasoning replay, tool history, disabled thinking, and streamed reasoning. | | pyproject.toml | Bumps the package patch version to 4.7.2. | | uv.lock | Synchronizes the locked editable package version. | </details> <sub>Reviews (1): Last reviewed commit: ["Fix Cerebras reasoning serialization"](https://github.com/alishahryar1/free-claude-code/commit/bff27ef4de4c968408e6a049bc6cca2068c7c836) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44744399)</sub> <!-- /greptile_comment --> |
||
|
|
56b0a21c0a |
Make version commands bypass server startup imports (#1135)
## Problem `fcc-server --version` and `fcc-init --version` imported the complete server composition root before printing package metadata, making metadata-only commands take about 1.3 seconds and coupling them to unrelated runtime dependencies. ## Changes | Before | After | | --- | --- | | Installed entrypoints imported Uvicorn, the API, providers, and SDKs before checking `--version`. | Lightweight entrypoints handle `--version` before loading command implementations. | | Server lifecycle and config initialization lived in the executable adapter. | Heavy command behavior has one explicit owner in `cli/commands.py`, while published script targets remain unchanged. | | Version tests asserted output while the full runtime was already imported. | Fresh-process regression tests prove both version paths leave heavyweight runtime modules unloaded. | | The median `uv run fcc-server --version` time was 1,286 ms. | The measured median is 189 ms, about 6.8x faster. | | Package version was 4.7.0. | Package version is 4.7.1. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR keeps version commands independent of server startup imports. The main changes are: - Moves server and initialization logic into `cli/commands.py`. - Defers command imports until after the `--version` check. - Adds subprocess tests for lightweight version execution and command delegation. - Updates the import-boundary exception and bumps the package version to 4.7.1. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues were found. Non-version commands retain their prior behavior through direct delegation, version commands return before loading the extracted runtime module, and package and lockfile versions remain synchronized. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The pre-proof state was captured to show the initial CLI condition with version 4.7.0 while loading uvicorn, fastapi, and openai. - A reusable executable harness that runs tests in a fresh process was preserved and reviewed for isolated execution. - The post-proof state was captured to show the final CLI condition with version 4.7.1, exit code 0, and no stderr or forbidden modules. - The focused test output was inspected to confirm results aligned with the final state. - Artifacts documenting the before/after state, harness, and focused tests were organized for reviewer access. <a href="https://app.greptile.com/trex/runs/14655670/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/entrypoints.py | Adds deferred command imports after the lightweight version check. | | src/free_claude_code/cli/commands.py | Takes ownership of the existing server lifecycle and configuration initialization logic. | | tests/cli/test_entrypoints.py | Adds fresh-process import checks and verifies delegation to command implementations. | | tests/contracts/test_import_boundaries.py | Moves the CLI-to-runtime exception to the new composition-root owner. | | pyproject.toml | Bumps the package version while preserving the installed script targets. | | uv.lock | Synchronizes the locked package metadata with version 4.7.1. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart TD A[Installed CLI entrypoint] --> B{--version present?} B -->|Yes| C[Read package metadata] C --> D[Print version and exit] B -->|No| E[Import cli.commands] E --> F{Selected command} F -->|serve| G[Load composition root and start server] F -->|init| H[Migrate and initialize configuration] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart TD A[Installed CLI entrypoint] --> B{--version present?} B -->|Yes| C[Read package metadata] C --> D[Print version and exit] B -->|No| E[Import cli.commands] E --> F{Selected command} F -->|serve| G[Load composition root and start server] F -->|init| H[Migrate and initialize configuration] ``` </a> </details> <sub>Reviews (1): Last reviewed commit: ["Make version commands bypass server impo..."](https://github.com/alishahryar1/free-claude-code/commit/a9a29927cd8996e7ef8b0fc320757e8f4198e3f5) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44710399)</sub> <!-- /greptile_comment --> |
||
|
|
d3dde47eaa |
Add an explicit searchable model dropdown (#1133)
## Problem Admin model fields depended on the browser's native datalist. Filtering worked, but browsers did not consistently expose a visible dropdown for browsing the full model catalog. ## Changes | Before | After | | --- | --- | | Model fields relied on browser-native datalist behavior. | Model fields use one FCC-owned searchable combobox with a visible chevron. | | Suggestions became discoverable only through browser-specific interactions. | Clicking the field or chevron opens the full catalog, while typing filters it. | | Keyboard navigation and empty results depended on native picker behavior. | Arrow keys, Enter, Escape, empty-state guidance, custom slugs, and None are handled explicitly. | | Selects and model fields rendered separate dropdown indicators. | Both controls use the same shared chevron asset. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR replaces native model datalists with an explicit searchable combobox. The main changes are: - Adds a visible model dropdown with filtering and empty-state guidance. - Supports keyboard navigation, custom model slugs, and optional `None` values. - Shares one chevron style across model fields and selects. - Updates admin tests and bumps the package version to 4.7.0. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. Closed Arrow-Up activates the last available option. Empty model lists and optional `None` values remain valid. No blocking issues were found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Completed end-to-end validation of the FCC listbox model selection flow, including the discovery of models, opus-based filtering, keyboard selection, preservation of a custom slug, serializing None as empty, final activation with Arrow Up, and display of no-match guidance when needed. - Verified that corresponding admin requests returned HTTP 200 during the interaction, confirming contract-level success. <a href="https://app.greptile.com/trex/runs/14651225/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/api/admin_static/admin.js | Adds the searchable model combobox and correctly activates the last option when Arrow-Up opens a closed list. | | src/free_claude_code/api/admin_static/admin.css | Adds combobox layout, option states, dropdown stacking, and shared chevron styling. | | tests/api/test_admin.py | Updates admin static assertions for combobox behavior, custom slugs, and optional model values. | | pyproject.toml | Bumps the project version from 4.6.4 to 4.7.0. | | uv.lock | Synchronizes the editable package version with the project metadata. | </details> <sub>Reviews (2): Last reviewed commit: ["Fix closed ArrowUp model navigation"](https://github.com/alishahryar1/free-claude-code/commit/846c3423c8734c1b69cc340a3ff0c2031ff8bc48) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44698382)</sub> <!-- /greptile_comment --> |
||
|
|
74ddf478b1 |
Accept copied FCC version output in bug reports (#1131)
## Problem Bug-report validation rejected the literal output of `fcc-server --version`, leaving reports labeled even when they contained an unambiguous FCC version. ## Changes | Before | After | | --- | --- | | The validator rejected `free-claude-code x.y.z` copied from the command output. | The validator silently accepts copied command output. | | The form requested a bare `x.y.z` value or `None`. | The form continues requesting a bare `x.y.z` value or `None`. | | Prefixed version input had no accepted exact shape. | Prefixed version input must exactly match `free-claude-code x.y.z`. | |
||
|
|
8d7f560589 |
Preserve DeepSeek cache prefixes across tool turns (#1126)
## Problem DeepSeek cache accounting was restored, but a later tool turn could still make FCC rewrite older assistant history. That prevented FCC from guaranteeing the identical serialized prefix required for cache reuse and left the remaining behavior in #904 unresolved. ## Changes | Before | After | | --- | --- | | Non-tool reasoning was replayed until a later tool fallback removed it. | Non-tool reasoning is omitted consistently from its first history serialization. | | Current-generation thinking controlled all historical reasoning replay. | Required tool-call reasoning is replayed independently of current-generation thinking. | | One replayable tool turn made the entire tool history appear safe. | Every tool-call turn must have replayable reasoning before thinking remains enabled. | | Prefix behavior was not verified after SDK request serialization. | DeepSeek tests capture final SDK JSON and require an exact append-only message prefix. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR preserves DeepSeek cache prefixes while retaining required tool-call reasoning. The main changes are: - Omits non-tool reasoning from its first history serialization. - Replays tool-call reasoning independently of current thinking mode. - Disables thinking unless every historical tool call has replayable reasoning. - Tests the final SDK-serialized message prefix. - Bumps the package patch version and updates the lockfile. </details> <h3>Confidence Score: 4/5</h3> The reasoning-only assistant path needs a fix before merging. The main prefix-preservation flow is covered at the SDK wire boundary. Filtering a `redacted_thinking`-only turn emits empty assistant content instead of the converter's non-empty sentinel. Other request-policy callers retain their previous behavior. src/free_claude_code/providers/deepseek/compat.py <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex executed the requested verification of the code base. - T-Rex ran the focused test wire\_messages\_keep\_prefix\_across\_tool\_thinking\_fallback with pytest; the exact command and harness are captured in the log, and the test completed with exit code 0. <a href="https://app.greptile.com/trex/runs/14533439/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/deepseek/compat.py | Separates historical tool reasoning from current thinking, but can serialize an empty assistant message after filtering. | | src/free_claude_code/providers/openai_chat/request_policy.py | Adds an optional reasoning-history switch while preserving existing defaults for other callers. | | tests/providers/test_deepseek.py | Adds SDK wire-format tests for stable prefixes and independent tool-reasoning replay. | | pyproject.toml | Bumps the package patch version to 4.6.4. | | uv.lock | Synchronizes the editable package version with the project metadata. | | ARCHITECTURE.md | Documents DeepSeek's per-turn reasoning replay and append-only prefix behavior. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart LR A[Anthropic history] --> B[Classify tool-call reasoning] B --> C[Sanitize assistant history] C --> D[Convert to OpenAI messages] D --> E[Serialize through SDK] E --> F[DeepSeek request] B -->|Every tool call replayable| G[Keep current thinking] B -->|Any tool call not replayable| H[Disable current thinking] C -->|Tool-call turn| I[Retain reasoning] C -->|Non-tool turn| J[Omit reasoning] ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart LR A[Anthropic history] --> B[Classify tool-call reasoning] B --> C[Sanitize assistant history] C --> D[Convert to OpenAI messages] D --> E[Serialize through SDK] E --> F[DeepSeek request] B -->|Every tool call replayable| G[Keep current thinking] B -->|Any tool call not replayable| H[Disable current thinking] C -->|Tool-call turn| I[Retain reasoning] C -->|Non-tool turn| J[Omit reasoning] ``` </a> </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fdeepseek-cache-stable-history%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fdeepseek-cache-stable-history%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fproviders%2Fdeepseek%2Fcompat.py%3A146%0A**Empty%20Assistant%20Content%20Reaches%20Wire**%0A%0AWhen%20an%20assistant%20turn%20contains%20only%20%60redacted_thinking%60%2C%20filtering%20removes%20every%20block%20and%20replaces%20the%20list%20with%20%60%22%22%60.%20Revalidation%20then%20takes%20the%20string-content%20path%20and%20bypasses%20the%20converter's%20existing%20%60%22%20%22%60%20fallback%2C%20so%20DeepSeek%20can%20reject%20the%20continued%20conversation%20as%20an%20empty%20assistant%20message.%0A%0A%60%60%60suggestion%0A%20%20%20%20%20%20%20%20new_msg%5B%22content%22%5D%20%3D%20filtered%20or%20%22%20%22%0A%60%60%60%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1126&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Preserve DeepSeek prompt cache prefixes"](https://github.com/alishahryar1/free-claude-code/commit/b07ecf28a193e9cff1624e4ef75f38344a146d49) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44440120)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
f0b31065ee |
Preserve mid-conversation system messages through provider conversion (#1125)
## Problem FCC hoisted inline Anthropic `system` messages into the top-level system prompt during request validation. Mid-conversation system messages are position-sensitive, so this applied later instructions retroactively, changed the existing prompt/cache prefix, and prevented provider conversion from seeing the original transcript. ## Changes - Preserve inline `system` messages, content, metadata, and ordering in Messages and token-count requests while keeping the top-level system prompt distinct. - Convert text-only inline system messages to OpenAI Chat `system` messages at the same transcript position; reject unrepresentable inline blocks before streaming instead of silently dropping them. - Remove the lossy normalization path and its unused role enum, and document protocol-model versus target-conversion ownership in `ARCHITECTURE.md`. - Cover API routing, model serialization, cache-prefix stability, text blocks, tool-result ordering, invalid content, and token counting; bump the package to `4.6.2`. - Verify all five local CI checks (2,287 tests) and the ordered transcript against NVIDIA NIM, OpenRouter, Gemini, DeepSeek, Mistral, and Hugging Face. <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR preserves inline Anthropic system messages through provider conversion. The main changes are: - Keeps top-level and inline system content separate and ordered. - Converts text-only inline system messages without moving them. - Rejects system blocks that OpenAI Chat cannot represent safely. - Updates request detection to ignore system context when counting user turns. - Adds serialization, routing, token-counting, and conversion coverage. - Updates the package version and architecture documentation. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. The leading-system detection path ignores system entries when counting user turns. Inline system content remains ordered for provider conversion. Unsupported system blocks fail explicitly instead of being dropped. No blocking issues were found in the changed code. No files require attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Validated that the transcript roles now follow the order user, assistant, system, user and that the top-level prompt remains separate. - Verified that inline system content is no longer counted in message tokens and that cache\_control metadata survives parsing. - Confirmed that the converted OpenAI transcript preserves position and cache prefix. - Observed that a system message following a tool result is converted as assistant, tool, system. - Ran the focused pytest and confirmed 209 passed in 2.82s with exit code 0. <a href="https://app.greptile.com/trex/runs/14526513/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/core/anthropic/models.py | Preserves system-role messages in the original transcript instead of hoisting them into the top-level prompt. | | src/free_claude_code/core/anthropic/conversion.py | Converts ordered text-only system messages and rejects unsupported system content before streaming. | | src/free_claude_code/api/detection.py | Builds a read-only semantic view of system context and conversational user turns for local request detection. | </details> <sub>Reviews (2): Last reviewed commit: ["Restore optimizations with inline system..."](https://github.com/alishahryar1/free-claude-code/commit/6605ede7f604053381552106489dbd16bcd37987) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44423885)</sub> <!-- /greptile_comment --> |
||
|
|
3f39937ec9 |
Validate FCC versions in bug reports (#1124)
## Problem Bug reports can satisfy the required FCC version field with ambiguous values such as `latest`, preventing reliable reproduction and regression analysis. ## Changes | Before | After | | --- | --- | | The form accepted any non-empty FCC version text. | The form requests only an `x.y.z` version or `None`. | | Invalid values required manual maintainer follow-up. | A dedicated workflow labels invalid reports and posts one correction prompt. | | Corrected reports retained manual triage state. | Editing the issue reruns validation and removes the workflow-owned label when valid. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR validates FCC versions supplied through the bug-report form. The main changes are: - Requests an exact `x.y.z` version or `None`. - Validates bug reports when opened or edited. - Adds and removes workflow-owned triage state. - Adds contract tests for parsing and workflow behavior. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex captured the initial state showing there was no version triage before capture. - After capture, the latest state showed a needs-fcc-version label added and one marked comment. - Repeat delivery then listed only comments. - In the 4.6.1 case, the needs-fcc-version label was removed. - With the None input, no API calls were made. <a href="https://app.greptile.com/trex/runs/14521311/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | .github/ISSUE_TEMPLATE/bug-report.yml | Updates the FCC version instructions and placeholder to require an exact version or `None`. | | .github/workflows/validate-bug-report-version.yml | Adds exact version validation with per-issue concurrency, idempotent comments, and label reconciliation after edits. | | tests/contracts/test_issue_form_version_validation.py | Adds contract coverage for form text, accepted and rejected values, field extraction, and triage operations. | </details> <sub>Reviews (1): Last reviewed commit: ["Validate FCC versions in bug reports"](https://github.com/alishahryar1/free-claude-code/commit/388fe8515d61bdd47bc6ee9e1c9034222940c3bf) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44414967)</sub> <!-- /greptile_comment --> |
||
|
|
a092455b54 |
Add searchable model selection to the Admin UI (#1121)
## Problem Admin model routing fields required users to construct provider-prefixed model slugs. Optional tier overrides represented inheritance as an unexplained blank value. ## Changes | Before | After | | --- | --- | | Model inputs only gained suggestions after an individual provider refresh. | Model inputs load configured and discovered canonical slugs from one Admin catalog. | | Model routing looked like unrestricted text entry. | Model routing uses the browser's searchable model dropdown while retaining manual entry. | | Tier overrides displayed an empty value for fallback routing. | Tier overrides display **None** and persist it as an unset override. | | Model refresh returned provider-shaped cache internals. | Model refresh returns the same canonical catalog consumed by the Admin UI. | | Users inferred the provider/model slug format from examples. | The Admin UI and README define and present complete provider/model slugs. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds searchable model selection to the Admin UI. The main changes are: - Adds a canonical catalog of configured and discovered model slugs. - Adds searchable model inputs while preserving manual entry. - Represents unset tier overrides as **None**. - Reports provider-specific model refresh failures. - Reconciles cached models when provider settings change. - Updates documentation, package metadata, and tests. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. Catalog failures no longer stop the rest of the Admin UI from loading. Partial provider refreshes now produce a visible warning. Removed credential-backed providers are pruned from the shared cache, and later stale writes are rejected. No blocking issues remain in the changed code. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex ran the requested verification for the pull request checks. - The verification completed, but local artifact references were not uploaded. <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/api/admin_static/admin.js | Adds searchable model fields, optional catalog hydration, refresh warnings, and None-to-unset conversion. | | src/free_claude_code/api/admin_routes.py | Adds canonical model catalog endpoints and provider refresh failure metadata. | | src/free_claude_code/providers/runtime/discovery.py | Tracks provider refresh outcomes and separates cache eligibility from discovery eligibility. | | src/free_claude_code/providers/runtime/model_cache.py | Scopes cached model metadata to currently available providers and removes stale remote entries. | | src/free_claude_code/runtime/provider_manager.py | Reconciles cache scope during runtime replacement and returns explicit refresh results. | </details> <sub>Reviews (2): Last reviewed commit: ["Fix model catalog refresh lifecycle"](https://github.com/alishahryar1/free-claude-code/commit/d16e170055f5389e538e18dece269a5f7a8c599d) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44373795)</sub> <!-- /greptile_comment --> |
||
|
|
343e5674bf |
Restore Claude model discovery without enabling telemetry (#1118)
## Problem Claude Code's aggregate nonessential-traffic flag overrides gateway discovery, so `fcc-claude` never requests `/v1/models` and `/model` omits FCC models. Deleting the flag alone also re-enables updater, feedback, error-reporting, and telemetry traffic. Fixes #1112. ## Changes | Before | After | | --- | --- | | FCC forced the aggregate traffic flag, which suppressed gateway model discovery. | The shared Claude environment removes inherited aggregate flags and enables gateway discovery. | | Removing the aggregate flag would restore every optional traffic category. | Four granular opt-outs preserve the existing updater, feedback, error-reporting, and telemetry policy. | | VS Code and JetBrains examples documented the discovery-blocking flag. | Both IDE examples use the same granular environment policy as `fcc-claude`. | | The retry smoke counted locally short-circuited auxiliary requests as provider retries. | The retry smoke counts terminal failures and still requires exactly one upstream provider attempt. | | Package metadata reported version 4.5.1. | Package metadata and the lockfile report version 4.5.2. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR restores Claude gateway model discovery while keeping most optional Claude traffic disabled. The main changes are: - Replaces the aggregate Claude traffic flag with granular opt-out environment variables. - Updates VS Code and JetBrains setup examples to match the new environment policy. - Adds smoke coverage for `/v1/models` discovery through the local gateway. - Adjusts the provider-error smoke retry count. - Bumps package metadata and the lockfile to 4.5.2. </details> <h3>Confidence Score: 4/5</h3> The Claude environment policy has one contained traffic-control regression. Gateway discovery is enabled through the changed launch environment, and package version sources are consistent. src/free_claude_code/cli/claude_env.py and README.md need the granular opt-out set checked because it does not cover feedback-survey traffic that the removed aggregate flag previously blocked. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Reproduced the Feedback Survey Traffic Reenabled scenario by running a focused Python repro harness that imports build\_claude\_proxy\_env with CLAUDE\_CODE\_DISABLE\_NONESSENTIAL\_TRAFFIC in the base environment. - Used the repro harness to verify that CLAUDE\_CODE\_ENABLE\_GATEWAY\_MODEL\_DISCOVERY is set to '1' and the four granular opt-outs are '1', while CLAUDE\_CODE\_DISABLE\_NONESSENTIAL\_TRAFFIC is removed and CLAUDE\_CODE\_DISABLE\_FEEDBACK\_SURVEY is absent. - Observed in the repro command output that the aggregate traffic flag was stripped and the feedback-survey opt-out was absent, confirming the expected environment state. - Performed broader contract validation: the env policy harness shows the expected proxy/managed env state with aggregate flag absent and gateway model discovery enabled, the targeted CLI tests total 96 with exit code 0, and the CLAUDE CLI is unavailable in this environment (exit code 127). <a href="https://app.greptile.com/trex/runs/14470129/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/claude_env.py | Builds the Claude child environment with gateway discovery and granular traffic opt-outs, but misses the feedback-survey opt-out. | | README.md | Updates IDE examples to use the same granular Claude environment policy as the runtime helper. | | smoke/prereq/test_cli_prereq_live.py | Adds a live assertion that Claude discovers models through the local gateway. | | smoke/product/test_client_product_live.py | Counts terminal failed downstream message requests while preserving the provider-attempt assertion. | | pyproject.toml | Bumps the project version to 4.5.2. | | uv.lock | Updates the locked editable package version to 4.5.2. | </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Frestore-claude-model-discovery%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Frestore-claude-model-discovery%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fcli%2Fclaude_env.py%3A30-33%0A**Feedback%20Survey%20Traffic%20Reenabled**%0A%0AWhen%20%60fcc-claude%60%20or%20a%20managed%20Claude%20task%20is%20launched%20through%20this%20helper%2C%20the%20old%20aggregate%20opt-out%20no%20longer%20suppresses%20Claude's%20session%20feedback%20survey%20path.%20The%20replacement%20only%20disables%20updater%2C%20feedback%20command%2C%20error%20reporting%2C%20and%20telemetry%2C%20so%20restricted-network%20or%20privacy-controlled%20runs%20can%20still%20show%20or%20send%20nonessential%20feedback-survey%20traffic%20that%20was%20previously%20blocked.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1118&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Restore Claude gateway model discovery"](https://github.com/alishahryar1/free-claude-code/commit/03e915adfb6f49d96e492e4659c3e00a3f7b12dc) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44306473)</sub> > Greptile also left **1 inline comment** on this PR. **Context used:** - Context used - CLAUDE.md ([source](https://app.greptile.com/alishahryar1/github/Alishahryar1/free-claude-code/-/custom-context?memory=d2fd24d8-0dec-4faf-8ee4-e085e215a2f8)) <!-- /greptile_comment --> |
||
|
|
abaee5bd38 |
Fix messaging task launch on uvloop (#1117)
## Problem uvloop 0.22.1 rejects the Python 3.14-only `eager_start` task keyword, so every Telegram and Discord message fails on Unix. Removing the keyword alone would let eager task factories execute claims before FCC publishes task ownership. Fixes #1108 and fixes #1115. ## Changes | Before | After | | --- | --- | | Claim tasks depend on `eager_start=False`, which uvloop does not accept. | Claim tasks use the portable event-loop contract behind an explicit ownership gate. | | Task execution ordering depends on event-loop keyword support. | Task execution begins only after FCC attaches the task and completion callback. | | Regression coverage exercises native asyncio only. | Regression coverage exercises a restricted task contract, eager task factories, and real uvloop. | | The package version is 4.5.0. | The package version is 4.5.1 with a refreshed lockfile. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR fixes messaging claim launch on event loops that reject Python-specific task keywords. The main changes are: - Removes `eager_start=False` from claim task creation. - Adds an explicit ownership gate before claim processing starts. - Adds tests for portable task creation, eager task factories, and uvloop. - Bumps the package version and lockfile entry to `4.5.1`. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge after a small test hardening cleanup. The runtime task ownership change preserves the intended launch ordering, and no blocking issues were found in the changed runtime code. tests/messaging/test_tree_ownership_concurrency.py needs a small hardening update so the uvloop case skips cleanly when the optional package is absent. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex executed the messaging ownership regression pytest suite to capture runtime proof for the messaging concurrency changes. - During the run, the first shell wrapper used PIPESTATUS\[0\] under /bin/sh, producing a harmless Bad substitution during version evidence collection. - The pytest command was rerun after the substitution issue, and the run completed with EXIT\_CODE: 0. - The regression suite provides focused runtime evidence for the messaging concurrency behavior, avoiding unrelated suites or external services. <a href="https://app.greptile.com/trex/runs/14465005/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/messaging/trees/processor.py | Replaces the uvloop-incompatible task keyword with an ownership event that opens after task registration. | | tests/messaging/test_tree_ownership_concurrency.py | Adds task-launch tests, with one uvloop test that can fail instead of skip when uvloop is absent. | | pyproject.toml | Bumps the package version to `4.5.1`. | | uv.lock | Updates the editable package version to match `pyproject.toml`. | </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Ffix-messaging-event-loop-compatibility%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Ffix-messaging-event-loop-compatibility%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Atests%2Fmessaging%2Ftest_tree_ownership_concurrency.py%3A485%0A**Optional%20Uvloop%20Becomes%20Required**%0A%0AWhen%20tests%20run%20on%20Linux%20or%20macOS%20without%20the%20optional%20%60uvloop%60%20package%20installed%2C%20this%20import%20raises%20%60ModuleNotFoundError%60%20instead%20of%20skipping%20the%20uvloop-only%20case.%20A%20contributor%20or%20CI%20job%20that%20installs%20only%20the%20test%20dependencies%20can%20fail%20this%20test%20even%20though%20the%20platform%20skip%20condition%20passes.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1117&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Fix messaging task launch on uvloop"](https://github.com/alishahryar1/free-claude-code/commit/180a7255df0a43a20706cdde2f1cd2d6830921d7) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44296382)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
b1877a4b21 |
Add Ollama Cloud as a first-class provider (#1106)
## Problem FCC supports Ollama only through a local daemon, so users cannot authenticate directly to Ollama Cloud or discover its hosted models from the Admin UI. Ollama's OpenAI-compatible API also uses the standard `reasoning` field instead of `reasoning_content`, which would otherwise drop thinking output and tool-history reasoning. ## Changes | Before | After | | --- | --- | | `ollama/...` requires a local Ollama server. | `ollama_cloud/...` connects directly to `https://ollama.com/v1` with `OLLAMA_API_KEY`, while local Ollama remains unchanged. | | OpenAI-chat reasoning was hard-coded to `reasoning_content`. | Provider profiles declare their reasoning field, so Ollama streams and replays `reasoning` without a specialized transport. | | Ollama Cloud was absent from configuration, model discovery, docs, and smoke coverage. | The catalog, Admin UI, proxy setting, model picker, README, smoke matrix, and `4.5.0` release metadata expose the provider consistently. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Ollama Cloud as a separate OpenAI-compatible provider. The main changes are: - New `ollama_cloud` catalog entry, settings, admin fields, proxy setting, and smoke configuration. - Provider profiles now choose the streamed and replayed reasoning field per provider. - Ollama Cloud uses `reasoning` and `reasoning_effort`, while local Ollama stays on its separate local configuration. - Streaming recovery now respects the resolved thinking setting when collecting reasoning. - Tests, docs, environment examples, and release metadata were updated for the new provider. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. No files need attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the provider/runtime/converter/streaming tests with full verbose pytest output and confirmed EXIT\_CODE: 0. - Ran the config/catalog/contracts/admin tests with full verbose pytest output and confirmed EXIT\_CODE: 0. - Generated and ran an introspection script to verify catalog, profile, settings, and admin manifest values without external API calls, and recorded the local execution output. <a href="https://app.greptile.com/trex/runs/14367965/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/providers/openai_chat/profiles.py | Adds provider-level reasoning field selection and the Ollama Cloud profile. | | src/free_claude_code/providers/openai_chat/provider.py | Uses the profile reasoning field for streaming and passes the thinking setting into recovery. | | src/free_claude_code/providers/openai_chat/request_policy.py | Selects reasoning replay mode from the provider policy only when thinking is enabled. | | src/free_claude_code/core/anthropic/conversion.py | Supports replaying assistant reasoning through either `reasoning_content` or `reasoning`. | | src/free_claude_code/config/provider_catalog.py | Registers Ollama Cloud as a remote provider distinct from local Ollama. | | src/free_claude_code/config/settings.py | Adds the Ollama Cloud API key and proxy settings. | </details> <sub>Reviews (3): Last reviewed commit: ["Keep local Ollama wire behavior unchange..."](https://github.com/alishahryar1/free-claude-code/commit/d6f97cdb0074a4cbda140d484fb6dd679a1406df) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44089262)</sub> <!-- /greptile_comment --> |
||
|
|
6476595595 |
Capture selected models in bug reports (#1105)
## Problem Bug reports can include tier mappings and providers but not the model selected directly through a client picker. ## Changes | Before | After | | --- | --- | | Bug reports captured optional model mappings and providers. | Bug reports also capture optional selected model values exactly as shown by the client. | | The minimum bug report required FCC version and issue details. | The minimum bug report still requires only FCC version and issue details. | |
||
|
|
51e43aaa3c |
Add structured bug and feature issue forms (#1103)
## Problem New issues currently open as unstructured blank reports, so maintainers may not receive the FCC version or relevant runtime context. Sensitive vulnerability reports also lacked a private route. ## Changes | Before | After | | --- | --- | | Contributors opened blank issues. | Contributors choose a bug report or feature request form. | | Bug reports had no required diagnostic fields. | Bug reports require the FCC version and issue description, with optional CLI, model mapping, and provider context. | | Failed installations could not report an FCC version. | Failed installations can enter `not installed` while keeping the version field required. | | Feature requests had no focused structure. | Feature requests ask only what should change and why. | | Security reports had no private route. | The chooser links to enabled GitHub private vulnerability reporting. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds structured GitHub issue reporting for the repository. The main changes are: - A bug report form with required FCC version and issue fields. - Optional bug context for CLI, model mappings, and providers. - A feature request form with required what and why fields. - Issue chooser configuration that disables blank issues and adds a security contact link. </details> <h3>Confidence Score: 4/5</h3> The security reporting path can still be unavailable when the repository setting for private vulnerability reports is off. The bug and feature forms are valid issue forms, and the installer reporting case now has a clear `not installed` value. The security link needs a reachable fallback or a repository setting guarantee. .github/ISSUE_TEMPLATE/config.yml <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the advisory link verification against the issue template config and reproduced that the advisory URL requires authentication, blocking unauthenticated reporters. - Captured a verbose HTTP trace showing a 302 redirect from the advisory URL to the login page and a 200 response for the login page, confirming unauthenticated access is blocked. - The executable validation script trex-artifacts/issue\_template\_validation.py was generated and is ready to run. - The validation run log trex-artifacts/issue\_template\_validation\_after.log was captured, showing parsed field summaries and that VALIDATION RESULT: PASS with EXIT\_CODE: 0. <a href="https://app.greptile.com/trex/runs/14362318/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | .github/ISSUE_TEMPLATE/bug-report.yml | Adds a bug report form with required version and issue fields plus optional runtime context. | | .github/ISSUE_TEMPLATE/config.yml | Disables blank issues and adds a security advisory contact link. | | .github/ISSUE_TEMPLATE/feature-request.yml | Adds a feature request form with required what and why prompts. | </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fadd-issue-forms%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fadd-issue-forms%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0A.github%2FISSUE_TEMPLATE%2Fconfig.yml%3A4%0A**Advisory%20Link%20Can%20404**%0A%0AWhen%20private%20vulnerability%20reporting%20is%20not%20enabled%20for%20the%20repository%2C%20this%20advisory%20URL%20returns%20a%20404.%20With%20blank%20issues%20disabled%20and%20no%20fallback%20disclosure%20path%20in%20the%20repo%2C%20a%20credential%20leak%20or%20auth%20report%20can%20still%20be%20abandoned%20or%20filed%20through%20a%20public%20issue%20form.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1103&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (2): Last reviewed commit: ["Add private security reporting route"](https://github.com/alishahryar1/free-claude-code/commit/e59304262c452279e51118a14007f1a5e144b052) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44079735)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
eb1b688c8c |
Default messaging sessions to Fable (#1100)
## Problem Discord and Telegram sessions remained pinned to Opus after Fable became a first-class routing tier. ## Changes | Before | After | | --- | --- | | Managed messaging launched Claude Code with `--model opus`. | Managed messaging launches Claude Code with `--model fable`. | | Phone sessions selected `MODEL_OPUS` or the `MODEL` fallback. | Phone sessions select `MODEL_FABLE` or the `MODEL` fallback. | | The architecture documented the Opus pin. | The architecture documents the Fable pin. | | FCC reported version `4.4.0`. | FCC reports version `4.4.1`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR changes managed messaging sessions to use the Fable tier by default. The main changes are: - Managed Claude Code invocations now pass `--model fable`. - Managed messaging documentation now points to `MODEL_FABLE` and the `MODEL` fallback. - Tests now assert the managed tier default is `fable`. - The package version is bumped from `4.4.0` to `4.4.1` in both project metadata and the lockfile. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. No files need attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Validated that the focused PyTest run for Claude Fable version completed with EXIT\_CODE: 0, confirming the validation command produced a successful result. - Verified that the pytest node collection for the same validation scope finished with EXIT\_CODE: 0, confirming all intended tests were discovered. <a href="https://app.greptile.com/trex/runs/14345687/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/managed/claude.py | Changes the managed Claude model tier constant from `opus` to `fable`. | | tests/cli/test_managed_claude.py | Adds coverage for the new managed tier default. | | ARCHITECTURE.md | Updates the managed messaging architecture notes for Fable routing. | | pyproject.toml | Bumps the package version to `4.4.1`. | | uv.lock | Updates the locked editable package version to `4.4.1`. | </details> <sub>Reviews (1): Last reviewed commit: ["Default messaging sessions to Fable"](https://github.com/alishahryar1/free-claude-code/commit/08772b5c9a8f2bba91eddb1f9599eef043bb4557) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=44041521)</sub> <!-- /greptile_comment --> |
||
|
|
4f56a6aa17 |
Add Fable as a first-class Claude routing tier (#1099)
## Problem Claude Code now sends `claude-fable-5` for the Fable alias, but FCC treated it as an unrecognized model and collapsed it into the global fallback route. Users could not map Fable traffic or reasoning behavior independently. Fixes #1097. ## Changes | Before | After | | --- | --- | | Fable requests inherited `MODEL` and `ENABLE_MODEL_THINKING`. | Fable requests use `MODEL_FABLE` and `ENABLE_FABLE_THINKING` when configured, otherwise inherit the existing defaults. | | `/v1/models` omitted Claude Fable 5. | `/v1/models` advertises the canonical `claude-fable-5` identifier. | | Admin, documentation, validation, and smoke contracts described three Claude tiers. | Admin, documentation, validation, and smoke contracts describe Fable alongside Opus, Sonnet, and Haiku. | | The package version was `4.3.1`. | The package version is `4.4.0`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Fable as a Claude routing tier. The main changes are: - `MODEL_FABLE` and `ENABLE_FABLE_THINKING` settings. - Fable routing and thinking resolution in `ModelRouter`. - `claude-fable-5` in the model catalog. - Admin, docs, smoke, and test coverage updates. - Package version bump to `4.4.0`. </details> <h3>Confidence Score: 4/5</h3> The changed routing path needs a fix for direct provider model ids containing `fable`. Fable settings, validation, admin fields, and model listing are consistent with the existing tier patterns. Blank Fable settings inherit the existing defaults. Direct provider model ids can receive the Fable thinking override when their model name contains `fable`. src/free_claude_code/application/routing.py <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Reproduced the Fable thinking overmatch by running a focused Python repro that disables global thinking and enables Fable thinking, then resolves sambanova/my-fable-ensemble-v2. - The repro confirmed direct routing preserved provider\_id=sambanova, provider\_model=my-fable-ensemble-v2, and provider\_model\_ref=sambanova/my-fable-ensemble-v2, with resolved\_thinking\_enabled and thinking\_enabled both true. - Ran the fable-tier validation pytest, which finished with exit code 0 and 177 tests passed. - Ran the runtime probe to exercise the API model list, Settings env parsing, and ModelRouter paths, and observed a 200 OK on GET /v1/models, with the catalog item id claude-fable-5 and the expected Fable vs global-default routing behavior. - Generated the probe source file used to exercise the API and Settings paths, enabling repeatable validation without real provider credentials. <a href="https://app.greptile.com/trex/runs/14275379/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/application/routing.py | Adds Fable model and thinking branches; the thinking branch can also match unrelated direct provider model ids containing `fable`. | | src/free_claude_code/config/settings.py | Adds optional Fable model and thinking settings with blank-env inheritance and provider/model validation. | | src/free_claude_code/config/model_refs.py | Includes Fable in configured chat model reference collection and dedupe. | | src/free_claude_code/config/admin/manifest.py | Adds Fable model and thinking controls to the admin manifest. | | src/free_claude_code/api/model_catalog.py | Adds `claude-fable-5` to the advertised Claude model aliases. | | pyproject.toml | Bumps the package version to `4.4.0`. | | uv.lock | Updates the editable package version to match `pyproject.toml`. | </details> <details open><summary><h3>Flowchart</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% flowchart TD A[Incoming model name] --> B{Direct provider or gateway id?} B -- yes --> C[Use provider/model directly] C --> D[Resolve thinking from provider model string] B -- no --> E{Claude tier match} E -- Fable --> F[MODEL_FABLE or MODEL] E -- Opus/Sonnet/Haiku --> G[Tier override or MODEL] E -- None --> H[MODEL] D --> I[Provider request] F --> I G --> I H --> I ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% flowchart TD A[Incoming model name] --> B{Direct provider or gateway id?} B -- yes --> C[Use provider/model directly] C --> D[Resolve thinking from provider model string] B -- no --> E{Claude tier match} E -- Fable --> F[MODEL_FABLE or MODEL] E -- Opus/Sonnet/Haiku --> G[Tier override or MODEL] E -- None --> H[MODEL] D --> I[Provider request] F --> I G --> I H --> I ``` </a> </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fadd-fable-routing-tier%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fadd-fable-routing-tier%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fapplication%2Frouting.py%3A134-135%0A**Fable%20Thinking%20Overmatches%20Models**%0A%0AWhen%20a%20direct%20provider%20request%20uses%20a%20model%20id%20like%20%60sambanova%2Fmy-fable-ensemble-v2%60%2C%20the%20direct%20route%20bypasses%20tier%20remapping%20but%20still%20calls%20%60_resolve_thinking%28%29%60%20with%20the%20provider%20model%20string.%20With%20%60ENABLE_FABLE_THINKING%60%20set%2C%20this%20substring%20check%20applies%20Fable%20thinking%20behavior%20to%20an%20unrelated%20provider%20model%2C%20changing%20the%20outgoing%20request%20shape%20just%20because%20the%20model%20id%20contains%20%60fable%60.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1099&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Add Fable as a first-class routing tier"](https://github.com/alishahryar1/free-claude-code/commit/0705840c65511fd85c74fd2c62ba8ea97afe7c12) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43892323)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
984c4c23b7 |
Fix Auto Mode classifier responses when stream is omitted (#1098)
## Problem Claude Code Auto Mode classifier requests omit `stream`, which means they expect a non-streaming Messages response. FCC treated omission as streaming, returned SSE, and caused Claude to report the classifier model as temporarily unavailable. Fixes #1094. ## Changes | Before | After | | --- | --- | | Omitted `stream` defaulted to streaming SSE. | Omitted `stream` defaults to a complete JSON Message; only `stream: true` selects SSE. | | Classifier side queries received a body without top-level `usage`. | Classifier side queries receive a JSON Message with top-level `usage` while thinking remains disabled. | | Tests encoded FCC's nonstandard streaming default. | Model and HTTP-boundary tests enforce Anthropic's response-mode contract. | | The package version was 4.3.0. | The package version is 4.3.1. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR fixes Messages response mode handling when clients omit `stream`. The main changes are: - Defaulted Anthropic Messages requests to non-streaming JSON. - Returned SSE only when `stream: true` is set. - Updated classifier, handler, web-tool, and model tests for the new contract. - Documented the default response mode and bumped the package version. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge after deciding whether `stream: null` should remain accepted. The JSON-by-default Messages path is covered in the model, handler, and API tests. Explicit streaming still flows through the SSE path. Clients that send `stream: null` can now get a validation error instead of a response. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the full test suite for the code under test; pytest completed with 132 tests passed in 2.96s and exited with code 0. - Validated the testclient probe non-stream request returned 200 OK with a JSON message. - Validated the testclient probe stream request returned 200 OK with a text/event-stream SSE and routing/behaviors as expected (routed\_stream true, thinking\_enabled\_kwarg false). <a href="https://app.greptile.com/trex/runs/14257681/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/core/anthropic/models.py | Changes `MessagesRequest.stream` to default to non-streaming JSON and reject null values. | | src/free_claude_code/api/handlers/messages.py | Aggregates internal SSE into JSON unless streaming was explicitly requested. | | src/free_claude_code/api/routes.py | Updates the Messages route description to match the new JSON-by-default behavior. | | src/free_claude_code/core/anthropic/sse_aggregation.py | Updates aggregation documentation for omitted and false stream requests. | | tests/api/test_api.py | Adds coverage for classifier-style requests that omit `stream` and expect JSON. | | tests/api/test_api_handlers.py | Marks streaming handler tests with explicit `stream=True`. | | tests/api/test_web_server_tools.py | Marks the forced web-search streaming test with explicit `stream=True`. | | tests/core/anthropic/test_models.py | Updates model expectations for the new default and adds null-stream rejection coverage. | | pyproject.toml | Bumps the package version to `4.3.1`. | | uv.lock | Keeps the editable package version in sync with `pyproject.toml`. | | ARCHITECTURE.md | Documents that Messages responses are non-streaming unless `stream: true` is provided. | </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Ffix-auto-mode-omitted-stream%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Ffix-auto-mode-omitted-stream%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fcore%2Fanthropic%2Fmodels.py%3A186%0A**Null%20Stream%20Now%20Fails%20Validation**%0A%0AWhen%20a%20client%20serializes%20an%20unspecified%20optional%20stream%20flag%20as%20%60%22stream%22%3A%20null%60%2C%20this%20narrowed%20field%20rejects%20the%20request%20before%20the%20handler%20can%20return%20the%20new%20non-streaming%20JSON%20response.%20The%20old%20model%20accepted%20that%20input%2C%20so%20these%20clients%20now%20receive%20a%20validation%20error%20instead%20of%20a%20Message%20object.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1098&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Fix omitted Messages stream default"](https://github.com/alishahryar1/free-claude-code/commit/ca61e5ad4adf085d5cef1e0e5f3a8ae26d189853) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43859149)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
0d5bec3dcd |
Make proxy authentication bearer-only across every client (#1096)
## Problem Proxy authentication selected the first of three credential headers, so a stale `X-API-Key` could mask valid bearer authorization and leave Claude CLI or IDE clients at their login gate. Fixes #902. ## Changes | Before | After | | --- | --- | | FCC accepted three proxy credential headers and stripped legacy model suffixes. | FCC accepts one exact `Authorization: Bearer` token without mutation. | | Conflicting provider credentials could override valid proxy authorization. | Unrelated credential headers are ignored during proxy authentication. | | Codex catalog discovery and Pi catalog or inference paths used API-key authentication. | Every FCC-owned Codex and Pi path uses bearer authorization. | | Authentication failures referred ambiguously to an API key. | Authentication failures identify the proxy authentication token. | | FCC reported version `4.2.0`. | FCC reports version `4.3.0`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR makes proxy authentication use bearer tokens only. The main changes are: - Replaced multi-header proxy auth with exact `Authorization: Bearer <token>` checks. - Updated protected route dependencies to use the renamed auth dependency. - Switched FCC-owned Codex and Pi catalog requests to bearer authorization. - Added Pi provider `authHeader` registration for inference requests. - Updated smoke tests, API tests, docs, examples, and package metadata for the new auth contract. </details> <h3>Confidence Score: 4/5</h3> The changed auth flow is mostly consistent, but Codex inference can still fail if its generated provider config sends API-key auth. Server-side bearer parsing is direct and covered by updated tests. Route protection appears preserved after the dependency rename. Codex catalog auth was updated, but the inference path still depends on external client header behavior. The version bump may understate a breaking auth-contract change. src/free_claude_code/api/dependencies.py, src/free_claude_code/cli/launchers/codex.py, pyproject.toml <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex executed targeted proxy authentication validation to verify bearer token behavior before and after the change. - T-Rex compared pre-change and post-change test results, confirming 31 passed before and 39 passed after, and validating HTTP 200 for exact bearer with unrelated X-API-Key plus HTTP 401 for missing or invalid tokens. <a href="https://app.greptile.com/trex/runs/14225355/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/api/dependencies.py | Replaces proxy authentication with exact bearer-token validation and new error details. | | src/free_claude_code/api/routes.py | Updates protected route dependencies to call the renamed auth dependency. | | src/free_claude_code/cli/launchers/codex.py | Changes Codex catalog discovery to send bearer auth while leaving inference auth delegated through Codex config. | | src/free_claude_code/cli/launchers/pi_extension.ts | Changes Pi catalog discovery to bearer auth and registers the provider with `authHeader` enabled. | | smoke/lib/config.py | Updates smoke helper auth headers to emit bearer authorization. | | pyproject.toml | Bumps the package version from 4.2.0 to 4.3.0. | </details> <details open><summary><h3>Sequence Diagram</h3></summary> <a href="#gh-light-mode-only"> ```mermaid %%{init: {'theme': 'neutral'}}%% sequenceDiagram participant Codex participant Launcher as FCC Codex launcher participant API as FCC API Launcher->>API: GET /v1/models with Authorization Bearer token API-->>Launcher: Catalog response Launcher-->>Codex: Raw token in FCC_CODEX_API_KEY Codex->>API: POST /v1/responses with client-built auth alt Client sends bearer authorization API-->>Codex: Accepted else Client sends API-key auth API-->>Codex: 401 proxy auth failure end ``` </a> <a href="#gh-dark-mode-only"> ```mermaid %%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant Codex participant Launcher as FCC Codex launcher participant API as FCC API Launcher->>API: GET /v1/models with Authorization Bearer token API-->>Launcher: Catalog response Launcher-->>Codex: Raw token in FCC_CODEX_API_KEY Codex->>API: POST /v1/responses with client-built auth alt Client sends bearer authorization API-->>Codex: Accepted else Client sends API-key auth API-->>Codex: 401 proxy auth failure end ``` </a> </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Fcanonical-proxy-bearer-auth%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Fcanonical-proxy-bearer-auth%22.%0A%0AFix%20the%20following%202%20code%20review%20issues.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%202%0Asrc%2Ffree_claude_code%2Fapi%2Fdependencies.py%3A56%0A**Codex%20Inference%20Still%20Delegates%20Auth**%0A%0AWhen%20Codex%20launches%2C%20FCC%20now%20sends%20bearer%20auth%20only%20for%20its%20own%20%60%2Fv1%2Fmodels%60%20catalog%20request%2C%20but%20inference%20still%20depends%20on%20Codex%20turning%20the%20raw%20%60FCC_CODEX_API_KEY%60%20value%20into%20the%20same%20bearer%20header.%20If%20Codex%20sends%20that%20env%20key%20as%20an%20API-key%20header%2C%20this%20server%20branch%20treats%20the%20request%20as%20missing%20proxy%20auth%20and%20%60%2Fv1%2Fresponses%60%20fails%20with%20401%20even%20though%20catalog%20discovery%20succeeded.%0A%0A%23%23%23%20Issue%202%20of%202%0Apyproject.toml%3A7%0A**Breaking%20Auth%20Contract%20Understated**%0A%0AThis%20change%20removes%20previously%20accepted%20proxy%20credential%20shapes%2C%20including%20%60X-API-Key%60%2C%20%60anthropic-auth-token%60%2C%20and%20suffixed%20bearer%20tokens%2C%20but%20the%20package%20version%20only%20moves%20from%20%604.2.0%60%20to%20%604.3.0%60.%20Existing%20users%20can%20upgrade%20within%20the%20same%20major%20line%20and%20have%20every%20protected%20endpoint%20start%20returning%20401%20until%20their%20clients%20are%20reconfigured%2C%20which%20does%20not%20match%20the%20repository%20guidance%20for%20incompatible%20API%20or%20CLI%20behavior.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1096&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["fix: make proxy auth bearer-only"](https://github.com/alishahryar1/free-claude-code/commit/c437ee0e23dc8f8411272a8dcfcf1ff69f315857) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43791345)</sub> > Greptile also left **2 inline comments** on this PR. **Context used:** - Context used - CLAUDE.md ([source](https://app.greptile.com/alishahryar1/github/Alishahryar1/free-claude-code/-/custom-context?memory=d2fd24d8-0dec-4faf-8ee4-e085e215a2f8)) <!-- /greptile_comment --> |
||
|
|
d5a7e025b5 |
Fix Codex VS Code proxy authentication (#1095)
## Problem The Codex VS Code guide configured `FCC_CODEX_API_KEY` as an environment variable but stored it in `auth.json`, which Codex does not use for custom-provider environment keys. IDE sessions therefore failed with a missing-variable error. Fixes #905. ## Changes | Before | After | | --- | --- | | The guide split FCC authentication across `env_key` and an unsupported custom `auth.json` entry. | The guide sends the proxy token through Codex's supported static `X-API-Key` provider header. | | VS Code had to inherit `FCC_CODEX_API_KEY` from its launcher environment. | VS Code reads the complete FCC provider configuration from `config.toml`. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR fixes the Codex VS Code setup guide for proxy authentication. The main changes are: - Replaces the unsupported `auth.json` token step with a provider header in `config.toml`. - Uses `X-API-Key` with the default `freecc` token for the local proxy. - Updates the restart note to point users at the single WSL config file. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues were found in the changed documentation. The documented header matches the proxy authentication path already used by the service. No files need attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Validated the repository README by executing codex\_readme\_validate.py on README.md; the run exited with code 0 and logged the extracted README section, a TOML snippet, and assertions. - Collected installer and client related tests with pytest --collect-only for tests/scripts/test\_installers.py, and the collection run exited with code 0. - Confirmed that no live Codex, VS Code, or provider credential calls were attempted during this validation run. <a href="https://app.greptile.com/trex/runs/14221927/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | README.md | Updates the Codex VS Code authentication instructions to use a static `X-API-Key` provider header instead of an unsupported `auth.json` entry. | </details> <sub>Reviews (1): Last reviewed commit: ["Fix Codex VS Code proxy authentication"](https://github.com/alishahryar1/free-claude-code/commit/6ed20f370fe7beb69445496b05976cb54f4e55cc) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43784097)</sub> <!-- /greptile_comment --> |
||
|
|
1b4c7e6779 |
feat: add vision support for OpenAI chat conversion (#1061)
## Problem FCC rejects Anthropic user image blocks before vision-capable OpenAI-compatible providers can receive them. This blocks pasted images in Claude Code and IDE clients. Fixes #512. ## Changes | Before | After | | --- | --- | | User image blocks fail during Anthropic-to-OpenAI conversion. | Base64 and URL image sources become OpenAI `image_url` parts. | | Mixed text and image input cannot reach an upstream model. | Mixed content preserves exact block order and text-only behavior. | | Invalid image sources require ambiguous downstream handling. | Missing or unsupported source fields fail explicitly before execution. | | Vision support could require flags or proxy-side downloads. | Conversion stays provider-neutral and performs no network I/O. | | The package remains on `4.1.0`. | The package advances to `4.2.0` with a regenerated lockfile. | | Converter coverage rejects every user image. | Tests cover source mapping, ordering, tool boundaries, validation, and request construction. | <!-- greptile_comment --> <h3>Greptile Summary</h3> This PR adds OpenAI-compatible vision conversion for Anthropic image blocks. The main changes are: - Converts base64 image sources into data image URLs. - Converts URL image sources into OpenAI `image_url` parts. - Preserves mixed text and image ordering in user messages. - Rejects unsupported or incomplete image sources. - Updates converter tests for image and tool-result cases. - Bumps package metadata to `4.2.0` in both project and lock files. <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. No files need attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Reviewed the initial focused run and confirmed all tests passed, with the wrapper exit code reported as nonzero and retained for traceability. - Validated the focused rerun completed cleanly with 10 tests passed and exit code 0. - Validated the full converter run completed with 73 tests passed and exit code 0. <a href="https://app.greptile.com/trex/runs/14209442/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <h3>Important Files Changed</h3> | Filename | Overview | |----------|----------| | src/free_claude_code/core/anthropic/conversion.py | Adds ordered image conversion for OpenAI-compatible chat content. | | tests/providers/test_converter.py | Adds tests for image conversion, ordering, validation, and request-body output. | | pyproject.toml | Updates the package version to `4.2.0`. | | uv.lock | Updates the locked local package version to `4.2.0`. | | ARCHITECTURE.md | Documents core image conversion behavior for OpenAI-compatible providers. | | README.md | Mentions image input support across compatible models. | <sub>Reviews (8): Last reviewed commit: ["feat: add vision support for OpenAI chat..."](https://github.com/alishahryar1/free-claude-code/commit/4a6b6de14d19ce22e3be5981f84bb6f236a11181) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43544835)</sub> <!-- /greptile_comment --> |
||
|
|
0c5447c9c3 |
Clarify supported coding agent clients (#1092)
## Problem The README tagline grouped chat bots with the primary coding-agent clients and described editor integrations generically. ## Changes | Before | After | | --- | --- | | The tagline listed Claude Code, Codex, Pi, editor extensions, and chat bots. | The tagline lists Claude Code, Codex, Pi, and their IDE extensions. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR clarifies the README tagline for supported coding-agent clients. The main changes are: - Names Claude Code, Codex, and Pi as the primary clients. - Describes supported editor integrations as those clients' IDE extensions. - Leaves optional Discord and Telegram integration docs unchanged. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed documentation. The optional chat bot integrations remain documented elsewhere in the README. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex ran the requested general contract validation to verify the PR's contract obligations. - T-Rex reported that local artifact references were not uploaded, limiting artifact traceability of the validation. <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | README.md | Updates the tagline wording to focus on the primary supported coding-agent clients and their IDE extensions. | </details> <sub>Reviews (1): Last reviewed commit: ["Update README.md"](https://github.com/alishahryar1/free-claude-code/commit/3a90261bcf0a8b779fe38ad36faeae0c0385e2e2) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43732608)</sub> <!-- /greptile_comment --> |
||
|
|
db9bee1712 |
Expose the Admin startup browser preference (#1091)
## Problem The Admin startup browser preference bypassed FCC's settings system. Managed configuration could not control it, and the Admin UI did not expose it. ## Changes | Before | After | | --- | --- | | The launcher read `FCC_OPEN_BROWSER` directly from the process environment. | The launcher reads the typed `open_admin_browser` setting. | | The startup browser preference was absent from the Admin UI. | Runtime settings expose an **Open Admin on Startup** toggle. | | Managed configuration could not disable browser launch. | Admin changes persist for the next server launch without restarting the running proxy. | | Browser launch defaulted on through launcher fallback logic. | Browser launch defaults on through the canonical Settings and template contract. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR exposes the Admin startup browser preference through the normal settings flow. The main changes are: - Added `FCC_OPEN_BROWSER` as a typed setting with a default of enabled. - Added an Admin runtime toggle for opening the Admin UI on startup. - Updated the launcher to use the typed setting instead of reading the environment directly. - Persisted Admin changes to the managed env file for the next launch. - Clarified the README startup wording. - Bumped the package version to `4.1.0` in project metadata and the lockfile. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. None. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - T-Rex captured the before-change UI state in the /admin Runtime, showing Open Admin on Startup enabled. - T-Rex captured the after-change UI state in the /admin Runtime, showing Open Admin on Startup disabled and the change applied. - T-Rex generated the harness and collected the end-to-end run, including a Playwright video and server/run logs. - T-Rex compiled raw Admin API responses and parsed persistence evidence confirming FCC\_OPEN\_BROWSER=false. <a href="https://app.greptile.com/trex/runs/14197066/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | README.md | Clarifies that browser opening is the default startup behavior and that the Admin URL is logged. | | pyproject.toml | Bumps the project version to `4.1.0` for the new Admin settings feature. | | uv.lock | Updates the editable package version to match `pyproject.toml`. | | src/free_claude_code/cli/entrypoints.py | Routes Admin browser launch through the typed setting and keeps the one-open-per-process guard. | | src/free_claude_code/config/settings.py | Adds the `open_admin_browser` setting backed by `FCC_OPEN_BROWSER`. | | src/free_claude_code/config/admin/manifest.py | Adds the Admin manifest entry for the startup browser toggle. | | tests/api/test_admin.py | Adds coverage for Admin exposure and persistence of the browser toggle. | | tests/cli/test_entrypoints.py | Updates launcher tests for the settings-based browser launch path. | | tests/config/test_config.py | Adds coverage for the default and environment-loaded browser setting. | </details> <sub>Reviews (2): Last reviewed commit: ["Address release and documentation review"](https://github.com/alishahryar1/free-claude-code/commit/9e83287f80fc7268ec7255006409e61ca429753a) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43730287)</sub> <!-- /greptile_comment --> |
||
|
|
db3831d9e7 |
Fix Pi routing for nested FCC model IDs (#1090)
## Problem Pi registered FCC models but rejected the launcher scope because nested provider/model IDs contain an additional slash. Pi then retained a non-FCC model, so prompts did not reach the local proxy. ## Changes | Before | After | | --- | --- | | `free-claude-code/*` matched only one model-ID path segment. | `free-claude-code/**` matches every nested FCC provider/model ID. | | The integration architecture described a single-segment scope. | The integration architecture records the nested routing-reference contract. | | The package version remained 3.6.0. | The package version is released as 4.0.0. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR updates Pi launcher routing so nested FCC model IDs can be scoped. The main changes are: - Pi sessions now pass `free-claude-code/**` as the model scope. - Pi launcher tests now expect the recursive scope string. - Architecture docs now describe nested FCC provider/model routing. - Package metadata and lockfile version move from `3.6.0` to `4.0.0`. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge after confirming Pi accepts the recursive model scope. The changed launcher passes the new scope as a literal subprocess argument, and no blocking issue was found in the repository-visible changed code. The only follow-up is external matcher compatibility for `free-claude-code/**`. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - The Pi launcher configuration was updated to enable recursive scope and to target all models under free-claude-code, as shown by the before and after launcher logs. - The focused Pi tests ran and completed successfully, with 19 passed and 31 deselected, exit code 0. - The Pi test harness initialization registered extensions, preserved and replaced environment variables, enabled recursive scope, and recorded PACKAGE\_VERSION= 4.0.0. - The lint step with ruff ran and passed with exit code 0. <a href="https://app.greptile.com/trex/runs/14193741/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/launchers/pi.py | Changes the Pi model scope from a single-segment pattern to a recursive nested-model pattern. | | tests/cli/test_entrypoints.py | Updates Pi launcher command assertions to expect the new scope string. | | ARCHITECTURE.md | Documents the nested FCC routing-reference contract for Pi sessions. | | pyproject.toml | Bumps the package version to `4.0.0`. | | uv.lock | Synchronizes the editable package version with the project metadata. | </details> <a href="https://app.greptile.com/api/ide/codex?prompt=IMPORTANT%3A%20Work%20in%20the%20repository%20%22alishahryar1%2Ffree-claude-code%22%20on%20the%20existing%20branch%20%22ali%2Ffix-pi-model-scope%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22ali%2Ffix-pi-model-scope%22.%0A%0AFix%20the%20following%201%20code%20review%20issue.%20Work%20through%20them%20one%20at%20a%20time%2C%20proposing%20concise%20fixes.%0A%0A---%0A%0A%23%23%23%20Issue%201%20of%201%0Asrc%2Ffree_claude_code%2Fcli%2Flaunchers%2Fpi.py%3A20%0A**Recursive%20Scope%20Depends%20On%20Pi**%0A%0AWhen%20Pi's%20%60--models%60%20matcher%20does%20not%20support%20recursive%20%60**%60%20patterns%2C%20this%20launcher%20now%20passes%20a%20scope%20that%20can%20match%20no%20FCC%20models%20even%20though%20the%20extension%20registers%20them.%20The%20session%20still%20starts%2C%20but%20the%20FCC%20models%20can%20be%20absent%20from%20Pi's%20picker%20and%20prompts%20can%20continue%20using%20a%20non-FCC%20model.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1090&platform=github"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodexDark.svg?v=6"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"><img alt="Fix All in Codex" src="https://greptile-static-assets.s3.amazonaws.com/badges/FixAllInCodex.svg?v=6"></picture></a> <sub>Reviews (1): Last reviewed commit: ["Fix Pi nested model scope"](https://github.com/alishahryar1/free-claude-code/commit/f931b9db4a54801cb82c3d0e1c7674528a6bb5a3) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43725034)</sub> > Greptile also left **1 inline comment** on this PR. <!-- /greptile_comment --> |
||
|
|
2fe2ba82d2 |
Add Pi as a first-class FCC client (#1088)
## Problem FCC had no first-class Pi path, so Pi users had to maintain provider configuration themselves. FCC's installers and ownership docs also covered only Claude Code and Codex. ## Changes | Before | After | | --- | --- | | Pi required persistent user-managed provider configuration. | `fcc-pi` registers an ephemeral FCC provider from the live model catalog and leaves Pi-owned state untouched. | | Client launchers normalized blank proxy authentication separately. | Claude, Codex, and Pi share one neutral proxy-auth policy. | | FCC installers and uninstallers did not account for Pi. | Installers delegate missing Pi setup to its official platform installer, while uninstallers remove only `fcc-pi` and preserve native Pi. | | Pi compatibility had no executable FCC contract. | Deterministic launcher and lifecycle coverage plus a real Pi 0.80.6 smoke verify model discovery and `/v1/messages` end to end. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR adds Pi as a supported FCC client. The main changes are: - A new `fcc-pi` launcher and bundled Pi extension. - Shared proxy-auth handling for client launchers. - Pi installation, verification, and uninstall coverage in platform scripts. - Pi-focused tests, smoke coverage, and user documentation. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. None. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the targeted pytest command and confirmed deterministic success with 27 passed in 2.68s and EXIT\_CODE: 0. - Analyzed the blocker log and determined that Pi CLI and live-smoke prerequisites are missing, blocking external Pi execution; uv is available and provider smoke models are discoverable, narrowing the issue to Pi CLI plus live-smoke opt-in. <a href="https://app.greptile.com/trex/runs/14192651/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/free_claude_code/cli/launchers/pi.py | Adds the `fcc-pi` launcher, Pi capability checks, passthrough handling, extension loading, and FCC-scoped environment setup. | | src/free_claude_code/cli/launchers/pi_extension.ts | Adds the Pi extension that fetches FCC models and registers a process-local Anthropic Messages provider. | | scripts/install.sh | Adds Pi install, PATH refresh, capability verification, and `fcc-pi` command checks for POSIX installs. | | scripts/install.ps1 | Adds Pi install, PATH refresh, capability verification, and `fcc-pi` command checks for Windows installs. | | pyproject.toml | Registers the `fcc-pi` console script and bumps the package version. | </details> <!-- greptile_failed_comments --> <h3>Comments Outside Diff (1)</h3> 1. General comment <a href="#"><img alt="P1" src="https://greptile-static-assets.s3.amazonaws.com/badges/p1.svg?v=9" align="top"></a> **Pi entrypoint contract test fails due install-hint mismatch** - **Bug** - The narrow Pi launcher/entrypoint test selection fails on current HEAD. `test_launch_pi_rejects_unrelated_pi_binary` expects stderr to include the Windows PowerShell install URL `https://pi.dev/install.ps1`, but the launcher emitted the POSIX install command `curl -fsSL https://pi.dev/install.sh | sh` in this Linux sandbox. - **Cause** - The Pi launcher's incompatible-binary error path and the test contract disagree about which platform-specific install hint should be emitted for this scenario. - **Fix** - Align the Pi launcher contract with the test expectation: either update the launcher to emit the expected platform-specific hint for the mocked scenario, or update the test to assert the correct hint for the active/mocked platform. Then rerun `uv run --frozen pytest -q tests/cli/test_entrypoints.py -k 'pi'`. <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> <!-- /greptile_failed_comments --> <sub>Reviews (3): Last reviewed commit: ["Add first-class Pi client integration"](https://github.com/alishahryar1/free-claude-code/commit/cd5c335f8cf2dee93d927496d7cabbffec86f169) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43721088)</sub> <!-- /greptile_comment --> |
||
|
|
2da271505c |
Install FCC without requiring Git (#1087)
## Problem FCC required Git solely to fetch its source from GitHub. Customers had to install an unrelated prerequisite before running an otherwise self-contained installer. ## Changes | Before | After | | --- | --- | | Installers fetched FCC through a mutable `git+` repository URL. | Installers fetch the same visible `main` source through GitHub's generated ZIP archive. | | Git had to exist before either installer could continue. | FCC installation has no Git dependency or Git-specific branch. | | The unnamed source requirement relied on Git metadata. | Every base and voice variant uses a named direct-archive requirement. | | Reinstallation relied on Git to discover the current branch head. | `--refresh-package free-claude-code` fetches the current archive on every rerun. | | Installer tests provisioned a fake Git executable. | Windows and Linux scenarios pass with no Git executable and verify archive and voice specifications. | | The README described installer internals and a manual Git prerequisite. | The install section presents the platform commands directly. | | The package version was 3.5.18. | The package version is 3.5.19 with a synchronized lockfile. | <!-- greptile_comment --> <details open><summary><h3>Greptile Summary</h3></summary> This PR removes the Git requirement from the FCC installers. The main changes are: - Installer package specs now use GitHub's generated `main.zip` archive. - POSIX and PowerShell installers no longer check for `git`. - `uv tool install` now refreshes FCC during tool install. - Installer tests now assert archive URLs, voice extras, and no Git calls. - The package version and lockfile move to `3.5.19`. - The README no longer lists Git as a manual prerequisite. </details> <h3>Confidence Score: 5/5</h3> This looks safe to merge. No blocking issues found in the changed code. The installer changes are consistent across POSIX and PowerShell. The package metadata uses plain Hatchling configuration and does not rely on Git-derived versioning. No files need attention. <details><summary><h3><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="20" align="absmiddle"></a> T-Rex Logs</h3></summary> **What T-Rex did** - Ran the installer tests and observed a test run summary of 23 passed and 21 skipped with EXIT\_CODE 0. - Executed a dry-run installer test with git intentionally unavailable, which reported an archive URL, a refresh flag, and EXIT\_CODE 0. - Saved the no\_git\_installer\_harness.sh script to simulate a missing git on PATH while keeping UV, Python, and core utilities available. - Ran a grep-based validation that confirmed the test pass summary, identified the no-git condition, captured the archive URL, and verified exit codes. <a href="https://app.greptile.com/trex/runs/14184929/artifacts"><picture><source media="(prefers-color-scheme: dark)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifactsDark.svg?v=4"><source media="(prefers-color-scheme: light)" srcset="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"><img alt="View all artifacts" src="https://greptile-static-assets.s3.amazonaws.com/badges/ViewAllArtifacts.svg?v=4"></picture></a> <sub><a href="https://www.greptile.com/trex"><img alt="T-Rex" src="https://greptile-static-assets.s3.amazonaws.com/trex/trex_green.svg" height="14" align="absmiddle"></a> Ran code and verified through T-Rex</sub> </details> <details open><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | scripts/install.sh | Uses archive-based package specs, removes the Git prerequisite, and refreshes FCC during tool install. | | scripts/install.ps1 | Mirrors the archive install flow and Git removal for Windows. | | tests/scripts/test_installers.py | Updates installer tests for archive URLs, no Git calls, and voice/torch argument handling. | | pyproject.toml | Bumps the project version to `3.5.19`. | | uv.lock | Synchronizes the locked local package version. | | README.md | Removes the obsolete manual Git prerequisite from install instructions. | </details> <sub>Reviews (1): Last reviewed commit: ["Install FCC without requiring Git"](https://github.com/alishahryar1/free-claude-code/commit/9b1af99f89658867a5b2e8a1f7150fde297c0420) | [Re-trigger Greptile](https://app.greptile.com/api/retrigger?id=43708108)</sub> <!-- /greptile_comment --> |