@hyperlynq/synaptic 0.7.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/LICENSE +19 -0
- package/README.md +427 -0
- package/build/scripts/rebuild-index.d.ts +5 -0
- package/build/scripts/rebuild-index.js +33 -0
- package/build/src/cli/init.d.ts +13 -0
- package/build/src/cli/init.js +222 -0
- package/build/src/cli/init.js.map +1 -0
- package/build/src/cli/pre-commit.d.ts +6 -0
- package/build/src/cli/pre-commit.js +159 -0
- package/build/src/cli/pre-commit.js.map +1 -0
- package/build/src/cli.d.ts +2 -0
- package/build/src/cli.js +36 -0
- package/build/src/cli.js.map +1 -0
- package/build/src/hooks/pre-compact.d.ts +6 -0
- package/build/src/hooks/pre-compact.js +64 -0
- package/build/src/hooks/pre-compact.js.map +1 -0
- package/build/src/hooks/session-start.d.ts +13 -0
- package/build/src/hooks/session-start.js +277 -0
- package/build/src/hooks/session-start.js.map +1 -0
- package/build/src/hooks/stop.d.ts +7 -0
- package/build/src/hooks/stop.js +248 -0
- package/build/src/hooks/stop.js.map +1 -0
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +8 -0
- package/build/src/index.js.map +1 -0
- package/build/src/server.d.ts +6 -0
- package/build/src/server.js +133 -0
- package/build/src/server.js.map +1 -0
- package/build/src/storage/embedder.d.ts +27 -0
- package/build/src/storage/embedder.js +126 -0
- package/build/src/storage/embedder.js.map +1 -0
- package/build/src/storage/git.d.ts +20 -0
- package/build/src/storage/git.js +98 -0
- package/build/src/storage/git.js.map +1 -0
- package/build/src/storage/maintenance.d.ts +9 -0
- package/build/src/storage/maintenance.js +46 -0
- package/build/src/storage/maintenance.js.map +1 -0
- package/build/src/storage/markdown.d.ts +21 -0
- package/build/src/storage/markdown.js +79 -0
- package/build/src/storage/markdown.js.map +1 -0
- package/build/src/storage/paths.d.ts +6 -0
- package/build/src/storage/paths.js +17 -0
- package/build/src/storage/paths.js.map +1 -0
- package/build/src/storage/project.d.ts +2 -0
- package/build/src/storage/project.js +35 -0
- package/build/src/storage/project.js.map +1 -0
- package/build/src/storage/session.d.ts +1 -0
- package/build/src/storage/session.js +17 -0
- package/build/src/storage/session.js.map +1 -0
- package/build/src/storage/sqlite.d.ts +102 -0
- package/build/src/storage/sqlite.js +830 -0
- package/build/src/storage/sqlite.js.map +1 -0
- package/build/src/storage/watcher.d.ts +22 -0
- package/build/src/storage/watcher.js +126 -0
- package/build/src/storage/watcher.js.map +1 -0
- package/build/src/tools/context-archive.d.ts +11 -0
- package/build/src/tools/context-archive.js +13 -0
- package/build/src/tools/context-archive.js.map +1 -0
- package/build/src/tools/context-chain.d.ts +12 -0
- package/build/src/tools/context-chain.js +26 -0
- package/build/src/tools/context-chain.js.map +1 -0
- package/build/src/tools/context-cochanges.d.ts +20 -0
- package/build/src/tools/context-cochanges.js +25 -0
- package/build/src/tools/context-cochanges.js.map +1 -0
- package/build/src/tools/context-delete-rule.d.ts +11 -0
- package/build/src/tools/context-delete-rule.js +12 -0
- package/build/src/tools/context-delete-rule.js.map +1 -0
- package/build/src/tools/context-dna.d.ts +18 -0
- package/build/src/tools/context-dna.js +197 -0
- package/build/src/tools/context-dna.js.map +1 -0
- package/build/src/tools/context-git-index.d.ts +17 -0
- package/build/src/tools/context-git-index.js +59 -0
- package/build/src/tools/context-git-index.js.map +1 -0
- package/build/src/tools/context-list-rules.d.ts +8 -0
- package/build/src/tools/context-list-rules.js +11 -0
- package/build/src/tools/context-list-rules.js.map +1 -0
- package/build/src/tools/context-list.d.ts +26 -0
- package/build/src/tools/context-list.js +42 -0
- package/build/src/tools/context-list.js.map +1 -0
- package/build/src/tools/context-resolve-pattern.d.ts +11 -0
- package/build/src/tools/context-resolve-pattern.js +9 -0
- package/build/src/tools/context-resolve-pattern.js.map +1 -0
- package/build/src/tools/context-save-rule.d.ts +14 -0
- package/build/src/tools/context-save-rule.js +15 -0
- package/build/src/tools/context-save-rule.js.map +1 -0
- package/build/src/tools/context-save.d.ts +26 -0
- package/build/src/tools/context-save.js +68 -0
- package/build/src/tools/context-save.js.map +1 -0
- package/build/src/tools/context-search.d.ts +31 -0
- package/build/src/tools/context-search.js +99 -0
- package/build/src/tools/context-search.js.map +1 -0
- package/build/src/tools/context-session.d.ts +13 -0
- package/build/src/tools/context-session.js +29 -0
- package/build/src/tools/context-session.js.map +1 -0
- package/build/src/tools/context-status.d.ts +13 -0
- package/build/src/tools/context-status.js +15 -0
- package/build/src/tools/context-status.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionStart hook: Injects rules + recent context into Claude's conversation.
|
|
3
|
+
* Stdout from this hook is automatically added to Claude's context.
|
|
4
|
+
*
|
|
5
|
+
* Injection priority (token budget ~4000 chars):
|
|
6
|
+
* 1. Rules (always full, never truncated)
|
|
7
|
+
* 2. Recent context (last 3 days, compact format, same-project boosted)
|
|
8
|
+
* 3. Most recent handoff note (1 only)
|
|
9
|
+
* 4. Recurring patterns
|
|
10
|
+
* 5. Predicted focus (branch + diff + handoff semantic search)
|
|
11
|
+
* 6. Maintenance summary (only if something changed)
|
|
12
|
+
*/
|
|
13
|
+
import { ContextIndex } from "../storage/sqlite.js";
|
|
14
|
+
import { ensureDirs } from "../storage/paths.js";
|
|
15
|
+
import { runMaintenance } from "../storage/maintenance.js";
|
|
16
|
+
import { Embedder } from "../storage/embedder.js";
|
|
17
|
+
import { contextGitIndex } from "../tools/context-git-index.js";
|
|
18
|
+
import { detectProject } from "../storage/project.js";
|
|
19
|
+
import { getRecentlyChangedFiles, isGitRepo, getCurrentBranch } from "../storage/git.js";
|
|
20
|
+
const TOKEN_BUDGET_CHARS = 4000; // ~1000 tokens
|
|
21
|
+
async function main() {
|
|
22
|
+
ensureDirs();
|
|
23
|
+
const currentProject = detectProject();
|
|
24
|
+
let input = { source: "startup" };
|
|
25
|
+
try {
|
|
26
|
+
const chunks = [];
|
|
27
|
+
for await (const chunk of process.stdin) {
|
|
28
|
+
chunks.push(chunk);
|
|
29
|
+
}
|
|
30
|
+
const raw = Buffer.concat(chunks).toString("utf-8").trim();
|
|
31
|
+
if (raw) {
|
|
32
|
+
input = JSON.parse(raw);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Use defaults
|
|
37
|
+
}
|
|
38
|
+
const index = new ContextIndex();
|
|
39
|
+
// Auto-install the auto-distill rule if not present
|
|
40
|
+
const rules = index.listRules();
|
|
41
|
+
const hasAutoDistill = rules.some(r => r.label === "auto-distill");
|
|
42
|
+
if (!hasAutoDistill) {
|
|
43
|
+
index.saveRule("auto-distill", "When a significant decision is made, a problem is solved, a correction is given, or something surprising is discovered, save it as an insight to Synaptic immediately using context_save. Tag corrections with 'correction'. When following up on a previous decision, include its chain tag (e.g., chain:abc123). Don't wait for session end.");
|
|
44
|
+
}
|
|
45
|
+
// Run maintenance (decay, promotion) before listing
|
|
46
|
+
const maintenance = runMaintenance(index);
|
|
47
|
+
try {
|
|
48
|
+
// Auto-index recent git commits (silent)
|
|
49
|
+
const embedder = new Embedder();
|
|
50
|
+
try {
|
|
51
|
+
await contextGitIndex({ days: 1 }, index, embedder);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Don't block session start
|
|
55
|
+
}
|
|
56
|
+
const lines = [];
|
|
57
|
+
let charCount = 0;
|
|
58
|
+
// --- SECTION 1: Rules (always full, never truncated) ---
|
|
59
|
+
const rules = index.listRules();
|
|
60
|
+
if (rules.length > 0) {
|
|
61
|
+
lines.push("# Rules (ALWAYS follow, NO exceptions)");
|
|
62
|
+
for (const rule of rules) {
|
|
63
|
+
lines.push(`- ${rule.content}`);
|
|
64
|
+
}
|
|
65
|
+
lines.push("");
|
|
66
|
+
}
|
|
67
|
+
charCount = lines.join("\n").length;
|
|
68
|
+
// --- SECTION 1b: Pending rules for approval (high priority, right after rules) ---
|
|
69
|
+
const budgetForPending = [];
|
|
70
|
+
const pendingRules = index.list({ days: 7 })
|
|
71
|
+
.filter(e => e.tags.includes("pending_rule") && !e.archived);
|
|
72
|
+
if (pendingRules.length > 0) {
|
|
73
|
+
budgetForPending.push("## Pending rules (approve or dismiss)");
|
|
74
|
+
for (const pr of pendingRules.slice(0, 3)) {
|
|
75
|
+
const labelTag = pr.tags.find(t => t.startsWith("proposed-label:"));
|
|
76
|
+
const label = labelTag ? labelTag.replace("proposed-label:", "") : "unnamed";
|
|
77
|
+
budgetForPending.push(`- "${label}": ${pr.content.slice(0, 100)}`);
|
|
78
|
+
}
|
|
79
|
+
budgetForPending.push("_Ask user to accept (context_save_rule) or dismiss (context_archive)._");
|
|
80
|
+
budgetForPending.push("");
|
|
81
|
+
}
|
|
82
|
+
// Rule conflicts
|
|
83
|
+
const conflicts = index.list({ days: 7 })
|
|
84
|
+
.filter(e => e.tags.includes("rule_conflict") && !e.archived);
|
|
85
|
+
if (conflicts.length > 0) {
|
|
86
|
+
if (budgetForPending.length === 0) {
|
|
87
|
+
budgetForPending.push("## Pending rules (approve or dismiss)");
|
|
88
|
+
}
|
|
89
|
+
for (const c of conflicts.slice(0, 2)) {
|
|
90
|
+
budgetForPending.push(`- CONFLICT: ${c.content.slice(0, 120)}`);
|
|
91
|
+
}
|
|
92
|
+
if (budgetForPending[budgetForPending.length - 1] !== "") {
|
|
93
|
+
budgetForPending.push("");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// --- SECTION 2: Recent context (last 3 days, compact, project-boosted) ---
|
|
97
|
+
const budgetForContext = [];
|
|
98
|
+
const recent = index.list({ days: 3 })
|
|
99
|
+
.filter(e => e.tier !== "ephemeral" && e.type !== "handoff" && e.type !== "rule")
|
|
100
|
+
.sort((a, b) => {
|
|
101
|
+
// Same project first
|
|
102
|
+
const aMatch = a.project === currentProject ? 1 : 0;
|
|
103
|
+
const bMatch = b.project === currentProject ? 1 : 0;
|
|
104
|
+
if (aMatch !== bMatch)
|
|
105
|
+
return bMatch - aMatch;
|
|
106
|
+
// Then by date/time desc
|
|
107
|
+
return 0; // already sorted by date desc from list()
|
|
108
|
+
});
|
|
109
|
+
if (recent.length > 0) {
|
|
110
|
+
budgetForContext.push("## Recent Context (last 3 days)");
|
|
111
|
+
let currentDate = "";
|
|
112
|
+
for (const entry of recent.slice(0, 15)) {
|
|
113
|
+
if (entry.date !== currentDate) {
|
|
114
|
+
currentDate = entry.date;
|
|
115
|
+
budgetForContext.push(`\n### ${currentDate.slice(5)}`);
|
|
116
|
+
}
|
|
117
|
+
budgetForContext.push(`- ${entry.time} [${entry.type}] ${entry.content}`);
|
|
118
|
+
}
|
|
119
|
+
budgetForContext.push("");
|
|
120
|
+
}
|
|
121
|
+
// --- SECTION 3: Recent handoff (1 only) ---
|
|
122
|
+
const budgetForHandoff = [];
|
|
123
|
+
const handoffs = index.list({ days: 7, type: "handoff" }).slice(0, 1);
|
|
124
|
+
if (handoffs.length > 0) {
|
|
125
|
+
const h = handoffs[0];
|
|
126
|
+
budgetForHandoff.push("## Recent Handoff");
|
|
127
|
+
budgetForHandoff.push(`- ${h.date.slice(5)} ${h.time}: ${h.content}`);
|
|
128
|
+
budgetForHandoff.push("");
|
|
129
|
+
}
|
|
130
|
+
// --- SECTION 4: Recurring patterns ---
|
|
131
|
+
const budgetForPatterns = [];
|
|
132
|
+
const patterns = index.getActivePatterns();
|
|
133
|
+
if (patterns.length > 0) {
|
|
134
|
+
budgetForPatterns.push("## Recurring Issues");
|
|
135
|
+
for (const p of patterns) {
|
|
136
|
+
const isFailure = p.label.startsWith("Pre-commit failure");
|
|
137
|
+
if (isFailure) {
|
|
138
|
+
const allEntries = index.list({ days: 30 });
|
|
139
|
+
const fileTags = p.entryIds
|
|
140
|
+
.flatMap(id => {
|
|
141
|
+
const entry = allEntries.find(e => e.id === id);
|
|
142
|
+
return entry ? entry.tags.filter(t => t.startsWith("file:")) : [];
|
|
143
|
+
})
|
|
144
|
+
.map(t => t.replace("file:", ""));
|
|
145
|
+
const uniqueFiles = [...new Set(fileTags)].slice(0, 3);
|
|
146
|
+
const fileStr = uniqueFiles.length > 0 ? ` (${uniqueFiles.join(", ")})` : "";
|
|
147
|
+
budgetForPatterns.push(`- pre-commit failure${fileStr} — ${p.occurrenceCount}x (last: ${p.lastSeen.slice(5)})`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
budgetForPatterns.push(`- "${p.label}" — ${p.occurrenceCount}x (last: ${p.lastSeen.slice(5)})`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
budgetForPatterns.push("");
|
|
154
|
+
}
|
|
155
|
+
// --- SECTION 5: Predicted focus ---
|
|
156
|
+
const budgetForFocus = [];
|
|
157
|
+
const cwd = process.cwd();
|
|
158
|
+
if (isGitRepo(cwd)) {
|
|
159
|
+
try {
|
|
160
|
+
const branch = getCurrentBranch(cwd);
|
|
161
|
+
const recentFiles = getRecentlyChangedFiles(cwd);
|
|
162
|
+
// Build focus query from branch + files + last handoff
|
|
163
|
+
const queryParts = [];
|
|
164
|
+
if (branch && branch !== "main" && branch !== "master") {
|
|
165
|
+
// Branch name often contains feature context: feature/auth-rework -> auth rework
|
|
166
|
+
queryParts.push(branch.replace(/[\/\-_]/g, " "));
|
|
167
|
+
}
|
|
168
|
+
if (recentFiles.length > 0) {
|
|
169
|
+
queryParts.push(recentFiles.slice(0, 5).join(" "));
|
|
170
|
+
}
|
|
171
|
+
// Include last handoff learnings for continuity
|
|
172
|
+
const handoffs = index.list({ days: 7, type: "handoff" }).slice(0, 1);
|
|
173
|
+
if (handoffs.length > 0) {
|
|
174
|
+
const handoffContent = handoffs[0].content.slice(0, 200);
|
|
175
|
+
queryParts.push(handoffContent);
|
|
176
|
+
}
|
|
177
|
+
if (queryParts.length > 0) {
|
|
178
|
+
const focusQuery = queryParts.join(" ");
|
|
179
|
+
const focusResults = index.search(focusQuery, { limit: 3 })
|
|
180
|
+
.filter(e => e.type !== "handoff" && e.type !== "git_commit");
|
|
181
|
+
if (focusResults.length > 0) {
|
|
182
|
+
const fileCount = recentFiles.length;
|
|
183
|
+
const branchStr = branch ? `Branch: ${branch}` : "No branch";
|
|
184
|
+
const filesStr = fileCount > 0 ? ` | ${fileCount} uncommitted file${fileCount === 1 ? "" : "s"}` : "";
|
|
185
|
+
budgetForFocus.push("## Predicted focus");
|
|
186
|
+
budgetForFocus.push(`${branchStr}${filesStr}`);
|
|
187
|
+
for (const r of focusResults) {
|
|
188
|
+
const ago = Math.floor((Date.now() - new Date(r.date).getTime()) / (1000 * 60 * 60 * 24));
|
|
189
|
+
budgetForFocus.push(`- [${ago}d ago] ${r.type}: ${r.content.slice(0, 120)}`);
|
|
190
|
+
}
|
|
191
|
+
budgetForFocus.push("");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Co-change suggestions (fold into focus section)
|
|
195
|
+
if (currentProject && recentFiles.length > 0) {
|
|
196
|
+
const suggestions = [];
|
|
197
|
+
for (const file of recentFiles.slice(0, 5)) {
|
|
198
|
+
const cochanges = index.getCoChanges(currentProject, file, 3)
|
|
199
|
+
.filter(c => c.count >= 3 && !recentFiles.includes(c.file));
|
|
200
|
+
if (cochanges.length > 0) {
|
|
201
|
+
const pairs = cochanges.map(c => `${c.file} (${c.count}x)`).join(", ");
|
|
202
|
+
suggestions.push(`- ${file} → usually also changes: ${pairs}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (suggestions.length > 0) {
|
|
206
|
+
if (budgetForFocus.length === 0) {
|
|
207
|
+
budgetForFocus.push("## Predicted focus");
|
|
208
|
+
}
|
|
209
|
+
budgetForFocus.push(...suggestions);
|
|
210
|
+
budgetForFocus.push("");
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// Don't block session start
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// --- SECTION 6: Cross-project insights ---
|
|
219
|
+
const budgetForCrossProject = [];
|
|
220
|
+
if (currentProject) {
|
|
221
|
+
const crossProject = index.list({ days: 7 })
|
|
222
|
+
.filter(e => e.project !== null &&
|
|
223
|
+
e.project !== currentProject &&
|
|
224
|
+
e.type !== "handoff" &&
|
|
225
|
+
e.type !== "git_commit" &&
|
|
226
|
+
e.tier !== "ephemeral")
|
|
227
|
+
.slice(0, 3);
|
|
228
|
+
if (crossProject.length > 0) {
|
|
229
|
+
budgetForCrossProject.push("## From other projects");
|
|
230
|
+
for (const entry of crossProject) {
|
|
231
|
+
budgetForCrossProject.push(`- [${entry.project}] ${entry.content.slice(0, 120)}`);
|
|
232
|
+
}
|
|
233
|
+
budgetForCrossProject.push("");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// --- SECTION 7: Maintenance (only if something happened) ---
|
|
237
|
+
const budgetForMaint = [];
|
|
238
|
+
const maintTotal = maintenance.decayed + maintenance.demoted + maintenance.promotedStable + maintenance.promotedFrequent + maintenance.consolidated;
|
|
239
|
+
if (maintTotal > 0) {
|
|
240
|
+
const parts = [];
|
|
241
|
+
if (maintenance.decayed > 0)
|
|
242
|
+
parts.push(`${maintenance.decayed} archived`);
|
|
243
|
+
if (maintenance.demoted > 0)
|
|
244
|
+
parts.push(`${maintenance.demoted} demoted`);
|
|
245
|
+
if (maintenance.promotedStable > 0)
|
|
246
|
+
parts.push(`${maintenance.promotedStable} promoted`);
|
|
247
|
+
if (maintenance.promotedFrequent > 0)
|
|
248
|
+
parts.push(`${maintenance.promotedFrequent} promoted`);
|
|
249
|
+
if (maintenance.consolidated > 0)
|
|
250
|
+
parts.push(`${maintenance.consolidated} consolidated`);
|
|
251
|
+
budgetForMaint.push(`_Maintenance: ${parts.join(", ")}._`);
|
|
252
|
+
}
|
|
253
|
+
// --- Assemble within budget ---
|
|
254
|
+
const sections = [budgetForPending, budgetForContext, budgetForHandoff, budgetForPatterns, budgetForFocus, budgetForCrossProject, budgetForMaint];
|
|
255
|
+
for (const section of sections) {
|
|
256
|
+
const sectionText = section.join("\n");
|
|
257
|
+
if (charCount + sectionText.length <= TOKEN_BUDGET_CHARS) {
|
|
258
|
+
lines.push(...section);
|
|
259
|
+
charCount += sectionText.length;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Always append entry count (tiny)
|
|
263
|
+
const stats = index.status();
|
|
264
|
+
lines.push(`\n_${stats.totalEntries} total entries in context store._`);
|
|
265
|
+
if (lines.length <= 1)
|
|
266
|
+
return; // Nothing to inject
|
|
267
|
+
process.stdout.write(lines.join("\n"));
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
index.close();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
main().catch((err) => {
|
|
274
|
+
process.stderr.write(`session-start hook error: ${err}\n`);
|
|
275
|
+
process.exit(0);
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=session-start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop hook: Saves debounced handoff notes when Claude finishes responding.
|
|
3
|
+
* Only saves if 5+ minutes have passed since the last handoff note.
|
|
4
|
+
*
|
|
5
|
+
* Receives JSON on stdin: { stop_hook_active: boolean, ... }
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { appendEntry } from "../storage/markdown.js";
|
|
10
|
+
import { ContextIndex } from "../storage/sqlite.js";
|
|
11
|
+
import { Embedder } from "../storage/embedder.js";
|
|
12
|
+
import { ensureDirs, DB_DIR } from "../storage/paths.js";
|
|
13
|
+
import { detectProject } from "../storage/project.js";
|
|
14
|
+
import { getSessionId } from "../storage/session.js";
|
|
15
|
+
const DEBOUNCE_FILE = join(DB_DIR, ".last-handoff");
|
|
16
|
+
const DEBOUNCE_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
function shouldDebounce() {
|
|
18
|
+
if (!existsSync(DEBOUNCE_FILE))
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
const last = parseInt(readFileSync(DEBOUNCE_FILE, "utf-8").trim(), 10);
|
|
22
|
+
return Date.now() - last < DEBOUNCE_MS;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function updateDebounceTimestamp() {
|
|
29
|
+
writeFileSync(DEBOUNCE_FILE, Date.now().toString(), "utf-8");
|
|
30
|
+
}
|
|
31
|
+
async function main() {
|
|
32
|
+
ensureDirs();
|
|
33
|
+
let input = {};
|
|
34
|
+
try {
|
|
35
|
+
const chunks = [];
|
|
36
|
+
for await (const chunk of process.stdin) {
|
|
37
|
+
chunks.push(chunk);
|
|
38
|
+
}
|
|
39
|
+
const raw = Buffer.concat(chunks).toString("utf-8").trim();
|
|
40
|
+
if (raw) {
|
|
41
|
+
input = JSON.parse(raw);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Use defaults
|
|
46
|
+
}
|
|
47
|
+
// Prevent infinite loops
|
|
48
|
+
if (input.stop_hook_active) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Debounce: skip if a handoff was saved recently
|
|
52
|
+
if (shouldDebounce()) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const index = new ContextIndex();
|
|
56
|
+
const embedder = new Embedder();
|
|
57
|
+
const enrichInsert = (entry) => {
|
|
58
|
+
return index.insert({
|
|
59
|
+
...entry,
|
|
60
|
+
project: detectProject() ?? undefined,
|
|
61
|
+
sessionId: getSessionId(),
|
|
62
|
+
agentId: "system",
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
// Check if there's been meaningful activity today
|
|
67
|
+
const todayEntries = index.list({ days: 1 });
|
|
68
|
+
if (todayEntries.length === 0) {
|
|
69
|
+
return; // No activity to create a handoff for
|
|
70
|
+
}
|
|
71
|
+
// Create a handoff summary from today's entries
|
|
72
|
+
const types = new Map();
|
|
73
|
+
const tags = new Set();
|
|
74
|
+
for (const entry of todayEntries) {
|
|
75
|
+
types.set(entry.type, (types.get(entry.type) ?? 0) + 1);
|
|
76
|
+
entry.tags.forEach((t) => tags.add(t));
|
|
77
|
+
}
|
|
78
|
+
const tagList = Array.from(tags);
|
|
79
|
+
// Collect real-time insight saves from today (the primary distillation source)
|
|
80
|
+
const todayInsights = todayEntries
|
|
81
|
+
.filter(e => e.type === "insight")
|
|
82
|
+
.slice(0, 5);
|
|
83
|
+
const contentParts = [];
|
|
84
|
+
// Activity line
|
|
85
|
+
const projects = new Set(todayEntries.map(e => e.project).filter(Boolean));
|
|
86
|
+
const projectStr = projects.size > 0 ? ` across ${Array.from(projects).join(", ")}` : "";
|
|
87
|
+
contentParts.push(`Activity: ${todayEntries.length} entries${projectStr}.`);
|
|
88
|
+
// Learnings section (from real-time insight saves)
|
|
89
|
+
if (todayInsights.length > 0) {
|
|
90
|
+
contentParts.push("Learnings:");
|
|
91
|
+
for (const insight of todayInsights) {
|
|
92
|
+
const summary = insight.content.length > 150
|
|
93
|
+
? insight.content.slice(0, 150) + "..."
|
|
94
|
+
: insight.content;
|
|
95
|
+
contentParts.push(`- ${summary}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Pre-filter non-insight entries for use by safety net + intent classification
|
|
99
|
+
const nonInsightEntries = todayEntries
|
|
100
|
+
.filter(e => e.type !== "insight" && e.type !== "handoff" && e.type !== "git_commit" && e.type !== "rule");
|
|
101
|
+
// Layer 2: Embedder safety net — classify remaining entries for missed learnings
|
|
102
|
+
try {
|
|
103
|
+
if (nonInsightEntries.length > 0 && todayInsights.length < 5) {
|
|
104
|
+
const categoryTemplates = await embedder.getCategoryTemplates();
|
|
105
|
+
const remaining = 5 - todayInsights.length;
|
|
106
|
+
const candidates = [];
|
|
107
|
+
for (const entry of nonInsightEntries.slice(0, 20)) {
|
|
108
|
+
const match = await embedder.classifySentence(entry.content, categoryTemplates, 0.7);
|
|
109
|
+
if (match) {
|
|
110
|
+
candidates.push({ content: entry.content, ...match });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Sort by similarity, take top N
|
|
114
|
+
candidates.sort((a, b) => b.similarity - a.similarity);
|
|
115
|
+
const extras = candidates.slice(0, remaining);
|
|
116
|
+
if (extras.length > 0 && todayInsights.length === 0) {
|
|
117
|
+
contentParts.push("Learnings:");
|
|
118
|
+
}
|
|
119
|
+
for (const extra of extras) {
|
|
120
|
+
const summary = extra.content.length > 150 ? extra.content.slice(0, 150) + "..." : extra.content;
|
|
121
|
+
contentParts.push(`- ${summary}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Correction detection — scan for directive patterns, save as pending rules
|
|
125
|
+
const directiveTemplates = await embedder.getDirectiveTemplates();
|
|
126
|
+
const corrections = [];
|
|
127
|
+
for (const entry of todayEntries.filter(e => e.tags.includes("correction"))) {
|
|
128
|
+
corrections.push({ content: entry.content, category: "explicit" });
|
|
129
|
+
}
|
|
130
|
+
// Also check non-tagged entries for directive language
|
|
131
|
+
for (const entry of nonInsightEntries.slice(0, 15)) {
|
|
132
|
+
const match = await embedder.classifySentence(entry.content, directiveTemplates, 0.75);
|
|
133
|
+
if (match && !corrections.some(c => c.content === entry.content)) {
|
|
134
|
+
corrections.push({ content: entry.content, category: match.category });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Check for conflicts with existing rules
|
|
138
|
+
const existingRules = index.listRules();
|
|
139
|
+
if (existingRules.length > 0 && corrections.length > 0) {
|
|
140
|
+
for (const corr of corrections) {
|
|
141
|
+
const corrEmb = await embedder.embed(corr.content);
|
|
142
|
+
for (const rule of existingRules) {
|
|
143
|
+
const ruleEmb = await embedder.embed(rule.content);
|
|
144
|
+
// Cosine similarity (both L2-normalized)
|
|
145
|
+
let dot = 0;
|
|
146
|
+
for (let i = 0; i < corrEmb.length; i++) {
|
|
147
|
+
dot += corrEmb[i] * ruleEmb[i];
|
|
148
|
+
}
|
|
149
|
+
if (dot >= 0.7) {
|
|
150
|
+
// Conflict detected — save as conflict entry
|
|
151
|
+
const conflictEntry = appendEntry(`Conflict: new correction "${corr.content.slice(0, 80)}" may contradict rule "${rule.label}": "${rule.content.slice(0, 80)}"`, "insight", ["rule_conflict", `conflicts-with:${rule.label}`]);
|
|
152
|
+
conflictEntry.tier = "working";
|
|
153
|
+
const conflictRowid = enrichInsert(conflictEntry);
|
|
154
|
+
const conflictEmb = await embedder.embed(conflictEntry.content);
|
|
155
|
+
index.insertVec(conflictRowid, conflictEmb);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Save corrections as pending rule proposals
|
|
161
|
+
if (corrections.length > 0) {
|
|
162
|
+
for (const corr of corrections.slice(0, 3)) {
|
|
163
|
+
const label = corr.content.slice(0, 40).toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+$/, "");
|
|
164
|
+
const pendingEntry = appendEntry(corr.content, "insight", ["pending_rule", `proposed-label:${label}`]);
|
|
165
|
+
pendingEntry.tier = "working";
|
|
166
|
+
const corrRowid = enrichInsert(pendingEntry);
|
|
167
|
+
const emb = await embedder.embed(corr.content);
|
|
168
|
+
index.insertVec(corrRowid, emb);
|
|
169
|
+
}
|
|
170
|
+
contentParts.push(`Corrections detected: ${corrections.length} pending rule proposal(s) saved.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Don't fail the handoff if classification errors
|
|
175
|
+
}
|
|
176
|
+
// Intent classification — autonomous capture of declarations, preferences, etc.
|
|
177
|
+
try {
|
|
178
|
+
const intentTemplates = await embedder.getIntentTemplates();
|
|
179
|
+
const autoCaptures = [];
|
|
180
|
+
for (const entry of nonInsightEntries.slice(0, 20)) {
|
|
181
|
+
const match = await embedder.classifySentence(entry.content, intentTemplates, 0.3);
|
|
182
|
+
if (match) {
|
|
183
|
+
// Deduplicate: check if similar entry already exists as reference or rule
|
|
184
|
+
const existingRefs = index.list({ days: 30 })
|
|
185
|
+
.filter(e => e.type === "reference" || e.type === "rule");
|
|
186
|
+
let isDuplicate = false;
|
|
187
|
+
const entryEmb = await embedder.embed(entry.content);
|
|
188
|
+
for (const ref of existingRefs.slice(0, 30)) {
|
|
189
|
+
const refEmb = await embedder.embed(ref.content);
|
|
190
|
+
let dot = 0;
|
|
191
|
+
for (let i = 0; i < entryEmb.length; i++) {
|
|
192
|
+
dot += entryEmb[i] * refEmb[i];
|
|
193
|
+
}
|
|
194
|
+
if (dot >= 0.8) {
|
|
195
|
+
isDuplicate = true;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!isDuplicate) {
|
|
200
|
+
autoCaptures.push({ content: entry.content, ...match });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Save auto-captured intents
|
|
205
|
+
const capturedCounts = new Map();
|
|
206
|
+
for (const capture of autoCaptures.slice(0, 5)) {
|
|
207
|
+
const type = (capture.category === "frustration") ? "issue" : "reference";
|
|
208
|
+
const tier = (capture.category === "frustration") ? "working" : "longterm";
|
|
209
|
+
const captureEntry = appendEntry(capture.content, type, ["auto-captured", `intent:${capture.category}`]);
|
|
210
|
+
captureEntry.tier = tier;
|
|
211
|
+
const captureRowid = enrichInsert(captureEntry);
|
|
212
|
+
const captureEmb = await embedder.embed(capture.content);
|
|
213
|
+
index.insertVec(captureRowid, captureEmb);
|
|
214
|
+
capturedCounts.set(capture.category, (capturedCounts.get(capture.category) ?? 0) + 1);
|
|
215
|
+
}
|
|
216
|
+
if (capturedCounts.size > 0) {
|
|
217
|
+
const parts = Array.from(capturedCounts.entries()).map(([cat, count]) => `${count} ${cat}(s)`);
|
|
218
|
+
contentParts.push(`Auto-captured: ${parts.join(", ")}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Don't fail the handoff if intent classification errors
|
|
223
|
+
}
|
|
224
|
+
const content = contentParts.join("\n");
|
|
225
|
+
const entry = appendEntry(content, "handoff", tagList);
|
|
226
|
+
entry.tier = ContextIndex.assignTier(entry.type);
|
|
227
|
+
const rowid = enrichInsert(entry);
|
|
228
|
+
const embedding = await embedder.embed(entry.content);
|
|
229
|
+
index.insertVec(rowid, embedding);
|
|
230
|
+
// Bump access for entries that contributed to handoff learnings
|
|
231
|
+
for (const insight of todayInsights) {
|
|
232
|
+
index.touchEntry(insight.id);
|
|
233
|
+
}
|
|
234
|
+
// Also bump corrections that fed into pending rules
|
|
235
|
+
for (const entry of todayEntries.filter(e => e.tags.includes("correction"))) {
|
|
236
|
+
index.touchEntry(entry.id);
|
|
237
|
+
}
|
|
238
|
+
updateDebounceTimestamp();
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
index.close();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
main().catch((err) => {
|
|
245
|
+
process.stderr.write(`stop hook error: ${err}\n`);
|
|
246
|
+
process.exit(0);
|
|
247
|
+
});
|
|
248
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/hooks/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { createServer, getEmbedder } from "./server.js";
|
|
3
|
+
const server = createServer();
|
|
4
|
+
const transport = new StdioServerTransport();
|
|
5
|
+
await server.connect(transport);
|
|
6
|
+
// Pre-warm embedder in background (don't block tool registration)
|
|
7
|
+
getEmbedder().warmup().catch(() => { });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,kEAAkE;AAClE,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { Embedder } from "./storage/embedder.js";
|
|
3
|
+
export declare function getEmbedder(): Embedder;
|
|
4
|
+
export declare function getCurrentProject(): string | null;
|
|
5
|
+
export { getSessionId } from "./storage/session.js";
|
|
6
|
+
export declare function createServer(): McpServer;
|