@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.
- package/README.md +25 -0
- package/dist/backends/memory-store.d.ts.map +1 -1
- package/dist/backends/memory-store.js +15 -68
- package/dist/backends/memory-store.js.map +1 -1
- package/dist/bin/http.d.ts +1 -0
- package/dist/bin/http.d.ts.map +1 -1
- package/dist/bin/http.js +9 -0
- package/dist/bin/http.js.map +1 -1
- package/dist/bin/stdio.d.ts +4 -0
- package/dist/bin/stdio.d.ts.map +1 -1
- package/dist/bin/stdio.js +7 -0
- package/dist/bin/stdio.js.map +1 -1
- package/dist/dynamic-import.d.ts +10 -0
- package/dist/dynamic-import.d.ts.map +1 -0
- package/dist/dynamic-import.js +13 -0
- package/dist/dynamic-import.js.map +1 -0
- package/dist/embedding/evermind-embedder.d.ts +0 -1
- package/dist/embedding/evermind-embedder.d.ts.map +1 -1
- package/dist/embedding/evermind-embedder.js +8 -44
- package/dist/embedding/evermind-embedder.js.map +1 -1
- package/dist/experience/file-store.d.ts +52 -0
- package/dist/experience/file-store.d.ts.map +1 -0
- package/dist/experience/file-store.js +119 -0
- package/dist/experience/file-store.js.map +1 -0
- package/dist/experience/host.d.ts +46 -0
- package/dist/experience/host.d.ts.map +1 -0
- package/dist/experience/host.js +57 -0
- package/dist/experience/host.js.map +1 -0
- package/dist/experience/tools.d.ts +16 -0
- package/dist/experience/tools.d.ts.map +1 -0
- package/dist/experience/tools.js +279 -0
- package/dist/experience/tools.js.map +1 -0
- package/dist/experience/train.d.ts +48 -0
- package/dist/experience/train.d.ts.map +1 -0
- package/dist/experience/train.js +72 -0
- package/dist/experience/train.js.map +1 -0
- package/dist/gateway-tools.d.ts +8 -0
- package/dist/gateway-tools.d.ts.map +1 -0
- package/dist/gateway-tools.js +71 -0
- package/dist/gateway-tools.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/install/install.d.ts.map +1 -1
- package/dist/install/install.js +2 -2
- package/dist/install/install.js.map +1 -1
- package/dist/model/evermind-package.d.ts +55 -0
- package/dist/model/evermind-package.d.ts.map +1 -0
- package/dist/model/evermind-package.js +86 -0
- package/dist/model/evermind-package.js.map +1 -0
- package/dist/persistence/shared-json-file.d.ts +65 -0
- package/dist/persistence/shared-json-file.d.ts.map +1 -0
- package/dist/persistence/shared-json-file.js +110 -0
- package/dist/persistence/shared-json-file.js.map +1 -0
- package/dist/tool-core.d.ts +28 -0
- package/dist/tool-core.d.ts.map +1 -0
- package/dist/tool-core.js +19 -0
- package/dist/tool-core.js.map +1 -0
- package/dist/tools.d.ts +9 -17
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -73
- package/dist/tools.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +8 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/sdk.d.ts.map +1 -1
- package/dist/transports/sdk.js +2 -4
- package/dist/transports/sdk.js.map +1 -1
- package/package.json +6 -6
- package/server.json +3 -3
- package/src/backends/memory-store.ts +16 -85
- package/src/bin/http.ts +12 -0
- package/src/bin/stdio.ts +7 -0
- package/src/dynamic-import.ts +12 -0
- package/src/embedding/evermind-embedder.ts +11 -61
- package/src/experience/file-store.ts +143 -0
- package/src/experience/host.ts +113 -0
- package/src/experience/tools.ts +363 -0
- package/src/experience/train.ts +96 -0
- package/src/gateway-tools.ts +97 -0
- package/src/index.ts +8 -1
- package/src/install/install.ts +2 -2
- package/src/model/evermind-package.ts +127 -0
- package/src/persistence/shared-json-file.ts +131 -0
- package/src/tool-core.ts +39 -0
- package/src/tools.ts +13 -116
- package/src/transports/http.ts +8 -1
- package/src/transports/sdk.ts +2 -5
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The framework-neutral tool shape every tool family here is written in (memory,
|
|
3
|
+
* gateway cost, experience), and the result helpers they share. Each transport maps
|
|
4
|
+
* a {@link MemoryTool} 1:1 onto Agent-SDK `tool()` or MCP `registerTool()`.
|
|
5
|
+
*/
|
|
6
|
+
import type { z } from "zod";
|
|
7
|
+
/** The MCP CallToolResult shape both server frameworks expect. */
|
|
8
|
+
export interface ToolResult {
|
|
9
|
+
content: Array<{
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}>;
|
|
13
|
+
isError?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** A framework-neutral tool: maps 1:1 onto Agent-SDK `tool()` and MCP `registerTool()`. */
|
|
16
|
+
export interface MemoryTool {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
/** Zod *raw shape* (e.g. `{ query: z.string() }`), not a ZodObject. */
|
|
20
|
+
inputSchema: z.ZodRawShape;
|
|
21
|
+
handler: (args: Record<string, unknown>) => Promise<ToolResult>;
|
|
22
|
+
}
|
|
23
|
+
export declare function clip(s: string, n: number): string;
|
|
24
|
+
export declare function ok(text: string): ToolResult;
|
|
25
|
+
export declare function fail(text: string): ToolResult;
|
|
26
|
+
/** A structured result, as indented JSON — for tools a program reads as well as a model. */
|
|
27
|
+
export declare function okJson(value: unknown): ToolResult;
|
|
28
|
+
//# sourceMappingURL=tool-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-core.d.ts","sourceRoot":"","sources":["../src/tool-core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACnE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAE7C;AAED,4FAA4F;AAC5F,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAEjD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The framework-neutral tool shape every tool family here is written in (memory,
|
|
3
|
+
* gateway cost, experience), and the result helpers they share. Each transport maps
|
|
4
|
+
* a {@link MemoryTool} 1:1 onto Agent-SDK `tool()` or MCP `registerTool()`.
|
|
5
|
+
*/
|
|
6
|
+
export function clip(s, n) {
|
|
7
|
+
return s.length <= n ? s : `${s.slice(0, n)}…`;
|
|
8
|
+
}
|
|
9
|
+
export function ok(text) {
|
|
10
|
+
return { content: [{ type: "text", text }] };
|
|
11
|
+
}
|
|
12
|
+
export function fail(text) {
|
|
13
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
14
|
+
}
|
|
15
|
+
/** A structured result, as indented JSON — for tools a program reads as well as a model. */
|
|
16
|
+
export function okJson(value) {
|
|
17
|
+
return ok(JSON.stringify(value, null, 2));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tool-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-core.js","sourceRoot":"","sources":["../src/tool-core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAY;IAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,MAAM,CAAC,KAAc;IACjC,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -13,24 +13,10 @@
|
|
|
13
13
|
* prompt only saves tokens if recall is selective — a tool that dumps the whole
|
|
14
14
|
* store back into context is more expensive than inlining it.
|
|
15
15
|
*/
|
|
16
|
-
import { z } from "zod";
|
|
17
16
|
import type { MemoryBackend } from "./backend.js";
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
type: "text";
|
|
22
|
-
text: string;
|
|
23
|
-
}>;
|
|
24
|
-
isError?: boolean;
|
|
25
|
-
}
|
|
26
|
-
/** A framework-neutral tool: maps 1:1 onto Agent-SDK `tool()` and MCP `registerTool()`. */
|
|
27
|
-
export interface MemoryTool {
|
|
28
|
-
name: string;
|
|
29
|
-
description: string;
|
|
30
|
-
/** Zod *raw shape* (e.g. `{ query: z.string() }`), not a ZodObject. */
|
|
31
|
-
inputSchema: z.ZodRawShape;
|
|
32
|
-
handler: (args: Record<string, unknown>) => Promise<ToolResult>;
|
|
33
|
-
}
|
|
17
|
+
import type { ExperienceHost } from "./experience/host.js";
|
|
18
|
+
import { type MemoryTool } from "./tool-core.js";
|
|
19
|
+
export type { MemoryTool, ToolResult } from "./tool-core.js";
|
|
34
20
|
export interface MemoryToolsOptions {
|
|
35
21
|
/** Hard cap on entries any recall tool returns to the model. Default 5. */
|
|
36
22
|
maxResults?: number;
|
|
@@ -45,6 +31,12 @@ export interface MemoryToolsOptions {
|
|
|
45
31
|
gatewayUrl?: string;
|
|
46
32
|
/** A `bfk_*` tenant API key. Required (with {@link gatewayUrl}) for cost tools. */
|
|
47
33
|
gatewayApiKey?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Experience (demonstrations, Train Once skills, runs, training the private model).
|
|
36
|
+
* When present and the server is writable, the experience tools are registered
|
|
37
|
+
* beside the memory tools. See {@link createExperienceHost}.
|
|
38
|
+
*/
|
|
39
|
+
experience?: ExperienceHost | null;
|
|
48
40
|
}
|
|
49
41
|
/**
|
|
50
42
|
* Builds the memory tool set bound to `backend`. Write tools are included only
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAwD,MAAM,cAAc,CAAC;AAGxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAkB,KAAK,UAAU,EAAmB,MAAM,gBAAgB,CAAC;AAElF,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IAC/B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACtC;AA2DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,GAAE,kBAAuB,GAAG,UAAU,EAAE,CAiOpG"}
|
package/dist/tools.js
CHANGED
|
@@ -15,17 +15,11 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { z } from "zod";
|
|
17
17
|
import { DEFAULT_STUB_CHARS, planCompaction } from "./compaction.js";
|
|
18
|
+
import { buildExperienceTools } from "./experience/tools.js";
|
|
19
|
+
import { appendGatewayCostTools } from "./gateway-tools.js";
|
|
20
|
+
import { clip, fail, ok } from "./tool-core.js";
|
|
18
21
|
const DEFAULT_MAX_RESULTS = 5;
|
|
19
22
|
const DEFAULT_MAX_CONTENT = 500;
|
|
20
|
-
function clip(s, n) {
|
|
21
|
-
return s.length <= n ? s : `${s.slice(0, n)}…`;
|
|
22
|
-
}
|
|
23
|
-
function ok(text) {
|
|
24
|
-
return { content: [{ type: "text", text }] };
|
|
25
|
-
}
|
|
26
|
-
function fail(text) {
|
|
27
|
-
return { content: [{ type: "text", text }], isError: true };
|
|
28
|
-
}
|
|
29
23
|
/**
|
|
30
24
|
* How the ordering was produced, in one line the model can read.
|
|
31
25
|
*
|
|
@@ -292,6 +286,8 @@ export function buildMemoryTools(backend, opts = {}) {
|
|
|
292
286
|
},
|
|
293
287
|
});
|
|
294
288
|
}
|
|
289
|
+
if (writable && opts.experience)
|
|
290
|
+
tools.push(...buildExperienceTools(opts.experience));
|
|
295
291
|
// Gateway-backed cost tools — only when BOTH a gateway URL and key are
|
|
296
292
|
// present, so memory-only deployments are unchanged.
|
|
297
293
|
if (opts.gatewayUrl && opts.gatewayApiKey) {
|
|
@@ -299,68 +295,4 @@ export function buildMemoryTools(backend, opts = {}) {
|
|
|
299
295
|
}
|
|
300
296
|
return tools;
|
|
301
297
|
}
|
|
302
|
-
async function gatewayGet(gatewayUrl, path, apiKey) {
|
|
303
|
-
const res = await fetch(`${gatewayUrl}${path}`, {
|
|
304
|
-
headers: { authorization: `Bearer ${apiKey}` },
|
|
305
|
-
});
|
|
306
|
-
if (!res.ok)
|
|
307
|
-
throw new Error(`gateway ${path} → HTTP ${res.status}`);
|
|
308
|
-
return (await res.json());
|
|
309
|
-
}
|
|
310
|
-
function appendGatewayCostTools(tools, gatewayUrl, apiKey) {
|
|
311
|
-
tools.push({
|
|
312
|
-
name: "token_usage",
|
|
313
|
-
description: "Current token spend + budget for the workspace (today).",
|
|
314
|
-
inputSchema: {},
|
|
315
|
-
handler: async () => {
|
|
316
|
-
try {
|
|
317
|
-
const s = await gatewayGet(gatewayUrl, "/llm/v1/builder-insights", apiKey);
|
|
318
|
-
const lines = [
|
|
319
|
-
`Token usage (${s.windowLabel ?? "today"}):`,
|
|
320
|
-
`• Tokens: ${(s.todayTokens ?? 0).toLocaleString()}`,
|
|
321
|
-
`• Cost: $${(s.todayCostUsd ?? 0).toFixed(2)}`,
|
|
322
|
-
`• % of daily cap: ${s.pctOfDailyCap == null
|
|
323
|
-
? "no cap"
|
|
324
|
-
: `${s.pctOfDailyCap}%${s.dailyCapTokens ? ` of ${s.dailyCapTokens.toLocaleString()}` : ""}`}`,
|
|
325
|
-
`• Top model: ${s.topModel ? `${s.topModel.model} (${s.topModel.tokens.toLocaleString()} tok)` : "—"}`,
|
|
326
|
-
];
|
|
327
|
-
if (s.costPerMergedPrUsd != null)
|
|
328
|
-
lines.push(`• Cost / merged PR: $${s.costPerMergedPrUsd.toFixed(2)}`);
|
|
329
|
-
if (s.tip)
|
|
330
|
-
lines.push(`• Tip: ${s.tip}`);
|
|
331
|
-
return ok(lines.join("\n"));
|
|
332
|
-
}
|
|
333
|
-
catch (err) {
|
|
334
|
-
return fail(`token_usage failed: ${String(err)}`);
|
|
335
|
-
}
|
|
336
|
-
},
|
|
337
|
-
});
|
|
338
|
-
tools.push({
|
|
339
|
-
name: "model_efficiency",
|
|
340
|
-
description: "Which models performed best/cheapest for this workspace's recent work.",
|
|
341
|
-
inputSchema: {},
|
|
342
|
-
handler: async () => {
|
|
343
|
-
try {
|
|
344
|
-
const a = await gatewayGet(gatewayUrl, "/llm/v1/model-analytics", apiKey);
|
|
345
|
-
const groups = a.byAction ?? [];
|
|
346
|
-
if (groups.length === 0)
|
|
347
|
-
return ok("No model efficiency data yet for this workspace.");
|
|
348
|
-
const out = ["Model efficiency by action type (best first):"];
|
|
349
|
-
for (const g of groups) {
|
|
350
|
-
out.push(`\n${g.label ?? g.actionType ?? "action"}:`);
|
|
351
|
-
for (const m of (g.models ?? []).slice(0, 3)) {
|
|
352
|
-
const cost = m.avgCostMillicents != null ? ` $${(m.avgCostMillicents / 100_000).toFixed(4)}/call` : "";
|
|
353
|
-
const merge = m.mergeRate != null ? ` merge=${Math.round(m.mergeRate * 100)}%` : "";
|
|
354
|
-
const score = m.avgScore != null ? ` score=${m.avgScore}` : "";
|
|
355
|
-
out.push(` • ${m.model}${score}${merge}${cost} (n=${m.samples ?? 0})`);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
return ok(out.join("\n"));
|
|
359
|
-
}
|
|
360
|
-
catch (err) {
|
|
361
|
-
return fail(`model_efficiency failed: ${String(err)}`);
|
|
362
|
-
}
|
|
363
|
-
},
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
298
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IACxD;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACnG,6EAA6E;IAC7E,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAcD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACnC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC9B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxE,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IACxD;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACnG,6EAA6E;IAC7E,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAcD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACnC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,kBAAuB,GAC9B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAgE9D"}
|
package/dist/transports/http.js
CHANGED
|
@@ -53,6 +53,8 @@ export function createMemoryHttpHandler(backend, opts = {}) {
|
|
|
53
53
|
// ── Resolve the per-request backend + a rate-limit key ────────────────
|
|
54
54
|
let resolved;
|
|
55
55
|
let rateKey;
|
|
56
|
+
// True only when the caller proved the owner's shared secret (see below).
|
|
57
|
+
let ownerAuthed = false;
|
|
56
58
|
if (tenantIndex) {
|
|
57
59
|
// Multi-tenant: token → that tenant's backend (hash-keyed lookup).
|
|
58
60
|
if (!token) {
|
|
@@ -86,6 +88,7 @@ export function createMemoryHttpHandler(backend, opts = {}) {
|
|
|
86
88
|
}
|
|
87
89
|
resolved = backend;
|
|
88
90
|
rateKey = `t:${hashToken(token)}`;
|
|
91
|
+
ownerAuthed = true;
|
|
89
92
|
}
|
|
90
93
|
else {
|
|
91
94
|
// Open (trusted gateway): rate-limit by client IP.
|
|
@@ -97,7 +100,11 @@ export function createMemoryHttpHandler(backend, opts = {}) {
|
|
|
97
100
|
send(res, 429, { error: "rate_limited" });
|
|
98
101
|
return;
|
|
99
102
|
}
|
|
100
|
-
|
|
103
|
+
// Experience is ONE person's local store (it can delete their recordings and
|
|
104
|
+
// rewrite their model), so it is served only to a caller holding the owner's
|
|
105
|
+
// shared secret — never to a token-selected tenant, and never in open mode,
|
|
106
|
+
// where anyone who can reach the port would get it.
|
|
107
|
+
const server = buildMcpServer(resolved, ownerAuthed ? opts : { ...opts, experience: null });
|
|
101
108
|
// Stateless: no session id generator → a fresh transport per request.
|
|
102
109
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
103
110
|
res.on("close", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA2BtG,SAAS,IAAI,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAC5D,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,sEAAsE;AACtE,SAAS,QAAQ,CAAC,GAAoB;IAClC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACnC,OAAsB,EACtB,OAA2B,EAAE;IAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;QAC1B,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAExD,yEAAyE;QACzE,IAAI,QAAmC,CAAC;QACxC,IAAI,OAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/transports/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/transports/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IACxD,2GAA2G;IAC3G,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,qBAAqB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,gBAAqB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAoB7B"}
|
package/dist/transports/sdk.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* The Agent SDK is imported indirectly so this package builds and so the stdio
|
|
11
11
|
* and HTTP transports don't drag the SDK in.
|
|
12
12
|
*/
|
|
13
|
+
import { dynamicImport } from "../dynamic-import.js";
|
|
13
14
|
import { buildMemoryTools } from "../tools.js";
|
|
14
15
|
/**
|
|
15
16
|
* Wraps the memory tools as an in-process Claude Agent SDK MCP server.
|
|
@@ -30,10 +31,7 @@ import { buildMemoryTools } from "../tools.js";
|
|
|
30
31
|
* })) { /* ... *\/ }
|
|
31
32
|
*/
|
|
32
33
|
export async function createMemoryMcpServer(backend, opts = {}) {
|
|
33
|
-
const
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
|
|
35
|
-
new Function("m", "return import(m)")(m);
|
|
36
|
-
const sdk = (await _import("@anthropic-ai/claude-agent-sdk"));
|
|
34
|
+
const sdk = (await dynamicImport("@anthropic-ai/claude-agent-sdk"));
|
|
37
35
|
const tools = buildMemoryTools(backend, opts).map((t) => sdk.tool(t.name, t.description, t.inputSchema, t.handler));
|
|
38
36
|
return sdk.createSdkMcpServer({
|
|
39
37
|
name: opts.name ?? "builderforce_memory",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/transports/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAexE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,OAAsB,EACtB,OAAyB,EAAE;IAE3B,MAAM,
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/transports/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAexE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,OAAsB,EACtB,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,CAAC,MAAM,aAAa,CAAC,gCAAgC,CAAC,CAQjE,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAA2D,CAAC,CAChH,CAAC;IAEF,OAAO,GAAG,CAAC,kBAAkB,CAAC;QAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,qBAAqB;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;QACpC,KAAK;KACR,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanhogg/builderforce-memory-mcp",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.30",
|
|
4
4
|
"mcpName": "io.github.SeanHogg/builderforce-memory",
|
|
5
5
|
"description": "BuilderForce Agent Memory — MCP transport. Exposes @seanhogg/builderforce-memory to any MCP client (Claude Agent SDK in-process, stdio, or HTTP) over a pluggable MemoryBackend, with token-saving fetch-on-demand recall.",
|
|
6
6
|
"type": "module",
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@anthropic-ai/claude-agent-sdk": ">=0.1.0",
|
|
59
|
-
"@seanhogg/builderforce-memory": "^2026.9.
|
|
60
|
-
"@seanhogg/builderforce-memory-engine": "^2026.9.
|
|
59
|
+
"@seanhogg/builderforce-memory": "^2026.9.30",
|
|
60
|
+
"@seanhogg/builderforce-memory-engine": "^2026.9.30",
|
|
61
61
|
"fake-indexeddb": "^6.0.0"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"fake-indexeddb": "^6.0.0",
|
|
84
84
|
"typescript": "^6.0.3",
|
|
85
85
|
"@typescript/native-preview": "7.0.0-dev.20260627.2",
|
|
86
|
-
"@seanhogg/builderforce-memory
|
|
87
|
-
"@seanhogg/builderforce-memory": "2026.9.
|
|
86
|
+
"@seanhogg/builderforce-memory": "2026.9.30",
|
|
87
|
+
"@seanhogg/builderforce-memory-engine": "2026.9.30"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": ">=18.0.0"
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
},
|
|
95
95
|
"scripts": {
|
|
96
96
|
"build": "tsc",
|
|
97
|
-
"test": "tsc && node --test tests/install.test.mjs tests/tools.test.mjs tests/http.test.mjs tests/compaction.test.mjs tests/recall-method.test.mjs",
|
|
97
|
+
"test": "tsc && node --test tests/install.test.mjs tests/tools.test.mjs tests/http.test.mjs tests/compaction.test.mjs tests/recall-method.test.mjs tests/experience.test.mjs",
|
|
98
98
|
"lint": "eslint src/",
|
|
99
99
|
"typecheck:native": "tsgo --noEmit"
|
|
100
100
|
}
|
package/server.json
CHANGED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.SeanHogg/builderforce-memory",
|
|
4
4
|
"title": "Builderforce Memory",
|
|
5
|
-
"description": "Token-saving persistent memory for AI agents
|
|
5
|
+
"description": "Token-saving persistent memory for AI agents: recall durable facts instead of re-reading files.",
|
|
6
6
|
"repository": {
|
|
7
7
|
"url": "https://github.com/SeanHogg/builderforce-memory",
|
|
8
8
|
"source": "github",
|
|
9
9
|
"subfolder": "packages/memory-mcp"
|
|
10
10
|
},
|
|
11
|
-
"version": "2026.9.
|
|
11
|
+
"version": "2026.9.30",
|
|
12
12
|
"websiteUrl": "https://builderforce.ai",
|
|
13
13
|
"packages": [
|
|
14
14
|
{
|
|
15
15
|
"registryType": "npm",
|
|
16
16
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
17
17
|
"identifier": "@seanhogg/builderforce-memory-mcp",
|
|
18
|
-
"version": "2026.9.
|
|
18
|
+
"version": "2026.9.30",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
21
21
|
},
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import type { MemoryBackend, RankedRecall, RecallHit, RememberInput } from "../backend.js";
|
|
18
|
+
import { dynamicImport } from "../dynamic-import.js";
|
|
19
|
+
import { SharedJsonFile, type SharedFileFs } from "../persistence/shared-json-file.js";
|
|
18
20
|
|
|
19
21
|
// Structural views of the @seanhogg/builderforce-memory surface we use, so this package
|
|
20
22
|
// type-checks without a hard dependency on the runtime package.
|
|
@@ -133,38 +135,9 @@ interface SnapshotEntry {
|
|
|
133
135
|
importance?: number;
|
|
134
136
|
}
|
|
135
137
|
|
|
136
|
-
type FsLike = {
|
|
137
|
-
readFileSync(path: string, enc: "utf8"): string;
|
|
138
|
-
writeFileSync(path: string, data: string): void;
|
|
139
|
-
mkdirSync(path: string, opts: { recursive: boolean }): void;
|
|
140
|
-
existsSync(path: string): boolean;
|
|
141
|
-
statSync(path: string): { mtimeMs: number; size: number };
|
|
142
|
-
};
|
|
138
|
+
type FsLike = SharedFileFs & { mkdirSync(path: string, opts: { recursive: boolean }): void };
|
|
143
139
|
type PathLike = { dirname(p: string): string };
|
|
144
140
|
|
|
145
|
-
/** Identity of the snapshot file as this process last left it. */
|
|
146
|
-
interface FileStamp {
|
|
147
|
-
mtimeMs: number;
|
|
148
|
-
size: number;
|
|
149
|
-
/** Digest of the exact bytes — settles the case where a file is touched but unchanged. */
|
|
150
|
-
hash: string;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* FNV-1a over the snapshot text. Non-cryptographic on purpose: this only has to
|
|
155
|
-
* separate "someone rewrote the file" from "the mtime moved but the bytes are
|
|
156
|
-
* ours", and node:crypto is deliberately not imported here (this module must stay
|
|
157
|
-
* bundleable for the browser, where the disk path is never taken).
|
|
158
|
-
*/
|
|
159
|
-
function contentHash(text: string): string {
|
|
160
|
-
let h = 0x811c9dc5;
|
|
161
|
-
for (let i = 0; i < text.length; i++) {
|
|
162
|
-
h ^= text.charCodeAt(i);
|
|
163
|
-
h = Math.imul(h, 0x01000193);
|
|
164
|
-
}
|
|
165
|
-
return (h >>> 0).toString(16);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
141
|
/** Parse a snapshot's text into its durable entries, or null when unusable. */
|
|
169
142
|
function parseSnapshot(text: string): SnapshotEntry[] | null {
|
|
170
143
|
let parsed: unknown;
|
|
@@ -194,19 +167,14 @@ function parseSnapshot(text: string): SnapshotEntry[] | null {
|
|
|
194
167
|
* {@link DiskPersistedBackend.ensureFresh}, which re-hydrates the store from disk
|
|
195
168
|
* when — and only when — the file changed underneath us.
|
|
196
169
|
*
|
|
197
|
-
* The loop guard
|
|
198
|
-
*
|
|
199
|
-
* without reading a byte. A stat per call is the entire steady-state cost.
|
|
170
|
+
* The freshness check and the loop guard are {@link SharedJsonFile}'s — the one
|
|
171
|
+
* implementation every shared local store (memory, experience) uses.
|
|
200
172
|
*/
|
|
201
173
|
class DiskPersistedBackend implements MemoryBackend {
|
|
202
|
-
/** How the file looked when this process last wrote or read it. */
|
|
203
|
-
private stamp: FileStamp | null = null;
|
|
204
|
-
|
|
205
174
|
constructor(
|
|
206
175
|
private readonly inner: MemoryStoreBackend,
|
|
207
176
|
private readonly store: MemoryStoreLike,
|
|
208
|
-
private readonly file:
|
|
209
|
-
private readonly fs: FsLike,
|
|
177
|
+
private readonly file: SharedJsonFile,
|
|
210
178
|
) {}
|
|
211
179
|
|
|
212
180
|
async recall(query: string, topK: number): Promise<RecallHit[]> {
|
|
@@ -252,38 +220,15 @@ class DiskPersistedBackend implements MemoryBackend {
|
|
|
252
220
|
* two different paths.
|
|
253
221
|
*/
|
|
254
222
|
async ensureFresh(): Promise<void> {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
try {
|
|
259
|
-
st = this.fs.statSync(this.file);
|
|
260
|
-
} catch {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
// Fast path: byte-for-byte what we last wrote. No read, no parse, no writes.
|
|
264
|
-
if (this.stamp && st.mtimeMs === this.stamp.mtimeMs && st.size === this.stamp.size) return;
|
|
265
|
-
|
|
266
|
-
let text: string;
|
|
267
|
-
try {
|
|
268
|
-
text = this.fs.readFileSync(this.file, "utf8");
|
|
269
|
-
} catch {
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
const hash = contentHash(text);
|
|
273
|
-
// Touched (mtime moved) but identical content — re-stamp, don't re-hydrate.
|
|
274
|
-
if (this.stamp && hash === this.stamp.hash) {
|
|
275
|
-
this.stamp = { mtimeMs: st.mtimeMs, size: st.size, hash };
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
const entries = parseSnapshot(text);
|
|
223
|
+
const changed = this.file.readIfChanged();
|
|
224
|
+
if (!changed) return;
|
|
225
|
+
const entries = parseSnapshot(changed.text);
|
|
280
226
|
// Corrupt/partial snapshot (a half-written file, say): keep what we have
|
|
281
227
|
// rather than wiping the live store, and leave the stamp alone so the next
|
|
282
228
|
// call re-checks.
|
|
283
229
|
if (!entries) return;
|
|
284
|
-
|
|
285
230
|
await this.replaceStore(entries);
|
|
286
|
-
|
|
231
|
+
changed.accept();
|
|
287
232
|
}
|
|
288
233
|
|
|
289
234
|
/**
|
|
@@ -310,16 +255,7 @@ class DiskPersistedBackend implements MemoryBackend {
|
|
|
310
255
|
tags: e.tags,
|
|
311
256
|
importance: e.importance,
|
|
312
257
|
}));
|
|
313
|
-
|
|
314
|
-
this.fs.writeFileSync(this.file, json);
|
|
315
|
-
// Stamp OUR write immediately — this is what stops the watch above from
|
|
316
|
-
// treating our own output as an external edit (and looping).
|
|
317
|
-
try {
|
|
318
|
-
const st = this.fs.statSync(this.file);
|
|
319
|
-
this.stamp = { mtimeMs: st.mtimeMs, size: st.size, hash: contentHash(json) };
|
|
320
|
-
} catch {
|
|
321
|
-
this.stamp = null;
|
|
322
|
-
}
|
|
258
|
+
this.file.write(JSON.stringify(out, null, 2));
|
|
323
259
|
}
|
|
324
260
|
}
|
|
325
261
|
|
|
@@ -330,18 +266,13 @@ class DiskPersistedBackend implements MemoryBackend {
|
|
|
330
266
|
* wants a custom backend (or the HTTP thin-client) never has to install them.
|
|
331
267
|
*/
|
|
332
268
|
export async function createLocalMemoryStoreBackend(opts: LocalBackendOptions = {}): Promise<MemoryBackend> {
|
|
333
|
-
|
|
334
|
-
const _import = (m: string): Promise<unknown> =>
|
|
335
|
-
// eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
|
|
336
|
-
new Function("m", "return import(m)")(m) as Promise<unknown>;
|
|
337
|
-
|
|
338
|
-
const memoryMod = (await _import("@seanhogg/builderforce-memory")) as { MemoryStore: new (o: unknown) => MemoryStoreLike };
|
|
269
|
+
const memoryMod = (await dynamicImport("@seanhogg/builderforce-memory")) as { MemoryStore: new (o: unknown) => MemoryStoreLike };
|
|
339
270
|
const { MemoryStore } = memoryMod;
|
|
340
271
|
|
|
341
272
|
// IndexedDB shim for Node. In the browser the global is used automatically.
|
|
342
273
|
let idbFactory: unknown;
|
|
343
274
|
try {
|
|
344
|
-
const fake = (await
|
|
275
|
+
const fake = (await dynamicImport("fake-indexeddb")) as { IDBFactory: new () => unknown };
|
|
345
276
|
idbFactory = new fake.IDBFactory();
|
|
346
277
|
} catch {
|
|
347
278
|
// Browser or a host that provides global indexedDB — MemoryStore handles it.
|
|
@@ -354,12 +285,12 @@ export async function createLocalMemoryStoreBackend(opts: LocalBackendOptions =
|
|
|
354
285
|
|
|
355
286
|
// Disk-mirror requested. node:fs/path are loaded indirectly so a browser
|
|
356
287
|
// bundle of this module never statically pulls in Node builtins.
|
|
357
|
-
const fs = (await
|
|
358
|
-
const path = (await
|
|
288
|
+
const fs = (await dynamicImport("node:fs")) as FsLike;
|
|
289
|
+
const path = (await dynamicImport("node:path")) as PathLike;
|
|
359
290
|
const dir = path.dirname(opts.persistFile);
|
|
360
291
|
if (dir && !fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
361
292
|
|
|
362
|
-
const persisted = new DiskPersistedBackend(backend, store, opts.persistFile, fs);
|
|
293
|
+
const persisted = new DiskPersistedBackend(backend, store, new SharedJsonFile(opts.persistFile, fs));
|
|
363
294
|
// Boot hydration IS the freshness check with no stamp yet — see ensureFresh().
|
|
364
295
|
await persisted.ensureFresh();
|
|
365
296
|
return persisted;
|
package/src/bin/http.ts
CHANGED
|
@@ -16,11 +16,13 @@
|
|
|
16
16
|
* BUILDERFORCE_MEMORY_VECTORS Persistent vector-cache path.
|
|
17
17
|
* BUILDERFORCE_GATEWAY_URL Gateway base URL (default https://api.builderforce.ai).
|
|
18
18
|
* BUILDERFORCE_API_KEY `bfk_*` tenant key. When set, exposes the cost tools.
|
|
19
|
+
* BUILDERFORCE_MEMORY_EXPERIENCE '1' to expose the experience tools.
|
|
19
20
|
*/
|
|
20
21
|
|
|
21
22
|
import http from "node:http";
|
|
22
23
|
import { createLocalMemoryStoreBackend } from "../backends/memory-store.js";
|
|
23
24
|
import { createRecallEmbedder } from "../embedding/index.js";
|
|
25
|
+
import { createExperienceHost } from "../experience/host.js";
|
|
24
26
|
import { resolveMemoryFile } from "../install/server-spec.js";
|
|
25
27
|
import { createMemoryHttpHandler } from "../transports/http.js";
|
|
26
28
|
|
|
@@ -28,6 +30,9 @@ const memoryFile = resolveMemoryFile();
|
|
|
28
30
|
|
|
29
31
|
const backend = await createLocalMemoryStoreBackend({
|
|
30
32
|
dbName: process.env["BUILDERFORCE_MEMORY_DB"],
|
|
33
|
+
// Durable like the stdio bin — without it every restart of this server lost the
|
|
34
|
+
// store even though BUILDERFORCE_MEMORY_FILE was documented as its snapshot.
|
|
35
|
+
persistFile: memoryFile,
|
|
31
36
|
// Same embedder decision as the stdio bin, from the same helper — the two
|
|
32
37
|
// servers must not rank recall differently.
|
|
33
38
|
runtime: (await createRecallEmbedder({ memoryFile })) ?? undefined,
|
|
@@ -40,8 +45,15 @@ const handler = createMemoryHttpHandler(backend, {
|
|
|
40
45
|
// exposed when an API key is present; URL defaults to the public gateway.
|
|
41
46
|
gatewayUrl: process.env["BUILDERFORCE_GATEWAY_URL"] ?? "https://api.builderforce.ai",
|
|
42
47
|
gatewayApiKey: process.env["BUILDERFORCE_API_KEY"],
|
|
48
|
+
experience: await createExperienceHost({ memoryFile }),
|
|
43
49
|
});
|
|
44
50
|
|
|
51
|
+
if (process.env["BUILDERFORCE_MEMORY_EXPERIENCE"] === "1" && !process.env["BUILDERFORCE_MEMORY_TOKEN"]) {
|
|
52
|
+
process.stderr.write(
|
|
53
|
+
"[builderforce-memory-mcp-http] experience tools stay off: they are served only to callers holding BUILDERFORCE_MEMORY_TOKEN\n",
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
45
57
|
const port = Number(process.env["PORT"] ?? 8787);
|
|
46
58
|
|
|
47
59
|
http.createServer((req, res) => {
|