Commit graph

876 commits

Author SHA1 Message Date
Aliou Diallo
69d02b8a5f
fix(coding-agent): use dynamic paths in error messages (#887)
Error messages for missing credentials and shell config now use
getAuthPath() and getSettingsPath() instead of hardcoded ~/.pi/agent/
paths, so they correctly reflect PI_CODING_AGENT_DIR when set.
2026-01-21 23:21:10 +01:00
Andres Araujo
0363a10c69
feat(coding-agent): add PI_SHARE_VIEWER_URL env var for custom share viewer (#889) 2026-01-21 23:19:12 +01:00
scutifer
2354bc571e
feat(coding-agent): show session name in terminal title and footer (#876)
* ⏺ feat(tui): show session name in terminal title and footer

- Add updateTerminalTitle() method that sets terminal title to
"π - session-name - dirname" (or "π - dirname" if no name)
- Update title when session name changes via /name or extension API
- Display session name in footer after git branch with bullet separator

* chore: update CHANGELOG
2026-01-20 23:05:32 +01:00
scutifer
a9fbfc7955
fix(export): use active theme instead of default for HTML export (#870)
getResolvedThemeColors and getThemeExportColors now fall back to
currentThemeName before getDefaultTheme(), so exports respect the
user's selected theme.
2026-01-20 14:50:40 +01:00
Sviatoslav Abakumov
236285b390
fix(coding-agent): fall back to 256color in Terminal.app (#869) 2026-01-20 14:49:57 +01:00
Michael Renner
20c7b5fed4
feat(tui, coding-agent): add configurable code block indent setting (#855)
Add markdown.codeBlockIndent setting to customize indentation prefix for
rendered code blocks. Default remains 2 spaces for visual clarity, but
setting to empty string removes indentation for easier copy/paste of
code snippets to scripts, editors, or other tools.

Changes:
- tui: add optional codeBlockIndent to MarkdownTheme interface
- coding-agent: add MarkdownSettings with codeBlockIndent property
- coding-agent: compose theme with settings at call sites (no global state)
- coding-agent: update message components to accept optional MarkdownTheme

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-01-19 22:36:03 +01:00
Mario Zechner
46545276e3 fix(coding-agent): show errors from write tool in UI
fixes #856
2026-01-19 22:30:30 +01:00
Armin Ronacher
d276c9fbe0
l -> shift+l so one can search for l (#861) 2026-01-19 22:22:20 +01:00
Mario Zechner
2b04aefa6d feat(ai): add AWS ECS/IRSA credential detection for Bedrock, fixes #848
Added support for additional AWS credential environment variables:
- AWS_CONTAINER_CREDENTIALS_RELATIVE_URI (ECS task roles)
- AWS_CONTAINER_CREDENTIALS_FULL_URI (ECS task roles)
- AWS_WEB_IDENTITY_TOKEN_FILE (IRSA for Kubernetes)

Also fixed undefined currentModel variable in OAuth error handling.
2026-01-19 16:10:10 +01:00
Dave
d6bb66a494
fix(coding-agent): prevent crash on OAuth authentication failure (#849)
Detect OAuth authentication failures (expired credentials, offline) and provide helpful error message instead of crashing with generic 'No API key found' error.

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-01-19 15:59:45 +01:00
Armin Ronacher
98fb9f378c
Improves the HTML export (#853)
- Added jsonl download button

Jump to last message on click

Fix missing labels
2026-01-19 15:57:44 +01:00
Mario Zechner
2d27a2c728 fix(ai): skip errored/aborted assistant messages in transform-messages
Fixes OpenAI Responses 400 error 'reasoning without following item' by
skipping errored/aborted assistant messages entirely rather than filtering
at the provider level. This covers openai-responses, openai-codex-responses,
and future providers.

Removes strictResponsesPairing compat option (no longer needed).

Closes #838
2026-01-19 15:55:29 +01:00
Marc Krenn
abb1775ff7
feat(coding-agent): Add widget placement option (#850)
* Add widget placement for extension widgets

* Remove changelog entry for widget placement

* Keep no-op widget signature

* Move widget render before attach
2026-01-19 15:54:24 +01:00
Burak Varlı
25e7e2d08a
feat(coding-agent): Add quietStartup setting to /settings (#847)
* feat(coding-agent): Add `quietStartup` setting to `/settings`

* chore(coding-agent): Add CHANGELOG entry for "quiet startup" in `/settings`
2026-01-19 15:02:24 +01:00
Mario Zechner
2217cde74c fix(coding-agent): improve model scope toggle 2026-01-19 15:00:46 +01:00
Mario Zechner
4cc1c96495 fix(coding-agent): exit on resume cancel 2026-01-19 14:01:03 +01:00
Sviatoslav Abakumov
bacf334bc4 feat(tui): add undo support to Editor with the Ctrl+- hotkey
Undo snapshots are captured for all edit operations:

- Word insertion, backspace, forward delete
- Word/line deletion (Ctrl+W, Ctrl+U, Ctrl+K, Alt+D)
- Yank/yank-pop, paste, autocomplete completion
- Cursor movement starts a new undo unit
- setText() pushes snapshot when content changes

Additionally, history browsing captures the undo state on first entry.
2026-01-19 00:18:47 +01:00
Mario Zechner
298af5c1c2 style(coding-agent): move border above header, use keyHint for consistency 2026-01-18 20:27:11 +01:00
warren
26fe048314 feat(coding-agent): add session path toggle and deletion to /resume 2026-01-18 20:25:00 +01:00
Mario Zechner
d43930c818 feat(ai): add strictResponsesPairing for Azure OpenAI Responses API
Split OpenAICompat into OpenAICompletionsCompat and OpenAIResponsesCompat
for type-safe API-specific compat settings. Added strictResponsesPairing
option to suppress orphaned reasoning/tool calls on incomplete turns,
fixing 400 errors on Azure's Responses API which requires strict pairing.

Closes #768
2026-01-18 20:15:33 +01:00
Carlos Villela
def9e4e9a9
Support shell command execution for API key resolution in models.json (#762)
* Support shell command execution for API key resolution in models.json

Add ! prefix support to apiKey field in models.json to execute shell commands
and use stdout as the API key. This allows users to store API keys in secure
credential managers like macOS Keychain, 1Password, Bitwarden, or HashiCorp Vault.

Example: "apiKey": "!security find-generic-password -ws 'anthropic'"

The apiKey field now supports three formats:
- !command - executes shell command, uses trimmed stdout
- ENV_VAR_NAME - uses environment variable value
- literal - uses value directly

fixes #697

* feat(coding-agent): cache API key command results for process lifetime

Shell commands (! prefix) are now executed once and cached. Environment
variables and literal values are not cached, so changes are picked up.

Addresses review feedback on #762.

---------

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-01-18 19:48:06 +01:00
Richard Gill
c36010880f Reserve copy action during extension conflicts 2026-01-18 19:37:52 +01:00
Richard Gill
5353dd4b7e Normalize builtin keybinding keys to lowercase 2026-01-18 19:37:52 +01:00
Richard Gill
7cacb49af9 Clarify comment about reserved extension keybindings 2026-01-18 19:37:52 +01:00
Richard Gill
54c33f2ade Respect reserved keybindings when registering extensions 2026-01-18 19:37:52 +01:00
Mario Zechner
b4f833c259 fix(coding-agent): fix IME candidate window positioning in menu selectors
Components with search inputs now implement Focusable interface and
propagate focus state to their child Input components. This allows
the hardware cursor to be positioned correctly for IME candidate
window placement.

Affected components:
- ModelSelectorComponent
- ScopedModelsSelectorComponent
- SessionSelectorComponent (and SessionList)
- ExtensionInputComponent
- LoginDialogComponent
- TreeSelectorComponent (and LabelInput)

fixes #827
2026-01-18 17:23:04 +01:00
Michael Renner
8b23c0a45e
feat(coding-agent): use hash fragments for share URLs (#829)
Fixes #828
2026-01-18 17:18:17 +01:00
Mario Zechner
964f17b8d1 fix(coding-agent): load photon wasm in compiled binaries 2026-01-18 17:11:49 +01:00
Mario Zechner
4068bc556a chore: simplify codex prompt handling 2026-01-17 21:53:01 +01:00
Mario Zechner
94bd7f69fd fix(coding-agent): load photon via dynamic import 2026-01-17 21:32:23 +01:00
Mario Zechner
157e4e51bf feat(coding-agent): add ExtensionAPI setLabel 2026-01-17 21:18:59 +01:00
Sviatoslav Abakumov
505894f4ea feat(tui): add Alt+D to delete word forward (kill)
Adds deleteWordForward action bound to Alt+D, which deletes from cursor
to the end of the current word and saves to kill ring for later yanking.
Consecutive forward kills append to the same kill ring entry.
2026-01-17 21:11:20 +01:00
Sviatoslav Abakumov
9fb7434a06 feat(tui): implement Emacs-style kill ring for Editor
Add kill ring functionality with:

- Ctrl+W/U/K save deleted text to kill ring
- Ctrl+Y yanks (pastes) most recent deletion
- Alt+Y cycles through kill ring (after Ctrl+Y)
- Consecutive deletions accumulate into single entry
2026-01-17 21:11:20 +01:00
Mario Zechner
05ee8e3334 fix(coding-agent): show compaction UI for extensions 2026-01-17 11:48:54 +01:00
Mario Zechner
9d3f8117a4 feat(coding-agent): add extension compaction helpers 2026-01-17 11:40:39 +01:00
Mario Zechner
673916f63c fix(tui): always position cursor for IME
# Conflicts:
#	packages/coding-agent/CHANGELOG.md
2026-01-17 11:40:39 +01:00
Jian Zhang
fc538f6ca1
feat(coding-agent): export VERSION and update custom-header example (#798)
Co-authored-by: Jian Zhang <jzhang@yanhuangdata.com>
2026-01-17 10:54:00 +01:00
Danila Poyarkov
58eec55154
feat(coding-agent): export keyHint utilities for extensions (#802) 2026-01-17 10:51:03 +01:00
Mario Zechner
fe52ff00d2 feat: add editorPaddingX setting for input editor horizontal padding 2026-01-16 23:50:00 +01:00
Mario Zechner
1405e30492 revert: remove editor paddingX from coding-agent 2026-01-16 23:19:58 +01:00
ferologics
48ea444bc4 fix: align input editor with message content padding
Adds paddingX option to Editor component and hardcodes paddingX: 1 in
coding-agent editors so the cursor/text aligns with chat message content.
2026-01-16 23:15:06 +01:00
Mario Zechner
20f5fcc79d fix(coding-agent): handle auto-compaction failures gracefully
When auto-compaction fails (e.g., quota exceeded), emit the error via
the auto_compaction_end event instead of throwing. The UI now displays
the error message, allowing users to take action (switch models, wait
for quota reset, etc.) instead of crashing.

fixes #792
2026-01-16 23:13:26 +01:00
Mario Zechner
fbb74bb29e fix(ai): filter empty error assistant messages in transformMessages
When 429/500 errors occur during tool execution, empty assistant messages
with stopReason='error' get persisted. These break the tool_use -> tool_result
chain for Claude/Gemini APIs.

Added centralized filtering in transformMessages to skip assistant messages
with empty content and no tool calls. Provider-level filters remain for
defense-in-depth.
2026-01-16 22:35:50 +01:00
Rafał Krzyważnia
d2f9ab110c
feat(coding-agent): add startup.quiet setting to silence startup output (#777)
* feat(coding-agent): add startup.quiet setting to silence startup output

* feat(coding-agent): add startup.quiet setting to silence startup output

Adds a new setting `startup.quiet` that when set to `true` hides:
- Version and keybinding hints header
- Loaded context/skills/templates/extensions discovery info
- Model scope line

Changelog notifications are still shown so users know about updates.

Usage in ~/.pi/agent/settings.json:
{
  "startup": {
    "quiet": true
  }
}

* refactor: flatten startup.quiet to quietStartup on Settings
2026-01-16 22:03:29 +01:00
Mario Zechner
3326b8f521 Fix --no-extensions flag not preventing extension discovery
When --no-extensions was used, extensionsResult.extensions was an empty
array. The condition in buildSessionOptions() checked .length > 0,
so preloadedExtensions was not set. This caused createAgentSession()
to fall through to extension discovery.

Remove the .length > 0 condition so the empty result is passed through,
signaling that extension loading was already handled.

Fixes #776
2026-01-16 22:01:23 +01:00
Mario Zechner
572ec64dbd Fix navigateTree API: add missing type updates, handler passthrough, and docs
- Update ExtensionCommandContext.navigateTree type signature
- Pass new options through in print-mode and rpc-mode handlers
- Update docs/extensions.md, docs/sdk.md, docs/tree.md
- Add changelog entry
2026-01-16 21:47:01 +01:00
Armin Ronacher
6b6707f30c Improve navigateTree API 2026-01-16 21:37:25 +01:00
Mario Zechner
75628e0cfd fix(coding-agent): use lazy-loaded photon wrapper for Node.js compatibility
Previous commit broke Node.js/tsx by using the ESM entry point which
doesn't work with Node. This creates a wrapper module that:
- Uses require() for lazy loading (works in both Node and Bun)
- Gracefully handles load failures (returns original image)
- Works in Node.js, tsx, and Bun compiled binaries
2026-01-16 21:18:13 +01:00
Mario Zechner
5aa0689828 fix(coding-agent): fix standalone binary WASM loading on Linux, fixes #784
- Import photon-node from ESM entry point (photon_rs_bg.js) instead of CJS
  entry, allowing Bun to embed WASM in compiled binaries
- Add photon.d.ts for TypeScript support of ESM entry
- Add scripts/build-binaries.sh for local binary builds
- Simplify GitHub workflow to use the build script
- Add binaries/ to gitignore
2026-01-16 21:11:01 +01:00
Rafał Krzyważnia
48b4324155
fix(session): improve session ID resolution with global search and fork support (#785)
When using `--session <UUID>`, the session lookup now:

1. Searches locally first (current project's session directory)
2. Falls back to global search across all projects
3. If found in different project, prompts user to fork the session
4. If not found anywhere, shows clear error instead of silently creating
   a broken session with malformed path

Adds `SessionManager.forkFrom()` to create a forked session from another
project, preserving full conversation history with updated cwd.
2026-01-16 20:18:10 +01:00