chore: fix changelogs
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
- Fixed tool-output pruning and shake protection for `read`: ordinary file/URL reads are now eligible for compaction, while `read` calls whose `path` starts with `skill://` remain protected like native `skill` results.
|
||||
|
||||
## [15.5.15] - 2026-05-30
|
||||
|
||||
### Added
|
||||
|
||||
- Added `maxToolCallsPerTurn` to `AgentLoopConfig`/`AgentOptions`, allowing callers to cut a streamed assistant turn after a completed tool-call batch and execute the runnable partial turn instead of waiting for the provider to yield.
|
||||
@@ -48,6 +49,7 @@
|
||||
- Changed `Agent.appendMessage`, `popMessage`, `clearMessages`, and `reset` to mutate `state.messages` and `state.pendingToolCalls` in place instead of allocating a fresh array/Set on every transition. Subscribers that capture `state.messages` by reference now observe updates without needing to re-read `state` after each event. The public type signature is unchanged (always `AgentMessage[]` / `Set<string>`).
|
||||
|
||||
## [15.5.0] - 2026-05-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added `approval` support to `AgentTool` declarations with the new `ToolTier` and `ToolApproval` APIs, allowing tools to declare capability tiers (`read`, `write`, or `exec`) and optional override/reason metadata for approval gating
|
||||
@@ -59,23 +61,27 @@
|
||||
- Fixed chat-request telemetry storing the raw scoped `serviceTier` value (`"openai-only"`/`"claude-only"`) in `OpenAIAttr.RequestServiceTier` instead of the resolved wire value (`"priority"`). Dashboards and alerts filtering on the concrete tier name (`service_tier == "priority"`) were broken by the scoped placeholder; `buildChatRequestAttributes` now runs the tier through `resolveServiceTier(serviceTier, provider)` before recording, keeping the `shouldSendServiceTier` gate intact so non-OpenAI providers continue to omit the attribute entirely.
|
||||
|
||||
## [15.3.0] - 2026-05-25
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed `transformContext` receiving the loop config object as the `signal` argument instead of the actual `AbortSignal`, so hooks that check `signal.aborted` or call `signal.addEventListener` now work correctly under abort/timeout conditions
|
||||
- Fixed `appendOnlyContext` not being re-evaluated after `setModel()` — the mode was decided once at session construction based on the initial model's provider, so switching from/to DeepSeek (or changing `provider.appendOnlyContext`) mid-session produced incorrect mode behavior
|
||||
|
||||
## [15.2.3] - 2026-05-22
|
||||
|
||||
### Added
|
||||
|
||||
- Added `onBeforeYield` hook support so user code can run right before the agent loop checks for follow-up messages
|
||||
|
||||
## [15.1.3] - 2026-05-17
|
||||
|
||||
### Added
|
||||
|
||||
- Added optional `telemetry` support to `generateSummary`, `generateHandoff`, `generateBranchSummary`, and `compact` options so compaction, handoff, and branch summary one-shot LLM calls can emit OpenTelemetry chat telemetry when enabled
|
||||
- Added shared oneshot telemetry instrumentation for compaction, handoff, and branch summary calls, tagging spans with `pi.gen_ai.oneshot.kind` values such as `compaction_summary`, `compaction_short_summary`, `compaction_turn_prefix`, `handoff`, and `branch_summary`
|
||||
|
||||
## [15.1.2] - 2026-05-15
|
||||
|
||||
### Added
|
||||
|
||||
- Added `responseHeaders` to `ChatUsageEvent` and `ManualChatTelemetryOptions` so telemetry hooks receive captured lowercase upstream response headers for each chat span
|
||||
@@ -83,6 +89,7 @@
|
||||
- Added exported `detectGatewayFromHeaders` API for header-based gateway detection
|
||||
|
||||
## [15.1.0] - 2026-05-15
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed the `@oh-my-pi/pi-agent-core/compaction/handoff` exports from the package surface, including `extractHandoffDocument`, `createHandoffContext`, and `createHandoffFileName`
|
||||
@@ -133,6 +140,7 @@
|
||||
- Fixed unbounded recursion in summary content capture when a captured value contains a cyclic or deeply nested array — array recursion now respects the same depth cap as plain-object recursion and replaces back-references with `"[Circular]"`
|
||||
|
||||
## [15.0.1] - 2026-05-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Raised the minimum required Bun version from >=1.3.7 to >=1.3.14
|
||||
@@ -144,6 +152,7 @@
|
||||
- Added an `isError?: boolean` field on `AgentToolResult` so tools can flag a non-throwing failure (e.g. an aggregator that catches per-entry errors). `coerceToolResult` preserves the flag and the agent loop surfaces it as a tool error on the wire.
|
||||
|
||||
## [14.9.3] - 2026-05-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `onHarmonyLeak` option on `Agent`/loop config to receive GPT-5 Harmony leak audit callbacks
|
||||
@@ -159,13 +168,11 @@
|
||||
- Hardened failure handling so repeated GPT-5 Harmony leak mitigation is retried only up to two times before escalating to an explicit error
|
||||
|
||||
## [14.9.0] - 2026-05-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `Agent#metadata` field forwarded to every API request; callers can set arbitrary provider metadata (e.g. `metadata.user_id`) once and have it applied to all subsequent stream calls without modifying per-call options
|
||||
- Added `Agent#setMetadataResolver(fn)` for installing a function that resolves request metadata at call time. The `metadata` getter dispatches through the resolver on every read (including the snapshot taken per `prompt()`), so callers reflect mutable external state (e.g. live OAuth account UUID after a token refresh) without manual re-syncs. Plain `agent.metadata = …` continues to set a static value and clears any installed resolver.
|
||||
|
||||
### Added
|
||||
|
||||
- Added an `onSseEvent` agent option and loop config forwarding path for raw provider SSE diagnostics.
|
||||
|
||||
## [14.7.6] - 2026-05-07
|
||||
@@ -173,13 +180,16 @@
|
||||
### Added
|
||||
|
||||
- Added `hideThinkingSummary` option/getter/setter on `Agent` and `AgentLoopConfig`. Forwarded to the underlying stream call so providers can omit reasoning/thinking summaries on demand.
|
||||
|
||||
## [14.7.2] - 2026-05-06
|
||||
|
||||
### Added
|
||||
|
||||
- Added `loadMode` option to `AgentTool` to mark built-in tools as `essential` for initial loading or `discoverable` for search activation
|
||||
- Added optional `summary` field to `AgentTool` definitions for one-line text used in tool discovery indexes
|
||||
|
||||
## [14.7.0] - 2026-05-04
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `Agent` API types so `systemPrompt` is now a list of prompt strings, requiring callers to pass and update system prompts via string arrays
|
||||
@@ -199,6 +209,7 @@
|
||||
- Fixed unhandled promise rejection when `getApiKey` or any other async error occurs during `streamAssistantResponse`: agent loop IIFEs now catch and route errors through `EventStream.fail()`, which terminates the `for await` loop and lets `Agent#runLoop`'s catch block create a proper error assistant message instead of crashing
|
||||
|
||||
## [14.6.0] - 2026-05-02
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed request cancellation before provider events by emitting an aborted assistant message and ending the stream with `stopReason: "aborted"`
|
||||
@@ -216,6 +227,7 @@
|
||||
- Changed tool dispatch to match model-returned tool calls by either internal tool name or custom wire name, enabling custom OpenAI tool names such as `apply_patch`.
|
||||
|
||||
## [14.0.1] - 2026-04-08
|
||||
|
||||
### Added
|
||||
|
||||
- Added `onAssistantMessageEvent` callback option to inspect assistant streaming events before they are emitted, enabling abort decisions before buffered events continue flowing
|
||||
@@ -238,6 +250,7 @@
|
||||
- Fixed stale forced toolChoice being passed to provider after tools are refreshed mid-turn
|
||||
|
||||
## [13.9.16] - 2026-03-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `onPayload` option to `AgentOptions` to inspect or replace provider payloads before they are sent
|
||||
@@ -256,11 +269,13 @@
|
||||
- Updated `setThinkingLevel()` method to accept `Effort | undefined` instead of `ThinkingLevel` string
|
||||
|
||||
## [13.4.0] - 2026-03-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added `getToolChoice` option to dynamically override tool choice per LLM call
|
||||
|
||||
## [13.3.8] - 2026-02-28
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed intent field name from `agent__intent` to `_i` in tool schemas
|
||||
@@ -268,12 +283,15 @@
|
||||
### Fixed
|
||||
|
||||
- Fixed synthetic tool result text formatting so aborted/error tool results no longer emit `Tool execution was aborted.: Request was aborted` style punctuation.
|
||||
|
||||
## [13.3.7] - 2026-02-27
|
||||
|
||||
### Added
|
||||
|
||||
- Added `lenientArgValidation` option to tools to allow graceful handling of argument validation errors by passing raw arguments to execute() instead of returning an error to the LLM
|
||||
|
||||
## [13.3.1] - 2026-02-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added `topP`, `topK`, `minP`, `presencePenalty`, and `repetitionPenalty` options to `AgentOptions` for fine-grained sampling control
|
||||
@@ -284,7 +302,9 @@
|
||||
### Changed
|
||||
|
||||
- Removed per-tool `agent__intent` field description from injected schema to reduce token usage; intent format is now documented once in the system prompt instead of repeated in every tool definition
|
||||
|
||||
## [12.19.0] - 2026-02-22
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated tool result messages to include error details when tool execution fails
|
||||
@@ -529,4 +549,4 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
|
||||
|
||||
- `Agent` constructor now has all options optional (empty options use defaults).
|
||||
|
||||
- `queueMessage()` is now synchronous (no longer returns a Promise).
|
||||
- `queueMessage()` is now synchronous (no longer returns a Promise).
|
||||
|
||||
+38
-43
@@ -1,14 +1,7 @@
|
||||
# Changelog
|
||||
|
||||
## [Unreleased]
|
||||
### Fixed
|
||||
|
||||
- Fixed Cursor provider requests failing with `Cannot send empty user message to Cursor API` after tool-result history by selecting the latest user/developer turn instead of assuming the final context message is the active user turn.
|
||||
- Fixed Anthropic web search dropping `ANTHROPIC_CUSTOM_HEADERS` when `CLAUDE_CODE_USE_FOUNDRY` was unset, causing 401s from corporate API gateways. `resolveAnthropicCustomHeadersForBaseUrl` now forwards the parsed headers whenever the base URL is non-Anthropic (or Foundry is enabled), and `buildAnthropicSearchHeaders` threads them through `buildAnthropicHeaders` so the search and streaming paths behave identically ([#1693](https://github.com/can1357/oh-my-pi/issues/1693)).
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed OpenCode Go Anthropic-format models such as `qwen3.7-max` sending Anthropic `X-Api-Key` auth alongside the OpenCode bearer token, avoiding spurious Alibaba `401 Invalid API-key provided` errors. ([#1661](https://github.com/can1357/oh-my-pi/issues/1661))
|
||||
### Changed
|
||||
|
||||
- Changed generated OAuth metadata `user_id` to use a deterministic `device_id` derived from the install ID instead of a random value
|
||||
@@ -26,6 +19,9 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Cursor provider requests failing with `Cannot send empty user message to Cursor API` after tool-result history by selecting the latest user/developer turn instead of assuming the final context message is the active user turn.
|
||||
- Fixed Anthropic web search dropping `ANTHROPIC_CUSTOM_HEADERS` when `CLAUDE_CODE_USE_FOUNDRY` was unset, causing 401s from corporate API gateways. `resolveAnthropicCustomHeadersForBaseUrl` now forwards the parsed headers whenever the base URL is non-Anthropic (or Foundry is enabled), and `buildAnthropicSearchHeaders` threads them through `buildAnthropicHeaders` so the search and streaming paths behave identically ([#1693](https://github.com/can1357/oh-my-pi/issues/1693)).
|
||||
- Fixed OpenCode Go Anthropic-format models such as `qwen3.7-max` sending Anthropic `X-Api-Key` auth alongside the OpenCode bearer token, avoiding spurious Alibaba `401 Invalid API-key provided` errors. ([#1661](https://github.com/can1357/oh-my-pi/issues/1661))
|
||||
- Fixed OAuth token exchange and refresh flows to fetch Claude CLI bootstrap identity when token responses omit account information, so `accountId` and `email` are now recovered when available
|
||||
|
||||
## [15.7.5] - 2026-06-01
|
||||
@@ -69,6 +65,7 @@
|
||||
- Fixed OpenCode-Go dynamic model refresh downgrading `qwen3.7-max` from Anthropic Messages to OpenAI-compatible transport, which caused `401 Model qwen3.7-max is not supported for format oa-compat` after `/v1/models` cache refreshes.
|
||||
|
||||
## [15.5.12] - 2026-05-29
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed ANTML stream markup healing for `antml:function_calls` and `antml:thinking` envelopes, so Anthropic-compatible providers no longer parse those tags into `toolCall`/`thinking` events
|
||||
@@ -122,13 +119,12 @@
|
||||
- Fixed `streamSimple` to retry on usage-limit errors (including message-only error events) before any content is emitted, so `onAuthError` can rotate credentials automatically
|
||||
- Fixed auth-gateway error classification to extract embedded status codes and use word-boundary matching, so `GenerateContentRequest` and similar messages are no longer misreported as rate-limit errors
|
||||
- Fixed `checkCredentials` to handle `completionProbe` exceptions by recording the failure in `CredentialHealthResult.completion.reason` while still returning the usage probe result
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Google Vertex's bundled model list to use the authoritative models.dev catalog, including MaaS entries such as `deepseek-ai/deepseek-v3.2-maas` and removing retired Gemini 1.5 fallbacks. ([#1456](https://github.com/can1357/oh-my-pi/issues/1456))
|
||||
|
||||
## [15.5.7] - 2026-05-27
|
||||
|
||||
### Added
|
||||
|
||||
- `SimpleStreamOptions.openrouterVariant` (`"nitro"`, `"floor"`, `"online"`, `"exacto"`, …) — when set, appends `:<variant>` to OpenRouter model IDs at request time, leaving ids that already carry an explicit `:suffix` untouched. Plumbed through `openai-completions` and the pi-native gateway forwarder.
|
||||
|
||||
- xAI Grok OAuth (SuperGrok Subscription) provider in `/login`. Loopback PKCE flow on `127.0.0.1:56121`; the token unlocks Grok-4.x chat. Ported from NousResearch/hermes-agent (MIT).
|
||||
@@ -145,6 +141,7 @@
|
||||
- Fixed OpenRouter DeepSeek V4 tool-call follow-up requests replaying normalized `reasoning` as-is instead of DeepSeek's required `reasoning_content`, which caused HTTP 400 errors in thinking mode. ([#1445](https://github.com/can1357/oh-my-pi/issues/1445))
|
||||
|
||||
## [15.5.6] - 2026-05-27
|
||||
|
||||
### Added
|
||||
|
||||
- Added `PI_CODEX_WEBSOCKET_MAX_IDLE_REUSE_MS` to control how long an idle Codex WebSocket stays eligible for reuse, with `0` disabling the check
|
||||
@@ -162,11 +159,14 @@
|
||||
- Added `PI_CODEX_WEBSOCKET_PING_INTERVAL_MS` to configure the interval for Codex WebSocket protocol ping heartbeats
|
||||
- Added `PI_CODEX_WEBSOCKET_PONG_TIMEOUT_MS` to configure the Codex WebSocket pong timeout used to detect unresponsive connections
|
||||
- Added `PI_CODEX_WEBSOCKET_MESSAGE_QUEUE_CAPACITY` to configure the maximum buffered Codex WebSocket inbound queue size before transport fallback
|
||||
- Added `parseStreamingJsonThrottled` to `@oh-my-pi/pi-ai/utils/json-parse` — a per-delta wrapper around `parseStreamingJson` that skips re-parses until the buffer has grown by `minGrowthBytes` (default 256). Wired into the streaming hot path of every provider's tool-call argument accumulator (`anthropic`, `amazon-bedrock`, `openai-completions`, `openai-codex-responses`, `openai-responses-shared`) so per-delta cost is O(N) in total buffer length instead of O(N²). Each provider's `toolcall_end` still runs a final unthrottled parse, so the published `block.arguments` is unchanged.
|
||||
- Added named-tool routing support to Google providers: `GoogleSharedStreamOptions.toolChoice` and `GoogleGeminiCliOptions.toolChoice` now accept `{ mode: "ANY"; allowedFunctionNames: [string, ...string[]] }` in addition to the string forms. `mapGoogleToolChoice` converts `ToolChoice` objects of shape `{ type: "tool" | "function", name }` to the wire form. Mirrors the equivalent Anthropic mapper.
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved Codex WebSocket timeout diagnostics to include last event type and time since last progress event
|
||||
- Enhanced Codex WebSocket error classification to recognize ping, pong, send, and queue-overflow failures as retryable
|
||||
- Changed `mapGoogleToolChoice` to be exported from `@oh-my-pi/pi-ai/stream` so callers can build the wire-shape allow-list directly without re-deriving it.
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -175,21 +175,10 @@
|
||||
- Fixed Codex WebSocket pong timeout detection by tracking pong events and failing the connection when no pong is received within the configured timeout
|
||||
- Fixed Anthropic streaming to suppress hallucinated meta-prompt thinking blocks (the recent "I don't see any current rewritten thinking..." regression). When the marker phrase `rewritten thinking` appears in a streamed thinking summary the block is collapsed to a plain `Thinking...` placeholder and its signature is dropped so subsequent turns can't re-anchor on the garbled chain.
|
||||
- Fixed Codex WebSocket silent stalls by adding protocol pings, inbound queue bounding, clearer idle-timeout diagnostics, and SDK retry clamping for first-event timeouts.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Synthetic model discovery to treat the provider `/models` response as authoritative so deprecated bundled IDs are pruned from the runtime cache, and changed Synthetic login validation to avoid probing a specific model ([#1417](https://github.com/can1357/oh-my-pi/issues/1417)).
|
||||
|
||||
### Added
|
||||
|
||||
- Added `parseStreamingJsonThrottled` to `@oh-my-pi/pi-ai/utils/json-parse` — a per-delta wrapper around `parseStreamingJson` that skips re-parses until the buffer has grown by `minGrowthBytes` (default 256). Wired into the streaming hot path of every provider's tool-call argument accumulator (`anthropic`, `amazon-bedrock`, `openai-completions`, `openai-codex-responses`, `openai-responses-shared`) so per-delta cost is O(N) in total buffer length instead of O(N²). Each provider's `toolcall_end` still runs a final unthrottled parse, so the published `block.arguments` is unchanged.
|
||||
- Added named-tool routing support to Google providers: `GoogleSharedStreamOptions.toolChoice` and `GoogleGeminiCliOptions.toolChoice` now accept `{ mode: "ANY"; allowedFunctionNames: [string, ...string[]] }` in addition to the string forms. `mapGoogleToolChoice` converts `ToolChoice` objects of shape `{ type: "tool" | "function", name }` to the wire form. Mirrors the equivalent Anthropic mapper.
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed `mapGoogleToolChoice` to be exported from `@oh-my-pi/pi-ai/stream` so callers can build the wire-shape allow-list directly without re-deriving it.
|
||||
|
||||
## [15.5.0] - 2026-05-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added `zhipu-coding-plan` provider for Zhipu (智谱) BigModel's domestic coding-plan SKU at `https://open.bigmodel.cn/api/coding/paas/v4`, with dynamic model discovery (`ZHIPU_API_KEY`), zai-format thinking, `reasoning_content` field, and OAuth login flow ([#1340](https://github.com/can1357/oh-my-pi/issues/1340)).
|
||||
@@ -217,6 +206,7 @@
|
||||
- Fixed OpenCode Zen `big-pickle` follow-up requests replaying assistant tool-call turns without DeepSeek-required `reasoning_content`, which caused HTTP 400 errors in thinking mode.
|
||||
|
||||
## [15.4.1] - 2026-05-26
|
||||
|
||||
### Added
|
||||
|
||||
- Added `isOpenAICompletionsProgressChunk` export to identify real progress chunks vs. keepalives in OpenAI completions streams
|
||||
@@ -250,6 +240,7 @@
|
||||
- Fixed z.ai/GLM-via-OpenRouter subagent stalls where no-op keepalive chunks reset the idle watchdog indefinitely by filtering non-progress items before resetting the deadline
|
||||
|
||||
## [15.4.0] - 2026-05-26
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `findAnthropicAuth` from `anthropic-auth` and replaced store-driven auth discovery with `buildAnthropicAuthConfig`, requiring callers to provide an already-resolved API key before building Anthropic auth config
|
||||
@@ -286,6 +277,7 @@
|
||||
- Fixed `pi-ai login moonshot` failing with `invalid temperature: only 1 is allowed for this model` (HTTP 400) because the API-key validator probed `kimi-k2.5` with `temperature: 0`. Moonshot login now validates against `GET /v1/models`, matching the DeepSeek/Fireworks/NanoGPT/ZenMux pattern and authenticating the key without invoking model-specific parameter restrictions.
|
||||
|
||||
## [15.3.2] - 2026-05-25
|
||||
|
||||
### Added
|
||||
|
||||
- Added `GET /v1/snapshot/stream` for live auth-broker snapshot updates via SSE with `snapshot`, `entry`, and `removed` event frames
|
||||
@@ -342,6 +334,7 @@
|
||||
- Fixed `/btw` (and IRC background replies) returning a `BedrockException` 400 (`The toolConfig field must be defined when using toolUse and toolResult content blocks.`) on LiteLLM → Bedrock once the session has tool-call history. Two source fixes in `buildParams`: (1) `if (context.tools)` → `if (context.tools?.length)` so an explicit `context.tools = []` (the /btw opt-out) never routes through `convertTools` and never emits an empty `"tools"` array; (2) `else if (hasToolHistory(...))` → `else if (context.tools === undefined && hasToolHistory(...))` so the Anthropic-proxy sentinel that injects `tools: []` for tool-history turns is suppressed when the caller explicitly opted out, preventing it from re-introducing the empty array. As defence-in-depth, `tool_choice: "none"` is also dropped when the resolved tools list is missing or empty. ([#1227](https://github.com/can1357/oh-my-pi/issues/1227))
|
||||
|
||||
## [15.1.8] - 2026-05-20
|
||||
|
||||
### Added
|
||||
|
||||
- Added Fireworks Fire Pass as a separate `firepass` provider with API-key login flow, bundled `kimi-k2.6-turbo` model entry (Kimi K2.6 Turbo), and wire-id translation from the friendly catalog id to the `accounts/fireworks/routers/kimi-k2p6-turbo` router endpoint. Fire Pass keys (`fpk_…`) authorize only the dedicated router and reject `/v1/models`, so login validation pings chat completions against the router id directly. Extended the openai-completions Kimi-family safety net so the firepass entry inherits the per-Fireworks-docs "always send `max_tokens`" default ([Kimi K2 guide](https://docs.fireworks.ai/models/kimi-k2)); the router's accepted `reasoning_effort` set includes `xhigh`, so it is forwarded verbatim rather than remapped. See https://docs.fireworks.ai/firepass.
|
||||
@@ -353,6 +346,7 @@
|
||||
- Fixed Perplexity OAuth credentials being treated as expired one hour after login. `getJwtExpiry` was fabricating `expires = now + 1h` whenever the JWT had no `exp` claim (the common case — Perplexity sessions are server-side). Once the hour elapsed, `getOAuthApiKey` would mark the cred expired and the search provider's loader would silently skip it, surfacing as "logged out". Logins with no `exp` now persist a far-future sentinel; `getOAuthApiKey` also normalizes any stale `expires` written by older builds.
|
||||
|
||||
## [15.1.7] - 2026-05-19
|
||||
|
||||
### Added
|
||||
|
||||
- Added Anthropic realization of `serviceTier: "priority"`. The anthropic-messages provider now sets `speed: "fast"` on the request and appends the `fast-mode-2026-02-01` beta to `Anthropic-Beta` whenever the caller passes `serviceTier: "priority"`. When the server rejects an unsupported model with `invalid_request_error`, the provider transparently retries the same turn without the fast-mode signal (mirroring the strict-tools fallback pattern), persists the disable via a new `providerSessionState.fastModeDisabled` flag so subsequent requests in the session skip the field, and surfaces the action via the new `AssistantMessage.disabledFeatures` array (id `"priority"`) so callers can sync user-facing toggles. A new `clearAnthropicFastModeFallback(providerSessionState)` helper lets callers re-arm priority after the auto-fallback fired.
|
||||
@@ -371,6 +365,7 @@
|
||||
- Fixed `pi-ai login <provider>` crashing with `Unknown provider` for providers that only the `auth-storage` `login()` switch knew about (perplexity, alibaba-coding-plan, gitlab-duo, huggingface, opencode-zen/go, lm-studio, ollama, cerebras, fireworks, qianfan, synthetic, venice, litellm, moonshot, together, cloudflare/vercel ai gateways, vllm, qwen-portal, nvidia, xiaomi, and any custom OAuth provider). The CLI now delegates to `SqliteAuthCredentialStore.login()` instead of duplicating a smaller switch, so the auth-broker `omp auth-broker login <provider>` flow works for every registered OAuth provider.
|
||||
|
||||
## [15.1.4] - 2026-05-19
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated auth-gateway format and pi-native request handling to invalidate the failed API key and retry the provider request with a replacement key when authentication fails
|
||||
@@ -384,6 +379,7 @@
|
||||
- Added `credential_process` support to the Bedrock provider's AWS credential resolver so profiles delegating to external brokers (`aws-vault`, `granted`, in-house tools) resolve instead of falling through to `Unable to resolve AWS credentials`. Parses the AWS SDK `Version: 1` JSON envelope, honors `Expiration` in the per-profile cache, propagates `AbortSignal` to the spawned helper, routes Windows `.cmd`/`.bat` helpers through `cmd.exe /c`, and ships a POSIX-shell-style tokenizer that preserves backslashes inside double quotes so Windows paths survive ([#1142](https://github.com/can1357/oh-my-pi/issues/1142))
|
||||
|
||||
## [15.1.3] - 2026-05-17
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `AuthBrokerClient.fetchSnapshot()` to return status-based results (`200` or `304`) instead of always returning a raw snapshot body, so callers now need to branch on `status`
|
||||
@@ -469,6 +465,7 @@
|
||||
- Hardened auth-gateway bearer-token checks with constant-time comparison to avoid timing-side-channel leaks
|
||||
|
||||
## [15.1.2] - 2026-05-15
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Rejected draft-07 tuple and dependency keywords (`items` arrays, `dependencies`, `additionalItems`) in JSON Schema validation
|
||||
@@ -537,12 +534,14 @@
|
||||
- Fixed mock provider auto-generated tool-call IDs to use a per-instance counter (now reset by `reset()`), so test order no longer affects IDs across `createMockModel()` instances
|
||||
|
||||
## [15.0.2] - 2026-05-15
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed `StreamOptions.fetch` typing to accept fetch-compatible override functions that do not expose `preconnect`, allowing custom fetch implementations to be used without type errors across runtimes
|
||||
- Fixed Moonshot Kimi K2.6 forced tool calls to send `thinking: { type: "disabled" }`, avoiding `tool_choice 'specified' is incompatible with thinking enabled` 400s while preserving the requested named tool ([#1077](https://github.com/can1357/oh-my-pi/issues/1077)).
|
||||
|
||||
## [15.0.1] - 2026-05-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Increased the minimum Bun runtime version to `>=1.3.14` for the `@aws-?` package
|
||||
@@ -562,22 +561,22 @@
|
||||
|
||||
- Fixed OAuth credentials being silently disabled when two omp processes (or any two `AuthStorage` instances sharing a `agent.db`) race on token refresh. Anthropic rotates refresh tokens on every use, so the loser's `invalid_grant` response previously soft-deleted the row that the winner just rotated, forcing the user to `/login` again. `#tryOAuthCredential` now re-reads the row from disk before declaring a definitive failure: if the persisted `refresh` differs from the snapshot it tried, the peer-rotated credential is reloaded and the request retries against the fresh token instead of disabling the live row.
|
||||
- Closed a remaining race window in OAuth refresh-failure handling: between re-reading the credential row to check for peer rotation and the subsequent soft-delete, another process could still complete a refresh and rotate the row, leaving us to disable the freshly-rotated credential by `id`. The disable now runs as a single CAS update conditioned on the row's `data` still matching the snapshot we tried to refresh, and on `disabled_cause IS NULL`. If the CAS reports 0 rows changed (peer rotation, or row already disabled by a concurrent failure on the same snapshot), we reload from disk and retry instead of mutating the wrong row or emitting a spurious `credential_disabled` event.
|
||||
### Changed
|
||||
- Lowered the default steady-state stream idle timeout from 120s to 30s while preserving the existing environment overrides.
|
||||
|
||||
### Fixed
|
||||
- Lazy built-in provider streams now enforce the shared idle watchdog and abort stalled provider requests, so session auto-retry can continue after transient network drops instead of remaining stuck. Caller aborts still terminate as aborted.
|
||||
|
||||
### Changed
|
||||
|
||||
- Lowered the default steady-state stream idle timeout from 120s to 30s while preserving the existing environment overrides.
|
||||
|
||||
## [14.9.3] - 2026-05-10
|
||||
|
||||
### Fixed
|
||||
|
||||
- Anthropic provider now retries generic transient connect failures (`unable to connect`, `fetch failed`, `connection error`, etc.) by falling back to the shared `isRetryableError` allowlist after the provider-specific patterns. Previously these errors bypassed the hand-curated regex in `isProviderRetryableError` and aborted the stream on the first attempt, while the OpenAI SDK and Codex `fetchWithRetry` paths already handled them.
|
||||
|
||||
## [14.9.0] - 2026-05-10
|
||||
|
||||
### Added
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed silent forwarding of image content (for example Python plot output rendered in the terminal) to models without vision support, which produced opaque 404 errors from upstream. Image blocks are now stripped and replaced with a `[image omitted: model does not support vision]` placeholder for non-vision models, including tool-result payloads ([#967](https://github.com/can1357/oh-my-pi/issues/967), [#968](https://github.com/can1357/oh-my-pi/issues/968)).
|
||||
|
||||
- Added `AuthStorage` `onCredentialDisabled` callback (sync or async) so embedders can react when a credential is automatically disabled (e.g. OAuth refresh fails with `invalid_grant`) — useful for surfacing a banner or auto-launching a re-login flow instead of letting the credential silently disappear. Sync throws and async rejections are both caught and logged so a misbehaving subscriber cannot break the disable path.
|
||||
@@ -594,6 +593,7 @@
|
||||
## [14.8.0] - 2026-05-09
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Gemini 3 Pro thinking metadata so `medium` effort is rejected with the expected error instead of being silently accepted: `ThinkingConfig` now carries an optional explicit `levels` list that survives `expandEffortRange`, letting non-contiguous supported sets (e.g. `[low, high]`) round-trip through enrichment.
|
||||
- Fixed Kimi Code OAuth expiry handling to refresh access tokens 5 minutes before server expiry, avoiding daily 401s from using tokens right up to the cutoff.
|
||||
- Fixed OpenAI Responses custom tool replay to preserve custom tool call item IDs with the `ctc_` prefix instead of rewriting them as `fc_` function-call IDs ([#977](https://github.com/can1357/oh-my-pi/issues/977)).
|
||||
@@ -607,6 +607,7 @@
|
||||
### Changed
|
||||
|
||||
- Changed OpenAI Responses, Azure OpenAI Responses, and OpenAI Codex providers to omit `reasoning.summary` from requests when `reasoningSummary` is explicitly `null` (previously fell back to `"auto"`).
|
||||
|
||||
## [14.7.5] - 2026-05-07
|
||||
|
||||
### Added
|
||||
@@ -626,6 +627,7 @@
|
||||
- Fixed local Ollama model discovery to apply `/api/show` thinking and vision capabilities in addition to native context windows ([#928](https://github.com/can1357/oh-my-pi/issues/928)).
|
||||
|
||||
## [14.7.0] - 2026-05-04
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `Context.systemPrompt` from a string to `string[]`, so callers must now pass an array of prompts instead of a single string
|
||||
@@ -657,6 +659,7 @@
|
||||
- Fixed OpenAI Codex websocket continuations to retry with full context when `previous_response_id` expires server-side instead of surfacing `previous_response_not_found`.
|
||||
|
||||
## [14.6.2] - 2026-05-03
|
||||
|
||||
### Added
|
||||
|
||||
- Added `EventStream.fail(err)` method to terminate the async iterator with an error, enabling consumers to catch stream-level failures via `for await` without hanging
|
||||
@@ -694,6 +697,7 @@
|
||||
- Fixed OpenAI Codex websocket append reuse after `response.completed` terminal events.
|
||||
|
||||
## [14.5.14] - 2026-05-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added package-level `google-gemini-headers` exports (`getGeminiCliHeaders`, `getGeminiCliUserAgent`, `getAntigravityHeaders`, `extractRetryDelay`, and `ANTIGRAVITY_SYSTEM_INSTRUCTION`) for header and retry handling reuse without importing full Google providers
|
||||
@@ -953,6 +957,7 @@
|
||||
- Added `thinkingSignature` field to thinking content blocks to preserve the original reasoning field name (e.g., `reasoning_text`, `reasoning_content`) for accurate follow-up requests
|
||||
- Added first-event timeout detection for streaming responses to abort stuck requests before user-visible content arrives
|
||||
- Added `PI_STREAM_FIRST_EVENT_TIMEOUT_MS` environment variable to configure first-event timeout (defaults to 15 seconds or idle timeout, whichever is lower)
|
||||
- Added Vercel AI Gateway to `/login` providers for interactive API key setup
|
||||
|
||||
### Changed
|
||||
|
||||
@@ -962,13 +967,6 @@
|
||||
|
||||
- Fixed Anthropic stream timeout errors to be properly retried by recognizing first-event timeout messages
|
||||
- Fixed stream stall detection to distinguish between first-event timeouts and idle timeouts, enabling faster recovery for stuck connections
|
||||
|
||||
### Added
|
||||
|
||||
- Added Vercel AI Gateway to `/login` providers for interactive API key setup
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed `omp commit` failing with HTTP 400 errors when using reasoning-enabled models on OpenAI-compatible endpoints that don't support the `developer` role (e.g., GitHub Copilot, custom proxies). Now falls back to `system` role when `developer` is unsupported.
|
||||
|
||||
## [13.17.0] - 2026-03-30
|
||||
@@ -2858,19 +2856,16 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
|
||||
### Added
|
||||
|
||||
- **`agentLoopContinue` function**: Continue an agent loop from existing context without adding a new user message. Validates that the last message is `user` or `toolResult`. Useful for retry after context overflow or resuming from manually-added tool results.
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed provider-level tool argument validation. Validation now happens in `agentLoop` via `executeToolCalls`, allowing models to retry on validation errors. For manual tool execution, use `validateToolCall(tools, toolCall)` or `validateToolArguments(tool, toolCall)`.
|
||||
|
||||
### Added
|
||||
|
||||
- Added `validateToolCall(tools, toolCall)` helper that finds the tool by name and validates arguments.
|
||||
|
||||
- **OpenAI compatibility overrides**: Added `compat` field to `Model` for `openai-completions` API, allowing explicit configuration of provider quirks (`supportsStore`, `supportsDeveloperRole`, `supportsReasoningEffort`, `maxTokensField`). Falls back to URL-based detection if not set. Useful for LiteLLM, custom proxies, and other non-standard endpoints. ([#133](https://github.com/badlogic/pi-mono/issues/133), thanks @fink-andreas for the initial idea and PR)
|
||||
|
||||
- **xhigh reasoning level**: Added `xhigh` to `ReasoningEffort` type for OpenAI codex-max models. For non-OpenAI providers (Anthropic, Google), `xhigh` is automatically mapped to `high`. ([#143](https://github.com/badlogic/pi-mono/issues/143))
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed provider-level tool argument validation. Validation now happens in `agentLoop` via `executeToolCalls`, allowing models to retry on validation errors. For manual tool execution, use `validateToolCall(tools, toolCall)` or `validateToolArguments(tool, toolCall)`.
|
||||
|
||||
### Changed
|
||||
|
||||
- **Updated SDK versions**: OpenAI SDK 5.21.0 → 6.10.0, Anthropic SDK 0.61.0 → 0.71.2, Google GenAI SDK 1.30.0 → 1.31.0
|
||||
@@ -2899,4 +2894,4 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
|
||||
|
||||
## [0.9.4] - 2025-11-26
|
||||
|
||||
Initial release with multi-provider LLM support.
|
||||
Initial release with multi-provider LLM support.
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## [Unreleased]
|
||||
### Changed
|
||||
|
||||
- Changed Anthropic API request metadata `user_id.device_id` to be derived from the persistent install ID so it remains stable across Anthropic account changes on the same install
|
||||
|
||||
### Added
|
||||
|
||||
@@ -12,10 +9,12 @@
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed Anthropic API request metadata `user_id.device_id` to be derived from the persistent install ID so it remains stable across Anthropic account changes on the same install
|
||||
- Changed the eval `parallel()` / `pipeline()` helpers to drop their `concurrency` argument and run as wide as a `task` tool batch. The worker-pool ceiling now tracks the `task.maxConcurrency` setting (default 32; `0` = run every item at once) resolved live from the host via a new `__concurrency__` bridge, instead of the old per-call `concurrency` option that defaulted to 4 and capped at 16. This stops eval fan-outs from under-using the parallelism the session is configured for.
|
||||
- Changed subagent / `agent://` output ids from a numeric prefix scheme (`0-Anna`, `1-Bob`, nested `0-Anna.1-Bob`) to a name-first scheme: the requested name is used verbatim and a `-2`/`-3`/… suffix is added only when the same name recurs within a session (`Anna`, `Anna-2`, `Anna-3`). Nested ids stay grouped under the parent (`Anna.Bob`) and the live task widget renders them as `Anna>Bob`. The main agent's IRC id is now `Main` (was `0-Main`). `AgentOutputManager` still scans existing `.md` outputs on resume so it never reuses a name that would clobber a prior output.
|
||||
- Changed resuming a session that belongs to a different project to switch the process into that project's working directory. `pi --resume` and the in-session `/resume` picker now `chdir` into the resumed session's `cwd` and re-scope every cwd-derived input — project dir, **project settings** (`.claude/settings.yml`, `.omp/settings.json`, path-scoped `enabledModels`/`disabledProviders`), plugin roots, capabilities, slash commands, and the ssh tool — so tools, discovery, configuration, and commands all follow the resumed project. The `SessionManager` adopts the resumed session's own `cwd`/session directory on load (rolled back if the switch fails).
|
||||
- Documented `ANTHROPIC_SEARCH_API_KEY` and `ANTHROPIC_SEARCH_BASE_URL` more thoroughly in `docs/environment-variables.md`, surfaced them in `docs/tools/web_search.md`'s Anthropic provider section, and added `ANTHROPIC_SEARCH_BASE_URL` to `omp --help`'s env-var summary so the search-only overrides are discoverable alongside `ANTHROPIC_SEARCH_API_KEY` ([#1694](https://github.com/can1357/oh-my-pi/issues/1694)).
|
||||
- Migrated the Kagi web search provider to Kagi's V1 Search API (`POST /api/v1/search`), replacing the sunset V0 endpoint while keeping the `kagi` provider id, `KAGI_API_KEY` credential, and `/login kagi` flow unchanged ([#1272](https://github.com/can1357/oh-my-pi/pull/1272) by [@thismat](https://github.com/thismat))
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -33,14 +32,16 @@
|
||||
- Fixed `omp update` failing with `No version matching "X" found for specifier "@oh-my-pi/pi-coding-agent" (but package exists)` when bun saw an older catalog than the update check did. The version is resolved by querying `https://registry.npmjs.org/` directly, but `bun install -g` would then consult its on-disk manifest snapshot or a configured npm mirror (corporate proxy, Taobao, …) that hadn't replicated the release. The bun install step now runs with `--no-cache --registry=https://registry.npmjs.org/` so it hits exactly the registry the version check used ([#1686](https://github.com/can1357/oh-my-pi/issues/1686)).
|
||||
- Fixed ACP mode resetting configured async/background job settings to disabled RPC defaults, so explicit ACP background-job opt-ins are preserved during startup ([#1324](https://github.com/can1357/oh-my-pi/issues/1324)).
|
||||
- Fixed legacy Pi extensions loading their `__dirname`-relative assets as empty — e.g. `@plannotator/pi-extension` reading `plannotator.html`/`review-editor.html` via `readFileSync(join(__dirname, …))`, which left `planHtmlContent` empty and dropped the plugin into its "no UI support" auto-approve path. The compat layer previously mirrored every extension module into a flat temp directory, so `import.meta.url` (and thus `__dirname`) pointed at the mirror root and sibling asset reads `ENOENT`ed. Extensions now load in place from their real on-disk location — `import.meta.url` is the real source file, so asset reads resolve exactly as under the original Pi runtime. A `Bun.plugin()` `onLoad` hook scoped to the entry's relative-import graph (the exact set of source modules, never the host, other extensions, `node_modules` deps, or unrelated project files) rewrites only the legacy `@(scope)/pi-*` and `@sinclair/typebox` imports; relative siblings, the extension's own `node_modules` deps, and bundled assets all resolve natively, with no temp-directory mirroring and no asset copying ([#1674](https://github.com/can1357/oh-my-pi/issues/1674)).
|
||||
- Fixed plan approval keep-context usage to use the execution model context window, avoid zero-usage aborted turns, and disable keeping context when preserved context exceeds 95%.
|
||||
|
||||
## [15.7.6] - 2026-06-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added `ask` option descriptions so agents can keep short labels and render explanatory text as separate muted rows in the selector.
|
||||
- Added an extension API for rendering supplemental UI below visible assistant thinking blocks.
|
||||
- Added default-on `lsp.diagnosticsDeduplicate` support so post-edit LSP diagnostics already shown for a file are suppressed within the session and only new or changed diagnostics are surfaced.
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed a single ESC press both dismissing the @/slash autocomplete popup and aborting the running agent operation. ESC now drains the popup first; only when no popup is visible does it route to the global interrupt handler (matching the standard TUI/IDE pattern). The `shouldBypassAutocompleteOnEscape` editor hook is removed — it had become the trigger for this bug ([#1655](https://github.com/can1357/oh-my-pi/issues/1655)).
|
||||
@@ -60,10 +61,6 @@
|
||||
- Fixed unbounded MCP reconnect loop that could fork-bomb the host when a stdio MCP server completes the `initialize`/`tools/list` handshake and then exits. `MCPManager` now enforces a per-server crash circuit breaker (5 reconnects per 30 s window) on the automatic `transport.onClose` path; manual `/mcp reconnect` resets the window so users can recover after fixing the misconfiguration ([#1592](https://github.com/can1357/oh-my-pi/issues/1592)).
|
||||
- Fixed auto context maintenance to include the pending prompt in the pre-send token estimate, so large user turns compact history before the provider rejects an over-limit request ([#1618](https://github.com/can1357/oh-my-pi/issues/1618)).
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed plan approval keep-context usage to use the execution model context window, avoid zero-usage aborted turns, and disable keeping context when preserved context exceeds 95%.
|
||||
|
||||
## [15.7.4] - 2026-05-31
|
||||
|
||||
### Removed
|
||||
@@ -125,6 +122,7 @@
|
||||
- Fixed duplicated/stale scrollback above a streaming tool result on POSIX terminals (macOS/Linux). A tool whose output grows and re-lays-out (e.g. an edit diff gaining hunks) re-renders rows that already scrolled into native scrollback; the unknown-viewport anti-yank deferral left the old copy in place while the new one rendered below, showing the block twice. The event controller now enables the TUI's eager native-scrollback rebuild while a foreground tool is executing (`setEagerNativeScrollbackRebuild`), so those offscreen re-renders rebuild history cleanly — a snap to the tail is acceptable mid-tool. Background-running tools and plain assistant-text streaming keep the no-yank deferral; the mode resets at each turn start.
|
||||
|
||||
## [15.7.2] - 2026-05-31
|
||||
|
||||
### Added
|
||||
|
||||
- Added `providers.autoThinkingModel` setting so users can choose the `auto` thinking classifier backend (online smol or local tiny-memory model)
|
||||
@@ -230,6 +228,7 @@
|
||||
- Removed the sticky Todos panel all-done drop/collapse animation; completed todo state now stays visible until the next explicit todo update changes it.
|
||||
|
||||
## [15.5.15] - 2026-05-30
|
||||
|
||||
### Changed
|
||||
|
||||
- Enabled the agent loop's tool-call batch cap for Anthropic Claude sessions, cutting oversized streamed tool-use bursts into runnable batches before continuing the conversation.
|
||||
@@ -243,6 +242,7 @@
|
||||
- Fixed Anthropic Claude tool-call batching to clear and reapply the Claude-specific batch cap whenever the session model changes
|
||||
|
||||
## [15.5.14] - 2026-05-29
|
||||
|
||||
### Added
|
||||
|
||||
- Added progress status output for `llm()` calls in `eval`, including the resolved model, tier, and returned character count
|
||||
@@ -261,6 +261,7 @@
|
||||
- Reverted the sticky `Todos` panel task glyphs to the pre-15.5.12 checkbox icons: completed tasks render `theme.checkbox.checked` (not `theme.status.success`) and in-progress tasks render `theme.checkbox.unchecked` (not the running glyph). Removed the animated spinner entirely — in-progress tasks and pending tasks with a matching in-flight subagent still highlight via the `accent` colour, but the panel now paints once per state change instead of on an 80 ms timer. Subagent auto-checkmarking, the advancing window (`selectStickyTodoWindow`), `todoMatchesAnyDescription` highlighting, and the all-done close animation are unchanged.
|
||||
|
||||
## [15.5.13] - 2026-05-29
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed hashline edit syntax to verb-based v4: body-bearing ops are `replace N..M:`, `insert before N:`, `insert after N:`, `insert head:`, and `insert tail:`, while bodyless `delete N..M` handles deletion. Removed `>A..B` repeat rows and the old `prepend:` / `append:` virtual insert headers; `-` rows remain rejected with a teaching error.
|
||||
@@ -369,7 +370,9 @@
|
||||
- Secured `vault://` reads and writes by validating URL paths and blocking traversal, absolute paths, and symlink escapes outside the selected vault root
|
||||
|
||||
## [15.5.7] - 2026-05-27
|
||||
|
||||
### Added
|
||||
|
||||
- `providers.openrouterVariant` setting (Settings → Providers → "OpenRouter Routing") to default OpenRouter requests to a routing-variant suffix (`:nitro`, `:floor`, `:online`, `:exacto`). Selectors that already name a variant (e.g. `openrouter/anthropic/claude-haiku:nitro`) keep precedence.
|
||||
|
||||
- `generate_image` supports xAI Grok Imagine via `providers.image=xai`. Supports `grok-imagine-image` (default) and `grok-imagine-image-quality` at aspect ratios `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3`. Uses the xAI Grok OAuth credential when available, otherwise `XAI_API_KEY`.
|
||||
@@ -381,6 +384,7 @@
|
||||
- Fixed `read` URL reader mode aborting after a stalled Jina request instead of falling back to trafilatura/lynx/native: Jina (and Parallel extract) now have their own per-attempt sub-budget capped at 10s, the catch handler honours only real user cancellation, and the in-process native renderer is always attempted on already-loaded HTML ([#1449](https://github.com/can1357/oh-my-pi/issues/1449))
|
||||
|
||||
## [15.5.6] - 2026-05-27
|
||||
|
||||
### Added
|
||||
|
||||
- Support for multi-range line selectors on URLs (e.g., `:5-10,20-30`) to fetch and display multiple non-contiguous sections
|
||||
@@ -440,6 +444,7 @@
|
||||
- Fixed hashline session-chain replay silently overwriting in-session edits when the model re-targeted a previously rewritten line with a stale file hash; replay now refuses unless every edit's anchor line content matches between the snapshot and the current file ([#1422](https://github.com/can1357/oh-my-pi/pull/1422))
|
||||
|
||||
## [15.5.3] - 2026-05-27
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Disallowed inline payload on hashline `↑`, `↓`, and `:` operations (including BOF/EOF inserts), requiring payload text to be supplied on standalone `+` continuation rows
|
||||
@@ -453,6 +458,7 @@
|
||||
- Fixed runtime model registry refresh and cache loading so providers with authoritative dynamic catalogs, including Synthetic, do not re-add deprecated bundled model IDs after discovery ([#1417](https://github.com/can1357/oh-my-pi/issues/1417)).
|
||||
|
||||
## [15.5.2] - 2026-05-26
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed the hashline patch format so payload continuation lines now require a leading `+`, rejecting unprefixed multiline payload rows that were previously accepted as fallback payload text
|
||||
@@ -517,10 +523,12 @@
|
||||
## [15.4.1] - 2026-05-26
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- The `vim` edit mode option is no longer available; configurations using `edit.mode: vim` will be automatically mapped to `hashline` mode
|
||||
- Hashline payload semantics are now strictly inline-first: the first payload line is whatever follows the sigil on the op line itself, and subsequent lines append after it. A newline immediately after `↑`/`↓`/`:` is no longer a free separator — it produces a blank first payload line. Use `LINE↓content` for a one-line insert, `LINE↓firstline\nsecondline` for two lines; bare `LINE↓` / `LINE↑` / `LINE:` (no inline payload) still insert/replace with one blank line as before.
|
||||
|
||||
### Added
|
||||
|
||||
- Added `irc.timeoutMs` setting to configure IRC message timeout duration with a default of 120 seconds
|
||||
- Added timeout enforcement for IRC send operations to prevent indefinite hangs when recipients are unresponsive
|
||||
- Added evaluator state inheritance for `task`-spawned subagents so JavaScript and Python variables are visible between a parent agent and its child sessions
|
||||
@@ -568,6 +576,7 @@
|
||||
- Updated `MCPOAuthFlow.#resolveRegistrationEndpoint` to try origin-root well-known first, then fall back to path-prefixed well-known ([1407](https://github.com/can1357/oh-my-pi/pull/1407) by [@faizhasim](https://github.com/faizhasim))
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed the `installH2Fetch()` activation from CLI startup; HTTPS fetches now use Bun's default transport
|
||||
- Removed the `vim` edit mode along with the `VimTool` module, prompt, and supporting buffer/engine/renderer stack
|
||||
- Removed per-line hash anchors (2-letter bigram hashes) from hashline format
|
||||
@@ -587,6 +596,7 @@
|
||||
- Fixed JavaScript `eval` imports to preserve module-level singletons across re-imports of unchanged local files and reload them only after edits
|
||||
- Fixed concurrent Python evaluator tool calls to use per-run identifiers so tool responses and output are routed to the correct execution
|
||||
- Fixed the `search` tool argument validation to accept a single string `paths` value as a one-path search.
|
||||
|
||||
## [15.4.0] - 2026-05-26
|
||||
|
||||
### Breaking Changes
|
||||
@@ -616,7 +626,6 @@
|
||||
- Updated hashline anchor parsing so copied `|TEXT` decorations remain cosmetic and payload must be provided on or after the operator
|
||||
- Unified subagent output-schema validation into a single shared module (`tools/output-schema-validator.ts`) used by both the in-process `yield` tool (validates before the subagent yields) and the executor's post-mortem `finalizeSubprocessOutput` path (validates after subprocess exit). Previously each side ran its own `normalizeSchema` → `jtdToJsonSchema` → `validateJsonSchemaValue` chain in parallel, which was semantically equivalent but invited drift: a future tweak on one side could silently disagree with the other and cause yields that pass in-tool to fail post-mortem (or vice versa). The unification preserves both call sites' existing behavior (yield throws an actionable per-issue error for the model; executor produces a `schema_violation` outcome with the first issue and missing-required fields) by exposing two output formatters (`formatAllValidationIssues` for retries, `formatValidationIssueHeadline` for headlines).
|
||||
- Changed web search provider credential lookup to use the shared `AuthStorage` pipeline (`getApiKey`/`getOAuthAccess`) for API-key and OAuth auth instead of direct `AgentStorage` access
|
||||
- Migrated the Kagi web search provider to Kagi's V1 Search API (`POST /api/v1/search`), replacing the sunset V0 endpoint while keeping the `kagi` provider id, `KAGI_API_KEY` credential, and `/login kagi` flow unchanged ([#1272](https://github.com/can1357/oh-my-pi/pull/1272) by [@thismat](https://github.com/thismat))
|
||||
- Changed the `codex` web search provider display label from `Codex` to `OpenAI`
|
||||
- Updated `anthropic` and `openai`/`gemini` web search option descriptions to reflect their native `web_search`/OAuth requirements
|
||||
|
||||
@@ -652,6 +661,7 @@
|
||||
- Added `tools.approvalMode` global setting (Interaction tab in `/settings`) with values `auto` | `prompt` | `custom`. Defaults to `auto` so the agent runs every tool call without interruption — matching the `--auto-approve` / `--yolo` CLI flag. `prompt` uses built-in per-tool defaults only (read/find/search auto-allow; bash/edit/write/eval/ssh require confirmation; `tools.approval.<tool>` config is ignored). `custom` makes the `tools.approval.<tool>` config the source of truth — your settings win over built-in defaults, which fall back only for tools you haven't configured. CLI `--auto-approve` always wins. Critical safety patterns (e.g. `rm -rf /`, `curl … | bash`, fork bombs) keep prompting even when the tool is user-allowed.
|
||||
|
||||
## [15.3.2] - 2026-05-25
|
||||
|
||||
### Added
|
||||
|
||||
- Added inline `|TEXT` payload support to `»` and `«` hashline insert operations, allowing single-line inserts on the op line and still supporting additional payload lines
|
||||
@@ -679,8 +689,11 @@
|
||||
- Fixed append-only context mode not being recomputed after model switches — the mode was frozen at session construction time using the initial model's provider, so `provider.appendOnlyContext=auto` left append-only enabled after switching away from DeepSeek (or disabled after switching to DeepSeek) for the rest of the session
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed clipboard image paste (Ctrl+V) silently failing on WSL2 by routing image reads through a `powershell.exe` bridge when WSL interop is detected, since `arboard` returns `ContentNotAvailable` under WSLg ([#1280](https://github.com/can1357/oh-my-pi/issues/1280))
|
||||
|
||||
## [15.2.4] - 2026-05-22
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Replaced the legacy `@@` header and `+`/`<`/`=`/`-` hashline syntax with the new `§PATH` header and `«`/`»`/`≔` operation format, so existing hashline scripts and prompts using old symbols must be updated
|
||||
@@ -702,6 +715,7 @@
|
||||
- Fixed hashline payload handling in parser and streaming preview to preserve blank lines as actual payload text until the next op, file header, or envelope marker
|
||||
|
||||
## [15.2.3] - 2026-05-22
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed PR and task-isolation worktree directory layout to hash-based `~/.omp/wt/<identifier>-<path-hash>` style paths, replacing the previous nested encoded-repo layout
|
||||
@@ -865,6 +879,7 @@
|
||||
- Fixed `.env` loading so malformed variable names and NUL-containing values are ignored before they can poison `Bun.env` and break bash/external process execution with `nul byte found in provided data`.
|
||||
|
||||
## [15.1.2] - 2026-05-15
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed SSH host additions/removals made inside a running session not refreshing the live `ssh` tool. `/ssh add` and `/ssh remove` now update the model-visible host list immediately, while `/reload-plugins` and `/move` refresh SSH discovery for external or project-scope config changes without restart.
|
||||
@@ -877,6 +892,7 @@
|
||||
- Updated MCP and theme schema metadata to reference JSON Schema draft-2020-12
|
||||
|
||||
## [15.1.0] - 2026-05-15
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed the extension and hook runtime API by moving schema typing from direct TypeBox imports to `TSchema` from `@oh-my-pi/pi-ai`, requiring callers who use TypeScript imports of `Type` to migrate via provided injected modules
|
||||
@@ -965,6 +981,7 @@
|
||||
- Fixed `$env:VAR` PowerShell variables being mangled on Windows when commands invoked PowerShell as a subprocess (e.g. `powershell -Command "Write-Host $env:SystemRoot"`). Brush-core applied POSIX parameter expansion to `$env` before spawning the child, leaving a dangling `:NAME`. The fix lives in `pi-shell` at env-var application time: every brush session now defines `env=$env` as an internal shell variable so `$env:NAME` expands to the literal `$env:NAME` token that PowerShell expects. The fallback is not exported, only influences brush's own expansion, and is shadowed by any user assignment to `env` (e.g. `env=prod; echo "$env:8080"` still prints `prod:8080`), so the POSIX bash contract is preserved. ([#1079](https://github.com/can1357/oh-my-pi/issues/1079))
|
||||
|
||||
## [15.0.1] - 2026-05-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed the dedicated `exit_plan_mode` tool and its prompt, requiring plan-mode completion to use the existing `resolve` tool path instead
|
||||
@@ -1007,6 +1024,7 @@
|
||||
- Fixed MCP OAuth refresh failing with `HTTP 401 invalid_client` for servers that require Dynamic Client Registration (RFC 7591) and have no `oauth.clientId` configured (e.g. `mcp.linear.app`). `MCPOAuthFlow` registered a fresh public PKCE client on each authorize and discarded the issued `client_id` once the flow object went out of scope; refresh then called the provider's `/token` endpoint without a `client_id`. The flow now exposes `resolvedClientId` / `registeredClientSecret` getters, `MCPCommandController#handleOAuthFlow` returns them alongside `credentialId`, and both the initial-connect and `/mcp reauth` paths persist them into `auth.{clientId,clientSecret}` (used at refresh) and `oauth.{clientId,clientSecret}` (used by subsequent `/mcp reauth` to skip re-registration). The `MCPAddWizard` `onOAuth` callback type is now `Promise<MCPAddWizardOAuthResult>` and `#launchOAuthFlow` folds the registered credentials into wizard state. Servers with a statically-configured `oauth.clientId` (Notion, Slack, Datadog) are unaffected — `#tryRegisterClient` short-circuits and the write-back is a no-op. ([#1061](https://github.com/can1357/oh-my-pi/pull/1061) by [@ldx](https://github.com/ldx)).
|
||||
|
||||
## [15.0.0] - 2026-05-13
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `op: issue_view` and `op: pr_view` from the `github` tool. Read single issues/PRs via the `read` tool against `issue://<N>` / `pr://<N>` (or the long form `issue://<owner>/<repo>/<N>` / `pr://<owner>/<repo>/<N>`); append `?comments=0` to drop the comments section. The `issue` and `comments` parameters were removed from the tool schema since no remaining op consumes them. Mutating ops (`pr_create`, `pr_checkout`, `pr_push`), `repo_view`, `search_*`, and `run_watch` are unchanged.
|
||||
@@ -1040,6 +1058,7 @@
|
||||
- Aligned prompt instruction language by defining `NEVER` and `AVOID` as strict aliases for `MUST NOT` and `SHOULD NOT` in the system prompt, and standardized agent, tool, and system prompt templates to use those terms consistently
|
||||
- Changed `--mode acp` to apply the same stdout-quiet overrides as `--mode rpc` so no banner or status text leaks into the JSON-RPC channel
|
||||
- Changed ACP startup to no longer require a configured model so registry validators and clients can complete `initialize` and `authenticate` before any model is selected
|
||||
|
||||
### Fixed
|
||||
|
||||
- Deferred flushing of buffered `credential_disabled` events during extension runner initialization to a microtask so handler failures are now routed through `onError()` registrations made immediately after `initialize()`, preserving extension error reporting
|
||||
@@ -1219,6 +1238,7 @@
|
||||
- Fixed `Timed out initializing browser tab worker` on prebuilt binaries by rewriting `spawnTabWorker` to import the worker entry with `with { type: "file" }` so Bun's `--compile` bundler statically discovers and embeds `tab-worker-entry.ts` in the single-file binary ([#1011](https://github.com/can1357/oh-my-pi/issues/1011))
|
||||
|
||||
## [14.9.3] - 2026-05-10
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed the `eval` tool input format to canonical `*** Begin <LANG>` ... `*** End <LANG>` cells with `*** Title`, `*** Timeout`, and `*** Reset` directives, so legacy `===== ... =====` eval inputs are no longer accepted for execution
|
||||
@@ -1264,6 +1284,7 @@
|
||||
- Fixed IRC background exchange poll loop leaking after session disposal: `#scheduleBackgroundExchangeFlush` now stops immediately when `dispose()` is called, preventing stale `setTimeout` callbacks from firing against a torn-down agent
|
||||
|
||||
## [14.9.2] - 2026-05-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `agentsMdFiles` to `WorkspaceTree` so AGENTS.md discovery results are returned with the workspace scan output
|
||||
@@ -1312,6 +1333,7 @@
|
||||
- Removed hashline auto-rebase. Anchor mismatches now reject immediately so the model re-reads instead of silently relocating an edit to a hash-collision within ±5 lines, which could otherwise apply the change to the wrong region. Stale-anchor recovery via the cached read snapshot is unaffected.
|
||||
|
||||
## [14.8.0] - 2026-05-09
|
||||
|
||||
### Added
|
||||
|
||||
- Added hashline stale-anchor recovery by replaying edits against a session-scoped `read`/`search` snapshot and 3-way-merging them onto the current file when anchors no longer match
|
||||
@@ -1331,6 +1353,7 @@
|
||||
- Fixed indefinite startup hang on large repos introduced in 14.7.6 ([#975](https://github.com/can1357/oh-my-pi/issues/975)) on two fronts: (1) `createAgentSession` was awaiting `buildAgentsMdSearch` and `buildWorkspaceTree` directly in its blocking `Promise.all`, bypassing the existing 5s preparation deadline that previously protected startup — both scans are now raced against a 5s deadline and fall back to the system-prompt fallback path on timeout; (2) `buildWorkspaceTree` now derives its listing from `git ls-files --cached --others --exclude-standard` when the workspace is a git worktree, which is O(index size) and avoids the per-call full-tree gitignore-aware native scan that the previous implementation triggered. Repos without git, or where the call fails / times out, transparently fall back to the previous native-glob path.
|
||||
|
||||
## [14.7.6] - 2026-05-07
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed the "Hide Thinking Blocks" setting (Ctrl+T) to also instruct the provider to omit thinking/reasoning summaries from responses, instead of just hiding them client-side. Anthropic sees `thinking.display = "omitted"` (where supported); OpenAI Responses / Azure / Codex requests drop `reasoning.summary` entirely.
|
||||
@@ -1343,6 +1366,7 @@
|
||||
- Fixed subagents re-running expensive workspace scans (`buildAgentsMdSearch`, `buildWorkspaceTree`) on every spawn: parents now forward their already-resolved `AGENTS.md` search and workspace tree to subagents through `createAgentSession`, matching how `contextFiles`, `skills`, and `promptTemplates` are already inherited. On large monorepos this removes seconds of redundant work per `task` invocation and prevents the per-subagent system-prompt timeout warnings.
|
||||
|
||||
## [14.7.5] - 2026-05-07
|
||||
|
||||
### Added
|
||||
|
||||
- Added optional `/loop` limits: `/loop 10` stops after 10 auto-iterations, while duration forms such as `/loop 10m` and `/loop 10min` stop after the time limit.
|
||||
@@ -1378,6 +1402,7 @@
|
||||
- Fixed hashline edit streaming preview collapsing to a header-only "opaque box" when a second `@PATH` section header arrived mid-stream — earlier completed sections now stay rendered while the trailing section is still being typed.
|
||||
|
||||
## [14.7.2] - 2026-05-06
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed the exported `BUILTIN_TOOL_METADATA` API, including `BuiltinEntry`-style metadata exports and discoverable-built-in helper exports, which will break consumers relying on those symbols
|
||||
@@ -1405,6 +1430,7 @@
|
||||
- Changed hashline replacement and pure-insert auto-absorb to also drop a single duplicated structural-closing line (`}`, `);`, `]`, etc.) on either boundary when keeping it would unbalance brackets. The pure-insert variant fires regardless of `edit.hashlineAutoDropPureInsertDuplicates`, while the existing 2+ line generic absorb stays gated on that setting.
|
||||
|
||||
## [14.7.0] - 2026-05-04
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed session system-prompt APIs to use ordered string block arrays by requiring `buildSystemPrompt`, `CreateAgentSessionOptions.systemPrompt`, `Session.rebuildSystemPrompt`, and extension `before_agent_start`/`getSystemPrompt` hooks to accept and return `systemPrompt: string[]` instead of a plain system-prompt string or separate `projectPrompt` field
|
||||
@@ -1449,6 +1475,7 @@
|
||||
- Added Ctrl+D draft persistence: pressing Ctrl+D with text in the editor now exits the app and saves the unsent text as a per-session draft. Resuming the same session (e.g. via `--resume`) restores the draft into the editor (one-shot, removed after restore).
|
||||
|
||||
## [14.6.4] - 2026-05-03
|
||||
|
||||
### Added
|
||||
|
||||
- Added `hindsight.mentalModelsEnabled`, `hindsight.mentalModelAutoSeed`, `hindsight.mentalModelRefreshIntervalMs`, and `hindsight.mentalModelMaxRenderChars` settings to control curated Hindsight mental-model activation, seeding, refresh cadence, and prompt render budget
|
||||
@@ -9184,4 +9211,4 @@ Initial public release.
|
||||
- Git branch display in footer
|
||||
- Message queueing during streaming responses
|
||||
- OAuth integration for Gmail and Google Calendar access
|
||||
- HTML export with syntax highlighting and collapsible sections
|
||||
- HTML export with syntax highlighting and collapsible sections
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
## [Unreleased]
|
||||
|
||||
## [15.7.0] - 2026-05-31
|
||||
|
||||
### Added
|
||||
|
||||
- Added `blockRangeAt` native API along with `BlockRange` and `BlockRangeOptions` types to return the 1-indexed line span of the outermost tree-sitter node beginning on a given line
|
||||
@@ -24,6 +25,7 @@
|
||||
- Fixed background bash jobs pinning the JS main thread at ~200% CPU when the child process emits output in many tiny writes (printf-style progress, llama-cli token streams). `pi_shell`'s pipe reader forwarded every chunk through a separate `ThreadsafeFunction::call` per kernel `read(2)`, so a chatty child produced millions of cross-thread napi callbacks that the JS main thread had to drain serially — even after the child exited, the queue kept the process saturated for seconds. The bridge now greedily coalesces every chunk already in the mpsc queue into a single batched call (capped at 64 KiB) before crossing into JS, collapsing 1-byte writes into one napi dispatch and bringing the steady-state callback rate back to the JS event-loop's throughput.
|
||||
|
||||
## [15.5.9] - 2026-05-28
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed native addon extraction to skip re-extracting cached `.node` files when their size already matches embedded archive metadata
|
||||
@@ -38,6 +40,7 @@
|
||||
- Hardened embedded addon archive extraction by rejecting unsafe entry names and non-file archive entries before writing binaries to disk
|
||||
|
||||
## [15.5.4] - 2026-05-27
|
||||
|
||||
### Added
|
||||
|
||||
- Added `Hashline` class with methods to format headers, parse/apply hashline edits, split inputs, compute diffs, generate previews, and recover from stale hashes
|
||||
@@ -67,12 +70,10 @@
|
||||
### Fixed
|
||||
|
||||
- Fixed `<sym> is not a function` crashes on Windows after `bun install -g @oh-my-pi/pi-coding-agent` updates while an `omp` process was running. Bun cannot overwrite a locked `node_modules/@oh-my-pi/pi-natives/native/pi_natives.win32-x64.node` and silently keeps the old binary alongside the new ESM wrapper, so the next launch loads mismatched code. The loader now mirrors the addon into `~/.omp/natives/<version>/` on Windows npm installs and prefers that copy at load time — each version gets its own filesystem path, so future updates land in `node_modules` unchallenged. The new version sentinel detects any remaining drift up front.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed `$env:NAME` PowerShell references being collapsed to `:NAME` when brush forwarded a command to a PowerShell (or any) subprocess. `pi-shell` now defines `env=$env` as a non-exported global on every brush session so the bash parameter expansion of `$env` yields the literal `$env`, leaving `$env:NAME` intact. User-driven assignments (`env=prod`) push their own command-scope binding and shadow the fallback, preserving the bash POSIX contract. ([#1079](https://github.com/can1357/oh-my-pi/issues/1079))
|
||||
|
||||
## [15.0.1] - 2026-05-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Raised the minimum required Bun runtime version to >=1.3.14
|
||||
@@ -80,6 +81,7 @@
|
||||
- Removed `webp` Rust workspace dependency along with `PhotonImage`'s WebP encoder.
|
||||
|
||||
## [14.9.9] - 2026-05-12
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `projfsOverlayProbe`, `projfsOverlayStart`, and `projfsOverlayStop` overlays APIs and `ProjfsOverlayProbeResult` type from the public natives interface
|
||||
@@ -105,6 +107,7 @@
|
||||
- Removed the 20 Hz background descendant tracker that scanned the harness's process tree for the entire lifetime of every shell command. Cancellation now does a small rescan-and-signal loop on demand (up to three waves — SIGTERM, then SIGKILL, then SIGKILL — with early exit as soon as no descendants remain). The previous tracker existed to pin process identities against PID reuse races, but `Process::from_pid` already pins identity by kernel start time / pidfd, so the constant scanning paid for nothing and added meaningful syscall load on macOS where each scan now does `proc_listallpids` + `proc_pidinfo` per pid.
|
||||
|
||||
## [14.9.3] - 2026-05-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `idle`, `system`, and `user` options to `MacOSPowerAssertion` so callers can request specific macOS sleep-prevention modes (`caffeinate -i`, `-s`, and `-u`) in addition to the existing `display` option
|
||||
@@ -136,6 +139,7 @@
|
||||
- Fixed native `grep` count-mode limits applying to files instead of matches, and restored timeout/abort cancellation checks for small native filesystem scans.
|
||||
|
||||
## [14.7.0] - 2026-05-04
|
||||
|
||||
### Added
|
||||
|
||||
- Added `summarizeCode` function to expose native code summarization with `kind`, `startLine`, `endLine`, and optional `text` segments plus parse/elision metadata
|
||||
@@ -143,11 +147,13 @@
|
||||
- Added `SummaryOptions` and `SummaryResult` TypeScript definitions for typed `summarizeCode` input and output
|
||||
|
||||
## [14.6.1] - 2026-05-02
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed the native package loader from CommonJS analyzer-visible assignments to a template-rendered ESM entry point with explicit named exports
|
||||
|
||||
## [14.5.13] - 2026-05-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Stopped overriding `CARGO_TARGET_DIR` with an internal `target/napi-build/...` directory during native builds, so Cargo now uses the default or caller-provided target directory
|
||||
@@ -160,6 +166,7 @@
|
||||
- Removed the `ci-release-verify-natives` script and its AVX-512 marker scan from the release pipeline
|
||||
|
||||
## [14.5.12] - 2026-04-30
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `waitForExit` to accept a single options object instead of a numeric timeout argument
|
||||
@@ -171,6 +178,7 @@
|
||||
- Added a `ProcessWaitOptions` type and updated `waitForExit` to accept an options object
|
||||
|
||||
## [14.5.9] - 2026-04-30
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed shell minimizer output so successful commands whose noise is fully stripped still return `OK` instead of an artifact-only result
|
||||
@@ -182,6 +190,7 @@
|
||||
- Added shell minimizer support for CMake, CTest, Ninja, GoogleTest binaries, and Bun/Bunx wrappers that run those tools
|
||||
|
||||
## [14.5.2] - 2026-04-26
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed local native build profile from `dev` to `local` for non-CI builds, updating the profile used by the build and local build output label
|
||||
@@ -193,6 +202,7 @@
|
||||
- Removed the `chunk` napi module (`ChunkState`, chunk schema, chunk rendering, chunk edit) and dropped `generate_chunk_schema()` from the build script
|
||||
|
||||
## [14.3.0] - 2026-04-25
|
||||
|
||||
### Added
|
||||
|
||||
- Added `text` to `MinimizerResult` so consumers can replace rewritten output with the minimized replacement text
|
||||
@@ -237,6 +247,7 @@
|
||||
- Removed the `fuzzyFind`, `glob`, and `grep` cache database argument previously used for search state
|
||||
|
||||
## [14.0.5] - 2026-04-11
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Made `tabWidth` parameter required (no longer optional) for `visibleWidth`, `truncateToWidth`, `wrapTextWithAnsi`, `sliceWithWidth`, and `extractSegments`
|
||||
@@ -332,11 +343,13 @@
|
||||
- Updated `grep()`, `glob()`, and `fuzzyFind()` function signatures to accept optional `db` parameter for database-backed searching
|
||||
|
||||
## [13.12.0] - 2026-03-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `abort()` method signature: removed optional `reason` parameter and changed return type from `void` to `Promise<void>`
|
||||
|
||||
## [13.4.0] - 2026-03-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed `AstFindOptions.pattern` to `patterns` (now accepts array of strings instead of single string)
|
||||
@@ -349,6 +362,7 @@
|
||||
- Result ordering in `astGrep` is now deterministic: sorted by path, line, column using `BTreeSet`/`BTreeMap`
|
||||
|
||||
## [13.3.8] - 2026-02-28
|
||||
|
||||
### Added
|
||||
|
||||
- Added `astGrep()` function for structural code search using AST patterns with support for language-specific matching, selectors, and meta-variable extraction
|
||||
@@ -356,6 +370,7 @@
|
||||
- Added `./ast` export path for accessing AST search and rewrite functionality
|
||||
|
||||
## [12.18.0] - 2026-02-21
|
||||
|
||||
### Changed
|
||||
|
||||
- Replaced custom `TextDecoder` usage with native `toString('utf-8')` for buffer decoding
|
||||
@@ -375,16 +390,19 @@
|
||||
- Added README.md to package distribution files
|
||||
|
||||
## [12.10.0] - 2026-02-18
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated addon filename resolution to include default filename fallback in both modern and baseline variant paths
|
||||
|
||||
## [12.8.2] - 2026-02-17
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `getSystemInfo()` and `SystemInfo` from package exports, breaking consumers that imported system info APIs from this package
|
||||
|
||||
## [12.8.0] - 2026-02-16
|
||||
|
||||
### Added
|
||||
|
||||
- Added support for x64 CPU variant selection with `TARGET_VARIANT` environment variable (modern/baseline) during build to optimize for specific ISA levels
|
||||
@@ -408,6 +426,7 @@
|
||||
- Fixed regex patterns containing literal braces (e.g. `${platform}`) failing with "repetition quantifier expects a valid decimal" by escaping `{`/`}` that don't form valid repetition quantifiers
|
||||
|
||||
## [12.5.0] - 2026-02-15
|
||||
|
||||
### Added
|
||||
|
||||
- Added `recursive` option to `GlobOptions` to control whether simple patterns match recursively (defaults to true)
|
||||
@@ -418,17 +437,20 @@
|
||||
- Updated `fileType` filter documentation to clarify that symlinks match file/dir filters based on their target type
|
||||
|
||||
## [12.4.0] - 2026-02-14
|
||||
|
||||
### Added
|
||||
|
||||
- Exported `sanitizeText` function to strip ANSI codes, remove binary garbage, and normalize line endings in text output
|
||||
|
||||
## [12.1.0] - 2026-02-13
|
||||
|
||||
### Added
|
||||
|
||||
- Added `cache` option to `glob()`, `grep()`, and `fuzzyFind()` to enable shared filesystem scan caching
|
||||
- Added `invalidateFsScanCache()` function to manually invalidate filesystem scan cache entries
|
||||
|
||||
## [11.14.0] - 2026-02-12
|
||||
|
||||
### Added
|
||||
|
||||
- Added `PtySession` class for PTY-backed interactive command execution with streaming output
|
||||
@@ -455,6 +477,7 @@
|
||||
- Native clipboard operations are now best-effort with graceful degradation
|
||||
|
||||
## [11.0.0] - 2026-02-05
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed legacy type aliases `WasmMatch` and `WasmSearchResult`
|
||||
@@ -466,11 +489,13 @@
|
||||
- Added separate grep context before/after options in bindings
|
||||
|
||||
## [10.2.2] - 2026-02-02
|
||||
|
||||
### Added
|
||||
|
||||
- Exported `getWorkProfile` function and `WorkProfile` type for work profiling capabilities
|
||||
|
||||
## [10.2.0] - 2026-02-02
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Replaced `find()` with `glob()` - update imports and function calls
|
||||
@@ -512,6 +537,7 @@
|
||||
- Added `WorkProfile` type with folded stack format, markdown summary, SVG flamegraph, and sample metrics for profiling results
|
||||
|
||||
## [9.8.0] - 2026-02-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `resize()` function; use `PhotonImage.resize()` method instead
|
||||
@@ -581,11 +607,13 @@
|
||||
- Fixed potential issue where cross-compiled binaries could overwrite platform-specific native builds with incorrect architecture binaries
|
||||
|
||||
## [9.6.4] - 2026-02-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed callback signature for `find()` and `grep()` streaming callbacks to receive `(error, match)` instead of `(match)` for proper error handling
|
||||
|
||||
## [9.6.2] - 2026-02-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Renamed `EllipsisKind` enum to `Ellipsis`
|
||||
@@ -609,6 +637,7 @@
|
||||
- Removed early return optimization in `truncateToWidth()` when text fits within maxWidth
|
||||
|
||||
## [9.6.1] - 2026-02-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added `matchesKittySequence` function to match Kitty protocol sequences for codepoint and modifier
|
||||
@@ -618,6 +647,7 @@
|
||||
- Removed `visibleWidth` function from text utilities
|
||||
|
||||
## [9.6.0] - 2026-02-01
|
||||
|
||||
### Added
|
||||
|
||||
- Support for cross-compilation via `CARGO_BUILD_TARGET` environment variable
|
||||
@@ -653,4 +683,4 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed potential crashes when updating native binaries by using safe copy strategy that avoids overwriting in-memory binaries
|
||||
- Fixed potential crashes when updating native binaries by using safe copy strategy that avoids overwriting in-memory binaries
|
||||
|
||||
+56
-11
@@ -53,6 +53,7 @@
|
||||
- Fixed slash-command autocomplete repainting when a Windows Terminal session cannot report native scrollback position; live input renders can now bypass the unknown-viewport deferral without weakening background scrollback protection. ([#1550](https://github.com/can1357/oh-my-pi/issues/1550))
|
||||
|
||||
## [15.6.0] - 2026-05-30
|
||||
|
||||
### Added
|
||||
|
||||
- Added autocomplete triggering for internal URL scheme tokens such as `local://` and `skill://` while typing in the editor
|
||||
@@ -99,6 +100,7 @@
|
||||
- Fixed full TUI redraws clearing terminal scrollback with `CSI 3 J`, preserving manual scrollback inspection while active sessions continue updating. ([#1295](https://github.com/can1357/oh-my-pi/issues/1295))
|
||||
|
||||
## [15.2.3] - 2026-05-22
|
||||
|
||||
### Added
|
||||
|
||||
- Added `SettingsList#setItems` to replace the entire settings list with a new items array while automatically clamping selection to a valid index
|
||||
@@ -126,6 +128,7 @@
|
||||
- Restored the `Key` runtime helper on `@oh-my-pi/pi-tui` to mirror upstream `@mariozechner/pi-tui`'s surface. `Key.enter`, `Key.escape`, `Key.tab`, … return the canonical key-name strings; modifier methods (`Key.ctrl(k)`, `Key.shift(k)`, `Key.ctrlShift(k)`, etc.) build precisely-typed `KeyId` literals like `"ctrl+c"`. Pure runtime convenience for typed key-id construction — plugins built against the upstream package surface that import `Key` (e.g. `@plannotator/pi-extension`, `@juicesharp/rpiv-ask-user-question`) load again now that the specifier shim remaps them onto this package.
|
||||
|
||||
## [15.0.1] - 2026-05-14
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Increased the minimum required Bun version for the TUI package from >=1.3.7 to >=1.3.14
|
||||
@@ -159,6 +162,10 @@
|
||||
- `SlashCommand.getArgumentCompletions()` may return a `Promise`; results are now awaited and non-array returns are ignored (ports pi-mono `a1e10789`)
|
||||
- Fuzzy `@` autocomplete now follows symlinked directories via `ScanOptions.follow_links` plumbed through the native walker (ports pi-mono `780d5367`)
|
||||
- Plain `@<query>` (no slash) fuzzy matches by basename only, so `@plan` no longer surfaces every file whose ancestor directories contain `plan` (ports pi-mono `968430f6`)
|
||||
- Changed slash-command autocomplete list rendering to combine command hint and description in a single displayed suggestion text
|
||||
- Changed render scheduling to throttle `requestRender` calls to roughly 60fps by batching updates
|
||||
- Changed terminal input handling to process complete cell-size responses without buffering partial input
|
||||
- Changed `KeyId` to accept super-modifier combinations and improve typed key-id validation
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -174,20 +181,11 @@
|
||||
- Allowed `SlashCommand.getArgumentCompletions` to return asynchronous results by accepting Promise-based completions
|
||||
- Added `argumentHint` support to slash command definitions and displayed it in command suggestion descriptions
|
||||
- Added support for xterm `modifyOtherKeys` printable key sequences by decoding `CSI 27;mod;key~` into text input
|
||||
|
||||
### Changed
|
||||
|
||||
- Changed slash-command autocomplete list rendering to combine command hint and description in a single displayed suggestion text
|
||||
- Changed render scheduling to throttle `requestRender` calls to roughly 60fps by batching updates
|
||||
- Changed terminal input handling to process complete cell-size responses without buffering partial input
|
||||
- Changed `KeyId` to accept super-modifier combinations and improve typed key-id validation
|
||||
|
||||
### Fixed
|
||||
|
||||
- Normalized line output during rendering to correct Thai/Lao AM glyph composition for displayed text
|
||||
- Fixed duplicated Kitty key input emissions by dropping the matching unmodified follow-up sequence after a Kitty CSI-u printable-key event
|
||||
|
||||
## [14.9.5] - 2026-05-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed rapidly blinking cursor artifact during task execution by consolidating cursor control sequences into the synchronized output buffer ([#992](https://github.com/can1357/oh-my-pi/issues/992))
|
||||
@@ -241,6 +239,7 @@
|
||||
- Autocomplete fuzzy discovery now accepts optional SearchDb instance for faster searches
|
||||
|
||||
## [13.16.0] - 2026-03-27
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated tab replacement in editor text sanitization to respect configured tab width setting
|
||||
@@ -256,6 +255,7 @@
|
||||
- Fixed editor consuming user-rebound copy keys, preventing custom keybindings from working in the editor
|
||||
|
||||
## [13.14.1] - 2026-03-21
|
||||
|
||||
### Added
|
||||
|
||||
- Added Ctrl+_ as an additional default shortcut for undo
|
||||
@@ -276,17 +276,20 @@
|
||||
- Fixed paste marker expansion to handle special regex replacement tokens ($1, $2, $&, $$, $`, $') literally in pasted content
|
||||
|
||||
## [13.11.0] - 2026-03-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed OSC 11 background color detection to correctly handle partial escape sequences that arrive mid-buffer, preventing user input from being swallowed
|
||||
- Fixed race condition where overlapping OSC 11 queries would be incorrectly cancelled by DA1 sentinels from previous queries
|
||||
|
||||
## [13.7.5] - 2026-03-04
|
||||
|
||||
### Changed
|
||||
|
||||
- Extracted word navigation logic into reusable `moveWordLeft` and `moveWordRight` utility functions for consistent cursor movement across components
|
||||
|
||||
## [13.6.2] - 2026-03-03
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed cursor positioning when content shrinks to empty without clearOnShrink enabled
|
||||
@@ -296,6 +299,7 @@
|
||||
### Fixed
|
||||
|
||||
- Fixed viewport repaint scrollback accounting during resize oscillation to avoid double-scrolling on height shrink and added exact-row scrollback assertions in overlay regression coverage ([#228](https://github.com/can1357/oh-my-pi/issues/228), [#234](https://github.com/can1357/oh-my-pi/issues/234))
|
||||
|
||||
## [13.5.3] - 2026-03-01
|
||||
|
||||
### Fixed
|
||||
@@ -305,6 +309,7 @@
|
||||
- Fixed cursor positioning instability when appending content under external cursor relocation by using absolute screen addressing instead of relative cursor movement
|
||||
|
||||
## [13.5.2] - 2026-03-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `getMermaidImage` callback from MarkdownTheme; replaced with `getMermaidAscii` that accepts ASCII string instead of image data
|
||||
@@ -315,6 +320,7 @@
|
||||
- Mermaid diagrams now render as ASCII text instead of terminal graphics protocol images
|
||||
|
||||
## [13.5.1] - 2026-03-01
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed viewport shift handling to prevent stale content when mixed updates remap screen rows
|
||||
@@ -342,6 +348,7 @@
|
||||
|
||||
- Fixed stale/duplicated terminal cursor dedup state by synchronizing `#lastCursorSequence` in all render write paths (hard reset, viewport repaint, deleted-lines clear path, append fast path, and differential path).
|
||||
- Fixed scroll overshoot on `stop()` when content fills the viewport by clamping target row movement to valid screen rows.
|
||||
|
||||
## [13.4.0] - 2026-03-01
|
||||
|
||||
### Added
|
||||
@@ -363,6 +370,7 @@
|
||||
- Restored terminal image protocol override and fallback detection for image rendering, including `PI_FORCE_IMAGE_PROTOCOL` support and Kitty fallback for screen/tmux/ghostty-style TERM environments.
|
||||
|
||||
## [13.3.8] - 2026-02-28
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Changed mermaid hash type from string to bigint in `getMermaidImage` callback and `extractMermaidBlocks` return type
|
||||
@@ -384,6 +392,7 @@
|
||||
- Fixed stale viewport rows appearing when terminal height increases by triggering full re-render on height changes
|
||||
|
||||
## [12.18.0] - 2026-02-21
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed viewport synchronization issue by clearing scrollback when terminal state becomes desynced during full re-renders
|
||||
@@ -412,18 +421,21 @@
|
||||
- Fixed incremental stale-row clearing to use erase-below semantics in synchronized output, reducing leftover-line artifacts after shrink operations.
|
||||
|
||||
## [12.9.0] - 2026-02-17
|
||||
|
||||
### Added
|
||||
|
||||
- Exported `getTerminalId()` function to get a stable identifier for the current terminal, with support for TTY device paths and terminal multiplexers
|
||||
- Exported `getTtyPath()` function to resolve the TTY device path for stdin via POSIX `ttyname(3)`
|
||||
|
||||
## [12.5.0] - 2026-02-15
|
||||
|
||||
### Added
|
||||
|
||||
- Added `cursorOverride` and `cursorOverrideWidth` properties to customize the end-of-text cursor glyph with ANSI-styled strings
|
||||
- Added `getUseTerminalCursor()` method to query the terminal cursor mode setting
|
||||
|
||||
## [11.10.0] - 2026-02-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added `hint` property to autocomplete items to display dim ghost text after cursor when item is selected
|
||||
@@ -436,6 +448,7 @@
|
||||
- Updated editor to render inline hint text as dim ghost text after cursor when autocomplete suggestions are active or provider supplies hints
|
||||
|
||||
## [11.8.0] - 2026-02-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added Alt+Y keybinding to cycle through kill ring entries (yank-pop)
|
||||
@@ -452,6 +465,7 @@
|
||||
- Changed undo coalescing in Input component to group consecutive word typing into single undo units
|
||||
|
||||
## [11.4.1] - 2026-02-06
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed terminal scrolling when displaying overlays after rendering large content, preventing hundreds of blank lines from being output
|
||||
@@ -544,6 +558,7 @@
|
||||
- Fixed handling of private use Unicode codepoints (U+E000 to U+F8FF) in Kitty key decoding to prevent invalid character interpretation
|
||||
|
||||
## [9.7.0] - 2026-02-01
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Removed `Key` helper object from public API; use string literals like `"ctrl+c"` instead of `Key.ctrl("c")`
|
||||
@@ -555,6 +570,7 @@
|
||||
- Simplified `isKeyRelease()` and `isKeyRepeat()` to use regex pattern matching instead of string inclusion checks
|
||||
|
||||
## [9.6.2] - 2026-02-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Renamed `EllipsisKind` enum to `Ellipsis` for clearer API naming
|
||||
@@ -568,6 +584,7 @@
|
||||
- Removed `extractAnsiCode` function from public API
|
||||
|
||||
## [9.6.1] - 2026-02-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved performance of key ID parsing with optimized cache lookup strategy
|
||||
@@ -578,12 +595,14 @@
|
||||
- Removed `visibleWidth` benchmark file in favor of Kitty sequence benchmarking
|
||||
|
||||
## [9.5.0] - 2026-02-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved fuzzy file search performance by using native implementation instead of spawning external process
|
||||
- Replaced external `fd` binary with native fuzzy path search for `@`-prefixed autocomplete
|
||||
|
||||
## [9.4.0] - 2026-01-31
|
||||
|
||||
### Added
|
||||
|
||||
- Exported `padding` utility function for creating space-padded strings efficiently
|
||||
@@ -595,59 +614,74 @@
|
||||
## [9.2.2] - 2026-01-31
|
||||
|
||||
### Added
|
||||
|
||||
- Added setAutocompleteMaxVisible() configuration (3-20 items)
|
||||
- Added image detection to terminal capabilities (containsImage method)
|
||||
- Added stdin monitoring to detect stalled input events and log warnings
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved blockquote rendering with text wrapping in Markdown component
|
||||
- Restructured terminal capabilities from interface-based to class-based model
|
||||
- Improved table column width calculation with word-aware wrapping
|
||||
- Refactored text utilities to use native WASM implementations for strings >256 chars with JS fast path
|
||||
|
||||
### Fixed
|
||||
|
||||
- Simplified terminal write error handling to mark terminal as dead on any write failure
|
||||
- Fixed multi-line strings in renderOutputBlock causing width overflow
|
||||
- Fixed slash command autocomplete applying stale completion when typing quickly
|
||||
|
||||
### Removed
|
||||
|
||||
- Removed TUI layout engine exports from public API (BoxNode, ColumnNode, LayoutNode, etc.)
|
||||
|
||||
## [8.12.7] - 2026-01-29
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed slash command autocomplete applying stale completion when typing quickly
|
||||
|
||||
## [8.4.1] - 2026-01-25
|
||||
|
||||
### Added
|
||||
|
||||
- Added fuzzy match function for autocomplete suggestions
|
||||
|
||||
## [8.4.0] - 2026-01-25
|
||||
|
||||
### Changed
|
||||
|
||||
- Added Ctrl+Backspace as a delete-word-backward keybinding and improved modified backspace matching
|
||||
|
||||
### Fixed
|
||||
|
||||
- Terminal gracefully handles write failures by marking dead instead of exiting the process
|
||||
- Reserved cursor space for zero padding and corrected end-of-line cursor rendering to prevent wrap glitches
|
||||
- Corrected editor end-of-line cursor rendering assertion to use includes() instead of endsWith()
|
||||
|
||||
## [8.2.0] - 2026-01-24
|
||||
|
||||
### Added
|
||||
|
||||
- Added mermaid diagram rendering engine (renderMermaidToPng) with mmdc CLI integration
|
||||
- Added terminal graphics encoding (iTerm2/Kitty) for mermaid diagrams with automatic width scaling
|
||||
- Added mermaid block extraction and deduplication utilities (extractMermaidBlocks)
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated TypeScript configuration for better publish-time configuration handling with tsconfig.publish.json
|
||||
- Migrated file system operations from synchronous to asynchronous APIs in autocomplete provider for non-blocking I/O
|
||||
- Migrated node module imports from named to namespace imports across all packages for consistency with project guidelines
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed crash when terminal becomes unavailable (EIO errors) by exiting gracefully instead of throwing
|
||||
- Fixed potential errors during emergency terminal restore when terminal is already dead
|
||||
- Fixed autocomplete race condition by tracking request ID to prevent stale suggestion results
|
||||
|
||||
## [6.8.3] - 2026-01-21
|
||||
|
||||
### Added
|
||||
|
||||
- Added undo support in the editor via `Ctrl+-`
|
||||
@@ -703,6 +737,7 @@
|
||||
- Fixed Alt+letter key combinations for better recognition
|
||||
|
||||
## [5.3.1] - 2026-01-15
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed rendering issues on Windows by preventing re-entrant renders
|
||||
@@ -732,27 +767,32 @@
|
||||
## [4.7.0] - 2026-01-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- Remove trailing space padding from Text, Markdown, and TruncatedText components when no background color is set (fixes copied text including unwanted whitespace)
|
||||
|
||||
## [4.6.0] - 2026-01-12
|
||||
|
||||
### Added
|
||||
|
||||
- Add fuzzy matching module (`fuzzyMatch`, `fuzzyFilter`) for command autocomplete
|
||||
- Add `getExpandedText()` to editor for expanding paste markers
|
||||
- Add backslash+enter newline fallback for terminals without Kitty protocol
|
||||
|
||||
### Fixed
|
||||
|
||||
- Remove Kitty protocol query timeout that caused shift+enter delays
|
||||
- Add bracketed paste check to prevent false key release/repeat detection
|
||||
- Rendering optimizations: only re-render changed lines
|
||||
- Refactor input component to use keybindings manager
|
||||
|
||||
## [4.4.4] - 2026-01-11
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed Ctrl+Enter sequences to insert new lines in the editor
|
||||
|
||||
## [4.2.1] - 2026-01-11
|
||||
|
||||
### Changed
|
||||
|
||||
- Improved file autocomplete to show directory listing when typing `@` with no query, and fall back to prefix matching when fuzzy search returns no results
|
||||
@@ -763,11 +803,13 @@
|
||||
- Fixed `fd` tool detection to automatically find `fd` or `fdfind` in PATH when not explicitly configured
|
||||
|
||||
## [4.1.0] - 2026-01-10
|
||||
|
||||
### Added
|
||||
|
||||
- Added persistent prompt history storage support via `setHistoryStorage()` method, allowing history to be saved and restored across sessions
|
||||
|
||||
## [4.0.0] - 2026-01-10
|
||||
|
||||
### Added
|
||||
|
||||
- `EditorComponent` interface for custom editor implementations
|
||||
@@ -798,6 +840,7 @@
|
||||
- Fixed text wrapping allowing long whitespace tokens to exceed line width
|
||||
|
||||
## [3.20.0] - 2026-01-06
|
||||
|
||||
### Added
|
||||
|
||||
- Added `isCapsLock` helper function for detecting Caps Lock key press via Kitty protocol
|
||||
@@ -829,6 +872,7 @@
|
||||
- Added support for custom spinner frames in the Loader component
|
||||
|
||||
## [3.9.1337] - 2026-01-04
|
||||
|
||||
### Added
|
||||
|
||||
- Added `setTopBorder()` method to Editor component for displaying custom status content in the top border
|
||||
@@ -841,6 +885,7 @@
|
||||
- Changed cursor style from block to thin blinking bar (▏) at end of line
|
||||
|
||||
## [1.500.0] - 2026-01-03
|
||||
|
||||
### Added
|
||||
|
||||
- Added `getText()` method to Text component for retrieving current text content
|
||||
@@ -905,4 +950,4 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0))
|
||||
- **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/badlogic/pi-mono/pull/306) by [@kim0](https://github.com/kim0))
|
||||
|
||||
Reference in New Issue
Block a user