@aman_asmuei/amem 0.11.1 → 0.13.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/dist/ann.d.ts +18 -0
- package/dist/ann.js +38 -0
- package/dist/ann.js.map +1 -0
- package/dist/auto-relate.d.ts +14 -0
- package/dist/auto-relate.js +47 -0
- package/dist/auto-relate.js.map +1 -0
- package/dist/cli.js +117 -23
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/dashboard.js +62 -0
- package/dist/dashboard.js.map +1 -1
- package/dist/doctor.d.ts +23 -0
- package/dist/doctor.js +107 -0
- package/dist/doctor.js.map +1 -0
- package/dist/embeddings.d.ts +6 -0
- package/dist/embeddings.js +81 -4
- package/dist/embeddings.js.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.js +159 -12
- package/dist/hooks.js.map +1 -1
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +62 -14
- package/dist/memory.js.map +1 -1
- package/dist/memory.test.js +3 -2
- package/dist/memory.test.js.map +1 -1
- package/dist/query-expand.d.ts +9 -0
- package/dist/query-expand.js +71 -0
- package/dist/query-expand.js.map +1 -0
- package/dist/schemas.d.ts +30 -30
- package/dist/sync.d.ts +26 -0
- package/dist/sync.js +82 -0
- package/dist/sync.js.map +1 -1
- package/dist/tools/memory.js +78 -8
- package/dist/tools/memory.js.map +1 -1
- package/package.json +1 -1
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { loadConfig } from "./config.js";
|
|
2
|
+
export function runDiagnostics(db) {
|
|
3
|
+
const config = loadConfig();
|
|
4
|
+
const issues = [];
|
|
5
|
+
// Basic stats
|
|
6
|
+
const stats = db.getStats();
|
|
7
|
+
const totalMemories = stats.total;
|
|
8
|
+
const byType = stats.byType;
|
|
9
|
+
// Embedding coverage
|
|
10
|
+
const embeddingCount = db.getEmbeddingCount();
|
|
11
|
+
const embeddingCoverage = totalMemories > 0
|
|
12
|
+
? Math.round((embeddingCount / totalMemories) * 100)
|
|
13
|
+
: 100; // empty DB is fine
|
|
14
|
+
// Core tier token analysis
|
|
15
|
+
const coreTierBudget = config.tiers.coreMaxTokens;
|
|
16
|
+
const coreMemories = db.getByTier("core");
|
|
17
|
+
const coreTierTokens = coreMemories.reduce((sum, m) => sum + Math.ceil(m.content.length / 4), 0);
|
|
18
|
+
// Stale memories: 60+ days old, <0.5 confidence, not corrections
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
const staleCutoff = now - 60 * 24 * 60 * 60 * 1000;
|
|
21
|
+
const allMemories = db.getAll();
|
|
22
|
+
const staleMemories = allMemories.filter((m) => m.createdAt < staleCutoff &&
|
|
23
|
+
m.confidence < 0.5 &&
|
|
24
|
+
m.type !== "correction");
|
|
25
|
+
const staleCount = staleMemories.length;
|
|
26
|
+
// Graph analysis
|
|
27
|
+
const allRelations = db.getAllRelations();
|
|
28
|
+
const graphEdges = allRelations.length;
|
|
29
|
+
const memoryIds = new Set(allMemories.map((m) => m.id));
|
|
30
|
+
const orphanedGraphNodes = allRelations.filter((r) => !memoryIds.has(r.fromId) || !memoryIds.has(r.toId)).length;
|
|
31
|
+
// Overdue reminders
|
|
32
|
+
const reminders = db.checkReminders();
|
|
33
|
+
const remindersOverdue = reminders.filter((r) => r.status === "overdue").length;
|
|
34
|
+
// ── Issue detection ──────────────────────────────────────
|
|
35
|
+
if (totalMemories > 0 && embeddingCoverage < 50) {
|
|
36
|
+
issues.push({
|
|
37
|
+
type: "low_embedding_coverage",
|
|
38
|
+
severity: "warning",
|
|
39
|
+
message: `Only ${embeddingCoverage}% of memories have embeddings`,
|
|
40
|
+
suggestion: "Semantic search quality is reduced. Use the MCP server to auto-generate embeddings on access.",
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (coreTierTokens > coreTierBudget * 0.9 && coreTierBudget > 0) {
|
|
44
|
+
issues.push({
|
|
45
|
+
type: "core_tier_near_budget",
|
|
46
|
+
severity: coreTierTokens > coreTierBudget ? "critical" : "warning",
|
|
47
|
+
message: `Core tier uses ${coreTierTokens}/${coreTierBudget} tokens (${Math.round((coreTierTokens / coreTierBudget) * 100)}%)`,
|
|
48
|
+
suggestion: "Review core memories with 'amem list --type correction' and consolidate or demote less important ones.",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (staleCount > 10) {
|
|
52
|
+
issues.push({
|
|
53
|
+
type: "stale_memories",
|
|
54
|
+
severity: "warning",
|
|
55
|
+
message: `${staleCount} stale memories (60+ days old, low confidence)`,
|
|
56
|
+
suggestion: "Run 'amem list' to review and 'amem forget <id>' to clean up outdated entries.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (orphanedGraphNodes > 0) {
|
|
60
|
+
issues.push({
|
|
61
|
+
type: "orphaned_graph_nodes",
|
|
62
|
+
severity: "warning",
|
|
63
|
+
message: `${orphanedGraphNodes} graph edge(s) reference deleted memories`,
|
|
64
|
+
suggestion: "These orphaned relations can be cleaned up by consolidating the knowledge graph.",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (remindersOverdue > 0) {
|
|
68
|
+
issues.push({
|
|
69
|
+
type: "overdue_reminders",
|
|
70
|
+
severity: "info",
|
|
71
|
+
message: `${remindersOverdue} overdue reminder(s)`,
|
|
72
|
+
suggestion: "Check reminders via the MCP 'reminder_check' tool or address them in your next session.",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (totalMemories >= 100 && (byType["correction"] ?? 0) === 0) {
|
|
76
|
+
issues.push({
|
|
77
|
+
type: "no_corrections",
|
|
78
|
+
severity: "info",
|
|
79
|
+
message: "100+ memories but no corrections stored",
|
|
80
|
+
suggestion: "Corrections are the highest-priority memory type. Store them when the AI makes mistakes.",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// ── Determine overall status ────────────────────────────
|
|
84
|
+
let status = "healthy";
|
|
85
|
+
if (issues.some((i) => i.severity === "critical")) {
|
|
86
|
+
status = "critical";
|
|
87
|
+
}
|
|
88
|
+
else if (issues.some((i) => i.severity === "warning")) {
|
|
89
|
+
status = "warning";
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
status,
|
|
93
|
+
stats: {
|
|
94
|
+
totalMemories,
|
|
95
|
+
embeddingCoverage,
|
|
96
|
+
coreTierTokens,
|
|
97
|
+
coreTierBudget,
|
|
98
|
+
staleCount,
|
|
99
|
+
orphanedGraphNodes,
|
|
100
|
+
byType,
|
|
101
|
+
graphEdges,
|
|
102
|
+
remindersOverdue,
|
|
103
|
+
},
|
|
104
|
+
issues,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/embeddings.d.ts
CHANGED
|
@@ -10,6 +10,12 @@ export interface SimilarityResult<T> {
|
|
|
10
10
|
data: T;
|
|
11
11
|
}
|
|
12
12
|
export declare function findTopK<T>(query: Float32Array, candidates: EmbeddingCandidate<T>[], k: number): SimilarityResult<T>[];
|
|
13
|
+
export declare function disableEmbeddings(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Pre-warm the embedding pipeline in the background.
|
|
16
|
+
* Call this at startup so the model is ready when the first query arrives.
|
|
17
|
+
*/
|
|
18
|
+
export declare function preloadEmbeddings(): void;
|
|
13
19
|
export declare function generateEmbedding(text: string): Promise<Float32Array | null>;
|
|
14
20
|
export declare function isEmbeddingAvailable(): Promise<boolean>;
|
|
15
21
|
export interface RerankCandidate {
|
package/dist/embeddings.js
CHANGED
|
@@ -44,24 +44,101 @@ function cachePut(key, val) {
|
|
|
44
44
|
}
|
|
45
45
|
embeddingCache.set(key, val);
|
|
46
46
|
}
|
|
47
|
+
/** Skip embedding loading entirely (useful for CLI commands that need fast exit). */
|
|
48
|
+
let embeddingDisabled = false;
|
|
49
|
+
export function disableEmbeddings() {
|
|
50
|
+
embeddingDisabled = true;
|
|
51
|
+
}
|
|
47
52
|
async function getEmbeddingPipeline() {
|
|
53
|
+
if (embeddingDisabled)
|
|
54
|
+
return null;
|
|
48
55
|
if (pipelineInstance)
|
|
49
56
|
return pipelineInstance;
|
|
50
57
|
if (pipelineLoading)
|
|
51
58
|
return pipelineLoading;
|
|
52
59
|
pipelineLoading = (async () => {
|
|
60
|
+
const LOAD_TIMEOUT_MS = 30000;
|
|
61
|
+
async function attemptLoad() {
|
|
62
|
+
const loadPromise = (async () => {
|
|
63
|
+
const { loadConfig } = await import("./config.js");
|
|
64
|
+
const config = loadConfig();
|
|
65
|
+
const mod = await import("@huggingface/transformers");
|
|
66
|
+
return await mod.pipeline("feature-extraction", config.embeddingModel);
|
|
67
|
+
})();
|
|
68
|
+
return await Promise.race([
|
|
69
|
+
loadPromise,
|
|
70
|
+
new Promise((resolve) => setTimeout(() => resolve(null), LOAD_TIMEOUT_MS)),
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
53
73
|
try {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
74
|
+
const result = await attemptLoad();
|
|
75
|
+
if (result) {
|
|
76
|
+
pipelineInstance = result;
|
|
77
|
+
return pipelineInstance;
|
|
78
|
+
}
|
|
79
|
+
console.error("[amem] Embedding model load timed out — using keyword matching");
|
|
80
|
+
return null;
|
|
57
81
|
}
|
|
58
82
|
catch (error) {
|
|
59
|
-
|
|
83
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
84
|
+
// If the cached model is corrupted, clear it and retry once
|
|
85
|
+
if (msg.includes("Protobuf parsing failed") || msg.includes("invalid model")) {
|
|
86
|
+
console.error("[amem] Corrupted model cache detected — clearing and retrying...");
|
|
87
|
+
try {
|
|
88
|
+
const fs = await import("node:fs");
|
|
89
|
+
const path = await import("node:path");
|
|
90
|
+
const os = await import("node:os");
|
|
91
|
+
const { loadConfig } = await import("./config.js");
|
|
92
|
+
const cfg = loadConfig();
|
|
93
|
+
const modelParts = cfg.embeddingModel.split("/");
|
|
94
|
+
const modelOrg = modelParts[0] ?? "Xenova";
|
|
95
|
+
const modelName = modelParts[1] ?? cfg.embeddingModel;
|
|
96
|
+
// Clear the HuggingFace cache for this model
|
|
97
|
+
const cacheLocations = [
|
|
98
|
+
path.join(os.homedir(), ".cache", "huggingface", "transformers", modelOrg, modelName),
|
|
99
|
+
];
|
|
100
|
+
// Also try to find the cache inside node_modules
|
|
101
|
+
try {
|
|
102
|
+
const modPath = import.meta.resolve?.("@huggingface/transformers") ?? "";
|
|
103
|
+
if (modPath) {
|
|
104
|
+
const modDir = path.dirname(modPath.replace("file://", ""));
|
|
105
|
+
cacheLocations.push(path.join(modDir, ".cache", modelOrg, modelName));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch { }
|
|
109
|
+
for (const loc of cacheLocations) {
|
|
110
|
+
if (fs.existsSync(loc)) {
|
|
111
|
+
fs.rmSync(loc, { recursive: true, force: true });
|
|
112
|
+
console.error(`[amem] Cleared cache: ${loc}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Retry once
|
|
116
|
+
const retryResult = await attemptLoad();
|
|
117
|
+
if (retryResult) {
|
|
118
|
+
pipelineInstance = retryResult;
|
|
119
|
+
console.error("[amem] Model re-downloaded successfully — semantic search enabled");
|
|
120
|
+
return pipelineInstance;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (retryError) {
|
|
124
|
+
console.error("[amem] Cache recovery failed:", retryError instanceof Error ? retryError.message : String(retryError));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
console.error("[amem] Embeddings unavailable — using keyword matching (still works great!):", msg);
|
|
128
|
+
console.error("[amem] To enable semantic search: npm install @huggingface/transformers");
|
|
60
129
|
return null;
|
|
61
130
|
}
|
|
62
131
|
})();
|
|
63
132
|
return pipelineLoading;
|
|
64
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Pre-warm the embedding pipeline in the background.
|
|
136
|
+
* Call this at startup so the model is ready when the first query arrives.
|
|
137
|
+
*/
|
|
138
|
+
export function preloadEmbeddings() {
|
|
139
|
+
// Fire-and-forget — don't block startup
|
|
140
|
+
getEmbeddingPipeline().catch(() => { });
|
|
141
|
+
}
|
|
65
142
|
export async function generateEmbedding(text) {
|
|
66
143
|
// Check cache first
|
|
67
144
|
const cached = cacheGet(text);
|
package/dist/embeddings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,GAAG,GAAG,KAAK,CAAC;AACrB,CAAC;AAcD,MAAM,UAAU,QAAQ,CACtB,KAAmB,EACnB,UAAmC,EACnC,CAAS;IAET,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,UAAU,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC;QAChD,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC;AAOD,IAAI,gBAAgB,GAA4B,IAAI,CAAC;AACrD,IAAI,eAAe,GAA4C,IAAI,CAAC;AAEpE,mEAAmE;AACnE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEvD,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,EAAE,CAAC;QACR,mCAAmC;QACnC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAiB;IAC9C,IAAI,cAAc,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;QAC/C,6BAA6B;QAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC9C,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
CHANGED
package/dist/hooks.js
CHANGED
|
@@ -38,6 +38,16 @@ export function generateHooksConfig(config) {
|
|
|
38
38
|
}],
|
|
39
39
|
}];
|
|
40
40
|
}
|
|
41
|
+
if (config.captureSessionStart) {
|
|
42
|
+
hooks.SessionStart = [{
|
|
43
|
+
matcher: "",
|
|
44
|
+
hooks: [{
|
|
45
|
+
type: "command",
|
|
46
|
+
command: getSessionStartCommand(),
|
|
47
|
+
timeout: 10000,
|
|
48
|
+
}],
|
|
49
|
+
}];
|
|
50
|
+
}
|
|
41
51
|
return hooks;
|
|
42
52
|
}
|
|
43
53
|
function getPostToolUseCommand() {
|
|
@@ -48,6 +58,10 @@ function getStopCommand() {
|
|
|
48
58
|
const scriptPath = getHookScriptPath("session-end.mjs");
|
|
49
59
|
return `node "${scriptPath}"`;
|
|
50
60
|
}
|
|
61
|
+
function getSessionStartCommand() {
|
|
62
|
+
const scriptPath = getHookScriptPath("session-start.mjs");
|
|
63
|
+
return `node "${scriptPath}"`;
|
|
64
|
+
}
|
|
51
65
|
function getHookScriptPath(name) {
|
|
52
66
|
const amemDir = process.env.AMEM_DIR || path.join(os.homedir(), ".amem");
|
|
53
67
|
return path.join(amemDir, "hooks", name);
|
|
@@ -75,6 +89,13 @@ export function installHooks(config) {
|
|
|
75
89
|
fs.chmodSync(scriptPath, 0o755);
|
|
76
90
|
installed.push("session-end.mjs");
|
|
77
91
|
}
|
|
92
|
+
if (config.captureSessionStart) {
|
|
93
|
+
const scriptPath = path.join(hooksDir, "session-start.mjs");
|
|
94
|
+
fs.writeFileSync(scriptPath, getSessionStartScript(dbPath));
|
|
95
|
+
if (process.platform !== "win32")
|
|
96
|
+
fs.chmodSync(scriptPath, 0o755);
|
|
97
|
+
installed.push("session-start.mjs");
|
|
98
|
+
}
|
|
78
99
|
// Update Claude Code settings.json with hook configuration
|
|
79
100
|
const claudeDir = path.join(os.homedir(), ".claude");
|
|
80
101
|
const settingsPath = path.join(claudeDir, "settings.json");
|
|
@@ -110,7 +131,7 @@ export function uninstallHooks() {
|
|
|
110
131
|
const amemDir = process.env.AMEM_DIR || path.join(os.homedir(), ".amem");
|
|
111
132
|
const hooksDir = path.join(amemDir, "hooks");
|
|
112
133
|
const removed = [];
|
|
113
|
-
for (const name of ["post-tool-use.mjs", "session-end.mjs"]) {
|
|
134
|
+
for (const name of ["post-tool-use.mjs", "session-end.mjs", "session-start.mjs"]) {
|
|
114
135
|
const scriptPath = path.join(hooksDir, name);
|
|
115
136
|
if (fs.existsSync(scriptPath)) {
|
|
116
137
|
fs.unlinkSync(scriptPath);
|
|
@@ -144,28 +165,61 @@ export function uninstallHooks() {
|
|
|
144
165
|
function getPostToolUseScript(dbPath) {
|
|
145
166
|
const escaped = dbPath.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
146
167
|
return `#!/usr/bin/env node
|
|
147
|
-
// amem PostToolUse hook
|
|
168
|
+
// amem PostToolUse hook — enhanced passive capture with pattern detection
|
|
148
169
|
// Auto-generated by amem. Do not edit manually.
|
|
149
170
|
|
|
150
171
|
import { createRequire } from 'node:module';
|
|
151
|
-
import { randomUUID } from 'node:crypto';
|
|
172
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
152
173
|
|
|
153
174
|
const toolName = process.env.TOOL_NAME || '';
|
|
154
175
|
const toolInput = process.env.TOOL_INPUT || '';
|
|
176
|
+
const toolOutput = process.env.TOOL_OUTPUT || '';
|
|
155
177
|
|
|
156
178
|
// Skip amem's own tools to avoid infinite loops
|
|
157
179
|
if (toolName.startsWith('memory_') || toolName.startsWith('reminder_')) {
|
|
158
180
|
process.exit(0);
|
|
159
181
|
}
|
|
160
182
|
|
|
161
|
-
|
|
162
|
-
const SKIP_TOOLS = new Set(['Read', 'Glob', 'Grep', 'LS', 'Bash']);
|
|
163
|
-
if (SKIP_TOOLS.has(toolName)) {
|
|
183
|
+
if (!toolName || !toolInput || toolInput.length < 10) {
|
|
164
184
|
process.exit(0);
|
|
165
185
|
}
|
|
166
186
|
|
|
167
|
-
|
|
168
|
-
|
|
187
|
+
// ── Pattern detection for auto-extraction ──────────────────
|
|
188
|
+
// Detect memory-worthy signals from user messages in tool input
|
|
189
|
+
const CORRECTION_PATTERNS = [
|
|
190
|
+
/\\b(?:don'?t|never|stop|wrong|incorrect|mistake|instead of)\\b/i,
|
|
191
|
+
/\\b(?:always use|must use|should use|prefer|no,\\s|actually,?)\\b/i,
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
const DECISION_PATTERNS = [
|
|
195
|
+
/\\b(?:let'?s go with|we'?ll use|decided to|choosing|went with|decision)\\b/i,
|
|
196
|
+
/\\b(?:architecture|approach|strategy|design)\\b/i,
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
const PREFERENCE_PATTERNS = [
|
|
200
|
+
/\\b(?:i prefer|i like|i want|please use|my preference|i always)\\b/i,
|
|
201
|
+
];
|
|
202
|
+
|
|
203
|
+
function detectMemorySignal(text) {
|
|
204
|
+
const lower = text.toLowerCase();
|
|
205
|
+
for (const p of CORRECTION_PATTERNS) {
|
|
206
|
+
if (p.test(text)) return { type: 'correction', confidence: 0.7 };
|
|
207
|
+
}
|
|
208
|
+
for (const p of DECISION_PATTERNS) {
|
|
209
|
+
if (p.test(text)) return { type: 'decision', confidence: 0.6 };
|
|
210
|
+
}
|
|
211
|
+
for (const p of PREFERENCE_PATTERNS) {
|
|
212
|
+
if (p.test(text)) return { type: 'preference', confidence: 0.6 };
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// ── Extractive compression for large observations ──────────
|
|
218
|
+
function compress(text, maxLen) {
|
|
219
|
+
if (!text || text.length <= maxLen) return text || '';
|
|
220
|
+
// Keep first and last portions, skip the middle
|
|
221
|
+
const half = Math.floor(maxLen / 2) - 10;
|
|
222
|
+
return text.slice(0, half) + '\\n[...compressed...]\\n' + text.slice(-half);
|
|
169
223
|
}
|
|
170
224
|
|
|
171
225
|
try {
|
|
@@ -175,20 +229,113 @@ try {
|
|
|
175
229
|
db.pragma('journal_mode = WAL');
|
|
176
230
|
db.pragma('busy_timeout = 2000');
|
|
177
231
|
|
|
178
|
-
const id = randomUUID();
|
|
179
232
|
const now = Date.now();
|
|
180
233
|
const sessionId = process.env.CLAUDE_SESSION_ID || 'hook-' + new Date().toISOString().slice(0, 10);
|
|
181
234
|
const project = process.env.AMEM_PROJECT || 'global';
|
|
182
235
|
|
|
183
|
-
|
|
184
|
-
const
|
|
236
|
+
// Compress large tool output for log storage (10x reduction target)
|
|
237
|
+
const compressedOutput = compress(toolOutput, 500);
|
|
238
|
+
const content = 'Tool: ' + toolName + '\\nInput: ' + compress(toolInput, 300) + (compressedOutput ? '\\nOutput: ' + compressedOutput : '');
|
|
239
|
+
const metadata = JSON.stringify({ hook: 'PostToolUse', tool: toolName, inputLen: toolInput.length, outputLen: toolOutput.length });
|
|
185
240
|
|
|
241
|
+
// Log all tool uses (compressed)
|
|
186
242
|
db.prepare(
|
|
187
243
|
'INSERT INTO conversation_log (id, session_id, role, content, timestamp, project, metadata) VALUES (?, ?, ?, ?, ?, ?, ?)'
|
|
188
|
-
).run(
|
|
244
|
+
).run(randomUUID(), sessionId, 'system', content, now, project, metadata);
|
|
245
|
+
|
|
246
|
+
// ── Auto-extract memories from detected patterns ──────────
|
|
247
|
+
const signal = detectMemorySignal(toolInput);
|
|
248
|
+
if (signal) {
|
|
249
|
+
// Extract the key content — use first 500 chars of the input as the memory
|
|
250
|
+
const memContent = toolInput.slice(0, 500).trim();
|
|
251
|
+
const contentHash = createHash('sha256').update(memContent).digest('hex');
|
|
252
|
+
|
|
253
|
+
// Check for duplicates by content hash
|
|
254
|
+
const existing = db.prepare('SELECT id FROM memories WHERE content_hash = ?').get(contentHash);
|
|
255
|
+
if (!existing) {
|
|
256
|
+
const memId = randomUUID();
|
|
257
|
+
db.prepare(
|
|
258
|
+
'INSERT INTO memories (id, content, content_hash, type, tags, confidence, access_count, created_at, last_accessed, source, scope, valid_from, tier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
|
259
|
+
).run(memId, memContent, contentHash, signal.type, '["auto-captured"]', signal.confidence, 0, now, now, 'hook:PostToolUse', project, now, 'archival');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
db.close();
|
|
264
|
+
} catch {
|
|
265
|
+
process.exit(0);
|
|
266
|
+
}
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
function getSessionStartScript(dbPath) {
|
|
270
|
+
const escaped = dbPath.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
271
|
+
return `#!/usr/bin/env node
|
|
272
|
+
// amem SessionStart hook — auto-injects core memories at session start
|
|
273
|
+
// Auto-generated by amem. Do not edit manually.
|
|
274
|
+
|
|
275
|
+
import { createRequire } from 'node:module';
|
|
276
|
+
|
|
277
|
+
try {
|
|
278
|
+
const require = createRequire(import.meta.url);
|
|
279
|
+
const Database = require('better-sqlite3');
|
|
280
|
+
const db = new Database('${escaped}');
|
|
281
|
+
db.pragma('journal_mode = WAL');
|
|
282
|
+
db.pragma('busy_timeout = 2000');
|
|
283
|
+
|
|
284
|
+
const now = Date.now();
|
|
285
|
+
|
|
286
|
+
// Load core tier memories (always-on context)
|
|
287
|
+
const coreMemories = db.prepare(
|
|
288
|
+
"SELECT content, type, confidence FROM memories WHERE tier = 'core' AND (valid_until IS NULL OR valid_until > ?) ORDER BY CASE type WHEN 'correction' THEN 0 WHEN 'decision' THEN 1 ELSE 2 END, confidence DESC"
|
|
289
|
+
).all(now);
|
|
290
|
+
|
|
291
|
+
// Load recent corrections (even if not in core tier)
|
|
292
|
+
const corrections = db.prepare(
|
|
293
|
+
"SELECT content, confidence FROM memories WHERE type = 'correction' AND tier != 'core' AND (valid_until IS NULL OR valid_until > ?) ORDER BY confidence DESC LIMIT 10"
|
|
294
|
+
).all(now);
|
|
295
|
+
|
|
296
|
+
// Load overdue reminders
|
|
297
|
+
const reminders = db.prepare(
|
|
298
|
+
"SELECT content, due_at FROM reminders WHERE completed = 0 AND due_at IS NOT NULL AND due_at <= ? ORDER BY due_at ASC LIMIT 5"
|
|
299
|
+
).all(now);
|
|
300
|
+
|
|
301
|
+
// Build injection context
|
|
302
|
+
const lines = [];
|
|
303
|
+
|
|
304
|
+
if (coreMemories.length > 0) {
|
|
305
|
+
lines.push('## Core Context (always active)');
|
|
306
|
+
for (const m of coreMemories) {
|
|
307
|
+
const prefix = m.type === 'correction' ? 'CONSTRAINT' : m.type.toUpperCase();
|
|
308
|
+
lines.push('- [' + prefix + '] ' + m.content);
|
|
309
|
+
}
|
|
310
|
+
lines.push('');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (corrections.length > 0) {
|
|
314
|
+
lines.push('## Active Corrections');
|
|
315
|
+
for (const c of corrections) {
|
|
316
|
+
lines.push('- ' + c.content);
|
|
317
|
+
}
|
|
318
|
+
lines.push('');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (reminders.length > 0) {
|
|
322
|
+
lines.push('## Overdue Reminders');
|
|
323
|
+
for (const r of reminders) {
|
|
324
|
+
const due = new Date(r.due_at).toISOString().slice(0, 10);
|
|
325
|
+
lines.push('- [DUE ' + due + '] ' + r.content);
|
|
326
|
+
}
|
|
327
|
+
lines.push('');
|
|
328
|
+
}
|
|
189
329
|
|
|
190
330
|
db.close();
|
|
331
|
+
|
|
332
|
+
if (lines.length > 0) {
|
|
333
|
+
// Output to stdout — Claude Code captures this as context
|
|
334
|
+
console.log('[amem] Session context loaded:');
|
|
335
|
+
console.log(lines.join('\\n'));
|
|
336
|
+
}
|
|
191
337
|
} catch {
|
|
338
|
+
// Silent failure — don't block session start
|
|
192
339
|
process.exit(0);
|
|
193
340
|
}
|
|
194
341
|
`;
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -64,6 +64,44 @@ function detectProject() {
|
|
|
64
64
|
const db = createDatabase(DB_PATH);
|
|
65
65
|
ensureSecurePermissions(DB_PATH);
|
|
66
66
|
const currentProject = detectProject();
|
|
67
|
+
// Pre-warm embeddings in the background so first query is fast
|
|
68
|
+
import { preloadEmbeddings, generateEmbedding } from "./embeddings.js";
|
|
69
|
+
preloadEmbeddings();
|
|
70
|
+
// Background task: generate embeddings for memories that don't have them yet
|
|
71
|
+
async function backfillEmbeddings() {
|
|
72
|
+
try {
|
|
73
|
+
const all = db.getAll();
|
|
74
|
+
const missing = all.filter(m => !m.embedding);
|
|
75
|
+
if (missing.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
let filled = 0;
|
|
78
|
+
for (const mem of missing.slice(0, 50)) { // Process up to 50 per startup
|
|
79
|
+
const emb = await generateEmbedding(mem.content);
|
|
80
|
+
if (emb) {
|
|
81
|
+
db.updateEmbedding(mem.id, emb);
|
|
82
|
+
filled++;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
break; // Embeddings not available
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (filled > 0) {
|
|
89
|
+
console.error(`[amem] Backfilled embeddings for ${filled} memories`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch { }
|
|
93
|
+
}
|
|
94
|
+
// Run after a short delay to not block startup
|
|
95
|
+
setTimeout(() => { backfillEmbeddings().catch(() => { }); }, 3000);
|
|
96
|
+
// Build ANN index after embeddings are loaded
|
|
97
|
+
import { buildANNIndex } from "./memory.js";
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
try {
|
|
100
|
+
const index = buildANNIndex(db);
|
|
101
|
+
console.error(`[amem] ANN index built: ${index.size()} vectors`);
|
|
102
|
+
}
|
|
103
|
+
catch { }
|
|
104
|
+
}, 5000);
|
|
67
105
|
const server = new McpServer({
|
|
68
106
|
name: "amem-mcp-server",
|
|
69
107
|
version: pkg.version,
|
|
@@ -352,6 +390,38 @@ server.registerResource("graph-overview", "amem://graph", { mimeType: "text/plai
|
|
|
352
390
|
return { contents: [{ uri: "amem://graph", mimeType: "text/plain", text: "Error loading graph." }] };
|
|
353
391
|
}
|
|
354
392
|
});
|
|
393
|
+
server.registerResource("last-session", "amem://last-session", { mimeType: "text/plain", description: "Previous session summary — what happened, key decisions, and corrections. Load this to continue where you left off." }, () => {
|
|
394
|
+
try {
|
|
395
|
+
const summaries = db.getRecentSummaries(currentProject, 1);
|
|
396
|
+
if (summaries.length === 0) {
|
|
397
|
+
return { contents: [{ uri: "amem://last-session", mimeType: "text/plain", text: "No previous session found." }] };
|
|
398
|
+
}
|
|
399
|
+
const s = summaries[0];
|
|
400
|
+
const lines = [
|
|
401
|
+
`# Last Session (${new Date(s.createdAt).toISOString().slice(0, 16)})`,
|
|
402
|
+
"",
|
|
403
|
+
s.summary,
|
|
404
|
+
];
|
|
405
|
+
if (s.keyDecisions.length > 0) {
|
|
406
|
+
lines.push("", "## Decisions");
|
|
407
|
+
for (const d of s.keyDecisions)
|
|
408
|
+
lines.push(`- ${d}`);
|
|
409
|
+
}
|
|
410
|
+
if (s.keyCorrections.length > 0) {
|
|
411
|
+
lines.push("", "## Corrections");
|
|
412
|
+
for (const c of s.keyCorrections)
|
|
413
|
+
lines.push(`- ${c}`);
|
|
414
|
+
}
|
|
415
|
+
lines.push("", `Memories extracted: ${s.memoriesExtracted}`);
|
|
416
|
+
return {
|
|
417
|
+
contents: [{ uri: "amem://last-session", mimeType: "text/plain", text: lines.join("\n") }],
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
console.error("[amem] Resource 'last-session' failed:", error instanceof Error ? error.message : String(error));
|
|
422
|
+
return { contents: [{ uri: "amem://last-session", mimeType: "text/plain", text: "Error loading last session." }] };
|
|
423
|
+
}
|
|
424
|
+
});
|
|
355
425
|
process.on("SIGINT", () => {
|
|
356
426
|
db.close();
|
|
357
427
|
process.exit(0);
|