memhouse 0.18.12 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +22 -151
- package/CHANGELOG.md +263 -29
- package/LICENSE +202 -22
- package/LICENSES/agentlytics-MIT.txt +21 -0
- package/LICENSES/memhouse-MIT-until-0.18.11.txt +22 -0
- package/LICENSES/models.dev-MIT.txt +22 -0
- package/NOTICE +28 -0
- package/README.md +42 -20
- package/SECURITY.md +21 -8
- package/bin/memhouse.js +2223 -311
- package/docs/README.md +11 -9
- package/docs/guides/admin-password.md +37 -10
- package/docs/guides/configuration.md +13 -6
- package/docs/guides/daemons.md +64 -3
- package/docs/guides/import-claude-ai.md +204 -0
- package/docs/guides/install.md +11 -6
- package/docs/guides/invite.md +21 -7
- package/docs/guides/operate.md +114 -7
- package/docs/guides/search-and-resume.md +72 -3
- package/docs/guides/share.md +91 -52
- package/docs/guides/storage.md +44 -4
- package/docs/guides/troubleshooting.md +121 -14
- package/docs/guides/uninstall.md +4 -3
- package/docs/guides/update.md +16 -0
- package/docs/guides/upgrade-to-0.20.md +188 -0
- package/docs/releases/README.md +2 -1
- package/docs/releases/v0.18.10.md +5 -5
- package/docs/releases/v0.18.11.md +3 -3
- package/docs/releases/v0.20.0.md +627 -0
- package/docs/releases/v0.20.1.md +114 -0
- package/docs/tutorials/01-first-house.md +10 -7
- package/docs/tutorials/02-join-a-house.md +24 -15
- package/docs/tutorials/03-share-your-memory.md +40 -31
- package/editors/antigravity.js +1 -80
- package/editors/base.js +463 -9
- package/editors/bridge.js +119 -0
- package/editors/claude.js +273 -105
- package/editors/codex.js +278 -52
- package/editors/copilot.js +1 -70
- package/editors/cursor.js +1 -75
- package/editors/derive-fingerprints.json +18 -0
- package/editors/harness-paths.js +69 -0
- package/editors/index.js +1 -20
- package/editors/normalise/agy.js +910 -0
- package/editors/normalise/copilot-cli.js +321 -0
- package/editors/normalise/cursor-agent.js +852 -0
- package/editors/normalise/cursor.js +474 -0
- package/editors/normalise/devin.js +575 -0
- package/editors/normalise/gemini-cli.js +602 -0
- package/editors/normalise/goose.js +673 -0
- package/editors/normalise/opencode.js +633 -0
- package/editors/normalise/vscode.js +549 -0
- package/editors/normalise/zed.js +473 -0
- package/editors/opencode-v4.js +119 -0
- package/editors/scope.js +14 -3
- package/editors/sessions-log.js +349 -0
- package/editors/sqlite.js +28 -1
- package/editors/vscode.js +1 -72
- package/editors/windsurf.js +1 -143
- package/examples/01-local-one-machine/README.md +24 -19
- package/examples/01-local-one-machine/run.sh +1 -1
- package/examples/02-existing-clickhouse/README.md +30 -22
- package/examples/02-existing-clickhouse/run.sh +5 -4
- package/examples/03-team-house/README.md +44 -37
- package/examples/03-team-house/run.sh +35 -18
- package/examples/04-self-hosted-team/README.md +29 -14
- package/examples/04-self-hosted-team/compose.yml +5 -2
- package/examples/04-self-hosted-team/smoke.sh +26 -12
- package/examples/README.md +8 -4
- package/examples/fixtures/README.md +4 -1
- package/examples/fixtures/make-sessions.js +8 -5
- package/memhouse/admin-secret.js +89 -24
- package/memhouse/argv-secrets.js +64 -0
- package/memhouse/channel.js +49 -9
- package/memhouse/codex-plugin.js +194 -0
- package/memhouse/delivery/AGENT-INSTALL-PROMPT.md +2 -1
- package/memhouse/delivery/AGENT-INSTALL.md +22 -11
- package/memhouse/delivery/INVITATION.md.tpl +44 -45
- package/memhouse/delivery/PROMPT.md +53 -5
- package/memhouse/delivery/UPGRADE.md.tpl +1 -1
- package/memhouse/delivery/codex/AGENTS-BLOCK.md +11 -0
- package/memhouse/delivery/codex/SKILL.md +50 -0
- package/memhouse/delivery/kernel-install.md +17 -9
- package/memhouse/delivery/plugin/.claude-plugin/plugin.json +2 -2
- package/memhouse/delivery/plugin/reference/HOUSE.md +168 -41
- package/memhouse/delivery/plugin/skills/access/SKILL.md +13 -5
- package/memhouse/delivery/plugin/skills/admin/SKILL.md +14 -6
- package/memhouse/delivery/plugin/skills/house/SKILL.md +25 -8
- package/memhouse/delivery/plugin/skills/recall/SKILL.md +66 -8
- package/memhouse/delivery/plugin/skills/sql/SKILL.md +66 -7
- package/memhouse/deploy.js +1 -1
- package/memhouse/flags.js +35 -18
- package/memhouse/help.js +37 -0
- package/memhouse/host.js +82 -2
- package/memhouse/house/HOUSE.md +2 -2
- package/memhouse/house/convert-profile.js +638 -0
- package/memhouse/house/convert-v3.js +742 -0
- package/memhouse/house/doctor-v3.js +324 -0
- package/memhouse/house/host-alias.js +85 -0
- package/memhouse/house/house.js +3 -3
- package/memhouse/house/migrate.js +2 -2
- package/memhouse/house/profile-dedupe.js +183 -0
- package/memhouse/house/profile-edges.js +554 -0
- package/memhouse/house/profile-house.js +430 -0
- package/memhouse/house/profile-rollup.js +190 -0
- package/memhouse/house/q-cli.js +863 -0
- package/memhouse/house/queries-v3.js +1013 -0
- package/memhouse/house/reconcile-v3.js +192 -0
- package/memhouse/house/records-to-profile.js +174 -0
- package/memhouse/house/records-to-rows.js +169 -0
- package/memhouse/house/relocate.js +2 -1
- package/memhouse/house/schema-choice.js +121 -0
- package/memhouse/house/schema-profile.js +290 -0
- package/memhouse/house/schema-profile.sql.tpl +398 -0
- package/memhouse/house/schema-v3.js +267 -0
- package/memhouse/house/schema-v3.sql.tpl +213 -0
- package/memhouse/import/claude-ai.js +420 -0
- package/memhouse/import/import.js +372 -0
- package/memhouse/import/pyjson.js +206 -0
- package/memhouse/import/records.js +64 -0
- package/memhouse/import/writer-profile.js +192 -0
- package/memhouse/import/writer-v3.js +240 -0
- package/memhouse/import/zip.js +112 -0
- package/memhouse/invitation.js +102 -0
- package/memhouse/invitefile.js +5 -2
- package/memhouse/plugin-copies.js +176 -0
- package/memhouse/provision.js +7 -2
- package/memhouse/release-hint.js +24 -0
- package/memhouse/resume.js +4 -4
- package/memhouse/server/api-v3.js +632 -0
- package/memhouse/server/dashboard-auth.js +181 -0
- package/memhouse/server/dashboard-port.js +91 -0
- package/memhouse/server/queries.js +30 -0
- package/memhouse/server/server.js +118 -20
- package/memhouse/service.js +1 -1
- package/memhouse/share.js +687 -1
- package/memhouse/shipper/adapter-capture.js +756 -0
- package/memhouse/shipper/capture.js +2571 -0
- package/memhouse/shipper/dedupe-profile.js +237 -0
- package/memhouse/shipper/dedupe-v3.js +1027 -0
- package/memhouse/shipper/forks.js +233 -0
- package/memhouse/shipper/log-adapter.js +219 -0
- package/memhouse/shipper/maintenance.js +49 -0
- package/memhouse/shipper/normalise-run.js +148 -0
- package/memhouse/shipper/passlog.js +68 -5
- package/memhouse/shipper/profile-capture.js +903 -0
- package/memhouse/shipper/ship.js +91 -8
- package/memhouse/shipper/snapshots.js +193 -0
- package/memhouse/shipper/source-roots.js +111 -0
- package/memhouse/version-notice.js +66 -0
- package/package.json +14 -7
- package/public/THIRD_PARTY_NOTICES.txt +2 -2
- package/public/assets/index-CcNnhfM3.js +78 -0
- package/public/index.html +1 -1
- package/ui/package-lock.json +56 -37
- package/ui/package.json +1 -0
- package/ui/src/App.jsx +29 -14
- package/ui/src/components/ChatSidebar.jsx +69 -12
- package/ui/src/lib/api.js +76 -0
- package/ui/src/lib/dashboard-token.js +41 -0
- package/ui/src/main.jsx +22 -5
- package/ui/src/pages/Dashboard.jsx +22 -36
- package/ui/third-party-notices.js +119 -0
- package/ui/vite.config.js +5 -1
- package/docs/releases/v0.18.12.md +0 -59
- package/memhouse/COMPETITION.md +0 -221
- package/memhouse/DESIGN.md +0 -222
- package/memhouse/RESUME-AND-UPDATE.md +0 -182
- package/public/assets/index-CnWzrjF3.js +0 -78
package/AGENTS.md
CHANGED
|
@@ -1,149 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Installing and deploying memhouse (for agents)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Constellation-wide rules (worktrees, branch naming, which remotes are frozen) live in the
|
|
7
|
-
parent directory's [`CLAUDE.md`](../CLAUDE.md) and are not repeated here.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
## Release lines — read before tagging, publishing, or merging a release
|
|
11
|
-
|
|
12
|
-
memhouse shipped two lines while the first production house ran the pre-0.18 layout. Since
|
|
13
|
-
its conversion there is one line; the rules below are kept because a second line can happen again.
|
|
14
|
-
|
|
15
|
-
| line | git branch | npm dist-tag | versions | who installs it |
|
|
16
|
-
|---|---|---|---|---|
|
|
17
|
-
| the 0.18 line | `release/0.18` (cut at v0.18.11; `main` stays the default branch) | `latest`, and `team` as an alias | 0.18.x | everyone — `npm install -g memhouse` (the production house was converted to the one layout with `memhouse convert`; `release/0.17` is retired) |
|
|
18
|
-
|
|
19
|
-
Rules, each learned once:
|
|
20
|
-
|
|
21
|
-
- **Tag on the line's branch, publish from the tag, from the primary checkout.** A 0.17.1 was
|
|
22
|
-
built on `master` (the retired default) and published from a worktree: the branch and the
|
|
23
|
-
registry disagreed for a day, and the package lost its `gitHead`. `misc/publish-guard.js`
|
|
24
|
-
runs as `prepublishOnly` and refuses a publish whose version, `--tag`, branch, or HEAD tag
|
|
25
|
-
disagree with this table. If you need a new line (0.19.x), edit the table **and** the
|
|
26
|
-
guard's `LINES` in the same commit.
|
|
27
|
-
- **A fix lands on one line.** Porting to the other is a deliberate merge or cherry-pick with
|
|
28
|
-
its own CHANGELOG entry, never assumed. The one-layout (0.18) renamed every room to
|
|
29
|
-
`<member>_*`; anything touching room names ports with care (`house/HOUSE.md`).
|
|
30
|
-
- **`memhouse update` follows the channel a machine was installed from** (`MEMHOUSE_CHANNEL`),
|
|
31
|
-
so a machine on the old line never receives a team build by accident, and vice versa.
|
|
32
|
-
- **`master` is retired.** It was the pre-0.18 default; `main` is the default now. Do not
|
|
33
|
-
branch from it, tag on it, or push to it.
|
|
34
|
-
- **A publish is live when `npm view` says so.** `npm publish` prints `+ memhouse@x.y.z`;
|
|
35
|
-
confirm with `npm view memhouse dist-tags --prefer-online`. A version that seems missing
|
|
36
|
-
right after a publish is registry lag or a stale local npm cache (`npm cache verify`),
|
|
37
|
-
not a "staged" publish. That misdiagnosis cost three releases.
|
|
38
|
-
- **Which token.** The publish token is a secret reference, resolved at the moment of use
|
|
39
|
-
and lent to the one `npm publish` (a temporary userconfig); never print it.
|
|
40
|
-
- **One owner per line at a time.** Before releasing, check for another
|
|
41
|
-
session working on the same repo and agree who cuts it; the release record lives in `CHANGELOG.md`
|
|
42
|
-
on the line's branch and in `drills/`.
|
|
43
|
-
|
|
44
|
-
## What memhouse is
|
|
45
|
-
|
|
46
|
-
A local shipper parses coding-agent sessions (16 adapters covering 18 apps) and writes them as typed rows
|
|
47
|
-
into a ClickHouse database the user owns. A **house** is a database; its **rooms** are
|
|
48
|
-
tables, one set per **member** and named for them (`mem.alice_messages`). A member holds
|
|
49
|
-
one grant — `ON mem.alice_*` — and nothing else in the database; nobody is ever granted the
|
|
50
|
-
database itself. `roomNames()` in `memhouse/house/house.js` is the only place a table name
|
|
51
|
-
is produced, and `memhouse/provision.js` is the only description of what a member is
|
|
52
|
-
granted — the live path executes it and `--print-sql` prints it.
|
|
53
|
-
The ClickHouse is whichever one the user points at — local container, their own server,
|
|
54
|
-
or ClickHouse Cloud; memhouse runs no service of its own and proxies nothing. There is no
|
|
55
|
-
LLM anywhere in the write or read path.
|
|
56
|
-
|
|
57
|
-
`memhouse/DESIGN.md` argues the design. `TERMINOLOGY.md` is the canon for names — if a
|
|
58
|
-
thing has a name there, use it and do not invent another.
|
|
59
|
-
|
|
60
|
-
## The three instruments, and what each cannot see
|
|
61
|
-
|
|
62
|
-
| instrument | asks | blind to |
|
|
63
|
-
|---|---|---|
|
|
64
|
-
| `npm test` | is the logic right | anything needing a server |
|
|
65
|
-
| `misc/invite-matrix.sh` | does it work against a real ClickHouse | anything a person has to read |
|
|
66
|
-
| **a drill** | can someone actually use it | nothing — which is why it is slow |
|
|
67
|
-
|
|
68
|
-
**[`drills/DRILLS.md`](drills/DRILLS.md) is the drill protocol**, borrowed from
|
|
69
|
-
[`kernel`](https://github.com/agent-realm/kernel). A drill is memhouse being used by
|
|
70
|
-
agents in real roles who have **not read this repository**. Four things it is easiest to
|
|
71
|
-
get wrong:
|
|
72
|
-
|
|
73
|
-
- **Write a plan first** — roles staffed, and the situation to create.
|
|
74
|
-
- **A plan must contain no expected results**, or it is a test that knows the answer.
|
|
75
|
-
- **Agents must run where this repo is unreachable**, or they read the source instead of
|
|
76
|
-
reporting the confusion. The installed package's `README.md` and the `/mem:*` skills
|
|
77
|
-
*are* in scope; a real user has those.
|
|
78
|
-
- **Never fix memhouse mid-drill**, or the record describes a build that never existed.
|
|
79
|
-
|
|
80
|
-
Run one after the matrix passes, and before any release that changes a surface a person
|
|
81
|
-
touches.
|
|
82
|
-
|
|
83
|
-
## Things this codebase has learned the hard way
|
|
84
|
-
|
|
85
|
-
Each of these cost a real incident. They are in the commit log with the measurements.
|
|
86
|
-
|
|
87
|
-
- **A probe that says yes to everyone is worse than no probe.** `invite` tested
|
|
88
|
-
`SELECT 1 FROM system.users`, which every member passes since they all hold `SHOW USERS`
|
|
89
|
-
— so it announced success and then failed at `CREATE DATABASE`.
|
|
90
|
-
- **Scope is part of a privilege.** A member holds `CREATE DATABASE` inside their own
|
|
91
|
-
database and can mint nothing. Match the grant *and* its scope, never the name alone.
|
|
92
|
-
- **A flag that is ignored rather than refused** is how a `--dry-run` typo becomes a real
|
|
93
|
-
migration. Every command declares its options in `memhouse/flags.js`.
|
|
94
|
-
- **One `data` event is not one keystroke.** Reading a hidden password chunk-at-a-time
|
|
95
|
-
hung forever the moment anyone pasted.
|
|
96
|
-
- **Row policies are OR'd, so a permissive catch-all fails open.** A second scoped share
|
|
97
|
-
saw everything. See `memhouse/share.js`.
|
|
98
|
-
- **A skill that reasons about privileges in prose gets it wrong.** Put the logic in a
|
|
99
|
-
command and have the skill call it — that is why `memhouse whoami` and `memhouse share`
|
|
100
|
-
exist.
|
|
101
|
-
- **Never print a credential.** memhouse ships this transcript into the house being
|
|
102
|
-
administered, and the archive is insert-only. Expand a shell variable; never a literal.
|
|
103
|
-
|
|
104
|
-
## Testing before you claim it works
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
npm test # syntax gate + unit checks
|
|
108
|
-
misc/invite-matrix.sh <url> <admin-user> <password> # against a real ClickHouse
|
|
109
|
-
misc/origin-matrix.sh … # the import/ship data guarantees
|
|
110
|
-
memhouse nightly --out /tmp # a real installable tarball
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
`node bin/memhouse.js` from a checkout is **not** the product — the files are laid out
|
|
114
|
-
differently and the design is sitting next to it. Anything about installation, first run,
|
|
115
|
-
or what a user sees must be verified from a built package on a machine without a checkout.
|
|
116
|
-
|
|
117
|
-
CI runs `npm test`, both matrices and a headless e2e across ClickHouse 25.11 and 26.7, on
|
|
118
|
-
ubuntu only. macOS and Windows are untested there; say so rather than implying coverage.
|
|
119
|
-
|
|
120
|
-
## Releasing
|
|
121
|
-
|
|
122
|
-
Version lives in `package.json`, `package-lock.json` and the plugin manifest
|
|
123
|
-
(`memhouse/delivery/plugin/.claude-plugin/plugin.json`). All three move together, along
|
|
124
|
-
with the memhouse.io badges. `## Unreleased` in `CHANGELOG.md` becomes
|
|
125
|
-
`## <version> — <date>`. Tag `v<version>`, push the tag, then publish. A new user-facing
|
|
126
|
-
capability is a **minor** bump; so is a behaviour change like refusing a flag that used
|
|
127
|
-
to be ignored.
|
|
128
|
-
|
|
129
|
-
Every release also has:
|
|
130
|
-
|
|
131
|
-
- **A release document**, `docs/releases/v<version>.md`: what changed, what a user must
|
|
132
|
-
do, the upgrade steps, deprecations with their removal version, and what was deferred.
|
|
133
|
-
The CHANGELOG entry links to it, and the GitHub release uses it as its notes
|
|
134
|
-
(`gh release create v<version> --notes-file docs/releases/v<version>.md`).
|
|
135
|
-
- **The documentation standard:**
|
|
136
|
-
- a short README (what, why, how);
|
|
137
|
-
- `docs/`, with tutorials and guides for common operations;
|
|
138
|
-
- `examples/`, from smallest to full, each with its own README;
|
|
139
|
-
- the agent install section below.
|
|
140
|
-
|
|
141
|
-
A change to a command, a flag or a default updates the guide that describes it in the
|
|
142
|
-
same PR.
|
|
143
|
-
- **A drill** when the release changes a surface a person touches (see above), recorded
|
|
144
|
-
in `drills/`.
|
|
145
|
-
|
|
146
|
-
## Installing and deploying memhouse (for agents)
|
|
3
|
+
This file ships with the npm package. It is for an agent installing memhouse for its
|
|
4
|
+
principal. Working on memhouse itself? The conventions for this repository are in its
|
|
5
|
+
`CONTRIBUTING.md`, which is not part of the package.
|
|
147
6
|
|
|
148
7
|
How an agent installs memhouse for its principal, unattended. Every command takes `--yes`
|
|
149
8
|
and most take `--json`. Follow the first route that applies, and never invent a house.
|
|
@@ -166,7 +25,7 @@ with-secret MEMHOUSE_ADMIN_PASSWORD=<reference> -- \
|
|
|
166
25
|
memhouse deploy --local --yes
|
|
167
26
|
|
|
168
27
|
# Then verify, and keep it running:
|
|
169
|
-
memhouse status --json # connection,
|
|
28
|
+
memhouse status --json # connection, schema, tables, last pass
|
|
170
29
|
memhouse whoami --json # which credential, and what it may do
|
|
171
30
|
memhouse service install # survive reboots
|
|
172
31
|
memhouse plugins install claude --yes
|
|
@@ -175,19 +34,31 @@ memhouse plugins install claude --yes
|
|
|
175
34
|
`memhouse prompt --install` prints an install prompt rendered for the current machine,
|
|
176
35
|
with its state and the one route that applies.
|
|
177
36
|
|
|
37
|
+
Which layout an install lands on is not yours to choose: a new house is schema 3, a house
|
|
38
|
+
on the 0.18 rooms keeps them, and an ambiguous house refuses. Moving a 0.18 house to
|
|
39
|
+
schema 3 is an administrator's procedure, in order: `memhouse migrate --v3-prepare`,
|
|
40
|
+
`--v3-convert`, `--v3-reconcile`, `--v3-shares` (as the admin: `MEMHOUSE_ADMIN_USER` and
|
|
41
|
+
`MEMHOUSE_ADMIN_PASSWORD`, like `invite`), then `--v3-switch` on every machine, as its member
|
|
42
|
+
([`docs/guides/upgrade-to-0.20.md`](docs/guides/upgrade-to-0.20.md)). `memhouse update`
|
|
43
|
+
never does it.
|
|
44
|
+
|
|
178
45
|
Rules:
|
|
179
46
|
|
|
180
47
|
- **Never put a secret in the conversation, in argv, or in a file you write.** memhouse
|
|
181
48
|
ships transcripts into the house, and the archive is insert-only. Take passwords by
|
|
182
49
|
reference (`with-secret`, `MEMHOUSE_ADMIN_PASSWORD`, `--admin-password-file -`). Never
|
|
183
|
-
print `~/.memhouse/env
|
|
50
|
+
print `~/.memhouse/env`, nor the dashboard's `~/.memhouse/dashboard-token` and
|
|
51
|
+
`~/.memhouse/dashboard.html` (`memhouse dashboard` opens the dashboard without showing the
|
|
52
|
+
token). If a secret reaches a transcript, say so and recommend rotation.
|
|
184
53
|
- **Never guess a house.** With no URL from the principal and no invite file, stop and ask.
|
|
185
54
|
Do not point at `localhost:8123` because something answers there.
|
|
186
55
|
- **Destructive commands need the principal's explicit yes, for that object:**
|
|
187
56
|
`memhouse reset`, `deploy --down` (deletes the local house's data),
|
|
188
|
-
`uninstall --full-removal`,
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
57
|
+
`uninstall --full-removal`, the `migrate --v3-*` steps (they fence writers, rename a
|
|
58
|
+
member's rooms and move its grants), and any `DROP`/`DELETE` in SQL. Run the `--dry-run`
|
|
59
|
+
first, report the counts, then ask.
|
|
60
|
+
- **Verify from the outside.** `status --json` and a row count in
|
|
61
|
+
`mem.<member>_sessions FINAL` (schema 3) or `mem.<member>_messages` (the 0.18 rooms) are
|
|
62
|
+
the evidence that it works. A started daemon is not.
|
|
192
63
|
|
|
193
64
|
The user-facing version of all this is in [`docs/guides/install.md`](docs/guides/install.md).
|
package/CHANGELOG.md
CHANGED
|
@@ -4,18 +4,252 @@ Versions before 0.8.0 were beta-only. Beta installs of 0.7.x and earlier should
|
|
|
4
4
|
uninstall and reinstall — the 0.8.0 layout is new, and an in-place `update` +
|
|
5
5
|
migration path is planned work, not a promise the old versions can cash.
|
|
6
6
|
|
|
7
|
-
## 0.
|
|
8
|
-
|
|
9
|
-
Release notes: [`docs/releases/v0.
|
|
10
|
-
|
|
11
|
-
- **
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
7
|
+
## 0.20.1 — 2026-11-02
|
|
8
|
+
|
|
9
|
+
Release notes: [`docs/releases/v0.20.1.md`](docs/releases/v0.20.1.md).
|
|
10
|
+
|
|
11
|
+
- **Dashboard: a browser that refuses sessionStorage still opens it.** The page keeps the token
|
|
12
|
+
in memory for that load when sessionStorage is refused; it used to show the "open it with
|
|
13
|
+
`memhouse dashboard`" page instead.
|
|
14
|
+
- **doctor names the channel when it says a release is the latest.** An unpriced model's hint now
|
|
15
|
+
says "the latest release on '<channel>'", so an install pinned to another line is not told it
|
|
16
|
+
is on the newest release overall. Offline, the hint no longer claims the install is current.
|
|
17
|
+
- **/mem skills: the raw-SQL recipe runs `memhouse room-sql` as written.** The reference's
|
|
18
|
+
schema-2 recipe wrapped it in a `q()` shell function, so every call asked for approval despite
|
|
19
|
+
the skills' pre-approval. It now runs `memhouse room-sql <<'SQL'` directly.
|
|
20
|
+
- **install, invite and `deploy --local` name a refused credential up front.** When the server
|
|
21
|
+
refuses the credential (ClickHouse code 516, or 194 for a missing password), they now stop
|
|
22
|
+
before writing anything with "could not authenticate as '<user>' at <url>", instead of reading
|
|
23
|
+
the house as new and failing at the next step. Code 194 counts as an authentication failure
|
|
24
|
+
everywhere 516 does.
|
|
25
|
+
- **`memhouse <command> --help` prints that command's help.** It used to print the whole page
|
|
26
|
+
for every command. A command with no entry of its own still gets the whole page, and
|
|
27
|
+
`memhouse q --help` lists the named queries (the same as `memhouse q list`).
|
|
28
|
+
- **`memhouse share --list` also lists the shares you received.** Beside who reads your
|
|
29
|
+
sessions, it names each member whose sessions this credential can read, with the command
|
|
30
|
+
that reads them (`memhouse q recent --member <them>`); `--json` adds `received`. An
|
|
31
|
+
administrator is told it reads every member's sessions instead.
|
|
32
|
+
- **`memhouse discover` flags an unreachable house only when it is this install's.** The
|
|
33
|
+
default local address (`http://localhost:8123`) is probed as a discovery; when nothing
|
|
34
|
+
answers there and nothing is configured to use it, it is a plain line, not a ✗. `--json`
|
|
35
|
+
marks each endpoint `configured`.
|
|
36
|
+
- **`memhouse update` on a machine with no member install checks no house.** An
|
|
37
|
+
administrator's machine (only `MEMHOUSE_URL` and the admin variables) used to run the schema
|
|
38
|
+
heal and the migration check as the default member and print its authentication failures as
|
|
39
|
+
the house's state. It now says there is no member install here and skips those steps.
|
|
40
|
+
- **`memhouse members` tells a share from a member's own tables.** Each account's line names its
|
|
41
|
+
own tables, then each member whose sessions it reads ("reads alice's sessions (a share,
|
|
42
|
+
scoped)" or "full", where the row policies can be listed), then any other grant, which
|
|
43
|
+
memhouse does not make itself. A scoped share used to read as a plain list of another
|
|
44
|
+
member's tables. `--json` adds `own`, `shares` and `other`.
|
|
45
|
+
- **A new minor version's first run says so.** The first CLI call of a newer major.minor on a
|
|
46
|
+
machine prints one line to stderr, naming the version it replaces and the shipped release
|
|
47
|
+
notes to read. Patch releases, downgrades and fresh installs say nothing; a stamp in the
|
|
48
|
+
memhouse home (`version-seen`) records the last version that ran. An install from before the
|
|
49
|
+
stamp is read from its home: a 0.18 install moving to 0.20.1 is told "it ran 0.18 or
|
|
50
|
+
earlier".
|
|
51
|
+
- **`memhouse plugins install codex`.** Codex gets a short, marker-delimited block in its
|
|
52
|
+
`AGENTS.md` (never read or print the env file or a `MEMHOUSE_*` value; `MEMHOUSE_URL` is the
|
|
53
|
+
house, `MEMHOUSE_PORT` the dashboard; past sessions go to the skill) and a `memhouse` skill with
|
|
54
|
+
the read recipes, under `CODEX_HOME` or `~/.codex`. `plugins remove codex` takes out exactly
|
|
55
|
+
those: the rest of `AGENTS.md` stays byte-identical, and a `skills/memhouse` that memhouse did
|
|
56
|
+
not install is left alone. Opt-in: nothing is written there unless it ran; the first run of a
|
|
57
|
+
new version refreshes a copy it finds installed. The `/mem` skills stay Claude Code's.
|
|
58
|
+
- **An invite's password expires.** `memhouse invite` sets the new member's password to stop
|
|
59
|
+
working after 7 days (`--expires <days>`, 1 to 365), by the server's clock. The invite's
|
|
60
|
+
output, the invite file and `MEMHOUSE-INVITATION.md` say when. `install --env` lifts the
|
|
61
|
+
expiry when it changes the password, and when `--keep-password` keeps it. An expired invite
|
|
62
|
+
is refused at install with "this invite expired at … ask whoever invited you for a new one",
|
|
63
|
+
before anything is contacted or written. Inviting the same name again says the unused
|
|
64
|
+
account must be removed first (`DROP USER <name>`); its tables are kept and reused.
|
|
65
|
+
`invite --print-sql` prints the same expiry, with a placeholder for the date.
|
|
66
|
+
|
|
67
|
+
## 0.20.0 — 2026-10-29
|
|
68
|
+
|
|
69
|
+
Release notes: [`docs/releases/v0.20.0.md`](docs/releases/v0.20.0.md). Read its "Read this
|
|
70
|
+
before upgrading" first: `memhouse update` installs 0.20 and does not convert the house to schema 3;
|
|
71
|
+
converting a 0.18 house is an admin step, and a house in daily use is converted on its own
|
|
72
|
+
schedule.
|
|
73
|
+
|
|
74
|
+
- **Schema 3.** A session is keyed by its store (machine, editor, the editor's data folder or,
|
|
75
|
+
for OpenCode, its database file, and the session's id). Each member has the six conversation
|
|
76
|
+
tables of the harness-sessions-sql profile (`<m>_session_parts`, `_session_usage`, `_session_links`,
|
|
77
|
+
`_session_lifecycle`, `_calls`, `_sessions`), plus a capture archive in `<db>_archive`
|
|
78
|
+
(`<m>_session_units`, `_session_sources`) holding every byte as captured. A new house is
|
|
79
|
+
schema 3; joining a house follows its layout.
|
|
80
|
+
- **Ten editors through normalisers** (agy, Copilot CLI, Cursor, cursor-agent, Devin, Gemini
|
|
81
|
+
CLI, Goose, OpenCode, VS Code, Zed); Claude Code and Codex natively; the rest through the
|
|
82
|
+
0.18 readers.
|
|
83
|
+
- **The host** is sessions-model/host/v0. The 0.18 id is kept as this machine's alias.
|
|
84
|
+
- **Upgrade commands:** `memhouse migrate --v3-prepare`, `--v3-convert`, `--v3-reconcile`,
|
|
85
|
+
`--v3-shares`, `--v3-switch`; each has `--dry-run` and refuses before changing anything.
|
|
86
|
+
`status` calls a shipper that started before the switch or the install stale, repeats
|
|
87
|
+
`memhouse stop && memhouse start`, and exits 1 while its passes fail; `instance` says when an
|
|
88
|
+
install is stranded on the 0.18 rooms; `q schema` says `none` with no house configured.
|
|
89
|
+
- **Share on schema 3** is `SELECT` on exactly the six conversation tables, full or scoped. It
|
|
90
|
+
never reaches meta, events or the archive. The share commands fail closed.
|
|
91
|
+
- **`MEMHOUSE_URL` is the house, `MEMHOUSE_PORT` the dashboard.** `--help`, the env file and the
|
|
92
|
+
configuration guide say so; the house's port is part of `MEMHOUSE_URL`. The `/mem` skills
|
|
93
|
+
install into Claude Code only, and `--help` and the install guide say how other agents read
|
|
94
|
+
the house (`memhouse q`, `memhouse room-sql`).
|
|
95
|
+
- **Security: member names that collide are refused.** `mem.bob_*` also matches `bob_smith`'s
|
|
96
|
+
tables (read and write; true on 0.18 too). install and invite refuse such a name, doctor
|
|
97
|
+
names an existing pair. Admins: check your members.
|
|
98
|
+
- **Security:** The dashboard now requires a per-user token; a loopback connection alone is no
|
|
99
|
+
longer enough. Open it with `memhouse dashboard`.
|
|
100
|
+
- When the dashboard's port is in use, possibly by another account on this machine, the
|
|
101
|
+
dashboard takes the next free port up to 10 above and says which (`memhouse status` and
|
|
102
|
+
`memhouse dashboard` use it); a dashboard that cannot start is a warning from
|
|
103
|
+
`memhouse start`, not a failure.
|
|
104
|
+
- **Reading an editor's SQLite store never writes into it** (0.18 could leave `-wal`/`-shm`
|
|
105
|
+
files in an editor's folder).
|
|
106
|
+
- **`memhouse import claude-ai`** stores a claude.ai data export in the house: the `.zip`, the
|
|
107
|
+
unpacked export, or an archive folder filed by project. Each conversation becomes a
|
|
108
|
+
`claude-ai` session with origin `import`, in one batch per run.
|
|
109
|
+
- **A dry run unless `--write`.** It prints counts only.
|
|
110
|
+
- **A later export adds only conversations the house does not hold.** `--update` also
|
|
111
|
+
replaces the ones changed since.
|
|
112
|
+
- **Batches.** Each batch is recorded in the member's meta. `--list` shows them, and
|
|
113
|
+
`--undo <batch> --write` tombstones one.
|
|
114
|
+
- **Changed at the same `updated_at`.** A conversation whose content differs from what the
|
|
115
|
+
house holds, at the same `updated_at` (a summary claude.ai added later, a rename), counts as
|
|
116
|
+
changed. An export older than the house's copy never replaces it.
|
|
117
|
+
- **The export's part zips** (`conversations-000.zip`, `design_chats-000.zip`, …) are read as
|
|
118
|
+
given, or from their folder; the older single zip still works.
|
|
119
|
+
- **On the profile tables** (`<m>_session_parts`, `_calls`, `_sessions`) a conversation is a
|
|
120
|
+
session in the service's store: host `s-` plus 32 hex (sessions-model's service host for
|
|
121
|
+
`claude.ai`), `harness_path` `https://claude.ai`, adapter `memhouse-import`. The keys are the
|
|
122
|
+
parser's, as on layout 3.2, and so are the digest and `--update`. A development house's 3.2
|
|
123
|
+
tables are still written; a member with both is written on the profile.
|
|
124
|
+
- **A run that stops part way is finished by the next.** Sessions whose totals were not
|
|
125
|
+
filled are refreshed by the next `--write`, and a batch whose rows all went in then reads
|
|
126
|
+
`applied`. An undo records `undoing` before it starts, so a stopped undo is never taken for a
|
|
127
|
+
stopped write; running it again finishes it.
|
|
128
|
+
- Guide: [`docs/guides/import-claude-ai.md`](docs/guides/import-claude-ai.md).
|
|
129
|
+
- `memhouse q` named queries; `q removed`; the dashboard and `/mem` skills read schema 3.
|
|
130
|
+
- The `/mem` skills write every command as plain `memhouse …`, the form their pre-approved read
|
|
131
|
+
commands match, so those run without a prompt; a share you received is found with `SHOW TABLES`
|
|
132
|
+
and read with `memhouse q … --member <them>`, not looked for with `SHOW DATABASES`.
|
|
133
|
+
- **Deleted sessions on the profile layout** (Claude Code and Codex in 0.20) are recorded as gone,
|
|
134
|
+
their records kept, only when the editor's reader answers that they are not there: a session
|
|
135
|
+
a short list leaves out but the reader still finds is captured as usual. Only a store whose list
|
|
136
|
+
names none of the sessions the house holds of it is refused whole.
|
|
137
|
+
- **The shipper log and doctor say so.** A store the pass refused prints a `vanish refused:`
|
|
138
|
+
line after the pass line and fails `memhouse doctor` until a later pass is clean; a listed
|
|
139
|
+
session's source the list left out that still reads is a `vanish warning:`, shown by doctor
|
|
140
|
+
without failing.
|
|
141
|
+
- **doctor: an unpriced model is a warning.** It no longer fails `memhouse doctor`, and its hint
|
|
142
|
+
names `memhouse update` only when a newer release exists; on the latest release it says the
|
|
143
|
+
model's cost stays unknown until a release prices it.
|
|
144
|
+
- **`memhouse doctor --confirm-empty-store <editor>:<store>`** confirms a store whose every
|
|
145
|
+
session was deleted (an empty list is refused, since an unreadable store gives one too), for
|
|
146
|
+
the sessions its last pass refused.
|
|
147
|
+
- **The archive write** of a pass carries one `captured_at` set by the capture, and writes its
|
|
148
|
+
units before its read manifests, so a replay from the archive alone sees the pass it was.
|
|
149
|
+
- Guide: [`docs/guides/daemons.md`](docs/guides/daemons.md) (Logs).
|
|
150
|
+
- Fixed in the release work: `invite` follows the house's layout; `deploy --local` builds the
|
|
151
|
+
schema-3 tables; a machine without Claude Code or Codex ships its other editors; example 04
|
|
152
|
+
backs up the archive; Gemini CLI tokens use the house split (cached tokens were charged
|
|
153
|
+
twice and thoughts not at all), through the usage flags `input_includes_cache` and
|
|
154
|
+
`output_includes_reasoning` (sessions-model §2.4); `--v3-convert` takes the cached tokens out
|
|
155
|
+
of 0.18's Gemini CLI input, where 0.18 counted them twice (0.18 never stored Gemini's
|
|
156
|
+
thoughts, which cannot be recovered).
|
|
157
|
+
- The invitation page `invite` writes (`MEMHOUSE-INVITATION.md`) lists the tables the invite
|
|
158
|
+
created, by the house's layout, and names the env file the invite wrote (`--out` included)
|
|
159
|
+
instead of `ls invite-*.env`.
|
|
160
|
+
- Fixed in the normalisers: Zed usage is the thread's `cumulative_token_usage`, one per-session
|
|
161
|
+
series kept as appended increments (it took only each turn's last request); Copilot CLI keeps
|
|
162
|
+
a capped reply's usage record and a compaction's own tokens; an unknown Zed message keeps its
|
|
163
|
+
place, so the anchored ids after it do not shift; a Copilot CLI fork ignores the markers it
|
|
164
|
+
copied from its origin. Both normalisers' `VERSION` rose, so a machine that ran a pre-release
|
|
165
|
+
re-derives its Zed and Copilot CLI sessions.
|
|
166
|
+
- Known issues, retired when memhouse reads editors through the harness-session-adapters package: Devin
|
|
167
|
+
token totals exclude abandoned branches in 0.20; seven low-impact normaliser differences
|
|
168
|
+
(Copilot CLI effort, orphan tool results and encrypted reasoning; a VS Code synthetic call id;
|
|
169
|
+
an OpenCode redaction marker and v2 usage basis; optional fields left empty). See the release
|
|
170
|
+
notes.
|
|
171
|
+
- Known issue: a session whose capture state (its `files` row and the machine's capture cache)
|
|
172
|
+
is lost after its log was rewritten repeats its time-less records in `turns`; its totals are
|
|
173
|
+
not affected. See the release notes.
|
|
174
|
+
- Known issue: `memhouse import claude-ai` takes no lock. Run one import or undo per member at a
|
|
175
|
+
time; two at once can split a conversation between two batches or leave a batch's recorded
|
|
176
|
+
status wrong. See the release notes.
|
|
177
|
+
- **Apache-2.0** from this release (below).
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
- **A fork's copied prefix is billed once.** Forks copy their origin's messages, usage included.
|
|
181
|
+
The house used to bill them in both sessions; now the copies are verified on full content and
|
|
182
|
+
billed only in the origin.
|
|
183
|
+
- Explicit links: agy, Copilot CLI. On the profile tables memhouse resolves each into one
|
|
184
|
+
engine edge on the fork (`session_links`, owner `engine`), verifies it, and the rollup leaves
|
|
185
|
+
the fork's copied usage out of its totals. A fork captured before its origin is verified when
|
|
186
|
+
the origin arrives; a rewound origin gives the copies back.
|
|
187
|
+
- Forks without a pointer, found by content (OpenCode, VS Code, cursor-agent, Cursor, Goose):
|
|
188
|
+
a session whose first reply is an earlier session's in the same store is nominated, verified
|
|
189
|
+
the same way, and recorded as an inferred edge; it ends when the verification no longer
|
|
190
|
+
holds. A pass verifies at most 100 nominated forks and owes the rest to the next.
|
|
191
|
+
- The copies stay messages of the fork.
|
|
192
|
+
- A link an editor states (sub-agent, fork, rewind copy, clear, continuation) whose two sessions
|
|
193
|
+
are both in the same store is resolved into one engine edge on the profile tables
|
|
194
|
+
(harness-sessions-sql §4.5), stated on the child's side, the origin's or both. Only forks and rewind
|
|
195
|
+
copies are verified and billed once; the others are lineage. A link to another store gets no
|
|
196
|
+
edge, nor does one whose child cannot be named in the store (not stored by the editor, or an
|
|
197
|
+
id with two lives); one whose origin cannot be resolved gets an unverified edge.
|
|
198
|
+
- **Removed content in view.** `memhouse doctor` reports what is kept as removed versions (a
|
|
199
|
+
revert, a rewind, a message deleted at the source), and the forks billed once.
|
|
200
|
+
`memhouse q removed` lists those messages.
|
|
201
|
+
|
|
202
|
+
- **Read manifests (harness-sessions-sql §4.1).** Every read that opens a generation, or moves a cursor,
|
|
203
|
+
archives a manifest row beside its records. It lists the units the read delivered, so the
|
|
204
|
+
archive alone replays an emptied or shrunk source correctly: before this, a rewrite to empty
|
|
205
|
+
left no row in its generation, and a replay took the previous one. `replayArchive` is that
|
|
206
|
+
replay.
|
|
207
|
+
- A session file the harness deleted stays in the house, and is recorded once as
|
|
208
|
+
`source_gone` with `"policy": "kept"`.
|
|
209
|
+
- A file that comes back is read again from the start.
|
|
210
|
+
- Details: `docs/design/sessions-engine.md` (repository) item 8.
|
|
211
|
+
- **A pass that stops and is run again archives its read once.** A source the stopped pass read
|
|
212
|
+
from scratch (no cursor yet, or a reset) was read again from scratch and archived under a new
|
|
213
|
+
generation, so the archive held the same units twice. A re-read that delivers exactly what the
|
|
214
|
+
generation the stopped pass opened holds now stays in it and moves only its position; other
|
|
215
|
+
content, or a source that vanished in the stopped pass, still opens the next generation.
|
|
216
|
+
Streams, snapshots and empty delta sources were affected.
|
|
217
|
+
- **The profile tables follow harness-sessions-sql v1's types.** `adapter_ver` is the version string an
|
|
218
|
+
adapter states (`0.2.0`), not a number; a link's `child_stored` is null when its statement does
|
|
219
|
+
not say; an archive unit with no original bytes has a null `orig_sha256`. The schema step brings
|
|
220
|
+
an older table to these types (`MODIFY COLUMN`, these three columns only, and the old defaults
|
|
221
|
+
removed). A member retypes its conversation tables itself; the two archive tables need an admin
|
|
222
|
+
(`memhouse install --schema 3 --admin-user …`), and until then the capture writes them in the
|
|
223
|
+
old types and `--ensure-schema` says so. The capture reads an old numeric `adapter_ver` back as
|
|
224
|
+
the version it encodes. Versions have no order, so a row another version of the same adapter
|
|
225
|
+
wrote is an upgrade's, whichever is newer.
|
|
226
|
+
- **An adapter upgrade re-derives a session from its archive, removed versions included.** The
|
|
227
|
+
first pass under a new adapter version replays the session's archived passes one by one under
|
|
228
|
+
that version (harness-sessions-sql §8, "Re-derive from the archive"):
|
|
229
|
+
- every record the new version makes is written again above the house's revs, at the new
|
|
230
|
+
version, whether it is current or a removed version;
|
|
231
|
+
- every key the new version no longer makes is deleted, a removed version included (before
|
|
232
|
+
this, removed versions kept the old version and the old keys, and an old removed key was never
|
|
233
|
+
deleted);
|
|
234
|
+
- a pass that also reads a change replays up to each cursor, then applies the change.
|
|
235
|
+
|
|
236
|
+
- **memhouse is relicensed from MIT to Apache-2.0, from 0.19.0.** That covers the whole
|
|
237
|
+
repository: CLI, shipper, dashboard, tools and docs. Releases up to and including 0.18.11
|
|
238
|
+
remain MIT; that text is kept in `LICENSES/memhouse-MIT-until-0.18.11.txt`.
|
|
239
|
+
- `LICENSE` is the Apache License 2.0, verbatim from apache.org.
|
|
240
|
+
- `NOTICE` credits:
|
|
241
|
+
- agentlytics (Fatih Kadir Akın, MIT as declared in its README;
|
|
242
|
+
`LICENSES/agentlytics-MIT.txt`).
|
|
243
|
+
Every commit by an author other than Ramazan Polat predates the fork at `4cba3d8`
|
|
244
|
+
(2026-06-21);
|
|
245
|
+
- models.dev, the source of `pricing.json` (MIT; `LICENSES/models.dev-MIT.txt`);
|
|
246
|
+
- the dashboard's bundled packages, via `public/THIRD_PARTY_NOTICES.txt`.
|
|
247
|
+
- `package.json` and `ui/package.json` declare `Apache-2.0`. The npm package now also
|
|
248
|
+
ships `NOTICE` and `LICENSES/`, and CI's tarball audit checks for both.
|
|
249
|
+
|
|
250
|
+
- **Security reports go to security@memhouse.io.** `SECURITY.md` and the troubleshooting
|
|
251
|
+
guide name it, and `package.json`'s `bugs` field carries it. `package.json` no longer names
|
|
252
|
+
a repository while the repository is private.
|
|
19
253
|
|
|
20
254
|
## 0.18.11 — 2026-10-10
|
|
21
255
|
|
|
@@ -84,7 +318,7 @@ subagents once.
|
|
|
84
318
|
update for this install" (a tarball is on no registry tag), exited 1, and left the old
|
|
85
319
|
shipper running the old code in memory. `--no-install` no longer needs a channel: the
|
|
86
320
|
files are already in place, and the restart, migrations and schema check run. Found while
|
|
87
|
-
upgrading
|
|
321
|
+
upgrading a test VM from 0.18.9 to a nightly of this release.
|
|
88
322
|
|
|
89
323
|
- **A subagent caught before its first line is written holds its session for one pass.**
|
|
90
324
|
A subagent with no timestamped line ranked last. When its first line then landed with an
|
|
@@ -120,7 +354,7 @@ subagents once.
|
|
|
120
354
|
- An admin given for this command (`--admin-user` or an exported
|
|
121
355
|
`MEMHOUSE_ADMIN_USER`, with its password from a file, stdin, the environment or a
|
|
122
356
|
prompt) still provisions at `--url`.
|
|
123
|
-
- `misc/invite-matrix.sh` points `--url` at a spy server and asserts it receives
|
|
357
|
+
- `misc/invite-matrix.sh` (repository) points `--url` at a spy server and asserts it receives
|
|
124
358
|
nothing but a ping.
|
|
125
359
|
- **The dashboard no longer goes empty on a quiet house (G11).** The stats tables carry a
|
|
126
360
|
one-day TTL and were refreshed only by a pass that shipped something. So a house whose
|
|
@@ -141,7 +375,7 @@ subagents once.
|
|
|
141
375
|
by `seq` arithmetic, which a subagent's block numbering defeats.
|
|
142
376
|
- **`HOUSE.md`'s subagent queries keep to the current parse (A3).** They had no epoch
|
|
143
377
|
filter, so a re-parsed session doubled each subagent's turns.
|
|
144
|
-
- `misc/skill-recipe.sh` now runs these queries verbatim, extracted from the docs, against
|
|
378
|
+
- `misc/skill-recipe.sh` (repository) now runs these queries verbatim, extracted from the docs, against
|
|
145
379
|
fixture rows with a superseded parse and a subagent block.
|
|
146
380
|
|
|
147
381
|
## 0.18.10 — 2026-10-08
|
|
@@ -167,7 +401,7 @@ changed, the upgrade steps, and the status of the 0.18.10 pre-tag list.
|
|
|
167
401
|
it. They also print the env-file lines to hand over, with `MEMHOUSE_INVITE=1` from
|
|
168
402
|
`invite`, so the member's `install --env` offers rotation. A `--member-password` given
|
|
169
403
|
with `--print-sql` is not echoed.
|
|
170
|
-
- `misc/invite-matrix.sh` checks the output of every install, invite and passwd path
|
|
404
|
+
- `misc/invite-matrix.sh` (repository) checks the output of every install, invite and passwd path
|
|
171
405
|
against the real passwords. A unit test fails on any print call that interpolates a
|
|
172
406
|
password variable.
|
|
173
407
|
- **Docs:** `memhouse passwd --member` does not exist. `--member` was accepted and ignored
|
|
@@ -295,7 +529,7 @@ The first release on **one line**: published to `latest` and `team` alike. The f
|
|
|
295
529
|
- **A member's env repairs itself after the move.** `memhouse update` and the shipper's
|
|
296
530
|
startup both notice that `<db>.messages` is gone and `mem.<name>_messages` exists, and
|
|
297
531
|
rewrite `MEMHOUSE_DB=mem`; `doctor` names it. So the member's whole upgrade is one
|
|
298
|
-
command. Rehearsed by `misc/convert-matrix.sh
|
|
532
|
+
command. Rehearsed by `misc/convert-matrix.sh` (repository): a real 0.17.1-built house on 26.7,
|
|
299
533
|
converted, shares intact, isolation intact, the member's old env adopted, 24/24.
|
|
300
534
|
|
|
301
535
|
## 0.18.4 — 2026-09-17
|
|
@@ -385,7 +619,7 @@ the drill taught:
|
|
|
385
619
|
— restart it: memhouse stop && memhouse start`, and a `✗` in doctor.
|
|
386
620
|
- The invitation guide says what to do when an agent's `npm install -g` is blocked by a
|
|
387
621
|
permission classifier: the person runs step 1, the agent continues from step 2.
|
|
388
|
-
- `drills/DRILLBOOK-team-arrival-2026-09-10.md` and the drill record.
|
|
622
|
+
- `drills/DRILLBOOK-team-arrival-2026-09-10.md` and the drill record (repository).
|
|
389
623
|
|
|
390
624
|
## 0.18.1 — 2026-09-08
|
|
391
625
|
|
|
@@ -591,7 +825,7 @@ possible.
|
|
|
591
825
|
is left alone so a shared room still reads.
|
|
592
826
|
|
|
593
827
|
Written with `[[:space:]]` classes, not `\b`: **BSD `sed` does not support `\b`**, and
|
|
594
|
-
the first version matched nothing on macOS. `misc/prefix-skill-recipe.sh` extracts
|
|
828
|
+
the first version matched nothing on macOS. `misc/prefix-skill-recipe.sh` (repository) extracts
|
|
595
829
|
`q()` from the reference and runs it against both layouts — the doc is executable
|
|
596
830
|
because it is load-bearing.
|
|
597
831
|
|
|
@@ -634,7 +868,7 @@ possible.
|
|
|
634
868
|
the skill most likely to produce a number someone acts on, never mentioned it. Schema,
|
|
635
869
|
connection, the three traps and the known measurement gaps now live in one file every
|
|
636
870
|
skill points at. 11,388 words became 5,854.
|
|
637
|
-
- **`/mem:recall` restores a name the canon already carried** (`TERMINOLOGY.md
|
|
871
|
+
- **`/mem:recall` restores a name the canon already carried** (`TERMINOLOGY.md`, repository: `memorecall`
|
|
638
872
|
retired in favour of `/mem:recall`, 2026-07-29). Its description carries every trigger
|
|
639
873
|
phrase the three skills it replaces had, so auto-triggering does not narrow.
|
|
640
874
|
- **The CLI no longer advertises a directory as a skill.** `plugins` listed
|
|
@@ -847,7 +1081,7 @@ possible.
|
|
|
847
1081
|
|
|
848
1082
|
- **`memhouse relocate --to <url>` moves a whole house to a new ClickHouse.** The copy is
|
|
849
1083
|
a server-to-server `remoteSecure()` INSERT SELECT — the destination pulls each room
|
|
850
|
-
directly from the source over the native protocol, so the
|
|
1084
|
+
directly from the source over the native protocol, so the user's laptop is never in the
|
|
851
1085
|
data path and, crucially, **the shipper never re-ingests**: once the new host holds a
|
|
852
1086
|
faithful copy, the shipper's skip predicate sees every old session already present and
|
|
853
1087
|
ships only genuinely new work. Provenance is carried, not restamped
|
|
@@ -858,12 +1092,12 @@ possible.
|
|
|
858
1092
|
SOURCE is only ever read — a failed run leaves the old house intact — and a hard
|
|
859
1093
|
row-count gate must pass before the local config is repointed (the previous env is kept
|
|
860
1094
|
as `env.pre-relocate`). Flags: `--to-user/--to-password/--to-db`, `--from-native-host`
|
|
861
|
-
(when the destination's route to the source differs from the
|
|
1095
|
+
(when the destination's route to the source differs from the user's URL),
|
|
862
1096
|
`--from-native-port` (default 9440 TLS), `--insecure-native` (`remote()` + 9000),
|
|
863
1097
|
`--keep-shipper`, `--dry-run`, `--yes`. The source password reaches the destination's
|
|
864
1098
|
`query_log` (never this transcript) — rotate it after if those logs are not yours.
|
|
865
1099
|
- This is the host-to-host data-copy piece named in
|
|
866
|
-
`docs/design/host-repoint-reconciliation.md
|
|
1100
|
+
`docs/design/host-repoint-reconciliation.md` (repository); the reconciliation gate (detecting an
|
|
867
1101
|
*accidental* repoint at an empty host) remains deferred.
|
|
868
1102
|
|
|
869
1103
|
## 0.11.3 — 2026-08-20
|
|
@@ -954,7 +1188,7 @@ possible.
|
|
|
954
1188
|
it detects what the house needs: `--migrate` (or `--yes`) runs them unasked,
|
|
955
1189
|
an interactive session is asked once (the inner confirm is not repeated), and a
|
|
956
1190
|
non-interactive run only names them and prints the command — a cron must never start
|
|
957
|
-
a house-wide copy on its own. `update --no-install` skips the npm/git step for
|
|
1191
|
+
a house-wide copy on its own. `update --no-install` skips the npm/git step for users
|
|
958
1192
|
who already upgraded by hand and want the half a bare `npm i -g` leaves undone.
|
|
959
1193
|
- **`memhouse uninstall` asks first.** It used to start removing the service the moment
|
|
960
1194
|
it was typed. It now prints exactly what the chosen tier removes and keeps (the house
|
|
@@ -979,8 +1213,8 @@ possible.
|
|
|
979
1213
|
a pre-0.10 machine still writing.
|
|
980
1214
|
- **The plugin is `mem` now, and it answers questions.** Skills install as `/mem:ask`,
|
|
981
1215
|
`/mem:search`, `/mem:sessions`, `/mem:sql` (the `mem` short name belonged to the
|
|
982
|
-
retired memory-house and moves to the living product).
|
|
983
|
-
relevant past sessions, read the transcripts, answer with citations — the synthesis is
|
|
1216
|
+
retired memory-house, the predecessor tool of memhouse, and moves to the living product).
|
|
1217
|
+
`/mem:ask` is new: retrieve the relevant past sessions, read the transcripts, answer with citations — the synthesis is
|
|
984
1218
|
the agent's; memhouse itself still runs no LLM anywhere. The installer removes a
|
|
985
1219
|
pre-0.10 `skills/memhouse/` copy (only when it is provably ours) so the old and new
|
|
986
1220
|
namespaces never load side by side.
|
|
@@ -1005,7 +1239,7 @@ possible.
|
|
|
1005
1239
|
looks for `origin`), but its delete-before-reinsert reaches every retained parse of a
|
|
1006
1240
|
session it re-ships. `memhouse migrate` warns about this at migration time.
|
|
1007
1241
|
- **`memhouse migrate-rooms`** rebuilds rooms whose sorting key predates this version:
|
|
1008
|
-
copy, one atomic `RENAME`, old room kept as `<room>_pre_epoch` for the
|
|
1242
|
+
copy, one atomic `RENAME`, old room kept as `<room>_pre_epoch` for the user to drop.
|
|
1009
1243
|
Nothing is deleted, and `user_id` is carried across explicitly rather than restamped —
|
|
1010
1244
|
it is `MATERIALIZED currentUser()`, so a plain `INSERT SELECT` would reassign every row
|
|
1011
1245
|
in a shared house to whoever ran the migration. Rows a running shipper writes during the
|
|
@@ -1031,7 +1265,7 @@ now the whole install.
|
|
|
1031
1265
|
- **`--allow-scripts=better-sqlite3` is retired.** It was required on every install and
|
|
1032
1266
|
every upgrade, npm never remembered it, and omitting it left cursor, zed, opencode,
|
|
1033
1267
|
goose and antigravity reading zero sessions — indistinguishable from editors the
|
|
1034
|
-
|
|
1268
|
+
user does not have. That failure class no longer exists, so the probe that reported
|
|
1035
1269
|
it (`MISSING_BINDING`, `probeSqlite`) and the `missingBinding` flag on every
|
|
1036
1270
|
`getAdapterErrors()` entry are removed. Per-store failures — locking, permissions,
|
|
1037
1271
|
corruption, schema drift — are reported exactly as before.
|
|
@@ -1100,7 +1334,7 @@ now the whole install.
|
|
|
1100
1334
|
messages/tool_calls sorting keys and bound in the shipper's clear. The bug this fixed
|
|
1101
1335
|
destroyed 27,948 imported messages in a single pass.
|
|
1102
1336
|
- Local house delivery (`deploy --local`, docker/podman), OS service integration,
|
|
1103
|
-
the herdr-driven acceptance suite, `memhouse.io`.
|
|
1337
|
+
the herdr-driven acceptance suite (repository), `memhouse.io`.
|
|
1104
1338
|
|
|
1105
1339
|
## 0.3.x — 2026-07-22 → 2026-07-31
|
|
1106
1340
|
|