From b8c37ce618e46e2b03cf924e056998f63c42c56c Mon Sep 17 00:00:00 2001 From: DevMando Date: Tue, 28 Jul 2026 22:04:13 -0700 Subject: [PATCH] v0.14.1: callsigns by default, onboarding button order, cloud 403 guidance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New agents draw callsigns by default; numbered naming becomes the opt-in (explicit prior choices are preserved via the panel-state null-coalesce) - Can't-reach-Ollama screen: install actions lead, endpoint override marked Not Recommended, plain-language diagnosis with the socket error dimmed - Cloud models need an active ollama.com subscription: stated at every selection point, and 403 responses get an explanation card instead of a raw error (distinct from 401 — the sign-in walkthrough can't fix a 403) --- CHANGELOG.md | 26 ++++++++++++++ .../ResponseStreamerTests.cs | 28 +++++++++++++++ src/MandoCode.Desktop/MainWindow.xaml | 2 +- src/MandoCode.Desktop/MainWindow.xaml.cs | 5 ++- .../MandoCode.Desktop.csproj | 2 +- .../Services/AgentCallsigns.cs | 5 +-- .../ViewModels/ChatController.Wizards.cs | 35 +++++++++++++------ .../ViewModels/ChatController.cs | 6 ++++ .../ViewModels/ResponseStreamer.cs | 13 +++++++ 9 files changed, 107 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8d88d5..2d9906a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,32 @@ ships (the engine drives 0.14 → 0.15; each product's patch number advances independently). The exact pinned engine commit is recorded by the `MandoCode` submodule. +## [0.14.1] — 2026-07-28 + +First-five-minutes polish from watching 0.14.0's fresh-machine debut, plus honest guidance +about cloud model pricing. + +### Changed +- **New agents get callsigns by default.** Tabs now open as Morphy, Kernel, Cloud — the + 500-name deck — instead of Agent 1, Agent 2. Numbered naming is still one Settings toggle + away, and anyone who had explicitly chosen it keeps their choice (only the default flipped). +- **The "can't reach Ollama" screen puts the likely fix first.** On a machine without Ollama, + the options now read: Install Ollama for me → Open the Ollama Download Page (I'll install it + myself) → Change the Endpoint URL (Not Recommended) → Retry → Cancel Setup. The endpoint + override — the option a fresh machine never needs — used to lead the list. The message now + opens with a plain-language diagnosis ("Ollama isn't running on this computer — it may not + be installed yet") instead of a raw socket error; the technical detail still shows, dimmed. + +### Added +- **Cloud subscription awareness.** Cloud models on ollama.com now require an account with an + active cloud subscription — without one, requests fail with 403 Forbidden, which previously + surfaced as a raw error that looked like the app breaking. The subscription requirement is + now stated everywhere a cloud model is chosen (the starter picker, the sign-in prompt, and + on every model switch to a `:cloud` tag), and a 403 response gets its own explanation card + naming the real cause and the two real exits (subscribe, or `/model` to a free local model). + Deliberately distinct from the 401 path: 403 does *not* trigger the sign-in walkthrough, + which cannot fix it and would loop. + ## [0.14.0] — 2026-07-28 **The first public release of MandoCode Desktop** — the WinUI 3 desktop home for the MandoCode diff --git a/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs b/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs index 4e1be7d..01d3fc6 100644 --- a/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs +++ b/src/MandoCode.Desktop.Tests/ResponseStreamerTests.cs @@ -143,6 +143,34 @@ public async Task NormalResponse_DoesNotInvoke401() Assert.False(fired); } + [Fact] + public async Task Response_LookingLike403_ExplainsSubscription_NotSignIn() + { + // 403 = signed in but no cloud subscription. The sign-in walkthrough (401 recovery) + // must NOT fire — it would loop uselessly — and the card must name the real cause. + var (s, blocks) = Make(new FakeAiService(new[] { "Error: HTTP 403 (Forbidden) from ollama.com" })); + var signInFired = false; + s.On401 = () => { signInFired = true; return Task.CompletedTask; }; + + await s.StreamAsync("hi", CancellationToken.None); + + Assert.False(signInFired); + Assert.Contains(blocks, b => b.StartsWith("WARN:") && b.Contains("subscription")); + Assert.Contains(blocks, b => b.StartsWith("DIM:") && b.Contains("/model")); + } + + [Fact] + public async Task NormalResponse_DoesNotEmit403Card() + { + // "403" alone in prose (e.g. a line number or HTTP discussion) must not trigger — + // the match requires "forbidden" too. + var (s, blocks) = Make(new FakeAiService(new[] { "see RFC 9110 section 403 for details" })); + + await s.StreamAsync("hi", CancellationToken.None); + + Assert.DoesNotContain(blocks, b => b.Contains("subscription")); + } + [Fact] public async Task Cancellation_SurfacesAsWarning_NotThrow() { diff --git a/src/MandoCode.Desktop/MainWindow.xaml b/src/MandoCode.Desktop/MainWindow.xaml index 699bb73..a3cdd2d 100644 --- a/src/MandoCode.Desktop/MainWindow.xaml +++ b/src/MandoCode.Desktop/MainWindow.xaml @@ -1059,7 +1059,7 @@ the change; existing tabs keep their names. --> + ToolTipService.ToolTip="On (default): each new agent draws a random callsign — Morphy, Kernel, Cloud — from a 500-name deck that doesn't repeat until it runs dry. Off: new agents are Agent 1, Agent 2, … Renaming a tab always works either way."/> diff --git a/src/MandoCode.Desktop/MainWindow.xaml.cs b/src/MandoCode.Desktop/MainWindow.xaml.cs index 339059e..ee40070 100644 --- a/src/MandoCode.Desktop/MainWindow.xaml.cs +++ b/src/MandoCode.Desktop/MainWindow.xaml.cs @@ -102,7 +102,10 @@ public MainWindow() _historySeenAt = panelState.HistorySeenAt; _lastNotePath = panelState.LastNotePath; _noteModel = panelState.NoteModel; - AgentCallsigns.Enabled = panelState.AgentCallsigns ?? false; + // Callsigns are the default face; numbered agents are the opt-in. The null-coalesce + // matters: a user who explicitly toggled numbering keeps it (saved false), while + // fresh installs and pre-0.14.1 panel states get callsigns. + AgentCallsigns.Enabled = panelState.AgentCallsigns ?? true; // The editor writes note content; the panel only lists. One store, handed over once. NoteEditor.Store = _notes; WireNotesPanel(); diff --git a/src/MandoCode.Desktop/MandoCode.Desktop.csproj b/src/MandoCode.Desktop/MandoCode.Desktop.csproj index ca9514f..7ce8f40 100644 --- a/src/MandoCode.Desktop/MandoCode.Desktop.csproj +++ b/src/MandoCode.Desktop/MandoCode.Desktop.csproj @@ -14,7 +14,7 @@ true enable enable - 0.14.0 + 0.14.1 Armando Fernandez (DevMando) MandoCode Desktop — the MandoCode AI coding agent with a native WinUI 3 interface.