feat(webview): add OpenAI Codex speed selector - #3
Closed
WebMad wants to merge 49 commits into
Closed
Conversation
…de-Org#939) Co-authored-by: Roomote <roomote@roomote.dev>
…hLock (Zoo-Code-Org#912) * fix: lock task history invalidation * fix(task-history): address invalidation review feedback
(interrupted subtask parent-link) (Zoo-Code-Org#911)
…#961) (Zoo-Code-Org#962) checkExistKey ignored Zoo Gateway session auth, so Finish saved config but never left the setup screen. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Roomote <roomote@roomote.dev>
DeepSeek V4 Pro and V4 Flash support image inputs via their OpenAI-compatible API, but the model definitions had supportsImages: false. This change flips it to true for both models, enabling users to attach images when using these models.
…treaming, and model metadata (Zoo-Code-Org#857) * fix(moonshot): fix provider issues with model picker, refresh, and streaming - Fix duplicate ModelPicker by adding moonshot to PROVIDERS_WITH_CUSTOM_MODEL_UI - Fix HTTP 404 on Refresh Models by preserving /v1 in fetcher URL - Fix empty model list (consequence of 404 fix) - Fix 'No output generated' error by switching MoonshotHandler from OpenAICompatibleHandler (Vercel AI SDK) to OpenAiHandler (OpenAI Node SDK) which is what Moonshot's own API docs recommend - Add dedicated Moonshot fetcher with proper model ID prefixing - Update tests to match new handler implementation All 6,660 backend and 1,432 webview-ui tests pass. * feat(moonshot): add missing models with correct pricing from official docs Add kimi-k2.7-code, kimi-k2.7-code-highspeed, and kimi-k2.6 to static models map with accurate pricing from Moonshot documentation. Also fix kimi-k2.5 to correctly mark supportsImages: true. * Update webview-ui/src/components/settings/providers/Moonshot.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix(moonshot): remove fallback pricing for unknown models to match handler behavior * Bump coverage * fix(moonshot): address PR review feedback — add tests and fix inline import type - Replace inline import() type with top-level OpenAI.Chat.Completions.X in moonshot.ts - Add useSelectedModel moonshot tests (default model, router override, unknown fallback, getValidatedModelId) - Add modelCache moonshot dispatch test for fetchModelsFromProvider switch - Create Moonshot.spec.tsx with state machine tests (idle/loading/success/error states, race condition guard) --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Roomote <roomote@roomote.dev>
…milies (Zoo-Code-Org#899) * fix(litellm): preserve reasoning_content for known reasoning model families LiteLLM's /v1/model/info never reports reasoning capability flags, so infer preserveReasoning from the model alias/routed-model name and use convertToR1Format to keep reasoning_content intact across tool-call turns. Signed-off-by: daewoongoh <dw.oh@samsung.com> * test(litellm): cover preserveReasoning inference and message conversion branching Add unit coverage for LITELLM_PRESERVE_REASONING_PATTERN matching per model family, getLiteLLMModels setting preserveReasoning on matched models, and LiteLLMHandler.createMessage branching between convertToR1Format and convertToOpenAiMessages based on info.preserveReasoning. Signed-off-by: daewoongoh <dw.oh@samsung.com> * refactor(litellm): replace preserveReasoning regex with an explicit model id list Regex-based family matching could over-match unrelated aliases sharing a substring (e.g. glm-5-flash matching a glm-5 prefix), a gap flagged in PR Zoo-Code-Org#899 review. LITELLM_PRESERVE_REASONING_MODEL_IDS now lists the exact model ids that set preserveReasoning: true in their native provider config, matched via isLiteLLMPreserveReasoningModel() against the final segment of model_name/litellm_params.model. Also fixes a test in litellm.spec.ts where the model_name alias itself matched a known id, so the assertion didn't actually prove litellm_params.model was being checked. Signed-off-by: daewoongoh <dw.oh@samsung.com> --------- Signed-off-by: daewoongoh <dw.oh@samsung.com>
…ode-Org#925) * fix(webview): sync cachedState on mode changes in SettingsView * test(settings): strengthen mode sync change detection --------- Co-authored-by: Eason Liang <easonliang28@gmail.com>
* fix(code-index): index plain text files * fix(tree-sitter): skip plain text definition parsing * fix(code-index): address plain text review feedback * fix(tree-sitter): preserve Scala structural parsing * test(code-index): remove redundant async usage
… and surface delegation status (Zoo-Code-Org#935) * feat(task-lifecycle): explicit interrupted status + delegation state machine * feat(history-ui): delegation status badges in history list * fix(ci): add dedicated fixtures for abandon e2e test and add missing i18n keys * test: cover evictCurrentTask, markDelegatedChildInterrupted, and onTaskCompleted paths * fix: address CodeRabbit review - guard active-only in markDelegatedChildInterrupted, evict on disposal, fix delegateParentAndOpenChild TOCTOU, translate i18n keys * fix(e2e): allow parent status to be active or completed after child delegation --------- Co-authored-by: Naved Merchant <naved.merchant@gmail.com>
…o-Code-Org#989) * refactor(types): use canonical provider category identifiers * test(types): cover cross-category provider guards
…ode-Org#996) * feat(types): add Kimi K3 to moonshot and opencode-go providers * test(types): add moonshot registry suite and explicit kimi-k3 reasoning assertions * test(types): widen moonshot registry entries to ModelInfo in tests --------- Co-authored-by: Roomote <roomote@roomote.dev>
* feat: add Kimi Code provider * no-mistakes(review): add explicit error handling for OAuth retry path * no-mistakes(document): Fix incorrect provider attribution in OAuth comment * no-mistakes: apply CI fixes * no-mistakes: apply CI fixes * fix(kimi-code): harden OAuth request handling * feat(kimi-code): add configurable reasoning effort (low/high/max) * fix(kimi-code): address review feedback and resolve main merge conflicts - Wrap kimiCodeOAuthState aggregation in try/catch in ClineProvider - Add non-401 OAuth no-retry test for createMessage - Add vi.resetModules() to kimiCode sign-in/out spec setup - Localize kimiCode settings strings in 9 locales - Merge origin/main: adopt canonical providerIdentifiers registry, keep both kimi-code and zoo-gateway setup-gate checks --------- Co-authored-by: Toray Altas <6816042+taltas@users.noreply.github.com> Co-authored-by: Roomote <roomote@roomote.dev> Co-authored-by: Naved Merchant <naved.merchant@gmail.com>
…GPT OAuth (Zoo-Code-Org#889) * fix(openai-codex): support Luna Responses Lite requests * Nuke md file that shouldnt have been commited in the first place * fix(openai-codex): address Luna Responses Lite review feedback - Capture telemetry when transformLunaResponsesLiteBody throws in createMessage - Drop weak Record<string, any> alias from transformLunaResponsesLiteBody signature - Document intentional tool_choice/parallel_tool_calls and reasoning context overrides - Strengthen tests: full input array assertion, reasoning context overwrite case, retry header coverage, single-build spy, and uuidv7 session shape check --------- Co-authored-by: Naved Merchant <naved.merchant@gmail.com> Co-authored-by: Roomote <roomote@roomote.dev>
* feat(tree-sitter): add Dart definition support * fix(tree-sitter): address Dart query review feedback * fix(tree-sitter): include adjacent Dart function bodies --------- Co-authored-by: Naved Merchant <naved.merchant@gmail.com>
…Org#1010) Add full Claude Opus 5 support across all provider paths with correct model definitions, adaptive-thinking handling, fetcher overrides, and accurate pricing from Anthropic's published docs. Model definitions (anthropic.ts, bedrock.ts, vertex.ts): - 1M native context window (no beta header required) - Adaptive-thinking binary toggle (supportsReasoningBudget/Binary) - supportsTemperature: false (sampling params return a 400) - Pricing: input $5.0, output $25.0, cacheWrites $6.25, cacheReads $0.50 per million tokens Provider handling: - Add opus-5 to the Bedrock adaptive-thinking guard - Add claude-opus-5 to OpenRouter and Vercel AI Gateway allow-lists - Apply Opus 5 overrides (maxTokens, reasoning budget, temperature) in the openrouter, requesty, and vercel-ai-gateway fetchers Tests: - Add Opus 5 coverage across provider and fetcher test suites Co-authored-by: Naved Merchant <14171946+navedmerchant@users.noreply.github.com>
* chore: prepare v3.72.0 release * fix: address v3.72.0 release review * Update README.md * Update README.md --------- Co-authored-by: edelauna <54631123+edelauna@users.noreply.github.com>
… child fixture (Zoo-Code-Org#1002) * test(e2e-mock): fix subtasks fixture collision between child and parent-resume fixtures (Zoo-Code-Org#1001) The fast-child and SUBTASK_CHILD fixtures matched a bare marker that the parent prompt embeds verbatim, so parent-resume turns could be served the child fixture (mirrors Zoo-Code-Org#561, which fixed the same class for cross-profile fixtures only). Parent-resume fixtures also guarded on the literal new_task tool-call id, which validateAndFixToolResultIds can rewrite on resume. - Add parent-marker exclusion (with aimock's last-user-message scoping) to the fast-child and SUBTASK_CHILD fixtures - Guard parent-resume fixtures on the injected subtask result content instead of the fragile tool-call id * test(e2e-mock): address PR review — injection-guard all parent fixtures, link fixture format contract - Regular parent turn-1 fixture: exclude resume turns via SUBTASK_RESULT_INJECTION instead of relying on registration order (sequenceIndex is not viable here — the fixture is shared by 4 tests) - Fast and api-hang parent-resume guards: match SUBTASK_RESULT_INJECTION instead of the child result text, which is embedded verbatim in the parent prompts and could match the parent's initial request on retry - Add unit-test assertion pinning reopenParentFromDelegation's injected tool_result format to the 'completed.\n\nResult:' contract the e2e fixtures match on - lastUserMessageContains: mirror aimock's getTextContent (text parts only) instead of JSON.stringify for non-string content - Extract SUBTASK_FAST_CHILD_RESULT constant - Replace tautological find()/assert pairs in the api-hang test - Move the no-parent-resume assertion in the cancellation test behind the async settle gates and also assert no completion_result --------- Co-authored-by: Roomote <roomote@roomote.dev>
…Zoo-Code-Org#872) * fix(settings): buffer Save-managed settings in cachedState until Save Several controls inside SettingsView wrote their changes to the extension host immediately via `updateSettings`, instead of buffering them in local `cachedState` and waiting for the user to click Save. Because Discard reverts edits by resetting `cachedState` to the persisted state, any control that already posted `updateSettings` poisoned that source of truth — so Discard could no longer undo the change, silently breaking the Save/Discard contract. Route all five Save-managed values exclusively through `cachedState` / `setCachedStateField` while SettingsView is open: - allowedCommands / deniedCommands (AutoApproveSettings): drop the immediate updateSettings on add/remove. - profileThresholds (ContextManagementSettings): drop the immediate updateSettings on the non-default profile branch; remove the now-unused vscode import. - includeTaskHistoryInEnhance (PromptsSettings): drop the immediate updateSettings on toggle. - mcpEnabled (McpEnabledToggle / McpView): adopt the existing "props first, fall back to context" pattern so SettingsView can pass the buffered value and a cachedState-backed setter; uncontrolled usage keeps the original immediate behavior. Genuinely-immediate actions (autoApprovalEnabled, per-server MCP toggle/delete/restart/timeout) are not in the Save payload and are left unchanged. The extension host side is correct and untouched. Add/update tests at the webview-ui component layer: buffering assertions for each control, a McpEnabledToggle controlled/uncontrolled regression, and a SettingsView Discard regression. Signed-off-by: JunyongParkDev <jun94.park@samsung.com> * test(settings): cover buffered MCP enablement * test(settings): verify discarded commands are reverted in UI Strengthen the SettingsView regression test to verify that buffered commands disappear from the UI when changes are discarded. Signed-off-by: JunyongParkDev <jun94.park@samsung.com> * fix(settings): restore immediate persistence for uncontrolled includeTaskHistoryInEnhance The previous Save-buffering change dropped the updateSettings post unconditionally, which fixed the controlled path but broke the uncontrolled one: with props omitted the toggle falls back to the context setter, which only updates local state and never persists. Gate the post on whether the component is controlled: - Controlled: setter buffers into cachedState, Save persists — no post here. - Uncontrolled: context setter is local-only, so post updateSettings now. Mirrors the props-first / context-fallback pattern used for McpEnabledToggle. Adds an uncontrolled regression test (updates local state *and* posts), symmetric with the controlled "buffer only" case. Signed-off-by: JunyongParkDev <jun94.park@samsung.com> --------- Signed-off-by: JunyongParkDev <jun94.park@samsung.com>
… form-edited base URL (Zoo-Code-Org#878) * ollama fetch fix * address review comments
…g#906) * Fix bedrock DNS resolution when behind a corporate proxy When behind a corporate proxy, Node.js resolves DNS locally before contacting the proxy. If the proxy is the only path to the endpoint, the request fails with ENOTFOUND. HttpsProxyAgent uses CONNECT tunneling so the proxy handles DNS resolution. Configure NodeHttpHandler with HttpsProxyAgent when a system proxy is detected. * test: add coverage for getSystemProxyUrl function * fix: honor NO_PROXY, support http proxy, trim proxy env vars
* chore(deps): update node.js to v24 * chore(deps): target node 22 lts * chore: downgrade Node to 22 LTS to fix Windows CI crash --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay <edelauna@gmail.com>
Zoo-Code-Org#968) The Architect mode custom instructions ended with 'put it in the /plans directory', which models interpreted as an absolute filesystem path, causing 'EROFS: read-only file system, mkdir /plans' when saving plan files. Reword to './plans' and clarify it is relative to the workspace root. Fixes Zoo-Code-Org#965 Co-authored-by: Toray Altas <6816042+taltas@users.noreply.github.com>
…o-Code-Org#1014) * feat(TaskRegistry): introduce TaskRegistry and migrate clineStack * refactor(tests): replace `as any` casts with bracket notation for private member access * chore(eslint): enforce no-explicit-any with bulk suppressions for existing violations * docs(TaskRegistry): push method * fixup! chore(eslint): enforce no-explicit-any with bulk suppressions for existing violations
…Code-Org#986) * chore(deps): update dependency shell-quote to v1.9.0 [security] * chore(deps): remove obsolete shell-quote types --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Elliott de Launay <edelauna@gmail.com>
…e-Org#1019) * refactor(shared): use canonical profile provider identifiers * test(shared): strengthen profile validator coverage * test(shared): avoid mutating provider identifiers * chore(lint): prune profile validator suppressions
* refactor(core): use canonical provider identifiers * test(core): tighten canonical provider coverage * test(core): avoid mutating provider identifiers * test(core): address canonical identifier review feedback * chore(lint): update test suppression counts * test(core): keep existing non-null assertions
…oo-Code-Org#1024) (Zoo-Code-Org#1032) * fix(ripgrep): resolve platform-specific binary for @vscode/ripgrep >=1.18 * fix(environment): gracefully handle ripgrep not found during file listing * fix(ripgrep): use npm_config_arch for platform-package resolution * refactor(ripgrep): replace createRequire resolver with static candidate paths * fix(ripgrep): evaluate npm_config_arch at call time in candidate paths --------- Co-authored-by: Naved Merchant <naved.merchant@gmail.com>
This was referenced Jul 28, 2026
WebMad
force-pushed
the
feat/openai-codex-fast-backend
branch
from
July 28, 2026 21:35
afafd48 to
1115a98
Compare
WebMad
force-pushed
the
feat/openai-codex-fast-ui
branch
from
July 28, 2026 21:35
379455c to
1649542
Compare
WebMad
force-pushed
the
feat/openai-codex-fast-backend
branch
from
July 28, 2026 21:57
1115a98 to
78c35a1
Compare
WebMad
force-pushed
the
feat/openai-codex-fast-ui
branch
from
July 28, 2026 21:57
1649542 to
0285106
Compare
…de-Org#950) * chore(lint): add core/webview to no-floating-promises ratchet * fix(webview): catch indexing errors and cover changed handler paths * chore(lint): triage new core/webview call sites after merging main Also restore README.md to the upstream version, dropping an unintended formatter artifact picked up during the merge commit. --------- Co-authored-by: edelauna <54631123+edelauna@users.noreply.github.com>
…Zoo-Code-Org#971) * fix(branding): replace remaining user-facing "Roo" strings with "Zoo" Replace user-facing product references from "Roo" to "Zoo": - Webview panel and editor tab titles - Integrated terminal names - Diff view labels - VS Code LM authorization justification - LM Studio error messages - Missing-parameter tool error (now i18n-keyed via tools:missingToolParameter[WithPath] across all 16 locales) - Webview-ui localization strings (chat, settings, prompts across all locales) Per review feedback, references to the external Roo provider/router remain untouched: the routerRemoval messages, errors.roo/info.roo i18n keys, Roo credit-balance notices, and other internal identifiers that reference the legacy Roo provider rather than our brand. * test: bump coverage for Roo-to-Zoo user-facing string changes (Zoo-Code-Org#971) * chore: simplify i18n mocking in Task.spec.ts * test: increase coverage of vscode-lm.ts and vscode-lm-format.ts * fix(types): eliminate any casts in vscode-lm provider and format transform --------- Co-authored-by: Roomote <roomote@roomote.dev> Co-authored-by: Elliott de Launay <edelauna@gmail.com>
… emit output (Zoo-Code-Org#1043) * fix(terminal): delay command_output ask for short foreground commands The command_output ask fired on the first output chunk of any foreground command, prompting users even for commands about to complete. Schedule the ask instead so it only fires when the command is still running after a 5s delay, preserving the interrupt/feedback path for long-running commands while letting short commands finish without prompting. Closes Zoo-Code-Org#1042 * fix(terminal): anchor command_output ask delay to execution start Anchor the ask-delay timer to onShellExecutionStarted (falling back to the pre-runCommand timestamp) so shell-integration startup on cold terminals does not consume the grace period, and expand ask-policy tests to cover the agent-timeout cancel, re-anchor reschedule, ask error handling, and non-message responses to restore patch coverage. * test(terminal): cover fallback anchor for command_output ask delay * fix(terminal): clean up pending command_output ask on completion - Supersede a still-pending command_output ask in onCompleted so it resolves immediately instead of lingering until the next interactive message, and clear the Proceed/Kill controls in the webview when the final non-partial command_output say arrives. - Continue the process for any ask answer, not just typed messages, so a non-message response actually backgrounds the command and the tool resolves before the process completes. - Strengthen ask-policy tests: assert the rescheduled ask still fires at the re-anchored deadline, assert early resolution for non-message answers, and cover ask supersession on completion. * test(terminal): note synthetic yesButtonClicked in non-message ask test --------- Co-authored-by: Roomote <roomote@roomote.dev>
…, Story 3.1) (Zoo-Code-Org#1031) * feat(TaskScheduler): introduce TaskScheduler and wire into ClineProvider * feat(Task): keep track of active running task * docs(eslint): updating guidance on how to handle suppression file * fix(ClineProvider): route createTaskWithHistoryItem through taskScheduler * test(e2e): add scheduler regression tests for task resume paths * refactor(ClineProvider): extract scheduleTask helper to deduplicate fire-and-forget scheduling * refactor(ClineProvider): extract scheduleTask helper to deduplicate fire-and-forget scheduling --------- Co-authored-by: Naved Merchant <naved.merchant@gmail.com>
…oo-Code-Org#1045) * ci: harden E2E workflow against VS Code binary download failures Add restore-keys fallback to the VS Code test binary cache, probe the VS Code update API before running tests, fall back to a stale cached binary (via VSCODE_VERSION) when the CDN is unreachable, and retry the mocked E2E step so transient network blips don't fail the merge queue. Skip writing the pass marker when the stale-binary fallback was used. Closes Zoo-Code-Org#1044 * ci: scope E2E retries to binary download, probe CDN endpoint, prune stale binaries Address review feedback on Zoo-Code-Org#1045: - Retry only the VS Code binary download (its own step), so genuine test failures fail fast instead of re-running the whole suite. - Probe the archive CDN endpoint (via the 302-redirect HEAD) in addition to the update API, so the stale-binary fallback also engages when only the CDN host is down. - Restore/save the binary cache with restore+save actions and prune older vscode-linux-x64-* dirs so each saved entry keeps one binary instead of growing with every version bump; skip the save when the stale fallback was used. - Emit a ::warning:: when endpoints are unreachable with no cached binary, and echo why the pass marker is skipped on fallback runs. --------- Co-authored-by: Roomote <roomote@roomote.dev> Co-authored-by: edelauna <54631123+edelauna@users.noreply.github.com>
) * refactor(webview): use canonical provider identifiers * test(webview): remove brittle identifier mutation tests * fix(webview): handle remaining model providers explicitly * test(webview): avoid unreachable coverage branch * refactor(webview): use canonical anthropic identifier * test(webview): cover Anthropic Opus 1M tier * test(webview): use canonical Anthropic identifier * fix(webview): address canonical provider review * test(webview): use canonical provider identifiers * test(webview): cover Kimi Code model selection
* refactor: finish canonical provider identifier audit * fix: address provider identifier review feedback * refactor: centralize Anthropic protocol value * refactor: reuse canonical provider protocol constants * refactor: centralize OpenAI protocol value * test: use canonical keyless provider identifiers * test: address protocol routing review feedback
* refactor(api): centralize service-tier primitives * test(openai-native): cover omitted completion tiers * test(openai-native): cover resolved streaming tiers * test(api): cover service tier fallbacks * test(api): cover remaining service tier branches * refactor(api): remove duplicate tier capture * test(openai-native): cover flex service tier * test(openai-native): expand service tier coverage * refactor: address service tier review feedback * refactor(api): address service tier review feedback * test(webview): add model info visual snapshot * fix(webview): isolate visual test dependencies * test(webview): update service tier visual baseline * fix(webview): add @source directive so Tailwind utilities generate in CT builds --------- Co-authored-by: Elliott de Launay <edelauna@gmail.com>
WebMad
force-pushed
the
feat/openai-codex-fast-backend
branch
3 times, most recently
from
July 30, 2026 15:12
4d112a7 to
ce11b1a
Compare
…#1063) * feat(openai-codex): persist and send Fast priority mode * refactor(openai-codex): align service tier types
WebMad
force-pushed
the
feat/openai-codex-fast-ui
branch
from
July 31, 2026 05:14
0285106 to
69e5851
Compare
Owner
Author
|
Replaced by Zoo-Code-Org#1076, targeting the upstream repository after the preceding stack PRs were merged. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Responsibility and scope
Adds the OpenAI Codex speed selector in settings and its localized copy. Tests travel with the behavior in this PR.
Behavior and state handling
postMessage; changes remain buffered until the existing Save flow applies them.Explicit non-goals
Task.throttle.test.tsfix.Test evidence
Stack dependency
WebMad:feat/openai-codex-fast-backend).Review after #2; this PR intentionally contains only its immediate-base UI and localization delta.