Skip to content

feat: land six repaired cherry-picks (MiniMax, picker order, terminal guard, streamAborted, imageInput, droid docs) - #1744

Merged
lidge-jun merged 24 commits into
devfrom
int/260815-old-drafts
Aug 15, 2026
Merged

feat: land six repaired cherry-picks (MiniMax, picker order, terminal guard, streamAborted, imageInput, droid docs)#1744
lidge-jun merged 24 commits into
devfrom
int/260815-old-drafts

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Summary\n\nLands six repaired cherry-picks from old draft PRs (triage: devlog/_plan/260815_old_draft_triage/). Contributor commits were cherry-picked with authorship preserved, then repaired per review findings; each repair branch was reviewed independently (PASS after one folded blocker):\n\n- #1664 MiniMax Code/CLI integration (+ shared standalone-aware self-launch argv helper, migrating 12 launcher call sites incl. update/job, update/notify, system-restart)\n- #1669 modelPickerOrder (+ fail-soft malformed-config normalization, docs fix)\n- #1660 opt-in terminal guard for openai-chat (+ explicit-false and combo/compaction exclusion tests, docs)\n- #1652 streamAborted usage marker (+ eager/WS path coverage, cancellation race fix)\n- #1165 combo imageInput control (+ tr/zh-TW locale keys, CLI round-trip, anti-double-expansion regression lock)\n- #1644 Factory Droid bridge guide (+ provider-id/contract repairs, EN+KO)\n\n## Verification\n\n- Remote full gates on ssh lidge @ b05c494 (this branch tip): 12259 pass / 11 skip / 0 fail (12270 tests, 781 files); typecheck, privacy:scan, lint:gui all green.\n- Independent repair review: GO-WITH-FIXES -> blocker (2 missed launcher sites) fixed in 2f276eb and re-verified PASS by the same reviewer.\n\n## Checklist\n\n- [x] Targets dev\n- [x] No token/secret logging added\n- [x] Regression tests included for every behavior change

Summary by CodeRabbit

  • New Features
    • Added MiniMax Code integration and MiniMax CLI text workflows, including secure loopback bridging and configuration export.
    • Added combo image-input controls with automatic capability detection or forced text-only mode.
    • Added display-only model picker ordering and an optional terminal continuation guard for OpenAI Chat.
  • Bug Fixes
    • Improved stream-abort and cancellation tracking.
    • Preserved combo image-input settings during updates.
  • Documentation
    • Added Factory Droid, MiniMax, combo, model-ordering, and localized integration guides.

heomin86 and others added 24 commits August 15, 2026 15:21
Port the codex-router #139 streamAborted metering marker: when an upstream
stream dies after its 200 head was committed, the persisted usage attempt
now carries streamAborted: true alongside the synthetic 502 terminal so the
turn never meters as a success the client did not receive.

- usage/log.ts: optional streamAborted on PersistedUsageAttempt, whitelisted
  in normalizeUsageAttempt (only the literal true marker survives the round
  trip; ordinary and legacy rows keep their exact shape).
- relay.ts: set the marker on consumeForInspection's mid-stream read-failure
  path (failed/502) and on trackSseForRequestLog's read-failure path
  (incomplete/502). Client-cancel (499) semantics are untouched and never
  carry the marker.
- tests: usage-log.test.ts gains persistence/backward-compat coverage;
  stream-aborted-marker.test.ts drives the relay paths end to end through
  addFinalRequestLog to the persisted JSONL row.
…er order

Large routed catalogs (10-20+ models across several providers) have no
supported way to control the Codex model-picker display order beyond the 5-slot
subagentModels list: every non-featured routed row is emitted at the same flat
priority, so the picker order is undefined and reshuffles on each catalog
rebuild (ocx sync / service restart / upgrade).

Add an optional, display-only config.modelPickerOrder: string[]. Listed routed
<provider>/<model> slugs are shown in array order in the picker; unlisted rows
and subagentModels-featured rows keep their positions. When unset, catalog
priority is byte-identical to before (the codex-catalog golden oracle is
unchanged).

Display and spawn_agent candidacy are fully decoupled: modelPickerOrder rewrites
only the Codex-visible `priority`, while each moved row records its natural
priority in an OpenCodex-private catalog field (opencodex_spawn_priority) that
effectiveSubagentRoster uses to pick candidates. The spawn_agent candidate set
is therefore provably unchanged by any display reordering — even reversing every
row. Codex ignores the unknown field (same as opencodex_catalog_kind), so this
is purely a user-facing picker feature.

Fixes #1649
Per-combo image/multimodal policy: default auto keeps the target
intersection; disabled strips image from catalog modalities and rejects
image-bearing requests (including previous_response_id expansions) with
HTTP 400 before dispatch. Management API sparsifies only explicit
disabled. GUI exposes a capability switch when every target supports
images.
Fail closed for incomplete targets in comboImagesSupported; omit default
imageInput auto from management GET/PUT responses; reject unresolved
previous_response_id when images are disabled; cover disabled draft
persistence and normalizedCombo fixture.
Restrict image-disabled detection to materialised Responses input after
previous_response_id expansion so tool schemas and metadata cannot false-
positive HTTP 400. Treat unresolved continuations by object identity,
strip previous_response_id after a successful expand to avoid double
replay on child dispatch, and align docs with capability-intersection
wording.
…ai-chat providers

The no-tool-call terminal continuation guard (#394) is bound to the
anthropic adapter only. Self-hosted OpenAI-compatible gateways
(GLM/Kimi-family, etc.) routed through openai-chat hit the same
premature-completion pattern -- the model announces work but ends the
turn without emitting a tool call -- yet never get the bounded re-ask,
so they stop mid-work.

Extend the guard to openai-chat, gated behind a new per-provider
opt-in flag `terminalContinuationGuard`. Default behavior is unchanged:
anthropic keeps the guard, and the many registry providers sharing the
openai-chat adapter stay off unless a provider explicitly enables it
(the suspicious-no-tool-stop heuristic in analyzeTerminalTurn was tuned
on Anthropic turns, so opt-in is the conservative default).

Fixes #1651
…e path

Address CodeRabbit review on #1660: add server-level integration coverage that
exercises the openai-chat guard flag through handleResponses/core.ts rather than
only passing adapterName to guardTerminalEventStream.

- unset/absent terminalContinuationGuard on an openai-chat provider => no
  continuation (exactly one upstream call).
- terminalContinuationGuard: true => one bounded continuation (two upstream
  calls) and the recovered tool call is forwarded.

The existing anthropic combo-attempt and routed-compaction exclusions are
unchanged and still covered by the surrounding suite.
@lidge-jun
lidge-jun merged commit 656376f into dev Aug 15, 2026
11 of 13 checks passed
@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 15, 2026
@coderabbitai

coderabbitai Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8e870229-3dcc-434c-8c26-ae1c632306b0

📥 Commits

Reviewing files that changed from the base of the PR and between 420db62 and b05c494.

⛔ Files ignored due to path filters (1)
  • docs-site/public/screenshots/minimax-code-integration.png is excluded by !**/*.png
📒 Files selected for processing (83)
  • docs-site/astro.config.mjs
  • docs-site/src/content/docs/guides/combos.md
  • docs-site/src/content/docs/guides/factory-droid.md
  • docs-site/src/content/docs/guides/integrations.md
  • docs-site/src/content/docs/guides/minimax.md
  • docs-site/src/content/docs/guides/model-ordering.md
  • docs-site/src/content/docs/ko/guides/factory-droid.md
  • docs-site/src/content/docs/reference/configuration/providers.md
  • docs-site/src/content/docs/reference/configuration/routing.md
  • docs-site/src/content/docs/tr/guides/integrations.md
  • docs-site/src/content/docs/zh-cn/guides/combos.md
  • docs-site/src/content/docs/zh-cn/reference/configuration/routing.md
  • docs-site/src/content/docs/zh-tw/guides/integrations.md
  • gui/src/combo-capabilities.ts
  • gui/src/combo-workspace-data.ts
  • gui/src/components/apikeys-workspace/client-config-clients.ts
  • gui/src/components/combo-workspace-add-modal.tsx
  • gui/src/components/combo-workspace-controls.tsx
  • gui/src/components/combo-workspace-detail-panel.tsx
  • gui/src/components/combo-workspace-types.ts
  • 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
  • gui/src/pages/Combos.tsx
  • gui/src/pages/Integrations.tsx
  • gui/src/pages/integrations/FileIntegrationPage.tsx
  • gui/src/pages/integrations/integration-api.ts
  • gui/src/pages/integrations/overview-clients.ts
  • gui/src/styles-combos-workspace.css
  • src/cli/claude.ts
  • src/cli/combo.ts
  • src/cli/dispatch.ts
  • src/cli/export-command.ts
  • src/cli/help.ts
  • src/cli/index.ts
  • src/cli/minimax.ts
  • src/cli/opencode.ts
  • src/cli/registry.ts
  • src/clients/config-export.ts
  • src/codex/catalog/aggregation.ts
  • src/codex/catalog/sync.ts
  • src/codex/convergence.ts
  • src/combos/index.ts
  • src/combos/request.ts
  • src/combos/types.ts
  • src/integrations/registry.ts
  • src/lib/self-launch-argv.ts
  • src/server/management/combo-routes.ts
  • src/server/management/system-restart.ts
  • src/server/relay.ts
  • src/server/responses/core.ts
  • src/server/responses/terminal-guard.ts
  • src/types.ts
  • src/update/index.ts
  • src/update/job.ts
  • src/update/notify.ts
  • src/usage/log.ts
  • structure/01_runtime.md
  • structure/04_transports-and-sidecars.md
  • tests/cli-export-command.test.ts
  • tests/cli-headless-parity.test.ts
  • tests/client-config-export-new-clients.test.ts
  • tests/client-config-export.test.ts
  • tests/codex-catalog-model-picker-order.test.ts
  • tests/codex-catalog.test.ts
  • tests/combo-management-api.test.ts
  • tests/combo-workspace-data.test.ts
  • tests/combos.test.ts
  • tests/integrations-invariants.test.ts
  • tests/integrations-state.test.ts
  • tests/minimax-clients.test.ts
  • tests/self-launch-argv.test.ts
  • tests/server-combo-failover-e2e.test.ts
  • tests/stream-aborted-marker.test.ts
  • tests/terminal-guard-server.test.ts
  • tests/terminal-guard.test.ts
  • tests/update-stop-first.test.ts
  • tests/ws-upstream.test.ts

📝 Walkthrough

Walkthrough

This change adds MiniMax Code and MiniMax CLI support, combo image-input configuration, display-only model ordering, terminal continuation handling, stream-abort metering, self-launch argument construction, GUI controls, documentation, localization, and tests.

Changes

Runtime and integration features

Layer / File(s) Summary
Combo image-input handling
src/combos/*, src/server/management/combo-routes.ts, src/server/responses/core.ts, src/codex/catalog/aggregation.ts, src/cli/combo.ts
Combos now support imageInput: "auto" or "disabled". Disabled combos remove image capability and reject image requests before dispatch.
MiniMax clients
src/cli/minimax.ts, src/clients/config-export.ts, src/integrations/registry.ts, src/cli/registry.ts
MiniMax Code and MiniMax CLI text workflows use managed configuration, loopback validation, isolated credentials, translated requests, streaming, and cleanup.
Model picker ordering
src/codex/catalog/sync.ts, src/codex/convergence.ts, src/types.ts
modelPickerOrder changes routed-model display order without changing spawn_agent candidates or priorities.
Response state handling
src/server/relay.ts, src/server/responses/core.ts, src/server/responses/terminal-guard.ts, src/usage/log.ts
Upstream stream failures record streamAborted. An opt-in terminal continuation now supports openai-chat streams.
Self-launch execution
src/lib/self-launch-argv.ts, src/cli/*, src/server/management/system-restart.ts, src/update/*
Detached subprocesses now build launch arguments through selfLaunchArgv.

GUI and documentation

Layer / File(s) Summary
Combo capability controls
gui/src/combo-capabilities.ts, gui/src/components/combo-workspace-*, gui/src/pages/Combos.tsx
The GUI derives image support from selected model modalities and exposes an automatic/disabled capability switch.
MiniMax integration UI
gui/src/pages/Integrations.tsx, gui/src/pages/integrations/*, gui/src/components/apikeys-workspace/*, gui/src/i18n/*
MiniMax Code is registered as an integration and export client with localized labels.
Guides and references
docs-site/src/content/docs/guides/*, docs-site/src/content/docs/reference/configuration/*, structure/*
Documentation covers Factory Droid, MiniMax clients, combo image input, model picker ordering, terminal continuation, and loopback bridge behavior.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested labels: documentation

Suggested reviewers: ingwannu, wibias

✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch int/260815-old-drafts

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 15, 2026

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • PR description needs work (escaped_newlines). UI screenshot required.

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.

Automatic draft conversion failed (token cannot change draft status). Please convert this pull request to a draft manually. The required enforce-target check will keep failing until every issue above is resolved.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants