@vedtechsolutions/engram-mcp 1.0.5 → 1.0.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.
@@ -491,6 +491,29 @@ var SCHEMA_SURFACING = {
491
491
  /** Maximum instances to sample when generating a description */
492
492
  INSTANCE_SAMPLE_COUNT: 5
493
493
  };
494
+ var PROCEDURAL_WORKFLOW = {
495
+ /** Minimum successful commands in sequence to form a workflow */
496
+ MIN_COMMANDS: 3,
497
+ /** Maximum commands to track in recent_commands buffer */
498
+ MAX_TRACKED_COMMANDS: 20,
499
+ /** Maximum procedural workflows to encode per session */
500
+ MAX_PER_SESSION: 5,
501
+ /** Minimum time gap (ms) between workflow encodings to avoid bursts */
502
+ MIN_ENCODE_GAP_MS: 12e4,
503
+ /** Workflow pattern keywords — commands matching these form workflow candidates */
504
+ WORKFLOW_PATTERNS: {
505
+ build: ["build", "compile", "tsup", "tsc", "webpack", "vite", "esbuild", "rollup", "make"],
506
+ test: ["test", "vitest", "jest", "pytest", "mocha", "cargo test"],
507
+ deploy: ["deploy", "publish", "release", "push", "npm publish", "yarn publish", "pnpm publish"],
508
+ install: ["install", "npm install", "pnpm install", "yarn", "pip install", "cargo add"],
509
+ lint: ["lint", "eslint", "prettier", "black", "ruff", "clippy"],
510
+ db: ["migrate", "migration", "seed", "prisma", "alembic", "knex"],
511
+ docker: ["docker", "compose", "podman"],
512
+ git: ["git commit", "git push", "git tag", "git merge", "git rebase"]
513
+ },
514
+ /** Minimum confidence for encoding */
515
+ MIN_CONFIDENCE: 0.65
516
+ };
494
517
  var CODE_CONTEXT_RECALL = {
495
518
  /** Maximum code identifiers to extract from content */
496
519
  MAX_CODE_KEYWORDS: 15,
@@ -12379,6 +12402,7 @@ export {
12379
12402
  PROACTIVE_RECALL,
12380
12403
  MEMORY_SURFACE,
12381
12404
  RETRIEVAL_FEEDBACK,
12405
+ PROCEDURAL_WORKFLOW,
12382
12406
  CODE_CONTEXT_RECALL,
12383
12407
  DEDUP,
12384
12408
  SCHEMA_LIFECYCLE,
@@ -12630,4 +12654,4 @@ export {
12630
12654
  composeProjectUnderstanding,
12631
12655
  formatMentalModelInjection
12632
12656
  };
12633
- //# sourceMappingURL=chunk-FQ4MRL3Q.js.map
12657
+ //# sourceMappingURL=chunk-V5TTXT4V.js.map
package/dist/hook.js CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  PREWRITE_BLOCKING,
29
29
  PRE_COMPACTION,
30
30
  PROACTIVE_RECALL,
31
+ PROCEDURAL_WORKFLOW,
31
32
  REASONING_CHAIN,
32
33
  REASONING_TRACE,
33
34
  RETRIEVAL_FEEDBACK,
@@ -173,7 +174,7 @@ import {
173
174
  updateReasoningChain,
174
175
  updateSelfModelFromSession,
175
176
  updateTask
176
- } from "./chunk-FQ4MRL3Q.js";
177
+ } from "./chunk-V5TTXT4V.js";
177
178
 
178
179
  // src/hook.ts
179
180
  import { readFileSync, writeFileSync, existsSync, renameSync, statSync, readdirSync, unlinkSync, appendFileSync, openSync, readSync, closeSync } from "fs";
@@ -3124,7 +3125,9 @@ function loadWatcherState() {
3124
3125
  recall_misses: raw.recall_misses ?? 0,
3125
3126
  last_status_turn: raw.last_status_turn ?? 0,
3126
3127
  offload_message_sent: raw.offload_message_sent ?? false,
3127
- summary_injection_mode: raw.summary_injection_mode ?? false
3128
+ summary_injection_mode: raw.summary_injection_mode ?? false,
3129
+ recent_commands: raw.recent_commands ?? [],
3130
+ procedural_encoded_count: raw.procedural_encoded_count ?? 0
3128
3131
  };
3129
3132
  }
3130
3133
  } catch {
@@ -3186,7 +3189,9 @@ function loadWatcherState() {
3186
3189
  recall_misses: 0,
3187
3190
  last_status_turn: 0,
3188
3191
  offload_message_sent: false,
3189
- summary_injection_mode: false
3192
+ summary_injection_mode: false,
3193
+ recent_commands: [],
3194
+ procedural_encoded_count: 0
3190
3195
  };
3191
3196
  }
3192
3197
  function saveWatcherState(state) {
@@ -4026,6 +4031,77 @@ Output: ${truncate(toolOutput, 500)}`,
4026
4031
  } catch {
4027
4032
  }
4028
4033
  }
4034
+ try {
4035
+ const cmdLower = cmd.toLowerCase();
4036
+ const exitCode = stdinJson?.tool_response_metadata;
4037
+ const cmdSuccess = !isError;
4038
+ state.recent_commands.push({ cmd: truncate(cmd, 200), success: cmdSuccess, time: (/* @__PURE__ */ new Date()).toISOString() });
4039
+ if (state.recent_commands.length > PROCEDURAL_WORKFLOW.MAX_TRACKED_COMMANDS) {
4040
+ state.recent_commands = state.recent_commands.slice(-PROCEDURAL_WORKFLOW.MAX_TRACKED_COMMANDS);
4041
+ }
4042
+ stateChanged = true;
4043
+ if (cmdSuccess && state.procedural_encoded_count < PROCEDURAL_WORKFLOW.MAX_PER_SESSION) {
4044
+ const successCmds = state.recent_commands.filter((c) => c.success);
4045
+ if (successCmds.length >= PROCEDURAL_WORKFLOW.MIN_COMMANDS) {
4046
+ for (const [workflowName, keywords] of Object.entries(PROCEDURAL_WORKFLOW.WORKFLOW_PATTERNS)) {
4047
+ const matching = successCmds.filter((c) => {
4048
+ const cl = c.cmd.toLowerCase();
4049
+ return keywords.some((kw) => cl.includes(kw));
4050
+ });
4051
+ if (matching.length >= PROCEDURAL_WORKFLOW.MIN_COMMANDS) {
4052
+ const steps = matching.slice(-6).map((c, i) => `${i + 1}. ${truncate(c.cmd, 120)}`).join("\n");
4053
+ const content = `${workflowName} workflow (${matching.length} steps):
4054
+ ${steps}`;
4055
+ const domains = state.active_domain ? [state.active_domain] : [];
4056
+ const existing = findDuplicate(content, "procedural", domains);
4057
+ if (!existing) {
4058
+ createMemory({
4059
+ type: "procedural",
4060
+ content,
4061
+ summary: `${workflowName} workflow: ${matching.slice(-3).map((c) => truncate(c.cmd, 40)).join(" \u2192 ")}`,
4062
+ encoding_strength: 0.7,
4063
+ reinforcement: 1.2,
4064
+ confidence: PROCEDURAL_WORKFLOW.MIN_CONFIDENCE,
4065
+ storage_tier: "short_term",
4066
+ pinned: false,
4067
+ tags: ["workflow", `workflow-${workflowName}`, "auto-encoded"],
4068
+ domains,
4069
+ version: state.active_version,
4070
+ encoding_context: {
4071
+ project: state.active_project,
4072
+ project_path: state.active_project_path,
4073
+ framework: state.active_domain,
4074
+ version: state.active_version,
4075
+ files: state.session_files.slice(-5),
4076
+ task_type: workflowName === "build" ? "building" : null,
4077
+ error_context: null,
4078
+ session_id: sessionId,
4079
+ significance_score: 0.7
4080
+ },
4081
+ type_data: {
4082
+ kind: "procedural",
4083
+ steps: matching.map((c) => c.cmd),
4084
+ preconditions: [],
4085
+ postconditions: [],
4086
+ practice_count: 1,
4087
+ automaticity: 0.3,
4088
+ variants: [],
4089
+ skill_metadata: null
4090
+ }
4091
+ });
4092
+ state.procedural_encoded_count++;
4093
+ stateChanged = true;
4094
+ log.info("Auto-encoded procedural workflow", { type: workflowName, steps: matching.length });
4095
+ const matchedTimes = new Set(matching.map((c) => c.time));
4096
+ state.recent_commands = state.recent_commands.filter((c) => !matchedTimes.has(c.time));
4097
+ }
4098
+ break;
4099
+ }
4100
+ }
4101
+ }
4102
+ }
4103
+ } catch {
4104
+ }
4029
4105
  if (stateChanged) {
4030
4106
  saveWatcherState(state);
4031
4107
  }
@@ -4862,7 +4938,9 @@ function handleSessionStart(stdinJson, argFallback) {
4862
4938
  recall_misses: isPostCompact ? prevState?.recall_misses ?? 0 : 0,
4863
4939
  last_status_turn: 0,
4864
4940
  offload_message_sent: false,
4865
- summary_injection_mode: false
4941
+ summary_injection_mode: false,
4942
+ recent_commands: isPostCompact ? prevState?.recent_commands ?? [] : [],
4943
+ procedural_encoded_count: isPostCompact ? prevState?.procedural_encoded_count ?? 0 : 0
4866
4944
  });
4867
4945
  const source = metadata.source;
4868
4946
  if (!source || source === "startup") {
package/dist/index.js CHANGED
@@ -154,7 +154,7 @@ import {
154
154
  vaccinate,
155
155
  vacuumDatabase,
156
156
  validateMultiPerspective
157
- } from "./chunk-FQ4MRL3Q.js";
157
+ } from "./chunk-V5TTXT4V.js";
158
158
 
159
159
  // src/index.ts
160
160
  import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vedtechsolutions/engram-mcp",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Cognitive memory system for AI — persistent, cross-session learning via MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",