agent-working-memory 0.14.5 → 0.15.4
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/.claude-plugin/marketplace.json +17 -0
- package/README.md +131 -122
- package/dist/adapters/claude-code.d.ts +9 -0
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +235 -132
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/common.d.ts +47 -5
- package/dist/adapters/common.d.ts.map +1 -1
- package/dist/adapters/common.js +111 -41
- package/dist/adapters/common.js.map +1 -1
- package/dist/adapters/hook-scripts.d.ts +54 -0
- package/dist/adapters/hook-scripts.d.ts.map +1 -0
- package/dist/adapters/hook-scripts.js +340 -0
- package/dist/adapters/hook-scripts.js.map +1 -0
- package/dist/adapters/types.d.ts +13 -3
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cli.js +74 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-id.d.ts +19 -0
- package/dist/core/agent-id.d.ts.map +1 -0
- package/dist/core/agent-id.js +28 -0
- package/dist/core/agent-id.js.map +1 -0
- package/dist/core/write-pipeline.js +17 -0
- package/dist/core/write-pipeline.js.map +1 -1
- package/dist/hooks/prime.d.ts +10 -4
- package/dist/hooks/prime.d.ts.map +1 -1
- package/dist/hooks/prime.js +16 -6
- package/dist/hooks/prime.js.map +1 -1
- package/dist/mcp.js +5 -12
- package/dist/mcp.js.map +1 -1
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/factory.js +20 -8
- package/dist/storage/factory.js.map +1 -1
- package/package.json +100 -90
- package/plugin/.claude-plugin/plugin.json +34 -0
- package/plugin/README.md +36 -0
- package/plugin/bin/awm-mcp-launcher.cjs +109 -0
- package/plugin/hooks/awm-checkpoint.cjs +55 -0
- package/plugin/hooks/awm-db-mutation-reminder.cjs +25 -0
- package/plugin/hooks/awm-find-sidecar.cjs +145 -0
- package/plugin/hooks/awm-prime.cjs +97 -0
- package/plugin/hooks/hooks.json +66 -0
- package/plugin/skills/awm-memory/SKILL.md +445 -0
- package/src/adapters/claude-code.ts +224 -126
- package/src/adapters/common.ts +119 -42
- package/src/adapters/hook-scripts.ts +370 -0
- package/src/adapters/types.ts +14 -3
- package/src/cli.ts +76 -5
- package/src/core/agent-id.ts +28 -0
- package/src/core/write-pipeline.ts +18 -0
- package/src/hooks/prime.ts +22 -7
- package/src/mcp.ts +5 -11
- package/src/plugin/awm-mcp-launcher.cjs +109 -0
- package/src/storage/factory.ts +19 -7
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-working-memory",
|
|
3
|
+
"description": "Agent Working Memory — persistent, local-first memory for AI agents",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Robert Winter",
|
|
6
|
+
"url": "https://github.com/CompleteIdeas"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "awm",
|
|
11
|
+
"description": "Persistent local memory: 19 MCP tools, session hooks that checkpoint and prime, and the usage guidance as a skill. Shares ~/.awm/memory.db with an `awm setup` install.",
|
|
12
|
+
"source": "./plugin",
|
|
13
|
+
"category": "development",
|
|
14
|
+
"keywords": ["memory", "mcp", "recall", "agent", "local-first"]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
package/README.md
CHANGED
|
@@ -27,89 +27,54 @@ Restart Claude Code. 19 tools appear. No cloud, no API keys, nothing leaves your
|
|
|
27
27
|
|
|
28
28
|
## What it does, measured
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Reproducible from this repository against a frozen copy of a **real 30,000-memory store**, not
|
|
31
|
+
synthetic data. Current numbers, stamped with the commit that produced them:
|
|
32
|
+
[`docs/benchmarks-current.md`](docs/benchmarks-current.md).
|
|
32
33
|
|
|
33
34
|
| | |
|
|
34
35
|
|---|---|
|
|
35
|
-
| **Returns the right memory first** | **92.7%** of identifier queries · **92.0%** of topic queries ·
|
|
36
|
-
| **Stays silent when it should** | **90%** correct abstention on questions about facts never stored |
|
|
37
|
-
| **
|
|
38
|
-
| **
|
|
39
|
-
| **Costs a fraction to answer** | Scoped recall answers in **~630 tokens flat** regardless of store size. Carrying the memory store instead: ~1.3M tokens. Reading the codebase: doesn't fit in any window. |
|
|
40
|
-
| **Lets a cheap model punch up** | A small model plus AWM out-performed a frontier model on a 15-task domain workload at **~1/40th the cost** — **14/15 vs 7/15**, $0.007 vs $0.277 per task. |
|
|
36
|
+
| **Returns the right memory first** | **92.7%** of identifier queries · **92.0%** of topic queries · **96.7%** in the top five |
|
|
37
|
+
| **Stays silent when it should** | **90.0%** correct abstention on questions about facts never stored |
|
|
38
|
+
| **Costs the same at any scale** | Scoped recall answers in **~630 tokens flat**. Carrying the store instead: ~1.3M tokens |
|
|
39
|
+
| **Lets a cheap model punch up** | Small model + AWM beat a frontier model on a 15-task domain workload: **14/15 vs 7/15**, at ~1/40th the cost |
|
|
41
40
|
|
|
42
41
|
Two independently built fixtures agree within a point. Warm recall takes about half a second.
|
|
43
42
|
|
|
44
43
|
<details>
|
|
45
|
-
<summary
|
|
46
|
-
|
|
47
|
-
Earlier published figures (s@1 63.8% category, 70.0% identifier) were **understated by the
|
|
48
|
-
measuring instrument, not the engine**. Two defects, both found and fixed in 0.14.4–0.14.5: the
|
|
49
|
-
benchmark's decay clock ran on the wall clock, so the "frozen" snapshot aged a day per day; and the
|
|
50
|
-
runner queried every gold as the `work` agent while a quarter to a third belonged to `personal`,
|
|
51
|
-
so agent isolation cut them before scoring. Nothing in retrieval changed between 63.8 and 92.0.
|
|
52
|
-
The within-day *deltas* published earlier (e.g. the +7.4pp tags win) stand. Full account in
|
|
53
|
-
[`docs/benchmarks.md`](docs/benchmarks.md) → correction notes.
|
|
54
|
-
</details>
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Why it works when a vector store doesn't
|
|
44
|
+
<summary>Two more, from real work rather than fixtures</summary>
|
|
59
45
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
is it new, is it a decision or a root cause, does it name its subject? About a third of what
|
|
65
|
-
the agent offers is kept at full confidence. The rest never competes, so recall stays sharp as
|
|
66
|
-
the store grows.
|
|
46
|
+
**Halves the digging.** Same agent, same tools, four real support tickets: with memory, 2× the
|
|
47
|
+
specific facts the real answer needed and half the database queries (49 vs 100). On one ticket
|
|
48
|
+
the memoryless arm ran 25 queries, exhausted its budget and answered nothing; the memory arm
|
|
49
|
+
answered in 4.
|
|
67
50
|
|
|
68
|
-
**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
**It tells you when it doesn't know.** When the top candidates are only marginally better than
|
|
73
|
-
the tenth, AWM returns nothing and says how many it withheld. A confident wrong memory is more
|
|
74
|
-
expensive than an admitted gap — the benchmark scores the silence as a win.
|
|
51
|
+
**Holds decisions for months.** On a six-month application project, recorded decisions were
|
|
52
|
+
recalled a median of 30 days after being written — some after 167. 41% of the technical
|
|
53
|
+
identifiers the agent used had entered the conversation *only* through a recall.
|
|
54
|
+
</details>
|
|
75
55
|
|
|
76
|
-
|
|
77
|
-
carries a visible warning if it ever surfaces. A notes file has two paragraphs that read with
|
|
78
|
-
equal confidence; AWM knows which one won. One project has 108 such supersessions — an agent
|
|
79
|
-
resuming it gets one current state, not five.
|
|
56
|
+
---
|
|
80
57
|
|
|
81
|
-
|
|
82
|
-
Work and personal memories are separate pools; several sessions share a pool safely.
|
|
58
|
+
## Is this for you?
|
|
83
59
|
|
|
84
|
-
|
|
85
|
-
<summary>Against a typical RAG / vector store, feature by feature</summary>
|
|
60
|
+
The honest version, because the overhead is real and it does not pay back for everyone.
|
|
86
61
|
|
|
87
|
-
| |
|
|
62
|
+
| If you are… | What you actually get | It pays back when |
|
|
88
63
|
|---|---|---|
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
| Named things | Vocabulary-dependent | Entity index on tickets, people, tables, files |
|
|
96
|
-
| Feedback | None | Useful / not-useful adjusts confidence and rank |
|
|
97
|
-
| Multi-agent | Per-instance | Shared store, per-agent scoping, opt-in shared workspace |
|
|
98
|
-
</details>
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Who uses it
|
|
64
|
+
| **A solo developer on one long-lived project** | The agent stops re-asking what you already told it, and stops re-proposing approaches you rejected | The project outgrows the context window — roughly, when you start saying "I have explained this before" |
|
|
65
|
+
| **A team sharing conventions** | One pool where a decision written by anyone is recalled by everyone, with corrections superseding rather than accumulating | More than one person is steering agents at the same codebase |
|
|
66
|
+
| **Running support or operations agents** | Ticket-scoped recall by real identifiers, so the second agent to touch a ticket knows what the first one did | Work arrives as a queue that several sessions or people share |
|
|
67
|
+
| **Building multi-agent pipelines** | A shared substrate with per-agent scoping, so specialists cooperate without sharing one context window | You have specialised agents that need the same facts |
|
|
68
|
+
| **Cost-constrained** | A small local model with good recall beats a frontier model without it on domain work | Your workload is narrow and repetitive rather than novel each time |
|
|
69
|
+
| **Somewhere cloud memory is not allowed** | One SQLite file on the machine. No account, no telemetry, no egress | Compliance makes hosted memory a non-starter |
|
|
103
70
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
71
|
+
**Skip it if:** your tasks are short and one-off with nothing worth reusing; you want a hosted
|
|
72
|
+
service someone else operates; you need memory synced across machines out of the box; or you were
|
|
73
|
+
hoping to replace your code, tickets and docs as the source of truth. AWM is a fast path back to
|
|
74
|
+
what was already decided — recall first, verify against the source when it matters, supersede when
|
|
75
|
+
reality differs.
|
|
109
76
|
|
|
110
|
-
**
|
|
111
|
-
code and tickets as the source of truth. Recall first; verify against the source when it
|
|
112
|
-
matters; supersede when reality differs.
|
|
77
|
+
It is also **not** a chatbot, a generic vector database, or a RAG pipeline over your files.
|
|
113
78
|
|
|
114
79
|
---
|
|
115
80
|
|
|
@@ -120,94 +85,131 @@ npm install -g agent-working-memory
|
|
|
120
85
|
awm setup --global # MCP config, CLAUDE.md guidance, hooks
|
|
121
86
|
```
|
|
122
87
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
release to date has been backward compatible.
|
|
88
|
+
Or install it as a Claude Code plugin instead, which wires the same things without a setup
|
|
89
|
+
step. The npm package carries the plugin, so this needs no GitHub access:
|
|
126
90
|
|
|
127
|
-
|
|
128
|
-
on
|
|
91
|
+
```bash
|
|
92
|
+
awm plugin # prints the two lines to paste, with the path on your machine
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Both share one store at `~/.awm/memory.db`, so it is a preference, not a fork — the
|
|
96
|
+
trade-offs are in [`docs/plugin.md`](docs/plugin.md). Install the npm package either way.
|
|
97
|
+
|
|
98
|
+
Requires **Node.js 22+**. Restart Claude Code.
|
|
99
|
+
|
|
100
|
+
**What to expect.** The first conversation is ~30 s slower while three small ONNX models download
|
|
101
|
+
(~200 MB, once). After that the agent has 19 memory tools, and the hooks save state on compaction
|
|
102
|
+
and session end without you doing anything. For the first day or two recall will be thin — it only
|
|
103
|
+
knows what has been written. That is the normal shape of it, not a fault.
|
|
104
|
+
|
|
105
|
+
**Starting on an existing project?** Warm-start the store from its own docs so recall is useful on
|
|
106
|
+
day one:
|
|
129
107
|
|
|
130
108
|
```bash
|
|
131
109
|
awm onboard ./docs --repo . --project <name> # review the pack, then
|
|
132
110
|
awm import <pack> --db <path> --dedupe
|
|
133
111
|
```
|
|
134
112
|
|
|
113
|
+
**Turn on the three retrieval improvements.** They ship default-off and belong together:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
AWM_RERANK2=1 AWM_RERANK_WINDOW=query AWM_RERANK_TAGS=1
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Second-stage rerank by the cross-encoder's own score; a 400-character rerank window placed on the
|
|
120
|
+
densest query-term region rather than the prefix (**25% → 87.5%** on long memories); and tags fed
|
|
121
|
+
into the rerank passage (**+7.4pp**). `awm setup` writes them on a fresh install. `memory_whoami`
|
|
122
|
+
prints the active fingerprint so you can confirm a running process has them.
|
|
123
|
+
|
|
124
|
+
**Check it worked:** `awm doctor claude-code` reports the live sidecars, which agent each serves,
|
|
125
|
+
and whether anything needs a re-run of setup.
|
|
126
|
+
|
|
135
127
|
| Next | |
|
|
136
128
|
|---|---|
|
|
137
129
|
| Install, first write, first recall | [`docs/quickstart.md`](docs/quickstart.md) |
|
|
138
130
|
| Separate pools per project, incognito mode, hooks | [`docs/claude-code-setup.md`](docs/claude-code-setup.md) |
|
|
131
|
+
| As a Claude Code plugin | [`docs/plugin.md`](docs/plugin.md) |
|
|
132
|
+
| In Claude Desktop | [`docs/desktop.md`](docs/desktop.md) |
|
|
139
133
|
| Teams and multi-agent | [`docs/team-setup-guide.md`](docs/team-setup-guide.md) |
|
|
140
134
|
| Custom agents over HTTP | [`docs/reference.md`](docs/reference.md) |
|
|
141
135
|
|
|
142
136
|
---
|
|
143
137
|
|
|
144
|
-
##
|
|
138
|
+
## Why it works when a vector store doesn't
|
|
145
139
|
|
|
146
|
-
|
|
140
|
+
Most "memory for AI" stores everything and retrieves by similarity. AWM makes the opposite bet:
|
|
141
|
+
**a memory is only useful if it is selective.**
|
|
147
142
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
143
|
+
**It refuses most of what it sees.** Every write is scored for importance before storage — is it
|
|
144
|
+
new, is it a decision or a root cause, does it name its subject? About a third of what the agent
|
|
145
|
+
offers is kept at full confidence. The rest never competes, so recall stays sharp as the store
|
|
146
|
+
grows.
|
|
147
|
+
|
|
148
|
+
**It forgets gracefully.** Memories that keep getting used stay strong; ones nobody touches fade
|
|
149
|
+
from ranking without being deleted. The model is borrowed from cognitive science (ACT-R), and it
|
|
150
|
+
means no one curates the store.
|
|
151
|
+
|
|
152
|
+
**It tells you when it doesn't know.** When the top candidates are only marginally better than the
|
|
153
|
+
tenth, AWM returns nothing and says how many it withheld. A confident wrong memory is more
|
|
154
|
+
expensive than an admitted gap — the benchmark scores the silence as a win.
|
|
155
|
+
|
|
156
|
+
**It knows what changed.** When a fact is corrected, the old memory is marked superseded and
|
|
157
|
+
carries a visible warning if it ever surfaces. A notes file has two paragraphs that read with equal
|
|
158
|
+
confidence; AWM knows which one won. One project has 108 such supersessions — an agent resuming it
|
|
159
|
+
gets one current state, not five.
|
|
160
|
+
|
|
161
|
+
**It stays local and per-person.** One SQLite file, three small ONNX models. Work and personal
|
|
162
|
+
memories are separate pools; several sessions share a pool safely.
|
|
163
|
+
|
|
164
|
+
<details>
|
|
165
|
+
<summary>Against a typical RAG / vector store, feature by feature</summary>
|
|
151
166
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
167
|
+
| | Typical vector store | AWM |
|
|
168
|
+
|---|---|---|
|
|
169
|
+
| Storage | Everything | Salience-filtered: active / staging / low-confidence fallback |
|
|
170
|
+
| Retrieval | Cosine similarity | Keyword + vector candidates → liveness scoring → cross-encoder rerank → abstention gate |
|
|
171
|
+
| Forgetting | Manual cleanup | ACT-R decay; reinforced knowledge persists |
|
|
172
|
+
| Correction | Delete and re-insert | Supersede with a visible pointer; retract with confidence propagation to neighbours |
|
|
173
|
+
| Duplicates | Stored again | Reinforce the existing memory instead |
|
|
174
|
+
| Wrong answers | Best of a bad set | Returns nothing, says why |
|
|
175
|
+
| Named things | Vocabulary-dependent | Entity index on tickets, people, tables, files |
|
|
176
|
+
| Feedback | None | Useful / not-useful adjusts confidence and rank |
|
|
177
|
+
| Multi-agent | Per-instance | Shared store, per-agent scoping, opt-in shared workspace |
|
|
178
|
+
</details>
|
|
157
179
|
|
|
158
180
|
---
|
|
159
181
|
|
|
160
182
|
## How it works, in one paragraph
|
|
161
183
|
|
|
162
|
-
A write is scored for salience — novelty against the existing store, event type, whether it
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
than overwrite.
|
|
184
|
+
A write is scored for salience — novelty against the existing store, event type, whether it names
|
|
185
|
+
identifiers — and lands active, staged, or low-confidence. A recall casts a wide net with keyword
|
|
186
|
+
and vector search, scores each candidate for relevance and liveness, lets linked memories vote,
|
|
187
|
+
hands the shortlist to a cross-encoder that actually reads the text, then checks whether the score
|
|
188
|
+
distribution justifies answering at all. A maintenance pass on session end clusters, decays unused
|
|
189
|
+
links, and archives what has gone cold. Corrections supersede rather than overwrite.
|
|
169
190
|
|
|
170
191
|
The whole thing, one memory followed end to end with every threshold sourced:
|
|
171
|
-
[`docs/walkthrough.md`](docs/walkthrough.md). The
|
|
172
|
-
|
|
192
|
+
[`docs/walkthrough.md`](docs/walkthrough.md). The mental model an engineer needs to predict its
|
|
193
|
+
behaviour — proposers, deciders, and when it stays silent:
|
|
194
|
+
[`How AWM decides what to say`](https://completeideas.github.io/agent-working-memory/pipeline-walkthrough.html).
|
|
173
195
|
The theory and its citations: [`docs/cognitive-model.md`](docs/cognitive-model.md).
|
|
174
196
|
|
|
175
197
|
---
|
|
176
198
|
|
|
177
199
|
## Honest limits
|
|
178
200
|
|
|
179
|
-
- No help on small one-off tasks — the overhead pays back when knowledge is reused or the
|
|
180
|
-
|
|
181
|
-
- Recall is bounded by what was written. A memory that never names its subject
|
|
182
|
-
|
|
201
|
+
- No help on small one-off tasks — the overhead pays back when knowledge is reused or the project
|
|
202
|
+
outgrows the context window.
|
|
203
|
+
- Recall is bounded by what was written. A memory that never names its subject cannot be found by
|
|
204
|
+
it. The writing guidance exists for this reason.
|
|
183
205
|
- The association graph, as of this release, rarely changes a final answer; the reranker does.
|
|
184
|
-
- It is 0.x
|
|
185
|
-
|
|
206
|
+
- It is 0.x. Benchmark figures have been corrected upward more than once after the *instrument*
|
|
207
|
+
turned out to be wrong; every correction is documented in place rather than revised away.
|
|
186
208
|
|
|
187
209
|
Everything else, with evidence and workarounds: [`docs/known-limitations.md`](docs/known-limitations.md).
|
|
188
210
|
|
|
189
211
|
---
|
|
190
212
|
|
|
191
|
-
## What's new — v0.14.5
|
|
192
|
-
|
|
193
|
-
Nothing in the retrieval engine changed in the last four point releases; what changed is how it
|
|
194
|
-
is measured, invoked, and reports on itself.
|
|
195
|
-
|
|
196
|
-
- **Benchmark instrument corrected twice; real numbers are higher.** Identifier s@1 92.7%,
|
|
197
|
-
category 92.0%, abstention unchanged at 90%. The runner now pins its clock and queries as each
|
|
198
|
-
gold's own agent.
|
|
199
|
-
- **Feedback joins to its recall.** `memory_recall` ends with `[recall_id: …]`;
|
|
200
|
-
`memory_feedback` accepts it. Before this every feedback row in the live store was orphaned.
|
|
201
|
-
`memory_stats` now reports outcome numbers instead of activity counters.
|
|
202
|
-
- **One hook sidecar per session.** Each session's process binds the first free port from 8401
|
|
203
|
-
upward; `memory_whoami` reports the port it actually holds.
|
|
204
|
-
- **An empty recall no longer claims absence.** `RECALL ABSTAINED` with the withheld count,
|
|
205
|
-
instead of "No relevant memories found."
|
|
206
|
-
|
|
207
|
-
Full history back to v0.6.0: [CHANGELOG.md](CHANGELOG.md).
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
213
|
## Reference
|
|
212
214
|
|
|
213
215
|
The README points outward; it does not duplicate. Everything below is the authoritative source.
|
|
@@ -216,7 +218,8 @@ The README points outward; it does not duplicate. Everything below is the author
|
|
|
216
218
|
|---|---|
|
|
217
219
|
| **All 19 MCP tools**, every HTTP endpoint with schemas, every environment variable with its measured effect | [`docs/reference.md`](docs/reference.md) |
|
|
218
220
|
| Architecture, pipelines, schema, backends (SQLite · PGlite · Postgres) | [`docs/architecture.md`](docs/architecture.md) · [`docs/pglite-feature-parity.md`](docs/pglite-feature-parity.md) |
|
|
219
|
-
|
|
|
221
|
+
| Current benchmark numbers, generated and stamped | [`docs/benchmarks-current.md`](docs/benchmarks-current.md) |
|
|
222
|
+
| What each eval suite measures, and the measurement caveats | [`docs/benchmarks.md`](docs/benchmarks.md) |
|
|
220
223
|
| Building an agent on AWM as a substrate (PRIME → ACT → VERIFY → LEARN) | [`docs/patterns/awm-native-harness.md`](docs/patterns/awm-native-harness.md) · [agent playbook](https://completeideas.github.io/agent-working-memory/awm-for-agents.html) |
|
|
221
224
|
| Running it as a service; backup, restore, migration | [`docs/deployment.md`](docs/deployment.md) |
|
|
222
225
|
| Behaviour as the store grows | [`docs/using-awm-at-scale.md`](docs/using-awm-at-scale.md) |
|
|
@@ -229,16 +232,22 @@ local ONNX via `@huggingface/transformers` — bge-small-en-v1.5 embeddings, ms-
|
|
|
229
232
|
flan-t5-small expansion. Node 22+.
|
|
230
233
|
|
|
231
234
|
```bash
|
|
232
|
-
npx vitest run #
|
|
233
|
-
npm run
|
|
235
|
+
npx vitest run # 781 tests
|
|
236
|
+
npm run bench # benchmark suites
|
|
237
|
+
npm run build:plugin # regenerate the Claude Code plugin from src/
|
|
238
|
+
npm run test:docker # clean-room install of the packed tarball
|
|
239
|
+
npm run test:linux # build + full suite on Linux (781/781)
|
|
234
240
|
```
|
|
235
241
|
|
|
236
242
|
---
|
|
237
243
|
|
|
238
244
|
## Status
|
|
239
245
|
|
|
240
|
-
Active development, v0.
|
|
246
|
+
Active development, v0.15.4. Core retrieval, consolidation, MCP integration, hooks, task
|
|
241
247
|
management, and the HTTP API are stable and in daily production use. PGlite backend stable;
|
|
242
|
-
networked Postgres experimental.
|
|
248
|
+
networked Postgres experimental.
|
|
249
|
+
|
|
250
|
+
Release notes, and every benchmark correction recorded against the release that made it:
|
|
251
|
+
[CHANGELOG.md](CHANGELOG.md).
|
|
243
252
|
|
|
244
253
|
**License:** Apache 2.0 — [LICENSE](LICENSE) · [NOTICE](NOTICE)
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { CLIAdapter } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* DB-mutation reminder hook (PostToolUse on Bash|PowerShell).
|
|
4
|
+
* Fires when a shell command runs sqlcmd/mysql/psql with mutation keywords and
|
|
5
|
+
* injects a reminder that the mutation must be recorded via memory_write.
|
|
6
|
+
* Origin: 2026-07-29 tblOSCMPImportDivisionMatch incident — an unrecorded
|
|
7
|
+
* script INSERT broke a production upload six days later, and no recall could
|
|
8
|
+
* surface a cause that was never written.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DB_MUTATION_HOOK_SCRIPT = "#!/usr/bin/env node\n// AWM DB-mutation reminder hook (PostToolUse on Bash|PowerShell). Installed by awm setup.\nlet raw = '';\nprocess.stdin.on('data', (d) => (raw += d));\nprocess.stdin.on('end', () => {\n try {\n const j = JSON.parse(raw || '{}');\n const cmd = (j.tool_input && j.tool_input.command) || '';\n const isDbClient = /\\b(sqlcmd|mysql|psql)\\b/i.test(cmd) || /(sqlcmd|mysql|psql)\\.exe/i.test(cmd);\n const isMutation = /\\b(INSERT|UPDATE|DELETE|ALTER|TRUNCATE|DROP|MERGE)\\b/i.test(cmd);\n if (isDbClient && isMutation) {\n console.log(JSON.stringify({\n hookSpecificOutput: {\n hookEventName: 'PostToolUse',\n additionalContext:\n 'AWM REMINDER: this command contains a production DB mutation (INSERT/UPDATE/DELETE/ALTER/DROP/TRUNCATE/MERGE). ' +\n 'The change is NOT complete until it is recorded: call memory_write NOW with the table, what changed, row counts, date, and why ' +\n '(memory_class canonical if other agents must recall it), and confirm a rollback/backup exists. ' +\n 'If the keywords were only in a string/comment or on temp tables (#...), no write is needed.',\n },\n }));\n }\n } catch (e) { /* never block the tool result */ }\n process.exit(0);\n});\n";
|
|
2
11
|
declare const adapter: CLIAdapter;
|
|
3
12
|
export default adapter;
|
|
4
13
|
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,YAAY,CAAC;AAK7E;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,sxCAyBnC,CAAC;AAkEF,QAAA,MAAM,OAAO,EAAE,UAoQd,CAAC;AAEF,eAAe,OAAO,CAAC"}
|