Skip to content

Codex/fix tui stale autocomplete 407 - #1

Open
REI-330 wants to merge 105 commits into
mainfrom
codex/fix-tui-stale-autocomplete-407
Open

Codex/fix tui stale autocomplete 407#1
REI-330 wants to merge 105 commits into
mainfrom
codex/fix-tui-stale-autocomplete-407

Conversation

@REI-330

@REI-330 REI-330 commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Problem

Windows regular TUI 在 slash 命令自动补全列表缩小时可能残留旧行,影响界面可读性。

Value

避免 Windows 用户看到过期的自动补全内容,恢复稳定的终端重绘行为。

Approach

  • 新增 Windows TUI 兼容层,仅对 regular TUI 启用 Pi 的 clearOnShrink
  • fullscreen TUI 和非 Windows 平台保持原有行为。
  • 提供 OPENPI_WINDOWS_TUI_COMPAT=0 环境变量作为退出开关。
  • 添加针对平台、渲染模式和退出开关的回归测试。

Validation

  • bun test tests/extensions/windows-terminal-compat/index.test.ts:3/3 通过
  • Biome 检查通过
  • TypeScript 检查通过
  • 完整检查受本地 Windows 环境既有 CRLF、权限和进程基线测试影响

Impact

仅改变 Windows regular TUI 的终端重绘策略,不改变命令注册、编辑器行为、fullscreen TUI 或其他平台行为。

Fixes openpi-dev#407

junwu168 and others added 30 commits August 29, 2026 00:23
Adds a reproducible npm trusted-publishing workflow with fail-closed tag provenance, unprivileged validation, a minimal OIDC publish job, protected npm environment guidance, and maintainer release documentation.
* fix(workflows): make terminal delivery recoverable

* fix(workflows): preserve aborted terminal delivery

* fix(workflows): close durable delivery review gaps

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* docs: document linear git history

* docs: address linear history review

* docs: fix rebased branch update sequence

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…i-dev#149)

* fix(background-terminals): 强化输出、磁盘与终止边界

在模型侧截断前统一清洗终端输出,并保留原始 spill 证据。

增加 session spill 总预算与 prune 回收,串行等待 Windows taskkill 并补充 Windows CI 验证。

Refs openpi-dev#72

* fix(background-terminals): 修正 Windows shell 引号

* fix(background-terminals): 保留 Windows 强制终止句柄

* fix(background-terminals): reclaim spill budget before replacement

Release settled spill reservations synchronously during pruning and before starting a new terminal, so a full session budget does not reject the newest terminal at the MAX_TRACKED boundary. Add a regression test for immediate replacement output.

* fix(background-terminals): retain pending completion evidence

* fix(background-terminals): close review boundary gaps

* fix(background-terminals): serialize taskkill closure

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…ayer provides (openpi-dev#170) (openpi-dev#230)

Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
)

* fix(workflows): persist late worktree cleanup provenance

* fix(workflows): make late cleanup persistence observable

---------

Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
* feat(ci): notify Feishu for new pull requests

* feat(ci): localize Feishu PR notification

* fix(ci): sanitize Feishu PR notifications

---------

Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* fix(workflows): reject failed acceptance during replay

* test(workflows): split replay acceptance projection coverage

* test(workflows): remove unused replay fixture state

---------

Co-authored-by: REI-330 <173389910+REI-330@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* perf(tui): index transcript tool pairing

* perf(tui): carry transcript pairing index on the document

Build the tool-call pairing index at document-construction time instead of
inside render, so repaint ticks do not rescan the full history:

- AgentTranscriptDocument gains an optional pairing index; render reads it
  and only falls back to building it for callers that omit it.
- WorkflowTranscriptAdapter already returns a stable document while the
  transcript is unchanged, so the cached document now carries a matching
  index (no per-frame rebuild).
- Subagent snapshot gains a monotonic transcriptVersion bumped on every
  mutation; subagentTranscriptDocument caches items+pairing keyed on
  snapshot identity + version, so an open takeover view pays O(1) per tick
  instead of O(n). The dynamic half (liveTools / liveAssistant / queued)
  is still assembled fresh each call.

Measured: subagent document construction at n=2000 drops ~360x (0.0725ms
to 0.0002ms) and no longer scales with transcript length.

Refs openpi-dev#185
* fix(subagents): surface worktree cleanup failures

* fix(worktree): report retained branches without reason

* style(subagents): terminate index file

* fix(worktree): avoid claiming unknown checkouts remain
…#210)

* feat(model-info): add session metrics tracker

* test(model-info): cover cached prefix traversal

* feat(model-info): sync metrics on lifecycle edges

* test(model-info): cover repeated ordinary refreshes

* bench(model-info): compare session metric scans

* fix(bench): model each tool loop as a turn
* fix(workflows): bound settled run retention

* style(workflows): format retention test
* fix(context-pivot): clarify native no-history failures

* fix(context-pivot): report headless compaction failures

---------

Co-authored-by: QuinnWan <144975606+somewan820@users.noreply.github.com>
* feat(contract): mechanize config provenance checks

* fix(checks): close configuration and ledger gaps

* test(checks): prove config drift detection

* style(checks): keep contract checker format stable

* fix(checks): verify persisted config writer wiring
* ci: source shared automation workflows

* test: pin reviewed automation contracts

* ci: follow automation main branch

* docs: describe automation main references
* fix(tui): stop settled strip redraw timers

* perf(tui): collapse unchanged extension status writes

Pi's setStatus() requests a global render without diffing the text, and the
subagent manager notifies on every child event, so streaming deltas, tool
cycles, and usage ramps each repainted the whole TUI to rewrite a footer line
that never changed. The strip's own repaint key could not help: setStatus had
already asked for the render before the widget gate ran.

Route both extensions' footer writes through a shared writer that remembers
the last value per UI and forwards only real changes. Cover the complete
manager -> setStatus path with an extension-level UI spy driving a real spawn
against a stub backend, and add the 60-second idle requestRender/CPU benchmark
openpi-dev#189 asked for.

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

* fix(bench): update subagent fixture contract

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Establishes the repository knowledge and evidence governance contract, including Decision 0001 and discipline-ledger boundaries.
Adds a fail-closed Windows process start-time query for setup lock recovery and makes capability path assertions portable across platforms.
…y evidence (openpi-dev#283)

* refine workflow completion rendering

* refactor workflow completion projection

* fix workflow completion spec regressions

* fix(workflows): split oversized completion deliveries

* fix(workflows): batch completion deliveries before flushing

* style(workflows): align completion projection formatting

* test(workflows): assert structured completion display

* test(workflows): type completion display alerts
* docs: define child tool activity design

* feat(tui): unify child tool activity views

- render Direct Subagent and Workflow child tools through the shared compact activity projection\n- keep Pi-native evidence available through a page-local app.tools.expand toggle\n- inherit the parent expansion state without mutating the parent transcript\n- document and test shared compact/expanded behavior for issue openpi-dev#93

* docs: link child activity design to pr

* docs: keep setup guide scoped to configuration

---------

Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
* fix(workflows): bound settled run retention

* fix(workflows): retain dashboard fallback projections

* test(workflows): cover delivery and retention pressure

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* fix(subagents): preserve transport payload and surface artifact failures

* test(subagents): update snapshots for transcript version

* fix(subagents): surface canonical result exceptions

Preserve separated display content, propagate interrupted and recovery metadata, and isolate compact renderer configuration in tests.

* fix(subagents): enforce automatic result batch cap

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…v#298)

* perf(workflows): run cheap replay fingerprint checks before the binary diff

Replay is disabled wholesale for repositories with ignored files, but
repositoryFingerprint() still paid for a full `git diff --binary` (up to
32 MiB buffered) before discovering that. Move every cheap terminating
check ahead of the diff: repository root, ignored files, HEAD, tracked
modes/symlinks, then the diff, then untracked collection and hashing.

All git invocations share a single deadline, so reordering a fixed
command set cannot change the outcome for any input; the unbounded
non-git work still runs after every git call. Ignored-file repositories
now fail within two git processes instead of five to six and never
buffer the diff.

repositoryFingerprint() is exported with an injectable git runner so a
regression test can lock the command order: a disqualifying repository
must never reach the diff.

Fixes openpi-dev#294

* fix(workflows): recheck replay disqualifiers after diff

---------

Co-authored-by: zhangms <zhangms@xx.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…v#229)

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
testikun and others added 25 commits September 7, 2026 11:15
* fix(workflows): recover terminal artifact commits

* docs: record workflow artifact commit protocol

* docs: link workflow artifact recovery PR

* fix(workflows): preserve newer manifest during recovery

* docs(workflows): update artifact recovery identity contract

* docs(workflows): align recovery identity contract

---------

Co-authored-by: testikun <320479488+testikun@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* docs(web): define React migration MVP

Record the frozen PR openpi-dev#352 behavior baseline, Pi-native ownership boundaries, selected frontend stack, static delivery contract, and validation matrix for the local migration experiment.

* docs(web): define development port conflict handling

Document default port fallback, strict explicit ports, fast startup diagnostics, and TUI error projection for the local React validation branch.

* feat(web): migrate workbench UI to React

- replace the imperative browser UI with typed React and Zustand projections
- add Vite HMR, production asset builds, and bounded port conflict handling
- cover the Web store, packaged host, responsive browser flows, and artifact drift in CI

* fix(packaging): stabilize Git source installs

- disable npm peer resolution for Pi-provided host packages
- guard the Git install contract and record the production smoke rationale

* fix(web): address React MVP review feedback

* fix(ci): provide Pi host peers to source smoke

* docs(web): record React MVP review validation

* fix(web): keep backend readiness deadline alive

Use an explicitly referenced timer for each readiness probe so Node 22 does not let the test process or launcher exit while the fetch is still pending. Clear the timer after every probe.

* docs(web): record Node 22 readiness validation

Advance the design evidence boundary to the readiness timer fix and record the focused Node 22 and Node 24 regression runs.

* docs(web): record green full test run

Replace the superseded load-sensitive test note with the successful Node 24 full-suite result observed after the readiness fix.

* fix(web): install shutdown handlers before ready output

Ensure the CLI cannot advertise a ready Web Host before its SIGINT and SIGTERM cleanup handlers are installed.

* docs(web): record CLI shutdown race validation

Advance the implementation boundary and distinguish focused CLI evidence from unrelated full-suite timing failures.

* fix(web): keep running phase for queued follow-up prompts

prompt_accepted and the HTTP receipt were resetting an active turn
to preparing. Preserve running unless the command already settled,
matching the openpi-dev#364 live-phase rule without copying legacy app.js.

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…utions (openpi-dev#439)

Restore the clipboard fallback from openpi-dev#352 in React with honest failure feedback, focus and selection restoration, and cleanup. Keep current exact-turn cancellation and request deadlines, and add timeout regression coverage inspired by openpi-dev#377. Credit the original openpi-dev#352, openpi-dev#377, and openpi-dev#358 contributions in README.

Closes openpi-dev#438

Co-authored-by: QuinnWan <144975606+somewan820@users.noreply.github.com>
Co-authored-by: seekskyworld <djh1813553759@gmail.com>
…tics (openpi-dev#442)

Integrate openpi-dev#398 Session provenance and openpi-dev#392 authenticated Pi trust diagnostics. Correct refreshRequired when project resources change and identify the current controlled Session by both ID and file. Preserve optional-controller compatibility, unknown failure states, and current runtime authority.

Closes openpi-dev#440
Refs openpi-dev#398, openpi-dev#392

Co-authored-by: testikun <320479488+testikun@users.noreply.github.com>
…ferences (openpi-dev#436)

A partial path segment could stop right before rm after complete earlier
segments, so a URL path like apache/storm/issues counted as an rm
reference and piped read-only commands were blocked as opaque destructive
input. Every repeated segment now consumes its own trailing slash, so rm
must sit at a segment start. Bare rm, /bin/rm and xargs rm references
keep failing closed.
)

Integrate the useful provider authentication status contribution from openpi-dev#390 onto current main. Preserve existing trust, capability, diagnostics and cancellation routes while retaining the original bounded, non-secret, read-only projection. No UI or credential write behavior is introduced.

Refs openpi-dev#348, openpi-dev#390

Co-authored-by: testikun <320479488+testikun@users.noreply.github.com>
Co-authored-by: testikun <320479488+testikun@users.noreply.github.com>
…penpi-dev#444)

Integrate Session-scoped terminal details from openpi-dev#389, Pi thinking reads from openpi-dev#375, and unarchive from openpi-dev#361 while preserving current trust diagnostics. Add authenticated endpoint and persistent unarchive integration tests.

Co-authored-by: testikun <320479488+testikun@users.noreply.github.com>
Co-authored-by: seekskyworld <djh1813553759@gmail.com>
…penpi-dev#445)

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…v#447)

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…-dev#449)

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…i-dev#462)

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
…on (openpi-dev#484)

* fix(cursor): recover from unsupported native execution requests

* docs: record Cursor native recovery acceptance

---------

Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
)

* fix(web): bind workspace drafts to confirmed Pi sessions

* fix(web): confirm session creation after snapshot races

---------

Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
* fix(web): distinguish models by provider identity

* fix(web): avoid repeated fallback model identity

---------

Co-authored-by: REI-330 <173389910+REI-330@users.noreply.github.com>
Co-authored-by: tt-a1i <53142663+tt-a1i@users.noreply.github.com>
Co-authored-by: tt-a1i <tt-a1i@users.noreply.github.com>
@REI-330
REI-330 force-pushed the codex/fix-tui-stale-autocomplete-407 branch from f9ed007 to 6f10280 Compare September 8, 2026 12:39
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.

fix(tui): prevent stale autocomplete rows on Windows terminals