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.
@@ -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.14";
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}Startup context${c2.reset}`);
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}Recent Requests:${c2.reset}`);
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}Current Request:${c2.reset}`);
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}Recent Tools:${c2.reset}`);
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}Current Request:${c2.reset}`);
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}Recent Work:${c2.reset}`);
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}Recent Tools:${c2.reset}`);
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 Sessions:${c2.reset}`);
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}Project Signals:${c2.reset}`);
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 | \uD83D\uDD34 bugfix | \uD83D\uDFE3 feature | \uD83D\uDD04 refactor | \u2705 change | \uD83D\uDD35 discovery | \u2696\uFE0F decision`
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}Context index:${c2.reset} use IDs to fetch deeper detail when needed`,
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}Inspect:${c2.reset} ${unique.join(" \xB7 ")}`,
3332
- ...fetchHint ? [`${c2.dim}Fetch by ID:${c2.reset} ${fetchHint}`] : []
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 "\uD83D\uDD34";
3479
+ return "\u25A0";
3462
3480
  case "feature":
3463
- return "\uD83D\uDFE3";
3481
+ return "\u25B2";
3464
3482
  case "refactor":
3465
- return "\uD83D\uDD04";
3483
+ return "\u2248";
3466
3484
  case "change":
3467
- return "\u2705";
3485
+ return "\u25CF";
3468
3486
  case "discovery":
3469
- return "\uD83D\uDD35";
3487
+ return "\u25A1";
3470
3488
  case "decision":
3471
- return "\u2696\uFE0F";
3489
+ return "\u25C7";
3472
3490
  default:
3473
3491
  return "\u2022";
3474
3492
  }
@@ -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.14",
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.14"
19767
+ version: "0.4.15"
19768
19768
  });
19769
19769
  server.tool("save_observation", "Save an observation to memory", {
19770
19770
  type: exports_external.enum([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "engrm",
3
- "version": "0.4.14",
3
+ "version": "0.4.15",
4
4
  "description": "Shared memory across devices, sessions, and coding agents",
5
5
  "mcpName": "io.github.dr12hes/engrm",
6
6
  "type": "module",