@oh-my-pi/pi-coding-agent 15.8.3 → 15.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/CHANGELOG.md +113 -31
  2. package/dist/types/capability/skill.d.ts +7 -0
  3. package/dist/types/cli/update-cli.d.ts +15 -1
  4. package/dist/types/config/append-only-context-mode.d.ts +8 -0
  5. package/dist/types/config/model-registry.d.ts +3 -0
  6. package/dist/types/config/models-config-schema.d.ts +15 -0
  7. package/dist/types/config/settings-schema.d.ts +38 -24
  8. package/dist/types/debug/protocol-probe.d.ts +38 -0
  9. package/dist/types/debug/terminal-info.d.ts +34 -0
  10. package/dist/types/exa/mcp-client.d.ts +2 -1
  11. package/dist/types/export/html/template.generated.d.ts +1 -1
  12. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  13. package/dist/types/extensibility/extensions/types.d.ts +11 -0
  14. package/dist/types/extensibility/shared-events.d.ts +1 -1
  15. package/dist/types/index.d.ts +1 -0
  16. package/dist/types/mcp/json-rpc.d.ts +6 -1
  17. package/dist/types/mcp/tool-bridge.d.ts +4 -0
  18. package/dist/types/mcp/transports/stdio.d.ts +16 -7
  19. package/dist/types/mnemopi/state.d.ts +2 -2
  20. package/dist/types/modes/components/agent-dashboard.d.ts +1 -0
  21. package/dist/types/modes/components/assistant-message.d.ts +3 -2
  22. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +1 -0
  23. package/dist/types/modes/components/hook-selector.d.ts +11 -0
  24. package/dist/types/modes/components/plugin-settings.d.ts +40 -8
  25. package/dist/types/modes/components/session-selector.d.ts +8 -3
  26. package/dist/types/modes/components/settings-selector.d.ts +1 -1
  27. package/dist/types/modes/components/todo-reminder.d.ts +1 -1
  28. package/dist/types/modes/components/transcript-container.d.ts +36 -0
  29. package/dist/types/modes/interactive-mode.d.ts +2 -1
  30. package/dist/types/modes/rpc/rpc-types.d.ts +1 -1
  31. package/dist/types/modes/theme/theme.d.ts +20 -1
  32. package/dist/types/modes/utils/keybinding-matchers.d.ts +4 -0
  33. package/dist/types/plan-mode/plan-handoff.d.ts +20 -0
  34. package/dist/types/session/agent-session.d.ts +5 -2
  35. package/dist/types/session/history-storage.d.ts +3 -4
  36. package/dist/types/session/indexed-session-storage.d.ts +59 -0
  37. package/dist/types/session/messages.d.ts +1 -0
  38. package/dist/types/session/redis-session-storage.d.ts +12 -85
  39. package/dist/types/session/session-manager.d.ts +21 -0
  40. package/dist/types/session/session-storage.d.ts +5 -7
  41. package/dist/types/session/sql-session-storage.d.ts +16 -85
  42. package/dist/types/slash-commands/types.d.ts +17 -4
  43. package/dist/types/task/executor.d.ts +9 -0
  44. package/dist/types/task/index.d.ts +3 -1
  45. package/dist/types/telemetry-export.d.ts +19 -0
  46. package/dist/types/tiny/compiled-runtime.d.ts +35 -0
  47. package/dist/types/tiny/text.d.ts +17 -0
  48. package/dist/types/tools/ask.d.ts +1 -0
  49. package/dist/types/tools/index.d.ts +4 -2
  50. package/dist/types/tools/path-utils.d.ts +1 -1
  51. package/dist/types/tools/search.d.ts +2 -2
  52. package/dist/types/tools/{todo-write.d.ts → todo.d.ts} +18 -18
  53. package/dist/types/utils/session-color.d.ts +7 -2
  54. package/dist/types/web/search/index.d.ts +1 -1
  55. package/dist/types/web/search/provider.d.ts +2 -2
  56. package/dist/types/web/search/providers/base.d.ts +14 -0
  57. package/dist/types/web/search/providers/exa.d.ts +9 -0
  58. package/dist/types/web/search/providers/perplexity.d.ts +2 -2
  59. package/dist/types/web/search/types.d.ts +66 -1
  60. package/package.json +15 -9
  61. package/scripts/build-binary.ts +12 -0
  62. package/src/capability/skill.ts +7 -0
  63. package/src/cli/args.ts +1 -1
  64. package/src/cli/session-picker.ts +1 -0
  65. package/src/cli/update-cli.ts +54 -2
  66. package/src/commands/completions.ts +1 -1
  67. package/src/config/append-only-context-mode.ts +37 -0
  68. package/src/config/models-config-schema.ts +1 -0
  69. package/src/config/settings-schema.ts +24 -57
  70. package/src/debug/index.ts +67 -1
  71. package/src/debug/protocol-probe.ts +267 -0
  72. package/src/debug/terminal-info.ts +127 -0
  73. package/src/exa/mcp-client.ts +11 -5
  74. package/src/export/html/template.generated.ts +1 -1
  75. package/src/export/html/template.js +3 -3
  76. package/src/extensibility/custom-tools/types.ts +1 -1
  77. package/src/extensibility/extensions/types.ts +11 -0
  78. package/src/extensibility/shared-events.ts +1 -1
  79. package/src/extensibility/skills.ts +3 -3
  80. package/src/index.ts +1 -0
  81. package/src/internal-urls/docs-index.generated.ts +7 -7
  82. package/src/main.ts +16 -2
  83. package/src/mcp/json-rpc.ts +8 -0
  84. package/src/mcp/render.ts +3 -0
  85. package/src/mcp/tool-bridge.ts +10 -2
  86. package/src/mcp/transports/http.ts +33 -16
  87. package/src/mcp/transports/stdio.ts +37 -12
  88. package/src/mnemopi/state.ts +4 -4
  89. package/src/modes/acp/acp-agent.ts +168 -3
  90. package/src/modes/acp/acp-event-mapper.ts +7 -7
  91. package/src/modes/components/agent-dashboard.ts +103 -31
  92. package/src/modes/components/assistant-message.ts +3 -2
  93. package/src/modes/components/extensions/extension-dashboard.ts +56 -10
  94. package/src/modes/components/history-search.ts +128 -14
  95. package/src/modes/components/hook-selector.ts +149 -14
  96. package/src/modes/components/plugin-settings.ts +270 -36
  97. package/src/modes/components/session-selector.ts +81 -19
  98. package/src/modes/components/settings-selector.ts +1 -1
  99. package/src/modes/components/status-line/segments.ts +2 -1
  100. package/src/modes/components/status-line.ts +1 -1
  101. package/src/modes/components/tips.txt +6 -2
  102. package/src/modes/components/todo-reminder.ts +1 -1
  103. package/src/modes/components/tool-execution.ts +9 -4
  104. package/src/modes/components/transcript-container.ts +109 -0
  105. package/src/modes/controllers/command-controller.ts +4 -3
  106. package/src/modes/controllers/event-controller.ts +12 -7
  107. package/src/modes/controllers/extension-ui-controller.ts +3 -0
  108. package/src/modes/controllers/input-controller.ts +10 -5
  109. package/src/modes/controllers/selector-controller.ts +30 -19
  110. package/src/modes/controllers/todo-command-controller.ts +1 -1
  111. package/src/modes/interactive-mode.ts +56 -9
  112. package/src/modes/print-mode.ts +5 -0
  113. package/src/modes/rpc/rpc-types.ts +1 -1
  114. package/src/modes/theme/theme.ts +48 -8
  115. package/src/modes/utils/keybinding-matchers.ts +10 -0
  116. package/src/modes/utils/ui-helpers.ts +1 -0
  117. package/src/plan-mode/plan-handoff.ts +37 -0
  118. package/src/priority.json +4 -0
  119. package/src/prompts/goals/goal-continuation.md +1 -1
  120. package/src/prompts/steering/user-interjection.md +10 -0
  121. package/src/prompts/system/agent-creation-architect.md +1 -26
  122. package/src/prompts/system/eager-todo.md +3 -3
  123. package/src/prompts/system/orchestrate-notice.md +5 -5
  124. package/src/prompts/system/plan-mode-approved.md +14 -17
  125. package/src/prompts/system/plan-mode-reference.md +3 -6
  126. package/src/prompts/system/subagent-system-prompt.md +11 -0
  127. package/src/prompts/system/system-prompt.md +143 -145
  128. package/src/prompts/system/title-system.md +3 -2
  129. package/src/prompts/system/workflow-notice.md +1 -1
  130. package/src/prompts/tools/browser.md +33 -30
  131. package/src/prompts/tools/render-mermaid.md +2 -2
  132. package/src/prompts/tools/search.md +1 -1
  133. package/src/prompts/tools/task.md +3 -1
  134. package/src/prompts/tools/{todo-write.md → todo.md} +5 -5
  135. package/src/sdk.ts +6 -21
  136. package/src/session/agent-session.ts +44 -21
  137. package/src/session/history-storage.ts +11 -18
  138. package/src/session/indexed-session-storage.ts +430 -0
  139. package/src/session/messages.ts +80 -0
  140. package/src/session/redis-session-storage.ts +66 -377
  141. package/src/session/session-manager.ts +109 -23
  142. package/src/session/session-storage.ts +148 -68
  143. package/src/session/sql-session-storage.ts +131 -382
  144. package/src/slash-commands/helpers/todo.ts +2 -2
  145. package/src/slash-commands/types.ts +27 -10
  146. package/src/task/executor.ts +9 -1
  147. package/src/task/index.ts +51 -1
  148. package/src/telemetry-export.ts +126 -0
  149. package/src/tiny/compiled-runtime.ts +179 -0
  150. package/src/tiny/text.ts +112 -1
  151. package/src/tiny/worker.ts +24 -2
  152. package/src/tools/ask.ts +133 -87
  153. package/src/tools/fetch.ts +17 -4
  154. package/src/tools/find.ts +2 -2
  155. package/src/tools/index.ts +6 -4
  156. package/src/tools/memory-recall.ts +1 -1
  157. package/src/tools/memory-reflect.ts +1 -1
  158. package/src/tools/path-utils.ts +16 -7
  159. package/src/tools/renderers.ts +2 -2
  160. package/src/tools/search.ts +6 -3
  161. package/src/tools/ssh.ts +26 -10
  162. package/src/tools/{todo-write.ts → todo.ts} +32 -35
  163. package/src/tools/write.ts +14 -2
  164. package/src/tui/status-line.ts +15 -4
  165. package/src/utils/session-color.ts +39 -14
  166. package/src/utils/title-generator.ts +9 -2
  167. package/src/web/search/index.ts +4 -2
  168. package/src/web/search/provider.ts +19 -35
  169. package/src/web/search/providers/base.ts +17 -0
  170. package/src/web/search/providers/exa.ts +111 -7
  171. package/src/web/search/providers/perplexity.ts +8 -4
  172. package/src/web/search/types.ts +74 -32
package/CHANGELOG.md CHANGED
@@ -2,14 +2,96 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [15.9.1] - 2026-06-04
6
+
7
+ ### Added
8
+
9
+ - Added deferred session-title generation so greetings no longer become the session title. A first user message that is only a greeting / acknowledgement / filler ("hi", "thanks", "ok", a bare number, emoji-only, etc.) is now detected deterministically and skips titling entirely — no title model is invoked. Title generation then retries on each subsequent user message while the session stays unnamed, so the title is deduced from the first message that actually describes work. A capable online title model may additionally answer `none` to decline a non-greeting taskless message (normalized to "no title").
10
+
11
+ ### Changed
12
+
13
+ - Changed mid-turn user steers to reach the model inside a wire-only interjection envelope, while transcripts and persisted session history keep the user's original text.
14
+ - Changed the system prompt to treat user requests for parallel work as `task` subagent fan-out rather than parallel tool calls.
15
+ - Changed the Agent Control Center's new-agent description field to use the multiline TUI editor, with Enter inserting lines and Ctrl+Enter generating the spec.
16
+ - Changed the Agent Control Center and Extension Control Center to accept Left/Right arrow keys for switching tabs (source / provider), in addition to Tab / Shift+Tab — matching the model and settings selectors, whose `TabBar` already supported arrow navigation.
17
+ - Refreshed the Ctrl+R history search overlay: the selected row now renders as a full-width `selectedBg` highlight bar, matched query tokens are highlighted in the accent color, each result shows a right-aligned relative timestamp, and the panel gained an icon'd accent title plus a two-tone keyhint footer. The selector also gained PageUp/PageDown (via the configurable `tui.select.pageUp`/`pageDown` keybindings) and Home/End navigation.
18
+ - Changed Perplexity API-key web search to return more comprehensive results: `web_search_options.search_context_size` is now `high` (was `medium`) for maximum retrieval grounding, the default `num_search_results` is `20` (was `10`) so twice as many sources are surfaced, and `return_related_questions` is enabled with the response's `related_questions` now parsed into `relatedQuestions` (previously dropped). On an identical query this lifted the result from 10 sources / ~410 output tokens to 20 sources / ~1900 output tokens with a structured, multi-section answer; latency tracks model output length, not context size, so the 60s hard timeout headroom is unchanged.
19
+
20
+ ### Fixed
21
+
22
+ - Fixed a streamed assistant message freezing at a partial prefix (e.g. only "Nat" of "Natives built, now…") on ED3-risk terminals (Ghostty/kitty/iTerm2/Alacritty), with the final text appearing only after a resize. `TranscriptContainer` freezes each non-live block by replaying its last live render, but render coalescing can finalize a block's content and append the next block within the same throttled frame — so the block was sealed at its stale mid-stream snapshot and never repainted until the next `thaw`. The block that was live on the previous render is now recomputed once on the live→frozen transition, sealing it at its final content.
23
+
24
+ - Fixed ACP/RPC stdio startup so protocol frames are no longer consumed as one-shot piped prompt input before the JSON-RPC transport starts.
25
+ - Fixed `omp completions` to await the completion script write before exiting.
26
+ - Fixed `AssistantMessageComponent` exposing its stable-prefix completion API again so streamed assistant messages remain unstable until explicitly completed.
27
+ - Fixed session restoration to ignore transient fallback model switches (such as automatic context-promotion or retry fallback) so resumed or resumed-switch sessions revert to the configured default model unless the last change was a user-selected temporary model
28
+ - Fixed in-session `/resume` to restore both the last user-selected temporary model and persisted plan/goal mode state instead of falling back to the default model with plan mode off.
29
+ - Fixed the `/resume` session picker overflowing short viewports: the visible window was hardcoded to 5 entries (and assumed 3 lines each), but titled sessions render 4 lines, so on a typical-height terminal the picker's header and search box scrolled off the top and the first entry was hidden until you scrolled the terminal up. The visible-entry count is now derived from the live terminal height (budgeting the worst-case 4-line titled entry plus the picker's chrome), so the whole picker fits the viewport and grows on taller terminals.
30
+ - Fixed the Agent Control Center and Extension Control Center dashboards overflowing the terminal: they were mounted inline below the chat transcript, so the combined height exceeded the viewport — the tab bar and controls scrolled off the top into native scrollback, and every state change yanked the view back to the bottom. Both dashboards now render as full-screen overlays sized to the live terminal height (`process.stdout.rows`), re-fit on resize, fill the viewport, and reserve space for the footer keyhints so the controls stay visible.
31
+ - Fixed Ctrl+R history search results to remain globally sorted by prompt recency after merging FTS prefix matches with substring fallback matches.
32
+ - Fixed Exa web search with no stored or environment credential to use the public Exa MCP fallback again, preserving the auth storage → `EXA_API_KEY` → `mcp.exa.ai` resolution order ([#1860](https://github.com/can1357/oh-my-pi/issues/1860)).
33
+ - Fixed ACP plan-mode writes to `local://PLAN.md` so session-local plan artifacts are written to OMP's local artifact root instead of being routed through the editor `writeTextFile` bridge, avoiding Zen's `Internal error` and making the plan readable after creation ([#1863](https://github.com/can1357/oh-my-pi/issues/1863)).
34
+ - Fixed ACP plan mode stranding the agent at plan approval: entering `mode: "plan"` now registers a standing `resolve` handler so the agent's `resolve { action: "apply" }` no longer fails with `No pending action to resolve. Nothing to apply or discard.` The handler validates the plan file, asks the ACP client to confirm via `unstable_createElicitation` when the client supports forms, renames the approved plan to `local://<title>.md`, and exits plan mode so the agent regains write tools for execution ([#1869](https://github.com/can1357/oh-my-pi/issues/1869)).
35
+
36
+ - Fixed `provider.appendOnlyContext: "auto"` staying inactive for Xiaomi Token Plan/SGLang endpoints, preserving prefix-cache hits without forcing append-only mode globally ([#1851](https://github.com/can1357/oh-my-pi/issues/1851)).
37
+ - Fixed `models.yml` compatibility parsing to preserve `compat.cacheControlFormat: "anthropic"` for custom OpenAI-compatible Claude proxies. ([#1845](https://github.com/can1357/oh-my-pi/issues/1845))
38
+ - Fixed the TUI's `Settings → Plugins` panel reporting "No plugins installed" when only marketplace plugins were installed. The panel now merges `PluginManager.list()` with `MarketplaceManager.listInstalledPlugins()` — the same data source the `/plugins list` slash command and `omp plugin list` CLI already used — and tags each row with an `[npm]` / `[marketplace]` kind badge, a scope tag, and a shadow indicator for project-shadowed user installs. Selecting a marketplace row opens a new `MarketplacePluginDetailComponent` whose single `Enabled` toggle calls `MarketplaceManager.setPluginEnabled(pluginId, enabled, scope)`, with read-only metadata (version, install path, installed-at, last-updated, git commit SHA) listed below the toggle. The empty-state now lists both install commands (`omp plugin install <package>` and `omp plugin install <name>@<marketplace>`) ([#1842](https://github.com/can1357/oh-my-pi/issues/1842)).
39
+ - Fixed scoped mnemopi recall in `MnemopiSessionState.collectScopedRecallResults`/`recallResultsScoped` to await the async `Mnemopi.recallEnhanced` so the new auto-derived `queryEmbedding` flows through. Without this, the embedding-enabled mnemopi backend silently kept running FTS-only on every recall. ([#1832](https://github.com/can1357/oh-my-pi/issues/1832))
40
+ - Fixed the SSH tool renderer inlining multiline remote commands into its single-line status header, which produced a malformed cell where the bordered output block opened mid-command. The renderer now drops the command from the header (which keeps only `[host]`) and renders the full command in a framed section above `Output`, mirroring the bash renderer. `renderStatusLine` also flattens any embedded CR/LF in `description`, `meta`, and `title` so no tool can accidentally expand the header into multiple rows ([#1828](https://github.com/can1357/oh-my-pi/issues/1828)).
41
+ - Fixed `tsc --noEmit` against `packages/coding-agent/tsconfig.json` reporting 56 errors under TypeScript 5.x (`builtin-registry.ts` × 46, `agent-session-openai-responses-replay.test.ts` × 10). The repo's own gate (`tsgo` / TypeScript 6.x) already accepted the `() => void` slash-command handlers, but 5.x rejects them because it does not coerce a `void`-returning function value into a `() => T | undefined` slot. The `SlashCommandSpec.handle` / `handleTui` signatures and the test's `createPersistedSession` `populate` callback are now expressed as a union of two function types (one returning a `SlashCommandResult` / target, one returning `void`), so the existing handler bodies typecheck on both compilers ([#1821](https://github.com/can1357/oh-my-pi/issues/1821)).
42
+ - Fixed `omp update` leaving `@oh-my-pi/pi-natives` and the platform-specific `@oh-my-pi/pi-natives-<tag>` leaf at the previous version on `bun install -g` updates, so the next launch loaded a stale `.node` file and aborted at `validateLoadedBindings` with `The .node file on disk is from a different release than this loader`. `omp update` now pins the native addon core and the platform leaf to the same version it installs for `@oh-my-pi/pi-coding-agent` ([#1824](https://github.com/can1357/oh-my-pi/issues/1824)).
43
+
44
+ ## [15.9.0] - 2026-06-04
45
+
46
+ ### Breaking Changes
47
+
48
+ - Removed synchronous `readTextSync` from `SessionStorage` and core implementations (`MemorySessionStorage`, `FileSessionStorage`, `RedisSessionStorage`, `SqlSessionStorage`), requiring callers to use async text reads
49
+ - Replaced the public `SessionStorage` `readTextPrefix(path, maxBytes)` and `readTextSuffix(path, maxBytes)` methods with `readTextSlices(path, prefixBytes, suffixBytes): Promise<[string, string]>`; custom session storage backends must implement the new combined slice API.
50
+
51
+ ### Added
52
+
53
+ - Added env-driven OpenTelemetry trace export. When `OTEL_EXPORTER_OTLP_ENDPOINT` (or `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`) is set, `omp` registers a global OTLP/proto trace exporter and switches on the agent loop's telemetry, so the `invoke_agent` / `chat` / `execute_tool` spans actually reach a collector instead of a no-op tracer. Honors the standard `OTEL_*` env contract (endpoint, headers, `OTEL_SERVICE_NAME`, `OTEL_SDK_DISABLED` and `OTEL_TRACES_EXPORTER=none` parsed case-insensitively) and the `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` capture toggle; it is a no-op when no endpoint is configured. Only the `http/protobuf` transport is supported — a `grpc` or `http/json` `OTEL_EXPORTER_OTLP*_PROTOCOL` declines rather than misrouting spans. This makes the existing telemetry usable from headless hosts that run `omp` as a spawned child process, where an in-process `TracerProvider` registered by the parent can't reach the child. Uses the `@opentelemetry/exporter-trace-otlp-proto` 2.x line, which exports cleanly under Bun.
54
+ ## Fixed
55
+
56
+ - Fixed the status line session name (and the editor border / status-line gap fill) being nearly illegible on light themes.
57
+ - Added `IndexedSessionStorage` and `SessionStorageBackend` exports to support shared metadata-indexed session backends
58
+ - Added the `tui.maxInlineImages` setting (default `8`) capping how many inline images render as live terminal graphics. Once a new image pushes the count past the cap, the oldest images are hidden via a full redraw — replaced by their `[Image: …]` text placeholder and purged from the terminal's graphics store — so long sessions with many screenshots/diagrams stop piling up images (and, on Kitty, stop leaving scrollback ghosts). Set to `0` to keep every image inline.
59
+ - Added a "View: terminal state" item to the `/debug` menu that prints the detected terminal, live geometry and cell size, multiplexer, and the negotiated subprotocols actually in use — graphics (Kitty/iTerm2/Sixel), desktop notifications (BEL/OSC 9/OSC 99, plus whether OSC 99 was confirmed via a device-attributes probe), OSC 8 hyperlinks, 24-bit color, DECCARA rectangular-SGR background fills, and DEC 2026 synchronized output — alongside the scrollback-clear strategy (`CSI 22 J` vs `CSI 2 J` redraw / ED3 eager-erase risk) and the raw `TERM`/`TERM_PROGRAM`/`COLORTERM` detection signals.
60
+ - Added a "Test: terminal protocols" item to the `/debug` menu that renders one live sample of every special escape protocol the renderer can emit — SGR text attributes (bold/italic/underline/strikethrough/inverse/dim), themed and 24-bit truecolor, OSC 8 hyperlinks, OSC 66 text sizing (large text), and an inline graphics swatch via the active image protocol (Kitty/iTerm2/Sixel, with a text fallback) — and fires a desktop notification, so you can eyeball which protocols the current terminal actually honors. The sample image is a gradient PNG generated in-process, so the graphics test needs no asset on disk.
61
+ - Added the `tui.textSizing` setting (default off) that renders Markdown H1 headings at 2x scale via Kitty's OSC 66 text-sizing protocol. It replaces the undocumented `PI_TUI_TEXT_SIZING` env var with a real setting, and only takes effect on Kitty terminals (where OSC 66 is implemented) — it is ignored everywhere else so headings never emit raw escape bytes.
62
+ - Added a lifecycle status to the `/resume` session picker. Each session's tail (last 32 KiB) is now read alongside the existing header window in a single pass, and its final message classified as `done` (the agent ended its turn and yielded control back), `interrupted` (a trailing tool call or tool result the loop never continued from), `aborted`, `error`, or `pending` (a trailing user message with no reply). The status renders as a colored segment on each session's metadata line. When the final message is larger than the tail window the status is omitted rather than guessed.
63
+ - Added support for `disable-model-invocation: true` frontmatter field from the [Agent Skills standard](https://agentskills.io/specification). Skills using this field are now hidden from the system prompt listing, matching the behavior of `hide: true`.
64
+
65
+ ### Changed
66
+
67
+ - Changed the `task` tool description to tag read-only agents and explicitly forbid assigning them file edits/commands or offloading reasoning to `quick_task`/`explore`.
68
+ - Changed Redis and SQL session storage initialization to load only indexed metadata (`size`, `mtimeMs`) instead of full session content
69
+ - Changed `SessionStorage` read paths to rely on backend-backed metadata/indexed storage, so session content is fetched on demand rather than cached as full in-memory mirrors
70
+ - Changed session-list slice reads to go through `SessionStorage.readTextSlices` across all backends, removing the file-only single-open branch and caller-managed buffers. `FileSessionStorage` now reads both windows via `peekFileEnds`, while Redis and SQL backends encode session content once per combined read.
71
+ - Changed the `ask` tool transcript renderer to mark single-choice questions with circular radio glyphs (`○`/`◉`) instead of the rectangular checkbox glyphs (`☐`/`☑`) it shares with multi-select questions, so a "pick one" combo box visually reads as a radio group rather than a checklist. Multi-select questions keep checkboxes. Added a `radio.selected`/`radio.unselected` symbol pair across the unicode, nerd-font, and ASCII presets.
72
+ - Changed the `ask` tool transcript renderer to mark the chosen answer inside the question form rather than re-listing the questions in a detached summary block below it. Once a question is answered, the standalone prompt preview is dropped and the result redraws the same form — every offered option still shown, with the selected one(s) filled in (`◉`/`☑`, highlighted) and the rest dimmed (`○`/`☐`); custom free-text answers and cancellations render in place as the final entry. This removes the duplicate question/option listing that previously appeared once as the call preview and again as the result.
73
+ - Changed task-completion and `ask` desktop notifications to structured terminal notifications (title, body, type, and a focus-on-click action). On Kitty these render through OSC 99 as a proper title/body with click-to-focus; terminals without confirmed OSC 99 support collapse them to the previous single-line message (BEL/OSC 9).
74
+ - Updated the "each kitty/tmux split" tip to include cmux.
75
+
76
+ ### Fixed
77
+
78
+ - Fixed tiny-model startup in compiled binaries by resolving `@huggingface/transformers` and its runtime dependencies from the installed cache using `package.json` `exports`/`main` metadata, preventing module-resolution failures when launching models
79
+ - Fixed tiny runtime installation flow in compiled binaries by using the build-time resolved `@huggingface/transformers` version and ensuring the runtime lock directory’s parent exists before acquiring the install lock, preventing mismatch and setup failures on fresh installs
80
+ - Fixed the terminal protocol debug probe reusing one stable Kitty graphics id across repeated panels, which could move/replace an earlier swatch instead of rendering a new one.
81
+ - Fixed selector dialogs (the `ask` tool, hook prompts) collapsing to a single visible option on shorter terminals when options carried long descriptions: the highlighted option's wrapped description consumed the entire row budget, hiding every other option and making the menu feel unnavigable (down moved the lone visible entry, left/right did nothing). When the fully-expanded list overflows, `HookSelectorComponent` now renders a compact list — every option label stays on screen and only the highlighted option expands its description, truncated to the remaining rows — so the whole menu is always visible and the detail pane follows the cursor.
82
+ - Fixed `read` failing with "Path not found" on web URLs whose scheme `//` collapsed to a single `/` (e.g. `https:/github.com/...`), which happens when a URL is routed through Node's `path.normalize`/`path.resolve`. The fetch URL recognizer now accepts a single-slash scheme and repairs it back to `//` before fetching, so collapsed URLs resolve instead of falling through to filesystem lookup.
83
+ - Fixed subagent slow-model priority falling through to older Claude Opus aliases when Opus 4.8 is available by adding Opus 4.8 and 4.7 aliases ahead of older Opus fallbacks ([#1753](https://github.com/can1357/oh-my-pi/issues/1753)).
84
+ - Fixed the web-search provider selectors in TUI settings/setup to derive from the shared provider metadata, so newly added providers cannot be omitted from the preference list.
85
+
5
86
  ## [15.8.3] - 2026-06-03
87
+
6
88
  ### Fixed
7
89
 
8
90
  - Fixed Jujutsu workspace detection failing in non-default workspaces created by `jj workspace add`, whose `.jj/repo` is a FILE pointing at the shared repo dir rather than a directory. Detection now matches jj's own criterion (`.jj/repo` present, file or dir) instead of requiring a `.jj/repo/store` directory, and `jj.repo.resolve`'s `storeDir` follows the file indirection to the shared store.
9
91
 
10
92
  ### Changed
11
93
 
12
- - Changed the `todo-write` prompt to require initializing every item from a user-supplied multi-step plan as an individual todo task before execution
94
+ - Changed the `todo` prompt to require initializing every item from a user-supplied multi-step plan as an individual todo task before execution
13
95
  - Changed context compaction (prune/shake) to protect reads of the active plan file the same way it already protects `skill://` reads, so the plan stays intact through automatic and manual compaction. Both the canonical `local://PLAN.md` alias and the session's current plan reference path (e.g. a titled `local://<title>.md` after approval) are kept, tolerating read selectors and `local:/` scheme spelling.
14
96
 
15
97
  ## [15.8.2] - 2026-06-03
@@ -245,7 +327,7 @@
245
327
  - Changed the `task` tool's streaming call preview to list each dispatched agent's `id` and UI description as a tree instead of a bare `N agents` count, so the individual agents are visible while the tool-call arguments are still streaming. The collapsed view caps at 12 entries (`… N more agents`); the expanded view shows all.
246
328
  - Changed Mnemopi `recall` tool output to include memory ids for explicit recall results so agents can target `memory_edit`; auto-injected memory context and `reflect` remain id-free.
247
329
  - Changed the system prompt to advertise `memory://root` only when the local memory backend is active.
248
- - Changed `todo_write` result rendering to animate completed items in place: the checkbox flips checked first, then the strikethrough reveals across the task text.
330
+ - Changed `todo` result rendering to animate completed items in place: the checkbox flips checked first, then the strikethrough reveals across the task text.
249
331
 
250
332
  ### Fixed
251
333
 
@@ -325,7 +407,7 @@
325
407
 
326
408
  ### Changed
327
409
 
328
- - Changed the sticky `Todos` panel above the editor to advance as tasks close, instead of pinning to the first 5 tasks of the active phase. `selectStickyTodoWindow` now shows up to 5 open (pending / in_progress) tasks in original phase order and reports the count of remaining open tasks for the `+N more` hint, so every `todo_write` flip produces a visible row shift. Closed-phase tail falls back to the last 5 tasks (with the `+N more` line suppressed) until `getActivePhase` walks to the next phase.
410
+ - Changed the sticky `Todos` panel above the editor to advance as tasks close, instead of pinning to the first 5 tasks of the active phase. `selectStickyTodoWindow` now shows up to 5 open (pending / in_progress) tasks in original phase order and reports the count of remaining open tasks for the `+N more` hint, so every `todo` flip produces a visible row shift. Closed-phase tail falls back to the last 5 tasks (with the `+N more` line suppressed) until `getActivePhase` walks to the next phase.
329
411
  - Linked the sticky `Todos` panel to the live `SessionObserverRegistry` so pending todos that have an in-flight subagent doing their work light up green with an animated spinner — the same `theme.spinnerFrames` ("status" preset) the `task` tool uses for its agent rows — instead of staying greyed out as if nothing is happening. A new exported `todoMatchesAnyDescription(content, descriptions)` does case- and whitespace-insensitive equality first with a 6-char minimum-overlap substring fallback in either direction, so "Sonnet #2: shallow bug scan" and a subagent description of "Sonnet #2" still link up. Completed todos now render with `theme.status.success` (✔ / `\uf00c` / `[ok]` per symbol preset, still wrapped in the `success` colour so themed palettes can keep their purple/green/whatever) and in_progress rows render with `theme.status.running`, matching the `task` tool's icon vocabulary. The spinner interval only ticks while at least one visible open todo has a matched active subagent, and self-stops once subagents finish, so plain in_progress todos do not animate forever in the absence of subagent activity.
330
412
  - Extracted the top-level CLI command table from `src/cli.ts` into a side-effect-free `src/cli-commands.ts` so test code can introspect the registered subcommands without triggering the entrypoint's top-level await.
331
413
 
@@ -1726,9 +1808,9 @@
1726
1808
 
1727
1809
  ### Breaking Changes
1728
1810
 
1729
- - `todo_write`: renamed `replace` op to `init` and reshaped its input to `list: [{phase: string, items: string[]}]`. Tasks no longer accept a `status` field; all start `pending` and the first auto-promotes to `in_progress`. The `append` op's `items` is now `string[]` (was `{id, label}[]`)
1730
- - `todo_write`: removed the synthetic `task-N` / `phase-N` ids — task identity is now its `content` and phase identity is its `name`. The `task` field on `start`/`done`/`drop`/`note` and the `phase` field on `done`/`drop`/`rm`/`append` take those values directly
1731
- - `todo_write`: phase names no longer accept a numeric/roman prefix (`I.`, `1.`, `Phase 1:`, …). The renderer numbers phases visually (Ⅰ. Ⅱ. Ⅲ. …) and the model-facing state stores the bare noun phrase
1811
+ - `todo`: renamed `replace` op to `init` and reshaped its input to `list: [{phase: string, items: string[]}]`. Tasks no longer accept a `status` field; all start `pending` and the first auto-promotes to `in_progress`. The `append` op's `items` is now `string[]` (was `{id, label}[]`)
1812
+ - `todo`: removed the synthetic `task-N` / `phase-N` ids — task identity is now its `content` and phase identity is its `name`. The `task` field on `start`/`done`/`drop`/`note` and the `phase` field on `done`/`drop`/`rm`/`append` take those values directly
1813
+ - `todo`: phase names no longer accept a numeric/roman prefix (`I.`, `1.`, `Phase 1:`, …). The renderer numbers phases visually (Ⅰ. Ⅱ. Ⅲ. …) and the model-facing state stores the bare noun phrase
1732
1814
 
1733
1815
  ### Changed
1734
1816
 
@@ -1954,7 +2036,7 @@
1954
2036
 
1955
2037
  ### Added
1956
2038
 
1957
- - Added `note` to todo-write operations so you can append follow-up text notes to a task via `op: "note"` and `text`
2039
+ - Added `note` to todo operations so you can append follow-up text notes to a task via `op: "note"` and `text`
1958
2040
  - Added markdown note-block support to `/todo export` and `/todo import` so task notes are written as blockquote lines and reloaded with the todo list
1959
2041
  - Added `/todo export <path>` to write the current todo list as Markdown to a file, defaulting to `TODO.md` when no path is provided
1960
2042
  - Added `/todo import <path>` to replace the current todo list from a Markdown file, defaulting to `TODO.md` when no path is provided
@@ -2018,7 +2100,7 @@
2018
2100
  - Removed multi-pattern array input from `ast_grep` by changing `pat` to a single pattern string, so call sites using `pat: [...]` must be updated to send one query per invocation
2019
2101
  - Removed `lang`, `glob`, and `sel` options from `ast_edit` and `ast_grep`, and moved those behaviors into the required `path` argument
2020
2102
  - Required `path` for `ast_edit` and `ast_grep`, so invocations that relied on implicit repo-root searching are no longer valid
2021
- - Changed `todo_write` from multi-field verb payloads to an ordered array of flat operations, while retaining `replace` for harness bootstrap compatibility
2103
+ - Changed `todo` from multi-field verb payloads to an ordered array of flat operations, while retaining `replace` for harness bootstrap compatibility
2022
2104
  - Renamed atom edit operations from `before` and `after` to `pre` and `post`, so existing `atom` payloads using the old operation keys must be updated
2023
2105
  - Changed the hashline anchor format from `LINE#ID:content` to `LINEID:content` (no `#` separator, colon between anchor and content, no padding on line numbers); expanded the bigram alphabet from 40 hand-picked English bigrams to the full 647 single-token 2-letter bigrams — invalidates every previously captured `LINE#ID` reference
2024
2106
  - Renamed the subagent completion contract from `submit_result` to `yield`, so subagent sessions must now finish with the `yield` tool and the `requireYieldTool` option; `submit_result`/`requireSubmitResultTool` and old completion calls are no longer recognized
@@ -2037,10 +2119,10 @@
2037
2119
 
2038
2120
  - Updated `atom` and `hashline` edit anchor validation to auto-rebase a stale anchor within ±2 lines when the same hash matches a unique nearby line, continuing the edit with a warning instead of immediate failure
2039
2121
  - Changed bash command output labels from `[full result: artifact://…]` to `[raw output: artifact://…]` for artifact references produced from large command output
2040
- - Changed `todo_write` `done`, `rm`, and `drop` operations to target all tasks when neither `task` nor `phase` is provided, and made `append` create the target phase automatically when missing
2122
+ - Changed `todo` `done`, `rm`, and `drop` operations to target all tasks when neither `task` nor `phase` is provided, and made `append` create the target phase automatically when missing
2041
2123
  - Updated `ast_edit` and `ast_grep` to pass file-selection intent through `path` (including inline globs and comma/space-separated path lists) instead of separate `glob` filters
2042
2124
  - Changed `ast_grep` pagination API from `offset` to `skip`
2043
- - Flattened `todo_write` operation arguments to `{ op, task?, phase?, items? }[]` and removed task details from the persisted todo shape
2125
+ - Flattened `todo` operation arguments to `{ op, task?, phase?, items? }[]` and removed task details from the persisted todo shape
2044
2126
  - Changed `grep` truncation output to report `Result limit reached; narrow path.` and label match/result caps as `first N`
2045
2127
  - Changed JSON tree output to truncate inline argument pairs by available width and add an ellipsis when values no longer fit in the display
2046
2128
  - Changed JSON tree rendering to hide harness-internal `intent` and `__partialJson` fields from top-level tool output
@@ -2063,12 +2145,12 @@
2063
2145
 
2064
2146
  - Removed line-range support from `atom` mode selectors, including `loc` values like `160sr-170ab`, so edits must target a single anchor (`160sr`, `^`, or `$`) per entry
2065
2147
  - Removed the atom `del` verb and now require anchored-line deletion to be requested with `set: []`
2066
- - Removed `todo_write` task details and the `add_notes` operation
2148
+ - Removed `todo` task details and the `add_notes` operation
2067
2149
 
2068
2150
  ### Fixed
2069
2151
 
2070
2152
  - Improved no-op edit diagnostics for `atom` and `hashline` operations so edits that leave content unchanged now fail with contextual details (edit index, locator, and reason), including guidance for `replace_range` no-op cases
2071
- - Wrapped `todo_write` operations in an `ops` object so Codex/OpenAI function schemas always use a JSON Schema object.
2153
+ - Wrapped `todo` operations in an `ops` object so Codex/OpenAI function schemas always use a JSON Schema object.
2072
2154
  - Fixed JSON tree rendering for tool arguments by excluding injected internal keys from displayed root records
2073
2155
  - Printed assistant `errorMessage` text in print mode output to stderr so message-level errors are visible during non-interactive runs
2074
2156
  - Displayed assistant `errorMessage` text in the assistant message component for completed tool responses with non-terminal stop reasons
@@ -2169,14 +2251,14 @@
2169
2251
 
2170
2252
  ### Breaking Changes
2171
2253
 
2172
- - Replaced the legacy `todo_write` `ops`-based API (`replace`, `update`, `add_task`, and `remove_task`) with direct top-level fields, requiring migration of any callers using the old request shape
2173
- - Removed in-place updates to existing task `content`, `details`, and `notes` via `todo_write`; note changes now append through `add_notes`
2174
- - Phased task definitions in `todo_write` now reject `notes` on initial creation, so notes must be added later with `add_notes`
2254
+ - Replaced the legacy `todo` `ops`-based API (`replace`, `update`, `add_task`, and `remove_task`) with direct top-level fields, requiring migration of any callers using the old request shape
2255
+ - Removed in-place updates to existing task `content`, `details`, and `notes` via `todo`; note changes now append through `add_notes`
2256
+ - Phased task definitions in `todo` now reject `notes` on initial creation, so notes must be added later with `add_notes`
2175
2257
 
2176
2258
  ### Added
2177
2259
 
2178
- - Added `complete`, `start`, `abandon`, `remove`, `add_notes`, and `add_tasks` parameters to `todo_write` so callers can complete, jump to, drop, and annotate tasks without op wrappers
2179
- - Added direct `add_phase` support as a top-level argument for inserting a new phase in `todo_write`
2260
+ - Added `complete`, `start`, `abandon`, `remove`, `add_notes`, and `add_tasks` parameters to `todo` so callers can complete, jump to, drop, and annotate tasks without op wrappers
2261
+ - Added direct `add_phase` support as a top-level argument for inserting a new phase in `todo`
2180
2262
  - Added `task.simple` with `default`, `schema-free`, and `independent` modes so the task tool can disable task-call `schema` and shared `context` inputs while preserving agent-defined and inherited subagent schemas
2181
2263
 
2182
2264
  ### Changed
@@ -4001,7 +4083,7 @@
4001
4083
  - Fixed workspace symbol search to query all configured LSP servers and filter out non-matching results
4002
4084
  - Fixed `references`/`rename`/`hover` symbol targeting to error when `symbol` is missing on the line or `occurrence` is out of bounds
4003
4085
  - Fixed `reload` without a file to reload all active configured language servers instead of only the first server
4004
- - Fixed `todo_write` task normalization to auto-activate the first remaining task and include explicit remaining-items output in tool results, removing the need for an immediate follow-up start update
4086
+ - Fixed `todo` task normalization to auto-activate the first remaining task and include explicit remaining-items output in tool results, removing the need for an immediate follow-up start update
4005
4087
 
4006
4088
  ## [13.3.7] - 2026-02-27
4007
4089
 
@@ -4200,7 +4282,7 @@
4200
4282
 
4201
4283
  - Changed todo state management from file-based (`todos.json`) to in-memory session cache for improved performance and consistency
4202
4284
  - Changed todo phases to sync from session branch history when branching or rewriting entries
4203
- - Changed `TodoWriteTool` to update session cache instead of writing to disk, with automatic persistence through session entries
4285
+ - Changed `TodoTool` to update session cache instead of writing to disk, with automatic persistence through session entries
4204
4286
  - Changed XML tag from `<swarm-context>` to `<context>` in subagent prompts and task rendering
4205
4287
  - Changed system reminder XML tags from underscore to kebab-case format (`<system-reminder>`)
4206
4288
  - Changed plan storage from `plan://` protocol to `local://PLAN.md` for draft plans and `local://<title>.md` for finalized approved plans
@@ -5261,7 +5343,7 @@
5261
5343
  ### Fixed
5262
5344
 
5263
5345
  - Fixed TUI crash when ask tool renders long user input exceeding terminal width by using Text component for word wrapping instead of raw line output
5264
- - Fixed TUI crash when todo_write tool renders long todo content exceeding terminal width by using Text component for word wrapping instead of truncation
5346
+ - Fixed TUI crash when todo tool renders long todo content exceeding terminal width by using Text component for word wrapping instead of truncation
5265
5347
 
5266
5348
  ## [11.5.0] - 2026-02-06
5267
5349
 
@@ -5505,7 +5587,7 @@
5505
5587
  - Added new subcommands to help text: `commit` for AI-assisted git commits, `stats` for AI usage statistics dashboard, and `jupyter` for managing the shared Jupyter gateway
5506
5588
  - Added `grep` subcommand to help text for testing the grep tool
5507
5589
  - Added `browser` tool documentation for browser automation using Puppeteer
5508
- - Added `todo_write` tool documentation for managing todo and task lists
5590
+ - Added `todo` tool documentation for managing todo and task lists
5509
5591
  - Added documentation for additional LLM provider API keys (Groq, Cerebras, xAI, OpenRouter, Mistral, z.ai, MiniMax, OpenCode, Cursor, Vercel AI Gateway) in environment variables reference
5510
5592
  - Added documentation for cloud provider configuration (AWS Bedrock, Google Vertex AI) in environment variables reference
5511
5593
  - Added documentation for search provider API keys (Perplexity, Anthropic Search) in environment variables reference
@@ -5657,7 +5739,7 @@
5657
5739
  - Tightened `ask` tool conditions to require multiple approaches with significantly different tradeoffs before prompting user
5658
5740
  - Strengthened `ask` tool guidance to default to action and only ask when genuinely blocked by decisions with materially different outcomes
5659
5741
  - Changed refactor workflow to automatically remove now-unused elements and note removals instead of asking for confirmation
5660
- - Enforced exclusive concurrency mode for all file-modifying tools (edit, write, bash, python, ssh, todo-write) to prevent concurrent execution conflicts
5742
+ - Enforced exclusive concurrency mode for all file-modifying tools (edit, write, bash, python, ssh, todo) to prevent concurrent execution conflicts
5661
5743
  - Updated `ask` tool guidance to prioritize proactive problem-solving and default to action, asking only when truly blocked by decisions that materially change scope or behavior
5662
5744
  - Changed Python kernel initialization to require shared gateway mode; local gateway startup has been removed
5663
5745
  - Changed shared gateway error handling to retry on server errors (5xx status codes) before failing
@@ -5698,7 +5780,7 @@
5698
5780
 
5699
5781
  - Added `find.enabled`, `grep.enabled`, `ls.enabled`, `notebook.enabled`, `fetch.enabled`, `web_search.enabled`, `lsp.enabled`, and `calc.enabled` settings to control availability of individual tools
5700
5782
  - Added conditional tool documentation in system prompt that dynamically lists only enabled specialized tools
5701
- - Added `todos.enabled` setting to control availability of the todo_write tool for task tracking
5783
+ - Added `todos.enabled` setting to control availability of the todo tool for task tracking
5702
5784
  - Added `tools` field to agent frontmatter for declaring agent-specific tool capabilities
5703
5785
 
5704
5786
  ### Changed
@@ -6262,10 +6344,10 @@
6262
6344
  - Changed Web Search result rendering to use renderOutputBlock with answer, sources, related questions, and metadata sections
6263
6345
  - Changed Find, Grep, and Ls tools to use renderFileList and renderTreeList for consistent file/item listing
6264
6346
  - Changed Calculator tool result rendering to use renderTreeList for result item display
6265
- - Changed Notebook and TodoWrite tools to use new TUI rendering components for consistent output format
6347
+ - Changed Notebook and Todo tools to use new TUI rendering components for consistent output format
6266
6348
  - Refactored render-utils to move tree-related utilities to TUI module (getTreeBranch, getTreeContinuePrefix)
6267
6349
  - Changed import organization in sdk.ts for consistency
6268
- - Changed tool result rendering to merge call and result displays, showing tool arguments (command, pattern, query, path) in result headers for Bash, Calculator, Fetch, Find, Grep, Ls, LSP, Notebook, Read, SSH, TodoWrite, Web Search, and Write tools
6350
+ - Changed tool result rendering to merge call and result displays, showing tool arguments (command, pattern, query, path) in result headers for Bash, Calculator, Fetch, Find, Grep, Ls, LSP, Notebook, Read, SSH, Todo, Web Search, and Write tools
6269
6351
  - Changed Read tool title to display line range when offset or limit arguments are provided
6270
6352
  - Changed worker instantiation to use direct URL import instead of pre-bundled worker files
6271
6353
  - Changed `omp commit` to use agentic mode by default with tool-based git inspection
@@ -6279,7 +6361,7 @@
6279
6361
  - Changed Calculator tool result display to show both expression and output (e.g., `2+2 = 4`) instead of just the result
6280
6362
  - Changed Python tool output to group status information under a labeled section for clearer organization
6281
6363
  - Changed SSH tool output to apply consistent styling to non-ANSI output lines
6282
- - Changed Todo Write tool to respect expanded/collapsed state and use standard preview limits
6364
+ - Changed Todo tool to respect expanded/collapsed state and use standard preview limits
6283
6365
  - Changed Web Search related questions to respect expanded/collapsed state instead of always showing all items
6284
6366
  - Changed empty and error state rendering across multiple tools (Find, Grep, Ls, Notebook, Calculator, Ask) to include consistent status headers
6285
6367
  - Changed split commit to support hunk selectors (all, indices, or line ranges) instead of whole-file staging
@@ -6383,10 +6465,10 @@
6383
6465
  - Enhanced bash and python executors to save full output as artifacts when truncated
6384
6466
  - Improved abort signal handling across <caution>ith consistent ToolAbortError
6385
6467
  - Renamed task parameter from `vars` to `args` throughout task tool interface and updated template rendering to support built-in `{{id}}` and `{{description}}` placeholders
6386
- - Simplified todo-write tool by removing active_form parameter, using single content field for task descriptions
6468
+ - Simplified todo tool by removing active_form parameter, using single content field for task descriptions
6387
6469
  - Updated system prompt structure with `<important>` and `<avoid>` tags, clearer critical sections, and standardized whitespace handling
6388
6470
  - Renamed web_fetch tool to fetch and removed internal URL handling (use read tool instead)
6389
- - Standardized tool parameter names from camelCase to snake_case across edit, grep, python, and todo-write tools
6471
+ - Standardized tool parameter names from camelCase to snake_case across edit, grep, python, and todo tools
6390
6472
  - Unified timeout parameters across all tools with auto-conversion from milliseconds and reasonable clamping (1s-3600s for bash/ssh, 1s-600s for python/gemini-image)
6391
6473
  - Simplified web-search tool by removing advanced parameters (`max_tokens`, `model`, `search_domain_filter`, `search_context_size`, `return_related_questions`) and using `recency` instead of `search_recency_filter`
6392
6474
  - Restructured tool documentation with standardized `<instruction>`, `<output>`, `<critical>`, and `<avoid>` sections across all 18 tools
@@ -6995,11 +7077,11 @@
6995
7077
 
6996
7078
  ### Added
6997
7079
 
6998
- - Added `todo_write` tool for creating and managing structured task lists during coding sessions
7080
+ - Added `todo` tool for creating and managing structured task lists during coding sessions
6999
7081
  - Added persistent todo panel above the editor that displays task progress
7000
7082
  - Added `Ctrl+T` keybinding to toggle todo list expansion
7001
7083
  - Added grouped display for consecutive Read tool calls, showing multiple file reads in a compact tree view
7002
- - Added `todo_write` tool and persistent todo panel above the editor
7084
+ - Added `todo` tool and persistent todo panel above the editor
7003
7085
 
7004
7086
  ### Changed
7005
7087
 
@@ -9251,4 +9333,4 @@ Initial public release.
9251
9333
  - Git branch display in footer
9252
9334
  - Message queueing during streaming responses
9253
9335
  - OAuth integration for Gmail and Google Calendar access
9254
- - HTML export with syntax highlighting and collapsible sections
9336
+ - HTML export with syntax highlighting and collapsible sections
@@ -14,6 +14,13 @@ export interface SkillFrontmatter {
14
14
  * rather than ones the model should auto-discover.
15
15
  */
16
16
  hide?: boolean;
17
+ /**
18
+ * Agent Skills standard equivalent of `hide`.
19
+ * When `true`, the skill is excluded from the system prompt listing.
20
+ * Normalized from kebab-case `disable-model-invocation` in YAML frontmatter.
21
+ * @see https://agentskills.io/specification
22
+ */
23
+ disableModelInvocation?: boolean;
17
24
  [key: string]: unknown;
18
25
  }
19
26
  /**
@@ -40,8 +40,22 @@ export declare function replaceBinaryForUpdate(options: BinaryReplacementOptions
40
40
  *
41
41
  * Together these two flags make `omp update` produce exactly the registry
42
42
  * lookup the version check just performed. See #1686.
43
+ *
44
+ * Also pins {@link NATIVES_PACKAGE} and the platform-specific
45
+ * `@oh-my-pi/pi-natives-<tag>` leaf to `expectedVersion`. `bun install -g`
46
+ * does not reliably refresh transitive `optionalDependencies` when the
47
+ * top-level package is the only one bumped, so the native addon and its
48
+ * version sentinel can drift out of sync with the freshly installed
49
+ * `@oh-my-pi/pi-coding-agent` and the loader aborts at
50
+ * `validateLoadedBindings` on the next launch
51
+ * (`The .node file on disk is from a different release than this loader`).
52
+ * Listing the natives explicitly forces bun to replace them in lock-step.
53
+ * The leaf is added only on tags the release pipeline actually publishes
54
+ * ({@link SUPPORTED_NATIVE_TAGS}) so unsupported platforms still fail with
55
+ * the original "no matching version" message instead of `EBADPLATFORM`.
56
+ * See #1824.
43
57
  */
44
- export declare function buildBunInstallArgs(expectedVersion: string): string[];
58
+ export declare function buildBunInstallArgs(expectedVersion: string, nativeTag?: string): string[];
45
59
  /**
46
60
  * Run the update command.
47
61
  */
@@ -0,0 +1,8 @@
1
+ /** Provider metadata needed to resolve append-only context mode. */
2
+ export interface AppendOnlyContextModel {
3
+ provider: string;
4
+ baseUrl: string;
5
+ compat?: object;
6
+ }
7
+ /** Resolves whether append-only context should be active for a model and setting. */
8
+ export declare function shouldEnableAppendOnlyContext(setting: "auto" | "on" | "off" | undefined, model: AppendOnlyContextModel | null | undefined): boolean;
@@ -72,6 +72,7 @@ export declare const ModelsConfigFile: ConfigFile<{
72
72
  order?: string[] | undefined;
73
73
  } | undefined;
74
74
  extraBody?: Record<string, unknown> | undefined;
75
+ cacheControlFormat?: "anthropic" | undefined;
75
76
  supportsStrictMode?: boolean | undefined;
76
77
  toolStrictMode?: "all_strict" | "none" | undefined;
77
78
  } | undefined;
@@ -139,6 +140,7 @@ export declare const ModelsConfigFile: ConfigFile<{
139
140
  order?: string[] | undefined;
140
141
  } | undefined;
141
142
  extraBody?: Record<string, unknown> | undefined;
143
+ cacheControlFormat?: "anthropic" | undefined;
142
144
  supportsStrictMode?: boolean | undefined;
143
145
  toolStrictMode?: "all_strict" | "none" | undefined;
144
146
  } | undefined;
@@ -200,6 +202,7 @@ export declare const ModelsConfigFile: ConfigFile<{
200
202
  order?: string[] | undefined;
201
203
  } | undefined;
202
204
  extraBody?: Record<string, unknown> | undefined;
205
+ cacheControlFormat?: "anthropic" | undefined;
203
206
  supportsStrictMode?: boolean | undefined;
204
207
  toolStrictMode?: "all_strict" | "none" | undefined;
205
208
  } | undefined;
@@ -47,6 +47,9 @@ export declare const OpenAICompatSchema: z.ZodObject<{
47
47
  order: z.ZodOptional<z.ZodArray<z.ZodString>>;
48
48
  }, z.core.$strip>>;
49
49
  extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
50
+ cacheControlFormat: z.ZodOptional<z.ZodEnum<{
51
+ anthropic: "anthropic";
52
+ }>>;
50
53
  supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
51
54
  toolStrictMode: z.ZodOptional<z.ZodEnum<{
52
55
  all_strict: "all_strict";
@@ -155,6 +158,9 @@ export declare const ModelOverrideSchema: z.ZodObject<{
155
158
  order: z.ZodOptional<z.ZodArray<z.ZodString>>;
156
159
  }, z.core.$strip>>;
157
160
  extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
161
+ cacheControlFormat: z.ZodOptional<z.ZodEnum<{
162
+ anthropic: "anthropic";
163
+ }>>;
158
164
  supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
159
165
  toolStrictMode: z.ZodOptional<z.ZodEnum<{
160
166
  all_strict: "all_strict";
@@ -242,6 +248,9 @@ export declare const ModelsConfigSchema: z.ZodObject<{
242
248
  order: z.ZodOptional<z.ZodArray<z.ZodString>>;
243
249
  }, z.core.$strip>>;
244
250
  extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
251
+ cacheControlFormat: z.ZodOptional<z.ZodEnum<{
252
+ anthropic: "anthropic";
253
+ }>>;
245
254
  supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
246
255
  toolStrictMode: z.ZodOptional<z.ZodEnum<{
247
256
  all_strict: "all_strict";
@@ -376,6 +385,9 @@ export declare const ModelsConfigSchema: z.ZodObject<{
376
385
  order: z.ZodOptional<z.ZodArray<z.ZodString>>;
377
386
  }, z.core.$strip>>;
378
387
  extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
388
+ cacheControlFormat: z.ZodOptional<z.ZodEnum<{
389
+ anthropic: "anthropic";
390
+ }>>;
379
391
  supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
380
392
  toolStrictMode: z.ZodOptional<z.ZodEnum<{
381
393
  all_strict: "all_strict";
@@ -486,6 +498,9 @@ export declare const ModelsConfigSchema: z.ZodObject<{
486
498
  order: z.ZodOptional<z.ZodArray<z.ZodString>>;
487
499
  }, z.core.$strip>>;
488
500
  extraBody: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
501
+ cacheControlFormat: z.ZodOptional<z.ZodEnum<{
502
+ anthropic: "anthropic";
503
+ }>>;
489
504
  supportsStrictMode: z.ZodOptional<z.ZodBoolean>;
490
505
  toolStrictMode: z.ZodOptional<z.ZodEnum<{
491
506
  all_strict: "all_strict";
@@ -638,6 +638,20 @@ export declare const SETTINGS_SCHEMA: {
638
638
  readonly default: 20;
639
639
  readonly description: "Maximum height in terminal rows for inline images (default 20). Set to 0 to use only the viewport-based limit (60% of terminal height).";
640
640
  };
641
+ readonly "tui.maxInlineImages": {
642
+ readonly type: "number";
643
+ readonly default: 8;
644
+ readonly description: "Maximum number of inline images kept as live terminal graphics (default 8). Older images fall back to a text placeholder via a full redraw once the limit is exceeded. Set to 0 to keep every image (no limit).";
645
+ };
646
+ readonly "tui.textSizing": {
647
+ readonly type: "boolean";
648
+ readonly default: false;
649
+ readonly ui: {
650
+ readonly tab: "appearance";
651
+ readonly label: "Large Headings (Kitty)";
652
+ readonly description: "Render Markdown H1 headings at 2x scale using Kitty's OSC 66 text-sizing protocol. Only takes effect on Kitty terminals; ignored everywhere else. Off by default.";
653
+ };
654
+ };
641
655
  readonly "tui.hyperlinks": {
642
656
  readonly type: "enum";
643
657
  readonly values: readonly ["off", "auto", "always"];
@@ -2421,7 +2435,7 @@ export declare const SETTINGS_SCHEMA: {
2421
2435
  readonly ui: {
2422
2436
  readonly tab: "tools";
2423
2437
  readonly label: "Todos";
2424
- readonly description: "Enable the todo_write tool for task tracking";
2438
+ readonly description: "Enable the todo tool for task tracking";
2425
2439
  };
2426
2440
  };
2427
2441
  readonly "todo.reminders": {
@@ -3268,7 +3282,7 @@ export declare const SETTINGS_SCHEMA: {
3268
3282
  };
3269
3283
  readonly "providers.webSearch": {
3270
3284
  readonly type: "enum";
3271
- readonly values: readonly ["auto", "exa", "brave", "jina", "kimi", "zai", "perplexity", "anthropic", "gemini", "codex", "tavily", "kagi", "synthetic", "parallel", "searxng"];
3285
+ readonly values: readonly ["auto", "tavily", "perplexity", "brave", "jina", "kimi", "anthropic", "gemini", "codex", "zai", "exa", "parallel", "kagi", "synthetic", "searxng"];
3272
3286
  readonly default: "auto";
3273
3287
  readonly ui: {
3274
3288
  readonly tab: "providers";
@@ -3277,11 +3291,15 @@ export declare const SETTINGS_SCHEMA: {
3277
3291
  readonly options: readonly [{
3278
3292
  readonly value: "auto";
3279
3293
  readonly label: "Auto";
3280
- readonly description: "Preferred web-search provider";
3294
+ readonly description: "Automatically uses the first configured web-search provider";
3281
3295
  }, {
3282
- readonly value: "exa";
3283
- readonly label: "Exa";
3284
- readonly description: "Requires EXA_API_KEY";
3296
+ readonly value: "tavily";
3297
+ readonly label: "Tavily";
3298
+ readonly description: "Requires TAVILY_API_KEY";
3299
+ }, {
3300
+ readonly value: "perplexity";
3301
+ readonly label: "Perplexity";
3302
+ readonly description: "Requires PERPLEXITY_COOKIES or PERPLEXITY_API_KEY";
3285
3303
  }, {
3286
3304
  readonly value: "brave";
3287
3305
  readonly label: "Brave";
@@ -3294,42 +3312,38 @@ export declare const SETTINGS_SCHEMA: {
3294
3312
  readonly value: "kimi";
3295
3313
  readonly label: "Kimi";
3296
3314
  readonly description: "Requires MOONSHOT_SEARCH_API_KEY or MOONSHOT_API_KEY";
3297
- }, {
3298
- readonly value: "perplexity";
3299
- readonly label: "Perplexity";
3300
- readonly description: "Requires PERPLEXITY_COOKIES or PERPLEXITY_API_KEY";
3301
3315
  }, {
3302
3316
  readonly value: "anthropic";
3303
3317
  readonly label: "Anthropic";
3304
3318
  readonly description: "Claude's native web_search tool (uses Anthropic OAuth or ANTHROPIC_API_KEY)";
3305
- }, {
3306
- readonly value: "codex";
3307
- readonly label: "OpenAI";
3308
- readonly description: "OpenAI's native web_search (uses ChatGPT OAuth via /login openai-codex)";
3309
3319
  }, {
3310
3320
  readonly value: "gemini";
3311
3321
  readonly label: "Gemini";
3312
3322
  readonly description: "Google Search grounding via Gemini (uses google-gemini-cli or google-antigravity OAuth)";
3323
+ }, {
3324
+ readonly value: "codex";
3325
+ readonly label: "OpenAI";
3326
+ readonly description: "OpenAI's native web_search (uses ChatGPT OAuth via /login openai-codex)";
3313
3327
  }, {
3314
3328
  readonly value: "zai";
3315
3329
  readonly label: "Z.AI";
3316
3330
  readonly description: "Calls Z.AI webSearchPrime MCP";
3317
3331
  }, {
3318
- readonly value: "tavily";
3319
- readonly label: "Tavily";
3320
- readonly description: "Requires TAVILY_API_KEY";
3332
+ readonly value: "exa";
3333
+ readonly label: "Exa";
3334
+ readonly description: "Uses Exa API when EXA_API_KEY is set; falls back to Exa MCP";
3335
+ }, {
3336
+ readonly value: "parallel";
3337
+ readonly label: "Parallel";
3338
+ readonly description: "Requires PARALLEL_API_KEY";
3321
3339
  }, {
3322
3340
  readonly value: "kagi";
3323
3341
  readonly label: "Kagi";
3324
- readonly description: "Requires KAGI_API_KEY (Kagi V1 Search API)";
3342
+ readonly description: "Requires KAGI_API_KEY and Kagi Search API beta access";
3325
3343
  }, {
3326
3344
  readonly value: "synthetic";
3327
3345
  readonly label: "Synthetic";
3328
3346
  readonly description: "Requires SYNTHETIC_API_KEY";
3329
- }, {
3330
- readonly value: "parallel";
3331
- readonly label: "Parallel";
3332
- readonly description: "Requires PARALLEL_API_KEY";
3333
3347
  }, {
3334
3348
  readonly value: "searxng";
3335
3349
  readonly label: "SearXNG";
@@ -3654,11 +3668,11 @@ export declare const SETTINGS_SCHEMA: {
3654
3668
  readonly ui: {
3655
3669
  readonly tab: "providers";
3656
3670
  readonly label: "Append-Only Context";
3657
- readonly description: "Cache system prompt + tool specs and keep an append-only message log so provider prefix caches (DeepSeek, Anthropic) hit at maximum rate. Auto enables for DeepSeek.";
3671
+ readonly description: "Cache system prompt + tool specs and keep an append-only message log so provider prefix caches (DeepSeek, Xiaomi/SGLang, Anthropic) hit at maximum rate. Auto enables for known prefix-cache providers.";
3658
3672
  readonly options: readonly [{
3659
3673
  readonly value: "auto";
3660
3674
  readonly label: "Auto";
3661
- readonly description: "Enable for DeepSeek (recommended)";
3675
+ readonly description: "Enable for known prefix-cache providers (recommended)";
3662
3676
  }, {
3663
3677
  readonly value: "on";
3664
3678
  readonly label: "On";
@@ -0,0 +1,38 @@
1
+ import { Container, type ImageBudget, type TextSizingScale } from "@oh-my-pi/pi-tui";
2
+ /**
3
+ * Encode raw 8-bit RGB pixels (`width * height * 3` bytes, row-major) as a PNG
4
+ * (color type 2, no interlacing). The IDAT payload is a real zlib stream from
5
+ * {@link zlib.deflateSync}, so the output is a fully valid PNG that every image
6
+ * protocol — including Sixel, which decodes the bytes natively — accepts.
7
+ */
8
+ export declare function encodeRgbPng(width: number, height: number, rgb: Uint8Array): Uint8Array;
9
+ export interface SampleImage {
10
+ base64: string;
11
+ mimeType: string;
12
+ dimensions: {
13
+ widthPx: number;
14
+ heightPx: number;
15
+ };
16
+ }
17
+ /** Build a deterministic RGB gradient PNG (red across, green down, constant blue). */
18
+ export declare function buildSampleImage(width?: number, height?: number): SampleImage;
19
+ /**
20
+ * OSC 66 text-sizing sample lines, one scaled span per requested scale. Each
21
+ * scaled row is followed by `scale - 1` blank rows that reserve the vertical
22
+ * cells its multi-cell glyphs occupy — mirroring the markdown H1 renderer so
23
+ * the next line does not paint over the bottom of the glyphs.
24
+ */
25
+ export declare function buildLargeTextLines(scales?: readonly TextSizingScale[]): string[];
26
+ export interface ProtocolProbeOptions {
27
+ image: SampleImage;
28
+ imageBudget: ImageBudget;
29
+ /** Whether the desktop notification was suppressed (e.g. `PI_NOTIFICATIONS=off`). */
30
+ notificationSuppressed: boolean;
31
+ }
32
+ /**
33
+ * Self-contained panel that renders one sample of every special terminal
34
+ * protocol into the chat transcript.
35
+ */
36
+ export declare class ProtocolProbeComponent extends Container {
37
+ constructor(options: ProtocolProbeOptions);
38
+ }