pi-mega-compact 0.5.1 → 0.5.2

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 CHANGED
@@ -6,10 +6,13 @@ sessions into a **local SQLite store** and offers **deduped inline recall** —
6
6
  running **locally inside the extension**, with **no remote MCP server** and
7
7
  **zero network calls at runtime** (PREVENT-PI-004).
8
8
 
9
- > **v0.2.0** — storage backend is now **`better-sqlite3`** (a single,
10
- > in-process, FS-backed SQLite database) replacing the old per-session gzipped
11
- > JSON checkpoint files. The legacy `.checkpoints.json.gz` snapshots are
12
- > retained as disaster-recovery fallbacks and auto-imported on first run.
9
+ > **Current version:** `v0.5.1` — storage backend is **`node:sqlite`**
10
+ > (`DatabaseSync`, a Node ≥22.13 built-in), replacing the old `better-sqlite3`
11
+ > native addon and the per-session gzipped JSON checkpoint files. **Zero native
12
+ > build step, fully local, zero network at runtime.** Legacy
13
+ > `.checkpoints.json.gz` snapshots are retained as disaster-recovery fallbacks
14
+ > and auto-imported on first run. Cross-repo recall, durable memory, and a
15
+ > localhost dashboard round out the continuity story.
13
16
 
14
17
  ---
15
18
 
@@ -110,9 +113,9 @@ OpenAI-style contract and the `MEGACOMPACT_EMBEDDING_KEY` / `MEGACOMPACT_EMBEDDI
110
113
 
111
114
  ### Requirements
112
115
 
113
- - **Node >= 18**
114
- - install builds the **`better-sqlite3`** native module (one-time, local
115
- compile). No network call and no API key are needed at runtime.
116
+ - **Node >= 22.13** (the synchronous `node:sqlite` backend requires it; see
117
+ `engines.node`). No native module is compiled — the store is a Node built-in.
118
+ - No network call and no API key are needed at runtime (PREVENT-PI-004).
116
119
  - A pi coding agent install with package support (`pi install` / `pi update
117
120
  --extensions`). npm-installed packages are auto-discovered via the package's
118
121
  `pi` manifest entry; local checkouts load from `~/.pi/agent/extensions/`.
@@ -135,8 +138,10 @@ source (which pi loads directly) and the compiled `dist/`, so nothing else needs
135
138
  building.
136
139
 
137
140
  > **Tip — keep the spec unpinned.** Use `npm:pi-mega-compact`, not
138
- > `npm:pi-mega-compact@0.4.11`. Version-pinned specs are *skipped* by
139
- > `pi update --extensions`, so a pin would freeze you on that release.
141
+ > `npm:pi-mega-compact@0.5.1`. Version-pinned specs are *skipped* by
142
+ > `pi update --extensions`, so a pin would freeze you on that release. The
143
+ > installed version is always visible in the toolbar widget (`⚡ <tier> vX.Y.Z`)
144
+ > and via `/mega-status`.
140
145
 
141
146
  > **From a git checkout (development only).** To hack on the extension, clone and
142
147
  > build locally, then symlink it into pi's extensions dir — but this bypasses the
@@ -158,7 +163,7 @@ building.
158
163
  > `pi update --extensions` on the device. (`.gitignore` rejects `*.tgz` so one can't
159
164
  > be committed by accident.)
160
165
 
161
- ### Storage backend (v0.5.0+)
166
+ ### Storage
162
167
 
163
168
  pi-mega-compact uses a dual local backend — **zero network, no native build step**:
164
169
 
@@ -167,22 +172,14 @@ pi-mega-compact uses a dual local backend — **zero network, no native build st
167
172
 
168
173
  Kill-switch: `MEGACOMPACT_PGLITE_DISABLED=1` fully disables the PGlite index (falls back to sync scan). Requires Node ≥22.13 (`engines.node`).
169
174
 
170
- ### Cross-repo recall (v0.5.0+)
175
+ ### Cross-repo recall
171
176
 
172
177
  On resume, recall augments from other repos' checkpoints when this repo's store is thin; `/mega-recall --cross-repo` searches all repos via the HNSW index. Cross-repo hits use a stricter cosine floor (`MEGACOMPACT_CROSSREPO_COSINE`, default 0.90) and are labeled with their source repo. A machine-wide injected-set (`~/.mega-compact-index/index.sqlite`) prevents re-injecting the same foreign checkpoint.
173
178
 
174
- ### Memory (v0.5.0+)
179
+ ### Memory
175
180
 
176
181
  pi-mega-compact auto-reviews the conversation every 10 turns and writes durable `decision`/`fact`/`preference` memories to SQLite (local, hallucination-guarded). Relevant memories are injected as RAG context on recall (capped, deduped). Manual: `/mega-memory save|list|forget`.
177
182
 
178
- ### Verify
179
-
180
- ```bash
181
- npm test # all unit/integration tests pass (346 as of v0.5.0)
182
- npm run lint # tsc --noEmit + guardrails scan clean
183
- python3 scripts/regression_check.py --all # spec/plan regression gate
184
- ```
185
-
186
183
  ### Uninstall
187
184
 
188
185
  ```bash
@@ -211,11 +208,16 @@ The commands (slash commands inside pi):
211
208
  |---|---|
212
209
  | `/mega-compact [summary...]` | Manually compact the current session. A summary arg is used verbatim; otherwise the COLLAPSE heuristics build one. Persists a `chkpt_xxx`. |
213
210
  | `/mega-compact off` | Disable auto-compaction for this session. |
214
- | `/mega-status` | Show config + current context usage + store stats (checkpoint count, dedup rate, tokens saved). |
211
+ | `/mega-status` | Show config + current context usage + store stats (checkpoint count, dedup rate, tokens saved) + the **installed version**. |
215
212
  | `/mega-recall [query]` | Semantic-search the local store, dedupe against the current window, and inline the top-K relevant checkpoints. No query → uses your latest message. `--cross-repo` searches all repos. |
216
213
  | `/mega-memory save <text>` / `save <category> <text>` / `list` / `search <query>` / `forget <text>` / `consolidate` | Manage durable memories (decisions, facts, preferences) written by auto-review and recalled as RAG context. Also `/m` shortform. |
214
+ | `/mega-restore <chkpt\|recent>` | Re-inject a checkpoint's verbatim original region into context. |
215
+ | `/mega-history` | List this session's checkpoints (id, date, files, tokens). |
216
+ | `/mega-view <chkpt\|recent>` | Show a checkpoint's verbatim original region. |
217
+ | `/mega-help` | Explain the toolbar widget terms (tier, gate, dedup, tokens saved). |
217
218
  | `/mega-tier [name]` | Set the compaction tier (`low` / `medium` / `high` / `ultra` / `mega`). Shows current tier with no arg. |
218
- | `/mega-dashboard` | Start the **localhost-only** live dashboard and open it in a browser (token gauge, store stats, live event stream). |
219
+ | `/mega-compat-check` | Detect extension conflicts (duplicate commands / overlapping handlers) across installed pi extensions. |
220
+ | `/mega-dashboard` | Start the **localhost-only** live dashboard and open it in a browser (token gauge, store stats, live event stream, per-repo + cross-repo drift). |
219
221
  | `/mega-dashboard-status` | Report dashboard server status. |
220
222
  | `/mega-dashboard-stop` | Stop the dashboard server. |
221
223
 
@@ -224,10 +226,13 @@ The commands (slash commands inside pi):
224
226
  Above the pi editor the extension shows a compact widget:
225
227
 
226
228
  ```
227
- ⚡ medium │ 142k/200k tokens (71%) │ 3 chkpts │ 🤖 2 agents │ turn 5
229
+ ⚡ medium v0.5.1 │ 142k/200k tokens (71%) │ 3 chkpts │ 🤖 2 agents │ turn 5
228
230
  ◐ armed │ dedup: 92% │ saved: 45k tok
229
231
  ```
230
232
 
233
+ - **Version** — the installed npm version (read from `package.json` at runtime),
234
+ so the widget always reflects what `pi update --extensions` last pulled. If
235
+ this looks stale after an update, restart the dashboard server / pi session.
231
236
  - **Tier** — active compaction tier (low/medium/high/ultra/mega)
232
237
  - **Token usage** — current / max context window and %
233
238
  - **Checkpoints** — persisted checkpoints for the session
@@ -255,10 +260,10 @@ before starting pi.
255
260
  | `MEGACOMPACT_DEDUP_SIM` | `0.90` | Cosine threshold to collapse near-dupes. |
256
261
  | `MEGACOMPACT_STATE_DIR` | _(none — per-repo default)_ | Override the store location. By default state is per-repo at `<repo>/.pi/mega-compact/`; this env var forces a single explicit dir (used as the fallback for non-git cwds). |
257
262
 
258
- #### Dedup pipeline flags (v0.2.0 — single source: `src/config/dedup.ts`)
263
+ #### Dedup pipeline flags (single source: `src/config/dedup.ts`)
259
264
 
260
265
  These gate the L0/L1/L2/RAPTOR dedup tiers. Defaults reproduce the all-active
261
- Sprint 13 behavior. `MARK_ONLY_*` tiers run + record their decision but never
266
+ behavior. `MARK_ONLY_*` tiers run + record their decision but never
262
267
  collapse (safe partial-rollout / auto-degrade state).
263
268
 
264
269
  | Variable | Default | Meaning |
@@ -285,18 +290,18 @@ See `docs/DEDUP_RUNBOOK.md` for incident response (SEV tiers, first-15-min
285
290
  checklist, MARK_ONLY degrade) and `docs/RETENTION_POLICY.md` for TTL / soft-delete
286
291
  / VACUUM.
287
292
 
288
- #### Continuity + memory knobs (v0.5.0)
293
+ #### Continuity + memory knobs
289
294
 
290
295
  | Variable | Default | Meaning |
291
296
  |---|---|---|
292
- | `MEGACOMPACT_LEGACY_DURABLE_TRIM` | `false` | Restore the v0.4.28 auto-trigger (`ctx.compact()` stops the agent). One-release rollback; default uses live context-event trim + pi native auto-compaction (compact-and-continue). |
297
+ | `MEGACOMPACT_LEGACY_DURABLE_TRIM` | `false` | Restore the legacy auto-trigger (`ctx.compact()` stops the agent). One-release rollback; default uses live context-event trim + pi native auto-compaction (compact-and-continue). |
293
298
  | `MEGACOMPACT_CROSSREPO_ENABLED` | `true` | Cross-repo recall on resume + `/mega-recall --cross-repo` (HNSW index over every repo). |
294
299
  | `MEGACOMPACT_CROSSREPO_COSINE` | `0.90` | Stricter cosine floor for cross-repo hits (vs `0.85` same-repo). |
295
300
  | `MEGACOMPACT_MEMORY_AUTO_REVIEW` | `true` | Auto-review the conversation every `MEGACOMPACT_MEMORY_REVIEW_INTERVAL` turns → durable memories. |
296
301
  | `MEGACOMPACT_MEMORY_REVIEW_INTERVAL` | `10` | Turns between auto-review cycles. |
297
- | `MEGACOMPACT_PGLITE_DISABLED` | `1` | Kill-switch for the PGlite/HNSW cross-repo index (falls back to sync per-session scan). |
302
+ | `MEGACOMPACT_PGLITE_DISABLED` | _(unset — index on)_ | Kill-switch for the PGlite/HNSW cross-repo index; set `1`/`true` to disable (falls back to sync per-session scan). |
298
303
 
299
- #### Dashboard (v0.5.0)
304
+ #### Dashboard
300
305
 
301
306
  The localhost-only dashboard adds a **Summary** + **All-repos** view over the
302
307
  machine-wide `repo_registry`, plus a **cross-repo drift** report (`GET /api/drift`)
@@ -306,78 +311,35 @@ All read-only — the report never writes the index.
306
311
 
307
312
  ---
308
313
 
309
- ## Reporting for testers (what to capture)
310
-
311
- If you're testing pi-mega-compact, the maintainers need **local evidence**, not
312
- guesswork. The store and logs are plain local files — never a network port.
313
-
314
- 1. **Install + run it** (see [Installation](#install)).
315
- 2. **Work a real session** until context fills past the gate (80%+) — you should
316
- see the status chip flip to `● ready`, then `◐ armed`, a checkpoint persist,
317
- and context visibly drop.
318
- 3. **Resume and confirm recall:** restart pi, ask about something you worked on
319
- earlier; relevant checkpoints should auto-inline (or use
320
- `/mega-recall <topic>`).
321
- 4. **Watch the live signal** while testing:
322
- ```bash
323
- tail -f ~/.pi/agent/extensions/pi-mega-compact/events.log | jq .
324
- ```
325
- Each line is `{ts, tier, result, latencyMs, falsePositive?}`.
326
- 5. **Run the dashboard** (`/mega-dashboard`) and check the token gauge, store
327
- stats, and live event stream.
328
- 6. **Try `/mega-tier`** to see and switch compaction tiers.
329
-
330
- ### What to include in a bug report
331
-
332
- - Output of `/mega-status` (config + store stats).
333
- - Output of `/mega-dashboard-status`.
334
- - Your pi version + OS + Node version (`node -v`).
335
- - A slice of `events.log` around the problem (the `result`/`tier` lines).
336
- - `dashboard.json` from the state dir (aggregate metrics: hit rate, FP rate,
337
- per-tier p95, storage bytes).
338
- - If you suspect data loss or duplication: the checkpoint count and the
339
- `sqlite.db` size, plus the output of the DR drill (below).
340
-
341
- **Disaster-recovery drill** (validates the store against its JSON snapshots and
342
- rebuilds if corrupt — see `docs/RETENTION_POLICY.md` §5):
343
-
344
- ```bash
345
- scripts/dedup-restore-drill.sh ~/.pi/agent/extensions/pi-mega-compact
346
- ```
347
-
348
- **Benchmark** (dedup hit rate, compression ratio, per-tier p95, storage at
349
- 100 / 1K / 10K checkpoints):
350
-
351
- ```bash
352
- npm run build
353
- node scripts/dedup-benchmark.mjs 100 1000 10000
354
- ```
355
-
356
- Open issues at: https://github.com/TheArchitectit/pi-mega-compact/issues
357
-
358
- ---
359
-
360
314
  ## Architecture & layout
361
315
 
362
316
  ```
363
317
  extensions/mega-compact.ts pi extension entry; wires src/ into pi lifecycle
318
+ extensions/mega-trim.ts live context-event trim (compact-and-continue, no abort)
319
+ extensions/mega-conflict-cmds.ts extension-conflict detector (/mega-compat-check)
320
+ extensions/dashboard-server.ts localhost dashboard (HTML + snapshot/version/drift APIs)
364
321
  src/adapt.ts the single pi↔engine message adapter (index-aligned)
365
322
  src/engine.ts Layer 4: compactSession() Trident pipeline + recall()
366
323
  src/vectorStore.ts Layer 3: local vector DB (add/search/dedupe + near-dup)
367
324
  src/embedder.ts default TrigramEmbedder (deterministic, 512-dim)
368
325
  src/httpEmbedder.ts BYO localhost embedder seam (MEGACOMPACT_EMBEDDING_URL)
369
- src/store/sqlite.ts the "one store" — better-sqlite3 context_chunks + session_state (FTS5 trigram)
326
+ src/store/sqlite.ts the "one store" — node:sqlite context_chunks + session_state (FTS5 trigram)
327
+ src/store/vectorIndex.ts async PGlite/HNSW cross-repo vector index (redundant, best-effort)
370
328
  src/store/migrate.ts JSON → SQLite migration (legacy .checkpoints.json.gz retained)
371
329
  src/store/backfill.ts resumable backfill orchestrator (L0/L1/L2/RAPTOR)
330
+ src/memory.ts durable memories (decision/fact/preference) + auto-review
331
+ src/memoryOps.ts memory apply/consolidate ops
332
+ src/memoryRecall.ts memory recall + auto-inline (RAG context)
333
+ src/driftDetection.ts cross-repo drift report (stale/idle/compaction-lag/model-churn)
372
334
  src/monitoring.ts local events.log + dashboard.json metrics + FP alerts
373
335
  src/canary.ts sequential L0→L1→L2→RAPTOR rollout, auto-disable on p95 breach
374
336
  src/config/dedup.ts single source of truth for ALL dedup tier flags + thresholds
375
337
  src/store.ts state dir + JSON DR helpers + compression re-exports
376
- src/compact.ts Layer 2: summarize / merge / autoCompactCheck
377
- src/supersede.ts Layer 1: obsolete file-read pruning
378
- src/boundary.ts drop-boundary guards (anchor floor + tool-pair)
379
- src/tokens.ts deterministic token estimator
380
- src/types.ts engine-internal types
338
+ src/compact.ts Layer 2: summarize / merge / autoCompactCheck
339
+ src/supersede.ts Layer 1: obsolete file-read pruning
340
+ src/boundary.ts drop-boundary guards (anchor floor + tool-pair)
341
+ src/tokens.ts deterministic token estimator
342
+ src/types.ts engine-internal types
381
343
  ```
382
344
 
383
345
  The `src/` directory is **pi-agnostic** and fully unit-tested (`node --test`).
@@ -389,34 +351,22 @@ The extension entry adapts between the engine and pi's runtime types.
389
351
 
390
352
  ```bash
391
353
  npm run build # tsc
392
- npm test # build + node --test on dist/**/*.test.js
354
+ npm test # build + node --test on dist/**/*.test.js (346 tests)
393
355
  npm run lint # tsc --noEmit + guardrails-scan
394
356
  npm run guardrails # regression_check + guardrails-scan
395
357
  ```
396
358
 
397
359
  The agent-guardrails suite (Four Laws, scope, secrets, regression) gates every
398
- sprint.
360
+ change.
399
361
 
400
362
  ---
401
363
 
402
- ## Status
403
-
404
- - Sprint 1 core engine (Layers 1–2, pure functions)
405
- - Sprint 2 local vector store (Layer 3)
406
- - ✅ Sprint 3 — pi extension wiring (Layer 4 persist + trigger)
407
- - ✅ Sprint 4 — unified recall layer (Layer 5: auto-inline + on-demand + sentinel)
408
- - ✅ Sprint 5 — commands / UX / config polish (status chip, store stats, debug log)
409
- - ✅ Sprint 6 — hardening, docs, release (`install.sh`, CHANGELOG, `v0.1.0`)
410
- - ✅ Sprint 8 — SQLite storage backbone (`better-sqlite3`, one store) + compression v2
411
- - ✅ Sprints 9–11 — L0 exact-hash + L1 MinHash/LSH near-dup dedup tiers
412
- - ✅ Sprint 12 — L2 semantic cosine + MMR; BYO localhost embedder (`HttpEmbedder`)
413
- - ✅ Sprint 13 — RAPTOR hierarchical pre-compression (shadow mode)
414
- - ✅ Sprint 14 — full pipeline: flags, backfill, monitoring, canary rollout
415
- - ✅ Sprint 15 — benchmarks, DR drill, docs, `v0.2.0`
416
-
417
- See `SPRINT_PLAN.md` for the full breakdown and `PLAN.md` for architecture,
418
- `RESEARCH.md` for the pi-API constraints that shaped it, `CHANGELOG.md` for
419
- release notes.
364
+ ## Testing & bug reports
365
+
366
+ Full QA instructionsenvironment setup, the manual test checklist, what to
367
+ include in a bug report, and known limitations live in
368
+ [`TESTER_GUIDE.md`](TESTER_GUIDE.md). Open issues at
369
+ [github.com/TheArchitectit/pi-mega-compact/issues](https://github.com/TheArchitectit/pi-mega-compact/issues).
420
370
 
421
371
  ---
422
372
 
@@ -428,4 +378,4 @@ neuralwatt-mcr (pi-extension mechanics). Attribution as design sources only.
428
378
 
429
379
  ## License
430
380
 
431
- [MIT](./LICENSE)
381
+ [BSD-2-Clause](./LICENSE)
@@ -267,7 +267,10 @@ export class MegaRuntime {
267
267
  const pct = Math.min(100, Math.round((this.rt.tokensSaved / goal) * 100));
268
268
  const filled = Math.round((pct / 100) * 10);
269
269
  const bar = "▓".repeat(filled) + "░".repeat(10 - filled);
270
- lines.push(` ${C.green}saved ${fmt(this.rt.tokensSaved)} ${bar}${C.reset} ${pct}% of ${fmt(goal)}`);
270
+ // Session tokens saved, with the repo-wide total held alongside so the
271
+ // bar reads "saved X of goal" and the right side shows saved vs total.
272
+ const totalHeld = st.totalTokenEstimate > 0 ? st.totalTokenEstimate : repo.totalTokenEstimate;
273
+ lines.push(` ${C.green}saved ${fmt(this.rt.tokensSaved)} ${bar}${C.reset} ${pct}% of ${fmt(goal)} ${C.gray}│${C.reset} ${C.blue}${fmt(this.rt.tokensSaved)}${C.reset}/${C.blue}${fmt(totalHeld)}${C.reset} tok held`);
271
274
  }
272
275
  // Live "now processing" line + why + recent deduped/compacted events,
273
276
  // collapsed to ONE rotating line (fresh only). The ticker ring buffer
@@ -292,7 +292,10 @@ export class MegaRuntime {
292
292
  const pct = Math.min(100, Math.round((this.rt.tokensSaved / goal) * 100));
293
293
  const filled = Math.round((pct / 100) * 10);
294
294
  const bar = "▓".repeat(filled) + "░".repeat(10 - filled);
295
- lines.push(` ${C.green}saved ${fmt(this.rt.tokensSaved)} ${bar}${C.reset} ${pct}% of ${fmt(goal)}`);
295
+ // Session tokens saved, with the repo-wide total held alongside so the
296
+ // bar reads "saved X of goal" and the right side shows saved vs total.
297
+ const totalHeld = st.totalTokenEstimate > 0 ? st.totalTokenEstimate : repo.totalTokenEstimate;
298
+ lines.push(` ${C.green}saved ${fmt(this.rt.tokensSaved)} ${bar}${C.reset} ${pct}% of ${fmt(goal)} ${C.gray}│${C.reset} ${C.blue}${fmt(this.rt.tokensSaved)}${C.reset}/${C.blue}${fmt(totalHeld)}${C.reset} tok held`);
296
299
  }
297
300
  // Live "now processing" line + why + recent deduped/compacted events,
298
301
  // collapsed to ONE rotating line (fresh only). The ticker ring buffer
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-mega-compact",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Layered, local, vector-backed context compressor for pi — supersede/collapse/cluster compaction with deduped inline recall.",
5
5
  "type": "module",
6
6
  "license": "BSD-2-Clause",