feat(coding-agent): show update notes#4724
Merged
Merged
Conversation
gbharg
added a commit
to gbharg/pi-mono
that referenced
this pull request
May 23, 2026
…endil-works) + gpt-5.5 (#12) * update changelog * docs: audit unreleased changelog entries * Release v0.73.1 * Add [Unreleased] section for next cycle * Release v0.74.0 * Add [Unreleased] section for next cycle * fix(release): restore linux binary build * doc: Update readmes * fix(lockfile): restore platform optional packages * fix(coding-agent): detect renamed npm self updates * feat(scripts): add session context stats * fix(ai): disable OpenAI reasoning where supported * docs(coding-agent): fix termux-open chooser flag * fix(coding-agent): disambiguate resource paths * Add 'herrnel' to approved contributors list Added 'herrnel' as an approved contributor. * fix: lazy loading * fix: no fallback for apiKey * refactor(agent): make resource invocation explicit * fix(coding-agent): hyperlink update changelog closes earendil-works#4280 * chore: approve contributor chrisvariety * fix(coding-agent): show Option key on macOS closes earendil-works#4289 * chore: update issue gate refactor message * feat(ai): add Together AI provider * feat(tui): wrap list items with indent * refactor(agent): rename resource formatting helpers * test(agent): pin harness resource formatting * fix(ai): respect proxy envs in bun's websocket fixes earendil-works#4346 * docs(coding-agent): update theme schema URLs * refactor(agent): snapshot harness turn state * docs(agent): clarify harness lifecycle state * fix(ai): add session affinity and compat fixes for Fireworks provider caching Fireworks prompt caching is enabled by default (automatic prefix matching), but on serverless infrastructure, requests hit random replicas. Without session affinity, the per-replica cache misses, negating cache hit rates and the discounted cacheRead pricing. Changes: - Add sendSessionAffinityHeaders and supportsCacheControlOnTools to AnthropicMessagesCompat interface - Send x-session-affinity header for Fireworks (and Cloudflare AI Gateway Anthropic) when sessionId is available and caching is enabled - Omit cache_control on tool definitions for Fireworks (unsupported per https://docs.fireworks.ai/tools-sdks/anthropic-compatibility) - Default supportsEagerToolInputStreaming to false for Fireworks (unsupported field) - Default supportsLongCacheRetention to false for Fireworks (cache_control.ttl not supported) - Add compat settings to Fireworks models in generate-models.ts - Update generated models with Fireworks compat settings - Add integration tests for session affinity and tool compat Refs: https://docs.fireworks.ai/guides/prompt-caching Refs: https://docs.fireworks.ai/tools-sdks/anthropic-compatibility * refactor(agent): make harness resources explicit * refactor(agent): finalize harness resource config * fix(ai): update copilot claude test model * fix(ai): align copilot claude adaptive test * chore: approve contributor maximilianzuern * fix(coding-agent): share theme across package scopes closes earendil-works#4333 * feat(agent): add harness stream configuration * test(agent): cover harness stream configuration * fix(tui): render the checkboxes in the to-do list items * fix tool config in example in sdk.ts * fix tool config in example in SDK README.md * fix inconsistency in README * fix tool config in SDK docs * minor fix in body * fix(coding-agent): dispose SDK example sessions * fix(compaction): clamp summary output tokens Fixes earendil-works#4390. * fix(coding-agent): restore terminal on uncaught exception When an uncaught exception fires in interactive mode, the process dies with stdin still in raw mode and the cursor hidden, leaving the user with a "borked" terminal that needs `stty sane && reset` to recover. The most common trigger is an extension's async ChildProcess `exit` callback that throws (e.g. from accessing a stale ctx after session replacement), but this affects any uncaught throw from anywhere in pi. Add an uncaughtException handler in registerSignalHandlers that calls ui.stop() before exiting, mirroring the existing emergencyTerminalExit pattern. The handler is registered with prependListener and tracked in signalCleanupHandlers, so it is removed on graceful shutdown the same way the other handlers are. Unlike emergencyTerminalExit (used for SIGHUP / dead-terminal EIO), the terminal is still alive on uncaughtException, so we run the normal ui.stop() to restore cooked mode, the cursor, bracketed paste mode, and Kitty / modifyOtherKeys sequences. * chore: approve contributor brianmichel * fix(coding-agent): retry Anthropic message_stop stream endings closes earendil-works#4433 * fix(coding-agent): allow tool expansion during extension confirms closes earendil-works#4429 * chore(deps): remove unused dependencies (earendil-works#4453) * Add Windows arm64 binary support Update build-binaries workflow and shell script to allow for packaging of both arm64 and x64 versions of the Windows application. * Update bun version to minimum required version for Windows ARM * fix(tui): Make markdown.ts more robust to large markdown files (earendil-works#4463) * chore(deps): Kill small dependencies (earendil-works#4467) * chore(deps): replace cli-highlight (earendil-works#4468) * fix(tui): place image correctly when viewport height < image height (earendil-works#4461) fixes earendil-works#4415 * fix(ai): mark inception/mercury-2 thinkingLevelMap.off as null Mercury 2 in instant mode (reasoning_effort: "none") disables tool calling. The openai-completions provider hardcodes {reasoning:{effort:"none"}} when no explicit reasoning level is passed and thinkingLevelMap.off isn't null (openai-completions.ts:575), so every caller that doesn't opt in to a level silently breaks Mercury 2's agentic use cases. Setting thinkingLevelMap.off = null on the Mercury 2 catalog entry causes the provider to omit the reasoning param entirely, letting Mercury 2's own default take over. Low/medium/high pass through verbatim; OpenRouter normalizes them to Mercury's vocabulary. Prefix-matched on "inception/mercury-2" so future Mercury 2 variants on OpenRouter inherit the fix. * fix(coding-agent): align stripAnsi with strip-ansi * fix(agent): correct uuidv7 sequence handling * fix(tui): cap portrait image render height * refactor(ai): use HTTP proxy agents for Bedrock * Address edge-case with kitty protocol in wezterm packages/tui/src/stdin-buffer.ts — in extractCompleteSequences, after finding \x1b\x1b as "complete" (legacy meta-key), check if the next character in the buffer would start a new escape sequence ([, ], O, P, _). If so, emit only the first \x1b and let the second ESC begin a new parse iteration. packages/tui/test/stdin-buffer.test.ts — three new cases in the Kitty section: - \x1b\x1b[27;129:3u (num_lock) splits into ["\x1b", "\x1b[27;129:3u"] - \x1b\x1b[27;1:3u (no num_lock) splits into ["\x1b", "\x1b[27;1:3u"] - \x1b\x1b alone (no following CSI) still emits as ["\x1b\x1b"] — preserves ctrl+alt+[ * fix(ai): honor retry-after for OpenAI Codex SSE retries - honor `retry-after-ms` and `retry-after` for OpenAI Codex SSE retries - add SSE retry coverage for millisecond, seconds, date, and fallback delays * docs: add helper inlining rule * refactor(agent): add result-based execution env * refactor(agent): run harness loop directly * refactor(agent): return results from compaction helpers * fix(release): finalize Windows ARM64 binary support closes earendil-works#4410 * refactor(agent): isolate node filesystem session dependencies * fix(coding-agent): fix Termux docs code fence closes earendil-works#4503 * fix(coding-agent): space interactive errors closes earendil-works#4510 * fix(ai): ignore generic GitHub tokens for Copilot auth closes earendil-works#4485 * fix(ai): openai-completions - throw error on missing finish-reason - require \ before treating \ streams as successful - add regression coverage for truncated streams without \ - closes earendil-works#4345 * docs(coding-agent): fix invalid notify type in extensions example The notify() API only accepts "info" | "warning" | "error" — "success" was a copy-paste error in the example. Co-Authored-By: julien-agent <Agents+cyolo@huggingface.co> * refactor(agent): harden harness session semantics * docs(agent): document harness hook design * docs(coding-agent): document overflow normalization for custom providers Adds a Context Overflow Errors subsection to custom-provider.md showing how a custom provider extension can rewrite unrecognized overflow errors via a message_end handler so pi's native compact-and-retry path triggers. Includes guard rails for provider scoping, idempotency, and avoiding rate-limit phrases. * fix(ai): preserve OpenRouter cached token semantics * docs(agent): organize harness design todos * chore: approve contributor abhinavmathur-atlan * fix(coding-agent): cap resume session metadata loads closes earendil-works#4583 closes earendil-works#4591 * fix(ai): detect litellm context overflow errors closes earendil-works#4563 * fix(ai): respect model output token limits closes earendil-works#4539 * fix(coding-agent): parse multiline prompt template args closes earendil-works#4553 * fix(coding-agent): allow skill names to differ from directories closes earendil-works#4534 * fix(coding-agent): pin fd for macos x64 closes earendil-works#4559 * fix(ai): vendor proxy env resolution closes earendil-works#4513 * fix(coding-agent): use configured model scope cycle hint closes earendil-works#4508 * fix(coding-agent): resolve pnpm global packages Fixes earendil-works#4501 * fix(deps): restore lockfile registry metadata Fixes earendil-works#4315 * fix(coding-agent): update clipboard native package closes earendil-works#4492 * fix(coding-agent): route global fetch through undici dispatcher closes earendil-works#4519 * docs: audit unreleased changelogs * Release v0.74.1 * fix(coding-agent): route compaction through streamFn closes earendil-works#4484 * chore: approve contributor mattiacerutti * fix(ai): update OpenAI Codex model list * Updated system-prompt.ts to use xml boundaries during system and context file merging rather than using `##` so that agents are less likely to ingest a prompt with inconsistent boundaries. * fix(ai): map copilot gpt minimal thinking to low * chore: restore normal issue gate message * fix(ai): cap context-sized default output budgets closes earendil-works#4614 * fix(coding-agent): install npm packages in managed root closes earendil-works#4587 * fix(coding-agent): remove global fetch override closes earendil-works#4619 * chore: audit unreleased changelog entries * Release v0.75.0 * Add [Unreleased] section for next cycle * Closes earendil-works#4342 * Remove openai-codex fast model variants, they do not work * fix(ai): switch xiaomi models to openai completions closes earendil-works#4505 * fix(coding-agent): spawn Windows npm shims directly closes earendil-works#4623 * chore: add pi-test batch wrapper * fix(ai): normalize opencode go reasoning replay closes earendil-works#4251 * fix(ai): prefix HTTP status codes onto Azure OpenAI and OpenAI Responses error messages so auto-retry fires on 5xx/429 closes earendil-works#4232 * fix(ai): skip unknown bedrock content blocks closes earendil-works#4223 * fix(coding-agent): align undici fetch globals closes earendil-works#4650 closes earendil-works#4652 closes earendil-works#4653 * chore: audit unreleased changelogs * Release v0.75.1 * Add [Unreleased] section for next cycle * fix(coding-agent): guard undici install under Bun fixes earendil-works#4657 * fix(coding-agent): scroll shared tool entries to rendered tool calls * fix(coding-agent): avoid Windows self-update native locks closes earendil-works#4157 * fix(coding-agent): detect pnpm v11 self-update installs closes earendil-works#4647 * fix(coding-agent): allow Windows pnpm self-update closes earendil-works#4157 * fix(coding-agent): unblock Windows external editor closes earendil-works#4612 * chore: approve contributor josephyoung * chore(prompts): disclose wr-generated comments * fix(ai): add Xiaomi reasoning replay compat closes earendil-works#4678 * fix(coding-agent): use cross-spawn for Windows shims closes earendil-works#4665 * chore(coding-agent): audit unreleased changelog * Release v0.75.2 * Add [Unreleased] section for next cycle * fix(coding-agent): disable undici http2 Fixes earendil-works#4681. Fixes earendil-works#4682. * Release v0.75.3 * Add [Unreleased] section for next cycle * docs(coding-agent): add uninstall instructions * Updated the default system prompt to also use xml boundaries instead of using ## so that agents are less likely to ingest a prompt with unclear boundaries. * fix(coding-agent): set explicit theme text colors * feat(coding-agent): improve terminal theme detection * fix: align theme truecolor detection * fix(coding-agent): improve subagent parallel summaries closes earendil-works#4710 * fix(agent): preserve oversized tail output with trailing newline closes earendil-works#4715 * fix(windows): hide bash helper consoles closes earendil-works#4699 * docs: add ad-hoc script guidance * fix(coding-agent): simplify agent session settlement * fix(coding-agent): mark retrying agent end events * docs(agent): clarify harness stream settlement * fix(ai): clamp OpenAI prompt cache keys closes earendil-works#4720 * chore: update issue analysis prompt * fix(ai): stop defaulting max token request caps closes earendil-works#4675 * feat(coding-agent): show update notes (earendil-works#4724) * fix(agent): stop tool preflight after extension abort closes earendil-works#4276 * fix(coding-agent): clarify pi docs path resolution closes earendil-works#4752 * chore: enforce erasable TypeScript syntax * chore(ts): use source import extensions * chore: remove redundant erasable type check * Export image resize utilities * fix(tui): initialize loader before starting indicator * chore: remove web-ui workspace * chore: run pi test script with node * fix(package-manager): ignore managed npm folders in cloud sync closes earendil-works#4763 * chore: approve contributor mbazso * test: speed up provider payload coverage * fix(coding-agent): configure HTTP idle timeout (earendil-works#4759) * chore: pin dependencies and use native TypeScript * chore: add local release and dependency guards * docs: require local release smoke test * fix(coding-agent): keep fork session id aligned * chore: shrinkwrap coding agent release deps * fix(coding-agent): disable scripts during self-update * docs: recommend scriptless npm installs * chore: enforce npm dependency age gate * chore: run pi-test through tsx * chore: harden dependency workflows * chore: add bun local release smoke install * docs(coding-agent): document fnm npm shim fix closes earendil-works#4793 * docs: audit unreleased changelog entries * Release v0.75.4 * Add [Unreleased] section for next cycle * chore: add HF_TOKEN to pi-test.ps1 --no-env unset list Aligns the PowerShell script with pi-test.sh, which already unsets HF_TOKEN. Co-Authored-By: julien-agent <Agents+cyolo@huggingface.co> * fix(coding-agent): list themes by content name * docs: document dependency install security * chore(tui): replace koffi with Windows VT input helper closes earendil-works#4480 * fix(coding-agent): avoid duplicate bash truncation path closes earendil-works#4819 * feat(coding-agent): expose edit tool unified patch closes earendil-works#4821 * fix(coding-agent): correct bash truncation line count closes earendil-works#4818 * test(coding-agent): update bash truncation expectation * chore: approve contributor AJM10565 * docs: document safe development install closes earendil-works#4868 * fix(ai): set bedrock claude default max tokens closes earendil-works#4848 * docs: note Node 20 rescue release Closes earendil-works#4876 * feat(ai): refactor device code login for copilot * chore: update PR prompt template * fix(coding-agent): reconcile git package refs closes earendil-works#4870 * fix(coding-agent): Clean up Path Handling (earendil-works#4873) * Tighten AGENTS.md and extract LLM provider checklist to skill - Tighten all sections (279 -> 159 lines) without dropping rules. - Reorganize: git rules moved next to issues/PRs. - Defer contributor gate details to CONTRIBUTING.md. - Replace stale npx tsx test command with node (strip-only mode); add ./test.sh + e2e warning. - Releasing: explicit WebAuthn briefing step, no bash timeout, stop on partial publish failure. - Move LLM provider checklist to .pi/skills/add-llm-provider.md. * fix(coding-agent): use the right basedir for patterns * fix(export-html): escape quotes in exported attributes closes earendil-works#4832 * Clean up OAuth device-code callbacks * fix(ai): declare Bedrock Smithy HTTP handler dependency closes earendil-works#4842 * Support adaptive thinking for Anthropic-compatible aliases closes earendil-works#4790 * Fix Anthropic eager tool input compat test * fix(coding-agent): add OpenCode session headers closes earendil-works#4847 * test(ai): avoid hardcoded Fireworks router id * fix(coding-agent): reconcile pinned git update refs closes earendil-works#4869 * feat(skills): add AMD + RC workflow skills for Exult Adds 10 project-level skills under .claude/skills/ for common Exult Healthcare front-office workflows, split across AdvancedMD (5) and RingCentral (5). Each SKILL.md covers: purpose, inputs, prerequisites, API-first workflow with UI fallback, per-request approval gates, verify, rollback, common pitfalls, and references to local AMD API doc cache + memory. PHI/PCI-sensitive skills (add-patient, reschedule, cancel, records, payment) require explicit per-request Gautam approval before any write and never log full PHI/card data. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(skills): add AMD + RC workflow skills batch 2 for Exult Adds 10 new project-level skills covering insurance verification + add, patient check-in, document upload, patient messaging, refunds, SMS reminders, IVR updates, temporary call forwarding, and a composite daily KPI report. Updates INDEX.md and preserves batch 1 conventions (API-first + UI fallback, per-request approval gates for PHI/financial writes, PHI redaction rules). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(exult-mcp): add stdio MCP servers for RC admin, M365 app-only, and AMD XMLRPC Adds three local stdio MCP servers under packages/exult-mcp/ to fill gaps in Claude Desktop coverage of Exult Healthcare operational services: - ringcentral-admin: RC Platform API with the Remote Admin JWT — extensions, call queues, IVR, detailed/paginated call log, voicemails, transcripts (fills the gap Keragon RC MCP leaves around admin/pagination/voicemail). - microsoft365-admin: Graph client_credentials (Exult Agent Service app) for tenant-wide directory, any-mailbox mail/calendar, groups, SharePoint (claude_ai_Microsoft_365 is Gautam's personal delegated OAuth — doesn't cover tenant admin). - advancedmd-xmlrpc: ARC022825 service-account XMLRPC for getUpdatedPatients, getUpdatedVisits, getVisitInfoByDate, getEhrUpdatedNotes, getAppointmentHistory, plus a raw_xmlrpc_request escape hatch. Complements Keragon AMD (which can't reach the service-account-only getUpdated family). All tools are READ-ONLY. Writes deliberately excluded — AMD writes require Gautam's per-operation approval and Keragon already covers the write APIs. Each server live-smoke-tested against its real API during build: - RC returned account 2761864020 / Confirmed - M365 returned tenant Exult Healthcare / 707a7153-... - AMD XMLRPC login + getfieldsets probe returned 3310 bytes of table XML Full build log at .pi/services/mcp_setup/build_log.md including MBP config discovery gap (MBP offline 8h, ssh unreachable), coverage gap analysis, and the claude.ai remote MCP hosting note (only M365 is hostable; RC and AMD are local-only due to PHI + session-auth). Claude Desktop config at ~/Library/Application Support/Claude/ was updated out-of-tree and is NOT part of this commit. Credential JSON files remain uncommitted in .config/exult/. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: upstream merge cleanup — namespace rename + typecheck fixes Upstream pi-mono renamed @mariozechner/pi-* → @earendil-works/pi-*. This commit lands the full upstream merge plus the post-merge work needed for local extensions/packages to build & pass all pre-commit gates. - @mariozechner/pi-* → @earendil-works/pi-* in source files - gbharg-auto-review pin → ^0.75.4 - Dedupe loader.ts virtualModules + getAliases (sed-pass dupes) - `: any` annotations for noImplicitAnyLet errors (cli.ts + index.ts) - biome --write --unsafe auto-fixes (useTemplate, useLiteralKeys, etc) - Pin floating ^ deps per check:pinned-deps - Rewrite relative .js → .ts imports (gbharg-auto-review + .pi/extensions) - .gitignore .next/ + delete tracked .next dirs - Cast StringEnum() to any in sendblue extension (TUnsafe vs TSchema mismatch post-upstream typebox bump) Build passes for all 4 workspace packages: pi-tui, pi-ai (gpt-5.5 + gpt-5.5-pro exposed), pi-agent-core, pi-coding-agent. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore: refresh package-lock.json + fix sendblue typebox import - CI failed on stale lockfile post dep-pinning (npm install regenerated) - sendblue extension imported '@sinclair/typebox' but package not in its deps. Switched to 'typebox' (the bundled-rebranded fork) matching the convention used across the rest of the monorepo. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Mario Zechner <badlogicgames@gmail.com> Co-authored-by: Cristina Poncela Cubeiro <140309543+cristinaponcela@users.noreply.github.com> Co-authored-by: Armin Ronacher <armin.ronacher@active-4.com> Co-authored-by: PriNova <Info@prinova.de> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Sviatoslav Abakumov <dust.harvesting@gmail.com> Co-authored-by: haoqixu <hq.xu0o0@gmail.com> Co-authored-by: yanirz <3331050+yanirz@users.noreply.github.com> Co-authored-by: Maximilian <85677120+maximilianzuern@users.noreply.github.com> Co-authored-by: Michael Yu <yzhg1983@163.com> Co-authored-by: Omair Ahmed <omair.ahmed@shopify.com> Co-authored-by: Brian Michel <brian.michel@gmail.com> Co-authored-by: Nelson Herrera <ndanielherrera@icloud.com> Co-authored-by: Apoorv Saxena <apoorvumang@gmail.com> Co-authored-by: Mikhail f. Shiryaev <mr.felixoid@gmail.com> Co-authored-by: Ramiz Wachtler <ramiz@earendil.com> Co-authored-by: Julien Chaumond <julien@huggingface.co> Co-authored-by: julien-agent <Agents+cyolo@huggingface.co> Co-authored-by: Aliou Diallo <code@aliou.me> Co-authored-by: Mattia Cerutti <mattiacerutti04@gmail.com> Co-authored-by: Doug Masiero <doug@masie.ro> Co-authored-by: Alexey Zaytsev <alexey.zaytsev@gmail.com> Co-authored-by: Vegard Stikbakke <vegard.stikbakke@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This future proofs the updater in two ways:
https://pi.dev/changelog.