- Added shared Python call and literal serialization utilities with multiline verbatim support.
- Standardized tool inventories to format as an OpenAI-Harmony functions namespace using TypeScript declarations.
- Updated tool normalization and rendering functions to accept options objects and default to Python-syntax examples.
- Refactored Gemini dialect rendering to leverage shared serialization functions directly.
- Normalized result-bearing Codex image items on terminal output events and emitted standard image content.
- Preserved result-bearing image calls during full Responses history replay despite stale provider status.
- Added stream and replay regressions for the Codex path.
Fixes#7445
Completed transcript entries now write through to the OS page cache on
append instead of microtask-batching, supersede in-flight atomic rewrites
with a synchronous full-body publish, and land on the live moveTo path
(source pre-rename, destination post-rename) so a software crash no longer
drops finished user/assistant/tool events. Streaming text remains durable
only at message_end; no fsync/power-loss guarantee is claimed.
Preserved pre-existing MCP_OAUTH_CLIENT_ID and MCP_OAUTH_CLIENT_SECRET values
instead of deleting them after the env-expansion regression test, preventing
later tests in the same Bun process from observing mutated caller state.
Fixes#7440
/mcp reauth read OAuth clientId/clientSecret from the raw, unexpanded config
while URL and resource used expandEnvVarsDeep, so `${VAR}` placeholders were
sent literally to the token exchange. MCPOAuthFlow.exchangeToken() also accepted
any HTTP-success body, storing an empty access token when a provider signals
failure with HTTP 200 (e.g. Slack `{ ok: false, error }`), surfacing only later
as invalid_token.
- Select flow client credentials from runtimeBaseConfig / expanded auth block;
keep the raw placeholder for the persisted config file.
- Reject token responses without a non-empty access_token, including the
sanitized provider error when present.
- Add regression tests for env-expanded reauth credentials and HTTP-200 token
error bodies.
Fixes#7440
Matched fuzzy candidates against immutable source text while excluding ranges already selected for replacement. Inserted replacement content can no longer become a later exact or fuzzy candidate.
Added regression coverage for multiple fuzzy source matches when the replacement contains the original search text.
Fixes#7432
- The pi-utils/mime subpath fix made the computer worker graph lazy-safe,
so the dynamic-import dispatch added for laziness is no longer needed;
cli.ts and the bundled-host fixture statically import
startComputerWorker() per the no-inline-import rule.
- worker-entry keeps the selector-guarded direct-source auto-start; the
worker-selector test now pins the exported hook contract. Verified
--no-addons CLI startup stays addon-free and the bundled/compiled
worker-host tests pass.
- The PR #7205 merge left cli.ts statically importing startComputerWorker,
dragging the computer worker graph (and pi_natives via the pi-utils
barrel) into normal CLI startup; --version died under --no-addons and
dotenv loaded before profile bootstrap. worker-entry is now a
self-starting side-effect module dispatched via dynamic import like
every other worker selector, and utils/clipboard.ts imports the mime
constant from its submodule instead of the barrel.
- Repointed the clipboard test spy at @oh-my-pi/pi-natives/clipboard —
spying the barrel never intercepted the subpath the code imports, so
the real native bridge ran (X11 timeouts on headless CI).
- Refreshed the pinned HTML export template digest and the scout gate
phrase the system-prompt rewrite changed.
- prepareNativeCorePackage's files whitelist predated the native/clipboard
module; the packed tarball lacked it and the coding-agent CLI failed with
'Cannot find module @oh-my-pi/pi-natives/clipboard' in the tarball install
smoke. Verified the packed tarball now contains clipboard.js/.d.ts.
- napi omits the displayServer key when the backend reports None (headless
CI hits the unavailable backend); the declared contract is
displayServer?: string, so assert the value type instead of key presence.
- libc::ioctl takes c_ulong on glibc but c_int on musl; the hardcoded
c_ulong request type broke //:natives-linux-musl-{x64,arm64}. Verified
by cross-checking aarch64-unknown-linux-musl on the CI-pinned nightly.
- libspa-sys hard-links system libpipewire-0.3 via pkg-config, which no CI
or cross triple (musl, arm64) can satisfy; bazel addons already build with
crate_features = [], so shipping builds lose nothing. Linux devs opt in
with --features wayland-pipewire.
- Gated normalize_role_macos and the wayland capture helpers to the configs
that use them; handled the cfg(test) AxHandle variant in AtSpiAx::object.
- Fixed clippy-strict violations (redundant_pub_crate, missing_const_for_fn,
unnecessary_wraps, collapsible_if, map_unwrap_or, needless_return,
needless_pass_by_ref_mut) across the new linux desktop backend.
Extracted the coding-agent scope of PR #7077 (@santhreal): single-pass
placeholder matcher so positional values containing literal $@ or
$ARGUMENTS are never re-expanded. The unrelated utils formatting changes
in that PR were not taken.
The hub data-refresh teardown resets the global AgentRegistry but leaves the
cached global IrcBus bound to the discarded instance, because IrcBus captures
its registry at construction (src/irc/bus.ts). Any later file in the same
process then sends through a bus whose registry no longer knows the agents
registered after the reset.
The defect is latent at the current file ordering and surfaces as soon as suite
composition changes: with agent-hub-activate.test.ts running before
agent-session-plan-mode-convergence.test.ts, the plan-mode side-channel
auto-reply is stranded until its timeout.
Pair the two resets the way test/advisor/advisor-visibility.test.ts already
does. Reproduce with:
bun test packages/coding-agent/test/agent-hub-activate.test.ts \
packages/coding-agent/test/agent-session-plan-mode-convergence.test.ts