Skip to content

fix: export ToolExecution*Event types from public API - #6847

Merged
badlogic merged 1 commit into
earendil-works:mainfrom
PiedPiper911:fix/export-tool-execution-events-6687
Aug 25, 2026
Merged

badlogic merged 1 commit into
earendil-works:mainfrom
PiedPiper911:fix/export-tool-execution-events-6687

Conversation

@PiedPiper911

Copy link
Copy Markdown
Contributor

Summary

Adds the missing ToolExecution*Event type exports to the public API of @earendil-works/pi-coding-agent, making them importable by extension developers and consumers of the package.

Problem

Unlike other event types such as SessionStartEvent, ToolCallEvent, and ToolResultEvent, the ToolExecution*Event types were not re-exported from packages/coding-agent/src/index.ts. This meant they were absent from the generated dist/index.d.ts, preventing users from importing them:

import type { ToolExecutionEndEvent } from '@earendil-works/pi-coding-agent'
// Error: Module has no exported member 'ToolExecutionEndEvent'

These types are already defined and exported from the internal ./core/extensions/index.ts module but were simply overlooked when the public barrel export was composed.

Fix

Added the three missing type exports to the export type { ... } from "./core/extensions/index.ts" block in packages/coding-agent/src/index.ts, in alphabetical order consistent with the existing style:

  • ToolExecutionEndEvent
  • ToolExecutionStartEvent
  • ToolExecutionUpdateEvent

Files Changed

  • packages/coding-agent/src/index.ts — Added ToolExecutionEndEvent, ToolExecutionStartEvent, and ToolExecutionUpdateEvent to the extension system type re-exports.

Fixes #6687

Add missing ToolExecutionEndEvent, ToolExecutionStartEvent, and
ToolExecutionUpdateEvent type exports to packages/coding-agent/src/index.ts
so they are available to consumers of the package.

Fixes earendil-works#6687
@github-actions

Copy link
Copy Markdown
Contributor

This PR was auto-closed. Only contributors approved with lgtm can open PRs. Open an issue first.

Maintainers review auto-closed issues daily. Issues that do not meet the quality bar in CONTRIBUTING.md will not be reopened or receive a reply.

If a maintainer replies lgtmi, your future issues will stay open. If a maintainer replies lgtm, your future issues and PRs will stay open.

See CONTRIBUTING.md.

@github-actions github-actions Bot closed this Jul 20, 2026
@badlogic badlogic reopened this Aug 25, 2026
@badlogic
badlogic merged commit cacb591 into earendil-works:main Aug 25, 2026
1 check passed
tunght13488 added a commit to tunght13488/pi that referenced this pull request Aug 26, 2026
* upstream/main: (119 commits)
  fix: persist default to scoped if non-empty
  feat(coding-agent): expose RPC queue clearing
  feat(ai): add deepseek-v4-flash-vision-exp
  docs(coding-agent): update provider links to api
  fix(ai): omit tool_choice without tools closes earendil-works#8607
  fix(coding-agent): append run-time custom messages after the turn's tool results
  fix(ai): derive OpenRouter reasoning controls (earendil-works#8614)
  chore: approve contributors from issue earendil-works#8594
  chore: approve contributors from issue earendil-works#8574
  fix: export ToolExecution*Event types from public API (earendil-works#6847)
  feat(coding-agent): export image MIME detector (earendil-works#8600)
  fix(ai): concatenate openai completions reasoning deltas (earendil-works#8605)
  fix(ai-test): update glm 5.3 price
  fix(ai): cloudflare gateway type, include workers
  chore: approve contributors from issue earendil-works#8409
  chore: approve contributors from issue earendil-works#8388
  feat: show llama presets if autoload enabled (earendil-works#8558)
  fix(coding-agent): reject truncated compaction summaries closes earendil-works#7048
  fix: extract Windows release ZIPs in CI
  Add [Unreleased] section for next cycle
  ...
scepion1d added a commit to HomeLab-Forge/pi that referenced this pull request Sep 6, 2026
* fix(coding-agent): discard failed extension factory state (earendil-works#8424)

* feat(coding-agent): include context in Radius session shares

* fix(coding-agent): use Windows-friendly keybinding defaults

closes earendil-works#8372

* docs(coding-agent): clarify custom footer usage APIs (earendil-works#8482)

Fixes earendil-works#8392

* fix(coding-agent): expose finish reason compatibility override (earendil-works#8487)

Closes earendil-works#8460

* feat(coding-agent): update managed installations in place

* feat(coding-agent): add optional PowerShell tool (earendil-works#8512)

* feat(agent): add durable drive foundations

* feat(agent): simplify durable drive ownership

* fix(agent): preserve legacy upgrade commit stats

* docs: audit unreleased changelogs

* Release v0.84.3

* Add [Unreleased] section for next cycle

* fix: extract Windows release ZIPs in CI

* fix(coding-agent): reject truncated compaction summaries closes earendil-works#7048

* feat: show llama presets if autoload enabled (earendil-works#8558)

* fix(coding-agent): support bundled experimental processes

* feat(sqlite): databasePath, sessionId for sharding

* docs(agent): simplify durable drive ownership

* docs(agent): restore direct tool batch procedure

* feat(agent): add durable terminal mechanics

* feat(agent): add durable generation procedures

* feat(agent): add explicit session mutations

* fix(agent): make service hydration readiness explicit

* fix(agent): make durable assistant framing burst-safe

Rename the harness runtime2 directory to runtime.

* chore: approve contributors from issue earendil-works#8388

* chore: approve contributors from issue earendil-works#8409

* fix(ai): cloudflare gateway type, include workers

Fixes https://github.com/earendil-works/pi/actions/runs/32825925694/job/97733792662?pr=8605 build error

* fix(ai-test): update glm 5.3 price

* fix(ai): concatenate openai completions reasoning deltas (earendil-works#8605)

* feat(coding-agent): export image MIME detector (earendil-works#8600)

* fix: export ToolExecution*Event types from public API (earendil-works#6847)

Add missing ToolExecutionEndEvent, ToolExecutionStartEvent, and
ToolExecutionUpdateEvent type exports to packages/coding-agent/src/index.ts
so they are available to consumers of the package.

Fixes earendil-works#6687

* chore: approve contributors from issue earendil-works#8574

* chore: approve contributors from issue earendil-works#8594

* fix(ai): derive OpenRouter reasoning controls (earendil-works#8614)

Fixes earendil-works#8454

Co-authored-by: Petr Houška <houskape@gmail.com>

* fix(coding-agent): append run-time custom messages after the turn's tool results

Extension messages sent with triggerTurn: false while the agent was
running were pushed into agent state and the session tree immediately,
landing between an assistant tool call and its result. Providers that
validate message order reject the replayed history. Queue them during
the run and append at turn_end, mirroring recordBashResult.

closes earendil-works#8537

* fix(ai): omit tool_choice without tools closes earendil-works#8607

* docs(coding-agent): update provider links to api

* feat(ai): add deepseek-v4-flash-vision-exp

* feat(coding-agent): expose RPC queue clearing

closes earendil-works#8432

* Remove outdated docs

* feat(coding-agent): add setup-driven facet generations

Replace ad hoc service assembly with atomic local and remote facet generations. Gate service proxy access by lifecycle and move the experimental Session worker and TUI onto facets.

* feat(agent): separate sessions, branches, and lanes

* fix(ai): keep cloudflare ai gateway workers-ai models when models.dev drops them

models.dev's cloudflare-ai-gateway catalog no longer lists workers-ai/*
entries, which removed every openai-completions model from the generated
gateway catalog and narrowed the inferred provider api union. Derive the
gateway's workers-ai models from the cloudflare-workers-ai catalog and pin
the provider's api generic. Also move the zai glm-5.3 cost assertion, now
that models.dev prices it in the zai API catalog.

* fix(client): update unix transport test to renamed pi.session-directory service id

* fix: persist default to scoped if non-empty

* feat(agent): add durable retry and deferred polling

* feat(agent): add durable tool execution

* feat(agent): simplify durable drive runtime

* feat(agent): clarify operation continuation semantics

* feat(agent): simplify durable runtime procedures

* fix(coding-agent): prevent Windows taskkill spawn crashes

closes earendil-works#6596

* fix(coding-agent): remove explicit tool choice from compaction calls

Fixes earendil-works#8649\n\nFixes earendil-works#8638

* fix(tui): let drag select text over the editor

The editor consumed left mouse presses to position the cursor, which made
the alternate screen route the whole gesture to it and never start its
screen-level text selection. Handle the synthesized click event instead so
press/drag/release stay available for selection and copy.

* feat(agent): add structural drive foundation

* fix(tui): autocomplete orders nested results (earendil-works#8669)

* fix(coding-agent): repair unterminated session files

Append a newline after loading a valid session so subsequent entries cannot fuse with an unterminated tail.\n\nFixes earendil-works#8345

* fix(ai): serialize thinking signature once (earendil-works#8671)

* fix(tui): chunk large main-screen renders closes earendil-works#8028

* docs(agent): redesign WP05 around lane inbox, result records, and neutral leaves

Withdraw the standalone-compaction promotion design. Add redesign
milestones R1 (lane-owned tagged inbox with mode-respecting drains and
one-commit boundaries), R2 (neutral OperationOutcome plus immutable
pi.result records, drive(id) total for settled ids), and R3 (22 to 14
family-neutral leaves with a closed ResultBoundary datum). Update M7/M8
for drain-and-return abort and continuation as a second ordinary run via
the public empty-prompt accept, add M9 documentation reconciliation, and
gate M10 before final guard removal. Incorporates the independent review
consensus (B1-B7, O1-O8).

* fix(coding-agent): preserve partial Bash output when toggling thinking

closes earendil-works#8611

* fix(tui): make alt screen not segment on - and / (earendil-works#8676)

* fix(tui): make alt screen not segment on - and /

* cleanup

* chore: changelog entries

Forgot to add the changelog entries :P

* feat(agent): simplify durable operation graph

* docs(settings): default model and thinking

* feat(agent): fuse structural boundary routing

* feat(agent): make run boundaries atomic

* feat(tui): add terminal capability overrides closes earendil-works#8665

* docs(agent): resolve M7 cancellation decisions

* feat(agent): make durable drive total

* feat(coding-agent): add mini, a three-process coding agent on the durable harness

An experimental client for the new AgentHarness, built to find out what an
RPC-shaped presentation actually needs from it.

Three hosts: presentations (TUI) connect to a server over a unix socket, the
server spawns one worker process per session over stdio pipes and routes
between them. A peer provides named services and forwards names it does not
provide to its next hop, so a TUI reaches server-provided and worker-provided
services through one connection, and a worker reaches server services the same
way.

The worker owns every live object: storage, harness, lane, model runtime. A
presentation holds a replicated LaneSnapshot and nothing else. Each presentation
opens its own lane.watch() in the worker and applies events with the harness's
reduceLaneSnapshot, so no client re-implements snapshot/stream alignment.

The TUI reuses interactive-mode components and holds no live objects.

* feat(coding-agent): address mini lane events to one presentation

Each presentation opens its own harness watch, and the server broadcast every
worker event to every attached presentation, so with N presentations each event
crossed N^2 times and each client discarded the copies that were not its own.

The event frame now carries an optional destination. A presentation mints an id
and passes it to both sessions.attach and lane.watch, so the server learns it at
attach and the worker learns it at watch. The worker addresses that
subscription's events; the server routes them to exactly one presentation
without parsing a payload. Shared events, such as models state, still broadcast.

The client keeps its subscription id check: after a rebase the superseded
subscription is still open until unwatch lands, and its events carry the same
destination.

* feat(agent): expose durable lane operations

* fix(agent): finalize durable lane replication

* feat(agent,ai): add narrow subpath exports so clients skip the barrel

A barrel forces Node to evaluate its whole graph: importing reduceLaneSnapshot
(1 file, 6 KB) through pi-agent-core's index evaluated 106 files, and mini's
server loaded 112 files to enumerate JSONL headers. Types are free, so this only
ever affected value imports.

pi-ai gains ./utils/* alongside the existing ./providers/* and ./api/*
wildcards. pi-agent-core gains ./harness/context, ./harness/env/nodejs,
./harness/runtime/reducer and ./harness/session, and ./session/testing becomes
./harness/session/testing so every export mirrors its source path. The barrel
and ./node keep their batteries-included semantics.

The session layer takes uuidv7 from @earendil-works/pi-ai/utils/uuid rather than
the pi-ai barrel, which is what let ./harness/session drop from 42 files to 19.
Two imports there were written `import { type Usage } from` - not a type-only
statement, so it emitted a runtime import of the barrel.

scripts/check-entry-graphs.mjs walks each declared entry's value-import graph and
enforces per-entry budgets and forbidden paths, so a stray `export *` cannot
silently undo this. It caught the two `import { type ... }` regressions above.

Measured with mini: server 112 files and 98 MB to 28 files and 69 MB, presentation
204 files and 125 MB to 99 files and 110 MB. The worker still loads the provider
graph, correctly.

* docs(agent): audit post-WP05 roadmap

* feat(coding-agent): split tool renderers and theme validation from their implementations

A presentation draws tool calls and colours; it executes nothing and validates
nothing. Both cost it typebox anyway, which is 17 MB of module graph: 682 ESM
modules whose narrowest entry re-exports ~300 of them, so there is no
cherry-picking and both doors had to close before any process stopped paying.

ToolExecutionComponent no longer looks up createAllToolDefinitions by tool name;
callers pass what to render, and its parameter type now says so. Each built-in
tool's presentation moves to core/tools/renderers/<tool>.ts, leaving the schema
and execute path behind; bash and powershell share createShellRenderers(prompt).
Tool definitions keep their exact public shape and spread the renderers in.
withBuiltInRenderers() preserves the old fallback, where an extension override
without renderers still draws like the built-in - that behaviour used to live
inside the component, and two tests caught its absence.

theme.ts keeps palettes; the typebox schema and its error formatting move to
theme-json.ts, installed through setThemeJsonValidator. Built-in themes were
never validated, so only processes that load user-authored themes need it. pi
installs it during startup, before the first theme loads, and the invalid-theme
message is unchanged.

Measured with mini, running built output: the presentation drops from 87 MB and
99 files to 72 MB and 88 files, with typebox absent from its graph, while still
rendering tool output through the real built-in renderers.

Also: packages/server's vitest aliases were prefix matches, so a subpath import
resolved onto index.ts/utils/uuid and failed five suites; they are exact now
with explicit subpath rules. And mini-test.sh spawns mini the way pi-test.sh
spawns pi, with --fresh/--stop for the detached session server.

* docs(agent): condense harness specification

* docs(agent): clarify harness alignment corrections

* feat(coding-agent): replace facet attributes with services

Make facets non-generic and resolve host-local dependencies through service bindings. Rename local assembly to createFacetHost and consolidate TUI host mechanics behind one service.

* feat(coding-agent): derive facet service routing

* feat(coding-agent): expose experimental TUI service

Keep attachment routing in the TUI host and simplify loaded facet generation ownership.

* feat(coding-agent): preserve handles across facet reloads

* feat(agent): remove remote service events

* feat(coding-agent): wire Chat into experimental TUI

* fix(agent): align facet service contracts and errors

* docs(agent): restore subtle harness contracts

* feat(extensions): ui prompt events (earendil-works#8355)

* feat(extensions): ui prompt events

* fix: handlers should not delay the prompt

* fix(coding-agent): expose https-proxy-agent named export (earendil-works#8723)

- closes earendil-works#8610

* feat(coding-agent): run experimental client as direct chat

Replace raw Harness and Chat service exposure with AgentController and replicated lane state. Start directly in new or resumed sessions and persist model selection.

* fix(coding-agent): remove unnecessary local service tokens

* feat(tui): allow disable copy on fullscreen, ctrl + x copies selection (earendil-works#8731)

* feat(coding-agent): share fullscreen TUI with experimental client

Reuse the stable renderer, viewport layout, theme detection, and terminal appearance updates. Keep successful operation status derived from replicated lane state.

* feat(coding-agent): connect experimental sessions through Radius

* fix(coding-agent): allow exit while Radius reconnects

* feat(agent,coding-agent): unify process-local service lifecycle

* feat(coding-agent): add facet-based slash commands

* fix(ai): remove retired Fireworks turbo router test

* fix(coding-agent): restore client compatibility entrypoint

* fix(coding-agent): compact before post-tool model requests (earendil-works#8782)

Run next-turn preparation only when the agent loop continues, allowing threshold compaction before the next provider request. Restore interactive progress when the same run resumes.

Closes earendil-works#6879

Important to notice:
this changes when prepareNextTurn & prepareNextTurnWithContext are invoked:
the now run only when a next turn actually happens, and after shouldStopAfterTurn.

* docs(coding-agent): remove issue-specific regression test placement rule (earendil-works#8775)

* fix(ai): merge indexed Mistral tool call chunks

fixes earendil-works#8387

* fix(coding-agent): reconnect after abnormal Radius closure

* docs: audit unreleased changelogs

* fix(ai): refresh generated image model catalog

* Release v0.84.4

* Add [Unreleased] section for next cycle

* feat: add Chord runtime foundation

* feat: move facet services into Chord

Move service, replicated-state, facet host, and loader ownership into the standalone Chord package. Migrate consumers and leave runtime JSON enforcement to serializers.

* feat: simplify Chord service instance API

Deliver observed services as ordinary typed proxies, expose optional instance-key lookup, and rename the deferred multi-instance capability to ServiceSpawner.

* feat: consolidate Chord public API

* feat: isolate Chord context API

* feat: simplify Chord service APIs

* feat: simplify Chord service slots

* feat: clarify Chord remote service APIs

* fix: harden Chord service lifecycle semantics

* feat: add bundled facet distribution and reload

Bundle content-addressed Chord facet entries, distribute server-selected presentation artifacts during the handshake, and reload Session and TUI generations through /reload.

* feat: add package-based facet plugins

Bundle declarative plugin packages with Chord and load fresh generations. Scope client selections to persisted Session and TUI branches, and replace stale local server generations after protocol changes.

* feat: simplify plugin facet lifecycle

Remove handshake-based facet delivery and host only the selected Session presentation branch. Simplify worker selection, startup options, package profiles, and serialized builds.

* feat(coding-agent): simplify experimental services and CLI

* fix(coding-agent): remove obsolete plugin app fixture

* feat(coding-agent): remove legacy session RPC facade

Route discovery, management, and prompting through Chord services. Retain low-level lane watches and reattach Radius clients through SessionManagement.

* feat: make Chord facet generations collectible

* docs(agent): align SQLite ownership with session workers

* feat(coding-agent): tighten experimental service boundaries

* feat(coding-agent): reduce experimental test duplication

* docs(agent): add mobile design handoff

* feat(chord): add JSON delta tracking

* feat(chord): generate deltas at flush

* docs(chord): introduce delta operations upfront

* docs(chord): keep delta guide user-focused

* docs(chord): explain delta stream encoding

* docs(agent): add streaming fork work package

* fix(agent): align SQLite ownership with session workers

* docs(chord): clarify delta ownership and array costs

* docs(agent): align assistant output handoff with Chord

* delta updates, on behalf on mario

* feat(coding-agent): replace lane RPC with Chord service

* feat: add delta-backed replicated state

Track mutable provider state and publish immutable operation batches. Keep path codecs isolated per client subscription and state member.

* fix(coding-agent): allow Chord delta bundle import

* fix: remove dead experimental protocol code

* feat: move service wire semantics into Chord

Keep protocol payloads transport-opaque and validate service calls, state snapshots, updates, and errors at Chord boundaries. Ensure successful OpenAI Responses messages remain strict JSON so terminal Transcript updates reach clients.

* docs(agent): close delta append API decision

* feat(tui): add large transcript render benchmark

* feat: consolidate remote service adapters

* feat: remove experimental compatibility shims

* feat(chord): keep services available during facet reloads

* fix(coding-agent): settle active turn before in-memory fork (earendil-works#8937)

Fixes earendil-works#8724

Co-authored-by: yaogangqiang <yaogangqiang@kanyun.com>

* fix(agent): stop prepared tools after preflight abort (earendil-works#8936)

fixes earendil-works#8935

Co-authored-by: yaogangqiang <yaogangqiang@kanyun.com>

* feat(coding-agent): adjust TUI selections in thinking-mode, models and scoped models (earendil-works#8900)

* fix(coding-agent): keep selector status markers visible

- place status markers before labels
- strike unavailable scoped models and update tests

* fix(coding-agent): align scoped model toggle behavior

- show checks for the all-enabled state
- toggle individual models consistently and add coverage

* docs(coding-agent): add changelog entry

* fix(coding-agent): keep trust marker visible while browsing

- move the saved marker before the trust option
- update tests and changelog

* fix(coding-agent): mark per-model thinking overrides

- add the leading level marker
- update tests and changelog

* fix(tui): detect Zed terminal capabilities (earendil-works#8828)

* fix(coding-agent): use ctx.cwd for cwd-sensitive tools when available (earendil-works#8627)

When tools are registered by an extension (e.g. Kimchi) the execute callback
receives an ExtensionContext with the real session cwd. Use ctx.cwd || cwd so
tools resolve paths against the current session cwd instead of the cwd captured
at tool creation time.

Applies to read, write, edit, grep, find, ls, bash, and powershell.

Co-authored-by: Kimchi <noreply@kimchi.dev>

* fix(ai): match subdomains and root domains in NO_PROXY (earendil-works#8737)

* fix(coding-agent): keep theme markers visible (earendil-works#8950)

- follow up of missed commits for feat(coding-agent): adjust TUI selections in thinking-mode, models and scoped models earendil-works#8900

* fix(coding-agent): keep fixed theme marker visible

- distinguish the saved theme from the preview cursor
- align the automatic option and update coverage

* fix(coding-agent): keep automatic theme marker visible

- mark configured light and dark themes during preview
- reuse shared theme formatting and update coverage

* feat(agent): require explicit named branches for session forks

Require fork scope and source branch selection, preserve the branch name in the destination, and cover named-branch behavior across backends.

* chore: approve contributors from issue earendil-works#8885

* fix(tui): wrap SIGWINCH self-signal so restricted seccomp policies do not crash startup (earendil-works#8898)

* fix(ai): add supportsMaxOutputTokens compat flag for openai-responses (earendil-works#8941)

Some OpenAI Responses-compatible gateways (e.g. Codex-protocol proxies)
reject the max_output_tokens parameter with a 400 BadRequest. The
openai-responses API always sent it when maxTokens was set, with no way
to opt out.

Add a supportsMaxOutputTokens compat flag (default: true) to
OpenAIResponsesCompat. When false, buildParams omits max_output_tokens
from the request body. Also register the flag in the coding-agent
model-config schema so custom providers can set it.

* fix(agent): validate fork entries against named branch ancestry

Reject off-branch and unknown fork points, handle null tips and before-root placement, and make SQLite validate from the named branch tip.

* fix(agent): require configured lanes for branch forks

Reject data-only source branches, preserve tree-scope support for them, and update fork fixtures to provide complete lane configuration and state.

* feat(agent): centralize scalar fork namespace policy

Add a closed fork classifier, copy application scalars for tree forks, exclude them from branch forks, and reject surviving unknown reserved state.

* update wp08 doc

* fix(chord): make post-cutover reload failures terminal

* update harness.md to fork changes defined in wp08

* feat: add deslop prompt

* fix: resolve workspace source dependencies in tests

* fix(coding-agent): recover mini operations and forward aborts

* fix(agent): bound shell execution output

* docs(agent): add scoped storage implementation handoff

* fix(agent): finalize bounded shell output integration

* fix(coding-agent): tunnel proxied HTTP requests

closes earendil-works#8134

* fix(ai): bump claude code user agent version

* Handoff for tool settlemenet

* chore: approve contributors from issue earendil-works#8971

* fix(agent): surface proxy stream EOF without terminal event as an error (earendil-works#8997)

streamProxy dropped a final SSE event that was not newline-terminated
(the residual line buffer was never flushed after the read loop) and
called stream.end() without a result when no done/error event had been
seen, leaving EventStream.result() pending forever. Consumers like
agentLoop awaiting response.result() hung indefinitely when the server
closed the connection mid-response.

Flush the decoder and process the residual buffer after EOF, and push a
synthesized error event when the stream ended without a terminal event.

fixes earendil-works#8996

* feat(ai): add vllmPriority compat flag for vLLM scheduler priority (earendil-works#9004)

OpenAI-compatible providers can now send vLLM's top-level 'priority'
request field (lower value = earlier handling, server default 0),
which matters when vLLM runs with --scheduling-policy priority and a
box serves both interactive and background/batch work: setting
vllmPriority on a background model defers its long prefills behind
interactive sessions.

- types.ts: OpenAICompletionsCompat.vllmPriority?: number (off by default)
- openai-completions.ts: resolved through getCompat, injected in buildParams
- model-config.ts: models.json schema accepts compat.vllmPriority
- test: priority sent when set, omitted otherwise

Co-authored-by: Daniel-Clegg <daniel.clegg@civica.co.uk>

* fix(ai): route GitHub Copilot Fable 5 through Anthropic Messages

closes earendil-works#8961

* fix(ai): use completions API for all Fireworks GLM models

Route every GLM model through the OpenAI-compatible completions API.

Closes earendil-works#8978

* docs(coding-agent): clarify session-scoped model/thinking-level changes (earendil-works#9009)

- fixes earendil-works#8976

* fix: remove misleading write byte counts

The write tools reported UTF-16 code units as bytes. Remove the count from success messages instead of scanning content again.

Closes earendil-works#8979

* fix(coding-agent): remove duplicate auto retry event type

fixes earendil-works#8783

* fix(agent): retain settled tools until placement

* fix: resolve plugin and conformance tests from source

* feat(ai): preserve Anthropic per-turn thinking effort

Route eligible OpenRouter Claude models through the native Messages API and surface provider thinking-drop diagnostics.

* fix(coding-agent): cancel compaction on session abort

Include compaction and branch summarization in session idle tracking so abort waits for cancellation to settle.\n\nfixes earendil-works#8920

* fix(coding-agent): update interactive mode test fixture

* fix(ai): remove unnecessary Chord dependency

* chore: approve contributors from issue earendil-works#9033

* feat(tui): render relational algebra join symbols & fix(coding-agent): type error in test (earendil-works#9050)

* feat(tui): render relational algebra join symbols

* fix(coding-agent): update interactive mode test fixture

* fix(coding-agent): preserve compaction boundary when forking (earendil-works#8990)

Fixes earendil-works#8989

* fix(coding-agent): avoid overwriting imported sessions (earendil-works#8985)

* feat(coding-agent): ingest external entries in in-memory sessions (earendil-works#8980)

* feat(coding-agent): ingest external entries in in-memory sessions

SessionManager.inMemory() takes the entries to start from, so a session
held outside the filesystem can be resumed as it was stored.

Replaying through appendMessage/appendCompaction cannot do this: ids are
minted fresh, so every stored firstKeptEntryId, targetId and fromId has to
be remapped, timestamps are rewritten, and parentId always comes from the
current leaf, so a branched tree needs the original branch() choreography
reproduced call by call.

The entry-adoption half of _setSessionFile becomes _loadEntries, which the
constructor also uses when there are entries but no file. Entries carrying
a session header keep it; without one, the header comes from the options
and the entries become its body.

* fix(coding-agent): carry the stored version through restored entries

inMemory() took SessionEntry[], which excludes SessionHeader, so an
external store could not pass the header it saved and the header branch of
_loadEntries was unreachable through the public API. A restore therefore
always synthesised a current-version header, and the migration that ran
next read that header and skipped: a v2 session kept its hookMessage roles
forever.

Widening to FileEntry[] lets the stored header through, version included.
Migration moves inside the header branch, where a version exists to compare
against; without a header the entries are adopted as current-version, which
is the only thing they can mean.

* fix(coding-agent): resolve fd/rg release versions without the GitHub API (earendil-works#8708)

The fd/ripgrep auto-download resolved the latest version through
api.github.com, which shares the anonymous API quota (60 requests/hour
per IP). Behind shared egress IPs (corporate proxies, CI runners, NAT)
that quota is permanently exhausted by unrelated traffic, so the
download failed with 'GitHub API error: 403' on every launch while the
actual release download endpoint would have worked fine.

Resolve the version from the /releases/latest web redirect instead: it
carries the tag in the Location header, is not subject to the API
quota, and lives on the same origin as the binary download itself. The
redirect body is discarded so the connection can be reused, and the
pinned fd version on darwin/x64 now skips the lookup entirely.

Also improve download failure diagnostics: status messages include the
error cause chain so transport errors surface their actionable detail
instead of a bare 'fetch failed', and HTTP download errors include the
failing URL.

Fixes earendil-works#8594

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

* fix(coding-agent): scan past non-EXIF APP1 segments (earendil-works#8616)

* fix(coding-agent): isolate concurrent session shares (earendil-works#8613)

* fix(coding-agent): keep skills available with bash-only tools (earendil-works#8552)

* fix(ai): keep Baseten GLM-5.2 text-only (earendil-works#8293)

* Replace the AI Gateway binding shim with a plain binding fetch (earendil-works#8287)

createGatewayBindingFetch (0.84.2) translated requests from a gateway
HTTPS prefix into the AI binding's universal endpoint, building the
[{provider, endpoint, headers, query}] envelope by splicing the request
body into a JSON string. The gateway now serves its provider-native
passthrough over the binding at
/ai-gateway/gateways/{gateway}/{provider}/..., the HTTPS path minus the
account id, so a model can simply name that route as its baseUrl and
there is nothing left to translate.

* fix(ai): process unterminated Codex SSE terminal events

Flush the SSE decoder at EOF and treat the residual buffer as a complete frame.

fixes earendil-works#9047

* fix: repair Baseten and coding-agent test checks

Drop the misleading Baseten default-model test and remove a duplicate coding-agent mock declaration rejected by Biome.

* fix(tui): remove coding-agent config reads from pi-tui

Fixes earendil-works#8698

* docs(tui): clarify standalone renderer configuration

Follow-up to c505f4c.

* fix(ai): add Qwen3.8 Flash to individual token plan

Derive Token Plan reasoning effort levels directly from models.dev metadata, retaining fallbacks for GLM-5 and GLM-5.1.

fixes earendil-works#9021

* fix(ai): restore stream compatibility

* fix(ai): preserve provider thinking level in frames

* feat(tui): search improvements (earendil-works#8800)

* fix(coding-agent): raise branch summary output cap

closes earendil-works#8845

* feat(tui): prettier Working... spinner (earendil-works#8799)

* feat(tui): add clickable jump-to-end indicator to fullscreen transcript

Adds TuiAltScreenOptions.scrollToEndIndicator, composited onto the last
row of the follow-end primary scroll view while it is scrolled up. A left
press on the label resumes end-following. Minimal rebuild of earendil-works#9080.

* feat(tui): alt mode scrollbar but prettier (earendil-works#8801)

* fix(agent): map signal-killed processes to non-zero exit codes (earendil-works#8994)

waitForChildProcess resolved null for the exit code when a child was killed by a signal (e.g. OOM killer), and exec mapped it with code ?? 0, so the bash tool treated killed commands as successful.

Track the termination signal and fall back to the shell convention of 128 + signal number (137 for SIGKILL) when no exit code is available.

fixes earendil-works#8992

closes earendil-works#8882

* fix(coding-agent): download statically linked musl builds of fd and ripgrep on Linux (earendil-works#9070)

* fix(ai): remove Grok Build 0.1 from built-in xAI model catalog (earendil-works#9093)

Add grok-build-0.1 to XAI_BUILTIN_EXCLUDED_MODEL_IDS so the generated xAI
catalog only lists grok-4.3, grok-4.5 and grok-4.6. Update the exclusion
test and drop the thinking-level assertion for the removed model.

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

* fix(tui): make fullscreen transcript search scale linearly

* fix(ai): keep Copilot tests aligned with current model catalog

Derive catalog-sensitive test IDs from generated models and update tool-call normalization coverage to GPT-5.5.

* fix(coding-agent): use current Copilot model in registry test

* docs: audit unreleased changelogs

* Release v0.85.0

* Add [Unreleased] section for next cycle

* docs(coding-agent): document running pi in Docker Sandboxes (earendil-works#9077)

* fix(coding-agent): selector save keybindings (earendil-works#9149)

- fixes earendil-works#8797

* feat(ai): add GPT-6 Astra support

* fix(tui): keep list selection unchanged on mouse hover

* fix(coding-agent): keep remote harness dependencies development-only

Separate stable and development entrypoints, exclude remote harness code from distributions, and verify isolated consumer installs before release. Fixes earendil-works#9132.

* feat(tui): accelerate Alt-modified wheel scrolling (earendil-works#9166)

* docs: audit changelogs for v0.85.1

* fix(coding-agent): assert source-only experimental package exports

* fix(coding-agent): make footer debounce tests deterministic

* docs(tui): document Alt-wheel scrolling in unreleased changelogs

* feat(ai): refresh generated image model catalog

* Release v0.85.1

* Add [Unreleased] section for next cycle

* feat(tui): Simplify clipboard handling (earendil-works#9163)

Replace the external clipboard dependency with small macOS, Windows,
and X11 helpers and integrate them into coding-agent.

Run native clipboard operations on worker threads and make command
fallbacks asynchronous. Preserve incremental X11 transfers, legacy text
encodings, native image formats, and existing Wayland and platform tools.

Include native prebuilds with ARM64 page alignment, packaging updates,
and regression coverage.

* feat(coding-agent): prefer strict sampling for built-in tools by default

* fix(coding-agent): select Radius models after catalog discovery

* ci: stop gating on shellcheck style in upstream's workflows

The fork refresh pulled upstream's newer build-binaries.yml, which trips
SC2016/SC2046/SC2155 in the org's actionlint gate. The file is byte-identical to
upstream and we do not edit it — patching one would conflict on every refresh.

These three codes are advisory rather than correctness, so they no longer fail
the gate for workflow scripts. Real shellcheck errors still do.

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

---------

Co-authored-by: yaogangqiang <acmerfight@gmail.com>
Co-authored-by: Armin Ronacher <armin.ronacher@active-4.com>
Co-authored-by: Petr Houška <houskape@gmail.com>
Co-authored-by: David Brailovsky <davidbrai@gmail.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
Co-authored-by: Vegard Stikbakke <vegard.stikbakke@gmail.com>
Co-authored-by: Cristina Poncela Cubeiro <140309543+cristinaponcela@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Alexey Zaytsev <alexey.zaytsev@gmail.com>
Co-authored-by: PiedPiper911 <32931126+PiedPiper911@users.noreply.github.com>
Co-authored-by: Ramiz Wachtler <ramiz@earendil.com>
Co-authored-by: yaogangqiang <yaogangqiang@kanyun.com>
Co-authored-by: Sviatoslav Abakumov <dust.harvesting@gmail.com>
Co-authored-by: Vytautas <vmizgiris@hotmail.com>
Co-authored-by: Kimchi <noreply@kimchi.dev>
Co-authored-by: Nefelibata <124799179+MeiSiristhebest@users.noreply.github.com>
Co-authored-by: Bartłomiej Kida <bartlomiej@kida.info>
Co-authored-by: scturtle <scturtle@gmail.com>
Co-authored-by: Qiaochu Hu <110hqc@gmail.com>
Co-authored-by: AppleDannyClegg <117488935+AppleDannyClegg@users.noreply.github.com>
Co-authored-by: Daniel-Clegg <daniel.clegg@civica.co.uk>
Co-authored-by: xu0o0 <hq.xu0o0@gmail.com>
Co-authored-by: wutongyuonce <147830929+wutongyuonce@users.noreply.github.com>
Co-authored-by: Julien Barbay <julien.barbay@gmail.com>
Co-authored-by: Terminator666666 <104662484+Terminator666666@users.noreply.github.com>
Co-authored-by: Terminator666666 <Terminator666666@users.noreply.github.com>
Co-authored-by: Panoplos <makoto@genbalabs.com>
Co-authored-by: Maximo Guk <62088388+Maximo-Guk@users.noreply.github.com>
Co-authored-by: Anton Geraschenko <geraschenko@gmail.com>
Co-authored-by: Stickman Charles <charlesisworkinghard@gmail.com>
Co-authored-by: Milosz Jankiewicz <25470423+Jaaneek@users.noreply.github.com>
Co-authored-by: Jaaneek <Jaaneek@users.noreply.github.com>
Co-authored-by: Manuel de la Peña <social.mdelapenya@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
jinhuang712 pushed a commit to jinhuang712/pi that referenced this pull request Sep 11, 2026
…#6847)

Add missing ToolExecutionEndEvent, ToolExecutionStartEvent, and
ToolExecutionUpdateEvent type exports to packages/coding-agent/src/index.ts
so they are available to consumers of the package.

Fixes earendil-works#6687
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.

ToolExecution*Events are not exported as part of index.d.ts

2 participants