Repository navigation
wisp 0.27.0
·
165 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Every thread is saved as it goes and resumed by any face: an agent's respond threads outlive their server, every
chat is saved without /save, and wisp chat --resume opens any thread, an agent's included.
Breaking:
- Chat no longer writes
~/.wisp/transcripts. Every chat is saved in the thread store,~/.wisp/threads/<id>/, and
/save NAMErenames it there, so wisp 0.26.4 and earlier cannot resume a chat this release saved. Chats saved
before still open with--resume NAME(below). - A
respondcall naming athread_idthat an earlier server saved resumes that thread, with its saved settings,
where it used to start a fresh one on the call's. Start settings that differ from the saved ones are refused, and
so is athread_idanother client saved (thread git belongs to codex, and this client is claude-code; …):
choose anotherthread_idfor a fresh thread, orclose_threadthe old one. - A
thread_idstarting with.is refused.
Added:
- Every
respondthread is saved after each turn under~/.wisp/threads/<thread_id>/, so a reconnect, a new build,
or a crash no longer loses it. Naming it again resumes it with its saved model, tools, instructions,think, and
commandTimeoutSeconds, and the result says so:resumed: true,resumedTurns, and a first line,
resumed thread git (12 turns, saved 2026-10-16 09:12). An evicted thread stays saved and is resumed the same way. - Start settings sent again on an existing or saved thread are accepted when they equal its own and refused naming
the ones that differ (git was saved with model ollama:granite4.1:8b, tools run_command; these settings differ: model), so a client that always sends its settings continues its thread instead of getting an error. - A thread is held by one wisp at a time; another is refused with
thread git is open in another wisp (pid 4242, claude-code). A thread belongs to the client that opened it, and another client's is refused and not listed. close_threaddeletes the thread from the store. A saved thread, chat's or an agent's, unused for
threads.keepDays(30 by default, 0 to keep them) is deleted with its stored outputs at a later start and audited
asthread.swept; until then the output store's sweep keeps its outputs.wisp://threadslists the client's saved threads beside the server's, withownerand astateofopen,
saved, oropen elsewhere; a saved thread's summary, facts, and context are read from its files, and a thread's
audit, output, and reasoning cover every server that held it. A resumed thread'ssession.startrecordsresume
andcarriedFrom.- Every chat is a thread, saved after each turn under
~/.wisp/threads/chat-<id>/, so nothing is lost to a crash or a
forgotten/save./save NAMErenames it (refused for a name another thread has), and/newstarts another,
leaving the last one saved. A chat quit before it had anything to save leaves nothing behind. /threads(andwisp chat --list) lists every saved thread, yours and your agents': its owner, model, turns, when
it was last used, and whether it is open here, open in another wisp, or saved.wisp chat --resume IDopens any of them. An agent's thread is shown with its settings first
(git4: ollama:granite4.1:8b, tools run_command, instructions set (an agent's thread: claude-code's, 12 turns))
and runs with them: flags,/model, and/thinkthat would change them are refused, so the agent resumes it as it
left it, with your turns in it.- A thread open in chat is held there: an agent naming it is told
thread git4 is open in another wisp (pid 4242, chat), and chat refuses one another wisp holds the same way. - Chats saved with
/savebefore this release, in~/.wisp/transcripts, still open with--resume NAME, which saves
them into the thread store; the old files are left for you to delete.--save NAMEnow names the chat's thread.
Install or upgrade with Homebrew: brew install pidster/tap/wisp. Downloading the tarball directly leaves it quarantined; use Homebrew.