github can1357/oh-my-pi v15.5.11

latest releases: v15.5.14, v15.5.13, v15.5.12...
18 hours ago

@oh-my-pi/pi-ai

Added

  • Added mid-conversation system message support for Anthropic Messages by upgrading eligible developer turns to role: "system" on first-party Claude API with Claude Opus 4.8+ and newer
  • Added supportsMidConversationSystem to Anthropic compatibility settings so consumers can opt in to or disable mid-conversation system role handling per model
  • Added anthropic.claude-opus-4-8 model metadata in the model registry for Bedrock Converse streaming with effort-based thinking support through xhigh

Changed

  • Changed Anthropic adaptive-thinking effort mapping for Opus 4.7+ on the Messages API to use the model's full five-tier scale: user-facing efforts now shift up one notch (minimal→low, low→medium, medium→high, high→xhigh, xhigh→max) so the top tier reaches the genuine max level and high lands on Anthropic's recommended xhigh coding/agentic default. Older adaptive models (Opus 4.6) and Bedrock Converse keep the four-tier legacy mapping where xhigh aliases to max.

Fixed

  • Fixed OpenCode Zen 400 thinking is enabled but reasoning_content is missing in assistant tool call message for every model behind opencode-go/opencode-zen (Kimi K2.x, DeepSeek V4 Pro/Flash, GLM-5.x, Qwen3.x, MiMo, MiniMax) by reactivating requiresReasoningContentForToolCalls and pinning the wire field to reasoning_content for any opencode request in thinking mode. The static compat default still omits the field for thinking-disabled turns to preserve the Extra inputs are not permitted guard from #1071; forced-tool turns also stay off because the existing disableReasoningOnForcedToolChoice guard strips thinking from the wire body. (#1484)

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

Added

  • Added SqlSessionStorage, a bun:sql-backed implementation of SessionStorage that persists session JSONL into PostgreSQL, MySQL/MariaDB, or SQLite. Pass a connected Bun.SQL instance (the constructor accepts postgres://, mysql://, or sqlite: URLs) to SqlSessionStorage.create({ client, table?, adapter?, createTable? }) and hand the returned storage to any SessionManager factory. The dialect is auto-detected from client.options.adapter and used to pick the correct DDL plus upsert-with-append syntax (ON CONFLICT … DO UPDATE for PG/SQLite, ON DUPLICATE KEY UPDATE for MySQL), so the agent's append-only persist pattern works in a single round-trip per line. Same in-memory mirror and drain() semantics as the Redis backend; blobs and tool artifacts still live on disk via ArtifactManager/BlobStore.
  • Added RedisSessionStorage, a bun:redis-backed implementation of the SessionStorage interface that lets API consumers route session JSONL through Redis instead of local disk. Pass a connected Bun.RedisClient (or any compatible adapter) to RedisSessionStorage.create({ client, prefix? }) and hand the returned storage to SessionManager.create(cwd, sessionDir, storage) (or any other static factory that accepts a storage argument). An in-memory mirror is loaded on creation so the interface's synchronous methods (existsSync, statSync, listFilesSync, …) keep their contracts; drain() waits for queued background writes. Tool artifacts and image blobs still live on disk via ArtifactManager/BlobStore — Redis only owns the session JSONL keyspace under the configured prefix.
  • Exported the SessionStorage / SessionStorageWriter / FileSessionStorage / MemorySessionStorage symbols (already reachable via the ./session/session-storage subpath) from the package root so SDK consumers can construct alternative storage backends without deep-importing.
  • Added a fresh ¶<relative-path>#TAG snapshot header to the write tool's success text in hashline display mode, covering plain disk writes, ACP-bridge writes, and conflict resolutions (bulk resolutions emit a trailing Snapshots: block with one header per successfully written file). The header records a current snapshot in the file-snapshot store so the next edit can land without an extra read round-trip. Suppressed when the session is not in hashline mode and skipped for archive/SQLite writes and host-managed internal URL targets where hashline anchors do not apply.

Changed

  • The edit tool's stale-snapshot rejection message now distinguishes "file changed between read and edit" (the section's hash was recorded in this session but the file has since drifted — a prior in-session edit advanced it, or an external write changed it) from "hash #X is not from this session" (a fabricated or carried-over cross-session tag), the latter carrying explicit "never invent the tag" guidance. Both messages include the current file hash plus 2 lines of context around each anchor so the next attempt has everything it needs. Snapshot-based recovery still runs first; the sharper diagnostics only surface when recovery cannot reconcile the edit.

Fixed

  • Fixed Autonomous Memory phase 1/phase 2 failing with Thinking effort low is not supported by <provider>/<model> on models whose supported reasoning efforts exclude low/medium (e.g. deepseek/deepseek-v4-pro). Both stage1 (Effort.Low) and consolidation (Effort.Medium) call sites in packages/coding-agent/src/memories/index.ts now route through clampThinkingLevelForModel, lifting the requested effort to the model's lowest supported level instead of letting requireSupportedEffort throw (#1480).

@oh-my-pi/hashline

Added

  • MismatchError now distinguishes "hash recognized but file content drifted" from "hash never recorded for this path". The latter (likely fabricated or carried over from a prior session) emits a dedicated hash #X is not from this session rejection message with explicit "never invent the tag" guidance. The MismatchDetails interface gains an optional hashRecognized?: boolean (defaults to true for backward compatibility); MismatchError exposes it as a readonly field so callers can branch on the cause.

Full Changelog: v15.5.10...v15.5.11

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

NewReleases is sending notifications on new releases.