somtum 0.1.3 → 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/LICENSE +21 -663
- package/README.md +101 -46
- package/dist/cli/config_cmd.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.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 +18 -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/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +56 -26
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/ui.d.ts +3 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +21 -0
- package/dist/cli/ui.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 +8 -4
package/README.md
CHANGED
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
**Local-first memory and prompt-cache layer for Claude Code.**
|
|
4
4
|
|
|
5
|
-
[
|
|
5
|
+
[**Landing Page & Demo**](https://riz007.github.io/somtum/)
|
|
6
|
+
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
8
|
[](https://www.npmjs.com/package/somtum)
|
|
7
9
|
|
|
8
|
-
Somtum captures durable observations from your Claude Code sessions — decisions, bugfixes, learnings, file summaries — stores them in a local SQLite database, and injects the relevant ones back into context
|
|
10
|
+
Somtum (Thai: ส้มตำ) is named after the vibrant, shredded green papaya salad. Just like its namesake, Somtum captures and blends durable observations from your Claude Code sessions — decisions, bugfixes, learnings, file summaries — stores them in a local SQLite database, and injects the relevant ones back into context. It also caches repeated prompt→response pairs so identical (or near-identical) prompts never hit the model twice.
|
|
9
11
|
|
|
10
12
|
Zero-config: one `somtum init` in an existing Claude Code project and every session end is captured automatically. No server, no cloud account, no mandatory tuning.
|
|
11
13
|
|
|
12
14
|
---
|
|
13
15
|
|
|
14
16
|
## Table of Contents
|
|
17
|
+
|
|
15
18
|
- [Why Somtum?](#why-somtum)
|
|
16
19
|
- [How it works](#how-it-works)
|
|
17
20
|
- [Requirements](#requirements)
|
|
@@ -19,6 +22,7 @@ Zero-config: one `somtum init` in an existing Claude Code project and every sess
|
|
|
19
22
|
- [Quickstart](#quickstart)
|
|
20
23
|
- [CLI Reference](#cli-reference)
|
|
21
24
|
- [MCP Server](#mcp-server)
|
|
25
|
+
- [Dashboard](#dashboard)
|
|
22
26
|
- [Storage Layout](#storage-layout)
|
|
23
27
|
- [Configuration](#configuration)
|
|
24
28
|
- [Privacy](#privacy)
|
|
@@ -33,9 +37,10 @@ Zero-config: one `somtum init` in an existing Claude Code project and every sess
|
|
|
33
37
|
## Why Somtum?
|
|
34
38
|
|
|
35
39
|
LLM agents like Claude Code typically start every session with a "blank slate." This leads to:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
|
|
41
|
+
- **Repetitive Explanations:** Having to re-explain architectural choices or local conventions.
|
|
42
|
+
- **Regressions:** Claude might suggest a fix you've already tried and discarded.
|
|
43
|
+
- **Context Waste:** Large codebases eat up tokens just to "set the scene."
|
|
39
44
|
|
|
40
45
|
**Somtum gives Claude a long-term memory.** It ensures that once a decision is made or a bug is fixed, it stays "remembered" across all future sessions without bloating your context window.
|
|
41
46
|
|
|
@@ -161,7 +166,10 @@ somtum show 01JBZ...
|
|
|
161
166
|
# 4. Check your token savings
|
|
162
167
|
somtum stats
|
|
163
168
|
|
|
164
|
-
# 5.
|
|
169
|
+
# 5. Open the visual dashboard
|
|
170
|
+
somtum serve
|
|
171
|
+
|
|
172
|
+
# 6. Diagnose any issues
|
|
165
173
|
somtum doctor
|
|
166
174
|
```
|
|
167
175
|
|
|
@@ -202,6 +210,7 @@ somtum init --all
|
|
|
202
210
|
| `somtum forget <id>` | Soft-delete an observation |
|
|
203
211
|
| `somtum edit <id>` | Open an observation body in `$EDITOR` |
|
|
204
212
|
| `somtum rebuild` | Regenerate `index.md` from all observations |
|
|
213
|
+
| `somtum reindex` | Recompute embeddings (after a model change) |
|
|
205
214
|
|
|
206
215
|
### Data management
|
|
207
216
|
|
|
@@ -215,18 +224,15 @@ somtum init --all
|
|
|
215
224
|
| `somtum purge --older-than 30d` | Hard-delete soft-deleted entries older than 30 days |
|
|
216
225
|
| `somtum purge --older-than 30d --dry-run` | Preview without deleting |
|
|
217
226
|
|
|
218
|
-
###
|
|
219
|
-
|
|
220
|
-
| Command | Description |
|
|
221
|
-
| ---------------- | ------------------------------------------- |
|
|
222
|
-
| `somtum reindex` | Embed observations that are missing vectors |
|
|
227
|
+
### Stats & visibility
|
|
223
228
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
|
227
|
-
|
|
|
228
|
-
| `somtum
|
|
229
|
-
| `somtum
|
|
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 |
|
|
230
236
|
|
|
231
237
|
### Configuration
|
|
232
238
|
|
|
@@ -237,7 +243,7 @@ somtum init --all
|
|
|
237
243
|
| `somtum config set retrieval.strategy hybrid` | Write to `.somtum/config.json` |
|
|
238
244
|
| `somtum config set retrieval.embeddings.enabled true --global` | Write to `~/.somtum/config.json` |
|
|
239
245
|
|
|
240
|
-
### Sync
|
|
246
|
+
### Sync
|
|
241
247
|
|
|
242
248
|
| Command | Description |
|
|
243
249
|
| -------------------- | ----------------------------------------- |
|
|
@@ -253,12 +259,33 @@ Remote configured in config: `somtum config set sync.remote "user@host:/path/.so
|
|
|
253
259
|
|
|
254
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:
|
|
255
261
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
+
```
|
|
262
289
|
|
|
263
290
|
---
|
|
264
291
|
|
|
@@ -294,7 +321,7 @@ Global config lives at `~/.somtum/config.json`. Per-project config at `.somtum/c
|
|
|
294
321
|
"cache": {
|
|
295
322
|
"enabled": true,
|
|
296
323
|
"fuzzy_match": true,
|
|
297
|
-
"fuzzy_threshold": 0.92, //
|
|
324
|
+
"fuzzy_threshold": 0.92, // raise to 0.95 once you have signal
|
|
298
325
|
"max_entries": 10000,
|
|
299
326
|
"ttl_days": 90,
|
|
300
327
|
},
|
|
@@ -358,17 +385,18 @@ somtum reindex # embed existing observations
|
|
|
358
385
|
|
|
359
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.
|
|
360
387
|
|
|
361
|
-
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`.
|
|
362
389
|
|
|
363
390
|
---
|
|
364
391
|
|
|
365
392
|
## Performance
|
|
366
393
|
|
|
367
|
-
| Scenario | p95 budget |
|
|
368
|
-
| --------------------------------------- | ---------- |
|
|
369
|
-
| `UserPromptSubmit` hook at 1k memories | 150 ms | < 2 ms
|
|
370
|
-
| `UserPromptSubmit` hook at 10k memories | 300 ms |
|
|
371
|
-
| 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 |
|
|
372
400
|
|
|
373
401
|
Run benchmarks yourself:
|
|
374
402
|
|
|
@@ -388,7 +416,7 @@ pnpm test:golden # retrieval recall@k per strategy
|
|
|
388
416
|
pnpm test:bench # hot-path latency benchmarks
|
|
389
417
|
pnpm lint # eslint
|
|
390
418
|
pnpm fmt # prettier
|
|
391
|
-
pnpm build # tsc + copy migrations → dist/
|
|
419
|
+
pnpm build # tsc + copy migrations + copy dashboard → dist/
|
|
392
420
|
```
|
|
393
421
|
|
|
394
422
|
### Project layout
|
|
@@ -396,6 +424,7 @@ pnpm build # tsc + copy migrations → dist/
|
|
|
396
424
|
```
|
|
397
425
|
src/
|
|
398
426
|
cli/ # commander-based CLI commands
|
|
427
|
+
serve.ts # local web dashboard (h3 + sirv)
|
|
399
428
|
core/
|
|
400
429
|
db.ts # SQLite setup, migration runner
|
|
401
430
|
store.ts # MemoryStore — CRUD for observations
|
|
@@ -403,16 +432,18 @@ src/
|
|
|
403
432
|
retriever/ # bm25, embeddings, hybrid, index, factory
|
|
404
433
|
extractor.ts # session transcript → observations (Claude)
|
|
405
434
|
index_gen.ts # renders index.md (incremental past 1k obs)
|
|
406
|
-
memory_files.ts
|
|
407
|
-
retrieval_stats.ts
|
|
408
|
-
embeddings.ts
|
|
409
|
-
|
|
410
|
-
|
|
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
|
|
411
441
|
hooks/
|
|
412
|
-
post_session.ts # SessionEnd: extract → store → index
|
|
442
|
+
post_session.ts # SessionEnd: extract → store → embed → index
|
|
413
443
|
pre_prompt.ts # UserPromptSubmit: cache lookup
|
|
414
444
|
pre_read.ts # PreToolUse: file gating
|
|
415
445
|
mcp/ # MCP server + tool implementations
|
|
446
|
+
dashboard/ # Single-file web UI (index.html)
|
|
416
447
|
config.ts # global + project config merge
|
|
417
448
|
index.ts # public API for embedding Somtum
|
|
418
449
|
src/db/migrations/ # NNN_name.sql migration files
|
|
@@ -437,20 +468,45 @@ test/
|
|
|
437
468
|
4. Add an integration test in `src/mcp/server.test.ts`
|
|
438
469
|
|
|
439
470
|
---
|
|
440
|
-
|
|
471
|
+
|
|
441
472
|
## Troubleshooting
|
|
442
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
|
+
|
|
443
485
|
### Installation fails (node-gyp / better-sqlite3)
|
|
486
|
+
|
|
444
487
|
If you see errors related to building `better-sqlite3`, ensure you have build tools installed:
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
488
|
+
|
|
489
|
+
- **macOS:** `xcode-select --install`
|
|
490
|
+
- **Ubuntu/Debian:** `sudo apt-get install build-essential python3`
|
|
491
|
+
- **Windows:** `npm install --global --production windows-build-tools`
|
|
448
492
|
|
|
449
493
|
### "Anthropic API Key not found"
|
|
450
|
-
|
|
494
|
+
|
|
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.
|
|
451
496
|
|
|
452
497
|
### Claude isn't using the memories
|
|
453
|
-
|
|
498
|
+
|
|
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.
|
|
454
510
|
|
|
455
511
|
---
|
|
456
512
|
|
|
@@ -464,5 +520,4 @@ Contributions are welcome! If you'd like to help improve Somtum, please see our
|
|
|
464
520
|
|
|
465
521
|
## License
|
|
466
522
|
|
|
467
|
-
Licensed under the
|
|
468
|
-
|
|
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/doctor.js
CHANGED
|
@@ -69,7 +69,7 @@ export function runDoctor(opts = {}) {
|
|
|
69
69
|
});
|
|
70
70
|
// 6. All expected migrations applied
|
|
71
71
|
const applied = appliedVersions(db);
|
|
72
|
-
const expectedVersions = [1, 2];
|
|
72
|
+
const expectedVersions = [1, 2, 3];
|
|
73
73
|
const missing = expectedVersions.filter((v) => !applied.includes(v));
|
|
74
74
|
checks.push({
|
|
75
75
|
name: 'migrations',
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.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
|
@@ -16,11 +16,18 @@ import { syncCommand } from './sync.js';
|
|
|
16
16
|
import { doctorCommand } from './doctor.js';
|
|
17
17
|
import { configGetCommand, configSetCommand } from './config_cmd.js';
|
|
18
18
|
import { runMcpServer } from '../mcp/server.js';
|
|
19
|
+
import { printLogo } from './ui.js';
|
|
20
|
+
import { serveCommand } from './serve.js';
|
|
19
21
|
const program = new Command();
|
|
20
22
|
program
|
|
21
23
|
.name('somtum')
|
|
22
24
|
.description('Local-first memory and prompt-cache layer for Claude Code')
|
|
23
|
-
.version('
|
|
25
|
+
.version('1.0.0');
|
|
26
|
+
// Show logo unless it's an internal hook call or MCP server.
|
|
27
|
+
const isInternal = process.argv.includes('hook') || process.argv.includes('mcp');
|
|
28
|
+
if (!isInternal) {
|
|
29
|
+
printLogo();
|
|
30
|
+
}
|
|
24
31
|
program
|
|
25
32
|
.command('init')
|
|
26
33
|
.description('Install the SessionEnd capture hook (and optional extras) in the current project')
|
|
@@ -136,9 +143,7 @@ program
|
|
|
136
143
|
const code = importCommand(file, opts);
|
|
137
144
|
process.exit(code);
|
|
138
145
|
});
|
|
139
|
-
const configCmd = program
|
|
140
|
-
.command('config')
|
|
141
|
-
.description('Read or write somtum configuration');
|
|
146
|
+
const configCmd = program.command('config').description('Read or write somtum configuration');
|
|
142
147
|
configCmd
|
|
143
148
|
.command('get [key]')
|
|
144
149
|
.description('Print config value at key (dot-separated path), or entire config if omitted')
|
|
@@ -209,6 +214,15 @@ program
|
|
|
209
214
|
const code = await doctorCommand(opts);
|
|
210
215
|
process.exit(code);
|
|
211
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
|
+
});
|
|
212
226
|
program
|
|
213
227
|
.command('hook <name>')
|
|
214
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;
|
|
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
|