@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/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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"}
@@ -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 {
@@ -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 mod = await import("@huggingface/transformers");
55
- pipelineInstance = await mod.pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
56
- return pipelineInstance;
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
- console.error("[amem] Failed to load embedding pipeline — falling back to keyword matching:", error instanceof Error ? error.message : String(error));
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);
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
package/dist/hooks.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export interface HookConfig {
2
2
  captureToolUse: boolean;
3
3
  captureSessionEnd: boolean;
4
+ captureSessionStart: boolean;
4
5
  }
5
6
  /**
6
7
  * Generate Claude Code hook configuration for automatic memory capture.
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 - captures tool observations for persistent memory
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
- // Skip noisy/low-value tools
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
- if (!toolName || !toolInput || toolInput.length < 10) {
168
- process.exit(0);
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
- const content = 'Tool: ' + toolName + '\\nInput: ' + toolInput.slice(0, 500);
184
- const metadata = JSON.stringify({ hook: 'PostToolUse', tool: toolName });
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(id, sessionId, 'system', content, now, project, metadata);
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;AAOzB,uFAAuF;AACvF,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAmD,CAAC;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,qBAAqB;IACrB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,KAAK,CAAC,WAAW,GAAG,CAAC;gBACnB,OAAO,EAAE,EAAE,EAAG,kDAAkD;gBAChE,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,qBAAqB,EAAE;wBAChC,OAAO,EAAE,KAAK;qBACf,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,GAAG,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,cAAc,EAAE;wBACzB,OAAO,EAAE,KAAK;qBACf,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAC1D,OAAO,SAAS,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACxD,OAAO,SAAS,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE3D,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,GAAG;gBAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA8B,CAAC;IAE1E,oEAAoE;IACpE,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAmC,CAAC;QAChF,6FAA6F;QAC7F,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEzE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACzE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;gBAC5D,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAmD,CAAC;gBACvF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7D,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,CAAC;gBACD,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;gBACvB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,0DAA0D;AAE1D,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA4BoB,OAAO;;;;;;;;;;;;;;;;;;;;CAoBnC,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;6BAUoB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEnC,CAAC;AACF,CAAC"}
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;AAQzB,uFAAuF;AACvF,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAmD,CAAC;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,qBAAqB;IACrB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3G,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,KAAK,CAAC,WAAW,GAAG,CAAC;gBACnB,OAAO,EAAE,EAAE,EAAG,kDAAkD;gBAChE,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,qBAAqB,EAAE;wBAChC,OAAO,EAAE,KAAK;qBACf,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,GAAG,CAAC;gBACZ,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,cAAc,EAAE;wBACzB,OAAO,EAAE,KAAK;qBACf,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC/B,KAAK,CAAC,YAAY,GAAG,CAAC;gBACpB,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,sBAAsB,EAAE;wBACjC,OAAO,EAAE,KAAK;qBACf,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAC1D,OAAO,SAAS,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACxD,OAAO,SAAS,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAC1D,OAAO,SAAS,UAAU,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE3D,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,GAAG;gBAAE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA8B,CAAC;IAE1E,oEAAoE;IACpE,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAmC,CAAC;QAChF,6FAA6F;QAC7F,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEzE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACjF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACzE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;gBAC5D,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAmD,CAAC;gBACvF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7D,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrD,CAAC;gBACD,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;gBACvB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,0DAA0D;AAE1D,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA6DoB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCnC,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO;;;;;;;;;6BASoB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DnC,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;6BAUoB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEnC,CAAC;AACF,CAAC"}
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);