提交

843 次代码提交

作者 SHA1 备注 提交日期
Ali Khokhar 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. |
2026-07-21 10:37:57 -07:00
Ali Khokhar 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. |
2026-07-21 10:06:41 -07:00
Ali Khokhar 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 -->
2026-07-21 05:48:17 -07:00
Ali Khokhar 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 -->
2026-07-21 00:15:35 -07:00
Ali Khokhar 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 -->
2026-07-20 23:53:55 -07:00
Ali Khokhar 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 in an isolated Python 3.14
environment and verified that fcc-init --version and free-claude-code
--version reported 4.11.4 with exit code 0. After upgrading to head
revision 9a65f654f5e06c0ca96a31d3ad03db8c63d8dec7, the installed version
changed to 4.11.5 and both entrypoints disappeared, with subsequent
invocations yielding command-not-found errors (exit code 127).
- Local smoke tests and server migrations completed successfully: the
CLI local smoke test exited with code 0, the installed-entrypoints
checks passed, and the server migrated to a healthy state with the
health endpoint responding.

<a
href="https://app.greptile.com/trex/runs/15196662/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 |
|----------|----------|
| pyproject.toml | Removes two public console commands while applying a
patch version bump. |
| src/free_claude_code/cli/commands.py | Removes template-based
initialization while preserving startup migration. |
| src/free_claude_code/cli/entrypoints.py | Removes the retired
initialization entrypoint and retains server version handling. |
| smoke/lib/child_process.py | Removes the init helper and renames the
server helper consistently. |
| scripts/install.sh | Keeps retired names in process detection for safe
upgrades. |
| scripts/uninstall.sh | Keeps retired names in removal checks for older
installations. |
| uv.lock | Tracks the patch version that must change if the command
removal remains breaking. |

</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%22remove-obsolete-cli-commands%22.%20Checkout%20that%20branch%20%E2%80%94%20do%20NOT%20create%20a%20new%20branch%20or%20open%20a%20new%20PR.%20Push%20your%20changes%20to%20%22remove-obsolete-cli-commands%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%20Commands%20Ship%20as%20Patch**%0A%0AUpgrading%20from%204.11.4%20removes%20the%20published%20%60fcc-init%60%20and%20%60free-claude-code%60%20commands%2C%20so%20existing%20scripts%20fail%20with%20%E2%80%9Ccommand%20not%20found.%E2%80%9D%20The%20repository%20policy%20classifies%20incompatible%20CLI%20removals%20as%20major%20changes%3B%20keep%20compatibility%20aliases%20for%204.x%20or%20publish%20this%20removal%20as%205.0.0.%0A%0A&repo=alishahryar1%2Ffree-claude-code&pr=1220&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: ["Remove obsolete CLI entry
points"](https://github.com/alishahryar1/free-claude-code/commit/9a65f654f5e06c0ca96a31d3ad03db8c63d8dec7)
| [Re-trigger
Greptile](https://app.greptile.com/api/retrigger?id=45848525)</sub>

> Greptile also left **1 inline comment** on this PR.

<!-- /greptile_comment -->
2026-07-20 21:55:49 -07:00
Ali Khokhar 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 -->
2026-07-20 15:46:41 -07:00
Ali Khokhar 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 -->
2026-07-20 04:23:28 -07:00
Ali Khokhar 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 -->
2026-07-20 03:28:56 -07:00
Ali Khokhar 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 -->
2026-07-20 00:26:00 -07:00
Ali Khokhar 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 -->
2026-07-19 22:43:29 -07:00
Ali Khokhar 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 -->
2026-07-18 21:45:07 -07:00
Ali Khokhar 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 -->
2026-07-18 20:29:41 -07:00
Ali Khokhar 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 -->
2026-07-18 04:10:02 -07:00
Ali Khokhar 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 -->
2026-07-17 22:51:26 -07:00
Ali Khokhar 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 -->
2026-07-17 20:29:58 -07:00
Ali Khokhar 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 -->
2026-07-17 18:47:55 -07:00
dependabot[bot] 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&gt;=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&gt;=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&quot;
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&quot;
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 &amp;
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 &amp;
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>&lt;/tr&gt;&lt;/table&gt; 
</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>
2026-07-17 13:52:25 -07:00
dependabot[bot] 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>
2026-07-17 13:49:45 -07:00
dependabot[bot] 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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/github-script&package-manager=github_actions&previous-version=8.0.0&new-version=9.0.0)](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>
2026-07-17 13:47:33 -07:00
Ali Khokhar 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 -->
2026-07-17 03:53:56 -07:00
Ali Khokhar 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 -->
2026-07-16 22:18:20 -07:00
Ali Khokhar 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 -->
2026-07-16 22:14:33 -07:00
Ali Khokhar 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 -->
2026-07-16 19:57:12 -07:00
wocessade 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>
2026-07-16 16:07:31 -07:00
Ali Khokhar 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 -->
2026-07-16 13:57:44 -07:00
Ali Khokhar 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 -->
2026-07-16 10:22:20 -07:00
Ali Khokhar 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 -->
2026-07-15 23:58:54 -07:00
Ali Khokhar 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 -->
2026-07-15 22:20:23 -07:00
Ali Khokhar 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`. |
2026-07-15 11:25:32 -07:00
Ali Khokhar 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 -->
2026-07-15 09:38:09 -07:00
Ali Khokhar 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 -->
2026-07-15 03:37:11 -07:00
Ali Khokhar 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 -->
2026-07-15 02:38:44 -07:00
Ali Khokhar 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 -->
2026-07-15 01:27:36 -07:00
Ali Khokhar 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 -->
2026-07-14 16:12:16 -07:00
Ali Khokhar 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 -->
2026-07-14 15:28:15 -07:00
Ali Khokhar 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 -->
2026-07-14 02:48:03 -07:00
Ali Khokhar 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. |
2026-07-14 01:55:10 -07:00
Ali Khokhar 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 -->
2026-07-14 01:46:54 -07:00
Ali Khokhar 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 -->
2026-07-13 23:55:23 -07:00
Ali Khokhar 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 -->
2026-07-13 11:56:34 -07:00
Ali Khokhar 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 -->
2026-07-13 09:15:01 -07:00
Ali Khokhar 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 -->
2026-07-13 04:26:20 -07:00
Ali Khokhar 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 -->
2026-07-13 03:33:47 -07:00
Fethi Amari 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 -->
2026-07-13 03:16:56 -07:00
Ali Khokhar 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 -->
2026-07-12 22:10:47 -07:00
Ali Khokhar 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 -->
2026-07-12 22:05:34 -07:00
Ali Khokhar 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 -->
2026-07-12 21:18:06 -07:00
Ali Khokhar 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 -->
2026-07-12 20:54:57 -07:00
Ali Khokhar 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 -->
2026-07-12 18:40:25 -07:00