Skip to content

chore: closed connector write probe - #15

Closed
Wibias wants to merge 186 commits into
devfrom
test/apply-patch-code-mode-regression
Closed

chore: closed connector write probe#15
Wibias wants to merge 186 commits into
devfrom
test/apply-patch-code-mode-regression

Conversation

@Wibias

@Wibias Wibias commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Created accidentally while probing the GitHub connector write path during work on upstream PR lidge-jun#1623. No merge was intended. Closed immediately.

lidge-jun and others added 30 commits August 13, 2026 00:38
codex-rs 0.147.x desktop voice (thread/realtime/start, standalone WebSocket
transport) connects directly to /v1/realtime?intent=quicksilver&model=
(V1), /v1/realtime?model= (RealtimeV2), or /v1/live?model= (Frameless)
with no call_id. The proxy only recognized call-create POSTs and keyed
sideband joins, so these upgrades fell through to the /v1/* guard and
clients saw 'failed to connect realtime websocket: HTTP error: 404'.

- parseLiveSidebandTarget: accept standalone /v1/realtime and /v1/live
  upgrade targets (present-but-invalid call_id stays a rejected join)
- buildLiveSidebandUpstreamWsUrl: map standalone targets onto the
  canonical realtime root, preserving the client query verbatim
- sanitizeStandaloneRealtimeQuery: drop credential-shaped query params
  (access_token/api_key/token/key/...) before upstream relay
- loopback listener allowlist: admit the two standalone paths for
  WebSocket upgrades so a directly-spawned codex app-server keeps voice
- tests: parser/builder/query-policy units, standalone e2e relays for
  both paths, auth/origin guard pins, loopback admission pins

Plan: devlog/_plan/260812_realtime_standalone_ws/000_plan.md
…AVAS

Upstream codex-rs RealtimeCallClient posts Frameless API-shape
call-create to {base}/live with no AVAS query (realtime_call.rs); only
the realtime/calls inbound shape maps to the legacy keyed AVAS endpoint.
The keyed branch previously sent every inbound path to
/v1/realtime/calls?intent=quicksilver&architecture=avas, misrouting
Frameless session bodies to an endpoint that validates them as v1.
…thinking ladder

DeepSeek-V4-Pro-0813 GA (2026-08-13): the official model table marks the
Responses API for deepseek-v4-pro, the /responses reference accepts both V4
ids, and the thinking-mode table is now identical for flash and pro
(low->low, xhigh->high). Registry gains the Responses wire default +
terminal repair for v4-pro, the Pro ladder regains low, and the metadata
bundle effort maps match. Tests updated from the pinned pre-GA behavior.
* fix(codex): preserve account-scoped native model ids

* fix(codex): isolate observed account-native model ids

* docs(codex): call the row check plausibility, not provenance

Review follow-up on top of @Yuxin-Qiao's commits. The behavior is kept;
what changes is the claim made about it.

hasNativeCatalogProvenance checked only field shape — base_instructions
non-empty, comp_hash string-or-null, shell_type, a reasoning-levels array,
model_messages an object. There is no signature, source identity, or
server attestation, and models_cache.json is a user-owned file, so a
complete hand-written row passes. I reproduced that directly before
changing anything: a forged gpt-* row with those fields is accepted.

Calling that provenance is the problem, not the acceptance itself. It
grants nothing new — router.ts already routes any bare gpt-* id under an
account selector regardless of the catalog, so the effect is that a
poisoned row gets ADVERTISED through discovery, not that a new route or
credential becomes reachable. And anyone who can rewrite that cache can
already edit config.json or run ocx directly.

So the predicate is renamed to say what it does, the two docs pages drop
the provenance language, and a test pins the accepting behavior with the
reasoning attached. A future reader who wants rejection needs a real
provenance signal, not a longer list of fields to match.

The existing minimal-row test is kept and retitled: filtering malformed
rows is what this check is actually for.

---------

Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
…n#1529)

Co-authored-by: Ingwannu <ingwannu@users.noreply.github.com>
* fix(provider): clamp Xiaomi MiMo public reasoning tiers

* test(provider): record what the MiMo clamp does and does not govern

Review follow-up on top of @Ingwannu's commit. The review flagged that a
user reasoningEffortMap can lift a tier past the registry clamp, and that
is true — I reproduced it: max resolves to max, not high.

But it is the shipped contract, not an oversight. healMappedTiers treats
a wire map as authoritative evidence of the tiers an upstream can emit
and merges its Codex values into the ladder at lookup time. That is what
lets a stale persisted ladder recover a newly documented tier without
rewriting user config, and tests/reasoning-effort.test.ts pins it under
'stale reasoning-ladder self-heal'.

I first tried making the clamp win. It broke two existing tests, because
a mapped value like Kimi's  is a legitimate non-Codex wire word,
not a tier to compare against a ladder. Narrowing the clamp to Codex
tiers only still fought healMappedTiers, so I reverted it: the right
answer is that the registry clamp protects the DEFAULT route, and a user
who writes a conflicting map has deliberately opted out.

Two tests record that boundary — one for the default route where the
clamp holds, one for the overriding map — so nobody later reads the
clamp as an enforcement the code does not implement.

---------

Co-authored-by: Ingwannu <ingwannu@users.noreply.github.com>
Co-authored-by: bitkyc08-arch <bitkyc08@gmail.com>
* fix(claude): isolate native passthrough credentials

* fix(server): align Anthropic listener policy

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…ts (lidge-jun#1471)

Pins forwarded Codex credentials to the canonical ChatGPT host with a fail-closed path check, and stops the five credential-bearing sidecar fetches from following cross-origin redirects.

Bun strips Authorization across origins but forwards nonstandard headers, so chatgpt-account-id, session_id and x-codex-turn-metadata would otherwise reach a redirect target. tests/credential-redirect-guard.test.ts pins both the sidecar family and the shared fetchWithHeaderTimeout helper.

Co-authored-by: luvs01 <luvs01@users.noreply.github.com>
With the sidecar engaged, runWithWebSearch buffers every semantic adapter
event of an iteration before scanning for web_search calls, so clients see
nothing until the turn ends — 6-50s of silence, then the whole answer as
one burst, on every routed-model turn (Codex sends the hosted web_search
tool on every real turn).

New config option webSearchSidecar.streamRoutedModelOutput (default false,
behavior unchanged without opt-in): stream each iteration's leading
text/thinking deltas live; the live window closes permanently at the first
buffer-only event (tool calls above all), so web_search interception stays
atomic, live events are exactly the first N passthrough entries, and the
terminal replay skips them by count — nothing is delivered twice. Scanner
semantics (thinking extraction, forced-answer output check) are unchanged.

Verified: bun run test — 11197 pass / 0 fail (691 files); 4 new tests
including a gated adapter proving live delivery mid-turn; tsc clean.

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

Address review: both tests previously asserted only final frames, which a
fully buffered implementation also produces. They now withhold the tool
call until the test has observed the leading delta on the wire (buffered
delivery deadlocks the gate), and the tool-boundary test additionally
asserts wire order: prefix delta -> function_call item -> suffix delta.

Docs: note that Kiro commentary streaming is independent of the new option;
devlog: qualify the reasoning-first-model claim (their leading reasoning
becomes visible too — that visibility is the point).

Verified: bun run test tests/web-search.test.ts — 55 pass / 0 fail; tsc clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ad of releasing the gate

The previous 5s guard called the adapter's release function on timeout, so a
fully buffered implementation could still pass: the timer opens the gate, the
terminal replay delivers the leading delta, and readUntil observes the replayed
copy. The deadline now rejects the readUntil wait; the gate opens only after
the client has genuinely observed the live delta.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oggle on the overview page

GET/PUT /api/sidecar-settings now carry webSearch.streamRoutedModelOutput
(boolean; false is the default and removes the key so config files stay
minimal), and the web-search sidecar card on the Dashboard overview gains a
"Stream answers live" switch so the option is discoverable without editing
config.json. Strings added to all eight locales.

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

Swept in by a bulk add; the follow-up devlog in
260812_websearch_sidecar_live_streaming stands on its own.

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

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

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rt durable persistence

CodeRabbit round 4: the dashboard hint implied the whole turn streams — reworded
in all eight locales to say leading text/reasoning streams until the model
decides on a tool call, with the rest buffered for search interception. The
sidecar-settings test now reloads the config from disk after each PUT and
asserts the flag survives (true persists, false removes the key); the fixture
gained a schema-valid provider because loadConfig() discards invalid files
wholesale, which would have voided the reload assertions.

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

Replaces credential-bearing live provider updates with an attested bodyless POST /api/providers/reload, binding a single-use capability to provider, method, exact path, nonce, PID, port and expiry, verified with timingSafeEqual.

Also reports a reload the running proxy could not accept, so a CLI talking to a pre-attestation proxy no longer prints unconditional success while the live process keeps the previous credential.

Co-authored-by: luvs01 <luvs01@users.noreply.github.com>
Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Adds an experimental, config-only recovery path for native Codex v2 NEW_TASK messages whose payload is backend-encrypted. Disabled by default; when enabled it accepts only a native Codex ChatGPT credential from a loopback caller and sends it only to the compiled-in ChatGPT Codex endpoint, with redirect: error.

Recovered plaintext is barred from the persisted continuation cache: recovery mutates the request input in place, so the body would otherwise have been written to responses-state.json with no TTL.

Co-authored-by: soulbah <soulbah@users.noreply.github.com>
…-jun#1541

Also records the lidge-jun#1302 reproduction seen while running campaign CI: three
spinning bun test processes, State R with wchan 0, growing epoll/eventfd
counts, and an open SQLite journal — diagnosis only, the issue stays open.
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>
…attested reload call

lidge-jun#1541 (fb4f2fe) added a seventh 'await convergeCodexCatalog()' to
provider-routes.ts in the new attested credential-free provider-reload
route, but the inventory contract still expected 6, leaving dev CI red
for every open PR. Update the expected count and test title to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ntract-provider-reload

test(codex-convergence): update route inventory for lidge-jun#1541's attested reload call
Wibias added 24 commits August 13, 2026 23:15
@Wibias Wibias closed this Aug 14, 2026
@github-actions github-actions Bot added the intake: hygiene-blocked Deterministic PR hygiene checks failed label Aug 14, 2026
@github-actions

Copy link
Copy Markdown

⚠️ Deterministic hygiene checks failed.

  • new_suppression — A new TypeScript, lint, formatter, or similar suppression was added. Fix the underlying issue or obtain suppression-approved. Paths: gui/src/components/CodexPoolStrategySetting.tsx, gui/src/components/provider-workspace/ProviderAuthPanel.tsx, gui/src/pages/Models.tsx, gui/src/use-app-route-state.ts.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown

⏳ DRAFT

  • PR description needs work (thin). UI screenshot required. hygiene: new_suppression.

What to do

  • Add a real Summary and Test plan to the PR description.
  • Add a screenshot of the UI change to the PR description.
  • Fix new_suppression — A new TypeScript, lint, formatter, or similar suppression was added. Fix the underlying issue or obtain suppression-approved. Paths: gui/src/components/CodexPoolStrategySetting.tsx, gui/src/components/provider-workspace/ProviderAuthPanel.tsx, gui/src/pages/Models.tsx, gui/src/use-app-route-state.ts.

This pull request was already a draft. Its draft status will be preserved after every issue above is resolved.

@Wibias Wibias changed the title __probe__ chore: closed connector write probe Aug 14, 2026
@github-actions github-actions Bot added the chore label Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore intake: hygiene-blocked Deterministic PR hygiene checks failed

Projects

None yet

Development

Successfully merging this pull request may close these issues.