somtum 1.0.0 → 1.2.0
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 +85 -38
- package/dist/cli/config_cmd.js.map +1 -1
- package/dist/cli/hook.d.ts.map +1 -1
- package/dist/cli/hook.js +20 -3
- package/dist/cli/hook.js.map +1 -1
- package/dist/cli/index.js +12 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/serve.d.ts +11 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +113 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/core/extractor.d.ts +1 -1
- package/dist/core/extractor.d.ts.map +1 -1
- package/dist/core/extractor.js +1 -3
- package/dist/core/extractor.js.map +1 -1
- package/dist/dashboard/index.html +1290 -0
- package/dist/hooks/post_session.d.ts.map +1 -1
- package/dist/hooks/post_session.js +39 -21
- package/dist/hooks/post_session.js.map +1 -1
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
**Local-first memory and prompt-cache layer for Claude Code.**
|
|
4
4
|
|
|
5
|
+
[**Landing Page & Demo**](https://riz007.github.io/somtum/)
|
|
6
|
+
|
|
5
7
|
[](https://opensource.org/licenses/MIT)
|
|
6
8
|
[](https://www.npmjs.com/package/somtum)
|
|
7
9
|
|
|
@@ -20,6 +22,7 @@ Zero-config: one `somtum init` in an existing Claude Code project and every sess
|
|
|
20
22
|
- [Quickstart](#quickstart)
|
|
21
23
|
- [CLI Reference](#cli-reference)
|
|
22
24
|
- [MCP Server](#mcp-server)
|
|
25
|
+
- [Dashboard](#dashboard)
|
|
23
26
|
- [Storage Layout](#storage-layout)
|
|
24
27
|
- [Configuration](#configuration)
|
|
25
28
|
- [Privacy](#privacy)
|
|
@@ -163,7 +166,10 @@ somtum show 01JBZ...
|
|
|
163
166
|
# 4. Check your token savings
|
|
164
167
|
somtum stats
|
|
165
168
|
|
|
166
|
-
# 5.
|
|
169
|
+
# 5. Open the visual dashboard
|
|
170
|
+
somtum serve
|
|
171
|
+
|
|
172
|
+
# 6. Diagnose any issues
|
|
167
173
|
somtum doctor
|
|
168
174
|
```
|
|
169
175
|
|
|
@@ -204,6 +210,7 @@ somtum init --all
|
|
|
204
210
|
| `somtum forget <id>` | Soft-delete an observation |
|
|
205
211
|
| `somtum edit <id>` | Open an observation body in `$EDITOR` |
|
|
206
212
|
| `somtum rebuild` | Regenerate `index.md` from all observations |
|
|
213
|
+
| `somtum reindex` | Recompute embeddings (after a model change) |
|
|
207
214
|
|
|
208
215
|
### Data management
|
|
209
216
|
|
|
@@ -217,18 +224,15 @@ somtum init --all
|
|
|
217
224
|
| `somtum purge --older-than 30d` | Hard-delete soft-deleted entries older than 30 days |
|
|
218
225
|
| `somtum purge --older-than 30d --dry-run` | Preview without deleting |
|
|
219
226
|
|
|
220
|
-
###
|
|
221
|
-
|
|
222
|
-
| Command | Description |
|
|
223
|
-
| ---------------- | ------------------------------------------- |
|
|
224
|
-
| `somtum reindex` | Embed observations that are missing vectors |
|
|
225
|
-
|
|
226
|
-
### Stats
|
|
227
|
+
### Stats & visibility
|
|
227
228
|
|
|
228
|
-
| Command
|
|
229
|
-
|
|
|
230
|
-
| `somtum stats`
|
|
231
|
-
| `somtum stats --json`
|
|
229
|
+
| Command | Description |
|
|
230
|
+
| -------------------------- | ----------------------------------------------------------- |
|
|
231
|
+
| `somtum stats` | Tokens saved, cache hit rate, retrieval breakdown |
|
|
232
|
+
| `somtum stats --json` | Machine-readable JSON output |
|
|
233
|
+
| `somtum serve` | Open local web dashboard — memory browser, graph, analytics |
|
|
234
|
+
| `somtum serve --port 4000` | Specify a custom port (default: 3000) |
|
|
235
|
+
| `somtum serve --no-open` | Start the server without opening the browser |
|
|
232
236
|
|
|
233
237
|
### Configuration
|
|
234
238
|
|
|
@@ -248,7 +252,6 @@ somtum init --all
|
|
|
248
252
|
| `somtum sync pull` | scp from remote and merge into local DB |
|
|
249
253
|
|
|
250
254
|
Remote configured in config: `somtum config set sync.remote "user@host:/path/.somtum/projects/<id>"`
|
|
251
|
-
Somtum uses hostname-aware syncing to prevent data loss when using multiple devices.
|
|
252
255
|
|
|
253
256
|
---
|
|
254
257
|
|
|
@@ -256,12 +259,33 @@ Somtum uses hostname-aware syncing to prevent data loss when using multiple devi
|
|
|
256
259
|
|
|
257
260
|
Somtum includes a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server. When you run `somtum init --all`, it registers tools that Claude can use autonomously:
|
|
258
261
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
262
|
+
| Tool | What Claude can do with it |
|
|
263
|
+
| -------------- | ---------------------------------------------------------------------- |
|
|
264
|
+
| `recall` | Search memories by natural language when unsure about a project detail |
|
|
265
|
+
| `get` | Retrieve the full body of specific observations by ID |
|
|
266
|
+
| `remember` | Manually store an observation from within a session |
|
|
267
|
+
| `cache_lookup` | Check the prompt cache directly |
|
|
268
|
+
| `forget` | Soft-delete an observation |
|
|
269
|
+
| `stats` | Report on tokens saved, cache hit rate, and corpus size |
|
|
270
|
+
|
|
271
|
+
Every MCP response includes a `tokens` field so Claude can account for retrieval cost.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Dashboard
|
|
276
|
+
|
|
277
|
+
`somtum serve` opens a local web dashboard at `http://localhost:3000`:
|
|
278
|
+
|
|
279
|
+
- **Memory browser** — search across all observations using BM25, hybrid, or embedding-based retrieval; filter by kind (decision, bugfix, learning, command, file_summary); forget memories directly from the UI.
|
|
280
|
+
- **Knowledge graph** — vis-network graph where nodes are observations, edges represent shared files or tags. Clicking a node selects the memory in the list and vice versa.
|
|
281
|
+
- **Analytics tab** — kind breakdown, token ROI (saved vs. spent), cache hit rate + entry count, retrieval strategy usage, and top files by reference count.
|
|
282
|
+
- **Stat bar** — live counts for total memories, tokens saved, tokens spent, ROI ratio, and cache hit %.
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
somtum serve # opens on port 3000
|
|
286
|
+
somtum serve --port 4000 # custom port
|
|
287
|
+
somtum serve --no-open # don't auto-open the browser
|
|
288
|
+
```
|
|
265
289
|
|
|
266
290
|
---
|
|
267
291
|
|
|
@@ -297,7 +321,7 @@ Global config lives at `~/.somtum/config.json`. Per-project config at `.somtum/c
|
|
|
297
321
|
"cache": {
|
|
298
322
|
"enabled": true,
|
|
299
323
|
"fuzzy_match": true,
|
|
300
|
-
"fuzzy_threshold": 0.92, //
|
|
324
|
+
"fuzzy_threshold": 0.92, // raise to 0.95 once you have signal
|
|
301
325
|
"max_entries": 10000,
|
|
302
326
|
"ttl_days": 90,
|
|
303
327
|
},
|
|
@@ -361,17 +385,18 @@ somtum reindex # embed existing observations
|
|
|
361
385
|
|
|
362
386
|
Every `stats` figure is labelled _estimated_. Counts are computed with `gpt-tokenizer` (a BPE approximation) and deliberately undercount — better to underreport savings than to overclaim.
|
|
363
387
|
|
|
364
|
-
The breakeven ratio (`tokens_saved / tokens_spent`) measures whether extraction cost is paying off. A ratio below 1.
|
|
388
|
+
The breakeven ratio (`tokens_saved / tokens_spent`) measures whether extraction cost is paying off. A ratio below 1.5× triggers a warning in `somtum stats` and `somtum doctor`.
|
|
365
389
|
|
|
366
390
|
---
|
|
367
391
|
|
|
368
392
|
## Performance
|
|
369
393
|
|
|
370
|
-
| Scenario | p95 budget |
|
|
371
|
-
| --------------------------------------- | ---------- |
|
|
372
|
-
| `UserPromptSubmit` hook at 1k memories | 150 ms | < 2 ms
|
|
373
|
-
| `UserPromptSubmit` hook at 10k memories | 300 ms |
|
|
374
|
-
| Exact cache hash lookup | — | < 0.1 ms
|
|
394
|
+
| Scenario | p95 budget | Notes |
|
|
395
|
+
| --------------------------------------- | ---------- | ------------------------------------- |
|
|
396
|
+
| `UserPromptSubmit` hook at 1k memories | 150 ms | SQLite hash lookup — typically < 2 ms |
|
|
397
|
+
| `UserPromptSubmit` hook at 10k memories | 300 ms | BM25 k=8 — typically < 30 ms |
|
|
398
|
+
| Exact cache hash lookup | — | < 0.1 ms |
|
|
399
|
+
| `SessionEnd` hook (capture + embed) | — | Hard capped at 90 s; exits cleanly |
|
|
375
400
|
|
|
376
401
|
Run benchmarks yourself:
|
|
377
402
|
|
|
@@ -391,7 +416,7 @@ pnpm test:golden # retrieval recall@k per strategy
|
|
|
391
416
|
pnpm test:bench # hot-path latency benchmarks
|
|
392
417
|
pnpm lint # eslint
|
|
393
418
|
pnpm fmt # prettier
|
|
394
|
-
pnpm build # tsc + copy migrations → dist/
|
|
419
|
+
pnpm build # tsc + copy migrations + copy dashboard → dist/
|
|
395
420
|
```
|
|
396
421
|
|
|
397
422
|
### Project layout
|
|
@@ -399,6 +424,7 @@ pnpm build # tsc + copy migrations → dist/
|
|
|
399
424
|
```
|
|
400
425
|
src/
|
|
401
426
|
cli/ # commander-based CLI commands
|
|
427
|
+
serve.ts # local web dashboard (h3 + sirv)
|
|
402
428
|
core/
|
|
403
429
|
db.ts # SQLite setup, migration runner
|
|
404
430
|
store.ts # MemoryStore — CRUD for observations
|
|
@@ -406,16 +432,18 @@ src/
|
|
|
406
432
|
retriever/ # bm25, embeddings, hybrid, index, factory
|
|
407
433
|
extractor.ts # session transcript → observations (Claude)
|
|
408
434
|
index_gen.ts # renders index.md (incremental past 1k obs)
|
|
409
|
-
memory_files.ts
|
|
410
|
-
retrieval_stats.ts
|
|
411
|
-
embeddings.ts
|
|
412
|
-
|
|
413
|
-
|
|
435
|
+
memory_files.ts # writes memories/<YYYY-MM>/<ulid>.md
|
|
436
|
+
retrieval_stats.ts # per-strategy call counters
|
|
437
|
+
embeddings.ts # Embedder interface + encode/decode utils
|
|
438
|
+
embeddings_xenova.ts # @xenova/transformers ONNX backend
|
|
439
|
+
privacy.ts # redact() — runs on every capture
|
|
440
|
+
tokens.ts # gpt-tokenizer wrapper
|
|
414
441
|
hooks/
|
|
415
|
-
post_session.ts # SessionEnd: extract → store → index
|
|
442
|
+
post_session.ts # SessionEnd: extract → store → embed → index
|
|
416
443
|
pre_prompt.ts # UserPromptSubmit: cache lookup
|
|
417
444
|
pre_read.ts # PreToolUse: file gating
|
|
418
445
|
mcp/ # MCP server + tool implementations
|
|
446
|
+
dashboard/ # Single-file web UI (index.html)
|
|
419
447
|
config.ts # global + project config merge
|
|
420
448
|
index.ts # public API for embedding Somtum
|
|
421
449
|
src/db/migrations/ # NNN_name.sql migration files
|
|
@@ -441,10 +469,19 @@ test/
|
|
|
441
469
|
|
|
442
470
|
---
|
|
443
471
|
|
|
444
|
-
...
|
|
445
|
-
|
|
446
472
|
## Troubleshooting
|
|
447
473
|
|
|
474
|
+
### Agent appears to keep running after a session ends
|
|
475
|
+
|
|
476
|
+
The `SessionEnd` hook runs after every session to extract and store observations. On first install with embeddings enabled, it also downloads a ~30 MB ONNX model. The hook has a hard 90-second cap — it will always exit within that window. If you see a `somtum hook post_session` process in your process list, it is working normally in the background and will exit on its own.
|
|
477
|
+
|
|
478
|
+
To reduce hook duration, disable file summaries or embeddings:
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
somtum config set file_gating.enabled false
|
|
482
|
+
somtum config set retrieval.embeddings.enabled false
|
|
483
|
+
```
|
|
484
|
+
|
|
448
485
|
### Installation fails (node-gyp / better-sqlite3)
|
|
449
486
|
|
|
450
487
|
If you see errors related to building `better-sqlite3`, ensure you have build tools installed:
|
|
@@ -455,11 +492,21 @@ If you see errors related to building `better-sqlite3`, ensure you have build to
|
|
|
455
492
|
|
|
456
493
|
### "Anthropic API Key not found"
|
|
457
494
|
|
|
458
|
-
The capture hook requires `ANTHROPIC_API_KEY` to be set in your environment. Add it to your `.zshrc`, `.bashrc
|
|
495
|
+
The capture hook requires `ANTHROPIC_API_KEY` to be set in your environment. Add it to your shell profile (`.zshrc`, `.bashrc`) or a `.env` file loaded by your shell.
|
|
459
496
|
|
|
460
497
|
### Claude isn't using the memories
|
|
461
498
|
|
|
462
|
-
Run `somtum doctor` to verify that hooks are correctly installed in
|
|
499
|
+
Run `somtum doctor` to verify that hooks are correctly installed in `.claude/settings.json` and that the MCP server is registered in `.mcp.json`.
|
|
500
|
+
|
|
501
|
+
### Embeddings are slow or the model won't download
|
|
502
|
+
|
|
503
|
+
The `bge-small-en-v1.5` model (~30 MB) downloads to `~/.somtum/models/` on first use. If the download stalls, disable embeddings and fall back to BM25:
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
somtum config set retrieval.embeddings.enabled false
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
BM25 retrieval is near-zero cost and works fully offline.
|
|
463
510
|
|
|
464
511
|
---
|
|
465
512
|
|
|
@@ -473,4 +520,4 @@ Contributions are welcome! If you'd like to help improve Somtum, please see our
|
|
|
473
520
|
|
|
474
521
|
## License
|
|
475
522
|
|
|
476
|
-
Licensed under the
|
|
523
|
+
Licensed under the [MIT License](LICENSE).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config_cmd.js","sourceRoot":"","sources":["../../src/cli/config_cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"config_cmd.js","sourceRoot":"","sources":["../../src/cli/config_cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"AA6BA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD/D"}
|
package/dist/cli/hook.js
CHANGED
|
@@ -6,6 +6,22 @@
|
|
|
6
6
|
import { readToEnd, runPostSession, HookPayloadSchema } from '../hooks/post_session.js';
|
|
7
7
|
import { runPrePrompt, PrePromptPayloadSchema } from '../hooks/pre_prompt.js';
|
|
8
8
|
import { runPreRead, PreReadPayloadSchema } from '../hooks/pre_read.js';
|
|
9
|
+
// Maximum wall-clock time each hook is allowed before we abort and exit.
|
|
10
|
+
// Claude Code sessions must not hang because a hook is stuck on a slow API
|
|
11
|
+
// call, a failed embedding-model download, or an unreachable network.
|
|
12
|
+
const HOOK_TIMEOUTS_MS = {
|
|
13
|
+
post_session: 90_000, // extract + embed + file summaries — generous but bounded
|
|
14
|
+
pre_prompt: 5_000, // hot path: only SQLite lookups in the common case
|
|
15
|
+
pre_read: 1_000, // synchronous; 1 s is already very generous
|
|
16
|
+
};
|
|
17
|
+
function raceTimeout(p, ms, _label) {
|
|
18
|
+
return Promise.race([
|
|
19
|
+
p,
|
|
20
|
+
new Promise((_, reject) =>
|
|
21
|
+
// Unref so the timer doesn't keep the process alive after natural exit.
|
|
22
|
+
setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms).unref()),
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
9
25
|
export async function hookCommand(name) {
|
|
10
26
|
const raw = await readToEnd(process.stdin);
|
|
11
27
|
let parsed;
|
|
@@ -16,11 +32,12 @@ export async function hookCommand(name) {
|
|
|
16
32
|
console.error(`[somtum] hook ${name}: invalid JSON on stdin: ${err.message}`);
|
|
17
33
|
return 0;
|
|
18
34
|
}
|
|
35
|
+
const timeoutMs = HOOK_TIMEOUTS_MS[name] ?? 30_000;
|
|
19
36
|
switch (name) {
|
|
20
37
|
case 'post_session': {
|
|
21
38
|
try {
|
|
22
39
|
const payload = HookPayloadSchema.parse(parsed);
|
|
23
|
-
const r = await runPostSession(payload);
|
|
40
|
+
const r = await raceTimeout(runPostSession(payload), timeoutMs, 'post_session');
|
|
24
41
|
console.log(JSON.stringify({
|
|
25
42
|
ok: true,
|
|
26
43
|
inserted: r.inserted,
|
|
@@ -31,7 +48,7 @@ export async function hookCommand(name) {
|
|
|
31
48
|
}));
|
|
32
49
|
}
|
|
33
50
|
catch (err) {
|
|
34
|
-
// Exit 0: hook failures must
|
|
51
|
+
// Exit 0: hook failures must never break the user's Claude Code session.
|
|
35
52
|
console.error(`[somtum] post_session failed: ${err.message}`);
|
|
36
53
|
}
|
|
37
54
|
return 0;
|
|
@@ -39,7 +56,7 @@ export async function hookCommand(name) {
|
|
|
39
56
|
case 'pre_prompt': {
|
|
40
57
|
try {
|
|
41
58
|
const payload = PrePromptPayloadSchema.parse(parsed);
|
|
42
|
-
const output = await runPrePrompt(payload);
|
|
59
|
+
const output = await raceTimeout(runPrePrompt(payload), timeoutMs, 'pre_prompt');
|
|
43
60
|
console.log(JSON.stringify(output));
|
|
44
61
|
}
|
|
45
62
|
catch (err) {
|
package/dist/cli/hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,6BAA6B;AAC7B,2BAA2B;AAC3B,EAAE;AACF,yEAAyE;AAEzE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,4BAA6B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/cli/hook.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -17,11 +17,12 @@ import { doctorCommand } from './doctor.js';
|
|
|
17
17
|
import { configGetCommand, configSetCommand } from './config_cmd.js';
|
|
18
18
|
import { runMcpServer } from '../mcp/server.js';
|
|
19
19
|
import { printLogo } from './ui.js';
|
|
20
|
+
import { serveCommand } from './serve.js';
|
|
20
21
|
const program = new Command();
|
|
21
22
|
program
|
|
22
23
|
.name('somtum')
|
|
23
24
|
.description('Local-first memory and prompt-cache layer for Claude Code')
|
|
24
|
-
.version('
|
|
25
|
+
.version('1.0.0');
|
|
25
26
|
// Show logo unless it's an internal hook call or MCP server.
|
|
26
27
|
const isInternal = process.argv.includes('hook') || process.argv.includes('mcp');
|
|
27
28
|
if (!isInternal) {
|
|
@@ -142,9 +143,7 @@ program
|
|
|
142
143
|
const code = importCommand(file, opts);
|
|
143
144
|
process.exit(code);
|
|
144
145
|
});
|
|
145
|
-
const configCmd = program
|
|
146
|
-
.command('config')
|
|
147
|
-
.description('Read or write somtum configuration');
|
|
146
|
+
const configCmd = program.command('config').description('Read or write somtum configuration');
|
|
148
147
|
configCmd
|
|
149
148
|
.command('get [key]')
|
|
150
149
|
.description('Print config value at key (dot-separated path), or entire config if omitted')
|
|
@@ -215,6 +214,15 @@ program
|
|
|
215
214
|
const code = await doctorCommand(opts);
|
|
216
215
|
process.exit(code);
|
|
217
216
|
});
|
|
217
|
+
program
|
|
218
|
+
.command('serve')
|
|
219
|
+
.description('Open a local web dashboard to browse memories and project knowledge graph')
|
|
220
|
+
.option('--port <n>', 'Port to listen on', (v) => Number.parseInt(v, 10), 3000)
|
|
221
|
+
.option('--no-open', 'Do not open browser automatically')
|
|
222
|
+
.action(async (opts) => {
|
|
223
|
+
const code = await serveCommand({ port: opts.port, open: opts.open });
|
|
224
|
+
process.exit(code);
|
|
225
|
+
});
|
|
218
226
|
program
|
|
219
227
|
.command('hook <name>')
|
|
220
228
|
.description('Internal: dispatch a hook by name. Invoked by .claude/settings.json.')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function runServe(options?: {
|
|
2
|
+
port?: number;
|
|
3
|
+
open?: boolean;
|
|
4
|
+
cwd?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
export declare function serveCommand(options?: {
|
|
7
|
+
port?: number;
|
|
8
|
+
open?: boolean;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
}): Promise<number>;
|
|
11
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAgDA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,iBAkF3F;AAED,wBAAsB,YAAY,CAChC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,OAAO,CAAC,MAAM,CAAC,CAQjB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { join, dirname } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { H3, defineEventHandler, getQuery, getRouterParam, fromNodeHandler, toNodeHandler, } from 'h3';
|
|
4
|
+
import { listen } from 'listhen';
|
|
5
|
+
import sirv from 'sirv';
|
|
6
|
+
import { openDb } from '../core/db.js';
|
|
7
|
+
import { MemoryStore } from '../core/store.js';
|
|
8
|
+
import { PromptCache } from '../core/cache.js';
|
|
9
|
+
import { RetrievalStatsStore } from '../core/retrieval_stats.js';
|
|
10
|
+
import { resolveProjectId } from '../core/project_id.js';
|
|
11
|
+
import { projectDir, loadConfig } from '../config.js';
|
|
12
|
+
import { makeRetriever } from '../core/retriever/factory.js';
|
|
13
|
+
import { RetrievalStrategy } from '../core/schema.js';
|
|
14
|
+
const GRAPH_NODE_CAP = 200;
|
|
15
|
+
const GRAPH_EDGE_CAP = 500;
|
|
16
|
+
function buildGraph(memories) {
|
|
17
|
+
const capped = memories.slice(0, GRAPH_NODE_CAP);
|
|
18
|
+
const nodes = capped.map((m) => ({
|
|
19
|
+
id: m.id,
|
|
20
|
+
label: m.title.length > 30 ? m.title.slice(0, 27) + '...' : m.title,
|
|
21
|
+
kind: m.kind,
|
|
22
|
+
title: m.title,
|
|
23
|
+
}));
|
|
24
|
+
const edges = [];
|
|
25
|
+
outer: for (let i = 0; i < capped.length; i++) {
|
|
26
|
+
for (let j = i + 1; j < capped.length; j++) {
|
|
27
|
+
if (edges.length >= GRAPH_EDGE_CAP)
|
|
28
|
+
break outer;
|
|
29
|
+
const m1 = capped[i];
|
|
30
|
+
const m2 = capped[j];
|
|
31
|
+
if (m1.files.some((f) => m2.files.includes(f)) || m1.tags.some((t) => m2.tags.includes(t))) {
|
|
32
|
+
edges.push({ from: m1.id, to: m2.id });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { nodes, edges };
|
|
37
|
+
}
|
|
38
|
+
export async function runServe(options = {}) {
|
|
39
|
+
const cwd = options.cwd ?? process.cwd();
|
|
40
|
+
const projectId = resolveProjectId(cwd);
|
|
41
|
+
const dbPath = join(projectDir(projectId), 'db.sqlite');
|
|
42
|
+
const db = openDb({ path: dbPath });
|
|
43
|
+
const store = new MemoryStore(db);
|
|
44
|
+
const cache = new PromptCache(db);
|
|
45
|
+
const rsStats = new RetrievalStatsStore(db);
|
|
46
|
+
const config = loadConfig({ cwd });
|
|
47
|
+
const app = new H3();
|
|
48
|
+
// Lightweight summary + pre-computed graph for initial load
|
|
49
|
+
app.get('/api/data', defineEventHandler(() => {
|
|
50
|
+
const memories = store.listByProject(projectId);
|
|
51
|
+
return {
|
|
52
|
+
stats: {
|
|
53
|
+
projectId,
|
|
54
|
+
memories: store.countByProject(projectId),
|
|
55
|
+
tokensSaved: store.totalTokensSaved(projectId),
|
|
56
|
+
tokensSpent: store.totalTokensSpent(projectId),
|
|
57
|
+
},
|
|
58
|
+
memories,
|
|
59
|
+
graph: buildGraph(memories),
|
|
60
|
+
};
|
|
61
|
+
}));
|
|
62
|
+
// Full analytics: kind breakdown, top files, retrieval usage, cache summary
|
|
63
|
+
app.get('/api/stats/full', defineEventHandler(() => ({
|
|
64
|
+
kindBreakdown: store.countByKind(projectId),
|
|
65
|
+
topFiles: store.topFileReferences(projectId, 20),
|
|
66
|
+
retrieval: rsStats.getRetrievalBreakdown(projectId),
|
|
67
|
+
cache: {
|
|
68
|
+
...rsStats.getCacheHitSummary(projectId),
|
|
69
|
+
entry_count: cache.count(),
|
|
70
|
+
},
|
|
71
|
+
})));
|
|
72
|
+
// Server-side search — routes to the configured retriever strategy
|
|
73
|
+
app.get('/api/search', defineEventHandler(async (event) => {
|
|
74
|
+
const q = getQuery(event);
|
|
75
|
+
const query = String(q['q'] ?? '').trim();
|
|
76
|
+
const k = Math.min(Math.max(1, Number(q['k'] ?? 8)), 50);
|
|
77
|
+
if (!query)
|
|
78
|
+
return { results: [], strategy: 'bm25' };
|
|
79
|
+
const parsed = RetrievalStrategy.safeParse(q['strategy']);
|
|
80
|
+
const strategy = parsed.success ? parsed.data : 'bm25';
|
|
81
|
+
const retriever = makeRetriever(strategy, db, config);
|
|
82
|
+
const results = await retriever.search(query, { k, projectId });
|
|
83
|
+
return { results, strategy: retriever.name };
|
|
84
|
+
}));
|
|
85
|
+
// Soft-delete a memory from the UI
|
|
86
|
+
app.delete('/api/memories/:id', defineEventHandler((event) => {
|
|
87
|
+
const id = getRouterParam(event, 'id') ?? '';
|
|
88
|
+
return { ok: store.softDelete(id) };
|
|
89
|
+
}));
|
|
90
|
+
// Static dashboard — sirv wraps as a Node handler; only called for unmatched routes
|
|
91
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
92
|
+
const dashboardDir = join(__dirname, '..', 'dashboard');
|
|
93
|
+
const sirvMiddleware = sirv(dashboardDir, { single: true, dev: true });
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
app.use(fromNodeHandler((req, res) => sirvMiddleware(req, res, () => { })));
|
|
96
|
+
await listen(toNodeHandler(app), {
|
|
97
|
+
port: options.port ?? 3000,
|
|
98
|
+
open: options.open ?? true,
|
|
99
|
+
name: 'Somtum Dashboard',
|
|
100
|
+
showURL: true,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export async function serveCommand(options = {}) {
|
|
104
|
+
try {
|
|
105
|
+
await runServe(options);
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error(`serve error: ${err.message}`);
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
package/dist/core/extractor.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAiB5D;AAyDD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAuD5B;AAMD,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,oBAAoB,EACjC,iBAAiB,EAAE,MAAM,GACxB,MAAM,CAKR"}
|
package/dist/core/extractor.js
CHANGED
|
@@ -9,9 +9,7 @@ export function anthropicCaller(client) {
|
|
|
9
9
|
system,
|
|
10
10
|
messages: [{ role: 'user', content: user }],
|
|
11
11
|
});
|
|
12
|
-
const text = resp.content
|
|
13
|
-
.map((b) => (b.type === 'text' ? b.text : ''))
|
|
14
|
-
.join('');
|
|
12
|
+
const text = resp.content.map((b) => (b.type === 'text' ? b.text : '')).join('');
|
|
15
13
|
return {
|
|
16
14
|
text,
|
|
17
15
|
inputTokens: resp.usage.input_tokens,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EAGvB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;YACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACxC,KAAK;gBACL,UAAU,EAAE,IAAI;gBAChB,MAAM;gBACN,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aAC5C,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"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"}
|