Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
7fb1f52
fix(openai): treat TLS BadRecordMac/fatal-alert and 429 as retryable
1jehuang Jun 8, 2026
ce983c6
fix(tui): seamless anchored loading for long compacted transcripts
1jehuang Jun 8, 2026
84d2463
feat(computer): native macOS computer-use tool
Jun 8, 2026
bf3ec7f
fix(computer): correct UI-tree AppleScript and Retina screenshot scale
Jun 8, 2026
7fddcfb
feat(anthropic): default Opus to strongest reasoning effort (xhigh)
1jehuang Jun 8, 2026
6706e0e
feat(computer): tiers 1-5 + progressive disclosure + setup
Jun 9, 2026
7eda4e8
fix(computer): production hardening — timeouts, dry_run, output caps,…
Jun 9, 2026
7d193e7
Merge PR #345: native macOS computer-use tool
1jehuang Jun 9, 2026
1a7bcda
rename(computer): macos_computer_use tool name
1jehuang Jun 9, 2026
4026d68
docs(computer): update Cargo.toml comment to macos_computer_use
1jehuang Jun 9, 2026
4135660
feat(provider): add extra_body passthrough for OpenAI-compatible prov…
1jehuang Jun 9, 2026
e20c0fc
feat(computer): tell the agent to stay out of the user's way
1jehuang Jun 9, 2026
d8a19a3
feat(openai): allow custom base URL for native openai-api Responses p…
1jehuang Jun 9, 2026
5d5bc7e
feat(tui): content-anchor info widgets to the transcript while scrolling
1jehuang Jun 9, 2026
af0ab85
fix(antigravity/gemini): carry thought_signature forward to avoid mis…
1jehuang Jun 9, 2026
21ca154
feat(tui): add /commit-push slash command
1jehuang Jun 9, 2026
b772e11
feat(tui): render conversation images inline in the transcript
1jehuang Jun 9, 2026
ec7e4e5
feat(anthropic): add Claude Fable 5 to model catalog
1jehuang Jun 9, 2026
a7d4aed
fix(onboarding): don't re-onboard established users when launch_count…
1jehuang Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions OAUTH.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,19 @@ with headers:
Otherwise it uses:
- `https://api.openai.com/v1/responses`

For **API-key** usage (no ChatGPT/Codex OAuth), the Responses API base URL is
overridable so you can target a local or proxied Responses-API endpoint. Set one
of (checked in this order) to an absolute `http(s)://` base that ends in the API
version, e.g. `http://127.0.0.1:8317/v1`:
- `JCODE_OPENAI_API_BASE`
- `OPENAI_BASE_URL`
- `OPENAI_API_BASE`

jcode appends `/responses` itself, derives the WebSocket and `/compact`
endpoints from the same base, and also points the `/models` catalog probe at it.
The override is ignored in ChatGPT/Codex OAuth mode (that backend is fixed), and
a malformed value is logged and ignored rather than breaking requests.

### Troubleshooting
- Claude 401/auth errors: run `jcode login --provider claude`.
- 401/403: re-run `jcode login --provider openai`.
Expand Down
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ Useful environment overrides for these endpoints:

- `JCODE_STREAM_IDLE_TIMEOUT_SECS` — raise the streaming idle timeout (default 180s) for slow reasoning models that think silently before emitting tokens. Also settable as `[provider] stream_idle_timeout_secs` in `config.toml`.
- Per-model `context_window` (alias `context_limit`) in a `[[providers.<name>.models]]` entry — set the context window when the endpoint has no usable `/v1/models` response, so jcode does not fall back to the generic 200k default.
- `extra_body` — inject non-standard top-level fields into every chat/completions request body for backends that require them. See [Extra request-body fields](#extra-request-body-fields-extra_body) below.

For details on self-hosting, local runtimes, and the exact config file shape, see below.

Expand Down Expand Up @@ -444,6 +445,32 @@ id = "my-model-id"
context_window = 128000
```

##### Extra request-body fields (`extra_body`)

Some OpenAI-compatible backends require non-standard top-level request fields. For example, NVIDIA NIM DeepSeek-V4 reasoning models (`deepseek-ai/deepseek-v4-flash`, `deepseek-ai/deepseek-v4-pro`) only enable thinking when the request includes `chat_template_kwargs`; without it they reply without reasoning (or, for some deployments, hang). jcode lets you inject arbitrary top-level fields two ways.

1. Per named profile, via `extra_body` in `config.toml` (a TOML table merged verbatim into the JSON body):

```toml
[providers.my-nim]
type = "openai-compatible"
base_url = "https://integrate.api.nvidia.com/v1"
api_key_env = "NVIDIA_API_KEY"
default_model = "deepseek-ai/deepseek-v4-flash"

[providers.my-nim.extra_body.chat_template_kwargs]
thinking = true
reasoning_effort = "high"
```

2. For built-in profiles (e.g. `nvidia-nim`) or any endpoint, via the `JCODE_OPENAI_EXTRA_BODY` environment variable (a JSON object string). It can live in the provider's env file (`~/.config/jcode/nvidia-nim.env`) next to the API key:

```bash
JCODE_OPENAI_EXTRA_BODY={"chat_template_kwargs":{"thinking":true,"reasoning_effort":"high"}}
```

Keys from `extra_body` are merged last and override any jcode-generated body field with the same name (`JCODE_OPENAI_EXTRA_BODY` wins over the config `extra_body` on key collisions). Invalid values are logged and ignored rather than failing the request.

The custom OpenAI-compatible provider reads overrides from environment variables or from an env file in jcode's app config directory. On Linux this is usually `~/.config/jcode/`, so the default file is usually:

```text
Expand Down
4 changes: 4 additions & 0 deletions crates/jcode-app-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,7 @@ windows-sys = { version = "0.59", features = ["Win32_Foundation", "Win32_System_

[target.'cfg(target_os = "macos")'.dependencies]
global-hotkey = "0.7"
# Native desktop control for the `macos_computer_use` tool (synthetic mouse/keyboard
# events, cursor positioning, display bounds). `highsierra` enables the
# CGEventCreateScrollWheelEvent2 binding used for scroll.
core-graphics = { version = "0.23", features = ["highsierra"] }
Loading
Loading