Repository navigation
Loads of little fixes, model modality detection improvements, polishing on the webui now that I'm using it more heavily.
-
question tool - a pending question survives a tab refresh. A
questionblocked when the webui reconnects now re-renders its card after history instead of hanging with no UI to answer. Replay moved from the SessionManager's QUESTION-event buffer to the question bridge itself: on attach or session switch the server peeks the live pending question. -
webui -
wss://on https pages. The chat socket URL hardcodedws://, which browsers block as mixed content on an https page. -
webui - dropped the pulsing glow on the connection indicator
-
evals - added independent evals runner and a first easy series
kielbasa-1 -
webui - attachments render inside the user bubble. @-ref uploads echoed as an extra
SYSTEM_MESSAGEper file while the bubble itself showed the file-include part's raw JSON. The user-message event now carries the text plus afiles[]view, rendered as collapsible boxes in the bubble -- live, session replay, and cold log replay.SystemMessageEventloses itsfilesfield. -
Removed
--no-stream/streamconfig (breaking). The flag only gated display -- the request path always streamed -- so--no-streamruns silently dropped the answer. Output is now always streamed;--no-streamfails fast as an unknown flag and"stream"indefaults.jsonsurfaces as an unknown key inhotdog rescue. -
fetch tool returns images. A fetched PNG/JPEG/WebP/GIF now attaches to the tool result as a base64
image_url, exactly likeread-- a vision model can look at a chart or screenshot straight from a URL. Gated bymodelAcceptsImagesbefore any bytes are read (fail-closed on text-only models), capped at the shared 10MB image limit with a streaming byte cap so endless streams get cancelled, not buffered. Otherimage/*types (e.g. svg) keep the text path;HEADstill returns headers only. -
@-ref image attachments get their own size budget.
fileAttachment.maxFileSize(100KB) gated text and images alike, so screenshots over 100KB were silently dropped from @-refs even on a vision model -- whilereadsaw them fine under its 10MB cap. NewfileAttachment.maxImageSize(default 10MB, matchingread) applies to images; text budget unchanged. The webui Attach button shares the split:image/*uploads over the websocket are sized againstmaxImageSize. -
llama.cpp model-modality detection.
fetchModelsnow understands plain llama.cpp's/v1/modelsshape, not just llama-swap: context fromdata[].meta.n_ctx, vision from the ollama-stylecapabilitieslist,aliasesexpand. When the payload has no modality data it falls back to/props. Vision models on bare llama.cpp now reportinputModalities: ["text","image"]without hand-editing provider config; non-llama.cpp providers see no extra requests. -
--disable-env-scrubbingCLI flag: turns off env scrubbing for agent-spawned subprocesses (bash tool, MCP stdio); children inherit the full environment. Default stays scrubbed. -
provider health tracking. A dead provider looks idle -- the preferred placement target -- until a task locks onto it and burns its retries on connection-refused. Placement now consults reachability verdicts: a sweep every
providerHealthCheckIntervalSecs(default 30,0disables the timer) probes each provider with a resolvable url --/v1/modelsforfetchModels: trueproviders, which doubles as a live catalog refresh upserted into the running registry,/healthotherwise -- and connection-level task failures (refused/DNS/reset) demote a provider immediately, active even at0. Reachability is status-agnostic: a 500 or a stalled generation still proves the socket answers. Recovery clears through a successful probe or any task completing a turn, so demotion is never process-permanent. A down provider is skipped during multi-candidate placement unless every candidate is down (fail-open); pins are never rerouted.hotdog infoshows the per-providerup/downverdict. -
fix tool-result blindness on strict chat templates. Since the tool-result part refactor,
role: "tool"messages rode the wire as part arrays; llama.cpp/Ollama templates interpolate tool content as a raw string and choke, so some models effectively never saw tool results. Text-only tool content now collapses back to a plain\n-joined string on the wire; arrays with non-text parts (images) stay arrays. -
marker-mangler - chatML tokens are escaped too. ChatML control tokens (
<|im_start|>) in untrusted text are rewritten to a safe form and reversed on output -- chatML markers survive enough model templates to be common breakage.
Full Changelog: v0.11.2...v0.11.3