Repository navigation
Quilltap 4.9.2 Release Notes
Consider the plight of a diligent researcher. You ask the Help dialog where the theme settings have got to, and would it kindly take you there; the character behind the desk rises, consults the appropriate volumes, finds the answer, writes it out fair, hands it to the porter — and the porter, finding no name on the envelope, sets it quietly on a shelf and says nothing to anybody. The character, having received no reply, consults the volumes again. And again. At the third repetition a sensible guard concludes that the poor soul is going in circles and rings down the curtain, at which point the dialog presents you with a spotless and entirely empty answer. Nothing errored. Nothing was lost. Nothing arrived, either, which in a help system is very nearly the same thing.
The porter was within his rights. The help conversation had been running its own private errand loop rather than the one the Salon and the Brahma Console use, and it handed its findings over as unlabelled parcels — tool results with no call to which they might be attached. Eight of the nine provider plugins refuse an unlabelled parcel on principle, and refuse it silently. Only Google, in a spirit of generous informality, would carry the thing anyway, which is why the whole misfortune looked less like a defect than like a question of which character happened to be on duty. The help loop now threads its work through the same fitting used everywhere else: a result with a claim ticket is paired to its call, and one without is announced plainly as a result rather than smuggled in as a tool row.
Google, meanwhile, had troubles of its own, and they were rather the mirror image. Its function-declaration desk keeps a list of paperwork it declines to read, and every schema we send is trimmed against that list before it goes out. additionalProperties was somehow never written down. This mattered not at all for most tools, whose only such notation sits at the top of the form where it is discarded in any case — but the wardrobe tools take a list of operations, and each item on that list carried the offending word one storey down, where the trimming never reached. The result was a flat refusal of the entire turn in under a fifth of a second, before a single token could be spoken, for any Gemini seat with tool use enabled and a wardrobe to its name. The word is now first on the list of things struck out, at every depth, and the sanitiser is held to that promise by a test fed the genuine wardrobe schemas rather than a polite imitation of them.
That the one provider tolerant enough to deliver an unaddressed parcel was also the one fastidious enough to reject a form bearing a single unfamiliar word is the sort of coincidence one does not invent.
What Changed
- fix (Help): The help chat's agent loop now builds its assistant turn and tool-result rows through the shared tool-call threading helpers, so a result carrying a provider call id is paired to its call by
toolCallIdand an id-less result is framed as[Tool Result: <name>]user text. Previously it pushed an id-lesstoolrow that every provider plugin but Google drops, so a question needinghelp_searchorhelp_navigateproduced empty turns until the duplicate-call guard ended the loop, and the dialog showed nothing at all. The stuck-loop reminder now tracks the last result directly instead of searching the slate by role. Two regression tests drive a native tool turn through the loop and assert the slate the follow-up request receives. (bug 124) - fix (Google provider):
additionalPropertiesis now stripped from function-declaration schemas at every depth, not merely dropped by construction at the top level. A Gemini profile with tool use enabled, in a help chat or in any chat whose character has a wardrobe, previously failed every turn withInvalid JSON payload received. Unknown name "additionalProperties"— the key survived under thewardrobe_wearandwardrobe_take_offoperationsarray items. A regression test runs the real wardrobe schemas through the sanitiser; loading the plugin under Jest required a manual mock for the ESM-only@google/genaiSDK. Google plugin 1.1.51. (bug 125)
Installation
Desktop App
Download from the quilltap-shell releases page:
macOS:
- Download the
.dmgfile and open it - Drag Quilltap to your Applications folder
- Launch Quilltap from Applications
Windows:
- Download and run the
.exeinstaller - If SmartScreen warns about an unknown publisher, click "More info" → "Run anyway"
- Launch Quilltap from the Start Menu or desktop shortcut
Linux:
- Download the
.AppImagefile, make it executable (chmod +x), and run it - Or install the
.debpackage:sudo dpkg -i quilltap_*.deb
Node.js (any platform)
npx quilltapOr install globally:
npm install -g quilltap
quilltapOpen http://localhost:3000 in your browser. Requires Node.js 24+. First run downloads ~150–250 MB and caches locally.
Docker
docker pull foundry9/quilltap:4.9.2Or use the startup scripts:
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/foundry-9/quilltap-server/refs/heads/main/scripts/start-quilltap.sh | bash
# Windows (PowerShell)
irm https://raw.githubusercontent.com/foundry-9/quilltap-server/refs/heads/main/scripts/start-quilltap.ps1 | iexA release in defence of the proposition that research done on your behalf ought to reach you.
The envelope has a name on it at last, and the form has been trimmed to fit the desk.
Installation
Desktop App (recommended)
The Quilltap desktop app (Electron) is available from
quilltap-shell 4.2.0.
Download the release for your platform (macOS, Windows, or Linux).
The quilltap-standalone-*.tar.gz attached to this release is what the
desktop app and the quilltap CLI download and run.
Node.js (any platform)
npm install -g quilltap
quilltapOn first run, the CLI downloads the application files (~150-250 MB)
and caches them locally. Subsequent launches start instantly.
Docker
docker pull foundry9/quilltap:4.9.2See the README for setup instructions.