Skip to content

merge: upstream a5b56b7 (#444 system prompt, #443 locale tests, #435 cron week, #434 deferred rebuild) - #112

Merged
tournierjc merged 44 commits into
mainfrom
merge/upstream-1852771
Oct 8, 2026
Merged

tournierjc merged 44 commits into
mainfrom
merge/upstream-1852771

Conversation

@tournierjc

@tournierjc tournierjc commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Sync upstream a5b56b7 (tip 2026-10-08)

Fetched MiniMax-AI/minimax-code main. Tip a5b56b75c7fde5e170c52ba9f79ca18aa960acd8. La PR rolling #112 passe de 4401b0e à a5b56b7 (merge complet, pas cherry-pick : l'historique upstream est absorbé via un merge commit 583fe89, adapté au squash-history du fork).

Commits pris (delta depuis 4401b0e)

Les 4 commits sont pris, du plus ancien au tip :

Commits bloqués / skippés

Aucun commit entier. Adaptations à l'intérieur des commits pris :

  • Version (feat: add launch-scoped system prompt overrides and fix Ask/Plan turn settlement (0.6.3) MiniMax-AI/minimax-code#444) : le bump amont 0.6.2 → 0.6.3 n'est pas pris. Identité conservée : kinetick-code / @mavis/code 0.6.9.
  • Rename : exemples et commentaires nouveaux (docs/tui-capabilities.md, system-prompt-options.ts, invocation.ts) passés de mcode à kcode. Description ACP : « Kinetick Code ». MINIMAX_CODE_VERSION / MINIMAX_CODE_DEFAULT_AGENT_NAME / schedulePendingMcodePrefixUpdate / MCODE_TUI_RESULT_PATH_ENV remplacés par les symboles fork (KCODE_VERSION, KCODE_DEFAULT_AGENT_NAME, schedulePendingKcodePrefixUpdate, KCODE_TUI_RESULT_PATH_ENV). bin.mcode non réintroduit.
  • Télémétrie : l'import McodeTelemetryCliAction (telemetry-command.ts, absent du fork) revenu dans le hunk CLI de feat: add launch-scoped system prompt overrides and fix Ask/Plan turn settlement (0.6.3) MiniMax-AI/minimax-code#444 est retiré. error-reporting-privacy.test.ts et telemetry-command.ts ne rentrent pas dans release/public-source.json. Suites daily-checkin / update-service / analytics non réintroduites. Pas de check-in (TuiDailyCheckin*) dans ce delta.
  • Exclusif MiniMax : rien de produit-gated ou de canal de mise à jour MiniMax-only dans ces 4 commits.

Garde-fous

  • Télémétrie : egress default-deny intact (check:egress OK, installTuiEgressGuard). docs/telemetry.md absent. packages/tui/src/analytics/ absent.
  • Identité fork : kinetick-code 0.6.9 (package.json + packages/tui @mavis/code). Fournisseurs, OAuth et outils fork conservés (parseServerPort / --server, runMcpTrust, createKcodeSharedAuthSession).
  • Source-sync : Fix locale-dependent capability tests MiniMax-AI/minimax-code#443 est appliqué par-dessus la suite fork (elle attend bin.kcode, pas bin.mcode). 56 pass / 0 fail.

Conflits et résolutions (11 fichiers)

Vérifications locales (branche 583fe89)

  • typecheck : RC=0.
  • build : RC=0 (6411 fichiers, Kinetick Code 0.6.9).
  • Vitest --config vitest.oss.config.mjs : system-prompt + cron + headless-invocation + run-coordinator + egress 128/128 ; engine-local-deltas + shell-block + background-work-panel + chat-controller 241/241 ; tui-app + acp + headless-contract + provider-manager + session-cost + image-limit + compact-context + checkpoint + command/feature-flow + literal-text + stale-run + llm-retry + catalogs 798/798.
  • node --test test/smoke.test.mjs : 20 pass / 0 fail (1 skip). test:byok : 5 pass / 0 fail. source-sync : 56 pass / 0 fail (1 skip Windows). check:egress OK, check:source OK (4372). Arbre sans node_modules ni marqueurs de conflit.
  • windows-contract : non relancé. L'échec MODULE_NOT_FOUND wsl-path.js est préexistant sur origin/main, hors scope.

CI GitHub (583fe89, 18 checks, 0 échec)

  • success : changes, verify (ubuntu-latest, 24), verify (macos-latest, 24), verification, build, install sur ubuntu 22.19.0 / 24.2.0 / 25 / 26 et macOS 22.19.0 / 24.2.0 / 25 / 26, source-history-artifact, performance.
  • skipped (attendu) : docs (pas un diff docs-only), gate et publish (pas un push sur main).

La PR n'est pas mergée.

AdhereZ and others added 30 commits September 25, 2026 19:55
Co-authored-by: minimax <adhere@minimaxi.com>
Preserve public privacy defaults and distribution boundaries while porting compaction, Bash timeout, memory output and update-proxy improvements. Record selective provenance without advancing the full source baseline.

Assisted-by: codex-cli reason:public-source-sync-0.5.5
…-AI#360)

* docs: publish feedback and private security contact channels

* docs: correct MiniMax Agent X contact link
…-AI#375)

Include context window and effort controls in the first-run catalog while preserving existing managed snapshots.

Docs-Impact: Existing model selection workflow is unchanged.

Assisted-by: codex-cli reason:m31-flash-fallback-sync
* chore: bump version to 0.5.7

* test: drain stderr before nonzero Bash fixture exit
…x-AI#381)

Port the reviewed shared runtime behavior while retaining standalone composition. Keep conversation leave separate from explicit stop, suppress canceled task delivery, and track append activations through teardown.


Assisted-by: codex-cli reason:selective-runtime-port
Docs-Impact: document stop and session-leave behavior in docs/tui-capabilities.md

Co-authored-by: chenhao <chenhao@minimaxi.com>
…niMax-AI#385)

* feat(examples): add reproducible Pocket Pet demo and refresh onboarding

* feat(examples): polish Pocket Pet interaction and demo
…x-AI#389)

* fix(tui): preserve native scrollback during projection updates

* fix(tui): isolate transient overlays from native scrollback
…I#390)

* fix(tui): prevent idle transcript replay and diff overlay frames

* fix(tui): retain prompt identity and deferred main-buffer geometry
…budget (MiniMax-AI#397)

* test(sandbox): pin the probe PATH instead of inheriting the ambient one

The real sandbox-exec probes resolve their command through PATH, so
inheriting the caller's let any wrapper ahead of /bin decide what `rm`
means. On a machine that has run the agent, that is the recoverable-delete
shim MCode installs into agent shells: `rm` resolves to the shim, the shim
execs mavis-trash, the sandbox denies that trash move as a write outside
the policy under test, and a correct allow-probe exits 1. The suite then
reports a sandbox regression where the sandbox behaved correctly.

Pin all three probe environments to the system binaries the probes
actually use, matching the wrapper-argument test above them. This also
drops the unguarded `process.env.PATH` in wrapProfile, which had no
fallback and could hand a real sandbox spawn an undefined PATH.

Fixes MiniMax-AI#394.

* test(byok): scale the serial BYOK budget by platform

The first case is 30+ serial CLI spawns, each booting the whole runtime,
so its wall-clock cost tracks machine speed rather than the transport it
asserts. The flat 90s budget only held with roughly 1.5x headroom on an
idle machine, so a parallel build, a laptop under load, or a shared CI
runner turned a passing transport into a `testTimeoutFailure` that named a
product failure no assertion had actually observed.

Budget it the way smoke.test.mjs already budgets runtime startup: a base
allowance plus a Windows multiplier for slower process spawn. The test is
not slowed down by a larger ceiling; it only stops failing for reasons
unrelated to what it checks.

Fixes MiniMax-AI#395.
TUI
- Report active root-session background tasks as `background=N` in the
  `[V]` build-mode status line. Bash still owned by its foreground tool
  call is excluded, and the count holds at 1 after a turn settles until a
  fresh task list arrives. The documented minimum width is now 102 columns.

Runtime
- The MiniMax API-key route now shares the official model catalog with the
  managed route; the first-run catalog moves to `minimax-model-catalog.ts`
  with unchanged model definitions.
- Apply byte limits to large media and accumulated history for BYOK requests.
- Send the M3 thinking toggle as a thinking setting rather than a generic
  reasoning effort.
- Allow edit and rewind after an interrupt that left only a background
  reminder in canonical history.
- Read less data when listing session files and navigating long histories.
- Measure token output rate from the time events are observed.
- Add `worktreeRefreshBeforeCreate` (default on) to fetch the selected
  upstream before creating a worktree, and exclude nested roots from fork
  worktree fingerprints.
- Add Ghostty to the external editor catalog.
- Enable the Codex OAuth model settings entry by default.

Prompts
- Cron guidance now lives only in tool definitions; the legacy feature
  template is empty. Memory edits use the `memory` tool's `edit` operation.
- Clarify multimodal tool discovery in the mcode-tools reminder.
…seline (MiniMax-AI#396)

* Revert "fix(tui): stabilize native history and diff overlay frames (MiniMax-AI#390)"

This reverts commit 1e136bf.

* Revert "fix(tui): preserve native scrollback during automatic updates (MiniMax-AI#389)"

This reverts commit 9b9c07b.
* fix: include hidden thinking in TPS timing

* docs: note thinking_start in first token timing comment

* test(windows): allow the NTFS source check to exceed the default timeout

---------

Co-authored-by: hetaoBackend <hetao7@pku.edu.cn>
* fix: omit empty tools on OpenAI compaction requests

* fix: negotiate missing tools with bounded compatibility recovery

* fix: simplify empty tools handling to omit absent definitions
…AI#416)

Regular mode wrote rows into native scrollback as soon as they scrolled
off screen. When such a row later changed (a parallel tool finishing, a
streamed table widening, a list turning loose, a turn growing past the
projection fold, the welcome status badge flipping, or a stopped prompt
gaining its cancelled marker), the renderer cleared scrollback and
replayed the whole session from the welcome logo.

Only final rows now reach native history:

- The transcript reports how many leading rows later updates cannot
  change, including the committed blocks of a streaming Markdown reply.
- The chat layout keeps rows that may still change within one screen
  above the footer, showing their latest rows under a one-line notice
  when they do not fit.
- The regular-mode projection only appends; established turns are not
  re-folded or dropped.
- The welcome banner above a conversation is static; account notices
  that need action appear above the Composer.
- Stopping a run no longer marks its delivered prompt as cancelled; the
  marker stays reserved for prompts returned to the Composer.

To keep long sessions responsive, the transcript drops final rows far
above the screen and the engine rebases its retained state
(takeDiscardedRows) instead of rewriting history.
Port the reviewed 0.6.0 runtime and TUI behavior into the standalone
distribution and bump the release version to 0.6.0.

- Allow /retry inside a /btw side conversation to resend its last message.
- Default to MiniMax-M3.1-Flash-Preview when no model has been selected.
- After an accepted Goal completion, keep the Turn open for one final reply
  that summarizes the result and deliverables; blocked proposals still end
  the Turn.
- Do not retry provider safety refusals, including on BYOK, and classify
  them as content_filter; keep Anthropic refusal details in the error.
- Retry TLS record verification failures before output like other
  transient network errors.
- Keep a post-compaction reminder at the tail of a continuation instead of
  aborting the provider call and recompacting on every retry.
Allow /doctor and /feedback in a /btw side conversation so a failed side
response can be diagnosed or reported without leaving it. Neither command
mutates the parent or side Session. /quit stays blocked in the side view,
because leaving from there aborts only the side Turn and skips side
Session cleanup.

Bump the root and TUI source versions to 0.6.1.
…x-AI#423)

In a /btw side conversation, an empty Escape no longer arms the
double-Escape /edit shortcut or shows its "Press Esc again to edit"
hint, since /edit is unavailable in side conversations. Escape still
interrupts a live side response.

Switching between the side and main views re-adopted the main Session's
live Turn at the switch time, which reset the Running/Loading timer and
shortened the settled Turn duration. A Turn start ledger now records the
earliest observed start (submission, session.start events including
hidden Sessions, and adoption), and both re-adoption and the activity
line use it.

Bump the root and TUI source versions to 0.6.2.
dependabot Bot and others added 9 commits October 4, 2026 19:56
…y with 6 updates (MiniMax-AI#363)

Bumps the tooling-minor-patch group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prettier](https://github.com/prettier/prettier) | `3.9.6` | `3.9.9` |
| [tsx](https://github.com/privatenumber/tsx) | `4.23.13` | `4.23.15` |
| [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) | `5.5.5` | `5.5.6` |
| [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | `18.3.1` | `18.4.0` |
| [jscpd](https://github.com/kucherenko/jscpd/tree/HEAD/rust/jscpd) | `5.2.1` | `5.3.3` |
| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.35.1` | `6.38.0` |



Updates `prettier` from 3.9.6 to 3.9.9
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.9.6...3.9.9)

Updates `tsx` from 4.23.13 to 4.23.15
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](privatenumber/tsx@v4.23.13...v4.23.15)

Updates `eslint-plugin-prettier` from 5.5.5 to 5.5.6
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/eslint-plugin-prettier@v5.5.5...v5.5.6)

Updates `dependency-cruiser` from 18.3.1 to 18.4.0
- [Release notes](https://github.com/sverweij/dependency-cruiser/releases)
- [Changelog](https://github.com/sverweij/dependency-cruiser/blob/main/CHANGELOG.md)
- [Commits](sverweij/dependency-cruiser@v18.3.1...v18.4.0)

Updates `jscpd` from 5.2.1 to 5.3.3
- [Release notes](https://github.com/kucherenko/jscpd/releases)
- [Commits](https://github.com/kucherenko/jscpd/commits/v5.3.3/rust/jscpd)

Updates `knip` from 6.35.1 to 6.38.0
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.38.0/packages/knip)

---
updated-dependencies:
- dependency-name: dependency-cruiser
  dependency-version: 18.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: tooling-minor-patch
- dependency-name: eslint-plugin-prettier
  dependency-version: 5.5.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tooling-minor-patch
- dependency-name: jscpd
  dependency-version: 5.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: tooling-minor-patch
- dependency-name: knip
  dependency-version: 6.37.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: tooling-minor-patch
- dependency-name: prettier
  dependency-version: 3.9.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tooling-minor-patch
- dependency-name: tsx
  dependency-version: 4.23.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tooling-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…timeouts (MiniMax-AI#428)

* fix: bound hung model requests so the retry path runs (MiniMax-AI#425)

A provider that accepts a request but never sends a response held the
turn for the transport default (undici headers timeout, ~300 s) before
the existing retry path ran. During that window the TUI showed Loading,
queued follow-ups, and /retry and /goal clear appeared to do nothing.

- agent-core: wrap every physical model request (each withLLMRetry
  attempt, agent and compaction scopes) in a stream watchdog. No first
  event within 120 s, or no event for 300 s after the first, aborts the
  attempt and ends the stream with a retryable "LLM request timed out"
  error (stopReason "error", not "aborted"), so BYOK and managed
  providers retry it. Caller aborts pass through unchanged. Bounds are
  configurable via LLMModelConfig.firstEventTimeoutMs /
  streamIdleTimeoutMs or MCODE_LLM_FIRST_EVENT_TIMEOUT_MS /
  MCODE_LLM_STREAM_IDLE_TIMEOUT_MS (0 disables).
- tui: /retry during a live run now says "Stop the running turn before
  using /retry." instead of "There is no failed response to retry";
  /goal clear and /goal pause during a live run say the current response
  keeps running and that Esc interrupts it.
- Tests: never-responding fake provider and real HTTP server that
  accepts but never answers; the attempt fails within the bound, retries
  and recovers, a fully hung turn fails and the next turn on the same
  runner completes. Document the bounds in docs/tui-capabilities.md.

* fix: keep prior first-response wait and stop reading abandoned streams (MiniMax-AI#425)

Review follow-up for the model request timeouts:

- Default the first-event bound to 300 s, matching undici's headers
  timeout that was the effective previous wait, so no request that used
  to succeed now times out. The idle bound stays at 300 s.
- Timeout errors name the setting that fired
  (MCODE_LLM_FIRST_EVENT_TIMEOUT_MS or MCODE_LLM_STREAM_IDLE_TIMEOUT_MS,
  or the host's per-model firstEventTimeoutMs/streamIdleTimeoutMs).
- When a bound fires, the wrapper stops waiting on the inner stream even
  if the provider ignores the abort: the pending read races a stop
  signal, and the inner iterator is released without being awaited.

Refs MiniMax-AI#425

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
…#429)

* fix(tui): keep scrolled-up readers in place on output-driven redraws (MiniMax-AI#426)

The regular-mode history reconstruction (L034) clears scrollback with
ED 3 and replays the document. xterm.js keeps its scrolled state while
the scrollback is rebuilt, so a reader who had scrolled up was moved to
line 0 whenever a resize settled (for example a fit addon reacting to a
layout change) or a transient layout shrank while a reply streamed.

Output-driven reconstructions now wait for the next user input, when
terminals scroll back to the bottom:

- TuiBase reports key and paste input through a protected onUserInput()
  hook; focus, size, mode and kitty-flag reports and key releases do not
  count.
- A settled resize replays history only if input arrived after the
  resize notification; otherwise it finishes as an in-place viewport
  redraw and the replay is deferred.
- A shrink in an unknown or changed layout pads like L038 unless input
  arrived within the last second (input-driven closes still restore
  rows immediately), and the replay is deferred.
- The next input after the deferral, or stop(), runs the deferred
  replay, so native history ends up exact and unique as before.

Changed historical text and size changes without a resize notification
still reconstruct immediately. Recorded as L047 in LOCAL_CHANGES.

* fix(tui): limit scroll preservation to output-driven layout shrink (MiniMax-AI#426)

Review follow-up:

- Resize again replays history as soon as it settles, as on main. The
  resize deferral is split out until the reporter's fit/resize behaviour
  is known; only the output-driven layout-shrink deferral remains (pad
  with blank rows, reconstruct on the next user input, immediately
  within one second of input).
- User input detection splits each chunk into control sequences instead
  of matching the whole chunk. Cursor position reports, OSC/DCS/APC
  strings and SGR mouse reports join focus, window, device and mode
  reports and key releases as non-input, and a key or paste that shares
  a chunk with reports still counts.
- Tests cover a tailing reader when output ends and the task list
  collapses, recent input reconstructing immediately, resize keeping its
  replay, each report kind, report-only and mixed chunks, and the replay
  before stop. L047 is updated accordingly.

Refs MiniMax-AI#426

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
… provider image limit (MiniMax-AI#431)

* fix(images): cap images per request and recover sessions over the provider limit

Inline images stay in persisted history and every request re-sends the
whole provider-visible history, so a long session eventually exceeded the
provider's per-request image limit ("Too many images in request: 31 > 30").
Every later request, /retry, /compact and a restarted session then failed
the same way, each after the full BYOK retry window, behind a generic
"temporarily unavailable / Run /retry" message.

- Request-time image ceiling: projectAgentMessagesForModel keeps the newest
  N images across user messages and tool results and replaces older ones
  with a short placeholder naming the original file. Stored history is
  never rewritten. N comes from capabilities.max_images_per_request
  (default 20; api.mistral.ai defaults to its documented 8). Agent turns,
  checkpoint requests and footprint estimates share the projection.
- Deterministic rejections are terminal: an image-count rejection, or an
  HTTP 400 invalid_request_error, is no longer retried by the BYOK
  retry-all path (timeouts, network, 408/429/5xx stay retryable). The TUI
  shows the upstream reason and suggests /compact or /new instead of /retry.
- Compaction fallback: when the checkpoint Provider rejects a candidate for
  too many images, compaction retries the same history with media replaced
  by text (Hvideo) and continues down the attachment-free ladder.

Refs MiniMax-AI#425

* fix(images): parse attachment reminder paths with a linear scan

CodeQL flagged the attribute regular expression as polynomial on
user-controlled message text (js/polynomial-redos). Parse the attachment
tags with indexOf instead and cover escaped paths and adversarial input.

Refs MiniMax-AI#425

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
… provider image limit (MiniMax-AI#431)

* fix(images): cap images per request and recover sessions over the provider limit

Inline images stay in persisted history and every request re-sends the
whole provider-visible history, so a long session eventually exceeded the
provider's per-request image limit ("Too many images in request: 31 > 30").
Every later request, /retry, /compact and a restarted session then failed
the same way, each after the full BYOK retry window, behind a generic
"temporarily unavailable / Run /retry" message.

- Request-time image ceiling: projectAgentMessagesForModel keeps the newest
  N images across user messages and tool results and replaces older ones
  with a short placeholder naming the original file. Stored history is
  never rewritten. N comes from capabilities.max_images_per_request
  (default 20; api.mistral.ai defaults to its documented 8). Agent turns,
  checkpoint requests and footprint estimates share the projection.
- Deterministic rejections are terminal: an image-count rejection, or an
  HTTP 400 invalid_request_error, is no longer retried by the BYOK
  retry-all path (timeouts, network, 408/429/5xx stay retryable). The TUI
  shows the upstream reason and suggests /compact or /new instead of /retry.
- Compaction fallback: when the checkpoint Provider rejects a candidate for
  too many images, compaction retries the same history with media replaced
  by text (Hvideo) and continues down the attachment-free ladder.

Refs MiniMax-AI#425

* fix(images): parse attachment reminder paths with a linear scan

CodeQL flagged the attribute regular expression as polynomial on
user-controlled message text (js/polynomial-redos). Parse the attachment
tags with indexOf instead and cover escaped paths and adversarial input.

Refs MiniMax-AI#425

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
(cherry picked from commit 1852771)
* feat: add opt-in lightweight context mode

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* docs: clarify lightweight context boundary

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: harden lightweight session behavior

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: type lightweight turn guard and localize indicator

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: import lightweight turn callback contract

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: stop lightweight turns after unoffered tool calls

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* test: snapshot standard footer and forward tool guard

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: forward lightweight stop policy to agent loop

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: normalize unexpected lightweight tool calls

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* test: require clear lightweight tool fallback

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* test: cover resumed mode indicator in TUI

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* test: hydrate resumed session purpose in TUI

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

* fix: preserve failed unexpected tool responses

Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>
@tournierjc tournierjc changed the title merge: upstream 1852771 (#431 cap images per request) merge: upstream 4401b0e (#431 cap images, #436 lightweight context mode) Oct 6, 2026
hetaoBackend and others added 5 commits October 8, 2026 11:22
… settlement (MiniMax-AI#444)

Add --system-prompt, --system-prompt-file, --append-system-prompt, and
--append-system-prompt-file to the interactive TUI, exec, exec review, and
acp. Replace and append are independent slots; each accepts inline text or a
file, and the slot written closest to the subcommand wins, so
`--system-prompt-file a.md exec --system-prompt "..."` uses the inline text
and never reads a.md. Files are read once at startup and a missing, empty, or
combined-form source fails the launch instead of running unpatched. Flags
placed before a subcommand that does not accept them are rejected rather
than silently ignored.

The overrides replace or extend the main Agent identity prompt and are held
in process memory only: they are never written to the Session or
configuration, survive the post-login restart, and do not reach Task child
Agents. Runtime rules, project instructions, Environment, Memory, and Skills
are still composed as before.

Also settle an ask_user turn as awaiting continuation. That turn ends with a
durable pending request rather than a final assistant message, so it now
settles as awaiting-user-continuation instead of a retryable EMPTY_RESPONSE
failure. The tool result and, when a fast reply arrives before the stream
drains, the pending request itself are both recognized; the generic event
match is narrowed to questionnaire.ask so a later dismiss or supersede is
not mistaken for a new request.

Bump the root and TUI source versions to 0.6.3.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: DanielWalnut <hetaoBackend@users.noreply.github.com>
…I#435)

* fix(cron): accept week unit in cron once --after durations

`cron once --after 1w` was rejected with CRON_VALIDATION_ERROR even though
DURATION_UNIT_MS defines `w`, because both relative-duration parsers only
matched `ms|s|m|h|d`. Add `w` to the token regex in the shared agent-tools
parser and the local-runtime parser (keeping `ms` ahead of `m`), and replace
the local-runtime nested ternary with a unit table that includes weeks.

Single (`1w`) and compound (`1w2d`) week durations now resolve correctly;
existing units and invalid-input rejection are unchanged and covered by new
unit tests in both packages.

Fixes MiniMax-AI#433

Co-authored-by: smartworldarafath <153785481+smartworldarafath@users.noreply.github.com>

* fix(cron): parse cron once durations with an anchored token pattern

CodeQL flagged the `parseDurationMs` token regex (js/polynomial-redos):
matching the unanchored global pattern against `after` retries `\d+` from
every offset, so a long unit-less digit run takes quadratic time (about 2s
for 50k digits). Consume one start-anchored `<number><unit>` token at a time
instead, in both the agent-tools and local-runtime parsers. Accepted and
rejected inputs are unchanged; add a regression test for the digit-run case.

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
Co-authored-by: smartworldarafath <153785481+smartworldarafath@users.noreply.github.com>
…niMax-AI#434)

* fix(tui): defer rebuild when scrollback rows change without input (MiniMax-AI#426)

The regular-mode history reconstruction (L034) clears with ED 3 and replays
the document. xterm.js keeps its scrolled state while scrollback is erased,
so a reader who had scrolled up is moved to line 0. MiniMax-AI#429 deferred this for
an output-driven layout shrink; the reporter's jumps line up with the other
reconstruction paths, which still ran immediately without user input:

- text already in native history changed or was removed
  ("firstChanged < viewportTop"), for example the previous run duration
  note that TurnProjection removes when a queued turn starts;
- a shrink the L038 padding cannot absorb (changed history, overlays,
  images, or no rows left in the previous viewport);
- a footer taller than a small screen refreshing rows in scrollback.

Without user input in the last second these now repaint the screen in
place and mark the deferred replay; the next key, a settled resize replay
or stop() runs the L034 reconstruction as before. Changed history repaints
from the previous viewport origin so growth in the same frame still enters
native history; shrinks paint the document's last rows. Native scrollback
keeps stale, removed or duplicated rows above the screen until the next key.

PI_DEBUG_REDRAW lines now carry the pid (several sessions can share one
log), whether a reconstruction was deferred, and the first changed history
row with letters and digits masked.

Existing tests that asserted an immediate exact rebuild without input now
assert the deferred screen first and exact history after the next key. New
xterm cases cover a changed scrollback row, removal of the previous run
duration from a real append-only transcript, a shrink larger than a screen,
a five-row panel whose footer refreshes, repeated turn endings, and the
debug log. L047 is updated.

Refs MiniMax-AI#426

* test(tui): model input-driven closes/submits under deferred rebuild (MiniMax-AI#426)

The Tasks panel close and the typed /resume are user-driven; deliver the
input explicitly so their history rebuild runs before the measured steps.

Refs MiniMax-AI#426

* fix(tui): keep settled one-time feedback in transcript history (MiniMax-AI#426)

The previous run-duration note, finished ephemeral `!` shell blocks and
stale run errors were removed from the middle of the transcript when the
next turn started or ended. Their rows are final and can already sit in
native terminal scrollback, so the removal shifted every later row and
forced a history rebuild that moved a scrolled-up xterm.js reader to the
top whenever a turn started without a key press.

Dismiss such feedback only while it is still the live tail (nothing but
the next prompt, live cells or other feedback after it). Once settled
output follows, it stays in place as history. Retained turn-scoped cells
re-anchor after their own turn when a history refresh uses different
cell ids, so kept notes do not drift or stack up. The edit flow now
targets the most recent run duration.

Refs MiniMax-AI#426

* fix(tui): drop kept feedback of turns an edit removed (MiniMax-AI#426)

Run-duration notes, terminal errors and shell blocks kept in history
carry their turn id. When an edit removes later turns, a history refresh
could not anchor them to their turn and fell back to position-based
placement, leaving an isolated note in an unrelated spot. Drop such
feedback when its turn was projected before the refresh and is gone
after it (only when turn ids are comparable across the refresh). Rewind
reloads the projection from scratch and was not affected.

Also guard the deferred in-place repaint: if the document no longer
reaches the previous viewport, paint the tail instead of letting
fullRender fall back to an immediate ED 3.

Refs MiniMax-AI#426

---------

Co-authored-by: Tao He <hetaoBackend@users.noreply.github.com>
…Max-AI#443 locale tests, MiniMax-AI#435 cron week, MiniMax-AI#434 deferred rebuild)

Absorb MiniMax-AI/minimax-code main through a5b56b7 while keeping kinetick-code 0.6.9, kcode, and the default-deny egress guard. System-prompt flags and Ask/Plan settlement sit alongside the fork server and shared-auth paths; the locale pin is applied on the fork source-sync suite.

Co-authored-by: kinetick-labs <kinetick-labs@users.noreply.github.com>
@cursor cursor Bot changed the title merge: upstream 4401b0e (#431 cap images, #436 lightweight context mode) merge: upstream a5b56b7 (#444 system prompt, #443 locale tests, #435 cron week, #434 deferred rebuild) Oct 8, 2026
@tournierjc
tournierjc merged commit 8ecd445 into main Oct 8, 2026
18 checks passed
@tournierjc
tournierjc deleted the merge/upstream-1852771 branch October 8, 2026 13:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants