@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.
- package/CHANGELOG.md +113 -31
- package/dist/types/capability/skill.d.ts +7 -0
- package/dist/types/cli/update-cli.d.ts +15 -1
- package/dist/types/config/append-only-context-mode.d.ts +8 -0
- package/dist/types/config/model-registry.d.ts +3 -0
- package/dist/types/config/models-config-schema.d.ts +15 -0
- package/dist/types/config/settings-schema.d.ts +38 -24
- package/dist/types/debug/protocol-probe.d.ts +38 -0
- package/dist/types/debug/terminal-info.d.ts +34 -0
- package/dist/types/exa/mcp-client.d.ts +2 -1
- package/dist/types/export/html/template.generated.d.ts +1 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
- package/dist/types/extensibility/extensions/types.d.ts +11 -0
- package/dist/types/extensibility/shared-events.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/mcp/json-rpc.d.ts +6 -1
- package/dist/types/mcp/tool-bridge.d.ts +4 -0
- package/dist/types/mcp/transports/stdio.d.ts +16 -7
- package/dist/types/mnemopi/state.d.ts +2 -2
- package/dist/types/modes/components/agent-dashboard.d.ts +1 -0
- package/dist/types/modes/components/assistant-message.d.ts +3 -2
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +1 -0
- package/dist/types/modes/components/hook-selector.d.ts +11 -0
- package/dist/types/modes/components/plugin-settings.d.ts +40 -8
- package/dist/types/modes/components/session-selector.d.ts +8 -3
- package/dist/types/modes/components/settings-selector.d.ts +1 -1
- package/dist/types/modes/components/todo-reminder.d.ts +1 -1
- package/dist/types/modes/components/transcript-container.d.ts +36 -0
- package/dist/types/modes/interactive-mode.d.ts +2 -1
- package/dist/types/modes/rpc/rpc-types.d.ts +1 -1
- package/dist/types/modes/theme/theme.d.ts +20 -1
- package/dist/types/modes/utils/keybinding-matchers.d.ts +4 -0
- package/dist/types/plan-mode/plan-handoff.d.ts +20 -0
- package/dist/types/session/agent-session.d.ts +5 -2
- package/dist/types/session/history-storage.d.ts +3 -4
- package/dist/types/session/indexed-session-storage.d.ts +59 -0
- package/dist/types/session/messages.d.ts +1 -0
- package/dist/types/session/redis-session-storage.d.ts +12 -85
- package/dist/types/session/session-manager.d.ts +21 -0
- package/dist/types/session/session-storage.d.ts +5 -7
- package/dist/types/session/sql-session-storage.d.ts +16 -85
- package/dist/types/slash-commands/types.d.ts +17 -4
- package/dist/types/task/executor.d.ts +9 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/telemetry-export.d.ts +19 -0
- package/dist/types/tiny/compiled-runtime.d.ts +35 -0
- package/dist/types/tiny/text.d.ts +17 -0
- package/dist/types/tools/ask.d.ts +1 -0
- package/dist/types/tools/index.d.ts +4 -2
- package/dist/types/tools/path-utils.d.ts +1 -1
- package/dist/types/tools/search.d.ts +2 -2
- package/dist/types/tools/{todo-write.d.ts → todo.d.ts} +18 -18
- package/dist/types/utils/session-color.d.ts +7 -2
- package/dist/types/web/search/index.d.ts +1 -1
- package/dist/types/web/search/provider.d.ts +2 -2
- package/dist/types/web/search/providers/base.d.ts +14 -0
- package/dist/types/web/search/providers/exa.d.ts +9 -0
- package/dist/types/web/search/providers/perplexity.d.ts +2 -2
- package/dist/types/web/search/types.d.ts +66 -1
- package/package.json +15 -9
- package/scripts/build-binary.ts +12 -0
- package/src/capability/skill.ts +7 -0
- package/src/cli/args.ts +1 -1
- package/src/cli/session-picker.ts +1 -0
- package/src/cli/update-cli.ts +54 -2
- package/src/commands/completions.ts +1 -1
- package/src/config/append-only-context-mode.ts +37 -0
- package/src/config/models-config-schema.ts +1 -0
- package/src/config/settings-schema.ts +24 -57
- package/src/debug/index.ts +67 -1
- package/src/debug/protocol-probe.ts +267 -0
- package/src/debug/terminal-info.ts +127 -0
- package/src/exa/mcp-client.ts +11 -5
- package/src/export/html/template.generated.ts +1 -1
- package/src/export/html/template.js +3 -3
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/types.ts +11 -0
- package/src/extensibility/shared-events.ts +1 -1
- package/src/extensibility/skills.ts +3 -3
- package/src/index.ts +1 -0
- package/src/internal-urls/docs-index.generated.ts +7 -7
- package/src/main.ts +16 -2
- package/src/mcp/json-rpc.ts +8 -0
- package/src/mcp/render.ts +3 -0
- package/src/mcp/tool-bridge.ts +10 -2
- package/src/mcp/transports/http.ts +33 -16
- package/src/mcp/transports/stdio.ts +37 -12
- package/src/mnemopi/state.ts +4 -4
- package/src/modes/acp/acp-agent.ts +168 -3
- package/src/modes/acp/acp-event-mapper.ts +7 -7
- package/src/modes/components/agent-dashboard.ts +103 -31
- package/src/modes/components/assistant-message.ts +3 -2
- package/src/modes/components/extensions/extension-dashboard.ts +56 -10
- package/src/modes/components/history-search.ts +128 -14
- package/src/modes/components/hook-selector.ts +149 -14
- package/src/modes/components/plugin-settings.ts +270 -36
- package/src/modes/components/session-selector.ts +81 -19
- package/src/modes/components/settings-selector.ts +1 -1
- package/src/modes/components/status-line/segments.ts +2 -1
- package/src/modes/components/status-line.ts +1 -1
- package/src/modes/components/tips.txt +6 -2
- package/src/modes/components/todo-reminder.ts +1 -1
- package/src/modes/components/tool-execution.ts +9 -4
- package/src/modes/components/transcript-container.ts +109 -0
- package/src/modes/controllers/command-controller.ts +4 -3
- package/src/modes/controllers/event-controller.ts +12 -7
- package/src/modes/controllers/extension-ui-controller.ts +3 -0
- package/src/modes/controllers/input-controller.ts +10 -5
- package/src/modes/controllers/selector-controller.ts +30 -19
- package/src/modes/controllers/todo-command-controller.ts +1 -1
- package/src/modes/interactive-mode.ts +56 -9
- package/src/modes/print-mode.ts +5 -0
- package/src/modes/rpc/rpc-types.ts +1 -1
- package/src/modes/theme/theme.ts +48 -8
- package/src/modes/utils/keybinding-matchers.ts +10 -0
- package/src/modes/utils/ui-helpers.ts +1 -0
- package/src/plan-mode/plan-handoff.ts +37 -0
- package/src/priority.json +4 -0
- package/src/prompts/goals/goal-continuation.md +1 -1
- package/src/prompts/steering/user-interjection.md +10 -0
- package/src/prompts/system/agent-creation-architect.md +1 -26
- package/src/prompts/system/eager-todo.md +3 -3
- package/src/prompts/system/orchestrate-notice.md +5 -5
- package/src/prompts/system/plan-mode-approved.md +14 -17
- package/src/prompts/system/plan-mode-reference.md +3 -6
- package/src/prompts/system/subagent-system-prompt.md +11 -0
- package/src/prompts/system/system-prompt.md +143 -145
- package/src/prompts/system/title-system.md +3 -2
- package/src/prompts/system/workflow-notice.md +1 -1
- package/src/prompts/tools/browser.md +33 -30
- package/src/prompts/tools/render-mermaid.md +2 -2
- package/src/prompts/tools/search.md +1 -1
- package/src/prompts/tools/task.md +3 -1
- package/src/prompts/tools/{todo-write.md → todo.md} +5 -5
- package/src/sdk.ts +6 -21
- package/src/session/agent-session.ts +44 -21
- package/src/session/history-storage.ts +11 -18
- package/src/session/indexed-session-storage.ts +430 -0
- package/src/session/messages.ts +80 -0
- package/src/session/redis-session-storage.ts +66 -377
- package/src/session/session-manager.ts +109 -23
- package/src/session/session-storage.ts +148 -68
- package/src/session/sql-session-storage.ts +131 -382
- package/src/slash-commands/helpers/todo.ts +2 -2
- package/src/slash-commands/types.ts +27 -10
- package/src/task/executor.ts +9 -1
- package/src/task/index.ts +51 -1
- package/src/telemetry-export.ts +126 -0
- package/src/tiny/compiled-runtime.ts +179 -0
- package/src/tiny/text.ts +112 -1
- package/src/tiny/worker.ts +24 -2
- package/src/tools/ask.ts +133 -87
- package/src/tools/fetch.ts +17 -4
- package/src/tools/find.ts +2 -2
- package/src/tools/index.ts +6 -4
- package/src/tools/memory-recall.ts +1 -1
- package/src/tools/memory-reflect.ts +1 -1
- package/src/tools/path-utils.ts +16 -7
- package/src/tools/renderers.ts +2 -2
- package/src/tools/search.ts +6 -3
- package/src/tools/ssh.ts +26 -10
- package/src/tools/{todo-write.ts → todo.ts} +32 -35
- package/src/tools/write.ts +14 -2
- package/src/tui/status-line.ts +15 -4
- package/src/utils/session-color.ts +39 -14
- package/src/utils/title-generator.ts +9 -2
- package/src/web/search/index.ts +4 -2
- package/src/web/search/provider.ts +19 -35
- package/src/web/search/providers/base.ts +17 -0
- package/src/web/search/providers/exa.ts +111 -7
- package/src/web/search/providers/perplexity.ts +8 -4
- 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
|
|
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 `
|
|
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 `
|
|
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
|
-
- `
|
|
1730
|
-
- `
|
|
1731
|
-
- `
|
|
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
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
2173
|
-
- Removed in-place updates to existing task `content`, `details`, and `notes` via `
|
|
2174
|
-
- Phased task definitions in `
|
|
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 `
|
|
2179
|
-
- Added direct `add_phase` support as a top-level argument for inserting a new phase in `
|
|
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 `
|
|
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 `
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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 `
|
|
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 `
|
|
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
|
|
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", "
|
|
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: "
|
|
3294
|
+
readonly description: "Automatically uses the first configured web-search provider";
|
|
3281
3295
|
}, {
|
|
3282
|
-
readonly value: "
|
|
3283
|
-
readonly label: "
|
|
3284
|
-
readonly description: "Requires
|
|
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: "
|
|
3319
|
-
readonly label: "
|
|
3320
|
-
readonly description: "
|
|
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
|
|
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
|
|
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
|
|
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
|
+
}
|