memobank-cli 0.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/CHANGELOG.md +139 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +294 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture.d.ts +12 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +191 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/import.d.ts +28 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +356 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +82 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +142 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +21 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +106 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/map.d.ts +10 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +72 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +10 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +420 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/recall.d.ts +13 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/review.d.ts +11 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +66 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +107 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +354 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/write.d.ts +14 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +247 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +147 -0
- package/dist/config.js.map +1 -0
- package/dist/core/decay-engine.d.ts +16 -0
- package/dist/core/decay-engine.d.ts.map +1 -0
- package/dist/core/decay-engine.js +91 -0
- package/dist/core/decay-engine.js.map +1 -0
- package/dist/core/embedding.d.ts +60 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +169 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/lifecycle-manager.d.ts +105 -0
- package/dist/core/lifecycle-manager.d.ts.map +1 -0
- package/dist/core/lifecycle-manager.js +332 -0
- package/dist/core/lifecycle-manager.js.map +1 -0
- package/dist/core/memory-template.d.ts +70 -0
- package/dist/core/memory-template.d.ts.map +1 -0
- package/dist/core/memory-template.js +496 -0
- package/dist/core/memory-template.js.map +1 -0
- package/dist/core/noise-filter.d.ts +39 -0
- package/dist/core/noise-filter.d.ts.map +1 -0
- package/dist/core/noise-filter.js +168 -0
- package/dist/core/noise-filter.js.map +1 -0
- package/dist/core/retriever.d.ts +21 -0
- package/dist/core/retriever.d.ts.map +1 -0
- package/dist/core/retriever.js +77 -0
- package/dist/core/retriever.js.map +1 -0
- package/dist/core/sanitizer.d.ts +9 -0
- package/dist/core/sanitizer.d.ts.map +1 -0
- package/dist/core/sanitizer.js +57 -0
- package/dist/core/sanitizer.js.map +1 -0
- package/dist/core/smart-extractor.d.ts +12 -0
- package/dist/core/smart-extractor.d.ts.map +1 -0
- package/dist/core/smart-extractor.js +102 -0
- package/dist/core/smart-extractor.js.map +1 -0
- package/dist/core/store.d.ts +40 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +233 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/tool-config.d.ts +33 -0
- package/dist/core/tool-config.d.ts.map +1 -0
- package/dist/core/tool-config.js +253 -0
- package/dist/core/tool-config.js.map +1 -0
- package/dist/engines/engine-adapter.d.ts +22 -0
- package/dist/engines/engine-adapter.d.ts.map +1 -0
- package/dist/engines/engine-adapter.js +7 -0
- package/dist/engines/engine-adapter.js.map +1 -0
- package/dist/engines/lancedb-engine.d.ts +55 -0
- package/dist/engines/lancedb-engine.d.ts.map +1 -0
- package/dist/engines/lancedb-engine.js +279 -0
- package/dist/engines/lancedb-engine.js.map +1 -0
- package/dist/engines/text-engine.d.ts +30 -0
- package/dist/engines/text-engine.d.ts.map +1 -0
- package/dist/engines/text-engine.js +100 -0
- package/dist/engines/text-engine.js.map +1 -0
- package/dist/platforms/claude-code.d.ts +13 -0
- package/dist/platforms/claude-code.d.ts.map +1 -0
- package/dist/platforms/claude-code.js +85 -0
- package/dist/platforms/claude-code.js.map +1 -0
- package/dist/platforms/codex.d.ts +9 -0
- package/dist/platforms/codex.d.ts.map +1 -0
- package/dist/platforms/codex.js +102 -0
- package/dist/platforms/codex.js.map +1 -0
- package/dist/platforms/cursor.d.ts +9 -0
- package/dist/platforms/cursor.d.ts.map +1 -0
- package/dist/platforms/cursor.js +112 -0
- package/dist/platforms/cursor.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,UAAU,EAAU,MAAM,SAAS,CAAC;AAkC7C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAsCvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAetE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAStE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config module
|
|
4
|
+
* Read and write meta/config.yaml
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.loadConfig = loadConfig;
|
|
41
|
+
exports.writeConfig = writeConfig;
|
|
42
|
+
exports.initConfig = initConfig;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const yaml = __importStar(require("js-yaml"));
|
|
46
|
+
const DEFAULT_CONFIG = {
|
|
47
|
+
project: {
|
|
48
|
+
name: 'default',
|
|
49
|
+
description: '',
|
|
50
|
+
},
|
|
51
|
+
memory: {
|
|
52
|
+
token_budget: 500,
|
|
53
|
+
top_k: 5,
|
|
54
|
+
},
|
|
55
|
+
embedding: {
|
|
56
|
+
engine: 'text',
|
|
57
|
+
provider: 'openai',
|
|
58
|
+
model: 'text-embedding-3-small',
|
|
59
|
+
dimensions: 1536,
|
|
60
|
+
base_url: undefined,
|
|
61
|
+
},
|
|
62
|
+
search: {
|
|
63
|
+
use_tags: true,
|
|
64
|
+
use_summary: true,
|
|
65
|
+
},
|
|
66
|
+
review: {
|
|
67
|
+
enabled: true,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Get config file path
|
|
72
|
+
*/
|
|
73
|
+
function getConfigPath(repoRoot) {
|
|
74
|
+
return path.join(repoRoot, 'meta', 'config.yaml');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load config from repo root
|
|
78
|
+
* Falls back to defaults if file doesn't exist
|
|
79
|
+
*/
|
|
80
|
+
function loadConfig(repoRoot) {
|
|
81
|
+
const configPath = getConfigPath(repoRoot);
|
|
82
|
+
if (!fs.existsSync(configPath)) {
|
|
83
|
+
return { ...DEFAULT_CONFIG };
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
87
|
+
const loaded = yaml.load(content);
|
|
88
|
+
// Merge with defaults
|
|
89
|
+
return {
|
|
90
|
+
project: {
|
|
91
|
+
...DEFAULT_CONFIG.project,
|
|
92
|
+
...loaded?.project,
|
|
93
|
+
},
|
|
94
|
+
memory: {
|
|
95
|
+
...DEFAULT_CONFIG.memory,
|
|
96
|
+
...loaded?.memory,
|
|
97
|
+
},
|
|
98
|
+
embedding: {
|
|
99
|
+
...DEFAULT_CONFIG.embedding,
|
|
100
|
+
...loaded?.embedding,
|
|
101
|
+
},
|
|
102
|
+
search: {
|
|
103
|
+
...DEFAULT_CONFIG.search,
|
|
104
|
+
...loaded?.search,
|
|
105
|
+
},
|
|
106
|
+
review: {
|
|
107
|
+
...DEFAULT_CONFIG.review,
|
|
108
|
+
...loaded?.review,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.warn(`Could not load config: ${error.message}`);
|
|
114
|
+
return { ...DEFAULT_CONFIG };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Write config to repo root
|
|
119
|
+
*/
|
|
120
|
+
function writeConfig(repoRoot, config) {
|
|
121
|
+
const configPath = getConfigPath(repoRoot);
|
|
122
|
+
const configDir = path.dirname(configPath);
|
|
123
|
+
// Ensure meta directory exists
|
|
124
|
+
if (!fs.existsSync(configDir)) {
|
|
125
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const content = yaml.dump(config, { indent: 2 });
|
|
129
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
throw new Error(`Could not write config: ${error.message}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Initialize config with project name
|
|
137
|
+
*/
|
|
138
|
+
function initConfig(repoRoot, projectName) {
|
|
139
|
+
const config = {
|
|
140
|
+
...DEFAULT_CONFIG,
|
|
141
|
+
project: {
|
|
142
|
+
name: projectName,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
writeConfig(repoRoot, config);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weibull decay engine for memory scoring
|
|
3
|
+
* Ported from memory-lancedb-pro
|
|
4
|
+
* Formula: score = recency_weight × frequency_weight × importance_weight
|
|
5
|
+
*/
|
|
6
|
+
import { MemoryFile } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Compute decay score for a memory (0-1)
|
|
9
|
+
* Based on recency, access frequency, and confidence
|
|
10
|
+
*/
|
|
11
|
+
export declare function computeDecayScore(memory: MemoryFile, now?: Date): number;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a memory is due for review
|
|
14
|
+
*/
|
|
15
|
+
export declare function isReviewDue(memory: MemoryFile, now?: Date): boolean;
|
|
16
|
+
//# sourceMappingURL=decay-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decay-engine.d.ts","sourceRoot":"","sources":["../../src/core/decay-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAElD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAYpF;AAqCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAU/E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Weibull decay engine for memory scoring
|
|
4
|
+
* Ported from memory-lancedb-pro
|
|
5
|
+
* Formula: score = recency_weight × frequency_weight × importance_weight
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.computeDecayScore = computeDecayScore;
|
|
9
|
+
exports.isReviewDue = isReviewDue;
|
|
10
|
+
/**
|
|
11
|
+
* Compute decay score for a memory (0-1)
|
|
12
|
+
* Based on recency, access frequency, and confidence
|
|
13
|
+
*/
|
|
14
|
+
function computeDecayScore(memory, now = new Date()) {
|
|
15
|
+
// 1. Recency weight: Weibull stretched-exponential decay from created date
|
|
16
|
+
const recencyWeight = computeRecencyWeight(memory.created, now);
|
|
17
|
+
// 2. Frequency weight: 1.0 for now (will be incremented by future access tracking)
|
|
18
|
+
const frequencyWeight = 1.0;
|
|
19
|
+
// 3. Importance weight: based on confidence
|
|
20
|
+
const importanceWeight = computeImportanceWeight(memory.confidence);
|
|
21
|
+
// Final score
|
|
22
|
+
return recencyWeight * frequencyWeight * importanceWeight;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Compute recency weight using Weibull stretched-exponential decay
|
|
26
|
+
* Returns 0-1, where 1 is most recent
|
|
27
|
+
*/
|
|
28
|
+
function computeRecencyWeight(createdDate, now) {
|
|
29
|
+
const created = new Date(createdDate);
|
|
30
|
+
const daysSinceCreation = (now.getTime() - created.getTime()) / (1000 * 60 * 60 * 24);
|
|
31
|
+
// Weibull parameters
|
|
32
|
+
const k = 0.5; // shape parameter
|
|
33
|
+
const lambda = 90; // scale parameter (90 days half-life-ish)
|
|
34
|
+
// Stretched-exponential decay
|
|
35
|
+
const t = daysSinceCreation / lambda;
|
|
36
|
+
const recency = Math.exp(-Math.pow(t, k));
|
|
37
|
+
return Math.max(0, Math.min(1, recency));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Compute importance weight based on confidence
|
|
41
|
+
*/
|
|
42
|
+
function computeImportanceWeight(confidence) {
|
|
43
|
+
switch (confidence) {
|
|
44
|
+
case 'high':
|
|
45
|
+
return 1.0;
|
|
46
|
+
case 'medium':
|
|
47
|
+
return 0.7;
|
|
48
|
+
case 'low':
|
|
49
|
+
return 0.4;
|
|
50
|
+
default:
|
|
51
|
+
return 0.5; // default for unspecified
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a memory is due for review
|
|
56
|
+
*/
|
|
57
|
+
function isReviewDue(memory, now = new Date()) {
|
|
58
|
+
if (!memory.review_after) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const created = new Date(memory.created);
|
|
62
|
+
const reviewDuration = parseReviewDuration(memory.review_after);
|
|
63
|
+
const reviewDate = new Date(created.getTime() + reviewDuration);
|
|
64
|
+
return now >= reviewDate;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse review duration string (e.g., "90d", "1w", "3m") into milliseconds
|
|
68
|
+
*/
|
|
69
|
+
function parseReviewDuration(duration) {
|
|
70
|
+
const match = duration.match(/^(\d+)([dwmy])$/);
|
|
71
|
+
if (!match?.[1]) {
|
|
72
|
+
// Default to 90 days if format is invalid
|
|
73
|
+
return 90 * 24 * 60 * 60 * 1000;
|
|
74
|
+
}
|
|
75
|
+
const value = parseInt(match[1], 10);
|
|
76
|
+
const unit = match[2];
|
|
77
|
+
const msPerDay = 24 * 60 * 60 * 1000;
|
|
78
|
+
switch (unit) {
|
|
79
|
+
case 'd':
|
|
80
|
+
return value * msPerDay;
|
|
81
|
+
case 'w':
|
|
82
|
+
return value * 7 * msPerDay;
|
|
83
|
+
case 'm':
|
|
84
|
+
return value * 30 * msPerDay;
|
|
85
|
+
case 'y':
|
|
86
|
+
return value * 365 * msPerDay;
|
|
87
|
+
default:
|
|
88
|
+
return 90 * msPerDay;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=decay-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decay-engine.js","sourceRoot":"","sources":["../../src/core/decay-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Generator
|
|
3
|
+
* Generates vector embeddings using OpenAI-compatible APIs
|
|
4
|
+
* Supports: OpenAI, Azure, Ollama, and other compatible providers
|
|
5
|
+
*/
|
|
6
|
+
export type EmbeddingProvider = 'openai' | 'azure' | 'ollama' | 'custom';
|
|
7
|
+
export interface EmbeddingConfig {
|
|
8
|
+
provider: EmbeddingProvider;
|
|
9
|
+
model: string;
|
|
10
|
+
dimensions: number;
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class EmbeddingGenerator {
|
|
15
|
+
private client;
|
|
16
|
+
private config;
|
|
17
|
+
constructor(config: EmbeddingConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Get default base URL for provider
|
|
20
|
+
*/
|
|
21
|
+
private getDefaultBaseUrl;
|
|
22
|
+
/**
|
|
23
|
+
* Generate embedding for a single text
|
|
24
|
+
* @param text - Input text to embed
|
|
25
|
+
* @returns Vector embedding as number array
|
|
26
|
+
*/
|
|
27
|
+
generateEmbedding(text: string): Promise<number[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Generate embeddings for multiple texts in batch
|
|
30
|
+
* @param texts - Array of input texts
|
|
31
|
+
* @returns Array of vector embeddings
|
|
32
|
+
*/
|
|
33
|
+
generateEmbeddings(texts: string[]): Promise<number[][]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get embedding dimensions by querying the model
|
|
36
|
+
* Useful when dimensions are unknown for custom models
|
|
37
|
+
*/
|
|
38
|
+
detectDimensions(): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Create embedding config from memo config
|
|
41
|
+
* Supports multiple providers with appropriate defaults
|
|
42
|
+
*/
|
|
43
|
+
static fromMemoConfig(config: {
|
|
44
|
+
embedding: {
|
|
45
|
+
provider?: string;
|
|
46
|
+
model?: string;
|
|
47
|
+
base_url?: string;
|
|
48
|
+
dimensions?: number;
|
|
49
|
+
};
|
|
50
|
+
}): EmbeddingConfig | null;
|
|
51
|
+
/**
|
|
52
|
+
* Get default model for provider
|
|
53
|
+
*/
|
|
54
|
+
private static getDefaultModel;
|
|
55
|
+
/**
|
|
56
|
+
* Get default dimensions for known models
|
|
57
|
+
*/
|
|
58
|
+
private static getDefaultDimensions;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAYnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;OAIG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBxD;;;;OAIG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAmB9D;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IASzC;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;QAC5B,SAAS,EAAE;YACT,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,GAAG,eAAe,GAAG,IAAI;IAmC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAW9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;CA4BpC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Embedding Generator
|
|
4
|
+
* Generates vector embeddings using OpenAI-compatible APIs
|
|
5
|
+
* Supports: OpenAI, Azure, Ollama, and other compatible providers
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.EmbeddingGenerator = void 0;
|
|
9
|
+
const openai_1 = require("openai");
|
|
10
|
+
class EmbeddingGenerator {
|
|
11
|
+
client;
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
// Ollama typically uses empty string or 'ollama' as API key
|
|
16
|
+
const apiKey = config.apiKey || (config.provider === 'ollama' ? 'ollama' : '');
|
|
17
|
+
this.client = new openai_1.OpenAI({
|
|
18
|
+
apiKey,
|
|
19
|
+
baseURL: config.baseUrl || this.getDefaultBaseUrl(config.provider),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get default base URL for provider
|
|
24
|
+
*/
|
|
25
|
+
getDefaultBaseUrl(provider) {
|
|
26
|
+
switch (provider) {
|
|
27
|
+
case 'ollama':
|
|
28
|
+
return 'http://localhost:11434/v1';
|
|
29
|
+
case 'azure':
|
|
30
|
+
return 'https://api.openai.com/v1'; // Azure uses different format
|
|
31
|
+
default:
|
|
32
|
+
return 'https://api.openai.com/v1';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate embedding for a single text
|
|
37
|
+
* @param text - Input text to embed
|
|
38
|
+
* @returns Vector embedding as number array
|
|
39
|
+
*/
|
|
40
|
+
async generateEmbedding(text) {
|
|
41
|
+
try {
|
|
42
|
+
const response = await this.client.embeddings.create({
|
|
43
|
+
model: this.config.model,
|
|
44
|
+
input: text,
|
|
45
|
+
});
|
|
46
|
+
const embedding = response.data?.[0]?.embedding;
|
|
47
|
+
if (!embedding) {
|
|
48
|
+
throw new Error('No embedding returned');
|
|
49
|
+
}
|
|
50
|
+
return embedding;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw new Error(`Failed to generate embedding: ${error.message}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate embeddings for multiple texts in batch
|
|
58
|
+
* @param texts - Array of input texts
|
|
59
|
+
* @returns Array of vector embeddings
|
|
60
|
+
*/
|
|
61
|
+
async generateEmbeddings(texts) {
|
|
62
|
+
if (texts.length === 0) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const response = await this.client.embeddings.create({
|
|
67
|
+
model: this.config.model,
|
|
68
|
+
input: texts,
|
|
69
|
+
});
|
|
70
|
+
// Sort by index to ensure order matches input
|
|
71
|
+
const sorted = response.data.sort((a, b) => a.index - b.index);
|
|
72
|
+
return sorted.map((item) => item.embedding);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new Error(`Failed to generate embeddings: ${error.message}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get embedding dimensions by querying the model
|
|
80
|
+
* Useful when dimensions are unknown for custom models
|
|
81
|
+
*/
|
|
82
|
+
async detectDimensions() {
|
|
83
|
+
try {
|
|
84
|
+
const embedding = await this.generateEmbedding('test');
|
|
85
|
+
return embedding.length;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Failed to detect dimensions: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create embedding config from memo config
|
|
93
|
+
* Supports multiple providers with appropriate defaults
|
|
94
|
+
*/
|
|
95
|
+
static fromMemoConfig(config) {
|
|
96
|
+
const { embedding } = config;
|
|
97
|
+
const provider = embedding.provider || 'openai';
|
|
98
|
+
// Get API key based on provider
|
|
99
|
+
let apiKey;
|
|
100
|
+
if (provider === 'ollama') {
|
|
101
|
+
// Ollama doesn't require an API key
|
|
102
|
+
apiKey = undefined;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// OpenAI, Azure, etc. need API key from environment
|
|
106
|
+
apiKey = process.env.OPENAI_API_KEY || process.env.AZURE_API_KEY;
|
|
107
|
+
if (!apiKey && provider !== 'custom') {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Get model with provider-specific defaults
|
|
112
|
+
const model = embedding.model || EmbeddingGenerator.getDefaultModel(provider);
|
|
113
|
+
// Get dimensions - either from config or detect automatically later
|
|
114
|
+
let dimensions = embedding.dimensions;
|
|
115
|
+
if (!dimensions) {
|
|
116
|
+
dimensions = EmbeddingGenerator.getDefaultDimensions(model);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
provider,
|
|
120
|
+
model,
|
|
121
|
+
dimensions,
|
|
122
|
+
baseUrl: embedding.base_url,
|
|
123
|
+
apiKey,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get default model for provider
|
|
128
|
+
*/
|
|
129
|
+
static getDefaultModel(provider) {
|
|
130
|
+
switch (provider) {
|
|
131
|
+
case 'ollama':
|
|
132
|
+
return 'mxbai-embed-large'; // Popular Ollama embedding model
|
|
133
|
+
case 'azure':
|
|
134
|
+
return 'text-embedding-ada-002';
|
|
135
|
+
default:
|
|
136
|
+
return 'text-embedding-3-small';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get default dimensions for known models
|
|
141
|
+
*/
|
|
142
|
+
static getDefaultDimensions(model) {
|
|
143
|
+
const modelDimensions = {
|
|
144
|
+
// OpenAI
|
|
145
|
+
'text-embedding-3-small': 1536,
|
|
146
|
+
'text-embedding-3-large': 3072,
|
|
147
|
+
'text-embedding-ada-002': 1536,
|
|
148
|
+
// Ollama popular models
|
|
149
|
+
'mxbai-embed-large': 1024,
|
|
150
|
+
'nomic-embed-text': 768,
|
|
151
|
+
'all-minilm': 384,
|
|
152
|
+
'all-mpnet-base-v2': 768,
|
|
153
|
+
};
|
|
154
|
+
// Try exact match first
|
|
155
|
+
if (modelDimensions[model]) {
|
|
156
|
+
return modelDimensions[model];
|
|
157
|
+
}
|
|
158
|
+
// Try partial match
|
|
159
|
+
for (const [key, dim] of Object.entries(modelDimensions)) {
|
|
160
|
+
if (model.includes(key)) {
|
|
161
|
+
return dim;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Default fallback
|
|
165
|
+
return 1536;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.EmbeddingGenerator = EmbeddingGenerator;
|
|
169
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Lifecycle Manager
|
|
3
|
+
* Handles memory promotion, demotion, archival, and correction
|
|
4
|
+
* Ported and adapted from memory-lancedb-pro
|
|
5
|
+
*/
|
|
6
|
+
import { MemoryFile } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Memory tiers based on usage and importance
|
|
9
|
+
*/
|
|
10
|
+
export type MemoryTier = 'core' | 'working' | 'peripheral';
|
|
11
|
+
/**
|
|
12
|
+
* Access log for tracking memory usage
|
|
13
|
+
*/
|
|
14
|
+
export interface AccessLog {
|
|
15
|
+
memoryPath: string;
|
|
16
|
+
lastAccessed: Date;
|
|
17
|
+
accessCount: number;
|
|
18
|
+
recallQueries: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Lifecycle configuration
|
|
22
|
+
*/
|
|
23
|
+
export interface LifecycleConfig {
|
|
24
|
+
coreThreshold: number;
|
|
25
|
+
peripheralThreshold: number;
|
|
26
|
+
archiveAfterDays: number;
|
|
27
|
+
deleteAfterDays: number;
|
|
28
|
+
allowCorrections: boolean;
|
|
29
|
+
correctionThreshold: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load access logs
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadAccessLogs(repoRoot: string): Record<string, AccessLog>;
|
|
35
|
+
/**
|
|
36
|
+
* Save access logs
|
|
37
|
+
*/
|
|
38
|
+
export declare function saveAccessLogs(repoRoot: string, logs: Record<string, AccessLog>): void;
|
|
39
|
+
/**
|
|
40
|
+
* Record memory access
|
|
41
|
+
*/
|
|
42
|
+
export declare function recordAccess(repoRoot: string, memoryPath: string, query?: string): AccessLog;
|
|
43
|
+
/**
|
|
44
|
+
* Get memory tier based on access patterns
|
|
45
|
+
*/
|
|
46
|
+
export declare function getMemoryTier(memory: MemoryFile, accessLog?: AccessLog, config?: LifecycleConfig): MemoryTier;
|
|
47
|
+
/**
|
|
48
|
+
* Analyze memory lifecycle for all memories
|
|
49
|
+
*/
|
|
50
|
+
export interface LifecycleAnalysis {
|
|
51
|
+
memory: MemoryFile;
|
|
52
|
+
tier: MemoryTier;
|
|
53
|
+
accessCount: number;
|
|
54
|
+
daysSinceAccess: number | null;
|
|
55
|
+
isArchivalCandidate: boolean;
|
|
56
|
+
isDeletionCandidate: boolean;
|
|
57
|
+
suggestion?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function analyzeLifecycle(repoRoot: string, config?: LifecycleConfig): LifecycleAnalysis[];
|
|
60
|
+
/**
|
|
61
|
+
* Correction record for tracking memory corrections
|
|
62
|
+
*/
|
|
63
|
+
export interface CorrectionRecord {
|
|
64
|
+
memoryPath: string;
|
|
65
|
+
corrections: Array<{
|
|
66
|
+
date: string;
|
|
67
|
+
originalText: string;
|
|
68
|
+
correctedText: string;
|
|
69
|
+
reason: string;
|
|
70
|
+
}>;
|
|
71
|
+
flaggedForReview: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Load corrections log
|
|
75
|
+
*/
|
|
76
|
+
export declare function loadCorrections(repoRoot: string): Record<string, CorrectionRecord>;
|
|
77
|
+
/**
|
|
78
|
+
* Save corrections log
|
|
79
|
+
*/
|
|
80
|
+
export declare function saveCorrections(repoRoot: string, corrections: Record<string, CorrectionRecord>): void;
|
|
81
|
+
/**
|
|
82
|
+
* Record a memory correction
|
|
83
|
+
*/
|
|
84
|
+
export declare function recordCorrection(repoRoot: string, memoryPath: string, originalText: string, correctedText: string, reason: string): CorrectionRecord;
|
|
85
|
+
/**
|
|
86
|
+
* Get memories flagged for review
|
|
87
|
+
*/
|
|
88
|
+
export declare function getFlaggedMemories(repoRoot: string): MemoryFile[];
|
|
89
|
+
/**
|
|
90
|
+
* Archive a memory (move to archive directory)
|
|
91
|
+
*/
|
|
92
|
+
export declare function archiveMemory(repoRoot: string, memoryPath: string): void;
|
|
93
|
+
/**
|
|
94
|
+
* Delete a memory permanently
|
|
95
|
+
*/
|
|
96
|
+
export declare function deleteMemory(repoRoot: string, memoryPath: string): void;
|
|
97
|
+
/**
|
|
98
|
+
* Update memory content (correction)
|
|
99
|
+
*/
|
|
100
|
+
export declare function updateMemory(repoRoot: string, memoryPath: string, updates: Partial<MemoryFile>): void;
|
|
101
|
+
/**
|
|
102
|
+
* Generate lifecycle report
|
|
103
|
+
*/
|
|
104
|
+
export declare function generateLifecycleReport(repoRoot: string, config?: LifecycleConfig): string;
|
|
105
|
+
//# sourceMappingURL=lifecycle-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-manager.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle-manager.ts"],"names":[],"mappings":"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"}
|