engrm 0.4.14 → 0.4.15
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/hooks/session-start.js +39 -21
- package/dist/hooks/stop.js +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
|
@@ -1154,7 +1154,7 @@ import { existsSync as existsSync3, readFileSync as readFileSync2, writeFileSync
|
|
|
1154
1154
|
import { join as join3 } from "node:path";
|
|
1155
1155
|
import { homedir } from "node:os";
|
|
1156
1156
|
var STATE_PATH = join3(homedir(), ".engrm", "config-fingerprint.json");
|
|
1157
|
-
var CLIENT_VERSION = "0.4.
|
|
1157
|
+
var CLIENT_VERSION = "0.4.15";
|
|
1158
1158
|
function hashFile(filePath) {
|
|
1159
1159
|
try {
|
|
1160
1160
|
if (!existsSync3(filePath))
|
|
@@ -3135,7 +3135,7 @@ function formatSplashScreen(data) {
|
|
|
3135
3135
|
const brief = formatVisibleStartupBrief(data.context);
|
|
3136
3136
|
if (brief.length > 0) {
|
|
3137
3137
|
lines.push("");
|
|
3138
|
-
lines.push(` ${c2.bold}
|
|
3138
|
+
lines.push(` ${c2.bold}Handoff${c2.reset}`);
|
|
3139
3139
|
for (const line of brief) {
|
|
3140
3140
|
lines.push(` ${line}`);
|
|
3141
3141
|
}
|
|
@@ -3186,7 +3186,7 @@ function formatVisibleStartupBrief(context) {
|
|
|
3186
3186
|
const projectSignals = buildProjectSignalLine(context);
|
|
3187
3187
|
const shownItems = new Set;
|
|
3188
3188
|
if (promptLines.length > 0) {
|
|
3189
|
-
lines.push(`${c2.cyan}
|
|
3189
|
+
lines.push(`${c2.cyan}Asked recently:${c2.reset}`);
|
|
3190
3190
|
for (const item of promptLines) {
|
|
3191
3191
|
lines.push(` - ${truncateInline(item, 160)}`);
|
|
3192
3192
|
rememberShownItem(shownItems, item);
|
|
@@ -3218,13 +3218,13 @@ function formatVisibleStartupBrief(context) {
|
|
|
3218
3218
|
}
|
|
3219
3219
|
}
|
|
3220
3220
|
} else if (currentRequest && !duplicatesPromptLine(currentRequest, latestPromptLine)) {
|
|
3221
|
-
lines.push(`${c2.cyan}
|
|
3221
|
+
lines.push(`${c2.cyan}What you're on:${c2.reset}`);
|
|
3222
3222
|
lines.push(` - ${truncateInline(currentRequest, 160)}`);
|
|
3223
3223
|
rememberShownItem(shownItems, currentRequest);
|
|
3224
3224
|
if (toolFallbacks.length > 0) {
|
|
3225
3225
|
const additiveTools = filterAdditiveToolFallbacks(toolFallbacks, shownItems);
|
|
3226
3226
|
if (additiveTools.length > 0) {
|
|
3227
|
-
lines.push(`${c2.cyan}
|
|
3227
|
+
lines.push(`${c2.cyan}Tool trail:${c2.reset}`);
|
|
3228
3228
|
for (const item of additiveTools) {
|
|
3229
3229
|
lines.push(` - ${truncateInline(item, 160)}`);
|
|
3230
3230
|
rememberShownItem(shownItems, item);
|
|
@@ -3233,12 +3233,12 @@ function formatVisibleStartupBrief(context) {
|
|
|
3233
3233
|
}
|
|
3234
3234
|
}
|
|
3235
3235
|
if (latest && currentRequest && !hasRequestSection(lines) && !duplicatesPromptLine(currentRequest, latestPromptLine)) {
|
|
3236
|
-
lines.push(`${c2.cyan}
|
|
3236
|
+
lines.push(`${c2.cyan}What you're on:${c2.reset}`);
|
|
3237
3237
|
lines.push(` - ${truncateInline(currentRequest, 160)}`);
|
|
3238
3238
|
rememberShownItem(shownItems, currentRequest);
|
|
3239
3239
|
}
|
|
3240
3240
|
if (recentOutcomeLines.length > 0) {
|
|
3241
|
-
lines.push(`${c2.cyan}
|
|
3241
|
+
lines.push(`${c2.cyan}What's moved:${c2.reset}`);
|
|
3242
3242
|
for (const item of recentOutcomeLines) {
|
|
3243
3243
|
lines.push(` - ${truncateInline(item, 160)}`);
|
|
3244
3244
|
rememberShownItem(shownItems, item);
|
|
@@ -3247,7 +3247,7 @@ function formatVisibleStartupBrief(context) {
|
|
|
3247
3247
|
if (toolFallbacks.length > 0 && latest) {
|
|
3248
3248
|
const additiveTools = filterAdditiveToolFallbacks(toolFallbacks, shownItems);
|
|
3249
3249
|
if (additiveTools.length > 0) {
|
|
3250
|
-
lines.push(`${c2.cyan}
|
|
3250
|
+
lines.push(`${c2.cyan}Tool trail:${c2.reset}`);
|
|
3251
3251
|
for (const item of additiveTools) {
|
|
3252
3252
|
lines.push(` - ${truncateInline(item, 160)}`);
|
|
3253
3253
|
rememberShownItem(shownItems, item);
|
|
@@ -3255,13 +3255,13 @@ function formatVisibleStartupBrief(context) {
|
|
|
3255
3255
|
}
|
|
3256
3256
|
}
|
|
3257
3257
|
if (sessionFallbacks.length > 0) {
|
|
3258
|
-
lines.push(`${c2.cyan}Recent
|
|
3258
|
+
lines.push(`${c2.cyan}Recent threads:${c2.reset}`);
|
|
3259
3259
|
for (const item of sessionFallbacks) {
|
|
3260
3260
|
lines.push(` - ${truncateInline(item, 160)}`);
|
|
3261
3261
|
}
|
|
3262
3262
|
}
|
|
3263
3263
|
if (projectSignals) {
|
|
3264
|
-
lines.push(`${c2.cyan}
|
|
3264
|
+
lines.push(`${c2.cyan}Signal mix:${c2.reset}`);
|
|
3265
3265
|
lines.push(` - ${truncateInline(projectSignals, 160)}`);
|
|
3266
3266
|
}
|
|
3267
3267
|
const stale = pickRelevantStaleDecision(context, latest);
|
|
@@ -3294,7 +3294,7 @@ function formatContextEconomics(data) {
|
|
|
3294
3294
|
}
|
|
3295
3295
|
function formatLegend() {
|
|
3296
3296
|
return [
|
|
3297
|
-
`${c2.dim}Legend:${c2.reset} #id | \
|
|
3297
|
+
`${c2.dim}Legend:${c2.reset} #id | \u25A0 bugfix | \u25B2 feature | \u2248 refactor | \u25CF change | \u25A1 discovery | \u25C7 decision`
|
|
3298
3298
|
];
|
|
3299
3299
|
}
|
|
3300
3300
|
function formatContextIndex(context) {
|
|
@@ -3306,7 +3306,7 @@ function formatContextIndex(context) {
|
|
|
3306
3306
|
if (rows.length === 0)
|
|
3307
3307
|
return [];
|
|
3308
3308
|
return [
|
|
3309
|
-
`${c2.dim}
|
|
3309
|
+
`${c2.dim}Handoff index:${c2.reset} use IDs when you want the deeper thread`,
|
|
3310
3310
|
...rows
|
|
3311
3311
|
];
|
|
3312
3312
|
}
|
|
@@ -3328,8 +3328,8 @@ function formatInspectHints(context) {
|
|
|
3328
3328
|
const ids = context.observations.slice(0, 5).map((obs) => obs.id);
|
|
3329
3329
|
const fetchHint = ids.length > 0 ? `get_observations([${ids.join(", ")}])` : null;
|
|
3330
3330
|
return [
|
|
3331
|
-
`${c2.dim}
|
|
3332
|
-
...fetchHint ? [`${c2.dim}
|
|
3331
|
+
`${c2.dim}Next look:${c2.reset} ${unique.join(" \xB7 ")}`,
|
|
3332
|
+
...fetchHint ? [`${c2.dim}Pull detail:${c2.reset} ${fetchHint}`] : []
|
|
3333
3333
|
];
|
|
3334
3334
|
}
|
|
3335
3335
|
function rememberShownItem(shown, value) {
|
|
@@ -3452,23 +3452,41 @@ function chooseMeaningfulSessionSummary(request, completed) {
|
|
|
3452
3452
|
function buildProjectSignalLine(context) {
|
|
3453
3453
|
if (!context.projectTypeCounts)
|
|
3454
3454
|
return null;
|
|
3455
|
-
const top = Object.entries(context.projectTypeCounts).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, 4).map(([type, count]) => `${type} ${count}`).join("; ");
|
|
3455
|
+
const top = Object.entries(context.projectTypeCounts).sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, 4).map(([type, count]) => `${signalGlyph(type)} ${type} ${count}`).join("; ");
|
|
3456
3456
|
return top || null;
|
|
3457
3457
|
}
|
|
3458
|
+
function signalGlyph(type) {
|
|
3459
|
+
switch (type) {
|
|
3460
|
+
case "bugfix":
|
|
3461
|
+
return "\u25A0";
|
|
3462
|
+
case "feature":
|
|
3463
|
+
return "\u25B2";
|
|
3464
|
+
case "refactor":
|
|
3465
|
+
return "\u2248";
|
|
3466
|
+
case "change":
|
|
3467
|
+
return "\u25CF";
|
|
3468
|
+
case "discovery":
|
|
3469
|
+
return "\u25A1";
|
|
3470
|
+
case "decision":
|
|
3471
|
+
return "\u25C7";
|
|
3472
|
+
default:
|
|
3473
|
+
return "\xB7";
|
|
3474
|
+
}
|
|
3475
|
+
}
|
|
3458
3476
|
function observationIcon(type) {
|
|
3459
3477
|
switch (type) {
|
|
3460
3478
|
case "bugfix":
|
|
3461
|
-
return "\
|
|
3479
|
+
return "\u25A0";
|
|
3462
3480
|
case "feature":
|
|
3463
|
-
return "\
|
|
3481
|
+
return "\u25B2";
|
|
3464
3482
|
case "refactor":
|
|
3465
|
-
return "\
|
|
3483
|
+
return "\u2248";
|
|
3466
3484
|
case "change":
|
|
3467
|
-
return "\
|
|
3485
|
+
return "\u25CF";
|
|
3468
3486
|
case "discovery":
|
|
3469
|
-
return "\
|
|
3487
|
+
return "\u25A1";
|
|
3470
3488
|
case "decision":
|
|
3471
|
-
return "\
|
|
3489
|
+
return "\u25C7";
|
|
3472
3490
|
default:
|
|
3473
3491
|
return "\u2022";
|
|
3474
3492
|
}
|
package/dist/hooks/stop.js
CHANGED
|
@@ -2535,7 +2535,7 @@ function buildBeacon(db, config, sessionId, metrics) {
|
|
|
2535
2535
|
sentinel_used: valueSignals.security_findings_count > 0,
|
|
2536
2536
|
risk_score: riskScore,
|
|
2537
2537
|
stacks_detected: stacks,
|
|
2538
|
-
client_version: "0.4.
|
|
2538
|
+
client_version: "0.4.15",
|
|
2539
2539
|
context_observations_injected: metrics?.contextObsInjected ?? 0,
|
|
2540
2540
|
context_total_available: metrics?.contextTotalAvailable ?? 0,
|
|
2541
2541
|
recall_attempts: metrics?.recallAttempts ?? 0,
|
package/dist/server.js
CHANGED
|
@@ -19764,7 +19764,7 @@ process.on("SIGTERM", () => {
|
|
|
19764
19764
|
});
|
|
19765
19765
|
var server = new McpServer({
|
|
19766
19766
|
name: "engrm",
|
|
19767
|
-
version: "0.4.
|
|
19767
|
+
version: "0.4.15"
|
|
19768
19768
|
});
|
|
19769
19769
|
server.tool("save_observation", "Save an observation to memory", {
|
|
19770
19770
|
type: exports_external.enum([
|