Commit Graph
1835 Commits
Author SHA1 Message Date
Mario Zechner 8cb9a42067 docs(coding-agent): add changelog entry for sandbox extension (#673) 2026-01-12 23:25:54 +01:00
Danila PoyarkovandGitHub 4751ebddbd feat(extensions): add sandbox extension for OS-level bash sandboxing (#673)
Uses @anthropic-ai/sandbox-runtime to enforce filesystem and network
restrictions on bash commands (sandbox-exec on macOS, bubblewrap on Linux).

Features:
- Per-project config via .pi/sandbox.json
- Global config via ~/.pi/agent/sandbox.json
- Enabled by default with sensible defaults
- --no-sandbox flag to disable
- /sandbox command to view current config
2026-01-12 23:25:31 +01:00
Mario Zechner 7cad705a15 Add [Unreleased] section for next cycle 2026-01-12 19:05:08 +01:00
Mario Zechner 477c263838 Release v0.44.0 2026-01-12 19:04:28 +01:00
Nico Bailon d29f268f46 feat(tui): add pad parameter to truncateToWidth, overlay QA tests 2026-01-12 10:01:53 -08:00
Mario Zechner 842a65f06a Add changelog and docs for settings fuzzy search (#643) 2026-01-12 19:00:33 +01:00
ninldsandMario Zechner ec2b7b5a00 Add fuzzy search to settings list 2026-01-12 18:10:33 +01:00
Mario Zechner 8e5b0112e7 Add changelog entry for theme fix 2026-01-12 17:52:02 +01:00
Mario Zechner f8e5fe1ed0 Use globalThis for theme to share across module loaders
When running with tsx in dev mode, jiti loads extensions in a separate
module cache. This caused the theme to be undefined in jiti's copy of
theme.ts since initTheme() was only called on tsx's copy.

Using globalThis with Symbol.for() ensures all module instances share
the same theme, regardless of which loader created them.
2026-01-12 17:51:41 +01:00
Mario Zechner 5f380822ea Revert "Fix jiti alias resolution in dev mode with tsx"
This reverts commit c7aa2c97a9.
2026-01-12 17:41:46 +01:00
Mario Zechner c7aa2c97a9 Fix jiti alias resolution in dev mode with tsx
When running from source with tsx, the jiti aliases pointed to .js files
that don't exist (only .ts files exist). This caused jiti to fall back to
different module resolution, loading a separate instance of theme.ts where
initTheme() was never called, resulting in undefined theme.

Now checks if .js exists and falls back to .ts for dev mode compatibility.
2026-01-12 17:38:31 +01:00
Mario Zechner a46c4aab4f Revert "Initialize theme with default value at module load time"
This reverts commit d18e44d378.
2026-01-12 17:29:56 +01:00
Mario Zechner d18e44d378 Initialize theme with default value at module load time
Prevents undefined theme when extensions call ctx.ui.custom() in edge cases
where module resolution could cause the theme variable to be accessed before
initTheme() is called.
2026-01-12 17:27:59 +01:00
Mario Zechner 1367a76ee8 Change getAllTools() to return ToolInfo[] instead of string[]
Breaking change: pi.getAllTools() now returns Array<{ name, description }>
instead of string[]. Extensions needing just names can use .map(t => t.name).

Removes redundant getToolInfo() method added in original PR.

Fixes #647
2026-01-12 17:18:43 +01:00
Mario Zechner 234f367d0d fix(coding-agent): make /new create a new session file
fixes #649
2026-01-12 17:06:33 +01:00
Aliou DialloandGitHub 638fbc459b feat(coding-agent): add page-up/down navigation to session selector (#662)
* feat(tui): add pageUp/pageDown key support and selectPageUp/selectPageDown actions

* feat(coding-agent): add page-up/down navigation to session selector
2026-01-12 17:01:46 +01:00
Mario Zechner 8f95a13e07 feat(coding-agent): add session naming via /name command and extension API
- Add SessionInfoEntry type for session metadata
- Add /name <name> command to set session display name
- Add pi.setSessionName() and pi.getSessionName() extension API
- Session selector shows name (in warning color) instead of first message when set
- Session name included in fuzzy search
- /session command displays name when set

closes #650
2026-01-12 16:56:39 +01:00
Aliou DialloandMario Zechner 4e6ae25505 fix(coding-agent): prevent session selector from closing immediately when current folder has no sessions
Remove auto-cancel in loadCurrentSessions() so users can press Tab to switch
to "all" scope. Add context-aware empty state messages.
2026-01-12 16:37:38 +01:00
Thomas MustierandMario Zechner 520e3b02f3 feat(coding-agent): tweak queued hint text 2026-01-12 16:36:46 +01:00
Mario Zechner 06bf2493a1 docs: add changelog and readme entry for notify.ts extension (#658) 2026-01-12 16:33:42 +01:00
FeroandGitHub 424597d558 example: add desktop notification extension (OSC 777) (#658) 2026-01-12 16:33:03 +01:00
Mario Zechner 175a137d00 Fix missing spacer between assistant message and text editor
Initialize widgetContainer with default spacer during init() instead of
only when extension widgets change.

fixes #655
2026-01-12 14:26:22 +01:00
Mario Zechner 6730b4fa59 Add [Unreleased] section for next cycle 2026-01-12 01:00:23 +01:00
Mario Zechner 8ac130c729 Release v0.43.0 2026-01-12 00:59:39 +01:00
Mario Zechner 50cd054edb Rework /scoped-models command UX
- Renamed from /models to /scoped-models
- Changes are now session-only by default (Ctrl+S to persist to settings)
- Added search with fuzzy filtering
- Hotkeys: Enter toggle, Ctrl+A enable all, Ctrl+X clear all, Ctrl+P toggle provider
- Ctrl+C clears search (or exits if empty), Escape exits
- Enabled models shown at top of list
- No checkmarks when all models enabled (no scope)
- First toggle when unscoped clears all and selects that model
- Uses current session thinking level instead of settings default
- Reads from session state first (preserves session-only changes across /scoped-models invocations)

Builds on #626
2026-01-12 00:53:52 +01:00
Mario Zechner 4755da4bfb Remove minor rendering fix from changelog 2026-01-12 00:18:18 +01:00
Mario Zechner c16e21331a Preserve tree selection when returning from summary selector or abort 2026-01-12 00:15:12 +01:00
Mario Zechner a0311fd5b9 Return to summary selector when cancelling custom instructions editor 2026-01-12 00:12:36 +01:00
Mario Zechner 783aa0d6d0 Add changelog, update docs, fix handoff example for PR #642 2026-01-12 00:10:14 +01:00
Armin RonacherandMario Zechner 62caf219a1 Hook up custom summarization on branch switch 2026-01-12 00:09:33 +01:00
Mario Zechner 9d49b4d4ed Merge branch 'tmp-2025-01-11' - resume scope toggle with async loading (#620) 2026-01-12 00:00:28 +01:00
Mario ZechnerandThomas Mustier 302404684f feat(coding-agent): add resume scope toggle with async loading
- /resume and --resume now toggle between Current Folder and All sessions with Tab
- SessionManager.list() and listAll() are now async with optional progress callback
- Shows loading progress (e.g. Loading 5/42) while scanning sessions
- SessionInfo.cwd field shows session working directory in All view
- Lazy loading: All sessions only loaded when user presses Tab

closes #619

Co-authored-by: Thomas Mustier <mustierthomas@gmail.com>
2026-01-12 00:00:03 +01:00
Mario Zechner c997305685 fix(coding-agent): footer git branch not updating after external branch switches
Git uses atomic writes (temp file + rename) which changes the inode.
fs.watch on a file stops working after the inode changes.
Now watches the directory containing HEAD and filters for HEAD changes.
2026-01-11 23:27:22 +01:00
Aliou DialloandMario Zechner b74a3658f3 fix(coding-agent): display extension loading errors to user 2026-01-11 23:24:06 +01:00
Mario Zechner df3f5f41c0 Rename /branch command to /fork
- RPC: branch -> fork, get_branch_messages -> get_fork_messages
- SDK: branch() -> fork(), getBranchMessages() -> getForkMessages()
- AgentSession: branch() -> fork(), getUserMessagesForBranching() -> getUserMessagesForForking()
- Extension events: session_before_branch -> session_before_fork, session_branch -> session_fork
- Settings: doubleEscapeAction 'branch' -> 'fork'

fixes #641
2026-01-11 23:12:31 +01:00
Patrick Kidger 92ee954195 docs(coding-agent) Fix install-from-source instructions 2026-01-11 22:59:30 +01:00
Thomas Mustier e8d91f2bd4 feat(coding-agent): add resume scope toggle
refactor(coding-agent): refine session listing helpers
2026-01-11 20:51:20 +00:00
Carlos GutierrezandMario Zechner 49acd8e648 Add /models command for enabling/disabling Ctrl+P model cycling
- New /models command with toggle UI for each available model
- Changes persist to enabledModels in settings.json
- Updates take effect immediately for Ctrl+P cycling
2026-01-11 19:36:36 +01:00
Ogulcan Celik e68058cc4f fix: custom footer extensions now see model changes 2026-01-11 21:28:18 +03:00
Mario Zechner f5e97427ce chore: add changelog entry for resume keybindings 2026-01-11 19:23:04 +01:00
Aos DabbaghandMario Zechner 23a4fd1159 fix: load keybindings before --resume session picker
The problem: I wanted to be able to select my session (either from
`/resume` or `--resume`) with different keybindings.

The issue: when running `pi --resume`, custom keybindings from
`~/.pi/agent/keybindings.json` were not being applied to the session
picker. This happened because `KeybindingsManager.create()` was only
called when `InteractiveMode` initialized, but the session picker runs
before that in `main.ts`.

The session picker uses `getEditorKeybindings()` for navigation
(selectUp/selectDown etc.), which returns the global default keybindings
if `setEditorKeybindings()` hasn't been called yet.

Fix: Call `KeybindingsManager.create()` inside the `--resume` block
before showing the session picker. This loads user keybindings and sets
them globally.

The current fix results in double-init of keybindings when entering
interactive mode which _should_ be harmless, since it's the same same
config loaded twice, but is minimal and only affects the `--resume`
path.

I considered passing keybindings from `main()` to `InteractiveMode` -
it's cleaner but requires API changes.

Also documented the `select*` keybindings in README.md.
2026-01-11 19:22:52 +01:00
Mario Zechner 6d495348c5 fix(tui): reset styles per line 2026-01-11 18:36:48 +01:00
Mario Zechner a20c6efe17 feat(coding-agent): add model_select extension hook
Fires when the model changes via /model command, model cycling (Ctrl+P),
or session restore. Includes source field and previousModel.

Add model-status.ts example extension demonstrating status bar updates.

closes #628
2026-01-11 18:12:46 +01:00
Marc KrennandMario Zechner a1696e338b docs(coding-agent): add PR link and author to CHANGELOG 2026-01-11 18:12:09 +01:00
Marc KrennandMario Zechner 943654cc93 docs(coding-agent): document model_select hook
Add CHANGELOG entry and extension documentation for the new model_select
event that fires on model changes via /model, Ctrl+P, or session restore.
2026-01-11 18:12:09 +01:00
Marc KrennandMario Zechner c41714662a feat(coding-agent): add model_select extension hook
Fires when model changes via setModel(), cycleModel(), or session restore.
Includes source field ("set" | "cycle" | "restore") and previous model.
2026-01-11 18:12:09 +01:00
Mario Zechner 5db7cc693b fix: Model selector fuzzy search matches id + provider
Restores original behavior from 3de8e075. Allows multi-token queries
like 'opus anthropic' to match Anthropic models.
2026-01-11 18:04:57 +01:00
Mario Zechner 3592f9b7c9 fix: Model selector fuzzy search matches provider + id
Allows queries like 'anthropic opus' to match Anthropic models.
Previously only matched against model ID, so 'anthropic' token failed.
2026-01-11 18:00:52 +01:00
Mario Zechner 9655907624 feat: Add skill slash commands and fuzzy matching for all commands
- Skills registered as /skill:name commands for quick access
- Toggle via /settings or skills.enableSkillCommands in settings.json
- Fuzzy matching for all slash command autocomplete (type /skbra for /skill:brave-search)
- Moved fuzzy module from coding-agent to tui package for reuse

Closes #630 by @Dwsy (reimplemented with fixes)
2026-01-11 17:56:11 +01:00
mom 9ddbafb03a fix(coding-agent): update test expectations after registerFlag -- prefix removal 2026-01-11 11:44:19 +00:00