Added
overlayAnchorconfig (#3, reported by @ttttmr). The overlay was always centered; it can now be pinned to any of the nine host anchors, for example"top-center"to move it up. Invalid values warn and fall back tocenter.- Custom spawn agents (#16, reported by @krikchaip). Any key under
spawn.commandsis now a real spawn agent, usable throughspawn: { agent: "..." },/spawn <agent>,spawn.defaultAgent,spawn.defaultArgs, worktrees, and prompt passthrough. Agent names are validated when config loads,fresh/forkstay reserved/spawnkeywords,forkstays Pi-only, and an unconfigured agent now fails with the list of configured agents instead of building a broken command.
Changed
- Tightened TypeScript/runtime boundaries for config and output queries: config JSON roots are now validated before merging, non-finite numeric config/query values fall back to defaults, and monitor/PTY internals avoid unnecessary type assertions.
- Cut over to the current pi package scope: all imports now use
@earendil-works/pi-coding-agentand@earendil-works/pi-tui, and local module specifiers use.tsextensions. - Declared
@earendil-works/pi-coding-agent,@earendil-works/pi-tui, andtypeboxas peer dependencies with a*range, following pi's package contract.typeboxis no longer a direct dependency because pi resolves all of these through its extension loader aliases. - Added
engines.node: >=22.19.0to match pi's minimum supported Node version. - Added strict TypeScript checking (
tsconfig.json,npm run typecheck) and fixed all resulting errors. ToolParamsis now derived from the typebox schema (Static<typeof toolParameters>) instead of a hand-written duplicate; the drift this exposed was fixed by constraininghandsFree.updateModeto'on-quiet' | 'interval'in the schema, so invalid values are rejected at the tool boundary instead of silently misbehaving.- Config shortcuts (
focusShortcut,spawn.shortcut) are validated as key identifiers when loading config; invalid shortcuts now warn and fall back to the defaults instead of silently never matching. - Compiled monitor config is now a discriminated union on strategy, making
fileWatchpresence impossible to misuse for non-file-watch strategies. /dismissselection no longer treats an unmatched select label as "dismiss all".
Fixed
- Respond to fish's Primary Device Attribute query so interactive fish sessions do not wait for the 10-second terminal capability timeout (#21, reported by @PaulGrandperrin).