create-merlin-brain 3.5.4 → 3.5.6
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/server/api/client.d.ts +37 -0
- package/dist/server/api/client.d.ts.map +1 -1
- package/dist/server/api/client.js +22 -0
- package/dist/server/api/client.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +40 -16
- package/dist/server/server.js.map +1 -1
- package/dist/server/session-coach.d.ts +75 -0
- package/dist/server/session-coach.d.ts.map +1 -0
- package/dist/server/session-coach.js +290 -0
- package/dist/server/session-coach.js.map +1 -0
- package/dist/server/stats.d.ts +4 -1
- package/dist/server/stats.d.ts.map +1 -1
- package/dist/server/stats.js +15 -29
- package/dist/server/stats.js.map +1 -1
- package/dist/server/tools/auto-teach.d.ts +44 -0
- package/dist/server/tools/auto-teach.d.ts.map +1 -0
- package/dist/server/tools/auto-teach.js +225 -0
- package/dist/server/tools/auto-teach.js.map +1 -0
- package/dist/server/tools/lite.d.ts.map +1 -1
- package/dist/server/tools/lite.js +87 -11
- package/dist/server/tools/lite.js.map +1 -1
- package/files/merlin/VERSION +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Coach — Persistent Protocol Enforcement
|
|
3
|
+
*
|
|
4
|
+
* The #1 problem: Claude starts strong with Merlin but drifts after 10-15 minutes.
|
|
5
|
+
* CLAUDE.md instructions fade as context fills up. The Loop doesn't have this
|
|
6
|
+
* problem because every iteration is a fresh 200K context.
|
|
7
|
+
*
|
|
8
|
+
* Solution: The MCP server IS the persistent thing in every session. Every tool
|
|
9
|
+
* response goes through us. We use that channel to inject targeted, escalating
|
|
10
|
+
* behavioral nudges that Claude's attention mechanism can't ignore.
|
|
11
|
+
*
|
|
12
|
+
* The key insight: <sub> tags and decorative boxes get ignored. What works is
|
|
13
|
+
* content that looks like instructions — direct, specific, actionable.
|
|
14
|
+
*
|
|
15
|
+
* Escalation levels:
|
|
16
|
+
* 0 - Green: Claude is following the protocol. Light footer.
|
|
17
|
+
* 1 - Yellow: Starting to drift (5+ min since context check). Nudge.
|
|
18
|
+
* 2 - Orange: Significant drift (10+ min or 12+ queries). Strong nudge.
|
|
19
|
+
* 3 - Red: Protocol abandoned (20+ min). Hard interrupt.
|
|
20
|
+
*/
|
|
21
|
+
// Thresholds
|
|
22
|
+
const DRIFT_MINUTES_YELLOW = 5;
|
|
23
|
+
const DRIFT_MINUTES_ORANGE = 10;
|
|
24
|
+
const DRIFT_MINUTES_RED = 20;
|
|
25
|
+
const CALLS_YELLOW = 8;
|
|
26
|
+
const CALLS_ORANGE = 15;
|
|
27
|
+
const CALLS_RED = 25;
|
|
28
|
+
// Tools that count as "context check"
|
|
29
|
+
const CONTEXT_TOOLS = new Set([
|
|
30
|
+
'merlin_get_context',
|
|
31
|
+
'merlin_search',
|
|
32
|
+
'merlin_find_files',
|
|
33
|
+
'merlin_adaptive_context',
|
|
34
|
+
'merlin_quickstart',
|
|
35
|
+
'merlin_get_conventions',
|
|
36
|
+
'merlin_impact_analysis',
|
|
37
|
+
'merlin_similar_code',
|
|
38
|
+
'merlin_ask',
|
|
39
|
+
]);
|
|
40
|
+
// Tools that suggest Claude is doing edit/implementation work
|
|
41
|
+
const EDIT_ADJACENT_TOOLS = new Set([
|
|
42
|
+
'merlin_run_verification',
|
|
43
|
+
'merlin_save_checkpoint',
|
|
44
|
+
'merlin_sync_task',
|
|
45
|
+
'merlin_log_activity',
|
|
46
|
+
]);
|
|
47
|
+
// State
|
|
48
|
+
const state = {
|
|
49
|
+
sessionStart: Date.now(),
|
|
50
|
+
toolCalls: [],
|
|
51
|
+
lastContextCheck: 0,
|
|
52
|
+
lastEditRelated: 0,
|
|
53
|
+
callsSinceContext: 0,
|
|
54
|
+
totalCalls: 0,
|
|
55
|
+
contextCheckCount: 0,
|
|
56
|
+
driftWarnings: 0,
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Record a tool call. Called by every Merlin tool handler.
|
|
60
|
+
*/
|
|
61
|
+
export function recordToolCall(toolName) {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
state.toolCalls.push({ tool: toolName, timestamp: now });
|
|
64
|
+
state.totalCalls++;
|
|
65
|
+
// Keep only last 50 calls to prevent memory growth
|
|
66
|
+
if (state.toolCalls.length > 50) {
|
|
67
|
+
state.toolCalls = state.toolCalls.slice(-50);
|
|
68
|
+
}
|
|
69
|
+
if (CONTEXT_TOOLS.has(toolName)) {
|
|
70
|
+
state.lastContextCheck = now;
|
|
71
|
+
state.callsSinceContext = 0;
|
|
72
|
+
state.contextCheckCount++;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
state.callsSinceContext++;
|
|
76
|
+
}
|
|
77
|
+
if (EDIT_ADJACENT_TOOLS.has(toolName)) {
|
|
78
|
+
state.lastEditRelated = now;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the current drift level (0-3)
|
|
83
|
+
*/
|
|
84
|
+
export function getDriftLevel() {
|
|
85
|
+
// If context was never checked, and this isn't the first call, drift
|
|
86
|
+
if (state.lastContextCheck === 0 && state.totalCalls > 2) {
|
|
87
|
+
return 3;
|
|
88
|
+
}
|
|
89
|
+
// If context was never checked and it's early, no drift yet
|
|
90
|
+
if (state.lastContextCheck === 0) {
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
const minutesSinceContext = (Date.now() - state.lastContextCheck) / (1000 * 60);
|
|
94
|
+
const calls = state.callsSinceContext;
|
|
95
|
+
// Red: abandoned
|
|
96
|
+
if (minutesSinceContext >= DRIFT_MINUTES_RED || calls >= CALLS_RED) {
|
|
97
|
+
return 3;
|
|
98
|
+
}
|
|
99
|
+
// Orange: significant drift
|
|
100
|
+
if (minutesSinceContext >= DRIFT_MINUTES_ORANGE || calls >= CALLS_ORANGE) {
|
|
101
|
+
return 2;
|
|
102
|
+
}
|
|
103
|
+
// Yellow: starting to drift
|
|
104
|
+
if (minutesSinceContext >= DRIFT_MINUTES_YELLOW || calls >= CALLS_YELLOW) {
|
|
105
|
+
return 1;
|
|
106
|
+
}
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the session health score (0-100)
|
|
111
|
+
*/
|
|
112
|
+
export function getSessionHealth() {
|
|
113
|
+
if (state.totalCalls === 0)
|
|
114
|
+
return 100;
|
|
115
|
+
// Ratio of context checks to total calls
|
|
116
|
+
const ratio = state.contextCheckCount / state.totalCalls;
|
|
117
|
+
// Ideal ratio is roughly 1 context check per 5-8 tool calls
|
|
118
|
+
const idealRatio = 0.15;
|
|
119
|
+
const ratioScore = Math.min(100, (ratio / idealRatio) * 100);
|
|
120
|
+
// Freshness score — how recent was last context check
|
|
121
|
+
const minutesSince = state.lastContextCheck > 0
|
|
122
|
+
? (Date.now() - state.lastContextCheck) / (1000 * 60)
|
|
123
|
+
: 999;
|
|
124
|
+
let freshnessScore = 100;
|
|
125
|
+
if (minutesSince > 20)
|
|
126
|
+
freshnessScore = 10;
|
|
127
|
+
else if (minutesSince > 10)
|
|
128
|
+
freshnessScore = 40;
|
|
129
|
+
else if (minutesSince > 5)
|
|
130
|
+
freshnessScore = 70;
|
|
131
|
+
return Math.round((ratioScore * 0.4) + (freshnessScore * 0.6));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate the protocol nudge for a tool response.
|
|
135
|
+
*
|
|
136
|
+
* This is the core coaching function. It returns a string to append to
|
|
137
|
+
* every Merlin tool response. The content is designed to be read as
|
|
138
|
+
* instructions, not decoration.
|
|
139
|
+
*
|
|
140
|
+
* For context-check tools: returns a light confirmation
|
|
141
|
+
* For other tools: returns an escalating nudge based on drift level
|
|
142
|
+
*/
|
|
143
|
+
export function getProtocolNudge(currentTool) {
|
|
144
|
+
const isContextTool = CONTEXT_TOOLS.has(currentTool);
|
|
145
|
+
const driftLevel = getDriftLevel();
|
|
146
|
+
// If this IS a context check, give a brief positive reinforcement
|
|
147
|
+
if (isContextTool) {
|
|
148
|
+
if (state.contextCheckCount <= 1) {
|
|
149
|
+
// First context check of the session
|
|
150
|
+
return '\n\n---\n**Protocol:** Context loaded. Call `merlin_get_context` again before each new file modification.';
|
|
151
|
+
}
|
|
152
|
+
// Regular context check — brief confirmation
|
|
153
|
+
return '\n\n---\n**Protocol:** ✓ Context fresh. Next check: before your next file edit.';
|
|
154
|
+
}
|
|
155
|
+
// For non-context tools, escalate based on drift
|
|
156
|
+
switch (driftLevel) {
|
|
157
|
+
case 0:
|
|
158
|
+
// Green — light reminder, rotate messages
|
|
159
|
+
return getGreenNudge();
|
|
160
|
+
case 1:
|
|
161
|
+
// Yellow — noticeable nudge
|
|
162
|
+
state.driftWarnings++;
|
|
163
|
+
return getYellowNudge();
|
|
164
|
+
case 2:
|
|
165
|
+
// Orange — strong nudge
|
|
166
|
+
state.driftWarnings++;
|
|
167
|
+
return getOrangeNudge();
|
|
168
|
+
case 3:
|
|
169
|
+
// Red — hard interrupt
|
|
170
|
+
state.driftWarnings++;
|
|
171
|
+
return getRedNudge();
|
|
172
|
+
default:
|
|
173
|
+
return '';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Green nudge — everything is fine, just a light reminder
|
|
178
|
+
*/
|
|
179
|
+
function getGreenNudge() {
|
|
180
|
+
const nudges = [
|
|
181
|
+
'**Next:** `merlin_get_context` before modifying files.',
|
|
182
|
+
'**Tip:** Check Sights before creating new files to avoid duplicates.',
|
|
183
|
+
'**Protocol:** Call `merlin_get_context("your task")` before each edit.',
|
|
184
|
+
];
|
|
185
|
+
const pick = nudges[state.totalCalls % nudges.length];
|
|
186
|
+
return `\n\n---\n${pick}`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Yellow nudge — starting to drift, clear instruction
|
|
190
|
+
*/
|
|
191
|
+
function getYellowNudge() {
|
|
192
|
+
const minutesSince = state.lastContextCheck > 0
|
|
193
|
+
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
194
|
+
: 0;
|
|
195
|
+
return `\n\n---\n` +
|
|
196
|
+
`**⚡ REFRESH CONTEXT** — ${minutesSince}min since last check, ${state.callsSinceContext} calls without context refresh.\n` +
|
|
197
|
+
`Before your next file edit, run: \`merlin_get_context("what you're working on")\`\n` +
|
|
198
|
+
`This prevents duplicating existing code and catches recent changes.`;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Orange nudge — significant drift, strong instruction
|
|
202
|
+
*/
|
|
203
|
+
function getOrangeNudge() {
|
|
204
|
+
const minutesSince = state.lastContextCheck > 0
|
|
205
|
+
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
206
|
+
: 0;
|
|
207
|
+
return `\n\n---\n` +
|
|
208
|
+
`**⚠️ PROTOCOL DRIFT DETECTED** — ${minutesSince}min and ${state.callsSinceContext} tool calls without checking Sights.\n\n` +
|
|
209
|
+
`**REQUIRED before continuing:** Call \`merlin_get_context("your current task")\` now.\n\n` +
|
|
210
|
+
`Without fresh context you risk:\n` +
|
|
211
|
+
`- Duplicating code that already exists\n` +
|
|
212
|
+
`- Missing recent changes by other agents\n` +
|
|
213
|
+
`- Breaking patterns the codebase expects`;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Red nudge — protocol abandoned, hard interrupt
|
|
217
|
+
*/
|
|
218
|
+
function getRedNudge() {
|
|
219
|
+
const minutesSince = state.lastContextCheck > 0
|
|
220
|
+
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
221
|
+
: 0;
|
|
222
|
+
const health = getSessionHealth();
|
|
223
|
+
return `\n\n---\n` +
|
|
224
|
+
`**🛑 STOP — CONTEXT STALE (${minutesSince}min, session health: ${health}%)**\n\n` +
|
|
225
|
+
`You have made ${state.callsSinceContext} tool calls without checking codebase context.\n` +
|
|
226
|
+
`This is exactly how duplicate code and broken patterns happen.\n\n` +
|
|
227
|
+
`**DO THIS NOW:**\n` +
|
|
228
|
+
`\`\`\`\nmerlin_get_context("describe what you are currently working on")\n\`\`\`\n\n` +
|
|
229
|
+
`Then continue your work with fresh understanding of the codebase.`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get a compact protocol status line for tool responses
|
|
233
|
+
* Shows: health %, drift level, last check time
|
|
234
|
+
*/
|
|
235
|
+
export function getProtocolStatus() {
|
|
236
|
+
const health = getSessionHealth();
|
|
237
|
+
const driftLevel = getDriftLevel();
|
|
238
|
+
const icons = ['🟢', '🟡', '🟠', '🔴'];
|
|
239
|
+
const icon = icons[driftLevel] || '🟢';
|
|
240
|
+
const minutesSince = state.lastContextCheck > 0
|
|
241
|
+
? Math.floor((Date.now() - state.lastContextCheck) / (1000 * 60))
|
|
242
|
+
: -1;
|
|
243
|
+
const lastCheck = minutesSince < 0
|
|
244
|
+
? 'never'
|
|
245
|
+
: minutesSince === 0
|
|
246
|
+
? 'just now'
|
|
247
|
+
: `${minutesSince}m ago`;
|
|
248
|
+
return `${icon} Protocol: ${health}% │ Last context: ${lastCheck} │ Calls since: ${state.callsSinceContext}`;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Reset session state (for testing or session restart)
|
|
252
|
+
*/
|
|
253
|
+
export function resetCoach() {
|
|
254
|
+
state.sessionStart = Date.now();
|
|
255
|
+
state.toolCalls = [];
|
|
256
|
+
state.lastContextCheck = 0;
|
|
257
|
+
state.lastEditRelated = 0;
|
|
258
|
+
state.callsSinceContext = 0;
|
|
259
|
+
state.totalCalls = 0;
|
|
260
|
+
state.contextCheckCount = 0;
|
|
261
|
+
state.driftWarnings = 0;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get coach stats for debugging
|
|
265
|
+
*/
|
|
266
|
+
export function getCoachStats() {
|
|
267
|
+
return {
|
|
268
|
+
totalCalls: state.totalCalls,
|
|
269
|
+
contextChecks: state.contextCheckCount,
|
|
270
|
+
callsSinceContext: state.callsSinceContext,
|
|
271
|
+
driftLevel: getDriftLevel(),
|
|
272
|
+
health: getSessionHealth(),
|
|
273
|
+
driftWarnings: state.driftWarnings,
|
|
274
|
+
sessionMinutes: Math.floor((Date.now() - state.sessionStart) / (1000 * 60)),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Convenience: Wrap any tool response text with coaching.
|
|
279
|
+
*
|
|
280
|
+
* Use this for tools that don't go through stats.wrapResponse().
|
|
281
|
+
* Records the tool call and appends the appropriate protocol nudge.
|
|
282
|
+
*
|
|
283
|
+
* Usage:
|
|
284
|
+
* return { content: [{ type: 'text', text: coachWrap('merlin_search', resultText) }] };
|
|
285
|
+
*/
|
|
286
|
+
export function coachWrap(toolName, text) {
|
|
287
|
+
recordToolCall(toolName);
|
|
288
|
+
return text + getProtocolNudge(toolName);
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=session-coach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-coach.js","sourceRoot":"","sources":["../../src/server/session-coach.ts"],"names":[],"mappings":"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"}
|
package/dist/server/stats.d.ts
CHANGED
|
@@ -80,7 +80,10 @@ export declare function formatHeader(toolName: string, options?: {
|
|
|
80
80
|
summary?: string;
|
|
81
81
|
}): string;
|
|
82
82
|
/**
|
|
83
|
-
* Wrap a response with Merlin visual formatting
|
|
83
|
+
* Wrap a response with Merlin visual formatting and session coaching.
|
|
84
|
+
*
|
|
85
|
+
* Every Merlin tool response goes through this. The session coach injects
|
|
86
|
+
* targeted, escalating nudges based on how well Claude is following the protocol.
|
|
84
87
|
*/
|
|
85
88
|
export declare function wrapResponse(toolName: string, content: string, options?: {
|
|
86
89
|
task?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"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"}
|
package/dist/server/stats.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Shows users the value: "5K tokens vs 65K if you read files directly"
|
|
5
5
|
*/
|
|
6
|
+
import { recordToolCall, getProtocolNudge, getProtocolStatus } from './session-coach.js';
|
|
6
7
|
// Configuration for periodic reminders
|
|
7
8
|
const STALE_CONTEXT_MINUTES = 5; // Warn if context older than 5 minutes
|
|
8
9
|
const QUERIES_BEFORE_REMINDER = 8; // Remind to refresh every N queries
|
|
@@ -218,15 +219,20 @@ export function formatHeader(toolName, options = {}) {
|
|
|
218
219
|
return header;
|
|
219
220
|
}
|
|
220
221
|
/**
|
|
221
|
-
* Wrap a response with Merlin visual formatting
|
|
222
|
+
* Wrap a response with Merlin visual formatting and session coaching.
|
|
223
|
+
*
|
|
224
|
+
* Every Merlin tool response goes through this. The session coach injects
|
|
225
|
+
* targeted, escalating nudges based on how well Claude is following the protocol.
|
|
222
226
|
*/
|
|
223
227
|
export function wrapResponse(toolName, content, options = {}) {
|
|
224
228
|
const { task, filesFound = 0, isSuccess = true, summary, skipEnforcement = false, isContextRefresh = false } = options;
|
|
225
229
|
// Calculate tokens
|
|
226
230
|
const responseTokens = estimateTokens(content);
|
|
227
|
-
// Record the query
|
|
231
|
+
// Record the query in stats
|
|
228
232
|
recordQuery(toolName, content, filesFound);
|
|
229
|
-
//
|
|
233
|
+
// Record in session coach (the new enforcement system)
|
|
234
|
+
recordToolCall(toolName);
|
|
235
|
+
// Track context refresh vs regular queries (legacy stats)
|
|
230
236
|
if (isContextRefresh) {
|
|
231
237
|
markContextRefresh();
|
|
232
238
|
}
|
|
@@ -236,20 +242,13 @@ export function wrapResponse(toolName, content, options = {}) {
|
|
|
236
242
|
// Build formatted response
|
|
237
243
|
let response = '';
|
|
238
244
|
// Add enforcement reminder if session status not shown yet
|
|
239
|
-
// (unless this is the get_selected_repo tool or enforcement is skipped)
|
|
240
245
|
if (!skipEnforcement) {
|
|
241
246
|
const reminder = getSessionEnforcementReminder();
|
|
242
247
|
if (reminder) {
|
|
243
248
|
response += reminder;
|
|
244
249
|
}
|
|
245
250
|
}
|
|
246
|
-
//
|
|
247
|
-
if (!isContextRefresh && !skipEnforcement) {
|
|
248
|
-
const staleReminder = getStaleContextReminder();
|
|
249
|
-
if (staleReminder) {
|
|
250
|
-
response += staleReminder;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
251
|
+
// Header with tool name, task, file count, token savings
|
|
253
252
|
response += formatHeader(toolName, {
|
|
254
253
|
task,
|
|
255
254
|
filesFound,
|
|
@@ -257,30 +256,17 @@ export function wrapResponse(toolName, content, options = {}) {
|
|
|
257
256
|
isSuccess,
|
|
258
257
|
summary,
|
|
259
258
|
});
|
|
259
|
+
// Protocol status line (compact: 🟢 Protocol: 85% │ Last context: 2m ago │ Calls since: 3)
|
|
260
|
+
response += getProtocolStatus() + '\n';
|
|
260
261
|
// Separator
|
|
261
262
|
response += '\n---\n\n';
|
|
262
263
|
// Actual content
|
|
263
264
|
response += content;
|
|
264
|
-
//
|
|
265
|
-
|
|
265
|
+
// Session coach nudge — replaces the old weak <sub> reminder
|
|
266
|
+
// This is targeted, escalating, and formatted as instructions not decoration
|
|
267
|
+
response += getProtocolNudge(toolName);
|
|
266
268
|
return response;
|
|
267
269
|
}
|
|
268
|
-
/**
|
|
269
|
-
* Get a subtle reminder to use Merlin
|
|
270
|
-
* This appears at the end of every response
|
|
271
|
-
*/
|
|
272
|
-
function getMerlinReminder() {
|
|
273
|
-
// Rotate through different reminders to avoid fatigue
|
|
274
|
-
const reminders = [
|
|
275
|
-
'`merlin_get_context` before modifying code',
|
|
276
|
-
'Check Merlin before creating new files',
|
|
277
|
-
'Use Merlin to find existing patterns',
|
|
278
|
-
'Merlin knows what already exists',
|
|
279
|
-
'Refresh context every few minutes',
|
|
280
|
-
];
|
|
281
|
-
const reminder = reminders[Math.floor(Date.now() / 60000) % reminders.length];
|
|
282
|
-
return `\n\n---\n<sub>🔮 Remember: ${reminder}</sub>`;
|
|
283
|
-
}
|
|
284
270
|
/**
|
|
285
271
|
* Get cumulative session stats for display
|
|
286
272
|
*/
|
package/dist/server/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/server/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Teach Module
|
|
3
|
+
*
|
|
4
|
+
* Detects when Sights context is low-confidence and prompts Claude to
|
|
5
|
+
* teach back what it discovers through manual exploration.
|
|
6
|
+
*
|
|
7
|
+
* The feedback loop:
|
|
8
|
+
* 1. merlin_get_context returns with confidence assessment
|
|
9
|
+
* 2. If low confidence, response includes a TEACH BACK prompt
|
|
10
|
+
* 3. Claude explores manually (Grep, Read, Glob)
|
|
11
|
+
* 4. Claude calls merlin_report_context_gap to push findings back
|
|
12
|
+
* 5. Findings saved as discoveries — next query returns them instantly
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolContext } from './types.js';
|
|
15
|
+
/** Confidence levels for context responses */
|
|
16
|
+
export type ContextConfidence = 'high' | 'medium' | 'low';
|
|
17
|
+
/** Assessment result */
|
|
18
|
+
export interface ConfidenceAssessment {
|
|
19
|
+
level: ContextConfidence;
|
|
20
|
+
score: number;
|
|
21
|
+
reasons: string[];
|
|
22
|
+
filesFound: number;
|
|
23
|
+
howToLength: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Assess confidence of a context response.
|
|
27
|
+
*
|
|
28
|
+
* Signals used:
|
|
29
|
+
* - HowTo guide length (short = low confidence)
|
|
30
|
+
* - Number of relevant files found
|
|
31
|
+
* - Whether howTo contains actionable steps vs generic text
|
|
32
|
+
* - Whether file exports were resolved
|
|
33
|
+
*/
|
|
34
|
+
export declare function assessContextConfidence(howTo: string, filesFound: number, conventionsFound?: number): ConfidenceAssessment;
|
|
35
|
+
/**
|
|
36
|
+
* Build the teach-back prompt appended to low-confidence responses.
|
|
37
|
+
* This tells Claude to push findings back after manual exploration.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildTeachBackPrompt(task: string, assessment: ConfidenceAssessment): string;
|
|
40
|
+
/**
|
|
41
|
+
* Register the auto-teach tools
|
|
42
|
+
*/
|
|
43
|
+
export declare function registerAutoTeachTools(ctx: ToolContext): void;
|
|
44
|
+
//# sourceMappingURL=auto-teach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-teach.d.ts","sourceRoot":"","sources":["../../../src/server/tools/auto-teach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE1D,wBAAwB;AACxB,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,gBAAgB,GAAE,MAAU,GAC3B,oBAAoB,CA+DtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAiG7D"}
|