Skip to content

feat(web-search): opt-in live streaming of routed-model output + Dashboard toggle - #1500

Merged
Wibias merged 11 commits into
lidge-jun:devfrom
RobinBially:feat/web-search-sidecar-live-streaming
Aug 12, 2026
Merged

feat(web-search): opt-in live streaming of routed-model output + Dashboard toggle#1500
Wibias merged 11 commits into
lidge-jun:devfrom
RobinBially:feat/web-search-sidecar-live-streaming

Conversation

@RobinBially

@RobinBially RobinBially commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

feat(web-search): opt-in live streaming of routed-model output (streamRoutedModelOutput) + Dashboard toggle

Problem

With the web-search sidecar engaged (Codex sends a hosted web_search tool on every real turn, and
a usable ChatGPT credential exists), runWithWebSearch fully buffers every semantic adapter event
of an iteration before scanning for web_search calls. The client sees nothing until the turn
finishes — on reasoning-heavy turns 6–50 s of silence, then the whole answer as one burst. This is
the "chat doesn't stream through opencodex" experience for every routed model.

Reproduced end-to-end: a byte-identical replay of a captured real codex exec request buffers on a
sidecar-enabled instance and streams on an identical instance without ChatGPT auth; a field bisect
shows removing only the web_search tool from the request restores streaming (448 deltas, first at
3.5 s), while removing the other hosted tools does not.

Fix

New config option webSearchSidecar.streamRoutedModelOutput (default false — behavior unchanged
without opt-in). When enabled, each iteration's leading output streams live and the live window
closes permanently at the first buffer-only event:

  • Allowlist of live-streamable types in loop.ts: text_delta, thinking_delta,
    reasoning_raw_delta, thinking_signature, redacted_thinking, kiro_redacted_reasoning
    exactly what the sidecar-less path would deliver identically. Anything else (tool calls above
    all) closes the window, so the web_search interception decision stays atomic and live events
    are exactly the first N passthrough entries.
  • The window is per iteration: after a search, the next iteration (including the final answer)
    streams live again.
  • The terminal replay skips the already-streamed head by count — nothing is delivered twice.
  • Live events are still buffered for the scanner, so extractIterationThinking and the
    forced-answer output check ([Bug]: Hosted web-search forced-answer pass accepts a malformed tool call and completes without an assistant message #1001) are unchanged.
  • The existing Kiro commentary bypass is untouched.

Documented tradeoff (docs-site/guides/sidecars.md): text the model emits before deciding to
search — which buffered mode silently drops — becomes visible and may partially repeat in the
post-search answer. Reasoning-first models avoid the text-repetition case (their leading reasoning
deltas become client-visible — that visibility is the point of the option).

Discoverability: Dashboard toggle

A config-file-only flag would be hard to find for anyone hitting "why doesn't chat stream?", so the
option is also surfaced in the UI:

  • GET/PUT /api/sidecar-settings now carry webSearch.streamRoutedModelOutput (boolean;
    non-boolean values are rejected with 400; false removes the key so config files stay minimal).
  • The web-search sidecar card on the Dashboard overview page gains a Stream answers live
    switch (strings in all eight locales).

Dashboard overview: web-search sidecar card with the new "Stream answers live" toggle

Tests

  • bun test tests/web-search.test.ts — 55 pass (4 new). The live-delivery tests are gated: the
    fake adapter withholds its next event until the test has observed the leading delta on the wire,
    and the 5 s deadline rejects instead of releasing the gate, so a buffered implementation
    fails rather than passing via the terminal replay. Covered: live first delta mid-turn; default
    (flag unset) still buffers; window closes at tool_call_start with exactly-once, in-order replay
    (prefix delta → function_call → suffix); search loop delivers pre-search text and final answer
    exactly once.
  • bun test tests/sidecar-settings-web-search-stream.test.ts — 4 pass (new): GET reflection,
    PUT true/false round-trip with key removal, 400 on non-boolean, PUT without the flag leaves an
    enabled value untouched.
  • bun test tests/web-search-*.test.ts — 78 pass. GUI: cd gui && bun test tests — 764 pass;
    eslint . clean. bun x tsc --noEmit clean in root and gui (TypeScript 7.0.2).
  • Full bun run test suite (after merging current dev): 11310 pass / 0 fail / 8 skip,
    699 files, 509 s.
  • Live E2E on a real instance (ChatGPT credential present, sidecar engaged, routed model
    opencode-go/deepseek-v4-flash, identical text-forcing request):
    • toggle off: 18.3 s silence, then 2829 text deltas within 0.02 s (one terminal burst);
    • toggle on: first text delta at 4.0 s, 2538 deltas trickling over 9.9 s (live), applied
      without restart via PUT /api/sidecar-settings.

Devlog: devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md carries
the full investigation (bit-identical-instance comparison, capture, bisect).

🤖 Generated with Claude Code

Review readiness checklist

This PR stays in draft until every box below is ticked. Tick all four boxes once the requirements are met:

  • All CI tests are green on my local testing.

  • I pushed my PR to the latest dev commit.

  • I resolved all correct Codex and CodeRabbit findings.

  • My PR is ready for review.

Summary by CodeRabbit

  • New Features

    • Added opt-in live streaming of routed model text, thinking, and reasoning during web searches.
    • Added Dashboard and API controls for enabling or disabling streaming; buffering remains the default.
    • Streaming stops at tool calls and resumes with buffered content without duplicate output.
    • Added localized setting labels and guidance across supported languages.
  • Documentation

    • Updated sidecar documentation with configuration examples and behavior details, including possible repeated pre-search text.
  • Tests

    • Added coverage for streaming, buffering defaults, tool-call boundaries, ordering, persistence, and validation.

@github-actions

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the enhancement New feature or request label Aug 11, 2026
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a88495fc-4ff7-4669-b2df-b4ebd692460f

📥 Commits

Reviewing files that changed from the base of the PR and between 209154f and c3e4a36.

📒 Files selected for processing (2)
  • src/server/responses/core.ts
  • src/types.ts

📝 Walkthrough

Walkthrough

The PR adds an opt-in streamRoutedModelOutput setting for web-search sidecars. Leading text and thinking events stream before the first tool call. Buffered scanning remains active, and replay avoids duplicate events.

Changes

Web-search sidecar live streaming

Layer / File(s) Summary
Streaming contract and plan wiring
src/types.ts, src/web-search/index.ts, src/server/responses/core.ts
Adds the optional setting, resolves it only when explicitly true, and passes it into sidecar execution.
Settings API and dashboard control
src/server/management/config-routes.ts, gui/src/pages/dashboard-shared.ts, gui/src/pages/dashboard-overview-sections.tsx, gui/src/i18n/*
Adds GET and PUT support, validates boolean values, persists enabled state, and exposes a dashboard toggle with translations.
Live window and replay behavior
src/web-search/loop.ts
Streams leading allowlisted text and thinking events while retaining them for web-search scanning. The live window closes at the first non-streamable event, and terminal replay omits events already sent.
Behavior validation and documentation
tests/web-search.test.ts, tests/sidecar-settings-web-search-stream.test.ts, tests/vision-anthropic.test.ts, docs-site/src/content/docs/guides/sidecars.md, devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md
Tests cover live delivery, default buffering, tool-call boundaries, settings persistence, replay ordering, and search iterations. Documentation records the configuration and streaming behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Dashboard
  participant SettingsAPI
  participant WebSearchPlan
  participant WebSearchLoop
  participant SSEClient
  Dashboard->>SettingsAPI: Save streamRoutedModelOutput
  SettingsAPI->>WebSearchPlan: Persisted streaming setting
  WebSearchPlan->>WebSearchLoop: Resolved streaming flag
  WebSearchLoop->>SSEClient: Leading allowlisted text and thinking events
  WebSearchLoop->>WebSearchLoop: Buffer events for web-search scanning
  WebSearchLoop->>SSEClient: Deduplicated replay after tool-call boundary
Loading

Possibly related PRs

  • lidge-jun/opencodex#1155: Both PRs modify the web-search routing loop and core invocation to control upstream or model streaming behavior, but they implement different streaming policies.

Suggested reviewers: ingwannu, lidge-jun, wibias

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the opt-in web-search routed-model streaming feature and its Dashboard toggle.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

✅ READY

  • all PR quality gates passed; the review readiness checklist is complete.

Review readiness checklist

  • ✅ All CI tests are green on my local testing.
  • ✅ I pushed my PR to the latest dev commit.
  • ✅ I resolved all correct Codex and CodeRabbit findings.
  • ✅ My PR is ready for review.

4/4 boxes ticked.

This pull request is already Ready for Review.
The review-ready label marks this PR as ready; review automation runs independently. If no CodeRabbit review appears, comment @coderabbitai review to request one.
Maintainers: @lidge-jun @Ingwannu @Wibias

@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 23:02

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md`:
- Around line 42-44: Update the final sentence in the documented accepted
tradeoff to qualify the reasoning-first model claim: state that these models may
avoid pre-search text repetition, while acknowledging that leading
thinking_delta and reasoning events still become client-visible when the option
is enabled.

In `@docs-site/src/content/docs/guides/sidecars.md`:
- Around line 37-43: Update the streamRoutedModelOutput documentation near its
description to explicitly cover Kiro behavior: sidecar commentary may stream
before the terminal event, while only search-decision events remain buffered.
Preserve the existing explanation of the live window, atomic web_search
interception, and terminal replay.

In `@tests/web-search.test.ts`:
- Around line 2191-2198: Update tests/web-search.test.ts lines 2191-2198 to gate
the adapter after “prefix ”, use frameReader.readUntil to confirm that delta
reaches the client before releasing the tool call, and assert the function-call
frame precedes the replayed “suffix”. Update lines 2233-2237 to gate the first
pass after “Let me check. ”, require client receipt before allowing web_search,
and assert the post-search answer is emitted exactly once.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 52d2cbcb-0b07-40b2-a9a6-868a3ab47950

📥 Commits

Reviewing files that changed from the base of the PR and between e8db4e0 and 3393011.

📒 Files selected for processing (7)
  • devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md
  • docs-site/src/content/docs/guides/sidecars.md
  • src/server/responses/core.ts
  • src/types.ts
  • src/web-search/index.ts
  • src/web-search/loop.ts
  • tests/web-search.test.ts

Comment thread devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md Outdated
Comment thread docs-site/src/content/docs/guides/sidecars.md Outdated
Comment thread tests/web-search.test.ts Outdated
@RobinBially

Copy link
Copy Markdown
Contributor Author

Addressed all three review findings in 2e9e514:

  • tests/web-search.test.ts (major): Both the tool-boundary and the search-loop test now gate the adapter on live client receipt — the adapter withholds its tool call until the test has observed the leading delta on the wire, so a fully buffered implementation deadlocks the gate instead of passing on identical final frames. The tool-boundary test additionally asserts wire order (prefix delta → function_call item → suffix delta).
  • docs sidecars.md (minor): Added the Kiro distinction — commentary-phase text already streams ahead of the terminal event in buffered mode and is independent of the new option; only search-decision events remain buffered.
  • devlog (minor): Qualified the reasoning-first-model claim — they avoid the text-repetition case, but their leading reasoning deltas become client-visible too.

Re-verified: bun run test tests/web-search.test.ts — 55 pass / 0 fail; bun x tsc --noEmit clean.

@RobinBially
RobinBially marked this pull request as ready for review August 11, 2026 23:36
@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 23:36

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/web-search.test.ts`:
- Around line 2165-2167: Update both live-delivery tests around releaseToolCall
and releaseWebSearch so their 5-second timeout rejects or otherwise fails the
readUntil wait instead of invoking the release gate. Ensure each release
function is called only after readUntil observes the prefix, preventing buffered
terminal replay from satisfying the test.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 87c79557-80a7-4bdf-a411-f8600dc7c482

📥 Commits

Reviewing files that changed from the base of the PR and between 3393011 and 2e9e514.

📒 Files selected for processing (3)
  • devlog/_plan/260812_websearch_sidecar_live_streaming/000_findings_and_design.md
  • docs-site/src/content/docs/guides/sidecars.md
  • tests/web-search.test.ts

Comment thread tests/web-search.test.ts
@github-actions
github-actions Bot marked this pull request as ready for review August 11, 2026 23:42
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Pull request #1500 is marked ready for review. The readiness checklist is complete at 2e9e514d679f6c3732a4e6c51aca91cb95990c03.


🧠 Learnings used
Learnt from: harryzhou2000
Repo: lidge-jun/opencodex PR: 0
File: :0-0
Timestamp: 2026-08-03T12:43:51.638Z
Learning: For PR `#865`, residual full-suite shard-2 failures in server-auth WebSocket upgrade/auth statuses, active-registry WebSocket test 129, Claude Messages 502-versus-503 handling, and OpenAI compact transport reproduced on both upstream/dev commit 6a7351b4 and pre-fix merge head 528b4550 under a loaded machine. Treat these failures as pre-existing environment flakes unless a later change provides contrary evidence.

Learnt from: baileyh8
Repo: lidge-jun/opencodex PR: 1361
File: src/server/responses-custom-tool-repair.ts:117-135
Timestamp: 2026-08-10T09:36:43.941Z
Learning: In `src/server/responses-custom-tool-repair.ts`, pending SSE argument blocks preserve their original `item_id` when replayed, so an output-index collision alone does not convert one item's delta into another item's custom-tool input. In `takePendingArguments`, a pending block with an `itemId` must match only that ID. Use `outputIndex` only as a fallback when the pending block has no `itemId`, to avoid incorrect retained-budget release and recharge churn.

Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 771
File: tests/windows-tray.test.ts:70-75
Timestamp: 2026-07-31T01:24:14.745Z
Learning: For the Windows tray launcher tests in `tests/windows-tray.test.ts`, maintainers consider asserting the exact persisted UTF-16LE launcher bytes a non-blocking test-hardening improvement, not a product defect. The current build-and-BOM coverage is acceptable for the PR; a follow-up is welcome.

Learnt from: Eleven-is-cool
Repo: lidge-jun/opencodex PR: 616
File: src/adapters/openai-responses.ts:524-609
Timestamp: 2026-07-29T03:40:00.160Z
Learning: In `src/adapters/openai-responses.ts`, the top-level `tools` plus nested `input[].tools` (`additional_tools`) traversals in `preferConfiguredHostedTools` and `normalizeImageGenClientTools` intentionally retain separate implementations: the former strips configured client image-generation declarations while preserving hosted-tool selection, whereas the latter normalizes aliases and deduplicates declarations with different change-detection behavior. Do not recommend a shared traversal abstraction unless additional rewrite passes make the common behavior substantial.

Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.

You are interacting with an AI system.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions Review readiness is confirmed. I will review pull request #1500.

⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 23:43
@github-actions
github-actions Bot marked this pull request as ready for review August 11, 2026 23:47
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] Pull request #1500 is ready for review. I will review the current head.

⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 23:57
@RobinBially RobinBially changed the title feat(web-search): opt-in live streaming of routed-model output (streamRoutedModelOutput) feat(web-search): opt-in live streaming of routed-model output + Dashboard toggle Aug 12, 2026
@RobinBially
RobinBially marked this pull request as ready for review August 12, 2026 10:08
@github-actions
github-actions Bot marked this pull request as draft August 12, 2026 10:08
@RobinBially
RobinBially marked this pull request as ready for review August 12, 2026 10:10
@github-actions
github-actions Bot marked this pull request as draft August 12, 2026 10:10
RobinBially added a commit to RobinBially/opencodex that referenced this pull request Aug 12, 2026
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness checklist is complete at 175179778bdcf8a8ceba1b83aca5a56267c3a0fc. I will review pull request #1500.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions The readiness checklist is complete at 175179778bdcf8a8ceba1b83aca5a56267c3a0fc. A CodeRabbit review was already triggered for this head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.

You are interacting with an AI system.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/web-search.test.ts`:
- Around line 2165-2205: Add a sibling gated streaming test near the existing
“leading text deltas stream live” test that uses the adapter’s parseStream to
yield a thinking_delta, waits until the client observes the corresponding
reasoning SSE frame, then yields done. Assert the reasoning content is delivered
live and terminal replay does not duplicate it, while preserving the existing
completion behavior.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 4e6bbf65-4aed-4588-ae00-4fd59be1668b

📥 Commits

Reviewing files that changed from the base of the PR and between 1a08c88 and 1751797.

📒 Files selected for processing (11)
  • gui/src/i18n/de.ts
  • gui/src/i18n/en.ts
  • gui/src/i18n/ja.ts
  • gui/src/i18n/ko.ts
  • gui/src/i18n/ru.ts
  • gui/src/i18n/tr.ts
  • gui/src/i18n/zh-TW.ts
  • gui/src/i18n/zh.ts
  • src/server/responses/core.ts
  • src/types.ts
  • tests/web-search.test.ts

Comment thread tests/web-search.test.ts
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions The readiness checklist is complete at 175179778bdcf8a8ceba1b83aca5a56267c3a0fc. I will review the current pull request head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

CodeRabbit round 6: the live-window tests only covered text_delta, so a
regression that buffers or drops thinking_delta would pass. The new gated
test blocks the adapter until the client has observed the leading
response.reasoning_summary_text.delta on the wire (rejecting 5s deadline),
then asserts exactly-once delivery across the terminal replay. Requires
reasoning.summary=auto in the request — without it the parser sets
hideThinkingSummary and reasoning is never client-visible by design.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@Wibias Wibias left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review after the branch update: approved.

The blocker from my previous review is resolved. This head is now based on c125b612, and current dev is only two commits ahead (#1541 and #1548). I compared those two commits against this PR's changed-file set and there is no overlap, so the earlier integration-risk concern in responses/core, types, and the web-search tests no longer applies.

I re-checked the current live-streaming path, terminal replay accounting, sidecar-settings persistence/validation, Dashboard state merge, and the gated streaming tests. I found no correctness blocker.

CodeRabbit's current suggestion for an additional gated thinking_delta test is reasonable coverage hardening but not a blocker: all allowlisted event types use the same live-window branch in consumeIterationEvents, and the existing bridge tests already pin thinking_delta to the reasoning-summary SSE mapping. The new text-gated tests exercise the timing/replay semantics shared by that branch.

Required GitHub Actions are still showing action_required for this fork head rather than a test failure; the PR reports a full local suite of 11,310 pass / 0 fail. Merge should still follow the repository's normal required-CI policy.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness checklist and hygiene checks are complete at 175179778bdcf8a8ceba1b83aca5a56267c3a0fc. I will review pull request #1500.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions
github-actions Bot marked this pull request as draft August 12, 2026 18:25
@github-actions
github-actions Bot marked this pull request as ready for review August 12, 2026 18:29
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness checklist is complete for head 209154f68cf82d61ff1f1466a0534f744c756efe. I will review the current pull request head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@RobinBially

Copy link
Copy Markdown
Contributor Author

Heads-up on the red test 1/4 shard: the failure is inherited from current dev, not introduced by this PR.

tests/codex-convergence-contract.test.ts ("route inventory contains exactly the specified 6 + 6 + 2 + 2 convergence calls") expects 6 await convergeCodexCatalog() calls in src/server/management/provider-routes.ts, but dev @ 6c5f94a13 has 7 — the extra call was added by #1541 (fb4f2fe99, credential-free live provider reloads) without updating the contract test. This PR touches neither file; CI runs the merge ref with current dev and inherits the mismatch. On this PR's actual head (209154f68, based on c125b612) the full local suite is green (11,404 tests / 0 fail), and the contract test passes there because the 7th call isn't present yet.

Happy to absorb the fix here if you prefer, but it seems cleaner to patch the contract test (or the extra call) directly on dev.

@Wibias Wibias left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction to my approval: there is a current-base integration failure that I missed. PR #1500's own head still has the expected 6 provider-route convergence calls and passes this inventory contract, but current dev gained a seventh await convergeCodexCatalog() in provider-routes.ts from #1541's new attested provider-reload route while tests/codex-convergence-contract.test.ts still expects 6. So this is not caused by #1500, but I would not merge #1500 into the current red base until that stale inventory contract is repaired (most likely provider-routes 7 and the test title/expected map updated) and the integration suite is green.

@RobinBially

Copy link
Copy Markdown
Contributor Author

@Wibias Opened #1554 against dev with the contract repair you described: provider-routes.ts expected count 6 → 7 (map, final toEqual, and test title 7 + 6 + 2 + 2). The seventh call in #1541's attested reload route is legitimate — it converges the catalog after clearing provider caches like every sibling route — so the contract is updated rather than the call removed. Once #1554 lands, this PR's integration suite should go green without further changes here.

@github-actions
github-actions Bot marked this pull request as draft August 12, 2026 19:11
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness checklist and hygiene checks are complete at 209154f68cf82d61ff1f1466a0534f744c756efe. I will review the current pull request head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions
github-actions Bot marked this pull request as ready for review August 12, 2026 19:11
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions The readiness checklist is complete at c3e4a36dca33e2593191024459120876e8cf57dd. I will review pull request #1500.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Confirmed. The readiness checklist is complete at c3e4a36dca33e2593191024459120876e8cf57dd. A CodeRabbit review was already triggered for this head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.

You are interacting with an AI system.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The readiness checklist is complete at c3e4a36dca33e2593191024459120876e8cf57dd. I will review the current pull request head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.
⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Confirmed. The review readiness checklist is complete at c3e4a36dca33e2593191024459120876e8cf57dd. CodeRabbit review automation is already active for this head.


🧠 Learnings used
Learnt from: Wibias
Repo: lidge-jun/opencodex PR: 986
File: .github/workflows/enforce-pr-target.yml:631-636
Timestamp: 2026-08-04T06:41:30.089Z
Learning: For the PR readiness gate in `.github/workflows/enforce-pr-target.yml`, the required scope is to bind contributor checklist completion and maintainer notification to the exact PR head SHA, then reset them after a new head commit. Maintainer approval staleness is separate from this gate and should be enforced by GitHub branch protection, such as `dismiss-stale-reviews` or `require_last_push_approval`, when configured for `dev`.

You are interacting with an AI system.

@Wibias
Wibias merged commit 0a8147b into lidge-jun:dev Aug 12, 2026
46 of 48 checks passed

Wibias commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Thanks @RobinBially - this is a genuinely useful improvement. The web-search sidecar could make routed models feel like they were not streaming at all, with a long silent wait followed by one end-of-turn burst. This keeps the existing buffered behaviour as the safe default, while giving users an opt-in path to see leading text and reasoning live without weakening atomic web_search interception or duplicating terminal replay output.

The Dashboard toggle matters too: this fixes the problem where users actually encounter it instead of hiding the solution behind a config-only flag. Nice work on the gated text/reasoning tests and the end-to-end investigation as well. Thanks for the contribution!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request review-ready

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants