@pcircle/memesh 3.2.0 → 4.0.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.
Files changed (65) hide show
  1. package/README.de.md +28 -7
  2. package/README.es.md +28 -7
  3. package/README.fr.md +28 -7
  4. package/README.ja.md +28 -7
  5. package/README.ko.md +28 -7
  6. package/README.md +47 -14
  7. package/README.pt.md +28 -7
  8. package/README.th.md +28 -7
  9. package/README.vi.md +28 -7
  10. package/README.zh-CN.md +28 -7
  11. package/README.zh-TW.md +28 -7
  12. package/dashboard/dist/index.html +12 -3
  13. package/dist/core/auto-tagger.d.ts +5 -0
  14. package/dist/core/auto-tagger.d.ts.map +1 -0
  15. package/dist/core/auto-tagger.js +99 -0
  16. package/dist/core/auto-tagger.js.map +1 -0
  17. package/dist/core/config.d.ts +1 -0
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +29 -1
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/embedder.d.ts +1 -0
  22. package/dist/core/embedder.d.ts.map +1 -1
  23. package/dist/core/embedder.js +120 -47
  24. package/dist/core/embedder.js.map +1 -1
  25. package/dist/core/lifecycle.d.ts +7 -0
  26. package/dist/core/lifecycle.d.ts.map +1 -1
  27. package/dist/core/lifecycle.js +91 -0
  28. package/dist/core/lifecycle.js.map +1 -1
  29. package/dist/core/operations.d.ts +1 -0
  30. package/dist/core/operations.d.ts.map +1 -1
  31. package/dist/core/operations.js +9 -0
  32. package/dist/core/operations.js.map +1 -1
  33. package/dist/core/patterns.d.ts +39 -0
  34. package/dist/core/patterns.d.ts.map +1 -0
  35. package/dist/core/patterns.js +109 -0
  36. package/dist/core/patterns.js.map +1 -0
  37. package/dist/core/schema-export.d.ts.map +1 -1
  38. package/dist/core/schema-export.js +17 -0
  39. package/dist/core/schema-export.js.map +1 -1
  40. package/dist/core/scoring.d.ts +6 -0
  41. package/dist/core/scoring.d.ts.map +1 -1
  42. package/dist/core/scoring.js +8 -3
  43. package/dist/core/scoring.js.map +1 -1
  44. package/dist/db.d.ts.map +1 -1
  45. package/dist/db.js +29 -2
  46. package/dist/db.js.map +1 -1
  47. package/dist/transports/http/server.d.ts.map +1 -1
  48. package/dist/transports/http/server.js +141 -1
  49. package/dist/transports/http/server.js.map +1 -1
  50. package/dist/transports/mcp/handlers.d.ts +17 -0
  51. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  52. package/dist/transports/mcp/handlers.js +91 -1
  53. package/dist/transports/mcp/handlers.js.map +1 -1
  54. package/dist/transports/schemas.d.ts +10 -0
  55. package/dist/transports/schemas.d.ts.map +1 -1
  56. package/dist/transports/schemas.js +4 -0
  57. package/dist/transports/schemas.js.map +1 -1
  58. package/hooks/hooks.json +12 -0
  59. package/package.json +4 -1
  60. package/plugin.json +1 -1
  61. package/scripts/hooks/pre-edit-recall.js +163 -0
  62. package/scripts/hooks/session-start.js +52 -2
  63. package/scripts/hooks/session-summary.js +44 -1
  64. package/skills/memesh/SKILL.md +110 -52
  65. package/skills/memesh-review/SKILL.md +69 -26
@@ -0,0 +1,5 @@
1
+ import type { LLMConfig } from './config.js';
2
+ export declare function autoTag(name: string, type: string, observations: string[], llmConfig: LLMConfig): Promise<string[]>;
3
+ export declare function autoTagAndApply(entityId: number, name: string, type: string, observations: string[], llmConfig: LLMConfig): Promise<void>;
4
+ export declare function parseTags(text: string): string[];
5
+ //# sourceMappingURL=auto-tagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-tagger.d.ts","sourceRoot":"","sources":["../../src/core/auto-tagger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAU7C,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAMD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAehD"}
@@ -0,0 +1,99 @@
1
+ import { getDatabase } from '../db.js';
2
+ const VALID_PREFIXES = ['project:', 'topic:', 'tech:', 'severity:', 'scope:'];
3
+ export async function autoTag(name, type, observations, llmConfig) {
4
+ const prompt = `Given this memory entity, suggest 2-5 tags. Each tag must use one of these prefixes: project:, topic:, tech:, severity:, scope:.
5
+
6
+ Entity name: ${name}
7
+ Entity type: ${type}
8
+ Facts: ${observations.slice(0, 5).join('; ')}
9
+
10
+ Return ONLY a JSON array of tag strings, nothing else. Example: ["project:memesh", "topic:auth", "tech:sqlite"]`;
11
+ try {
12
+ const text = await callLLM(prompt, llmConfig);
13
+ return parseTags(text);
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ export async function autoTagAndApply(entityId, name, type, observations, llmConfig) {
20
+ const tags = await autoTag(name, type, observations, llmConfig);
21
+ if (tags.length === 0)
22
+ return;
23
+ try {
24
+ const db = getDatabase();
25
+ const insertTag = db.prepare('INSERT OR IGNORE INTO tags (entity_id, tag) VALUES (?, ?)');
26
+ for (const tag of tags) {
27
+ insertTag.run(entityId, tag);
28
+ }
29
+ }
30
+ catch {
31
+ }
32
+ }
33
+ export function parseTags(text) {
34
+ try {
35
+ const match = text.match(/\[[\s\S]*?\]/);
36
+ if (!match)
37
+ return [];
38
+ const arr = JSON.parse(match[0]);
39
+ if (!Array.isArray(arr))
40
+ return [];
41
+ return arr
42
+ .filter((t) => typeof t === 'string')
43
+ .map((t) => t.toLowerCase().trim())
44
+ .filter((t) => VALID_PREFIXES.some(p => t.startsWith(p)))
45
+ .slice(0, 5);
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ async function callLLM(prompt, config) {
52
+ let apiKey = config.apiKey;
53
+ if (!apiKey) {
54
+ if (config.provider === 'anthropic')
55
+ apiKey = process.env.ANTHROPIC_API_KEY;
56
+ else if (config.provider === 'openai')
57
+ apiKey = process.env.OPENAI_API_KEY;
58
+ }
59
+ if (config.provider === 'anthropic') {
60
+ if (!apiKey)
61
+ throw new Error('No API key');
62
+ const res = await fetch('https://api.anthropic.com/v1/messages', {
63
+ method: 'POST',
64
+ headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01', 'content-type': 'application/json' },
65
+ body: JSON.stringify({ model: config.model || 'claude-haiku-4-5', max_tokens: 200, messages: [{ role: 'user', content: prompt }] }),
66
+ });
67
+ if (!res.ok)
68
+ throw new Error(`API ${res.status}`);
69
+ const data = await res.json();
70
+ return data.content?.[0]?.text || '';
71
+ }
72
+ if (config.provider === 'openai') {
73
+ if (!apiKey)
74
+ throw new Error('No API key');
75
+ const res = await fetch('https://api.openai.com/v1/chat/completions', {
76
+ method: 'POST',
77
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
78
+ body: JSON.stringify({ model: config.model || 'gpt-4o-mini', max_tokens: 200, messages: [{ role: 'user', content: prompt }] }),
79
+ });
80
+ if (!res.ok)
81
+ throw new Error(`API ${res.status}`);
82
+ const data = await res.json();
83
+ return data.choices?.[0]?.message?.content || '';
84
+ }
85
+ if (config.provider === 'ollama') {
86
+ const host = process.env.OLLAMA_HOST || 'http://localhost:11434';
87
+ const res = await fetch(`${host}/api/generate`, {
88
+ method: 'POST',
89
+ headers: { 'Content-Type': 'application/json' },
90
+ body: JSON.stringify({ model: config.model || 'llama3.2', prompt, stream: false }),
91
+ });
92
+ if (!res.ok)
93
+ throw new Error(`Ollama ${res.status}`);
94
+ const data = await res.json();
95
+ return data.response || '';
96
+ }
97
+ return '';
98
+ }
99
+ //# sourceMappingURL=auto-tagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-tagger.js","sourceRoot":"","sources":["../../src/core/auto-tagger.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ export declare function writeConfig(config: MeMeshConfig): void;
27
27
  export declare function updateConfig(partial: Partial<MeMeshConfig>): MeMeshConfig;
28
28
  export declare function maskApiKey(key: string): string;
29
29
  export declare function detectCapabilities(config?: MeMeshConfig): Capabilities;
30
+ export declare function getEmbeddingDimension(config?: MeMeshConfig): number;
30
31
  export declare function logCapabilities(config?: MeMeshConfig): void;
31
32
  export declare function getConfigDir(): string;
32
33
  export declare function getConfigPath(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,IAAI,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC;IACd,kBAAkB,EAAE,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IACjE,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AASD,wBAAgB,UAAU,IAAI,YAAY,CAOzC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CASzE;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAyBD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,CActE;AAQD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAM3D;AAID,wBAAgB,YAAY,IAAI,MAAM,CAAuB;AAC7D,wBAAgB,aAAa,IAAI,MAAM,CAAwB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,IAAI,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC;IACd,kBAAkB,EAAE,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IACjE,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AASD,wBAAgB,UAAU,IAAI,YAAY,CAOzC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CASzE;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAyBD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,CActE;AAgCD,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAKnE;AAQD,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAM3D;AAID,wBAAgB,YAAY,IAAI,MAAM,CAAuB;AAC7D,wBAAgB,aAAa,IAAI,MAAM,CAAwB"}
@@ -1,6 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import os from 'os';
4
+ import { createRequire } from 'module';
4
5
  const CONFIG_DIR = path.join(os.homedir(), '.memesh');
5
6
  const CONFIG_PATH = path.join(CONFIG_DIR, 'config.json');
6
7
  export function readConfig() {
@@ -57,11 +58,38 @@ export function detectCapabilities(config) {
57
58
  vectorSearch: true,
58
59
  scoring: true,
59
60
  knowledgeEvolution: true,
60
- embeddings: llm?.provider ?? 'tfidf',
61
+ embeddings: detectEmbeddingSource(llm),
61
62
  llm,
62
63
  searchLevel: llm ? 1 : 0,
63
64
  };
64
65
  }
66
+ function detectEmbeddingSource(llm) {
67
+ if (!llm)
68
+ return 'tfidf';
69
+ if (llm.provider === 'openai')
70
+ return 'openai';
71
+ if (llm.provider === 'ollama')
72
+ return 'ollama';
73
+ try {
74
+ const require = createRequire(import.meta.url);
75
+ require.resolve('@xenova/transformers');
76
+ return 'onnx';
77
+ }
78
+ catch {
79
+ return 'tfidf';
80
+ }
81
+ }
82
+ const EMBEDDING_DIMENSIONS = {
83
+ openai: 1536,
84
+ ollama: 768,
85
+ onnx: 384,
86
+ };
87
+ export function getEmbeddingDimension(config) {
88
+ const cfg = config ?? readConfig();
89
+ const llm = cfg.llm ?? detectFromEnv() ?? detectOllama() ?? null;
90
+ const source = detectEmbeddingSource(llm);
91
+ return EMBEDDING_DIMENSIONS[source] ?? 384;
92
+ }
65
93
  export function logCapabilities(config) {
66
94
  const caps = detectCapabilities(config);
67
95
  process.stderr.write(`MeMesh: Level ${caps.searchLevel} (${caps.searchLevel === 1 ? 'Smart Mode' : 'Core'})\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export declare function isEmbeddingAvailable(): boolean;
2
+ export { getEmbeddingDimension } from './config.js';
2
3
  export declare function resetEmbeddingState(): void;
3
4
  export declare function embedText(text: string): Promise<Float32Array | null>;
4
5
  export declare function embedAndStore(entityId: number, text: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/core/embedder.ts"],"names":[],"mappings":"AAoBA,wBAAgB,oBAAoB,IAAI,OAAO,CAY9C;AAKD,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAiCD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAS1E;AAMD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAYf;AAMD,wBAAgB,YAAY,CAC1B,cAAc,EAAE,YAAY,EAC5B,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAczC"}
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/core/embedder.ts"],"names":[],"mappings":"AAwBA,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAGD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKpD,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAMD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW1E;AAMD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjF;AAKD,wBAAgB,YAAY,CAC1B,cAAc,EAAE,YAAY,EAC5B,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAczC"}
@@ -2,59 +2,34 @@ import { createRequire } from 'node:module';
2
2
  import { getDatabase } from '../db.js';
3
3
  import { homedir } from 'os';
4
4
  import { join } from 'path';
5
- let pipelineInstance = null;
6
- let pipelineLoading = null;
7
- let availableChecked = false;
8
- let availableResult = false;
5
+ import { detectCapabilities } from './config.js';
6
+ let onnxPipelineInstance = null;
7
+ let onnxPipelineLoading = null;
8
+ let onnxAvailableChecked = false;
9
+ let onnxAvailableResult = false;
9
10
  export function isEmbeddingAvailable() {
10
- if (availableChecked)
11
- return availableResult;
12
- availableChecked = true;
13
- try {
14
- const require = createRequire(import.meta.url);
15
- require.resolve('@xenova/transformers');
16
- availableResult = true;
17
- }
18
- catch {
19
- availableResult = false;
20
- }
21
- return availableResult;
11
+ const caps = detectCapabilities();
12
+ if (caps.llm?.provider === 'openai')
13
+ return true;
14
+ if (caps.llm?.provider === 'ollama')
15
+ return true;
16
+ return isOnnxAvailable();
22
17
  }
18
+ export { getEmbeddingDimension } from './config.js';
23
19
  export function resetEmbeddingState() {
24
- availableChecked = false;
25
- availableResult = false;
26
- pipelineInstance = null;
27
- pipelineLoading = null;
28
- }
29
- async function getPipeline() {
30
- if (pipelineInstance)
31
- return pipelineInstance;
32
- if (pipelineLoading)
33
- return pipelineLoading;
34
- pipelineLoading = (async () => {
35
- const mod = await import('@xenova/transformers');
36
- const createPipeline = mod.pipeline;
37
- const env = mod.env;
38
- if (env) {
39
- env.cacheDir = join(homedir(), '.memesh', 'models');
40
- env.allowLocalModels = true;
41
- }
42
- pipelineInstance = await createPipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
43
- return pipelineInstance;
44
- })();
45
- return pipelineLoading;
20
+ onnxAvailableChecked = false;
21
+ onnxAvailableResult = false;
22
+ onnxPipelineInstance = null;
23
+ onnxPipelineLoading = null;
46
24
  }
47
25
  export async function embedText(text) {
48
- if (!isEmbeddingAvailable())
49
- return null;
50
- try {
51
- const pipe = await getPipeline();
52
- const output = await pipe(text, { pooling: 'mean', normalize: true });
53
- return new Float32Array(output.data);
54
- }
55
- catch {
56
- return null;
26
+ const caps = detectCapabilities();
27
+ if (caps.llm) {
28
+ const result = await embedWithProvider(text, caps.llm);
29
+ if (result)
30
+ return result;
57
31
  }
32
+ return embedWithOnnx(text);
58
33
  }
59
34
  export async function embedAndStore(entityId, text) {
60
35
  const embedding = await embedText(text);
@@ -78,4 +53,102 @@ export function vectorSearch(queryEmbedding, limit = 20) {
78
53
  return [];
79
54
  }
80
55
  }
56
+ async function embedWithProvider(text, config) {
57
+ try {
58
+ if (config.provider === 'openai')
59
+ return await embedWithOpenAI(text, config);
60
+ if (config.provider === 'ollama')
61
+ return await embedWithOllama(text, config);
62
+ return null;
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ async function embedWithOpenAI(text, config) {
69
+ const apiKey = config.apiKey || process.env.OPENAI_API_KEY;
70
+ if (!apiKey)
71
+ return null;
72
+ const res = await fetch('https://api.openai.com/v1/embeddings', {
73
+ method: 'POST',
74
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({
76
+ model: 'text-embedding-3-small',
77
+ input: text.slice(0, 8000),
78
+ }),
79
+ });
80
+ if (!res.ok)
81
+ return null;
82
+ const data = await res.json();
83
+ const embedding = data.data?.[0]?.embedding;
84
+ if (!embedding || !Array.isArray(embedding))
85
+ return null;
86
+ return new Float32Array(embedding);
87
+ }
88
+ async function embedWithOllama(text, config) {
89
+ const host = process.env.OLLAMA_HOST || 'http://localhost:11434';
90
+ const model = config.model || 'nomic-embed-text';
91
+ const res = await fetch(`${host}/api/embed`, {
92
+ method: 'POST',
93
+ headers: { 'Content-Type': 'application/json' },
94
+ body: JSON.stringify({ model, input: text.slice(0, 8000) }),
95
+ });
96
+ if (!res.ok)
97
+ return null;
98
+ const data = await res.json();
99
+ const embedding = data.embeddings?.[0];
100
+ if (!embedding || !Array.isArray(embedding))
101
+ return null;
102
+ return new Float32Array(embedding);
103
+ }
104
+ function isOnnxAvailable() {
105
+ if (onnxAvailableChecked)
106
+ return onnxAvailableResult;
107
+ onnxAvailableChecked = true;
108
+ try {
109
+ const require = createRequire(import.meta.url);
110
+ require.resolve('@xenova/transformers');
111
+ onnxAvailableResult = true;
112
+ }
113
+ catch {
114
+ onnxAvailableResult = false;
115
+ }
116
+ return onnxAvailableResult;
117
+ }
118
+ async function getOnnxPipeline() {
119
+ if (onnxPipelineInstance)
120
+ return onnxPipelineInstance;
121
+ if (onnxPipelineLoading)
122
+ return onnxPipelineLoading;
123
+ onnxPipelineLoading = (async () => {
124
+ try {
125
+ const mod = await import('@xenova/transformers');
126
+ const createPipeline = mod.pipeline;
127
+ const env = mod.env;
128
+ if (env) {
129
+ env.cacheDir = join(homedir(), '.memesh', 'models');
130
+ env.allowLocalModels = true;
131
+ }
132
+ onnxPipelineInstance = await createPipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
133
+ return onnxPipelineInstance;
134
+ }
135
+ catch (err) {
136
+ onnxPipelineLoading = null;
137
+ throw err;
138
+ }
139
+ })();
140
+ return onnxPipelineLoading;
141
+ }
142
+ async function embedWithOnnx(text) {
143
+ if (!isOnnxAvailable())
144
+ return null;
145
+ try {
146
+ const pipe = await getOnnxPipeline();
147
+ const output = await pipe(text, { pooling: 'mean', normalize: true });
148
+ return new Float32Array(output.data);
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
81
154
  //# sourceMappingURL=embedder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/core/embedder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/core/embedder.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,11 @@ export declare function getDecayStatus(db: Database.Database): {
6
6
  lastDecayAt: string | null;
7
7
  entitiesBelowThreshold: number;
8
8
  };
9
+ declare const PRESERVED_TYPES: Set<string>;
10
+ declare const NOISE_TYPES: Set<string>;
11
+ export declare function compressWeeklyNoise(db: Database.Database): {
12
+ compressed: number;
13
+ weeksProcessed: number;
14
+ };
15
+ export { PRESERVED_TYPES, NOISE_TYPES };
9
16
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AActC,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAwCvE;AAKD,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IACrD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAoBA"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AActC,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAwCvE;AAKD,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IACrD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAoBA;AAGD,QAAA,MAAM,eAAe,aAInB,CAAC;AAGH,QAAA,MAAM,WAAW,aAEf,CAAC;AAeH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAkHzG;AAGD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC"}
@@ -40,6 +40,97 @@ export function getDecayStatus(db) {
40
40
  entitiesBelowThreshold: belowThreshold,
41
41
  };
42
42
  }
43
+ const PRESERVED_TYPES = new Set([
44
+ 'decision', 'pattern', 'lesson_learned', 'bug_fix', 'architecture',
45
+ 'convention', 'feature', 'best_practice', 'concept', 'tool', 'note',
46
+ 'plan', 'release', 'refactoring', 'maintenance',
47
+ ]);
48
+ const NOISE_TYPES = new Set([
49
+ 'session_keypoint', 'commit', 'session-insight', 'session-summary',
50
+ ]);
51
+ const COMPRESS_INTERVAL_MS = 24 * 60 * 60 * 1000;
52
+ const NOISE_AGE_DAYS = 7;
53
+ const NOISE_THRESHOLD = 20;
54
+ export function compressWeeklyNoise(db) {
55
+ ensureMetadataTable(db);
56
+ const lastRun = db.prepare("SELECT value FROM memesh_metadata WHERE key = 'last_noise_compress_at'").get();
57
+ if (lastRun) {
58
+ const elapsed = Date.now() - new Date(lastRun.value).getTime();
59
+ if (elapsed < COMPRESS_INTERVAL_MS) {
60
+ return { compressed: 0, weeksProcessed: 0 };
61
+ }
62
+ }
63
+ const cols = db.prepare('PRAGMA table_info(entities)').all();
64
+ if (!cols.some((c) => c.name === 'status')) {
65
+ return { compressed: 0, weeksProcessed: 0 };
66
+ }
67
+ const cutoff = new Date(Date.now() - NOISE_AGE_DAYS * 24 * 60 * 60 * 1000).toISOString();
68
+ const noiseTypePlaceholders = Array.from(NOISE_TYPES).map(() => '?').join(',');
69
+ const noiseTypeValues = Array.from(NOISE_TYPES);
70
+ const weekGroups = db.prepare(`
71
+ SELECT strftime('%Y-W%W', created_at) as week,
72
+ COUNT(*) as count
73
+ FROM entities
74
+ WHERE type IN (${noiseTypePlaceholders})
75
+ AND status = 'active'
76
+ AND created_at < ?
77
+ GROUP BY week
78
+ HAVING count >= ?
79
+ ORDER BY week
80
+ `).all(...noiseTypeValues, cutoff, NOISE_THRESHOLD);
81
+ let totalCompressed = 0;
82
+ for (const { week, count } of weekGroups) {
83
+ const entities = db.prepare(`
84
+ SELECT e.id, e.name, e.type
85
+ FROM entities e
86
+ WHERE e.type IN (${noiseTypePlaceholders})
87
+ AND e.status = 'active'
88
+ AND strftime('%Y-W%W', e.created_at) = ?
89
+ AND e.created_at < ?
90
+ `).all(...noiseTypeValues, week, cutoff);
91
+ if (entities.length === 0)
92
+ continue;
93
+ const typeCounts = new Map();
94
+ for (const e of entities) {
95
+ typeCounts.set(e.type, (typeCounts.get(e.type) || 0) + 1);
96
+ }
97
+ const typeBreakdown = Array.from(typeCounts.entries())
98
+ .map(([t, c]) => `${c} ${t}`)
99
+ .join(', ');
100
+ const summaryName = `weekly-summary-${week}`;
101
+ const existing = db.prepare('SELECT id FROM entities WHERE name = ?').get(summaryName);
102
+ if (existing) {
103
+ db.prepare('INSERT INTO observations (entity_id, content) VALUES (?, ?)').run(existing.id, `+${entities.length} entities archived (${typeBreakdown})`);
104
+ }
105
+ else {
106
+ db.prepare('INSERT INTO entities (name, type) VALUES (?, ?)').run(summaryName, 'weekly-summary');
107
+ const summaryRow = db.prepare('SELECT id FROM entities WHERE name = ?').get(summaryName);
108
+ const obsText = `${week}: ${count} auto-tracked entities compressed (${typeBreakdown})`;
109
+ db.prepare('INSERT INTO observations (entity_id, content) VALUES (?, ?)').run(summaryRow.id, obsText);
110
+ db.prepare('INSERT INTO entities_fts (rowid, name, observations) VALUES (?, ?, ?)').run(summaryRow.id, summaryName, obsText);
111
+ const entityIdPlaceholders = entities.map(() => '?').join(',');
112
+ const projectTags = db.prepare(`
113
+ SELECT DISTINCT t.tag FROM tags t
114
+ JOIN entities e ON e.id = t.entity_id
115
+ WHERE e.id IN (${entityIdPlaceholders})
116
+ AND t.tag LIKE 'project:%'
117
+ `).all(...entities.map(e => e.id));
118
+ for (const { tag } of projectTags) {
119
+ db.prepare('INSERT OR IGNORE INTO tags (entity_id, tag) VALUES (?, ?)').run(summaryRow.id, tag);
120
+ }
121
+ db.prepare('INSERT OR IGNORE INTO tags (entity_id, tag) VALUES (?, ?)').run(summaryRow.id, 'source:noise-filter');
122
+ }
123
+ const archiveIdPlaceholders = entities.map(() => '?').join(',');
124
+ db.prepare(`
125
+ UPDATE entities SET status = 'archived'
126
+ WHERE id IN (${archiveIdPlaceholders})
127
+ `).run(...entities.map(e => e.id));
128
+ totalCompressed += entities.length;
129
+ }
130
+ db.prepare("INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES ('last_noise_compress_at', ?)").run(new Date().toISOString());
131
+ return { compressed: totalCompressed, weeksProcessed: weekGroups.length };
132
+ }
133
+ export { PRESERVED_TYPES, NOISE_TYPES };
43
134
  function ensureMetadataTable(db) {
44
135
  db.exec(`
45
136
  CREATE TABLE IF NOT EXISTS memesh_metadata (
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,cAAc,GAAG,IAAI,CAAC;AAS5B,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAGxB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,+DAA+D,CAChE,CAAC,GAAG,EAAmC,CAAC;IAEzC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAGD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAA6B,CAAC;IACxF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACxB,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,IAAI,CAAC,GAAG,EAAE,GAAG,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CACxD,CAAC,WAAW,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;GAMzB,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAGhE,EAAE,CAAC,OAAO,CACR,iFAAiF,CAClF,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAKD,MAAM,UAAU,cAAc,CAAC,EAAqB;IAIlD,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,+DAA+D,CAChE,CAAC,GAAG,EAAmC,CAAC;IAEzC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAA6B,CAAC;IACxF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,iFAAiF,CAClF,CAAC,GAAG,EAAmB,CAAC;QACzB,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,OAAO;QACL,WAAW,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;QACrC,sBAAsB,EAAE,cAAc;KACvC,CAAC;AACJ,CAAC;AAMD,SAAS,mBAAmB,CAAC,EAAqB;IAChD,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare function recall(args: RecallInput): Entity[];
4
4
  export declare function recallEnhanced(args: RecallInput): Promise<Entity[]>;
5
5
  export { consolidate } from './consolidator.js';
6
6
  export { exportMemories, importMemories } from './serializer.js';
7
+ export { compressWeeklyNoise } from './lifecycle.js';
7
8
  export declare function learn(args: LearnInput): LearnResult;
8
9
  export declare function forget(args: ForgetInput): ForgetResult;
9
10
  //# sourceMappingURL=operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,MAAM,EACP,MAAM,YAAY,CAAC;AAOpB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAuD5D;AAQD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAmBlD;AASD,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgHzE;AAGD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOjE,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAmBnD;AAMD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAuBtD"}
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,MAAM,EACP,MAAM,YAAY,CAAC;AAOpB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CA+D5D;AAQD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAmBlD;AASD,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgHzE;AAGD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAOrD,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAmBnD;AAMD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAuBtD"}
@@ -4,6 +4,8 @@ import { expandQuery, isExpansionAvailable } from './query-expander.js';
4
4
  import { rankEntities } from './scoring.js';
5
5
  import { createExplicitLesson } from './lesson-engine.js';
6
6
  import { embedAndStore, isEmbeddingAvailable, embedText, vectorSearch } from './embedder.js';
7
+ import { autoTagAndApply } from './auto-tagger.js';
8
+ import { detectCapabilities } from './config.js';
7
9
  import path from 'path';
8
10
  export function remember(args) {
9
11
  const db = getDatabase();
@@ -41,6 +43,12 @@ export function remember(args) {
41
43
  const text = `${args.name} ${args.observations.join(' ')}`;
42
44
  embedAndStore(entityId, text).catch(() => { });
43
45
  }
46
+ if ((!args.tags || args.tags.length === 0) && args.observations?.length) {
47
+ const caps = detectCapabilities();
48
+ if (caps.llm) {
49
+ autoTagAndApply(entityId, args.name, args.type, args.observations, caps.llm).catch(() => { });
50
+ }
51
+ }
44
52
  return {
45
53
  stored: true,
46
54
  entityId,
@@ -163,6 +171,7 @@ export async function recallEnhanced(args) {
163
171
  }
164
172
  export { consolidate } from './consolidator.js';
165
173
  export { exportMemories, importMemories } from './serializer.js';
174
+ export { compressWeeklyNoise } from './lifecycle.js';
166
175
  export function learn(args) {
167
176
  const projectName = path.basename(process.cwd());
168
177
  const result = createExplicitLesson(args.error, args.fix, projectName, {