prism-mcp-server 20.9.0 → 20.9.2

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.
@@ -42,6 +42,26 @@ function getClient() {
42
42
  configClient = createClient({
43
43
  url: `file:${CONFIG_PATH}`,
44
44
  });
45
+ // Multi-session machines share this one SQLite file across every host
46
+ // window's server process. libsql's default busy timeout is ZERO, so a
47
+ // writer meeting another writer fails instantly with SQLITE_BUSY instead
48
+ // of waiting its turn. Measured 2026-08-11: applying a new skill-manifest
49
+ // snapshot lost that race 10 consecutive times against ~7 live sessions'
50
+ // routine setting writes, leaving the sync permanently "partial" on a busy
51
+ // machine. Five seconds is far beyond any real transaction here and turns
52
+ // contention back into queueing. Fire-and-forget: a failure to set the
53
+ // pragma must never block storage init, and the first real query would
54
+ // surface a genuinely broken database anyway.
55
+ void configClient.execute("PRAGMA busy_timeout = 5000").catch(() => { });
56
+ // WAL is the half that actually ends the starvation: in the default
57
+ // rollback-journal mode every reader blocks the writer, and a machine
58
+ // running many host windows reads this file near-continuously (settings,
59
+ // drift reminders), so a manifest-apply transaction can wait out ANY
60
+ // timeout and still lose. WAL lets readers and the single writer proceed
61
+ // concurrently. The pragma is persistent per-database; issuing it on every
62
+ // init is an idempotent no-op that also upgrades databases created before
63
+ // this change.
64
+ void configClient.execute("PRAGMA journal_mode = WAL").catch(() => { });
45
65
  }
46
66
  return configClient;
47
67
  }
@@ -97,7 +97,13 @@ export function assembleSkillBlock(entries, budgetChars) {
97
97
  block +=
98
98
  `\n\n[📦 SKILLS NOT INLINED — max_tokens budget reached]\n` +
99
99
  `${overflow.join(", ")}\n` +
100
- `To inline them, re-call session_load_context with a higher max_tokens.`;
100
+ `These are RULES YOU ARE BOUND BY, not optional reading only their text ` +
101
+ `was withheld for budget. Before acting on work a listed skill governs ` +
102
+ `(e.g. verified-shipping before any completion claim, push, or PR), load ` +
103
+ `its body first: invoke it via the host's Skill tool, read it from the ` +
104
+ `skills directory, or re-call session_load_context with a higher ` +
105
+ `max_tokens. Claiming done without consulting the governing skill is the ` +
106
+ `exact failure this list exists to prevent.`;
101
107
  }
102
108
  return { block, inlined, overflow };
103
109
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prism-mcp-server",
3
- "version": "20.9.0",
3
+ "version": "20.9.2",
4
4
  "mcpName": "io.github.dcostenco/prism-coder",
5
5
  "description": "Persistent session memory for AI coding agents that never leaves your machine \u2014 including the on-device model that reasons over it. Restores your prior decisions, open TODOs, and changed files across sessions; adds associative recall of related past work, semantic drift detection, and local inference. Local-first by default. Works with Claude Code, Cursor, and Codex.",
6
6
  "module": "index.ts",