lemma-mcp 0.16.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +29 -29
  2. package/dist/db/schema.d.ts +1 -0
  3. package/dist/db/schema.d.ts.map +1 -1
  4. package/dist/db/schema.js +19 -1
  5. package/dist/db/schema.js.map +1 -1
  6. package/dist/index.js +75 -33
  7. package/dist/index.js.map +1 -1
  8. package/dist/logger.d.ts.map +1 -1
  9. package/dist/logger.js +2 -1
  10. package/dist/logger.js.map +1 -1
  11. package/dist/memory/core.d.ts +28 -0
  12. package/dist/memory/core.d.ts.map +1 -1
  13. package/dist/memory/core.js +53 -1
  14. package/dist/memory/core.js.map +1 -1
  15. package/dist/memory/index.d.ts +1 -1
  16. package/dist/memory/index.d.ts.map +1 -1
  17. package/dist/memory/index.js +1 -1
  18. package/dist/memory/index.js.map +1 -1
  19. package/dist/server/handlers.d.ts.map +1 -1
  20. package/dist/server/handlers.js +79 -70
  21. package/dist/server/handlers.js.map +1 -1
  22. package/dist/server/index.d.ts.map +1 -1
  23. package/dist/server/index.js +173 -192
  24. package/dist/server/index.js.map +1 -1
  25. package/dist/server/prompt-content.js +11 -11
  26. package/dist/server/prompt-content.js.map +1 -1
  27. package/dist/server/system-prompt.js +1 -1
  28. package/dist/server/system-prompt.js.map +1 -1
  29. package/dist/server/tools.d.ts.map +1 -1
  30. package/dist/server/tools.js +33 -34
  31. package/dist/server/tools.js.map +1 -1
  32. package/dist/server/visualize.js +1 -1
  33. package/dist/server/visualize.js.map +1 -1
  34. package/dist/sessions/core.d.ts.map +1 -1
  35. package/dist/sessions/core.js +18 -6
  36. package/dist/sessions/core.js.map +1 -1
  37. package/dist/sessions/virtual.js +10 -10
  38. package/dist/sessions/virtual.js.map +1 -1
  39. package/docs/README.tr.md +188 -0
  40. package/package.json +4 -4
package/README.md CHANGED
@@ -63,7 +63,7 @@ Memories are injected into tool descriptions via `tools/list`. The LLM starts ev
63
63
 
64
64
  **Memory types:** `fact`, `pattern`, `lesson`, `warning`, `context`
65
65
 
66
- **Knowledge pipeline:** Memory (what you know, `lemma_memory_add`) → Pattern (`type: "pattern"`) → Guide (how you work, `lemma_guide_distill` → `lemma_guide_practice`)
66
+ **Knowledge pipeline:** Memory (what you know, `memory_add`) → Pattern (`type: "pattern"`) → Guide (how you work, `guide_distill` → `guide_practice`)
67
67
 
68
68
  **No project-file modification:** Lemma injects memory through the MCP prompt layer — the system prompt and tool descriptions — and never writes to `AGENTS.md` or any project file. This works identically on every MCP client. (Legacy `<!-- lemma:* -->` blocks left by older versions are auto-cleaned on startup.)
69
69
 
@@ -79,51 +79,53 @@ Manual deep analysis is also available via dedicated tools.
79
79
 
80
80
  ## Tools (26)
81
81
 
82
+ Lemma exposes short MCP tool names such as `memory_read`, `memory_add`, and `session_start`. Most clients display tools with the server namespace prepended, so you may see names like `mcp_lemma_memory_add`; that is expected. Redundant doubled names like `mcp_lemma_lemma_memory_add` are not used.
83
+
82
84
  ### Memory (10)
83
85
 
84
86
  | Tool | Purpose |
85
87
  |------|---------|
86
- | `lemma_memory_read` | Read/search fragments. Summary mode or full detail by ID |
87
- | `lemma_memory_add` | Save findings. Auto-redacts secrets, detects duplicates and conflicts |
88
- | `lemma_memory_update` | Update fragment by ID |
89
- | `lemma_memory_feedback` | Positive/negative feedback, adjusts confidence |
90
- | `lemma_memory_forget` | Delete fragment |
91
- | `lemma_memory_merge` | Merge fragments, inherit relations & guide links |
92
- | `lemma_memory_relate` | Create typed links (`contradicts`, `supersedes`, `supports`, `related_to`) |
93
- | `lemma_memory_stats` | Fragment counts, confidence, project breakdown |
94
- | `lemma_memory_audit` | Integrity check for orphans, duplicates, anomalies |
95
- | `lemma_memory_library` | Full knowledge base snapshot with analysis signals and suggestions |
88
+ | `memory_read` | Read/search fragments. Summary mode or full detail by ID |
89
+ | `memory_add` | Save findings. Auto-redacts secrets, detects duplicates and conflicts |
90
+ | `memory_update` | Update fragment by ID |
91
+ | `memory_feedback` | Positive/negative feedback, adjusts confidence |
92
+ | `memory_forget` | Delete fragment |
93
+ | `memory_merge` | Merge fragments, inherit relations & guide links |
94
+ | `memory_relate` | Create typed links (`contradicts`, `supersedes`, `supports`, `related_to`) |
95
+ | `memory_stats` | Fragment counts, confidence, project breakdown |
96
+ | `memory_audit` | Integrity check for orphans, duplicates, anomalies |
97
+ | `memory_library` | Full knowledge base snapshot with analysis signals and suggestions |
96
98
 
97
99
  ### Guides (7)
98
100
 
99
101
  | Tool | Purpose |
100
102
  |------|---------|
101
- | `lemma_guide_get` | Get guides sorted by usage, filter by category or task |
102
- | `lemma_guide_practice` | Record guide usage. Auto-creates guide if missing |
103
- | `lemma_guide_create` | Create guide with detailed manual |
104
- | `lemma_guide_distill` | Transform memory → guide learning (bidirectional link) |
105
- | `lemma_guide_update` | Update guide properties, anti-patterns, pitfalls |
106
- | `lemma_guide_forget` | Remove guide |
107
- | `lemma_guide_merge` | Merge guides, inherit source memories |
103
+ | `guide_get` | Get guides sorted by usage, filter by category or task |
104
+ | `guide_practice` | Record guide usage. Auto-creates guide if missing |
105
+ | `guide_create` | Create guide with detailed manual |
106
+ | `guide_distill` | Transform memory → guide learning (bidirectional link) |
107
+ | `guide_update` | Update guide properties, anti-patterns, pitfalls |
108
+ | `guide_forget` | Remove guide |
109
+ | `guide_merge` | Merge guides, inherit source memories |
108
110
 
109
111
  ### Sessions (5)
110
112
 
111
113
  | Tool | Purpose |
112
114
  |------|---------|
113
- | `lemma_session_start` | Start traced session, pre-loads relevant context |
114
- | `lemma_session_attempt` | Record a tried approach (rejected/partial/promising) — dead ends are valuable memory |
115
- | `lemma_session_end` | End session with review, auto-linking, and suggestions |
116
- | `lemma_session_stats` | Virtual session statistics |
117
- | `lemma_suggestion_respond` | Accept or dismiss a surfaced improvement suggestion (teaches Lemma your preferences) |
115
+ | `session_start` | Start traced session, pre-loads relevant context |
116
+ | `session_attempt` | Record a tried approach (rejected/partial/promising) — dead ends are valuable memory |
117
+ | `session_end` | End session with review, auto-linking, and suggestions |
118
+ | `session_stats` | Virtual session statistics |
119
+ | `suggestion_respond` | Accept or dismiss a surfaced improvement suggestion (teaches Lemma your preferences) |
118
120
 
119
121
  ### Intelligence (4)
120
122
 
121
123
  | Tool | Purpose |
122
124
  |------|---------|
123
- | `lemma_conflict_scan` | Scan all memories for contradictions |
124
- | `lemma_proactive_analysis` | Full knowledge base analysis: stale, orphan, distill, deprecated |
125
- | `lemma_project_analytics` | Cross-session project health, growth rate, skill coverage |
126
- | `lemma_semantic_search` | TF-IDF similarity search across memories |
125
+ | `conflict_scan` | Scan all memories for contradictions |
126
+ | `proactive_analysis` | Full knowledge base analysis: stale, orphan, distill, deprecated |
127
+ | `project_analytics` | Cross-session project health, growth rate, skill coverage |
128
+ | `semantic_search` | TF-IDF similarity search across memories |
127
129
 
128
130
  ## Configuration
129
131
 
@@ -191,8 +193,6 @@ Lemma is local-first by design:
191
193
  ## Documentation
192
194
 
193
195
  - [Development Guide](docs/development/DEVELOPMENT.md) — Architecture, project structure, testing
194
- - [Handlers Refactor](docs/development/HANDLERS-REFACTOR.md) — Targeted SQL migration plan
195
- - [Roadmap](docs/development/ROADMAP.md) — v0.9, v0.10, v1.0 plans
196
196
  - [Research](docs/research/README.md) — Academic papers that influenced Lemma's design
197
197
  - [Changelog](CHANGELOG.md) — Version history
198
198
 
@@ -1,4 +1,5 @@
1
1
  export declare const SCHEMA_V1 = "\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT DEFAULT (datetime('now')) NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n legacy_id TEXT UNIQUE,\n title TEXT NOT NULL,\n fragment TEXT NOT NULL,\n description TEXT,\n type TEXT NOT NULL CHECK(type IN ('fact', 'pattern', 'lesson', 'warning', 'context')),\n project TEXT,\n source TEXT DEFAULT 'ai' NOT NULL,\n confidence REAL DEFAULT 0.5 NOT NULL,\n context_tags TEXT,\n access_count INTEGER DEFAULT 0 NOT NULL,\n last_accessed_at TEXT,\n negative_hits INTEGER DEFAULT 0 NOT NULL,\n positive_feedback INTEGER DEFAULT 0 NOT NULL,\n negative_feedback INTEGER DEFAULT 0 NOT NULL,\n quality_score REAL,\n refinement_count INTEGER DEFAULT 0 NOT NULL,\n parent_id INTEGER REFERENCES memories(id),\n session_id TEXT,\n task_type TEXT,\n distill_candidate INTEGER DEFAULT 0,\n related_guides TEXT,\n associated_with TEXT,\n last_refined TEXT,\n created_at TEXT DEFAULT (datetime('now')) NOT NULL,\n updated_at TEXT DEFAULT (datetime('now')) NOT NULL,\n CHECK (confidence >= 0 AND confidence <= 1)\n);\n\nCREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project);\nCREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);\nCREATE INDEX IF NOT EXISTS idx_memories_confidence ON memories(confidence);\nCREATE INDEX IF NOT EXISTS idx_memories_updated_at ON memories(updated_at);\nCREATE INDEX IF NOT EXISTS idx_memories_project_type ON memories(project, type);\nCREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source);\nCREATE INDEX IF NOT EXISTS idx_memories_legacy_id ON memories(legacy_id);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(\n title,\n fragment,\n description,\n content='memories',\n content_rowid='id',\n tokenize='unicode61 remove_diacritics 2'\n);\n\nCREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN\n INSERT INTO memory_fts(rowid, title, fragment, description)\n VALUES (new.id, new.title, new.fragment, new.description);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN\n INSERT INTO memory_fts(memory_fts, rowid, title, fragment, description)\n VALUES ('delete', old.id, old.title, old.fragment, old.description);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN\n INSERT INTO memory_fts(memory_fts, rowid, title, fragment, description)\n VALUES ('delete', old.id, old.title, old.fragment, old.description);\n INSERT INTO memory_fts(rowid, title, fragment, description)\n VALUES (new.id, new.title, new.fragment, new.description);\nEND;\n\nCREATE TABLE IF NOT EXISTS relations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source_id INTEGER NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n target_id INTEGER NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n type TEXT NOT NULL CHECK(type IN ('supports', 'contradicts', 'supersedes', 'superseded_by', 'related_to')),\n note TEXT,\n created_at TEXT DEFAULT (datetime('now')) NOT NULL,\n UNIQUE(source_id, target_id, type)\n);\n\nCREATE INDEX IF NOT EXISTS idx_relations_source ON relations(source_id);\nCREATE INDEX IF NOT EXISTS idx_relations_target ON relations(target_id);\nCREATE INDEX IF NOT EXISTS idx_relations_type ON relations(type);\n\nCREATE TRIGGER IF NOT EXISTS relations_reverse_ai AFTER INSERT ON relations BEGIN\n INSERT OR IGNORE INTO relations(source_id, target_id, type, note, created_at)\n SELECT\n new.target_id,\n new.source_id,\n CASE new.type\n WHEN 'supports' THEN 'supports'\n WHEN 'contradicts' THEN 'contradicts'\n WHEN 'supersedes' THEN 'superseded_by'\n WHEN 'superseded_by' THEN 'supersedes'\n WHEN 'related_to' THEN 'related_to'\n END,\n 'Auto-reverse of: ' || COALESCE(new.note, ''),\n datetime('now')\n WHERE new.source_id != new.target_id\n AND new.type != 'superseded_by';\nEND;\n\nCREATE TABLE IF NOT EXISTS guides (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n guide TEXT NOT NULL UNIQUE,\n category TEXT NOT NULL,\n description TEXT NOT NULL,\n mission TEXT,\n protocol TEXT,\n anti_patterns TEXT,\n pitfalls TEXT,\n deprecated INTEGER DEFAULT 0 NOT NULL,\n superseded_by TEXT,\n usage_count INTEGER DEFAULT 0 NOT NULL,\n success_count INTEGER DEFAULT 0 NOT NULL,\n failure_count INTEGER DEFAULT 0 NOT NULL,\n last_used_at TEXT,\n depends_on TEXT,\n enables TEXT,\n source_memories TEXT,\n validated_by TEXT,\n last_refined TEXT,\n created_at TEXT DEFAULT (datetime('now')) NOT NULL,\n updated_at TEXT DEFAULT (datetime('now')) NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_guides_category ON guides(category);\nCREATE INDEX IF NOT EXISTS idx_guides_deprecated ON guides(deprecated);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS guides_fts USING fts5(\n guide,\n description,\n content='guides',\n content_rowid='id',\n tokenize='unicode61 remove_diacritics 2'\n);\n\nCREATE TRIGGER IF NOT EXISTS guides_ai AFTER INSERT ON guides BEGIN\n INSERT INTO guides_fts(rowid, guide, description)\n VALUES (new.id, new.guide, new.description);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS guides_ad AFTER DELETE ON guides BEGIN\n INSERT INTO guides_fts(guides_fts, rowid, guide, description)\n VALUES ('delete', old.id, old.guide, old.description);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS guides_au AFTER UPDATE ON guides BEGIN\n INSERT INTO guides_fts(guides_fts, rowid, guide, description)\n VALUES ('delete', old.id, old.guide, old.description);\n INSERT INTO guides_fts(rowid, guide, description)\n VALUES (new.id, new.guide, new.description);\nEND;\n\nCREATE TABLE IF NOT EXISTS guide_contexts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n guide_id INTEGER NOT NULL REFERENCES guides(id) ON DELETE CASCADE,\n context TEXT NOT NULL,\n UNIQUE(guide_id, context)\n);\n\nCREATE INDEX IF NOT EXISTS idx_guide_contexts_guide ON guide_contexts(guide_id);\n\nCREATE TABLE IF NOT EXISTS guide_learnings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n guide_id INTEGER NOT NULL REFERENCES guides(id) ON DELETE CASCADE,\n learning TEXT NOT NULL,\n UNIQUE(guide_id, learning)\n);\n\nCREATE INDEX IF NOT EXISTS idx_guide_learnings_guide ON guide_learnings(guide_id);\n\nCREATE TABLE IF NOT EXISTS guide_memory_links (\n guide_id INTEGER NOT NULL REFERENCES guides(id) ON DELETE CASCADE,\n memory_id INTEGER NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n link_type TEXT NOT NULL CHECK(link_type IN ('source', 'validated_by', 'related')),\n PRIMARY KEY (guide_id, memory_id, link_type)\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n task_type TEXT,\n technologies TEXT,\n initial_approach TEXT,\n final_approach TEXT,\n approach_changed INTEGER DEFAULT 0,\n outcome TEXT CHECK(outcome IS NULL OR outcome IN ('success', 'partial', 'failure', 'abandoned')),\n refinement_attempts INTEGER DEFAULT 0,\n self_critique_count INTEGER DEFAULT 0,\n lessons TEXT,\n tool_calls INTEGER DEFAULT 0 NOT NULL,\n memory_count INTEGER DEFAULT 0 NOT NULL,\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'abandoned')),\n project TEXT,\n started_at TEXT DEFAULT (datetime('now')) NOT NULL,\n ended_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_sessions_outcome ON sessions(outcome);\nCREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);\n\nCREATE TABLE IF NOT EXISTS session_guide_usage (\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n guide_id INTEGER NOT NULL REFERENCES guides(id) ON DELETE CASCADE,\n PRIMARY KEY (session_id, guide_id)\n);\n\nCREATE TABLE IF NOT EXISTS session_memory_links (\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n memory_id INTEGER NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n interaction_type TEXT NOT NULL CHECK(interaction_type IN ('read', 'created', 'updated')),\n PRIMARY KEY (session_id, memory_id, interaction_type)\n);\n\nCREATE TABLE IF NOT EXISTS feedback_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n memory_id INTEGER NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n useful INTEGER NOT NULL CHECK(useful IN (0, 1)),\n context TEXT,\n created_at TEXT DEFAULT (datetime('now')) NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_feedback_memory ON feedback_log(memory_id);\nCREATE INDEX IF NOT EXISTS idx_feedback_created ON feedback_log(created_at);\n";
2
2
  export declare const SCHEMA_V2 = "\nCREATE TABLE IF NOT EXISTS session_attempts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,\n seq INTEGER NOT NULL,\n approach TEXT NOT NULL,\n rationale TEXT,\n outcome TEXT NOT NULL CHECK(outcome IN ('rejected','partial','promising')),\n critique TEXT,\n related_memory_id INTEGER REFERENCES memories(id) ON DELETE SET NULL,\n confidence REAL DEFAULT 0.5 NOT NULL,\n last_accessed_at TEXT,\n access_count INTEGER DEFAULT 0 NOT NULL,\n created_at TEXT DEFAULT (datetime('now')) NOT NULL,\n UNIQUE(session_id, seq),\n CHECK (confidence >= 0 AND confidence <= 1)\n);\n\nCREATE INDEX IF NOT EXISTS idx_attempts_session ON session_attempts(session_id);\nCREATE INDEX IF NOT EXISTS idx_attempts_outcome ON session_attempts(outcome);\n\nCREATE TABLE IF NOT EXISTS improvement_suggestions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT REFERENCES sessions(id) ON DELETE SET NULL,\n suggestion TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'offered' CHECK(status IN ('offered','accepted','dismissed')),\n created_at TEXT DEFAULT (datetime('now')) NOT NULL,\n resolved_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_suggestions_status ON improvement_suggestions(status);\n";
3
+ export declare const SCHEMA_V3 = "\n-- Normalize stored project keys so per-project isolation actually works.\n-- Fixes historical data written before write-side normalization: mixed-case\n-- duplicates (\"Ailyro\" vs \"ailyro\"), full paths stored as project\n-- (\"/home/x/Projeler/scroll/mobil\"), and the literal string \"global\" used to\n-- mean global scope. Applied once, gated by schema_version. Idempotent: a\n-- second run is a no-op (already-lowercased, no slash, no \"global\").\n\nUPDATE memories SET project = replace(project, '\\', '/') WHERE project LIKE '%\\%';\nUPDATE memories SET project = replace(project, rtrim(project, replace(project, '/', '')), '') WHERE project LIKE '%/%';\nUPDATE memories SET project = lower(project) WHERE project IS NOT NULL;\nUPDATE memories SET project = NULL WHERE project = 'global';\n\nUPDATE sessions SET project = replace(project, '\\', '/') WHERE project LIKE '%\\%';\nUPDATE sessions SET project = replace(project, rtrim(project, replace(project, '/', '')), '') WHERE project LIKE '%/%';\nUPDATE sessions SET project = lower(project) WHERE project IS NOT NULL;\nUPDATE sessions SET project = NULL WHERE project = 'global';\n";
3
4
  export declare const MIGRATIONS: [number, string][];
4
5
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,muQAgOrB,CAAC;AAEF,eAAO,MAAM,SAAS,mvCA+BrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAqC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,muQAgOrB,CAAC;AAEF,eAAO,MAAM,SAAS,mvCA+BrB,CAAC;AAEF,eAAO,MAAM,SAAS,goCAiBrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAqD,CAAC"}
package/dist/db/schema.js CHANGED
@@ -255,5 +255,23 @@ CREATE TABLE IF NOT EXISTS improvement_suggestions (
255
255
 
256
256
  CREATE INDEX IF NOT EXISTS idx_suggestions_status ON improvement_suggestions(status);
257
257
  `;
258
- export const MIGRATIONS = [[1, SCHEMA_V1], [2, SCHEMA_V2]];
258
+ export const SCHEMA_V3 = `
259
+ -- Normalize stored project keys so per-project isolation actually works.
260
+ -- Fixes historical data written before write-side normalization: mixed-case
261
+ -- duplicates ("Ailyro" vs "ailyro"), full paths stored as project
262
+ -- ("/home/x/Projeler/scroll/mobil"), and the literal string "global" used to
263
+ -- mean global scope. Applied once, gated by schema_version. Idempotent: a
264
+ -- second run is a no-op (already-lowercased, no slash, no "global").
265
+
266
+ UPDATE memories SET project = replace(project, '\\', '/') WHERE project LIKE '%\\%';
267
+ UPDATE memories SET project = replace(project, rtrim(project, replace(project, '/', '')), '') WHERE project LIKE '%/%';
268
+ UPDATE memories SET project = lower(project) WHERE project IS NOT NULL;
269
+ UPDATE memories SET project = NULL WHERE project = 'global';
270
+
271
+ UPDATE sessions SET project = replace(project, '\\', '/') WHERE project LIKE '%\\%';
272
+ UPDATE sessions SET project = replace(project, rtrim(project, replace(project, '/', '')), '') WHERE project LIKE '%/%';
273
+ UPDATE sessions SET project = lower(project) WHERE project IS NOT NULL;
274
+ UPDATE sessions SET project = NULL WHERE project = 'global';
275
+ `;
276
+ export const MIGRATIONS = [[1, SCHEMA_V1], [2, SCHEMA_V2], [3, SCHEMA_V3]];
259
277
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgOxB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BxB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAuB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgOxB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BxB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;CAiBxB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAuB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -2,45 +2,87 @@
2
2
  import { spawn } from "child_process";
3
3
  import { startServer, runLibMode } from "./server/index.js";
4
4
  import { startVisualizeServer } from "./server/visualize.js";
5
+ import { VERSION } from "./version.js";
5
6
  const args = process.argv.slice(2);
6
- if (args.includes("-lib")) {
7
- runLibMode().catch((error) => {
8
- console.error("Fatal error:", error);
9
- process.exit(1);
10
- });
7
+ const hasHelp = args.includes("--help") || args.includes("-h") || args.includes("help");
8
+ const hasVersion = args.includes("--version") || args.includes("-V");
9
+ const hasLib = args.includes("-lib") || args.includes("--library");
10
+ const hasVisualizer = args.includes("-vis") || args.includes("--visualize");
11
+ function printHelp() {
12
+ console.log(`Lemma ${VERSION}
13
+
14
+ Usage:
15
+ lemma Start the MCP server over stdio
16
+ lemma -lib Print a full knowledge-base snapshot
17
+ lemma -vis Start the visualizer in the background
18
+ lemma -vis --fg Start the visualizer in the foreground
19
+ lemma -vis -p 8080 Start the visualizer on a custom port
20
+ lemma --version Print the version
21
+ lemma --help Show this help
22
+ `);
11
23
  }
12
- else if (args.includes("-vis")) {
13
- const portIdx = args.indexOf("-p");
14
- const port = portIdx !== -1 && args[portIdx + 1] ? parseInt(args[portIdx + 1], 10) : undefined;
15
- if (!args.includes("--fg")) {
16
- const serverArgs = [process.argv[1], "-vis", "--fg"];
17
- if (port) {
18
- serverArgs.push("-p", String(port));
19
- }
20
- const child = spawn(process.execPath, serverArgs, {
21
- detached: true,
22
- stdio: "ignore",
23
- windowsHide: true,
24
- });
25
- child.unref();
26
- console.error(``);
27
- console.error(` Lemma Visualizer started in background (PID ${child.pid})`);
28
- console.error(` http://localhost:${port || 3456}`);
29
- console.error(` Stop: kill ${child.pid}`);
30
- console.error(``);
24
+ function parsePortArg() {
25
+ const portIdx = args.includes("-p") ? args.indexOf("-p") : args.indexOf("--port");
26
+ if (portIdx === -1)
27
+ return undefined;
28
+ const raw = args[portIdx + 1];
29
+ const port = Number(raw);
30
+ if (!raw || !Number.isInteger(port) || port < 1 || port > 65535) {
31
+ throw new Error(`Invalid port: ${raw ?? "(missing)"}. Use a number from 1 to 65535.`);
32
+ }
33
+ return port;
34
+ }
35
+ async function main() {
36
+ if (hasHelp) {
37
+ printHelp();
31
38
  process.exit(0);
32
39
  }
40
+ else if (hasVersion) {
41
+ console.log(VERSION);
42
+ process.exit(0);
43
+ }
44
+ else if (hasLib) {
45
+ await runLibMode();
46
+ }
47
+ else if (hasVisualizer) {
48
+ const port = parsePortArg();
49
+ if (!args.includes("--fg")) {
50
+ const serverArgs = [process.argv[1], "-vis", "--fg"];
51
+ if (port) {
52
+ serverArgs.push("-p", String(port));
53
+ }
54
+ const child = spawn(process.execPath, serverArgs, {
55
+ detached: true,
56
+ stdio: "ignore",
57
+ windowsHide: true,
58
+ });
59
+ child.unref();
60
+ console.error(``);
61
+ console.error(` Lemma Visualizer started in background (PID ${child.pid})`);
62
+ console.error(` http://localhost:${port || 3456}`);
63
+ console.error(` Stop: kill ${child.pid}`);
64
+ console.error(``);
65
+ process.exit(0);
66
+ }
67
+ else {
68
+ await startVisualizeServer(port);
69
+ }
70
+ }
71
+ else if (args.length === 0) {
72
+ await startServer();
73
+ }
33
74
  else {
34
- startVisualizeServer(port).catch((error) => {
35
- console.error("Fatal error:", error);
36
- process.exit(1);
37
- });
75
+ console.error(`Unknown argument(s): ${args.join(" ")}`);
76
+ console.error(`Run "lemma --help" for usage.`);
77
+ process.exit(1);
38
78
  }
39
79
  }
40
- else {
41
- startServer().catch((error) => {
42
- console.error("Fatal error:", error);
43
- process.exit(1);
44
- });
80
+ try {
81
+ await main();
82
+ }
83
+ catch (error) {
84
+ const message = error instanceof Error ? error.message : String(error);
85
+ console.error(`Fatal error: ${message}`);
86
+ process.exit(1);
45
87
  }
46
88
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/F,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QAElD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE;YAChD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iDAAiD,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;YAChD,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;KAAM,CAAC;IACN,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAUA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAuED,eAAO,MAAM,MAAM;kBACH,MAAM,SAAS,OAAO,GAAG,IAAI;kBAI7B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI5B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI7B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI7B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,MAAM,GAAG,IAAI;mBAelE,MAAM,QAAQ,MAAM,SAAS,OAAO,GAAG,IAAI;oBAI1C,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;qBAgB9C,MAAM,WAAW,OAAO,cAAc,MAAM,SAAS,OAAO,GAAG,IAAI;mBAMrE,MAAM,UAAU,SAAS,GAAG,WAAW,GAAG,QAAQ,SAAS,OAAO,GAAG,IAAI;mBAKzE,MAAM,aAAa,MAAM,SAAS,OAAO,GAAG,IAAI;mBAIhD,MAAM,UAAU,MAAM,SAAS,MAAM,SAAS,OAAO,GAAG,IAAI;CAG5E,CAAC;AAEF,wBAAgB,UAAU,IAAI,IAAI,CAIjC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAUA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAwED,eAAO,MAAM,MAAM;kBACH,MAAM,SAAS,OAAO,GAAG,IAAI;kBAI7B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI5B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI7B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAI7B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,MAAM,GAAG,IAAI;mBAelE,MAAM,QAAQ,MAAM,SAAS,OAAO,GAAG,IAAI;oBAI1C,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;qBAgB9C,MAAM,WAAW,OAAO,cAAc,MAAM,SAAS,OAAO,GAAG,IAAI;mBAMrE,MAAM,UAAU,SAAS,GAAG,WAAW,GAAG,QAAQ,SAAS,OAAO,GAAG,IAAI;mBAKzE,MAAM,aAAa,MAAM,SAAS,OAAO,GAAG,IAAI;mBAIhD,MAAM,UAAU,MAAM,SAAS,MAAM,SAAS,OAAO,GAAG,IAAI;CAG5E,CAAC;AAEF,wBAAgB,UAAU,IAAI,IAAI,CAIjC"}
package/dist/logger.js CHANGED
@@ -60,7 +60,8 @@ function write(level, message, meta) {
60
60
  ensureLogDir();
61
61
  const line = formatMessage(level, message, meta);
62
62
  fs.appendFileSync(getLogFilePath(), line + "\n", "utf-8");
63
- if (level === "ERROR" || level === "WARN" || level === "INFO") {
63
+ const mirrorToStderr = process.env.LEMMA_LOG_STDERR === "1" || process.env.LEMMA_DEBUG === "1";
64
+ if (level === "ERROR" || mirrorToStderr) {
64
65
  console.error(`[Lemma] ${line}`);
65
66
  }
66
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC1D,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,IAAI,OAAO,GAAkB,IAAI,CAAC;AAClC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,GAAG,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,OAAO,IAAI,OAAO,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAEhC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE;aACb,WAAW,CAAC,GAAG,CAAC;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAC3D,IAAI,EAAE,CAAC;QAEV,OAAO,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,QAAQ,EAAE,CAAC;gBACb,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,IAAc;IACnE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,IAAI,GAAG,IAAI,SAAS,MAAM,KAAK,KAAK,OAAO,EAAE,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,OAAe,EAAE,IAAc;IAC3D,IAAI,SAAS;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,YAAY,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACjD,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;QAC/F,IAAI,KAAK,KAAK,OAAO,IAAI,cAAc,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,GAA4B,EAAE,MAAc;IACnE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAc;QACnC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAc;QACnC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,IAA8B,EAAE,UAAmB;QACxE,MAAM,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBAC3C,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,QAAQ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,IAAY,EAAE,IAAc;QACjD,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,MAAgC;QACtD,IAAI,QAA6C,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;oBAClB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,MAAc,EAAE,OAAgB,EAAE,UAAkB,EAAE,IAAc;QAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACxC,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAA0C,EAAE,IAAc;QAC/E,MAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,KAAK,CAAC,KAAK,EAAE,YAAY,MAAM,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,SAAiB,EAAE,IAAc;QACtD,KAAK,CAAC,OAAO,EAAE,UAAU,QAAQ,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAAc,EAAE,KAAa,EAAE,IAAc;QAClE,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,KAAK,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;IACb,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC"}
@@ -2,6 +2,34 @@ import type { MemoryFragment, MemoryRelation, MemoryStats, AuditResult, Fragment
2
2
  export declare function setMemoryDir(dir: string): void;
3
3
  export declare function generateId(): string;
4
4
  export declare function detectProject(): string | null;
5
+ /**
6
+ * Canonical project key for an arbitrary caller-supplied value: trimmed +
7
+ * lowercased, with any path (forward or backslash) collapsed to its basename.
8
+ * Mirrors detectProject() so a stored key and a recall filter always agree,
9
+ * regardless of whether the caller passed "Lemma", "/home/x/Projeler/Lemma",
10
+ * or "lemma".
11
+ *
12
+ * Returns null for non-strings, empty, or whitespace-only input.
13
+ */
14
+ export declare function normalizeProjectKey(raw: unknown): string | null;
15
+ /**
16
+ * Resolve the project scope a memory/session should be filed under.
17
+ *
18
+ * - undefined (caller omitted it) -> auto-detect from cwd basename. This is the
19
+ * default that makes project isolation "just work".
20
+ * - null (caller passed it explicitly) -> global (null). Explicit null is the
21
+ * documented request for cross-project scope.
22
+ * - a non-empty string -> normalized via normalizeProjectKey (basename + lowercase).
23
+ * - a value that normalizes to empty -> treated as omitted (auto-detect).
24
+ * - the literal "global" (case-insensitive) -> null. Callers use "global" to
25
+ * request global scope; without this it would be filed under a bogus project
26
+ * literally named "global" and vanish from project-scoped views.
27
+ *
28
+ * This is the single chokepoint for write-side project resolution, so handlers
29
+ * never store a divergent key. Pair with a schema that has NO default on
30
+ * `project`, so clients send undefined (not null) when the caller omits it.
31
+ */
32
+ export declare function resolveProjectScope(explicit: unknown): string | null;
5
33
  export declare function createFragment(fragment: string, source: "user" | "ai", title?: string | null, project?: string | null, description?: string | null, type?: FragmentType): MemoryFragment;
6
34
  export declare function findSimilarFragment(fragments: MemoryFragment[], fragmentText: string, project: string | null, threshold?: number): Promise<MemoryFragment | null>;
7
35
  export declare function findTopicOverlaps(fragments: MemoryFragment[], fragmentText: string, project: string | null, limit?: number): Promise<MemoryFragment[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/memory/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/memory/core.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,58 @@ export function detectProject() {
28
28
  return null;
29
29
  }
30
30
  }
31
+ /**
32
+ * Canonical project key for an arbitrary caller-supplied value: trimmed +
33
+ * lowercased, with any path (forward or backslash) collapsed to its basename.
34
+ * Mirrors detectProject() so a stored key and a recall filter always agree,
35
+ * regardless of whether the caller passed "Lemma", "/home/x/Projeler/Lemma",
36
+ * or "lemma".
37
+ *
38
+ * Returns null for non-strings, empty, or whitespace-only input.
39
+ */
40
+ export function normalizeProjectKey(raw) {
41
+ if (typeof raw !== "string")
42
+ return null;
43
+ let p = raw.trim();
44
+ if (!p)
45
+ return null;
46
+ p = p.replace(/\\/g, "/").replace(/\/+$/, "");
47
+ if (p.includes("/")) {
48
+ const segs = p.split("/").filter(Boolean);
49
+ p = segs.length > 0 ? segs[segs.length - 1] : "";
50
+ }
51
+ p = p.trim().toLowerCase();
52
+ return p || null;
53
+ }
54
+ /**
55
+ * Resolve the project scope a memory/session should be filed under.
56
+ *
57
+ * - undefined (caller omitted it) -> auto-detect from cwd basename. This is the
58
+ * default that makes project isolation "just work".
59
+ * - null (caller passed it explicitly) -> global (null). Explicit null is the
60
+ * documented request for cross-project scope.
61
+ * - a non-empty string -> normalized via normalizeProjectKey (basename + lowercase).
62
+ * - a value that normalizes to empty -> treated as omitted (auto-detect).
63
+ * - the literal "global" (case-insensitive) -> null. Callers use "global" to
64
+ * request global scope; without this it would be filed under a bogus project
65
+ * literally named "global" and vanish from project-scoped views.
66
+ *
67
+ * This is the single chokepoint for write-side project resolution, so handlers
68
+ * never store a divergent key. Pair with a schema that has NO default on
69
+ * `project`, so clients send undefined (not null) when the caller omits it.
70
+ */
71
+ export function resolveProjectScope(explicit) {
72
+ if (explicit === null)
73
+ return null;
74
+ if (explicit === undefined)
75
+ return detectProject() || null;
76
+ const norm = normalizeProjectKey(explicit);
77
+ if (norm === null)
78
+ return detectProject() || null;
79
+ if (norm === "global")
80
+ return null;
81
+ return norm;
82
+ }
31
83
  function generateDescription(fragment, title) {
32
84
  if (fragment.length <= 80) {
33
85
  return fragment;
@@ -563,7 +615,7 @@ export function addFragmentToDb(fragment) {
563
615
  const db = getDb();
564
616
  const now = new Date().toISOString();
565
617
  const result = db.prepareCached(`INSERT INTO memories (legacy_id, title, fragment, description, type, project, source, confidence, distill_candidate, created_at, updated_at)
566
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(fragment.id, fragment.title, fragment.fragment, fragment.description || null, fragment.type || "fact", fragment.project || null, fragment.source || "ai", fragment.confidence ?? 0.5, fragment.distill_candidate ? 1 : 0, fragment.created || now, now);
618
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(fragment.id, fragment.title, fragment.fragment, fragment.description || null, fragment.type || "fact", normalizeProjectKey(fragment.project), fragment.source || "ai", fragment.confidence ?? 0.5, fragment.distill_candidate ? 1 : 0, fragment.created || now, now);
567
619
  const id = Number(result.lastInsertRowid);
568
620
  return { id, legacy_id: fragment.id };
569
621
  }