@seanhogg/builderforce-memory-mcp 2026.9.28 → 2026.9.30

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.
Files changed (89) hide show
  1. package/README.md +25 -0
  2. package/dist/backends/memory-store.d.ts.map +1 -1
  3. package/dist/backends/memory-store.js +15 -68
  4. package/dist/backends/memory-store.js.map +1 -1
  5. package/dist/bin/http.d.ts +1 -0
  6. package/dist/bin/http.d.ts.map +1 -1
  7. package/dist/bin/http.js +9 -0
  8. package/dist/bin/http.js.map +1 -1
  9. package/dist/bin/stdio.d.ts +4 -0
  10. package/dist/bin/stdio.d.ts.map +1 -1
  11. package/dist/bin/stdio.js +7 -0
  12. package/dist/bin/stdio.js.map +1 -1
  13. package/dist/dynamic-import.d.ts +10 -0
  14. package/dist/dynamic-import.d.ts.map +1 -0
  15. package/dist/dynamic-import.js +13 -0
  16. package/dist/dynamic-import.js.map +1 -0
  17. package/dist/embedding/evermind-embedder.d.ts +0 -1
  18. package/dist/embedding/evermind-embedder.d.ts.map +1 -1
  19. package/dist/embedding/evermind-embedder.js +8 -44
  20. package/dist/embedding/evermind-embedder.js.map +1 -1
  21. package/dist/experience/file-store.d.ts +52 -0
  22. package/dist/experience/file-store.d.ts.map +1 -0
  23. package/dist/experience/file-store.js +119 -0
  24. package/dist/experience/file-store.js.map +1 -0
  25. package/dist/experience/host.d.ts +46 -0
  26. package/dist/experience/host.d.ts.map +1 -0
  27. package/dist/experience/host.js +57 -0
  28. package/dist/experience/host.js.map +1 -0
  29. package/dist/experience/tools.d.ts +16 -0
  30. package/dist/experience/tools.d.ts.map +1 -0
  31. package/dist/experience/tools.js +279 -0
  32. package/dist/experience/tools.js.map +1 -0
  33. package/dist/experience/train.d.ts +48 -0
  34. package/dist/experience/train.d.ts.map +1 -0
  35. package/dist/experience/train.js +72 -0
  36. package/dist/experience/train.js.map +1 -0
  37. package/dist/gateway-tools.d.ts +8 -0
  38. package/dist/gateway-tools.d.ts.map +1 -0
  39. package/dist/gateway-tools.js +71 -0
  40. package/dist/gateway-tools.js.map +1 -0
  41. package/dist/index.d.ts +5 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/install/install.d.ts.map +1 -1
  46. package/dist/install/install.js +2 -2
  47. package/dist/install/install.js.map +1 -1
  48. package/dist/model/evermind-package.d.ts +55 -0
  49. package/dist/model/evermind-package.d.ts.map +1 -0
  50. package/dist/model/evermind-package.js +86 -0
  51. package/dist/model/evermind-package.js.map +1 -0
  52. package/dist/persistence/shared-json-file.d.ts +65 -0
  53. package/dist/persistence/shared-json-file.d.ts.map +1 -0
  54. package/dist/persistence/shared-json-file.js +110 -0
  55. package/dist/persistence/shared-json-file.js.map +1 -0
  56. package/dist/tool-core.d.ts +28 -0
  57. package/dist/tool-core.d.ts.map +1 -0
  58. package/dist/tool-core.js +19 -0
  59. package/dist/tool-core.js.map +1 -0
  60. package/dist/tools.d.ts +9 -17
  61. package/dist/tools.d.ts.map +1 -1
  62. package/dist/tools.js +5 -73
  63. package/dist/tools.js.map +1 -1
  64. package/dist/transports/http.d.ts.map +1 -1
  65. package/dist/transports/http.js +8 -1
  66. package/dist/transports/http.js.map +1 -1
  67. package/dist/transports/sdk.d.ts.map +1 -1
  68. package/dist/transports/sdk.js +2 -4
  69. package/dist/transports/sdk.js.map +1 -1
  70. package/package.json +6 -6
  71. package/server.json +3 -3
  72. package/src/backends/memory-store.ts +16 -85
  73. package/src/bin/http.ts +12 -0
  74. package/src/bin/stdio.ts +7 -0
  75. package/src/dynamic-import.ts +12 -0
  76. package/src/embedding/evermind-embedder.ts +11 -61
  77. package/src/experience/file-store.ts +143 -0
  78. package/src/experience/host.ts +113 -0
  79. package/src/experience/tools.ts +363 -0
  80. package/src/experience/train.ts +96 -0
  81. package/src/gateway-tools.ts +97 -0
  82. package/src/index.ts +8 -1
  83. package/src/install/install.ts +2 -2
  84. package/src/model/evermind-package.ts +127 -0
  85. package/src/persistence/shared-json-file.ts +131 -0
  86. package/src/tool-core.ts +39 -0
  87. package/src/tools.ts +13 -116
  88. package/src/transports/http.ts +8 -1
  89. package/src/transports/sdk.ts +2 -5
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Teach the person's private Evermind what they have done.
3
+ *
4
+ * Experience becomes text through the engine (`experienceDocuments`: each skill or
5
+ * uncompiled demonstration as a written procedure), and the text becomes weights
6
+ * through the engine's ONE adaptation recipe (`adaptPackage`). This module only
7
+ * decides what is new, runs the passes over the local model file and writes the
8
+ * result back, keeping the previous model beside it.
9
+ *
10
+ * "What is new" is the store's learned ledger. Every adaptation writes `<base>+expN`
11
+ * and records N against each procedure it learned, so a loaded model trusts exactly
12
+ * the entries at or below its own N: rolling back to `<model>.prev` (+exp N-1)
13
+ * re-teaches what the discarded version had learned, and a fresh base (no suffix,
14
+ * N = 0) — a newly downloaded Evermind — gets every procedure again.
15
+ */
16
+ const EXP_SUFFIX = /\+exp(\d+)$/;
17
+ /** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
18
+ export function nextExperienceVersion(version) {
19
+ const m = EXP_SUFFIX.exec(version);
20
+ return m ? version.replace(EXP_SUFFIX, `+exp${Number(m[1]) + 1}`) : `${version}+exp1`;
21
+ }
22
+ /** Which adaptation produced this model: N for `+expN`, 0 for a base that has none. */
23
+ export function experienceIndex(version) {
24
+ const m = EXP_SUFFIX.exec(version);
25
+ return m ? Number(m[1]) : 0;
26
+ }
27
+ /** Procedures the model has not learned yet. */
28
+ export async function pendingDocuments(store, engine, modelVersion) {
29
+ const snap = await store.snapshot();
30
+ const current = experienceIndex(modelVersion);
31
+ const known = (id) => {
32
+ const n = snap.learned[id];
33
+ return typeof n === "number" && n >= 1 && n <= current;
34
+ };
35
+ return engine.experienceDocuments(snap.episodes, snap.skills).filter((d) => !known(d.id));
36
+ }
37
+ export async function trainExperience(store, engine, model, modelFile) {
38
+ const version = model.pkg.manifest.version ?? "0";
39
+ const docs = await pendingDocuments(store, engine, version);
40
+ if (docs.length === 0)
41
+ return { status: "nothing_new", pending: 0, version };
42
+ const next = nextExperienceVersion(version);
43
+ // The engine's package type; the structural view is what was loaded from disk.
44
+ let pkg = model.pkg;
45
+ const learned = [];
46
+ let lossSum = 0;
47
+ let passes = 0;
48
+ for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
49
+ const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next);
50
+ if (!r)
51
+ continue;
52
+ pkg = r.pkg;
53
+ lossSum += r.loss;
54
+ passes++;
55
+ learned.push(...pass.map((d) => d.id));
56
+ }
57
+ if (passes === 0)
58
+ return { status: "no_window", pending: docs.length, version };
59
+ const loss = lossSum / passes;
60
+ // Keep the model this pass started from, so one bad adaptation is one rename away
61
+ // from undone. The new model is written beside the old one and renamed into place,
62
+ // so a crash mid-write never leaves a truncated model. The ledger is written only
63
+ // after the new model is on disk.
64
+ const previousModel = `${modelFile}.prev`;
65
+ model.fs.copyFileSync(modelFile, previousModel);
66
+ const staged = `${modelFile}.next`;
67
+ model.fs.writeFileSync(staged, new Uint8Array(pkg.toBlob()));
68
+ model.fs.renameSync(staged, modelFile);
69
+ await store.recordAdaptation({ index: experienceIndex(next), version: next, learned, passes, loss, at: Date.now() });
70
+ return { status: "trained", learned: learned.length, passes, loss, version: next, previousModel };
71
+ }
72
+ //# sourceMappingURL=train.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Gateway-backed cost tools (token_usage, model_efficiency). Registered only when a
3
+ * gateway URL and a `bfk_*` key are both configured, so memory-only deployments
4
+ * never see them.
5
+ */
6
+ import { type MemoryTool } from "./tool-core.js";
7
+ export declare function appendGatewayCostTools(tools: MemoryTool[], gatewayUrl: string, apiKey: string): void;
8
+ //# sourceMappingURL=gateway-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-tools.d.ts","sourceRoot":"","sources":["../src/gateway-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqC3D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqDpG"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Gateway-backed cost tools (token_usage, model_efficiency). Registered only when a
3
+ * gateway URL and a `bfk_*` key are both configured, so memory-only deployments
4
+ * never see them.
5
+ */
6
+ import { fail, ok } from "./tool-core.js";
7
+ async function gatewayGet(gatewayUrl, path, apiKey) {
8
+ const res = await fetch(`${gatewayUrl}${path}`, {
9
+ headers: { authorization: `Bearer ${apiKey}` },
10
+ });
11
+ if (!res.ok)
12
+ throw new Error(`gateway ${path} → HTTP ${res.status}`);
13
+ return (await res.json());
14
+ }
15
+ export function appendGatewayCostTools(tools, gatewayUrl, apiKey) {
16
+ tools.push({
17
+ name: "token_usage",
18
+ description: "Current token spend + budget for the workspace (today).",
19
+ inputSchema: {},
20
+ handler: async () => {
21
+ try {
22
+ const s = await gatewayGet(gatewayUrl, "/llm/v1/builder-insights", apiKey);
23
+ const lines = [
24
+ `Token usage (${s.windowLabel ?? "today"}):`,
25
+ `• Tokens: ${(s.todayTokens ?? 0).toLocaleString()}`,
26
+ `• Cost: $${(s.todayCostUsd ?? 0).toFixed(2)}`,
27
+ `• % of daily cap: ${s.pctOfDailyCap == null
28
+ ? "no cap"
29
+ : `${s.pctOfDailyCap}%${s.dailyCapTokens ? ` of ${s.dailyCapTokens.toLocaleString()}` : ""}`}`,
30
+ `• Top model: ${s.topModel ? `${s.topModel.model} (${s.topModel.tokens.toLocaleString()} tok)` : "—"}`,
31
+ ];
32
+ if (s.costPerMergedPrUsd != null)
33
+ lines.push(`• Cost / merged PR: $${s.costPerMergedPrUsd.toFixed(2)}`);
34
+ if (s.tip)
35
+ lines.push(`• Tip: ${s.tip}`);
36
+ return ok(lines.join("\n"));
37
+ }
38
+ catch (err) {
39
+ return fail(`token_usage failed: ${String(err)}`);
40
+ }
41
+ },
42
+ });
43
+ tools.push({
44
+ name: "model_efficiency",
45
+ description: "Which models performed best/cheapest for this workspace's recent work.",
46
+ inputSchema: {},
47
+ handler: async () => {
48
+ try {
49
+ const a = await gatewayGet(gatewayUrl, "/llm/v1/model-analytics", apiKey);
50
+ const groups = a.byAction ?? [];
51
+ if (groups.length === 0)
52
+ return ok("No model efficiency data yet for this workspace.");
53
+ const out = ["Model efficiency by action type (best first):"];
54
+ for (const g of groups) {
55
+ out.push(`\n${g.label ?? g.actionType ?? "action"}:`);
56
+ for (const m of (g.models ?? []).slice(0, 3)) {
57
+ const cost = m.avgCostMillicents != null ? ` $${(m.avgCostMillicents / 100_000).toFixed(4)}/call` : "";
58
+ const merge = m.mergeRate != null ? ` merge=${Math.round(m.mergeRate * 100)}%` : "";
59
+ const score = m.avgScore != null ? ` score=${m.avgScore}` : "";
60
+ out.push(` • ${m.model}${score}${merge}${cost} (n=${m.samples ?? 0})`);
61
+ }
62
+ }
63
+ return ok(out.join("\n"));
64
+ }
65
+ catch (err) {
66
+ return fail(`model_efficiency failed: ${String(err)}`);
67
+ }
68
+ },
69
+ });
70
+ }
71
+ //# sourceMappingURL=gateway-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-tools.js","sourceRoot":"","sources":["../src/gateway-tools.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,7 +12,11 @@ export type { EvermindEmbedderOptions, PersistentTextEmbedder, TextEmbedderLike,
12
12
  export { MemoryStoreBackend, createLocalMemoryStoreBackend } from "./backends/memory-store.js";
13
13
  export type { LocalBackendOptions } from "./backends/memory-store.js";
14
14
  export { buildMemoryTools } from "./tools.js";
15
- export type { MemoryTool, MemoryToolsOptions, ToolResult } from "./tools.js";
15
+ export type { MemoryToolsOptions } from "./tools.js";
16
+ export type { MemoryTool, ToolResult } from "./tool-core.js";
17
+ export { createExperienceHost, EXPERIENCE_ENV } from "./experience/host.js";
18
+ export type { ExperienceHost, ExperienceHostOptions, ExperienceEngine } from "./experience/host.js";
19
+ export { nextExperienceVersion } from "./experience/train.js";
16
20
  export { STUB_PREFIX, DEFAULT_STUB_CHARS, isStub, firstLine, memoryStub, planCompaction } from "./compaction.js";
17
21
  export type { CompactionCandidate, CompactionWrite, CompactionSkip, CompactionPlan, CompactionOptions } from "./compaction.js";
18
22
  export { createMemoryMcpServer } from "./transports/sdk.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMxG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtL,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGjI,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC/F,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjH,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/H,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGjH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvJ,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpJ,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMxG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtL,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGjI,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC/F,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjH,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/H,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGjH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvJ,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpJ,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,10 @@ export { createRecallEmbedder, createEvermindEmbedder, CachedTextEmbedder, defau
15
15
  export { MemoryStoreBackend, createLocalMemoryStoreBackend } from "./backends/memory-store.js";
16
16
  // ── Tool core ─────────────────────────────────────────────────────────────────
17
17
  export { buildMemoryTools } from "./tools.js";
18
+ // ── Experience (demonstrations → Train Once skills → runs → the private model) ─
19
+ // The domain is the engine's; this is its durable host and its tools.
20
+ export { createExperienceHost, EXPERIENCE_ENV } from "./experience/host.js";
21
+ export { nextExperienceVersion } from "./experience/train.js";
18
22
  // ── Compaction (absorbed fact → one-line pointer stub) ───────────────────────
19
23
  // Exported so an EXTERNAL compactor (the BuilderForce VS Code extension rewrites
20
24
  // the snapshot file directly) can produce byte-identical stubs, keeping the two
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,4EAA4E;AAC5E,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGtL,0FAA0F;AAC1F,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAG/F,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,+CAA+C;AAC/C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjH,+EAA+E;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEjH,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvJ,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEjE,qFAAqF;AACrF,4FAA4F;AAC5F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,4EAA4E;AAC5E,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGtL,0FAA0F;AAC1F,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAG/F,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,kFAAkF;AAClF,sEAAsE;AACtE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,+CAA+C;AAC/C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjH,+EAA+E;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEjH,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvJ,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEjE,qFAAqF;AACrF,4FAA4F;AAC5F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/install/install.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAuC,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAmB,KAAK,iBAAiB,EAAwB,MAAM,kBAAkB,CAAC;AAEjG,MAAM,WAAW,MAAM;IACnB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACrD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAsGD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,cAAmB,GAAG,aAAa,EAAE,CAwB9E"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/install/install.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAiD,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAmB,KAAK,iBAAiB,EAAwB,MAAM,kBAAkB,CAAC;AAEjG,MAAM,WAAW,MAAM;IACnB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACrD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAsGD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,cAAmB,GAAG,aAAa,EAAE,CAwB9E"}
@@ -9,7 +9,7 @@
9
9
  import nodeFs from "node:fs";
10
10
  import nodeOs from "node:os";
11
11
  import nodePath from "node:path";
12
- import { HOSTS, SERVER_KEY } from "./hosts.js";
12
+ import { HOSTS, SERVER_KEY, findHost } from "./hosts.js";
13
13
  import { buildServerSpec } from "./server-spec.js";
14
14
  function defaultHostEnv() {
15
15
  return { homedir: nodeOs.homedir(), platform: process.platform, env: process.env };
@@ -88,7 +88,7 @@ function installToml(fs, file, spec) {
88
88
  function resolveHosts(selector, fs, hostEnv) {
89
89
  if (Array.isArray(selector)) {
90
90
  return selector.map((id) => {
91
- const h = HOSTS.find((x) => x.id === id);
91
+ const h = findHost(id);
92
92
  if (!h)
93
93
  throw new Error(`unknown host "${id}" (known: ${HOSTS.map((x) => x.id).join(", ")})`);
94
94
  return h;
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/install/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/install/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Load a local `.evermind` text model and the tokenizer behind its token ids.
3
+ *
4
+ * Two things on a headless host read the person's private model: recall (which
5
+ * embeds with it) and experience training (which adapts it). They must agree on
6
+ * which vocabulary a checkpoint speaks, so the resolution lives here once.
7
+ */
8
+ /** The tokenizer surface both embedding and adaptation need. */
9
+ export interface TextCodec {
10
+ encode(text: string): number[];
11
+ }
12
+ /** Structural view of the engine's package — enough to embed with or adapt. */
13
+ export interface EvermindPackageLike {
14
+ manifest: {
15
+ modelType?: string;
16
+ version?: string;
17
+ name?: string;
18
+ };
19
+ checkpoint: ArrayBuffer;
20
+ loadLM(): unknown;
21
+ /** Present on engines that support the embedded-tokenizer section. */
22
+ loadTokenizer?(): TextCodec | null;
23
+ toBlob(): ArrayBuffer;
24
+ }
25
+ export type ModelFs = {
26
+ readFileSync(path: string, enc: "utf8"): string;
27
+ readFileSync(path: string): Uint8Array;
28
+ writeFileSync(path: string, data: string | Uint8Array): void;
29
+ existsSync(path: string): boolean;
30
+ copyFileSync(src: string, dest: string): void;
31
+ renameSync(from: string, to: string): void;
32
+ };
33
+ export interface LoadedEvermind {
34
+ pkg: EvermindPackageLike;
35
+ codec: TextCodec;
36
+ fs: ModelFs;
37
+ }
38
+ /**
39
+ * The version in a `.evermind` file's manifest, reading only the header and manifest —
40
+ * never the checkpoint — so a caller can ask on every poll, and always sees the file
41
+ * as it is now (a model restored from `.prev` keeps the size and, on Windows, the
42
+ * modification time of the one it replaces). Null when there is no readable package.
43
+ */
44
+ export declare function readEvermindVersion(modelFile: string): Promise<string | null>;
45
+ /**
46
+ * The `evermind-lm` package at `modelFile` with its tokenizer, or `null` — never a
47
+ * throw — when the engine peer is absent, a file is missing, or the package is not a
48
+ * text LM. Both callers treat a missing model as a degrade, not a fault.
49
+ *
50
+ * Tokenizer resolution: the package's OWN tokenizer (checksummed and vocab-checked
51
+ * at package time, so it cannot be the wrong vocabulary — which a separate file
52
+ * silently can be), then `tokenizerFile`, then a sibling `<modelFile>.tokenizer.json`.
53
+ */
54
+ export declare function loadEvermindPackage(modelFile: string, tokenizerFile?: string): Promise<LoadedEvermind | null>;
55
+ //# sourceMappingURL=evermind-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evermind-package.d.ts","sourceRoot":"","sources":["../../src/model/evermind-package.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAClC;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,UAAU,EAAE,WAAW,CAAC;IACxB,MAAM,IAAI,OAAO,CAAC;IAClB,sEAAsE;IACtE,aAAa,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC;IACnC,MAAM,IAAI,WAAW,CAAC;CACzB;AAaD,MAAM,MAAM,OAAO,GAAG;IAClB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,mBAAmB,CAAC;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;CACf;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBnF;AAcD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqBnH"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Load a local `.evermind` text model and the tokenizer behind its token ids.
3
+ *
4
+ * Two things on a headless host read the person's private model: recall (which
5
+ * embeds with it) and experience training (which adapts it). They must agree on
6
+ * which vocabulary a checkpoint speaks, so the resolution lives here once.
7
+ */
8
+ import { dynamicImport } from "../dynamic-import.js";
9
+ /**
10
+ * The version in a `.evermind` file's manifest, reading only the header and manifest —
11
+ * never the checkpoint — so a caller can ask on every poll, and always sees the file
12
+ * as it is now (a model restored from `.prev` keeps the size and, on Windows, the
13
+ * modification time of the one it replaces). Null when there is no readable package.
14
+ */
15
+ export async function readEvermindVersion(modelFile) {
16
+ let fd;
17
+ const fs = (await dynamicImport("node:fs"));
18
+ try {
19
+ const engine = (await dynamicImport("@seanhogg/builderforce-memory-engine"));
20
+ if (!engine?.EvermindModelPackage || !engine.PACKAGE_HEADER_BYTES)
21
+ return null;
22
+ fd = fs.openSync(modelFile, "r");
23
+ const read = (n) => {
24
+ const buf = new Uint8Array(n);
25
+ const got = fs.readSync(fd, buf, 0, n, 0);
26
+ return buf.buffer.slice(0, got);
27
+ };
28
+ const end = engine.EvermindModelPackage.manifestEnd(read(engine.PACKAGE_HEADER_BYTES));
29
+ return engine.EvermindModelPackage.readManifest(read(end)).version ?? "0";
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ finally {
35
+ if (fd !== undefined)
36
+ fs.closeSync(fd);
37
+ }
38
+ }
39
+ /**
40
+ * Load the tokenizer spec from `file`, accepting either `BPETokenizer.toObject()`
41
+ * output or a Hugging Face `tokenizer.json`.
42
+ */
43
+ function loadCodec(engine, fs, file) {
44
+ const spec = JSON.parse(fs.readFileSync(file, "utf8"));
45
+ const tok = new engine.BPETokenizer();
46
+ if (spec.vocab && spec.merges)
47
+ tok.loadFromSpec(spec);
48
+ else
49
+ tok.loadHuggingFace(spec);
50
+ return tok;
51
+ }
52
+ /**
53
+ * The `evermind-lm` package at `modelFile` with its tokenizer, or `null` — never a
54
+ * throw — when the engine peer is absent, a file is missing, or the package is not a
55
+ * text LM. Both callers treat a missing model as a degrade, not a fault.
56
+ *
57
+ * Tokenizer resolution: the package's OWN tokenizer (checksummed and vocab-checked
58
+ * at package time, so it cannot be the wrong vocabulary — which a separate file
59
+ * silently can be), then `tokenizerFile`, then a sibling `<modelFile>.tokenizer.json`.
60
+ */
61
+ export async function loadEvermindPackage(modelFile, tokenizerFile) {
62
+ try {
63
+ const engine = (await dynamicImport("@seanhogg/builderforce-memory-engine"));
64
+ if (!engine?.EvermindModelPackage || !engine.BPETokenizer)
65
+ return null;
66
+ const fs = (await dynamicImport("node:fs"));
67
+ if (!fs.existsSync(modelFile))
68
+ return null;
69
+ const bytes = fs.readFileSync(modelFile);
70
+ const blob = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
71
+ const pkg = engine.EvermindModelPackage.fromBlob(blob);
72
+ if (pkg.manifest.modelType !== "evermind-lm")
73
+ return null;
74
+ const embedded = pkg.loadTokenizer?.() ?? null;
75
+ if (embedded)
76
+ return { pkg, codec: embedded, fs };
77
+ const file = tokenizerFile ?? `${modelFile}.tokenizer.json`;
78
+ if (!fs.existsSync(file))
79
+ return null;
80
+ return { pkg, codec: loadCodec(engine, fs, file), fs };
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ //# sourceMappingURL=evermind-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evermind-package.js","sourceRoot":"","sources":["../../src/model/evermind-package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * A JSON file several processes share — the durable tier of every local store here.
3
+ *
4
+ * Each MCP client spawns its own server, and other tools (the BuilderForce VS Code
5
+ * extension's compactor, Synapse) rewrite the same files directly. So a store never
6
+ * trusts its in-memory copy blindly: before each operation it asks
7
+ * {@link SharedJsonFile.readIfChanged}, which re-reads the file only when it changed
8
+ * underneath this process.
9
+ *
10
+ * The loop guard is the stamp recorded immediately AFTER each of our own writes: the
11
+ * next check stats the file, sees the same mtime+size, and returns without reading a
12
+ * byte. A stat per call is the entire steady-state cost.
13
+ */
14
+ export type SharedFileFs = {
15
+ readFileSync(path: string, enc: "utf8"): string;
16
+ writeFileSync(path: string, data: string): void;
17
+ /** When present, writes land atomically (temp file + rename). */
18
+ renameSync?(from: string, to: string): void;
19
+ unlinkSync?(path: string): void;
20
+ existsSync(path: string): boolean;
21
+ statSync(path: string): {
22
+ mtimeMs: number;
23
+ size: number;
24
+ };
25
+ };
26
+ /**
27
+ * FNV-1a over the file text. Non-cryptographic on purpose: this only has to separate
28
+ * "someone rewrote the file" from "the mtime moved but the bytes are ours", and
29
+ * node:crypto is deliberately not imported (these modules stay bundleable for the
30
+ * browser, where the disk path is never taken).
31
+ */
32
+ export declare function contentHash(text: string): string;
33
+ /** A changed file's text, and the call that marks it as absorbed. */
34
+ export interface ChangedFile {
35
+ text: string;
36
+ /**
37
+ * Call once the text was parsed and applied. Not calling it (a half-written file
38
+ * that failed to parse) leaves the stamp alone, so the next check reads again.
39
+ */
40
+ accept(): void;
41
+ }
42
+ export declare class SharedJsonFile {
43
+ readonly path: string;
44
+ private readonly fs;
45
+ /** How the file looked when this process last wrote or absorbed it. */
46
+ private stamp;
47
+ constructor(path: string, fs: SharedFileFs);
48
+ /**
49
+ * The file's text when it changed since we last touched it — and on first use,
50
+ * which IS the boot hydration (one routine, so disk and memory never diverge by
51
+ * taking two paths). Null when unchanged, absent or unreadable.
52
+ */
53
+ readIfChanged(): ChangedFile | null;
54
+ /**
55
+ * Write, and stamp our own write so the next check does not read it back as foreign.
56
+ *
57
+ * Atomic where the filesystem allows: the text goes to a sibling temp file that is
58
+ * then renamed over the target, so a crash mid-write leaves the previous complete
59
+ * file, never a truncated one (which would read as empty and be overwritten by the
60
+ * next write). If the rename is refused (Windows, while another process holds the
61
+ * file open), the write falls back to writing in place.
62
+ */
63
+ write(text: string): void;
64
+ }
65
+ //# sourceMappingURL=shared-json-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-json-file.d.ts","sourceRoot":"","sources":["../../src/persistence/shared-json-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,YAAY,GAAG;IACvB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,iEAAiE;IACjE,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D,CAAC;AAUF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,qEAAqE;AACrE,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,IAAI,IAAI,CAAC;CAClB;AAED,qBAAa,cAAc;IAKnB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,EAAE;IALvB,uEAAuE;IACvE,OAAO,CAAC,KAAK,CAA0B;gBAG1B,IAAI,EAAE,MAAM,EACJ,EAAE,EAAE,YAAY;IAGrC;;;;OAIG;IACH,aAAa,IAAI,WAAW,GAAG,IAAI;IAyBnC;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAyB5B"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * A JSON file several processes share — the durable tier of every local store here.
3
+ *
4
+ * Each MCP client spawns its own server, and other tools (the BuilderForce VS Code
5
+ * extension's compactor, Synapse) rewrite the same files directly. So a store never
6
+ * trusts its in-memory copy blindly: before each operation it asks
7
+ * {@link SharedJsonFile.readIfChanged}, which re-reads the file only when it changed
8
+ * underneath this process.
9
+ *
10
+ * The loop guard is the stamp recorded immediately AFTER each of our own writes: the
11
+ * next check stats the file, sees the same mtime+size, and returns without reading a
12
+ * byte. A stat per call is the entire steady-state cost.
13
+ */
14
+ /**
15
+ * FNV-1a over the file text. Non-cryptographic on purpose: this only has to separate
16
+ * "someone rewrote the file" from "the mtime moved but the bytes are ours", and
17
+ * node:crypto is deliberately not imported (these modules stay bundleable for the
18
+ * browser, where the disk path is never taken).
19
+ */
20
+ export function contentHash(text) {
21
+ let h = 0x811c9dc5;
22
+ for (let i = 0; i < text.length; i++) {
23
+ h ^= text.charCodeAt(i);
24
+ h = Math.imul(h, 0x01000193);
25
+ }
26
+ return (h >>> 0).toString(16);
27
+ }
28
+ export class SharedJsonFile {
29
+ path;
30
+ fs;
31
+ /** How the file looked when this process last wrote or absorbed it. */
32
+ stamp = null;
33
+ constructor(path, fs) {
34
+ this.path = path;
35
+ this.fs = fs;
36
+ }
37
+ /**
38
+ * The file's text when it changed since we last touched it — and on first use,
39
+ * which IS the boot hydration (one routine, so disk and memory never diverge by
40
+ * taking two paths). Null when unchanged, absent or unreadable.
41
+ */
42
+ readIfChanged() {
43
+ if (!this.fs.existsSync(this.path))
44
+ return null;
45
+ let st;
46
+ try {
47
+ st = this.fs.statSync(this.path);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ // Fast path: byte-for-byte what we last wrote. No read, no parse.
53
+ if (this.stamp && st.mtimeMs === this.stamp.mtimeMs && st.size === this.stamp.size)
54
+ return null;
55
+ let text;
56
+ try {
57
+ text = this.fs.readFileSync(this.path, "utf8");
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ const hash = contentHash(text);
63
+ // Touched (mtime moved) but identical content — re-stamp, nothing to absorb.
64
+ if (this.stamp && hash === this.stamp.hash) {
65
+ this.stamp = { mtimeMs: st.mtimeMs, size: st.size, hash };
66
+ return null;
67
+ }
68
+ return { text, accept: () => (this.stamp = { mtimeMs: st.mtimeMs, size: st.size, hash }) };
69
+ }
70
+ /**
71
+ * Write, and stamp our own write so the next check does not read it back as foreign.
72
+ *
73
+ * Atomic where the filesystem allows: the text goes to a sibling temp file that is
74
+ * then renamed over the target, so a crash mid-write leaves the previous complete
75
+ * file, never a truncated one (which would read as empty and be overwritten by the
76
+ * next write). If the rename is refused (Windows, while another process holds the
77
+ * file open), the write falls back to writing in place.
78
+ */
79
+ write(text) {
80
+ const rename = this.fs.renameSync?.bind(this.fs);
81
+ let written = false;
82
+ if (rename) {
83
+ const tmp = `${this.path}.${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}.tmp`;
84
+ try {
85
+ this.fs.writeFileSync(tmp, text);
86
+ rename(tmp, this.path);
87
+ written = true;
88
+ }
89
+ catch {
90
+ try {
91
+ if (this.fs.existsSync(tmp))
92
+ this.fs.unlinkSync?.(tmp);
93
+ }
94
+ catch {
95
+ /* best effort: a stray temp file is harmless */
96
+ }
97
+ }
98
+ }
99
+ if (!written)
100
+ this.fs.writeFileSync(this.path, text);
101
+ try {
102
+ const st = this.fs.statSync(this.path);
103
+ this.stamp = { mtimeMs: st.mtimeMs, size: st.size, hash: contentHash(text) };
104
+ }
105
+ catch {
106
+ this.stamp = null;
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=shared-json-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-json-file.js","sourceRoot":"","sources":["../../src/persistence/shared-json-file.ts"],"names":[],"mappings":"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"}