synabun 2026.3.307 → 2026.3.310
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/CLAUDE.md +150 -0
- package/hooks/claude-code/post-plan.mjs +1 -1
- package/hooks/claude-code/session-start.mjs +2 -0
- package/mcp-server/dist/config.d.ts +13 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +59 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +13 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +86 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +10 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +189 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +26 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +30 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +356 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +14 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +34 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +23 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +71 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +92 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +238 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +85 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +660 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +54 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +97 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +138 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +216 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +52 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +61 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +298 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +1154 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +7 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +55 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +14 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +31 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +9 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +12 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +77 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +223 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +19 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +302 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +26 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +96 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +41 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +275 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +44 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +118 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +38 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +88 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +18 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +93 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +9 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +10 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +30 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +194 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +198 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +14 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +807 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/neural-interface/public/shared/styles.css +2 -2
- package/neural-interface/public/shared/ui-settings.js +2 -2
- package/neural-interface/server.js +82 -8
- package/neural-interface/templates/CLAUDE-template.md +9 -1
- package/package.json +4 -2
- package/preuninstall.js +28 -0
- package/setup.js +86 -1
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { generateEmbedding } from '../services/local-embeddings.js';
|
|
5
|
+
import { searchMemories, searchMemoriesFTS, updatePayload, searchSessionChunks } from '../services/sqlite.js';
|
|
6
|
+
import { validateCategory } from '../services/categories.js';
|
|
7
|
+
import { coerceStringArray } from './utils.js';
|
|
8
|
+
import { config, detectProject } from '../config.js';
|
|
9
|
+
import { text } from './response.js';
|
|
10
|
+
export function buildRecallSchema() {
|
|
11
|
+
return {
|
|
12
|
+
query: z.string().describe('What to search for, in natural language.'),
|
|
13
|
+
category: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Optional: filter by category name.'),
|
|
17
|
+
project: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Optional: filter by project. If omitted, searches all projects but boosts current project.'),
|
|
21
|
+
tags: coerceStringArray()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Optional: filter by tags (any match).'),
|
|
24
|
+
limit: z
|
|
25
|
+
.coerce.number()
|
|
26
|
+
.min(1)
|
|
27
|
+
.max(20)
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('Number of results (default 5).'),
|
|
30
|
+
min_importance: z
|
|
31
|
+
.coerce.number()
|
|
32
|
+
.min(1)
|
|
33
|
+
.max(10)
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Minimum importance threshold.'),
|
|
36
|
+
min_score: z
|
|
37
|
+
.coerce.number()
|
|
38
|
+
.min(0)
|
|
39
|
+
.max(1)
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Minimum similarity score 0-1 (default 0.3).'),
|
|
42
|
+
include_sessions: z
|
|
43
|
+
.boolean()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('Override session chunk search. Auto-triggers on temporal queries or sparse results. Set true to force, false to disable.'),
|
|
46
|
+
recency_boost: z
|
|
47
|
+
.boolean()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Prioritize recent memories. Shifts scoring to favor recency over semantic similarity (14-day half-life, 55% recency weight). Ideal for session-start boot queries.'),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export const recallSchema = buildRecallSchema();
|
|
53
|
+
export const recallDescription = 'Search your persistent memory for relevant information. Use this at the start of any task to check what you already know, or when you need context about past decisions, known issues, or architectural patterns.';
|
|
54
|
+
function applyTimeDecay(rawScore, createdAt, importance, accessCount, recencyBoost = false) {
|
|
55
|
+
const ageInDays = (Date.now() - new Date(createdAt).getTime()) / (1000 * 60 * 60 * 24);
|
|
56
|
+
const accessBoost = Math.min(0.1, accessCount * 0.01);
|
|
57
|
+
if (recencyBoost) {
|
|
58
|
+
// Recency-first scoring: 14-day half-life, recency dominates
|
|
59
|
+
const recencyMultiplier = Math.pow(0.5, ageInDays / 14);
|
|
60
|
+
return rawScore * 0.35 + recencyMultiplier * 0.55 + accessBoost;
|
|
61
|
+
}
|
|
62
|
+
// Default scoring: semantic similarity dominates, 90-day half-life
|
|
63
|
+
if (importance >= 8)
|
|
64
|
+
return rawScore;
|
|
65
|
+
const recencyMultiplier = Math.pow(0.5, ageInDays / 90);
|
|
66
|
+
return rawScore * 0.7 + recencyMultiplier * 0.2 + accessBoost;
|
|
67
|
+
}
|
|
68
|
+
function formatAge(isoDate) {
|
|
69
|
+
const diffMs = Date.now() - new Date(isoDate).getTime();
|
|
70
|
+
const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
71
|
+
if (days === 0)
|
|
72
|
+
return 'today';
|
|
73
|
+
if (days === 1)
|
|
74
|
+
return '1 day ago';
|
|
75
|
+
if (days < 30)
|
|
76
|
+
return `${days} days ago`;
|
|
77
|
+
const months = Math.floor(days / 30);
|
|
78
|
+
if (months === 1)
|
|
79
|
+
return '1 month ago';
|
|
80
|
+
return `${months} months ago`;
|
|
81
|
+
}
|
|
82
|
+
const RECALL_DEFAULTS = {
|
|
83
|
+
limit: 5,
|
|
84
|
+
minImportance: 0,
|
|
85
|
+
minScore: 0.3,
|
|
86
|
+
maxChars: 0,
|
|
87
|
+
includeSessions: 'auto',
|
|
88
|
+
recencyBoost: false,
|
|
89
|
+
};
|
|
90
|
+
function getRecallDefaults() {
|
|
91
|
+
try {
|
|
92
|
+
const settingsPath = path.resolve(config.dataDir, 'display-settings.json');
|
|
93
|
+
const data = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
94
|
+
const d = data.recallDefaults;
|
|
95
|
+
if (!d) {
|
|
96
|
+
// Legacy: only recallMaxChars exists
|
|
97
|
+
return { ...RECALL_DEFAULTS, maxChars: data.recallMaxChars ?? 0 };
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
limit: d.limit ?? RECALL_DEFAULTS.limit,
|
|
101
|
+
minImportance: d.minImportance ?? RECALL_DEFAULTS.minImportance,
|
|
102
|
+
minScore: d.minScore ?? RECALL_DEFAULTS.minScore,
|
|
103
|
+
maxChars: d.maxChars ?? RECALL_DEFAULTS.maxChars,
|
|
104
|
+
includeSessions: d.includeSessions ?? RECALL_DEFAULTS.includeSessions,
|
|
105
|
+
recencyBoost: d.recencyBoost ?? RECALL_DEFAULTS.recencyBoost,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return { ...RECALL_DEFAULTS };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export async function handleRecall(args) {
|
|
113
|
+
const defaults = getRecallDefaults();
|
|
114
|
+
const query = args.query;
|
|
115
|
+
const category = args.category;
|
|
116
|
+
const project = args.project;
|
|
117
|
+
const tags = args.tags;
|
|
118
|
+
const limit = args.limit ?? defaults.limit;
|
|
119
|
+
const minImportance = args.min_importance ?? (defaults.minImportance > 0 ? defaults.minImportance : undefined);
|
|
120
|
+
const minScore = args.min_score ?? defaults.minScore;
|
|
121
|
+
const includeSessionsExplicit = args.include_sessions ??
|
|
122
|
+
(defaults.includeSessions === 'always' ? true : defaults.includeSessions === 'never' ? false : undefined);
|
|
123
|
+
const recencyBoost = args.recency_boost ?? defaults.recencyBoost;
|
|
124
|
+
if (category) {
|
|
125
|
+
const catCheck = validateCategory(category);
|
|
126
|
+
if (!catCheck.valid) {
|
|
127
|
+
return text(catCheck.error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const vector = await generateEmbedding(query);
|
|
131
|
+
const must = [];
|
|
132
|
+
if (category)
|
|
133
|
+
must.push({ key: 'category', match: { value: category } });
|
|
134
|
+
if (project)
|
|
135
|
+
must.push({ key: 'project', match: { value: project } });
|
|
136
|
+
if (tags && tags.length > 0) {
|
|
137
|
+
for (const tag of tags) {
|
|
138
|
+
must.push({ key: 'tags', match: { value: tag } });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (minImportance) {
|
|
142
|
+
must.push({ key: 'importance', range: { gte: minImportance } });
|
|
143
|
+
}
|
|
144
|
+
const filter = must.length > 0 ? { must } : undefined;
|
|
145
|
+
// Use a lower raw threshold for the DB query — time decay, importance,
|
|
146
|
+
// and project boosts can lift borderline results well above minScore.
|
|
147
|
+
// The actual minScore filter is applied after adjustments below.
|
|
148
|
+
const rawThreshold = Math.min(minScore, minScore * 0.5);
|
|
149
|
+
const results = await searchMemories(vector, limit * 2, filter, rawThreshold);
|
|
150
|
+
const currentProject = detectProject();
|
|
151
|
+
const scored = results
|
|
152
|
+
.map((r) => {
|
|
153
|
+
const payload = r.payload;
|
|
154
|
+
let adjustedScore = applyTimeDecay(r.score, payload.created_at, payload.importance, payload.access_count, recencyBoost);
|
|
155
|
+
if (!project && payload.project === currentProject) {
|
|
156
|
+
adjustedScore *= 1.2;
|
|
157
|
+
}
|
|
158
|
+
return { id: r.id, score: adjustedScore, payload };
|
|
159
|
+
})
|
|
160
|
+
.filter((r) => r.score >= minScore)
|
|
161
|
+
.sort((a, b) => b.score - a.score)
|
|
162
|
+
.slice(0, limit);
|
|
163
|
+
// FTS5 keyword fallback — when vector results are weak, supplement with
|
|
164
|
+
// full-text search to catch exact identifiers, error codes, proper nouns
|
|
165
|
+
const FTS_TRIGGER_SCORE = 0.45;
|
|
166
|
+
const vectorWeak = scored.length === 0 ||
|
|
167
|
+
(scored.length < limit && scored[0]?.score < FTS_TRIGGER_SCORE);
|
|
168
|
+
if (vectorWeak) {
|
|
169
|
+
try {
|
|
170
|
+
const existingIds = new Set(scored.map(r => r.id));
|
|
171
|
+
const ftsResults = await searchMemoriesFTS(query, limit, filter, existingIds);
|
|
172
|
+
for (const fts of ftsResults) {
|
|
173
|
+
if (scored.length >= limit)
|
|
174
|
+
break;
|
|
175
|
+
scored.push(fts);
|
|
176
|
+
}
|
|
177
|
+
// Re-sort after merge
|
|
178
|
+
scored.sort((a, b) => b.score - a.score);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// FTS fallback failure is non-fatal
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Update access tracking (fire-and-forget)
|
|
185
|
+
const now = new Date().toISOString();
|
|
186
|
+
for (const result of scored) {
|
|
187
|
+
updatePayload(result.id, {
|
|
188
|
+
accessed_at: now,
|
|
189
|
+
access_count: result.payload.access_count + 1,
|
|
190
|
+
}).catch(() => { });
|
|
191
|
+
}
|
|
192
|
+
if (scored.length === 0) {
|
|
193
|
+
return text(`No memories found for "${query}"${category ? ` in category ${category}` : ''}${project ? ` for project ${project}` : ''}.`);
|
|
194
|
+
}
|
|
195
|
+
const maxChars = defaults.maxChars;
|
|
196
|
+
const lines = scored.map((r, i) => {
|
|
197
|
+
const p = r.payload;
|
|
198
|
+
const score = (r.score * 100).toFixed(0);
|
|
199
|
+
const tagStr = p.tags?.length ? ` [${p.tags.join(', ')}]` : '';
|
|
200
|
+
const sub = p.subcategory ? `/${p.subcategory}` : '';
|
|
201
|
+
const files = p.related_files?.length
|
|
202
|
+
? `\n Files: ${p.related_files.join(', ')}`
|
|
203
|
+
: '';
|
|
204
|
+
const displayContent = (maxChars > 0 && p.content.length > maxChars)
|
|
205
|
+
? p.content.substring(0, maxChars) + '...'
|
|
206
|
+
: p.content;
|
|
207
|
+
return `${i + 1}. [${r.id}] (${score}% match, importance: ${p.importance}, ${formatAge(p.created_at)})\n ${p.category}${sub} | ${p.project}${tagStr}\n ${displayContent}${files}`;
|
|
208
|
+
});
|
|
209
|
+
// Session chunk search — auto-trigger when useful, or explicit override
|
|
210
|
+
const shouldIncludeSessions = (() => {
|
|
211
|
+
// Explicit override takes priority
|
|
212
|
+
if (includeSessionsExplicit !== undefined)
|
|
213
|
+
return includeSessionsExplicit;
|
|
214
|
+
// Temporal/process keywords → likely asking about past sessions
|
|
215
|
+
const q = query.toLowerCase();
|
|
216
|
+
const sessionKeywords = [
|
|
217
|
+
'yesterday', 'last session', 'last time', 'remember when',
|
|
218
|
+
'how did we', 'what did we', 'earlier today', 'previous session',
|
|
219
|
+
'conversation about', 'we discussed', 'we worked on', 'we talked about',
|
|
220
|
+
'that session', 'that conversation', 'the other day', 'last week',
|
|
221
|
+
'before', 'recently', 'a while ago', 'few days ago',
|
|
222
|
+
];
|
|
223
|
+
if (sessionKeywords.some(kw => q.includes(kw)))
|
|
224
|
+
return true;
|
|
225
|
+
// Sparse/weak memory results → widen the net
|
|
226
|
+
if (scored.length < 3)
|
|
227
|
+
return true;
|
|
228
|
+
if (scored.length > 0 && scored[0].score < 0.45)
|
|
229
|
+
return true;
|
|
230
|
+
return false;
|
|
231
|
+
})();
|
|
232
|
+
let sessionLines = [];
|
|
233
|
+
if (shouldIncludeSessions) {
|
|
234
|
+
try {
|
|
235
|
+
const sessionFilter = {};
|
|
236
|
+
if (project) {
|
|
237
|
+
sessionFilter.must = [{ key: 'project', match: { value: project } }];
|
|
238
|
+
}
|
|
239
|
+
const sessionLimit = Math.max(3, Math.floor(limit / 2));
|
|
240
|
+
const sessionResults = await searchSessionChunks(vector, sessionLimit * 2, Object.keys(sessionFilter).length > 0 ? sessionFilter : undefined, rawThreshold);
|
|
241
|
+
// Deduplicate: skip chunks whose dedup_memory_id matches a returned memory
|
|
242
|
+
const memoryIds = new Set(scored.map((r) => r.id));
|
|
243
|
+
const filteredSessions = sessionResults.filter((r) => {
|
|
244
|
+
const payload = r.payload;
|
|
245
|
+
return !payload.dedup_memory_id || !memoryIds.has(payload.dedup_memory_id);
|
|
246
|
+
}).slice(0, sessionLimit);
|
|
247
|
+
sessionLines = filteredSessions.map((r, i) => {
|
|
248
|
+
const p = r.payload;
|
|
249
|
+
const score = (r.score * 100).toFixed(0);
|
|
250
|
+
const timeRange = p.start_timestamp && p.end_timestamp
|
|
251
|
+
? `${new Date(p.start_timestamp).toISOString().slice(0, 16)} - ${new Date(p.end_timestamp).toISOString().slice(11, 16)}`
|
|
252
|
+
: 'unknown time';
|
|
253
|
+
const toolStr = p.tools_used?.length ? `Tools: ${p.tools_used.join(', ')}` : '';
|
|
254
|
+
const fileStr = p.files_modified?.length ? `Files: ${p.files_modified.join(', ')}` : '';
|
|
255
|
+
const linkedMems = p.related_memory_ids?.length ? `Linked memories: ${p.related_memory_ids.join(', ')}` : '';
|
|
256
|
+
const details = [toolStr, fileStr, linkedMems].filter(Boolean).join(' | ');
|
|
257
|
+
return `SESSION: [${r.id}] (${score}% match, ${timeRange}, branch: ${p.git_branch || 'unknown'})\n Session: ${p.session_id} | Chunk ${p.chunk_index + 1} | ${p.project}\n ${p.summary}\n ${details}`;
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// Session search failure is non-fatal
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const allLines = [...lines];
|
|
265
|
+
if (sessionLines.length > 0) {
|
|
266
|
+
allLines.push('', '--- Session Context ---');
|
|
267
|
+
allLines.push(...sessionLines);
|
|
268
|
+
}
|
|
269
|
+
const totalCount = scored.length + sessionLines.length;
|
|
270
|
+
const label = sessionLines.length > 0
|
|
271
|
+
? `Found ${scored.length} memories and ${sessionLines.length} session chunks`
|
|
272
|
+
: `Found ${scored.length} memories`;
|
|
273
|
+
return text(`${label} for "${query}":\n\n${allLines.join('\n\n')}`);
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function buildReflectSchema(): {
|
|
3
|
+
memory_id: z.ZodString;
|
|
4
|
+
content: z.ZodOptional<z.ZodString>;
|
|
5
|
+
importance: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
7
|
+
add_tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
8
|
+
subcategory: z.ZodOptional<z.ZodString>;
|
|
9
|
+
category: z.ZodOptional<z.ZodString>;
|
|
10
|
+
related_files: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
11
|
+
related_memory_ids: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
12
|
+
project: z.ZodOptional<z.ZodString>;
|
|
13
|
+
};
|
|
14
|
+
export declare const reflectSchema: {
|
|
15
|
+
memory_id: z.ZodString;
|
|
16
|
+
content: z.ZodOptional<z.ZodString>;
|
|
17
|
+
importance: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
19
|
+
add_tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
20
|
+
subcategory: z.ZodOptional<z.ZodString>;
|
|
21
|
+
category: z.ZodOptional<z.ZodString>;
|
|
22
|
+
related_files: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
23
|
+
related_memory_ids: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
24
|
+
project: z.ZodOptional<z.ZodString>;
|
|
25
|
+
};
|
|
26
|
+
export declare const reflectDescription = "Update or annotate an existing memory. Use this when you discover additional context, when a decision changes, or when you want to adjust importance based on new information.";
|
|
27
|
+
export declare function handleReflect(args: {
|
|
28
|
+
memory_id: string;
|
|
29
|
+
content?: string;
|
|
30
|
+
importance?: number;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
add_tags?: string[];
|
|
33
|
+
subcategory?: string;
|
|
34
|
+
category?: string;
|
|
35
|
+
related_files?: string[];
|
|
36
|
+
related_memory_ids?: string[];
|
|
37
|
+
project?: string;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
content: {
|
|
40
|
+
type: "text";
|
|
41
|
+
text: string;
|
|
42
|
+
}[];
|
|
43
|
+
}>;
|
|
44
|
+
//# sourceMappingURL=reflect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,wBAAgB,kBAAkB;;;;;;;;;;;EA6BjC;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;CAAuB,CAAC;AAElD,eAAO,MAAM,kBAAkB,mLACmJ,CAAC;AAEnL,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;GAuFA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getMemory, updatePayload, updateVector } from '../services/sqlite.js';
|
|
3
|
+
import { generateEmbedding } from '../services/local-embeddings.js';
|
|
4
|
+
import { validateCategory } from '../services/categories.js';
|
|
5
|
+
import { coerceStringArray } from './utils.js';
|
|
6
|
+
import { invalidateCache } from '../services/neural-interface.js';
|
|
7
|
+
import { computeChecksums } from '../services/file-checksums.js';
|
|
8
|
+
import { text } from './response.js';
|
|
9
|
+
export function buildReflectSchema() {
|
|
10
|
+
return {
|
|
11
|
+
memory_id: z.string().describe('The ID of the memory to update. MUST be the full UUID format (e.g., 8f7cab3b-644e-4cea-8662-de0ca695bdf2), not a shortened version. Use recall to get the full UUID.'),
|
|
12
|
+
content: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Updated content. If provided, the embedding vector is regenerated.'),
|
|
16
|
+
importance: z.coerce.number().min(1).max(10).optional().describe('Updated importance score.'),
|
|
17
|
+
tags: coerceStringArray()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Replace all tags with these.'),
|
|
20
|
+
add_tags: coerceStringArray()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Add tags without replacing existing ones.'),
|
|
23
|
+
subcategory: z.string().optional().describe('Updated subcategory.'),
|
|
24
|
+
category: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Change the category name.'),
|
|
28
|
+
related_files: coerceStringArray()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Updated related file paths.'),
|
|
31
|
+
related_memory_ids: coerceStringArray()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe('Link to related memories.'),
|
|
34
|
+
project: z.string().optional().describe('Change the project this memory belongs to (e.g. "criticalpixel", "synabun", "synabun-website").'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export const reflectSchema = buildReflectSchema();
|
|
38
|
+
export const reflectDescription = 'Update or annotate an existing memory. Use this when you discover additional context, when a decision changes, or when you want to adjust importance based on new information.';
|
|
39
|
+
export async function handleReflect(args) {
|
|
40
|
+
const memoryId = args.memory_id;
|
|
41
|
+
// Validate UUID format
|
|
42
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
43
|
+
if (!uuidRegex.test(memoryId)) {
|
|
44
|
+
return text(`Invalid memory_id format. Expected full UUID (e.g., 8f7cab3b-644e-4cea-8662-de0ca695bdf2), got: ${memoryId}\n\nUse the full UUID returned by 'remember', or call 'recall' to find the full UUID of an existing memory.`);
|
|
45
|
+
}
|
|
46
|
+
if (args.category) {
|
|
47
|
+
const catCheck = validateCategory(args.category);
|
|
48
|
+
if (!catCheck.valid) {
|
|
49
|
+
return text(catCheck.error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const existing = await getMemory(memoryId);
|
|
53
|
+
if (!existing) {
|
|
54
|
+
return text(`Memory "${memoryId}" not found.`);
|
|
55
|
+
}
|
|
56
|
+
const payload = existing.payload;
|
|
57
|
+
const now = new Date().toISOString();
|
|
58
|
+
const updates = { updated_at: now };
|
|
59
|
+
const changes = [];
|
|
60
|
+
if (args.content) {
|
|
61
|
+
updates.content = args.content;
|
|
62
|
+
changes.push('content');
|
|
63
|
+
}
|
|
64
|
+
if (args.importance !== undefined) {
|
|
65
|
+
updates.importance = args.importance;
|
|
66
|
+
changes.push(`importance -> ${args.importance}`);
|
|
67
|
+
}
|
|
68
|
+
if (args.category) {
|
|
69
|
+
updates.category = args.category;
|
|
70
|
+
changes.push(`category -> ${args.category}`);
|
|
71
|
+
}
|
|
72
|
+
if (args.subcategory) {
|
|
73
|
+
updates.subcategory = args.subcategory;
|
|
74
|
+
changes.push(`subcategory -> ${args.subcategory}`);
|
|
75
|
+
}
|
|
76
|
+
if (args.tags) {
|
|
77
|
+
updates.tags = args.tags;
|
|
78
|
+
changes.push(`tags replaced`);
|
|
79
|
+
}
|
|
80
|
+
if (args.add_tags) {
|
|
81
|
+
const existingTags = payload.tags || [];
|
|
82
|
+
updates.tags = [...new Set([...existingTags, ...args.add_tags])];
|
|
83
|
+
changes.push(`tags added: ${args.add_tags.join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
if (args.related_files) {
|
|
86
|
+
updates.related_files = args.related_files;
|
|
87
|
+
changes.push('related_files updated');
|
|
88
|
+
}
|
|
89
|
+
if (args.related_memory_ids) {
|
|
90
|
+
updates.related_memory_ids = args.related_memory_ids;
|
|
91
|
+
changes.push('related_memory_ids updated');
|
|
92
|
+
}
|
|
93
|
+
if (args.project) {
|
|
94
|
+
updates.project = args.project;
|
|
95
|
+
changes.push(`project -> ${args.project}`);
|
|
96
|
+
}
|
|
97
|
+
if (changes.length === 0) {
|
|
98
|
+
return text('No changes specified.');
|
|
99
|
+
}
|
|
100
|
+
// Recompute file checksums whenever the memory is updated
|
|
101
|
+
const finalFiles = (updates.related_files ?? payload.related_files);
|
|
102
|
+
if (finalFiles?.length) {
|
|
103
|
+
const cs = computeChecksums(finalFiles);
|
|
104
|
+
updates.file_checksums = Object.keys(cs).length > 0 ? cs : undefined;
|
|
105
|
+
}
|
|
106
|
+
if (args.content) {
|
|
107
|
+
const mergedPayload = { ...payload, ...updates };
|
|
108
|
+
const vector = await generateEmbedding(mergedPayload.content);
|
|
109
|
+
await updateVector(memoryId, vector, mergedPayload);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
await updatePayload(memoryId, updates);
|
|
113
|
+
}
|
|
114
|
+
// Invalidate Neural Interface link cache (fire-and-forget)
|
|
115
|
+
invalidateCache('reflect');
|
|
116
|
+
return text(`Updated [${memoryId.slice(0, 8)}]: ${changes.join(', ')}`);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=reflect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare function buildRememberSchema(): {
|
|
3
|
+
content: z.ZodString;
|
|
4
|
+
category: z.ZodString;
|
|
5
|
+
project: z.ZodOptional<z.ZodString>;
|
|
6
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
7
|
+
importance: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
subcategory: z.ZodOptional<z.ZodString>;
|
|
9
|
+
source: z.ZodOptional<z.ZodEnum<["user-told", "self-discovered", "auto-saved"]>>;
|
|
10
|
+
related_files: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
11
|
+
};
|
|
12
|
+
export declare const rememberSchema: {
|
|
13
|
+
content: z.ZodString;
|
|
14
|
+
category: z.ZodString;
|
|
15
|
+
project: z.ZodOptional<z.ZodString>;
|
|
16
|
+
tags: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
17
|
+
importance: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
subcategory: z.ZodOptional<z.ZodString>;
|
|
19
|
+
source: z.ZodOptional<z.ZodEnum<["user-told", "self-discovered", "auto-saved"]>>;
|
|
20
|
+
related_files: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], unknown>>;
|
|
21
|
+
};
|
|
22
|
+
export declare const rememberDescription = "Store a piece of information in persistent memory. Use this when you learn something important, make a decision, discover a pattern, fix a hard bug, or want to preserve context for future sessions.";
|
|
23
|
+
export declare function handleRemember(args: {
|
|
24
|
+
content: string;
|
|
25
|
+
category: string;
|
|
26
|
+
project?: string;
|
|
27
|
+
tags?: string[];
|
|
28
|
+
importance?: number;
|
|
29
|
+
subcategory?: string;
|
|
30
|
+
source?: string;
|
|
31
|
+
related_files?: string[];
|
|
32
|
+
}): Promise<{
|
|
33
|
+
content: {
|
|
34
|
+
type: "text";
|
|
35
|
+
text: string;
|
|
36
|
+
}[];
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=remember.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember.d.ts","sourceRoot":"","sources":["../../src/tools/remember.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,wBAAgB,mBAAmB;;;;;;;;;EAyClC;AAED,eAAO,MAAM,cAAc;;;;;;;;;CAAwB,CAAC;AAEpD,eAAO,MAAM,mBAAmB,0MACyK,CAAC;AAE1M,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;;;;;GA6CA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
import { generateEmbedding } from '../services/local-embeddings.js';
|
|
4
|
+
import { upsertMemory } from '../services/sqlite.js';
|
|
5
|
+
import { validateCategory } from '../services/categories.js';
|
|
6
|
+
import { coerceStringArray } from './utils.js';
|
|
7
|
+
import { detectProject } from '../config.js';
|
|
8
|
+
import { computeChecksums } from '../services/file-checksums.js';
|
|
9
|
+
import { invalidateCache } from '../services/neural-interface.js';
|
|
10
|
+
import { text } from './response.js';
|
|
11
|
+
export function buildRememberSchema() {
|
|
12
|
+
return {
|
|
13
|
+
content: z
|
|
14
|
+
.string()
|
|
15
|
+
.describe('The information to remember. Be specific and include context.'),
|
|
16
|
+
category: z
|
|
17
|
+
.string()
|
|
18
|
+
.describe('Category name. Call category tool with action "list" to see valid categories.'),
|
|
19
|
+
project: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Project this belongs to (e.g. "criticalpixel"). Defaults to auto-detected from working directory.'),
|
|
23
|
+
tags: coerceStringArray()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Tags for categorization (e.g. ["redis", "cache", "pricing"])'),
|
|
26
|
+
importance: z
|
|
27
|
+
.coerce.number()
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(10)
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('1=trivial, 5=normal, 7=significant, 8+=critical. Default 5. Use 8+ for hard-won bug fixes and architecture decisions.'),
|
|
32
|
+
subcategory: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Optional refinement: architecture, bug-fix, api-quirk, performance, config, deployment, etc.'),
|
|
36
|
+
source: z
|
|
37
|
+
.enum(['user-told', 'self-discovered', 'auto-saved'])
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('How this was learned. user-told=user explicitly shared, self-discovered=found during work, auto-saved=session context.'),
|
|
40
|
+
related_files: coerceStringArray()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe('File paths this memory relates to.'),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export const rememberSchema = buildRememberSchema();
|
|
46
|
+
export const rememberDescription = 'Store a piece of information in persistent memory. Use this when you learn something important, make a decision, discover a pattern, fix a hard bug, or want to preserve context for future sessions.';
|
|
47
|
+
export async function handleRemember(args) {
|
|
48
|
+
const catCheck = validateCategory(args.category);
|
|
49
|
+
if (!catCheck.valid) {
|
|
50
|
+
return text(catCheck.error);
|
|
51
|
+
}
|
|
52
|
+
const content = args.content;
|
|
53
|
+
const category = args.category;
|
|
54
|
+
const project = args.project || detectProject();
|
|
55
|
+
const tags = args.tags || [];
|
|
56
|
+
const importance = args.importance ?? 5;
|
|
57
|
+
const subcategory = args.subcategory;
|
|
58
|
+
const source = args.source || 'self-discovered';
|
|
59
|
+
const related_files = args.related_files;
|
|
60
|
+
const id = uuidv4();
|
|
61
|
+
const now = new Date().toISOString();
|
|
62
|
+
const payload = {
|
|
63
|
+
content,
|
|
64
|
+
category,
|
|
65
|
+
subcategory,
|
|
66
|
+
project,
|
|
67
|
+
tags,
|
|
68
|
+
importance,
|
|
69
|
+
source,
|
|
70
|
+
created_at: now,
|
|
71
|
+
updated_at: now,
|
|
72
|
+
accessed_at: now,
|
|
73
|
+
access_count: 0,
|
|
74
|
+
related_files,
|
|
75
|
+
file_checksums: (() => {
|
|
76
|
+
if (!related_files?.length)
|
|
77
|
+
return undefined;
|
|
78
|
+
const cs = computeChecksums(related_files);
|
|
79
|
+
return Object.keys(cs).length > 0 ? cs : undefined;
|
|
80
|
+
})(),
|
|
81
|
+
};
|
|
82
|
+
const vector = await generateEmbedding(content);
|
|
83
|
+
await upsertMemory(id, vector, payload);
|
|
84
|
+
// Invalidate Neural Interface link cache (fire-and-forget)
|
|
85
|
+
invalidateCache('remember');
|
|
86
|
+
return text(`Remembered [${id}] (${category}/${project}, importance: ${importance}): "${content.slice(0, 100)}${content.length > 100 ? '...' : ''}"`);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=remember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember.js","sourceRoot":"","sources":["../../src/tools/remember.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP response helpers — eliminates verbose response object boilerplate.
|
|
3
|
+
* Inspired by FastMCP's approach of letting tools return simple values.
|
|
4
|
+
*
|
|
5
|
+
* Before: return { content: [{ type: 'text' as const, text: msg }] };
|
|
6
|
+
* After: return text(msg);
|
|
7
|
+
*/
|
|
8
|
+
/** Wrap a string in the MCP text response format. */
|
|
9
|
+
export declare function text(msg: string): {
|
|
10
|
+
content: {
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
}[];
|
|
14
|
+
};
|
|
15
|
+
/** Wrap base64 image data in the MCP image response format. */
|
|
16
|
+
export declare function image(data: string, mimeType: string): {
|
|
17
|
+
content: {
|
|
18
|
+
type: "image";
|
|
19
|
+
data: string;
|
|
20
|
+
mimeType: string;
|
|
21
|
+
}[];
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/tools/response.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,qDAAqD;AACrD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM;;;;;EAE/B;AAED,+DAA+D;AAC/D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;EAEnD"}
|