github can1357/oh-my-pi v18.2.0

6 hours ago

@oh-my-pi/pi-ai

Added

  • Assistant turns from Anthropic-compatible hosts (direct, or via OpenRouter's reasoning_details) carry upstreamModel, the serving model id recovered from the signed thinking block, so callers can detect a router substituting a different model than requested.

Fixed

  • Fixed OpenCode Go window-limit 429s (5-hour/Weekly/Monthly usage limit reached. Resets in …) not pinning the exhausted credential to the server-stated reset; the window phrasing is now covered by a regression test over the rotation classifier. (#12091 by @H4vC)

@oh-my-pi/pi-catalog

Breaking Changes

  • Removed getCatalogProviderEntry and the CATALOG_PROVIDERS constant in favor of providerEntry and providerEntries

Added

  • Added support for DeepInfra, LiteLLM, Qwen Portal, SiliconFlow, and SiliconFlow-CN providers
  • Added support for Gemini 3.8 Flash models

Changed

  • Cached provider catalogs restore policy-versioned materialized models instead of rebuilding each row on launch.
  • Model policy resolution reuses indexed rule matches and cached target results.
  • Model-aware delegation prompts reuse policy decisions until the model's identity or capabilities change.
  • Provider catalog entries (default model, env keys, discovery wiring) and the bundled fallback rows for providers that cannot be discovered at generation time (Anthropic, OpenAI Daybreak, xAI OAuth, Meta, Muse Code, Bedrock Mantle, Devin, Z.AI, Sakana, ai&, Abliteration, Yolo-Auto, GMI Cloud, Fire Pass, QwenCloud Token Plan, Cloudflare AI Gateway, GitLab Duo Workflow) now live in src/compat/rules/providers/<id>.kdl and compile into rules.json; KnownProvider is generated from them, and the generator bundles seed rows by each entry's declared bundle policy instead of per-provider code.

@oh-my-pi/pi-coding-agent

Breaking Changes

  • Settings.getGroup() now returns shallow-frozen snapshots, reused until effective settings change.
  • Removed parseSSE, MCPToolsResponse, and MCPCallResponse; callMCP() now returns the shared JsonRpcResponse with an unknown result instead of an unchecked generic payload.

Added

  • Added ollama web search provider using Ollama's hosted web search API (POST https://ollama.com/api/web_search), authenticated via OLLAMA_CLOUD_API_KEY (#3791).
  • Added readUrl support for Ollama model pages (ollama.com/<model> and ollama.com/library/<model>), extracting descriptions, tags, and architecture metadata.
  • @upstream routing selectors accept tiered OpenRouter slugs (openrouter/google/gemini-3.8-flash@google-ai-studio/priority), and omp bench labels each routed model with its upstream.
  • /skill:<name> in the composer becomes an atomic skill chip (icon + name, linked to its SKILL.md) once you finish typing it or accept it from autocomplete — it deletes as one unit and survives draft restores, like image chips.
  • The transcript now flags a gateway serving a different Claude model than requested: a ⚠ served claude-haiku-4-5-20251001 · requested claude-opus-5 · via openrouter/Amazon Bedrock divider under the first affected turn, shown once per substitution per session.

Changed

  • Compiled binaries ship precompiled bytecode: omp boots in ~30 ms instead of ~250 ms and the interactive prompt accepts input ~300 ms sooner, at the cost of a larger binary.
  • Welcome recents refresh after first paint, and attachment bands reuse cached chip state until the draft changes.
  • Interactive startup paints its speculative frame before loading the session runtime; model/auth dialogs and browser/computer preludes load on first use.
  • Status-line redraws reuse unchanged segment output, settings groups, and tool token estimates while preserving live invalidation.
  • Skill invocations render as a normal user turn: a mid-prompt skill shows as an inline chip in the user bubble; a leading skill shows as a railed callout with the chip and prompt size, with the rest of your message rendered as full multi-line Markdown instead of a single collapsed header.

Fixed

  • hub wait on a process now reports what it was actually blocked on when it times out (process exit, the pattern, or readiness) instead of always citing the start readiness log pattern.
  • Isolated settings no longer share mutable array and record defaults.
  • Ask timeouts above 1,000 seconds now retain their configured duration.
  • Configured extension directories no longer load fallback index files when declared entries are missing.
  • Telemetry no longer sends OTLP when only a non-OTLP exporter is selected.
  • Browser response-body failures now preserve their original protocol errors.
  • Auto-retry waits past the signed 32-bit timer ceiling (e.g. a month-scale OpenCode Go reset with retry.waitForUsageReset) now elapse in full instead of overflowing the timer and retrying immediately.
  • JavaScript eval now reports startup failure if both isolated runtimes fail, instead of executing uncancellable code on the host thread.
  • CommonJS extensions now expose computed and non-enumerable named exports while preserving require/import identity and reloads.
  • Exa MCP calls now select matching responses after notifications, accept valid SSE framing, and preserve cancellation.
  • Esc-Esc rewind, /copy, and /tree's user-only filter now treat user-invoked skill and collab prompts as user turns: they are selectable, / jumps land on them, and rewinding past one restores the text you typed (with its chips) into the editor.
  • /skill:<name> followed by a newline now invokes the skill instead of sending the draft as plain text.
  • openrouter/<vendor>/<model>@upstream now resolves when the first-party provider bundles the same id (e.g. google/gemini-*), instead of failing with "model not found".
  • Kept the subagent yield tool as a direct function call instead of mounting it through xd://.
  • Git TUI staging now honors .gitattributes text/eol and clean filters, so "Stage All" no longer leaves eol=crlf files (e.g. *.cmd) dirty with no visible diff.
  • Browsers spawned via app.path into an omp-owned profile no longer trigger the macOS "wants to use your confidential information in Safe Storage" keychain dialog.
  • Reading Hugging Face file URLs (/raw/..., /resolve/..., /blob/..., /tree/...) now returns the file instead of the repo's model/dataset card.
  • Directory reads no longer append a bogus [1 results limit reached. Use limit=2 for more] notice (read has no limit); capped child directories show only their inline … N more marker, and the prompt documents paging with :N-M/:-N.

@oh-my-pi/pi-tui

Added

  • Added Editor.textRevision for content-dependent render caches, including undo and draft restoration.
  • Added collapseToAtom method to compress text spans into UI-friendly atoms

Changed

  • Redrawing unchanged terminal rows now avoids rescanning ANSI, hyperlinks, and images.
  • Terminal UIs reach their first frame with a smaller startup module graph.

@oh-my-pi/pi-utils

Breaking Changes

  • Removed the unused globPaths, loadGitignorePatterns, and GlobPathsOptions exports.
  • Browser helpers now manage Chrome only: removed Browser, BrowserTag, resolveBuildId(), getInstalledBrowsers(), and browser options/metadata; getDownloadUrl() now takes (platform, buildId, baseUrl?).

Added

  • Added relativePathWithinNormalizedRoot() for reusing canonical paths across containment checks.
  • Added sleepLong() and MAX_TIMER_DELAY_MS: an abortable sleep that chunks delays past the signed 32-bit timer ceiling so day-scale provider waits elapse instead of overflowing the timer.

Changed

  • Log-retention cleanup now runs after logger construction without keeping short-lived commands alive.
  • Debugger support now loads only when SIGUSR1 requests it.

Fixed

  • Fixed extractRetryHint dropping OpenCode Go's Resets in … quota window (45min, 2hr 15min, 3 days): the reset in pattern now accepts Resets phrasing, hr/day units, and compound 2hr 15min remainders, so exhausted Go credentials block for the server-stated window instead of the 60s heuristic guess. (#12091 by @H4vC)
  • Async file-peek callbacks now receive stable Uint8Array windows with copying slice() semantics.
  • Dotenv loading now handles multiline values and escapes consistently with Bun, preventing project values from leaking into child-shell environments.
  • SSE readers now support lone-CR line endings and CRLF split across chunks without merging or delaying events.

What's Changed

  • feat(coding-agent): add Ollama web search provider by @niklasschaeffer in #10740
  • fix(utils,ai): parse OpenCode Go Resets-in quota window for account rotation by @H4vC in #12091

New Contributors

Full Changelog: v18.1.22...v18.2.0

Don't miss a new oh-my-pi release

NewReleases is sending notifications on new releases.