- Updated SMOL_MODEL_PRIORITY to include additional model variants (gpt-5.3-spark, cerebras/zai-glm-4.7, haiku-4-5, haiku-4.5) for improved fast model discovery.
- Updated SLOW_MODEL_PRIORITY to include additional model variants (gpt-5.3-codex, gpt-5.3, gpt-5.1-codex, gpt-5.1, opus-4.6, opus-4-6, opus-4.5, opus-4-5, opus-4.1, opus-4-1) for improved comprehensive model discovery.
- Fixed system prompt to enforce tool calls on every turn until task completion, preventing premature stopping before turn finish.
- Reorganized contract and diligence sections to clarify inviolable rules and completion requirements.
- Consolidated redundant completion guidance and removed duplicate prime directive language.
- Clarified contract rule 2 to explicitly require at least one tool call per turn unless task is complete.
- Added new contract rule 3 forbidding standalone progress updates without task continuation.
- Renumbered subsequent contract rules 3-7 to 4-8 to accommodate new rule.
- Reinforced critical section guidance with same tool call requirement for turn validity.
Hashline prefixes (LINE:HASH|content) in read/grep output exist solely to
support the hashline edit mode. Agents that don't have the edit tool
(e.g. explore, plan, reviewer) gain nothing from them — they just waste
tokens and add noise.
resolveFileDisplayMode now takes a session-like object with an optional
hasEditTool flag. When false, hashlines are suppressed regardless of
settings. ToolSession gains hasEditTool (set from toolNames in the SDK),
and AgentSession exposes it as a getter over the tool registry.
- Restructured execution procedure guidance to emphasize scope assessment and continuous tool-driven progress over planning-first approach.
- Updated task tracking instructions to prohibit metadata-only turns and require immediate completion marking of todo items.
- Clarified parallel execution guidance to distinguish between genuine parallelization and sequential work, with explicit criteria for Task tool usage.
- Modified output style requirements to mandate stating intent before tool calls and reordered style constraints for clarity.
- Reinforced requirement that every turn must include at least one tool call advancing the deliverable, with explicit failure condition for planning-only turns.
- Added prime directive section emphasizing completion of requested output as primary objective.
- Changed release info fetching from GitHub API to npm registry to avoid unauthenticated rate limiting.
- Constructed deterministic GitHub release download URLs instead of relying on API response.
- Added Z.AI web search provider with MCP integration for remote web search capabilities.
- Added 'zai' as a selectable web search provider option in settings and CLI.
- Added Z.AI to the automatic provider fallback chain for web search after Gemini and Codex.
- Implemented ZaiProvider class with support for multiple Z.AI API response formats and retry logic.
- Added comprehensive error handling and response parsing for Z.AI MCP endpoint integration.
- Fixed welcome screen layout to gracefully handle small terminal widths and prevent rendering errors on narrow displays.
- Fixed welcome screen title truncation to prevent overflow when content exceeds available width.
- Improved welcome screen responsiveness to dynamically show or hide the right column based on available terminal width.
- Fixes deferred `--model` resolution to match extension-provided models before fallback
- Fixes CLI `--api-key` handling to support deferred model selection
- Adds OAuth provider support for extensions with source-scoped registration cleanup
- Adds custom API registration helpers with built-in collision checks
- Expands `Api` type to support extension-defined identifiers
- Adds tests for runtime provider registration and model selection
packages/ai:
- feat: added custom API provider registry (api-registry.ts)
- feat: stream() and streamSimple() check custom registry before built-in switch
packages/coding-agent:
- feat: added registerProvider() to ExtensionAPI for registering custom model providers
- feat: added ProviderConfig and ProviderModelConfig types
- feat: ModelRegistry.registerProvider() registers models and custom streaming functions
- feat: extension loader queues provider registrations, runner processes them on initialize
This enables extensions to register custom LLM providers with their own streaming
implementations. For example, a Vertex AI Claude extension can register a provider
that uses @anthropic-ai/vertex-sdk for Google Cloud ADC authentication:
pi.registerProvider("google-vertex-claude", {
baseUrl: "https://us-east5-aiplatform.googleapis.com",
apiKey: "GOOGLE_CLOUD_PROJECT",
api: "vertex-claude-api",
models: [...],
streamSimple: streamVertexClaude,
});
Backported from pi-mono's extension provider registration system.
- Clarified hashline anchor format to emphasize `LINE:HASH` only without content suffix.
- Added explicit guidance on `set_line` with empty text behavior versus `replace_lines` for deletion.
- Added instruction to prefer `insert_after` over line replacement when adding fields/arguments/imports.
- Added common failure patterns section documenting anchor copying errors and wide range pitfalls.
- Updated all example tool calls to use concrete `LINE:HASH` format instead of template placeholders.
- Added `repeatToolDescriptions` configuration setting to control tool description rendering in system prompts.
- Implemented conditional tool display logic that renders full tool descriptions when enabled or a concise comma-separated list when disabled.
- Threaded `repeatToolDescriptions` setting through SDK and system prompt building pipeline.
- Added new previewTheme() function to enable non-destructive theme preview during settings browsing.
- Implemented asynchronous theme loading with request deduplication to prevent race conditions when rapidly browsing theme options.
- Enhanced theme preview cancellation behavior to restore the previously active theme instead of the current value.
- Fixed theme preview updates being applied out-of-order when rapidly browsing theme options by using request ID tracking.
- Added `recursive` option to GlobOptions to control whether simple glob patterns match recursively by default (true).
- Changed glob pattern behavior to always apply recursive matching for simple patterns instead of requiring explicit `**/` prefix.
- Improved symlink handling in glob file type filters to resolve symlink targets and match based on their actual type (file/dir).
- Enhanced skill discovery in coding-agent to use dual-pass glob approach with deduplication and improved extension module detection.
- Implemented dynamic Tailwind CSS compilation in stats package by extracting actual class names from source files instead of building with empty candidates.
- Refactored Tailwind stylesheet imports to use centralized `tailwindcss/index.css` import with custom stylesheet loader callback.
- Added caching for model API key availability checks to avoid redundant lookups.
- Optimized model discovery loop to exit early on first available model instead of checking all models.
- Moved skills discovery to run in parallel with other initialization by starting it earlier.
- Updated dependency versions across root, ai, coding-agent, stats, and tui packages.
- Pinned @sinclair/typebox to 0.34.48.
- Migrated stats Tailwind build from PostCSS plugin usage to Tailwind v4 compile() API and emitted a standalone styles.css.
- Switched discovery helpers to native glob scanning for faster gitignore-aware file/module discovery.
- Added startup timing markers around model selection and skill discovery in sdk initialization.
- Improved skill discovery to use native glob pattern matching instead of manual directory traversal, enabling more efficient file discovery with gitignore support.
- Enhanced hashline reference parsing to accept optional leading whitespace and arrow prefixes (>>> or >>), allowing more flexible formatting of hashline references.
- Strengthened type safety in hashline edit formatting by adding runtime type guards and defensive property access for malformed edit objects.
- Fixed skill discovery to extract skill names from directory paths when frontmatter name is missing, improving fallback behavior.
- Updated ajv dependency from ^8.17.1 to ^8.18.0.
- Added animated microphone icon with color cycling during voice recording and transcription states.
- Added support for discovering skills via symbolic links in the skills directory.
- Changed STT status messages to display via state change callbacks instead of dedicated status line segment.
- Removed dedicated STT status line segment in favor of animated cursor-based feedback.
- Added cursor override feature to TUI editor for customizing end-of-text cursor glyph with ANSI-styled strings.
Cross-platform audio recording with automatic tool detection and
fallback chain (SoX > FFmpeg > arecord > PowerShell mciSendString).
Transcription via Python openai-whisper with automatic pip install
on first use.
Recording:
- SoX with explicit waveaudio device on Windows (-t waveaudio 0)
- FFmpeg with auto-detected dshow device name on Windows
- arecord for ALSA on Linux
- PowerShell mciSendString as zero-dependency Windows fallback
- Process health check after spawn, graceful stop for FFmpeg/PS
- Fallback chain: if one tool fails, tries the next automatically
Transcription:
- Python openai-whisper as primary backend (pip install openai-whisper)
- Custom WAV loader in transcribe.py using Python wave module
- Resamples to 16kHz mono via numpy (no ffmpeg dependency)
- Passes float32 numpy array directly to whisper.transcribe()
- 120s timeout with process kill guard
TUI integration:
- Alt+H keybinding to toggle recording (configurable in keybindings)
- /stt command with on|off|status|setup subcommands
- Status line segment showing REC/STT state
- Transcribed text inserted directly into editor prompt
- Lazy controller instantiation on first use
Settings:
- stt.enabled (default: false)
- stt.language (default: en)
- stt.modelName (default: base.en)
New files: packages/coding-agent/src/stt/{downloader,index,recorder,
setup,stt-controller,transcribe.py,transcriber}.ts
Replace single `theme` setting with `theme.dark` and `theme.light`.
Auto-detection is always on — COLORFGBG determines which slot to use.
On SIGWINCH, re-check COLORFGBG and switch themes if background changed.
Old `theme` setting auto-migrated using luminance detection.
Fixes#65
- Formatted generated report paths with OSC-8 hyperlinks so terminals can open files directly.
- Reused the hyperlink formatter across performance, bundle, and memory save messages.
- Added a DebugLogSource that reads dated log files and feeds the viewer from the debug selector.
- Made load-older handling asynchronous to fetch external chunks while preserving cursor and scroll state.
- Updated log viewer tests for the new options, external log sources, and async loading paths.