<feed xmlns='http://www.w3.org/2005/Atom'>
<title>newos4/modules/test/test-ollama-error-text.js, branch main</title>
<subtitle>newOS4 - the browser terminal that runs WebX11 user spaces</subtitle>
<id>https://newos.webx11.duckdns.org/newos4/atom?h=main</id>
<link rel='self' href='https://newos.webx11.duckdns.org/newos4/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/'/>
<updated>2026-10-27T13:41:20+00:00</updated>
<entry>
<title>fix(newos4): name the real Ollama failure, bound auto-connect, fix the review findings</title>
<updated>2026-10-27T13:41:20+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-27T13:41:20+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=0ccd2cbc4cc15e0a362b08d76a8bd814abfb9ed9'/>
<id>urn:sha1:0ccd2cbc4cc15e0a362b08d76a8bd814abfb9ed9</id>
<content type='text'>
Second pass over v4.6.105, driven by an independent review that reproduced each item.

- ollama-manager.js: chat() now reports the captured cause ("Ollama error: Failed to fetch",
  "…: HTTP 500") instead of the generic "No provider responded"; _lastChatError is reset per
  call so an old reason is never replayed. chatWithTools carries the reason in its error string.
- ollama-manager.js: _ensureConnected() bounds connect() with a deadline (connectTimeoutMs,
  default 10 s). connect() uses a bare fetch(), so a blackholed endpoint previously left the
  shared in-flight promise pending forever and hung every later message — the old code failed
  fast. The attempt is now try/finally, so a throwing terminal.log() can no longer poison
  _connecting and suppress the retry on the next message.
- ollama-manager.js: an automatic connect no longer silently rewrites the user's saved model;
  the previous choice is restored in memory and in localStorage, and the user is told.
- ollama-manager.js: the DeepSeek empty-content branch returned top-level tool_calls with
  content '', so the caller pushed an assistant message with no tool_calls and then a
  role:'tool' reply — an orphan tool message, which is the HTTP 400 that branch exists to
  prevent. tool_calls now live inside the message as well.
- module-aiassist.js: a no-argument list_files returned the ROOT instead of the cwd (readDir('/')
  instead of ls()); it now means the current directory again. Error text keeps the path as the
  caller wrote it, and write_file distinguishes a read-only virtual path (/sys/…) from a missing
  parent instead of blaming the parent.

Tests: test-ollama-error-text.js (new, 14 asserts, RED 9/5 before the edit), test-ai-fs-tools.js
7 → 16 asserts (write onto a directory, /sys write, list a file, '/', no-arg cwd, relative path),
test-ollama-autoconnect.js 11 → 19 (blackholed endpoint settles + retries, saved model survives;
the old "connecting hint" assertion is now falsifiable — the reviewer showed it also matched
connect()'s pre-existing line). Suite: 10/10 files green. Live on v4.6.106: healthy auto-connect
42 ms with the hint; blackholed endpoint settles in 1242 ms with connectTimeoutMs=1200, prints
"timed out" and "unreachable", _connecting cleared.
</content>
</entry>
</feed>
