@oh-my-pi/pi-ai
Added
- Added mid-conversation
systemmessage support for Anthropic Messages by upgrading eligibledeveloperturns torole: "system"on first-party Claude API with Claude Opus 4.8+ and newer - Added
supportsMidConversationSystemto Anthropic compatibility settings so consumers can opt in to or disable mid-conversationsystemrole handling per model - Added
anthropic.claude-opus-4-8model metadata in the model registry for Bedrock Converse streaming with effort-based thinking support throughxhigh
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 genuinemaxlevel andhighlands on Anthropic's recommendedxhighcoding/agentic default. Older adaptive models (Opus 4.6) and Bedrock Converse keep the four-tier legacy mapping wherexhighaliases tomax.
Fixed
- Fixed OpenCode Zen
400 thinking is enabled but reasoning_content is missing in assistant tool call messagefor every model behindopencode-go/opencode-zen(Kimi K2.x, DeepSeek V4 Pro/Flash, GLM-5.x, Qwen3.x, MiMo, MiniMax) by reactivatingrequiresReasoningContentForToolCallsand pinning the wire field toreasoning_contentfor any opencode request in thinking mode. The static compat default still omits the field for thinking-disabled turns to preserve theExtra inputs are not permittedguard from #1071; forced-tool turns also stay off because the existingdisableReasoningOnForcedToolChoiceguard strips thinking from the wire body. (#1484)
@oh-my-pi/pi-coding-agent
Added
- Added
SqlSessionStorage, abun:sql-backed implementation ofSessionStoragethat persists session JSONL into PostgreSQL, MySQL/MariaDB, or SQLite. Pass a connectedBun.SQLinstance (the constructor acceptspostgres://,mysql://, orsqlite:URLs) toSqlSessionStorage.create({ client, table?, adapter?, createTable? })and hand the returned storage to anySessionManagerfactory. The dialect is auto-detected fromclient.options.adapterand used to pick the correct DDL plus upsert-with-append syntax (ON CONFLICT … DO UPDATEfor PG/SQLite,ON DUPLICATE KEY UPDATEfor MySQL), so the agent's append-only persist pattern works in a single round-trip per line. Same in-memory mirror anddrain()semantics as the Redis backend; blobs and tool artifacts still live on disk viaArtifactManager/BlobStore. - Added
RedisSessionStorage, abun:redis-backed implementation of theSessionStorageinterface that lets API consumers route session JSONL through Redis instead of local disk. Pass a connectedBun.RedisClient(or any compatible adapter) toRedisSessionStorage.create({ client, prefix? })and hand the returned storage toSessionManager.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 viaArtifactManager/BlobStore— Redis only owns the session JSONL keyspace under the configured prefix. - Exported the
SessionStorage/SessionStorageWriter/FileSessionStorage/MemorySessionStoragesymbols (already reachable via the./session/session-storagesubpath) from the package root so SDK consumers can construct alternative storage backends without deep-importing. - Added a fresh
¶<relative-path>#TAGsnapshot header to thewritetool's success text in hashline display mode, covering plain disk writes, ACP-bridge writes, and conflict resolutions (bulk resolutions emit a trailingSnapshots:block with one header per successfully written file). The header records a current snapshot in the file-snapshot store so the nexteditcan land without an extrareadround-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
edittool'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 excludelow/medium(e.g.deepseek/deepseek-v4-pro). Both stage1 (Effort.Low) and consolidation (Effort.Medium) call sites inpackages/coding-agent/src/memories/index.tsnow route throughclampThinkingLevelForModel, lifting the requested effort to the model's lowest supported level instead of lettingrequireSupportedEffortthrow (#1480).
@oh-my-pi/hashline
Added
MismatchErrornow 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 dedicatedhash #X is not from this sessionrejection message with explicit "never invent the tag" guidance. TheMismatchDetailsinterface gains an optionalhashRecognized?: boolean(defaults totruefor backward compatibility);MismatchErrorexposes it as a readonly field so callers can branch on the cause.
Full Changelog: v15.5.10...v15.5.11