v2.1.0 - a second memory, for everything that is not code
What 2.1 adds: a second memory, for everything that is not code
Why this exists at all. The memory THOR already had is built for work. It
has a gate that turns bad notes away, notes that speak up on their own at the
moment they apply, and a hard cap on how much ever reaches your conversation.
Every one of those is right for a rule about your code, and every one of them is
wrong for a recipe.
Put everyday things into that same memory and three things go wrong, all of them
quietly. A list of the books you have read competes for space with a rule whose
job is to stop you dropping a database, and the cap decides between them. An
answer comes back looking complete when most of it was left out. And asking in
your own words returns nothing at all: search matches whole words, so "ribbetjes"
finds none of the three notes that say "ribben".
Why a separate memory and not a new category. A category inside the same
memory was the obvious fix, and it does not work: the two still share one list,
one ranking and one cap, so they still compete - just with extra bookkeeping. So
2.1 adds a genuinely separate memory, with its own file and its own two
commands. It cannot reach the first one at all; that is enforced by how the
program is put together, not by being careful. Nothing you file there can
interrupt you, crowd out a rule, or take up room in a block. You only ever see
it because you asked for it.
How it works. Like a shelf - and each rule below comes from watching the
first memory go wrong in exactly that way.
- Everything lives on a shelf, and shelves do not nest. Books, recipes, a
training log, what you spent. Filing something without naming a shelf is
refused, and the refusal lists the shelves you have, so your assistant picks a
real one instead of inventing a name. - Only you create a shelf. If nothing fits, your assistant has to ask you
what the new one should be called. This is the rule that stops a tidy list of
eight becoming a sprawl of sixty, and it is there because the first memory
sprawled exactly that way. - A shelf that grows gets labels, never a split. Two hundred recipes on one
shelf, filtered by "bbq" or "dessert", is still one shelf. The content grows;
the list of shelves does not. - You get an index, not a wall of text. Open a shelf and you see one line per
entry. Ask for one by number to read it whole. - The same thing twice is refused, pointing at the entry you already have.
- Nothing is ever deleted. Retiring an entry takes it out of the listing and
leaves it readable. - A search never answers "nothing". If your words miss - and they will, since
the words you ask with are rarely the words you wrote - it hands you the shelf
to read instead. That is the whole answer to the "ribbetjes" problem: not
cleverer matching, but a short list you can read.
Also in 2.1, on the code side
- A note for the archive has to say where it belongs. The field was optional,
and an optional field nobody fills stays empty: two thirds of one real memory
had no home, findable only by guessing the right words. It is now required,
and the refusal lists the homes that already exist so being refused costs one
more call rather than three. - You can open one of those homes and read what is in it, one line per note -
and its count now matches what it actually holds, instead of quietly leaving
out the notes that can fire. - Writes from a phone or a second machine no longer fork the log. Four of the
eight writing commands were skipping the queue and writing into the local copy
directly. Judging a note was the worst of them, because that is the write such
a session makes most often. All eight now queue, and a test fails if a new one
ever forgets. - A queue that cannot be fully replayed is now refused instead of dropped.
If the machine draining it runs an older build, it says so and keeps the
writes, rather than clearing the queue and reporting them lost.
Built by CI from this tag on clean runners. Verify with the .sha256 next to each asset.
Which download
| asset | meaning search | for |
|---|---|---|
thor2-windows-x86_64.zip |
yes | Windows, the machine your assistant runs on |
thor2-linux-x86_64.tar.gz |
yes | Linux, same |
thor2-linux-x86_64-plain.tar.gz |
no | servers, a NAS, a container |
Each one is a bundle, not a single program. Version 2 is several small
programs that work together: install sets everything up, doctor tells you
whether it is healthy, and the rest run in the background once installed.
What is NOT in the box
- No language model of any kind. Nothing calls out to an API, nothing needs
a key. Meaning search needs a local model file (about 235 MB) that you supply;
nothing downloads itself. Without it, search falls back to matching words and
keeps working - it does not break. - Windows: you need the Microsoft Visual C++ Redistributable
(MSVCP140.dll,VCRUNTIME140.dll) andDirectML.dll, which is already on
Windows 10 1903 and later. If a program refuses to start, install the VC++
redistributable first.
Install
Unpack everything into a folder where it can stay - the setup writes down where
it put things, so moving the folder afterwards breaks it. Then run install,
pointing it at your assistant's settings file. It backs that file up first and
only ever adds its own entries. Restart your assistant afterwards: it reads its
settings once, at startup, so until you restart nothing you installed is
running. Then run doctor to see whether it is actually healthy.
New here? The README walks through it step by step. Coming from version 1?
Your old notes are not lost - see the README's own note on that; version 1
itself is retired, and its source and docs stay reachable at the v1.0.0 tag.
What has actually been run
Every asset is built and tested by CI on a clean runner: the whole test suite,
plus a separate run with meaning search compiled in, plus the plain server
shape. Beyond that, the maintainer starts the Windows build by hand before
publishing; the Linux ones are CI-built only. If one does not start for you,
say so - that is the report worth having.
Full Changelog: v2.0.0...v2.1.0