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.
Files changed (63) hide show
  1. package/README.md +244 -114
  2. package/bin/memhouse.js +1177 -231
  3. package/editors/base.js +6 -0
  4. package/editors/claude.js +44 -9
  5. package/editors/goose.js +4 -0
  6. package/editors/index.js +0 -0
  7. package/editors/opencode.js +3 -0
  8. package/{mem-house → memhouse}/COMPETITION.md +5 -5
  9. package/{mem-house → memhouse}/DESIGN.md +18 -12
  10. package/memhouse/RESUME-AND-UPDATE.md +185 -0
  11. package/{mem-house → memhouse}/delivery/AGENT-INSTALL-PROMPT.md +1 -1
  12. package/{mem-house → memhouse}/delivery/AGENT-INSTALL.md +9 -7
  13. package/{mem-house → memhouse}/delivery/PROMPT.md +8 -8
  14. package/{mem-house → memhouse}/delivery/kernel-install.md +3 -3
  15. package/{mem-house → memhouse}/delivery/plugin/.claude-plugin/plugin.json +1 -1
  16. package/{mem-house/delivery/skills/memhouse-search → memhouse/delivery/plugin/skills/search}/SKILL.md +60 -18
  17. package/memhouse/delivery/plugin/skills/sessions/SKILL.md +177 -0
  18. package/memhouse/delivery/plugin/skills/sql/SKILL.md +206 -0
  19. package/memhouse/host.js +101 -0
  20. package/{mem-house → memhouse}/per-member/INSTALL.md +59 -14
  21. package/{mem-house → memhouse}/per-member/SCHEMA.md +47 -0
  22. package/{mem-house → memhouse}/per-member/SHARING.md +47 -0
  23. package/memhouse/per-member/provision.js +297 -0
  24. package/memhouse/per-member/rooms.js +252 -0
  25. package/{mem-house → memhouse}/per-member/schema-member.sql.tpl +18 -14
  26. package/{mem-house → memhouse}/per-member/schema-merge.sql.tpl +3 -3
  27. package/memhouse/resume.js +150 -0
  28. package/memhouse/self-update.js +150 -0
  29. package/{mem-house → memhouse}/server/queries.js +80 -34
  30. package/memhouse/server/server.js +451 -0
  31. package/{mem-house → memhouse}/service.js +48 -29
  32. package/memhouse/shipper/ship.js +949 -0
  33. package/package.json +5 -20
  34. package/public/assets/{index-CtH-5i95.js → index-CnWzrjF3.js} +10 -7
  35. package/public/index.html +2 -2
  36. package/ui/index.html +1 -1
  37. package/ui/src/App.jsx +1 -1
  38. package/ui/src/lib/api.js +29 -13
  39. package/ui/src/pages/Dashboard.jsx +8 -5
  40. package/ui/src/pages/Sessions.jsx +3 -1
  41. package/ui/src/pages/SqlViewer.jsx +6 -23
  42. package/cache.js +0 -850
  43. package/ch-ingest.js +0 -329
  44. package/ch-schema.js +0 -152
  45. package/clickhouse.js +0 -87
  46. package/index.js +0 -425
  47. package/mcp-server.js +0 -294
  48. package/mem-house/delivery/install.sh +0 -183
  49. package/mem-house/delivery/skills/memhouse-sessions/SKILL.md +0 -125
  50. package/mem-house/delivery/skills/memhouse-sql/SKILL.md +0 -146
  51. package/mem-house/per-member/provision.js +0 -142
  52. package/mem-house/per-member/rooms.js +0 -132
  53. package/mem-house/server/server.js +0 -228
  54. package/mem-house/shipper/ship.js +0 -566
  55. package/relay-client.js +0 -306
  56. package/relay-server.js +0 -577
  57. package/server.js +0 -860
  58. package/share-image.js +0 -367
  59. /package/{mem-house → memhouse}/deploy.js +0 -0
  60. /package/{mem-house → memhouse}/envfile.js +0 -0
  61. /package/{mem-house → memhouse}/per-member/PLAN.md +0 -0
  62. /package/{mem-house → memhouse}/per-member/PROVISIONING.md +0 -0
  63. /package/{mem-house → memhouse}/per-member/README.md +0 -0
package/README.md CHANGED
@@ -1,152 +1,282 @@
1
1
  # memhouse
2
2
 
3
- **memhouse** — agent conversation memory as a product. Every coding-agent session
4
- on your machines — across the **17 editors** the agentlytics adapters support —
5
- parsed locally, shipped to a typed ClickHouse store, shareable with a team,
6
- installable on the ultimagent kernel as an **agency**, and visible through the
7
- agentlytics dashboard unchanged.
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
- ## Layout
9
+ ```bash
10
+ npm install -g memhouse --allow-scripts=better-sqlite3
11
+ memhouse onboard
12
+ ```
29
13
 
30
- | Path | What |
31
- |---|---|
32
- | `mem-house/` | the product: `DESIGN.md`, `per-member/`, `shipper/`, `server/`, `delivery/` |
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
- ## Quickstart — the `memhouse` CLI
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 install -g memhouse --allow-scripts=better-sqlite3
44
- memhouse onboard # wizard: discover → configure → ship → start
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
- **Do not drop `--allow-scripts=better-sqlite3`.** Five adapters — cursor, goose,
48
- opencode, zed, and antigravity — read sessions out of SQLite files, and
49
- `better-sqlite3` builds its native binding from an install script. npm 12 blocks
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
- If that install fails with `EACCES`, `sudo` is the right answer for only one of the
55
- two causes, and the thing that tells them apart is **who owns the prefix root** —
56
- not the path, and not the failing file. The path proves nothing: Homebrew's prefix
57
- is `/usr/local` on Intel and `/opt/homebrew` on Apple Silicon, and is yours in both
58
- cases. The failing file proves nothing either: an earlier `sudo npm` leaves
59
- root-owned files *inside* a prefix that is still yours.
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
- ls -ld "$(npm prefix -g)" # the prefix ROOT — this is the deciding one
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
- - **Prefix root owned by `root`** — a genuinely system-managed Node (distro
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
- To try it without installing, npx takes the same flag — it has to come before the
74
- package name:
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
- Working from a checkout instead: `npm install` (the repo's `allowScripts` field
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
- ```text
86
- memhouse onboard | install | setup | discover | uninstall | reset
87
- memhouse ship [--full|--loop N] | stats | search <terms> | start | stop | status | doctor
88
- memhouse plugins install claude | prompt
89
- memhouse deploy --local | --down # stand up a house to point at
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
- ### Where the memory lives
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
- `memhouse onboard` assumes you already have a ClickHouse. If you do not, `deploy`
96
- is the missing first mile:
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
- | | What it runs | Who it is for |
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
- `deploy --local` needs docker or podman. If you have neither and no ClickHouse, install
105
- one of them — memhouse does not embed a database. An earlier `--solo` tier ran chdb
106
- behind a hand-written ClickHouse-HTTP shim and was removed: emulating the HTTP protocol
107
- meant every setting or request shape the shim did not implement became a silently wrong
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
- `deploy` labels what it creates and refuses to replace or remove a container or
111
- volume it did not create, so a name collision costs you an error rather than
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
- ### Surviving a reboot
244
+ ## Working from a checkout
115
245
 
116
- `memhouse start` detaches with pidfiles: the daemons outlive the shell, and nothing
117
- brings them back after a restart. `memhouse service install` writes a real user
118
- service instead — systemd `--user` on Linux, a launchd LaunchAgent on macOS — and
119
- takes over from the pidfile daemons. On Linux a `--user` unit stops at logout
120
- unless lingering is on, so install detects that and prints the `loginctl` command.
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
- ### One set of rooms per member
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
- Every member owns their rooms — `messages_alice`, `sessions_alice`,
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
- The session rollup is a saved query over those rooms rather than a stored view, so there
132
- is no fourth object to provision, grant, or collide with the team rooms;
133
- `memhouse sessions-query` prints it. On a house you own, `memhouse install` mints your
134
- three rooms and you are done. On someone else's, the owner mints them
135
- (`mem-house/per-member/provision.js`) and sharing a whole room is then self-serve, with
136
- no operator. Design and measurements: `mem-house/per-member/`.
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
- Every command is dual-mode: interactive for humans, `--yes`/flags/`--json` for
139
- agents — so an agent can self-install its own memory (`memhouse install --yes …`,
140
- `memhouse plugins install claude`). Config: flags > `MEMHOUSE_*` env >
141
- `~/.memhouse/env` > defaults.
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
- Deeper docs: `mem-house/delivery/AGENT-INSTALL.md`, kernel install (agency
144
- `memhouse`, members, per-member rooms and their grants):
145
- `mem-house/delivery/kernel-install.md`, skills/plugin payloads: `mem-house/delivery/`.
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 (this repo's history
151
- carries the full lineage). The `agentlytics` remote tracks the private working
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.