* fix(ollama): do not advertise tools when /api/show fails
Failed show responses left capabilities undefined, which
buildOllamaModelDefinition treats as optimistic supportsTools.
Match setup inspect: return empty capabilities instead.
* test(ollama): cover show-fail tools gate including L3 live HTTP
Unit paths for HTTP error/throw plus real 127.0.0.1 server proving
buildOllamaProvider keeps supportsTools false when /api/show 500s.
* fix(ollama): keep reasoning heuristics when /api/show fails
Distinguish failed inspection from authoritative empty capabilities
so tools stay conservative without suppressing model-name reasoning.
* test(ollama): cover three capability states for tools and reasoning
Failed show keeps reasoning heuristics; authoritative [] disables both.
* fix(ollama): propagate showInspectionFailed through setup configs
Setup inspection failures now use the three-state marker instead of
authoritative empty capabilities, keeping tools off and reasoning heuristics.
* test(ollama): setup show-fail keeps tools off and reasoning heuristics
Cover interactive setup when /api/show returns 500 for deepseek-r1.
* fix(ollama): propagate showInspectionFailed through dynamic model resolve
/models add dynamic path now builds failed-show definitions with tools
off while preserving reasoning name heuristics.
* test(ollama): dynamic resolve covers failed /api/show three-state behavior
Mock builder matches production tools/reasoning contract for inspection failure.
* fix(ollama): keep catalog-missing dynamic resolve fail-closed on show failure
Failed /api/show is an existence probe for unresolved models; return undefined so typos/404s stay rejected. Tag-discovered and setup paths keep showInspectionFailed tools-off behavior.
* chore(changelog): remove release-owned entry
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(memory-wiki): preserve user edits when rolling back ChatGPT imports
Rollback deleted created pages and overwrote updated pages unconditionally,
destroying content the user added after the import with no recovery copy.
Import runs now record a content hash of each written page after vault
compile, and rollback preserves any page whose current content no longer
matches into the run's recovered directory before deleting or restoring.
Legacy run records without hashes preserve unconditionally.
Fixes#116457
* fix(memory-wiki): move pages aside atomically during rollback
Rollback now renames the live page into the recovery location before
inspecting it, so a concurrent external save cannot land between the
content read and the delete or snapshot restore. Matching pages drop
the moved copy; mismatching pages keep it as the recovery file.
* fix(memory-wiki): make rollback snapshot restore collision-safe
The snapshot restore wrote directly to the page path after the
move-aside, so a page recreated by an editor in that window was
overwritten with no recovery copy. Restore now creates the snapshot
exclusively and on collision moves the recreated page aside and
retries; recovery filenames are uniqued so a second move-aside cannot
clobber an earlier preserved copy.
* fix(memory-wiki): record rollback hashes at write time
* fix(memory-wiki): make ChatGPT rollback retry-safe
* fix(memory-wiki): fence ChatGPT rollback phases
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(session): preserve reset message payloads
Use the raw command body when it directly matches a reset trigger so code, logs, bracketed text, and line breaks reach the new session intact. Keep structural normalization only for prefixed messages that require it to match.
* fix(session): anchor reset payloads to original input
* fix(session): anchor reset parsing to inbound projections
* fix(session): keep reset result type internal
* test(qa): prove reset payload preservation
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>