@oh-my-pi/pi-agent-core
Breaking Changes
- Renamed owned tool-calling options from
toolCallSyntax/exampleSyntaxtodialect/exampleDialect. - Changed compaction conversation serialization to use the target model's native dialect turn, thinking, tool-call, and tool-result envelopes when a dialect is selected.
- Renamed the owned dialect environment variable from
PI_OWNED_TOOLStoPI_DIALECT.
Added
- Added
onTurnEndhook support (setOnTurnEnd/onTurnEnd) to run awaited per-turn bookkeeping with current messages before the next model request and skip callback execution for aborted or error turns
Changed
- Renamed
toolCallSyntaxoption todialectin AgentOptions and AgentLoopConfig - Updated conversation serialization to use dialect's native transcript rendering when a dialect is selected
- Changed internal references from
ToolCallSyntaxtype toDialecttype across agent loop and compaction modules
@oh-my-pi/pi-ai
Breaking Changes
- Renamed the public dialect entrypoint from
@oh-my-pi/pi-ai/grammarto@oh-my-pi/pi-ai/dialect. - Renamed grammar dialect identifiers from
ToolCallSyntaxtoDialect, renamed theGrammarinterface toDialectDefinition, and renamedGrammar.syntaxtoDialectDefinition.dialect. - Added
DialectDefinition.renderThinkingandDialectDefinition.renderTranscriptso dialect implementations serialize complete native chat transcripts, not just tool call/result blocks.
Added
- Added
renderTranscriptmethod to dialect definitions for serializing complete native chat transcripts - Added
renderThinkingmethod to dialect definitions for rendering thinking/reasoning blocks - Added support for 11 dialect implementations: Anthropic, DeepSeek, Gemini, Gemma, GLM, Harmony, Hermes, Kimi, Pi-native, Qwen3, and XML
- Added
createInbandScannerfactory function to instantiate dialect-specific scanners - Added
getDialectDefinitionfunction to retrieve dialect implementations by name - Added
renderToolCatalogandrenderInbandToolPromptfunctions for tool catalog rendering - Added
renderToolInventoryfunction to generate human-readable per-tool documentation with examples - Added
renderToolExamplesfunction to render tool usage examples in the model's native dialect - Added
encodeInbandToolHistoryfunction to encode tool call history in dialect-specific format - Added
wrapInbandToolStreamfunction to process streaming responses with in-band tool call parsing - Added
ThinkingInbandScannerfor parsing thinking/reasoning blocks across dialects - Added
OwnedStreamclass for managing dialect-aware streaming with tool call events - Added in-band thinking channels to every dialect that was missing one:
gemini(a```thinkingfence mirroring```tool_code),gemma(its native<|channel>thought…<channel|>reasoning channel),kimi(<think>…</think>), andpi(<thinking>…</thinking>). Each scanner now parses reasoning into thinking events instead of leaking chain-of-thought into the visible reply, and every dialect'srenderThinkingis a real channel that round-trips back through its scanner (no passthrough renderers).
Changed
- Moved public dialect entrypoint from
@oh-my-pi/pi-ai/grammarto@oh-my-pi/pi-ai/dialectin package exports - Updated internal imports in
stream-markup-healing.tsto use new dialect module path - Changed
renderToolInventoryto demote a tool description's own markdown headers by one level when it contains a top-level#header, so they nest under the wrapping# Tool: <name>heading instead of reading as sibling sections. Descriptions that already start at##and headers inside fenced code blocks are left untouched.
Fixed
- Fixed Gemini, Gemma, Kimi, and Pi in-band scanners to respect
parseThinking: false, leaving private reasoning markers in visible text when parsing is disabled - Fixed thinking-channel parsing for streaming Gemini, Gemma, Kimi, and Pi outputs so split or partial
<thinking>blocks no longer leak into visible replies - Fixed in-band thinking finalization and Kimi stream-healing interactions so leaked
<think>blocks are preserved when structured tool calls are present, not duplicated when explicit reasoning is present, and closed on stream flush.
Removed
- Removed
src/grammar/factory.ts(replaced bysrc/dialect/factory.ts) - Removed
src/grammar/rendering.ts(functionality moved tosrc/dialect/rendering.ts) - Removed
src/grammar/xml.ts(replaced bysrc/dialect/xml.ts)
@oh-my-pi/pi-catalog
Breaking Changes
- Renamed the catalog-owned tool syntax API from
ToolCallSyntax/FALLBACK_TOOL_SYNTAX/preferredToolSyntaxtoDialect/FALLBACK_DIALECT/preferredDialect.
@oh-my-pi/pi-coding-agent
Breaking Changes
- Renamed the SDK tool format type and resolver from
ToolCallFormat/resolveToolCallSyntaxtoDialectFormat/resolveDialect, and the agent option fromtoolCallSyntaxtodialect. - Changed
/dumptranscript output to render messages with the selected model's native dialect turn and thinking envelopes instead of markdown role headings.
Added
- Added
advisor.syncBacklogsetting (off,1,3,5) to pause turn completion until advisor review backlog drops below the threshold, with a maximum 30-second wait - Added advisor backlog synchronization at turn end when enabled so the main session stays aligned with the advisor's pending review turns
- Added automatic discovery of WATCHDOG.md files from user and project locations so advisor guidance from local watchdog instructions is appended to its system prompt
- Added
/advisor on,/advisor off,/advisor status, and/advisor dump [raw]slash-command subcommands to manage the advisor at runtime - Added
advisor.enabledandadvisor.subagentssettings to enable the advisor and extend it to spawned task/eval subagents - Added advisor status badge (
++in success color) to the status line when an advisor is active - Added
/dump [raw]flag to toggle between compact and legacy uncompact transcript output formats - Added
/advisor on,/advisor off, and/advisor statusslash-command subcommands to enable or disable the advisor at runtime and view advisor status metrics - Added a passive advisor: assign a second model to the
advisorrole and enableadvisor.enabledto have it silently review each primary turn and inject severity-tagged advice notes via theadvisetool. Anitrides the non-interrupting aside queue (batched into one card at the next step boundary), while aconcernorblockerinterrupts the running agent through the steering channel — aborting in-flight tools, or resuming the agent when it has already yielded — so high-severity advice is acted on immediately. Advice renders in the primary transcript as a distinctAdvisorcard, and the advisor gets hard-isolated read-onlyread/search/findaccess — bound to its ownToolSessionso its reads never touch the primary's snapshot/seen-lines caches — to investigate the workspace before weighing in. The status line shows a++badge (in the success color, kept distinct from the model name) after the model name while an advisor is active, and/advisor dumpcopies the advisor's own transcript to the clipboard. Advisors are created only for the top-level session by default; enableadvisor.subagentsto extend them to spawned task/eval subagents. - Animated "thinking" pulse (
·‥…‥) shown in place of a hidden thinking block while the model is actively reasoning, so streaming progress is visible even withhideThinkingBlockenabled.
Changed
- Changed advisor prompting guidance to emit at most one
adviseper update and to prefer silence when the agent is on track - Changed
/dumpdefault output to compact markdown format; use/dump rawfor the legacy uncompact format - Changed
/dumpand/advisor dumpto default to compact transcript output and accept an optionalrawflag for the legacy uncompact format - Session dump output now renders message history using the model's native dialect turn envelope instead of markdown role headings
- Changed RPC, RPC-UI, and ACP hosts to default the advisor settings off instead of inheriting a user's interactive-session advisor preference.
Fixed
- Fixed advisor backlog tracking so failed advice prompts do not stall catch-up indefinitely by dropping pending backlog after repeated consecutive failures
- Fixed backlog accounting to decrement only after successful advisor prompts so sync waits correctly reflect advisor progress
- Fixed advisor context batching to still send pending review updates when context maintenance fails instead of dropping the batch
- Fixed explicit advisor enablement to clear protocol-default overrides so enabling the advisor applies immediately
- Fixed advisor message card notes getting truncated to two lines when the card is collapsed.
- Fixed advisor context handling to maintain its token budget by promoting or compacting/restarting advisor context while preserving advisor reasoning-off settings.
- Fixed
startup.quietleaving MCP and LSP startup status events visible during launch (#2639). - Registered the
Advisorgroup in themodelsettings tab so advisor settings render correctly in the settings panel. - Fixed Windows bash path handling so MSYS/Git-Bash drive aliases like
/d/projectand WSL-style/mnt/d/projectnormalize to native drive paths consistently across the bash tool cwd validation and brush filesystem builtins (#2634).
What's Changed
- fix: align tool cache paths with XDG dirs by @Parsifa1 in #2637
- fix(coding-agent): respect startup.quiet for startup statuses by @roboomp in #2640
Full Changelog: v15.13.3...v16.0.0