- Resolved memory backend before instruction assembly and used it to build developer instructions.
- Added a `memoryRootEnabled` prompt option when the memory backend id is `local`.
- Typed Mnemosyne memory state types and updated `registerMnemosyneState()` to call `setMnemosyneSessionState()`.
- Documented that `@oh-my-pi/pi-mnemosyne/diagnose` export was added in the mnemosyne changelog.
- Added `memory_edit` tool for update, forget, and invalidate operations on Mnemosyne memories by id.
- Added `stats` and `diagnose` methods to `MemoryBackend` interface with Mnemosyne implementations.
- Exposed `/memory stats` and `/memory diagnose` slash commands in TUI and ACP modes.
- Refactored recall output to include memory ids via `formatScopedRecallWithIds`.
- Added `@oh-my-pi/pi-mnemosyne` to the catalog and release publish script.
- Switched coding-agent dependency from `workspace:*` to the catalog reference.
- Added `tsconfig.publish.json` for declaration-only emit on publish.
- Included mnemosyne in CI tarball smoke tests alongside other workspace packages.
- Tagged non-zero bash command completions as error results, capturing `exitCode` and keeping exit notices in returned text.
- Updated the shell renderer to hide duplicate exit notices from output while surfacing failed command status in the footer.
- Added tests for non-zero versus zero-exit bash results and footer rendering of failed commands.
- Added shared helpers and inline TUI renderers for retain, recall, and reflect tool outputs.
- Added tool registry entries for retain, recall, and reflect to use the new inline renderers.
- Updated changelog notes describing new memory inline rendering semantics and output headers.
- Added memory renderer tests for summary, truncation, streaming, and expand/collapse behavior.
- Added tests for `MnemosyneSessionState` lifecycle, including turn-based auto-retain.
- Added tests covering scoped Mnemosyne database clearing and per-project bank derivation.
- Added a task renderer test to suppress per-task previews when `renderContext.hasResult` is true.
- Added parentMnemosyneSessionState propagation from session state through SDK, executor, and task options into nested sessions.
- Added getMnemosyneSessionState() and rekeying logic to refresh Mnemosyne IDs during session sync, switch, and restore.
- Added Mnemosyne reset and teardown cleanup on unaliasing or restoration to avoid stale state.
- Added parent Mnemosyne session support to startup options and backend lookup via alias-of state.
- Added resetConversationTracking() and switched retention to extractMessages(sessionManager).
- Reworked bank resolution by resolving repo root and sanitizing/truncating project bank names with hash suffixes.
- Updated clear() to load config when absent and remove scoped DB paths, WAL, and SHM files.
- Added CHANGELOG Fixed entries for Mnemosyne lifecycle and related diff/UX formatting fixes.
- Propagated task `renderContext` through `ToolExecutionComponent` so call rendering can detect result state.
- Suppressed task call-preview rows when a result snapshot exists to avoid duplicate task lines.
- Updated the edit preview coalescing key to include streaming state plus a hash so final non-streaming diffs are not skipped when payload bytes match.
- Used a hashed partial-stream key as fallback when tool args are not JSON-serializable, keeping deterministic dedup cache keys.
- Added a regression test that verifies single-line hashline streaming edits render the completed preview diff instead of "No changes would be made".
- Introduced a shared missingSnapshotTagMessage helper and reused it from both hashline patcher and preview validation.
- Required snapshot tags in preview hashline sections for all edits, including head/tail inserts, so preview failures now match apply-time rejections.
- Updated TUI width calculation to strip ANSI escapes before grapheme splitting, preserving styled ZWJ emoji width behavior.
- Filtered recall, fact, vector, temporal, and polyphonic voices to session-owned or explicitly global memories.
- Implemented graph_query and graph_link MCP tool handlers via EpisodicGraph; wired annotations and graph into Mnemosyne's external-db path.
- Fixed restore to stage and integrity-check before replacing the live database, rolling back on failure.
- Deduped generateId with a per-process nonce to prevent batch duplicate-content collisions.
- Added formatContextUsage to render context as `%/window` with `?` fallback across status and task views.
- Updated task renderCall to show dispatched agents as tree entries with `Tasks (2)` header and `#3` fallback.
- Capped task preview collapse at 12 entries and added `... N more agents` overflow messaging.
- Replaced hard-coded dot separators with `theme.sep.dot` in subagent cost and context output.
- Added tests for streaming task preview rendering and updated nested-live expectations for percent/context output.
- Rejected file creation via hashline and directed to write tool instead.
- Required snapshot tag in duplicate insert test setup.
- Added "irc" to expected subagent LSP tool names.
- Strips project-bank tokens from the query before a second recall pass on the global bank.
- Prevents broad user-preference memories from being missed when the query is packed with project-specific tokens.
- Added helper functions for bank name tokenization, phrase stripping, and query normalization.
- Renamed HindsightRecall/Reflect/RetainTool classes and files to Memory* for backend-neutral naming.
- Fixed Mnemosyne state to resolve separate db paths per bank instead of sharing one file.
- Updated test file and all imports to reflect the new names.
- Added `mnemosyne.scoping` setting: `global`, `per-project`, and `per-project-tagged`.
- `per-project-tagged` writes to a project-local bank while merging global memories on recall.
- Refactored `MnemosyneSessionState` to manage scoped recall/retain targets and deduplication.
- Updated hindsight tools to route recall/retain through scoped methods.
- Extended tool factories to activate on `memory.backend === "mnemosyne"` in addition to `hindsight`.
- Implemented Mnemosyne execution paths in all three tools using `recallEnhanced`, `remember`, and `beam.formatContext`.
- Exposed `getMnemosyneSessionState` on `ToolSession` and wired it through `createAgentSession`.
- Added usage guidance for `recall`, `retain`, and `reflect` to Mnemosyne static instructions.
- Replaced Hindsight-only contract tests with expanded suite covering both backends.
- Introduced `@oh-my-pi/pi-mnemosyne` workspace package with BeamMemory, recall/retain, FTS, and optional fastembed ONNX embeddings.
- Wired `memory.backend = "mnemosyne"` into the coding-agent settings schema and backend resolver.
- Added `MnemosyneSessionState` for per-session auto-recall on first turn and auto-retain after completed turns.
- Documented configuration, environment variables, and operational notes in `docs/mnemosyne-memory-backend.md`.
Replaced raw Up/Down arrow matching in selector-style components with the shared tui.select navigation keybindings.
Added regression coverage for Ctrl+P/Ctrl+N selector remaps across the reported components.
Fixes#1535
- Added `getBracketStrippedModelIdCandidates` to strip reseller/wrapper tags like `[Kiro]` or `[假流]` from model IDs.
- Wired bracket stripping into both canonical equivalence and custom reference candidate expansion.
- Enriched discovered proxy models with upstream reference metadata (reasoning, context window, input modalities).
- Extended trailing marker pattern and candidate normalization with slash stripping, lowercasing, and `search` suffix.
- Removed "ctx" suffix and cumulative Σ-token display from status lines.
- Replaced "N tools" text with tool count + extensionTool icon.
- Changed cost separator to ` . ` to visually distinguish it from dim stats.
- Added test asserting new format and absence of old labels.
- Updated structural diff handling to detect offscreen content growth before the viewport.
- Triggered a `historyRebuild` when a pure tail repaint would miss expanded offscreen rows.
- Added regressions to confirm expanded rows appear in scrollback and collapsed `ctrl+o` markers are removed.
- Updated the task prompt rules to prioritize maximum batch width and avoid single-task batches for divisible work.
- Allowed overlapping task assignments by clarifying that hash-anchored edits and IRC deconfliction handle collisions.
- Adjusted large-payload guidance to route data through local URIs, with context-only content exempted when applicable.
- Extended assistant-replay helpers to append a paired tool-result message after stale assistant turns.
- Updated OpenAI responses replay tests to use the new stale-turn helper and to track branch leaves by the tool-result entry.
- Adjusted the Hangul filler width test to use platform-specific expected cells on Darwin versus non-Darwin.
- Added `maxToolCallsPerTurn` support to `AgentOptions` and `AgentLoopConfig`, with Agent getter/setter and serialized state wiring.
- Implemented stream-loop cap handling by normalizing bad values and halting after `toolcall_end` reaches the limit.
- Added `ANTHROPIC_TOOL_CALL_BATCH_CAP`=8 and wired session cap sync on init, model changes, and restore.
- Added tests that truncated a 10-call stream to 8 tool calls, and verified non-Claude models resolve no cap.
- Extracted `#loadModelsFromCurrentRegistryState()` for pure in-memory reads.
- `#loadModels()` now calls `registry.refresh()` only when no scoped models are set.
- Background provider refresh reuses the extracted method to avoid a redundant whole-registry reload after network round-trip.
- Added assertions verifying `registry.refresh` is called exactly once per selector lifecycle.
- Decoupled provider tab changes from immediate model refresh by scheduling background provider refreshes with a 120ms debounce.
- Added refresh-state tracking and spinner-based status text so the tab bar updates while a provider refresh is in progress.
- Updated model-selector tests to verify tab switches stay responsive, refreshes are delayed, and loading spinner frames appear before completion.
- Added `discovery.type: proxy` that hits `GET /v1/models` and routes each model via `supported_endpoint_types` (`anthropic` → `/v1/messages`, `openai` → `/v1/chat/completions`).
- Made provider-level `api` optional when `discovery.type` is `proxy`, since wire protocol is derived per-model.
- Increased discovery fetch timeout from 250ms to 10s to accommodate remote proxies.
- Documented proxy discovery configuration in `docs/models.md`.
- Previously only stripped dangling tool_use blocks from the trailing assistant turn; now scans all assistant turns on the resolved path.
- Builds a set of paired tool result IDs upfront to identify dangling calls anywhere in the message list.
- Adds a test covering a mid-path dangling turn alongside a correctly paired turn that must be preserved.
- Stripped `redactedThinking` blocks (encrypted, no downgradeable plaintext) from trailing assistant turns during context rebuild.
- Cleared `thinkingSignature` on `thinking` blocks so the encoder downgrades them to plain text, avoiding Anthropic's "modified latest assistant message" rejection.
- Extended existing test to cover signed/redacted thinking alongside dangling tool calls.
- Reverted in-progress/completed todo icons to pre-15.5.12 checkbox glyphs instead of status glyphs.
- Extended dangling tool_use cleanup to also strip `redacted_thinking` blocks and clear `thinking` signatures on the trailing assistant turn, fixing 400 handoff rejections from Anthropic on navigation.
- Removed todo spinner interval state and rendering hooks from InteractiveMode, and in-progress or active-matched todos now use the static running glyph.
- Removed spinner-driven matcher caching and render updates from todo list generation so running state is based on direct content matching.
- Added build-session context tests that remove dangling assistant `toolCall` entries and drop trailing assistant turns that contain only tool calls.
- BuildSessionContext now normalized a trailing assistant turn by removing dangling `toolCall` blocks when rewound or restored onto that turn.
- It dropped the assistant turn entirely when only tool calls remained to prevent reconstruction from reintroducing synthetic aborted tool results.
- Enhanced markdown rendering to insert a painted theme swatch before matching inline hex colors in prose and code spans.
- Skipped short numeric-only 3- and 4-digit values in plain text so issue-like references do not get swatches.
- Added `colorSwatch` to symbol themes and added tests for swatch rendering and surrounding-style preservation.
- Used cacheRead + cacheWrite + input as the denominator for an accurate hit rate.
- Previous logic excluded uncached input tokens, overstating the hit rate for providers that report all three fields.
- DeepSeek (cacheWrite=0) still yields correct hit/(hit+miss) with the new formula.
- Removed Ghostty-specific hardware-cursor forcing from TUI preference resolution and dropped the redundant terminal-cursor marker flag.
- Updated interactive mode editors to use `ui.getShowHardwareCursor()` so cursor mode now follows actual hardware-cursor visibility.
- Reworked terminal regressions tests to assert Ghostty respects the requested cursor preference and only emits cursor-show output when enabled.
- Rendered the plan review "keep context" selector label with the session context usage percentage when available.
- Kept the fallback label unchanged when context usage data was unavailable.
- Added coverage asserting both the percentage label and fallback label in plan review tests.
Fixes#1458
- Dropped local `renderJsonTree` and `formatJsonScalar` in favor of the shared `renderJsonTreeLines` used by tool args, MCP results, and subagent output.
- Removed `Object(N)`/`Array(N)` type labels and per-output `JSON output N` headers; type icons and bare keys are used instead.
- The `display[N]` header is now shown only when a cell emits more than one `display()` value.