memhouse 0.4.4 → 0.7.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/README.md +244 -114
- package/bin/memhouse.js +1177 -231
- package/editors/base.js +6 -0
- package/editors/claude.js +44 -9
- package/editors/goose.js +4 -0
- package/editors/index.js +0 -0
- package/editors/opencode.js +3 -0
- package/{mem-house → memhouse}/COMPETITION.md +5 -5
- package/{mem-house → memhouse}/DESIGN.md +18 -12
- package/memhouse/RESUME-AND-UPDATE.md +185 -0
- package/{mem-house → memhouse}/delivery/AGENT-INSTALL-PROMPT.md +1 -1
- package/{mem-house → memhouse}/delivery/AGENT-INSTALL.md +9 -7
- package/{mem-house → memhouse}/delivery/PROMPT.md +8 -8
- package/{mem-house → memhouse}/delivery/kernel-install.md +3 -3
- package/{mem-house → memhouse}/delivery/plugin/.claude-plugin/plugin.json +1 -1
- package/{mem-house/delivery/skills/memhouse-search → memhouse/delivery/plugin/skills/search}/SKILL.md +60 -18
- package/memhouse/delivery/plugin/skills/sessions/SKILL.md +177 -0
- package/memhouse/delivery/plugin/skills/sql/SKILL.md +206 -0
- package/memhouse/host.js +101 -0
- package/{mem-house → memhouse}/per-member/INSTALL.md +59 -14
- package/{mem-house → memhouse}/per-member/SCHEMA.md +47 -0
- package/{mem-house → memhouse}/per-member/SHARING.md +47 -0
- package/memhouse/per-member/provision.js +297 -0
- package/memhouse/per-member/rooms.js +252 -0
- package/{mem-house → memhouse}/per-member/schema-member.sql.tpl +18 -14
- package/{mem-house → memhouse}/per-member/schema-merge.sql.tpl +3 -3
- package/memhouse/resume.js +150 -0
- package/memhouse/self-update.js +150 -0
- package/{mem-house → memhouse}/server/queries.js +80 -34
- package/memhouse/server/server.js +451 -0
- package/{mem-house → memhouse}/service.js +48 -29
- package/memhouse/shipper/ship.js +949 -0
- package/package.json +5 -20
- package/public/assets/{index-CtH-5i95.js → index-CnWzrjF3.js} +10 -7
- package/public/index.html +2 -2
- package/ui/index.html +1 -1
- package/ui/src/App.jsx +1 -1
- package/ui/src/lib/api.js +29 -13
- package/ui/src/pages/Dashboard.jsx +8 -5
- package/ui/src/pages/Sessions.jsx +3 -1
- package/ui/src/pages/SqlViewer.jsx +6 -23
- package/cache.js +0 -850
- package/ch-ingest.js +0 -329
- package/ch-schema.js +0 -152
- package/clickhouse.js +0 -87
- package/index.js +0 -425
- package/mcp-server.js +0 -294
- package/mem-house/delivery/install.sh +0 -183
- package/mem-house/delivery/skills/memhouse-sessions/SKILL.md +0 -125
- package/mem-house/delivery/skills/memhouse-sql/SKILL.md +0 -146
- package/mem-house/per-member/provision.js +0 -142
- package/mem-house/per-member/rooms.js +0 -132
- package/mem-house/server/server.js +0 -228
- package/mem-house/shipper/ship.js +0 -566
- package/relay-client.js +0 -306
- package/relay-server.js +0 -577
- package/server.js +0 -860
- package/share-image.js +0 -367
- /package/{mem-house → memhouse}/deploy.js +0 -0
- /package/{mem-house → memhouse}/envfile.js +0 -0
- /package/{mem-house → memhouse}/per-member/PLAN.md +0 -0
- /package/{mem-house → memhouse}/per-member/PROVISIONING.md +0 -0
- /package/{mem-house → memhouse}/per-member/README.md +0 -0
package/README.md
CHANGED
|
@@ -1,152 +1,282 @@
|
|
|
1
1
|
# memhouse
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
**One house, a set of rooms per member.** Each member owns
|
|
10
|
-
`sessions_<them>`, `messages_<them>`, `tool_calls_<them>`, and holds grants on
|
|
11
|
-
those and nothing else — isolation is a grant that is simply absent, so it fails
|
|
12
|
-
closed. All of *your* machines ship into *your* rooms (the `host` column tells them
|
|
13
|
-
apart); another member's machines never do. A team-wide read is a `Merge` room plus
|
|
14
|
-
a `GRANT`, which narrows to whatever the caller can already see.
|
|
15
|
-
|
|
16
|
-
There is no shared-table layout. That was memory-house's model and 0.4.0 removed it.
|
|
17
|
-
|
|
18
|
-
An **agency** in the constellation sense (`TERMINOLOGY.md`): a **house** — the
|
|
19
|
-
`mem` database — plus a **resident** working in it, the shipper. The test is
|
|
20
|
-
what writes. The shipper fires on its own loop and puts rows in the house that
|
|
21
|
-
outlive any query; everything else here is only ever read. The house alone would
|
|
22
|
-
hold; the shipper is what makes it act.
|
|
23
|
-
|
|
24
|
-
An alternative agency **competing with memory-house**; if it wins, it becomes
|
|
25
|
-
memory-house v4. Start with `mem-house/DESIGN.md` for the four bets
|
|
26
|
-
(parse-on-client, typed common schema, kernel-agency, borrowed UI).
|
|
3
|
+
Long-term memory for coding agents. memhouse reads the session transcripts your
|
|
4
|
+
editors already write to disk — **17 of them**, Claude Code, Codex, Cursor, Zed,
|
|
5
|
+
Copilot, Gemini CLI and the rest — parses them locally, and ships typed rows into
|
|
6
|
+
ClickHouse. Nothing is proxied or intercepted. Then you can search every past
|
|
7
|
+
session, see what it cost, and let an agent query its own history.
|
|
27
8
|
|
|
28
|
-
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g memhouse --allow-scripts=better-sqlite3
|
|
11
|
+
memhouse onboard
|
|
12
|
+
```
|
|
29
13
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
| `editors/` | the 17 editor adapters (inherited from agentlytics; the crown jewels) |
|
|
34
|
-
| `pricing.js` + `pricing.json` | the cost engine |
|
|
35
|
-
| `ui/` | the dashboard SPA (built to `public/`, served unchanged by the memhouse server) |
|
|
36
|
-
| `agency/` | the earlier agentlytics-agency wrap (raw canonical shape) — kept as prior art |
|
|
37
|
-
| `TERMINOLOGY.md` | the constellation terminology canon + how it applies here |
|
|
38
|
-
| everything else at root | upstream agentlytics (see `AGENTLYTICS-README.md`), still runnable |
|
|
14
|
+
That is the whole install. `onboard` finds your editors, sets up a house, ships,
|
|
15
|
+
and starts the dashboard. **Don't drop `--allow-scripts`** — see
|
|
16
|
+
[below](#the-allow-scripts-flag).
|
|
39
17
|
|
|
40
|
-
|
|
18
|
+
**On most Linux distros that first line needs `sudo`.** A distro-packaged Node puts
|
|
19
|
+
its global prefix under `/usr`, which you do not own, so npm stops with `EACCES`.
|
|
20
|
+
That is the single most likely place a first install stalls — measured on a clean
|
|
21
|
+
Ubuntu machine:
|
|
41
22
|
|
|
42
23
|
```bash
|
|
43
|
-
npm
|
|
44
|
-
|
|
24
|
+
ls -ld "$(npm prefix -g)" # root-owned? use sudo. Owned by you? do NOT — see EACCES below
|
|
25
|
+
sudo npm install -g memhouse --allow-scripts=better-sqlite3
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
If the prefix is yours (Homebrew, fnm, nvm, volta), `sudo` is the wrong fix and
|
|
29
|
+
makes it worse — [EACCES on install](#eacces-on-install) tells them apart.
|
|
30
|
+
|
|
31
|
+
## No ClickHouse yet?
|
|
32
|
+
|
|
33
|
+
`onboard` offers to run one for you if docker or podman is present:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
memhouse deploy --local # a loopback-bound ClickHouse, then install and ship
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Otherwise point at one you already run, or hand the SQL to whoever administers it:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
memhouse install --url https://… --user … --password … # one you have
|
|
43
|
+
memhouse install --admin-user … --admin-password … # let memhouse build it
|
|
44
|
+
memhouse install --print-sql # print the SQL, run it yourself
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
memhouse does not embed a database. If you have neither a ClickHouse nor a
|
|
48
|
+
container engine, install one of the two.
|
|
49
|
+
|
|
50
|
+
## Commands
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
memhouse onboard | install | setup | discover | doctor | uninstall | reset
|
|
54
|
+
memhouse ship [--full|--loop N] | search <terms> | stats | status
|
|
55
|
+
memhouse resume <session-id> print the command that reopens a session
|
|
56
|
+
memhouse update [--check] upgrade, restart daemons, check the schema
|
|
57
|
+
memhouse start | stop dashboard + shipper as daemons
|
|
58
|
+
memhouse service install | uninstall survive a reboot
|
|
59
|
+
memhouse deploy --local | --down stand up (or remove) a local house
|
|
60
|
+
memhouse plugins install claude /memhouse:search, :sessions, :sql —
|
|
61
|
+
into every Claude Code config dir found
|
|
62
|
+
memhouse prompt memory snippet for an agent's system prompt
|
|
63
|
+
memhouse prompt --install an install prompt, rendered for this machine
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Every command works both ways: interactive for you, `--yes` / flags / `--json` for
|
|
67
|
+
an agent — so an agent can install its own memory unattended.
|
|
68
|
+
|
|
69
|
+
`onboard` offers the skills at the end, and `plugins` works across **every Claude Code
|
|
70
|
+
config directory on the machine** — `~/.claude`, whatever `CLAUDE_CONFIG_DIR` points
|
|
71
|
+
at, and each Kommander-style playbook under `~/.claude-playbooks/`. All are selected by
|
|
72
|
+
default; answer with numbers to narrow it, or pass `--target DIR` for exactly one.
|
|
73
|
+
Installing into just the default config is how `/memhouse:search` ends up missing from
|
|
74
|
+
the instance you actually work in, silently, since a missing skill never announces
|
|
75
|
+
itself.
|
|
76
|
+
|
|
77
|
+
Config resolves: flags → `MEMHOUSE_*` env → `$MEMHOUSE_HOME/env` (default
|
|
78
|
+
`~/.memhouse/env`). There is no house-shaped default: with nothing configured, the
|
|
79
|
+
commands that read or write memory refuse and say so rather than guessing
|
|
80
|
+
`localhost:8123`, which on a lot of machines is a real house belonging to someone else.
|
|
81
|
+
|
|
82
|
+
## Going back into a session
|
|
83
|
+
|
|
84
|
+
`search` finds the conversation; `resume` hands you back into it.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
memhouse resume claude:6b1f… # prints: cd /path/to/project && claude --resume 6b1f…
|
|
45
88
|
```
|
|
46
89
|
|
|
47
|
-
**
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
install scripts by default, so without the flag those five read nothing and you
|
|
51
|
-
silently ship a partial history. `memhouse discover` and `memhouse doctor` both
|
|
52
|
-
say so when the binding is missing.
|
|
90
|
+
It **prints** the command instead of running it. A resume run from the wrong directory
|
|
91
|
+
or with a stale id does not fail — it opens a *new* session, and the transcript you
|
|
92
|
+
wanted is still gone while the tool reports success. You paste it, so you see it first.
|
|
53
93
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
94
|
+
Verified for **claude, codex and opencode**. Cursor, Zed, VS Code, Kiro, Copilot for
|
|
95
|
+
JetBrains, Antigravity and Devin/Windsurf have no CLI that takes a session id, so
|
|
96
|
+
there is nothing to resume into and `resume` says exactly that, rather than opening a
|
|
97
|
+
folder and calling it the same thing. Everything else — goose, gemini-cli,
|
|
98
|
+
cursor-agent, copilot-cli — is refused as *unverified*, which is a different sentence
|
|
99
|
+
on purpose: nobody has read the flag out of its own `--help` yet, and guessing is how
|
|
100
|
+
you print a command that quietly does the wrong thing. See `memhouse/resume.js`.
|
|
101
|
+
|
|
102
|
+
## Which machine is which
|
|
103
|
+
|
|
104
|
+
All of *your* machines ship into *your* rooms, and the `host` column is what tells them
|
|
105
|
+
apart. So each install writes `~/.memhouse/host.json` — a random fingerprint, minted once
|
|
106
|
+
— and every row that machine ships carries `<hostname>-<8 hex>` built from it.
|
|
107
|
+
|
|
108
|
+
Random, not derived, because deriving it fails in both directions: two laptops that both
|
|
109
|
+
answer to the default `MacBook-Pro` on the same platform hash to the **same** id and merge
|
|
110
|
+
into one apparent machine, and renaming a machine **moves** a derived id so its own history
|
|
111
|
+
appears to stop and a stranger's to begin. A stored fingerprint cannot collide and does not
|
|
112
|
+
move — rename the machine and `status` says so while the id stays put.
|
|
60
113
|
|
|
61
114
|
```bash
|
|
62
|
-
|
|
115
|
+
memhouse status # ✓ host: macminim-4127a95b
|
|
116
|
+
memhouse doctor # names every host in your rooms, and whether this one is among them
|
|
63
117
|
```
|
|
64
118
|
|
|
65
|
-
|
|
66
|
-
packages under `/usr`). Re-run with `sudo`.
|
|
67
|
-
- **Prefix root owned by you** — the prefix is yours (Homebrew, fnm, nvm, volta),
|
|
68
|
-
so whatever root-owned file npm tripped on is a stray from an earlier `sudo npm`.
|
|
69
|
-
Another `sudo` adds more of them. Repair just that path:
|
|
70
|
-
`sudo chown -R "$(id -u):$(id -g)" <the path npm named>`. The same applies to the
|
|
71
|
-
cache (`~/.npm`).
|
|
119
|
+
Then query one machine with `WHERE host = 'macminim-4127a95b'`.
|
|
72
120
|
|
|
73
|
-
|
|
74
|
-
|
|
121
|
+
## Uninstalling, in three tiers
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
memhouse uninstall # stop everything; KEEP the config and this host's identity
|
|
125
|
+
memhouse uninstall --credentials # also forget the house and its password
|
|
126
|
+
memhouse uninstall --full-removal # all of ~/.memhouse, identity included
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
The default is deliberately the conservative one. Stopping the shipper is routine — before
|
|
130
|
+
an upgrade, while debugging, when a laptop should go quiet for a week — and it should not
|
|
131
|
+
also mean "forget which house I use and who this machine is". `--full-removal` asks first,
|
|
132
|
+
because a later reinstall mints a **new** identity and this machine then reads as two
|
|
133
|
+
machines in your history.
|
|
134
|
+
|
|
135
|
+
**No tier touches your memory.** Transcripts live in ClickHouse, and everything the shipper
|
|
136
|
+
wrote rebuilds from the local session stores with `ship --full`.
|
|
137
|
+
|
|
138
|
+
## Staying current
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
memhouse update # upgrade, restart the daemons, check the house schema
|
|
142
|
+
memhouse update --check # compare versions, change nothing
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
A bare `npm i -g memhouse@latest` does one third of the job. It does not re-pass
|
|
146
|
+
`--allow-scripts=better-sqlite3`, so the five SQLite adapters go quiet; it does not
|
|
147
|
+
restart the daemons, which keep parsing with the code they booted with (a shipper here
|
|
148
|
+
once ran 1d16h out of a directory that had been *moved*); and it does not check whether
|
|
149
|
+
your house predates a room the new shipper needs. `update` does all three, and from a
|
|
150
|
+
checkout it rebuilds `public/` — otherwise `git pull` serves you the previous release's
|
|
151
|
+
dashboard forever.
|
|
152
|
+
|
|
153
|
+
The daemons also notice on their own: each one compares the installed version against
|
|
154
|
+
what it booted with and hands over — exiting under systemd/launchd so the supervisor
|
|
155
|
+
restarts it, re-execing itself when nothing is supervising. `update` just makes it
|
|
156
|
+
immediate.
|
|
157
|
+
|
|
158
|
+
## How your memory is stored
|
|
159
|
+
|
|
160
|
+
**One house, one set of rooms per member.** You own `sessions_<you>`,
|
|
161
|
+
`messages_<you>`, `tool_calls_<you>` in the `mem` database, and hold grants on
|
|
162
|
+
those and nothing else. Isolation is a grant that is simply *absent*, so it fails
|
|
163
|
+
closed — no row policy that has to be right on every table and every read path.
|
|
164
|
+
|
|
165
|
+
All of *your* machines ship into *your* rooms; the `host` column tells them apart.
|
|
166
|
+
Another member's machines never do. A team-wide read is a `Merge` room
|
|
167
|
+
(`all_sessions`) plus a `GRANT`, which narrows to whatever the caller can already
|
|
168
|
+
see. Sharing a whole room needs no operator.
|
|
169
|
+
|
|
170
|
+
The member name comes from the server — `SELECT currentUser()` — not from your
|
|
171
|
+
config. A client that could name its own member could write into someone else's
|
|
172
|
+
rooms.
|
|
173
|
+
|
|
174
|
+
### Imported history is protected
|
|
175
|
+
|
|
176
|
+
Rows carry an `origin`. The shipper clears a session before re-inserting it, so a
|
|
177
|
+
shorter re-parse can't leave a stale tail behind — but that clear only removes rows
|
|
178
|
+
the shipper itself wrote (`origin='ship'`). Anything you imported from an older
|
|
179
|
+
house, another product, or a machine that no longer exists survives a re-ship.
|
|
180
|
+
|
|
181
|
+
`origin` is in the sorting key of `messages` and `tool_calls` too, so
|
|
182
|
+
ReplacingMergeTree can't quietly collapse an imported row against a shipped one. Both
|
|
183
|
+
halves matter: guarding only the delete still loses data, through the merge instead of
|
|
184
|
+
the mutation.
|
|
185
|
+
|
|
186
|
+
`sessions` is the deliberate exception — one row per session, no `origin` in its key.
|
|
187
|
+
A session's metadata has a single current version, and keying it on origin gives the
|
|
188
|
+
same session two rows, which makes every rollup count its messages twice.
|
|
189
|
+
|
|
190
|
+
The shipper checks both directions before it writes and prints the rebuild if a house
|
|
191
|
+
has it wrong, so an old house cannot be corrupted by a new shipper.
|
|
192
|
+
|
|
193
|
+
## Troubleshooting
|
|
194
|
+
|
|
195
|
+
### The `--allow-scripts` flag
|
|
196
|
+
|
|
197
|
+
Five adapters — **cursor, zed, opencode, goose, antigravity** — read sessions out
|
|
198
|
+
of SQLite files, and `better-sqlite3` builds its native binding from an install
|
|
199
|
+
script. npm 12 blocks install scripts by default, so without the flag those five
|
|
200
|
+
read nothing and you ship a partial history.
|
|
201
|
+
|
|
202
|
+
(This said six and named windsurf, which is wrong: windsurf lists its sessions over
|
|
203
|
+
language-server RPC and touches SQLite only to read a usage key, so a dead binding
|
|
204
|
+
costs it numbers, not sessions. `editors/index.js` has the real list.)
|
|
205
|
+
|
|
206
|
+
It is not silent: `memhouse discover` and `memhouse doctor` both name the skipped
|
|
207
|
+
adapters. The other twelve adapters keep working.
|
|
208
|
+
|
|
209
|
+
`npx` takes the same flag, before the package name:
|
|
75
210
|
|
|
76
211
|
```bash
|
|
77
212
|
npx --allow-scripts=better-sqlite3 -y memhouse discover
|
|
78
213
|
```
|
|
79
214
|
|
|
80
|
-
|
|
81
|
-
covers the binding), then `node bin/memhouse.js …`. `npm test` is a syntax gate plus
|
|
82
|
-
unit checks; `misc/tier-matrix-test.sh` walks the tier/ownership matrix against a real
|
|
83
|
-
container engine on Linux and takes a few minutes, so it is not part of `npm test`.
|
|
215
|
+
### `EACCES` on install
|
|
84
216
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
memhouse service install | uninstall | status # survive a reboot
|
|
217
|
+
`sudo` is right for only one of the two causes, and what tells them apart is **who
|
|
218
|
+
owns the prefix root** — not the path, and not the file npm named.
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
ls -ld "$(npm prefix -g)"
|
|
91
222
|
```
|
|
92
223
|
|
|
93
|
-
|
|
224
|
+
- **Owned by `root`** — a system-managed Node (distro packages under `/usr`).
|
|
225
|
+
Re-run with `sudo`.
|
|
226
|
+
- **Owned by you** — the prefix is yours (Homebrew, fnm, nvm, volta), so the
|
|
227
|
+
root-owned file npm tripped on is a stray from an earlier `sudo npm`. Another
|
|
228
|
+
`sudo` adds more. Repair just that path:
|
|
229
|
+
`sudo chown -R "$(id -u):$(id -g)" <the path npm named>`. Same for `~/.npm`.
|
|
94
230
|
|
|
95
|
-
|
|
96
|
-
is
|
|
231
|
+
The path proves nothing on its own: Homebrew's prefix is `/usr/local` on Intel and
|
|
232
|
+
`/opt/homebrew` on Apple Silicon, and is yours in both cases.
|
|
97
233
|
|
|
98
|
-
|
|
99
|
-
|---|---|---|
|
|
100
|
-
| `deploy --local` | stock ClickHouse in docker or podman, loopback-bound | one machine, or several members later |
|
|
101
|
-
| kernel install | an agency house on an ultimagent kernel | a team, provisioned centrally |
|
|
102
|
-
| point at your own | any reachable ClickHouse — a server, ClickHouse Cloud | you already have one |
|
|
234
|
+
### Daemons don't survive a reboot
|
|
103
235
|
|
|
104
|
-
`
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
answer, and half the defects found reviewing this branch came from it.
|
|
236
|
+
`memhouse start` detaches with pidfiles — they outlive the shell, not a restart.
|
|
237
|
+
`memhouse service install` writes a real user service instead (systemd `--user`,
|
|
238
|
+
or a launchd LaunchAgent) and takes over. On Linux a `--user` unit stops at logout
|
|
239
|
+
unless lingering is on; install detects that and prints the `loginctl` command.
|
|
109
240
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
somebody else's data.
|
|
241
|
+
A rootless podman house has the same problem for the same reason, and
|
|
242
|
+
`deploy --local` says so.
|
|
113
243
|
|
|
114
|
-
|
|
244
|
+
## Working from a checkout
|
|
115
245
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
246
|
+
```bash
|
|
247
|
+
npm install # the repo's allowScripts field covers the binding
|
|
248
|
+
node bin/memhouse.js …
|
|
249
|
+
npm test # syntax gate + unit checks
|
|
250
|
+
```
|
|
121
251
|
|
|
122
|
-
|
|
252
|
+
`misc/origin-matrix.sh <label> <url> <user> <pass>` checks the import-protection
|
|
253
|
+
guarantees against a real ClickHouse. `misc/tier-matrix-test.sh` walks the
|
|
254
|
+
tier/ownership matrix against a real container engine on Linux. Both take minutes
|
|
255
|
+
and are not part of `npm test`.
|
|
123
256
|
|
|
124
|
-
|
|
125
|
-
`tool_calls_alice`. This is the only layout. Isolation is a grant that is simply
|
|
126
|
-
absent, not a row policy that has to be right on every table and every read path, so it
|
|
127
|
-
fails closed. A shared read is a Merge room (`all_sessions`) plus a GRANT, which reduces
|
|
128
|
-
to whatever rooms the caller can already read — strictly less machinery than the policy
|
|
129
|
-
it replaced.
|
|
257
|
+
## Layout
|
|
130
258
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
`memhouse
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
259
|
+
| Path | What |
|
|
260
|
+
|---|---|
|
|
261
|
+
| `memhouse/` | the product — `DESIGN.md`, `per-member/`, `shipper/`, `server/`, `delivery/` |
|
|
262
|
+
| `editors/` | the 17 editor adapters (inherited from agentlytics; the crown jewels) |
|
|
263
|
+
| `pricing.js` + `pricing.json` | the cost engine |
|
|
264
|
+
| `ui/` | the dashboard SPA (built to `public/`, served by the memhouse server) |
|
|
265
|
+
| `agency/` | the earlier agentlytics-agency wrap — prior art, not how memhouse works |
|
|
266
|
+
| `TERMINOLOGY.md` | the constellation terminology canon |
|
|
137
267
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
`memhouse
|
|
141
|
-
|
|
268
|
+
Deeper reading: `memhouse/DESIGN.md` (the four bets),
|
|
269
|
+
`memhouse/per-member/INSTALL.md` (the three install paths and every refusal),
|
|
270
|
+
`memhouse/per-member/SCHEMA.md`, `memhouse/delivery/kernel-install.md`,
|
|
271
|
+
`memhouse/COMPETITION.md`.
|
|
142
272
|
|
|
143
|
-
|
|
144
|
-
`
|
|
145
|
-
|
|
273
|
+
In constellation terms (`TERMINOLOGY.md`) memhouse is an **agency**: a **house**
|
|
274
|
+
— the `mem` database — plus a **resident** working in it, the shipper. The house
|
|
275
|
+
alone would hold; the shipper is what makes it act. It competes with
|
|
276
|
+
memory-house; if it wins, it becomes memory-house v4.
|
|
146
277
|
|
|
147
278
|
## Heritage & license
|
|
148
279
|
|
|
149
280
|
Built on [agentlytics](https://github.com/f/agentlytics) by Fatih Kadir Akın (MIT)
|
|
150
|
-
— the adapters, dashboard, and cost engine come from there
|
|
151
|
-
carries the full lineage
|
|
152
|
-
mirror for syncing adapter improvements both ways.
|
|
281
|
+
— the adapters, dashboard, and cost engine come from there, and this repo's history
|
|
282
|
+
carries the full lineage. MIT.
|