moltmind 0.1.0
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/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/db.d.ts +45 -0
- package/dist/db.js +381 -0
- package/dist/db.js.map +1 -0
- package/dist/diagnostics.d.ts +25 -0
- package/dist/diagnostics.js +29 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/embeddings.d.ts +14 -0
- package/dist/embeddings.js +91 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +38 -0
- package/dist/metrics.js +105 -0
- package/dist/metrics.js.map +1 -0
- package/dist/tools/mm_delete.d.ts +6 -0
- package/dist/tools/mm_delete.js +9 -0
- package/dist/tools/mm_delete.js.map +1 -0
- package/dist/tools/mm_feedback.d.ts +8 -0
- package/dist/tools/mm_feedback.js +6 -0
- package/dist/tools/mm_feedback.js.map +1 -0
- package/dist/tools/mm_handoff_create.d.ts +9 -0
- package/dist/tools/mm_handoff_create.js +16 -0
- package/dist/tools/mm_handoff_create.js.map +1 -0
- package/dist/tools/mm_handoff_load.d.ts +1 -0
- package/dist/tools/mm_handoff_load.js +9 -0
- package/dist/tools/mm_handoff_load.js.map +1 -0
- package/dist/tools/mm_init.d.ts +5 -0
- package/dist/tools/mm_init.js +6 -0
- package/dist/tools/mm_init.js.map +1 -0
- package/dist/tools/mm_metrics.d.ts +1 -0
- package/dist/tools/mm_metrics.js +6 -0
- package/dist/tools/mm_metrics.js.map +1 -0
- package/dist/tools/mm_read.d.ts +3 -0
- package/dist/tools/mm_read.js +24 -0
- package/dist/tools/mm_read.js.map +1 -0
- package/dist/tools/mm_recall.d.ts +11 -0
- package/dist/tools/mm_recall.js +71 -0
- package/dist/tools/mm_recall.js.map +1 -0
- package/dist/tools/mm_status.d.ts +1 -0
- package/dist/tools/mm_status.js +18 -0
- package/dist/tools/mm_status.js.map +1 -0
- package/dist/tools/mm_store.d.ts +12 -0
- package/dist/tools/mm_store.js +20 -0
- package/dist/tools/mm_store.js.map +1 -0
- package/dist/tools/mm_update.d.ts +10 -0
- package/dist/tools/mm_update.js +42 -0
- package/dist/tools/mm_update.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { env, pipeline } from "@xenova/transformers";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
|
|
5
|
+
const MODEL_DIR = join(homedir(), ".moltmind", "models");
|
|
6
|
+
const LOAD_TIMEOUT_MS = 30_000;
|
|
7
|
+
let extractor = null;
|
|
8
|
+
let modelFailed = false;
|
|
9
|
+
async function loadModel() {
|
|
10
|
+
if (extractor)
|
|
11
|
+
return extractor;
|
|
12
|
+
if (modelFailed)
|
|
13
|
+
return null;
|
|
14
|
+
// Configure cache directory before loading
|
|
15
|
+
env.cacheDir = MODEL_DIR;
|
|
16
|
+
// Disable browser-specific features
|
|
17
|
+
env.allowLocalModels = true;
|
|
18
|
+
env.allowRemoteModels = true;
|
|
19
|
+
try {
|
|
20
|
+
const loadPromise = pipeline("feature-extraction", MODEL_NAME, {
|
|
21
|
+
progress_callback: (progress) => {
|
|
22
|
+
if (progress.status === "download" && progress.file && progress.progress !== undefined) {
|
|
23
|
+
console.error(`MoltMind: downloading ${progress.file} ${Math.round(progress.progress)}%`);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
28
|
+
setTimeout(() => reject(new Error("Model loading timed out")), LOAD_TIMEOUT_MS);
|
|
29
|
+
});
|
|
30
|
+
extractor = await Promise.race([loadPromise, timeoutPromise]);
|
|
31
|
+
return extractor;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
modelFailed = true;
|
|
35
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
36
|
+
console.error(`MoltMind: embedding model failed to load — falling back to FTS5-only search. Error: ${msg}`);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function embed(text) {
|
|
41
|
+
const model = await loadModel();
|
|
42
|
+
if (!model)
|
|
43
|
+
return null;
|
|
44
|
+
const output = await model(text, { pooling: "mean", normalize: true });
|
|
45
|
+
return output.data;
|
|
46
|
+
}
|
|
47
|
+
export function cosineSimilarity(a, b) {
|
|
48
|
+
let dot = 0;
|
|
49
|
+
let normA = 0;
|
|
50
|
+
let normB = 0;
|
|
51
|
+
for (let i = 0; i < a.length; i++) {
|
|
52
|
+
dot += a[i] * b[i];
|
|
53
|
+
normA += a[i] * a[i];
|
|
54
|
+
normB += b[i] * b[i];
|
|
55
|
+
}
|
|
56
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
57
|
+
if (denom === 0)
|
|
58
|
+
return 0;
|
|
59
|
+
return dot / denom;
|
|
60
|
+
}
|
|
61
|
+
export async function semanticSearch(query, memories) {
|
|
62
|
+
const queryEmbedding = await embed(query);
|
|
63
|
+
if (!queryEmbedding)
|
|
64
|
+
return [];
|
|
65
|
+
const results = memories.map((memory) => {
|
|
66
|
+
const memoryEmbedding = bufferToEmbedding(memory.embedding);
|
|
67
|
+
const score = cosineSimilarity(queryEmbedding, memoryEmbedding);
|
|
68
|
+
return { id: memory.id, score };
|
|
69
|
+
});
|
|
70
|
+
results.sort((a, b) => b.score - a.score);
|
|
71
|
+
return results;
|
|
72
|
+
}
|
|
73
|
+
export function embeddingToBuffer(embedding) {
|
|
74
|
+
return Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
|
|
75
|
+
}
|
|
76
|
+
export function bufferToEmbedding(buffer) {
|
|
77
|
+
const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
78
|
+
return new Float32Array(arrayBuffer);
|
|
79
|
+
}
|
|
80
|
+
export function isModelReady() {
|
|
81
|
+
return extractor !== null;
|
|
82
|
+
}
|
|
83
|
+
// Exported for testing — allows resetting internal state
|
|
84
|
+
export function _resetForTesting() {
|
|
85
|
+
extractor = null;
|
|
86
|
+
modelFailed = false;
|
|
87
|
+
}
|
|
88
|
+
export function _setModelFailed() {
|
|
89
|
+
modelFailed = true;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,IAAI,SAAS,GAAqC,IAAI,CAAC;AACvD,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,KAAK,UAAU,SAAS;IACtB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAE7B,2CAA2C;IAC3C,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;IACzB,oCAAoC;IACpC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,QAAQ,CAAC,oBAAoB,EAAE,UAAU,EAAE;YAC7D,iBAAiB,EAAE,CAAC,QAA8D,EAAE,EAAE;gBACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACvF,OAAO,CAAC,KAAK,CAAC,yBAAyB,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAA8B,CAAC;QAC3F,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,GAAG,IAAI,CAAC;QACnB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,uFAAuF,GAAG,EAAE,CAAC,CAAC;QAC5G,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,IAAoB,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,GAAG,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,QAAkD;IAElD,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAuB;IACvD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClG,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,KAAK,IAAI,CAAC;AAC5B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB;IAC9B,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { closeDb } from "./db.js";
|
|
6
|
+
import { withDiagnostics } from "./diagnostics.js";
|
|
7
|
+
import { initMetrics, recordToolCall } from "./metrics.js";
|
|
8
|
+
import { handleMmStore } from "./tools/mm_store.js";
|
|
9
|
+
import { handleMmRecall } from "./tools/mm_recall.js";
|
|
10
|
+
import { handleMmRead } from "./tools/mm_read.js";
|
|
11
|
+
import { handleMmUpdate } from "./tools/mm_update.js";
|
|
12
|
+
import { handleMmDelete } from "./tools/mm_delete.js";
|
|
13
|
+
import { handleMmStatus } from "./tools/mm_status.js";
|
|
14
|
+
import { handleMmInit } from "./tools/mm_init.js";
|
|
15
|
+
import { handleMmHandoffCreate } from "./tools/mm_handoff_create.js";
|
|
16
|
+
import { handleMmHandoffLoad } from "./tools/mm_handoff_load.js";
|
|
17
|
+
import { handleMmFeedback } from "./tools/mm_feedback.js";
|
|
18
|
+
import { handleMmMetrics } from "./tools/mm_metrics.js";
|
|
19
|
+
const server = new McpServer({
|
|
20
|
+
name: "moltmind",
|
|
21
|
+
version: "0.1.0",
|
|
22
|
+
});
|
|
23
|
+
function wrapTool(toolName, handler) {
|
|
24
|
+
return (args) => withDiagnostics(toolName, async () => {
|
|
25
|
+
const result = await handler(args);
|
|
26
|
+
recordToolCall(toolName, result.success !== false);
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// --- Tool Registration ---
|
|
33
|
+
server.tool("mm_store", "Store a memory (learning, error fix, decision, plan, or raw note). Use this whenever you learn something worth remembering across sessions.", {
|
|
34
|
+
title: z.string().max(500).describe("Short title for the memory"),
|
|
35
|
+
content: z.string().max(51200).describe("Full content of the memory"),
|
|
36
|
+
type: z.enum(["learning", "error", "decision", "plan", "raw"]).optional().describe("Memory type classification"),
|
|
37
|
+
tags: z.array(z.string().max(100)).max(20).optional().describe("Tags for categorization"),
|
|
38
|
+
metadata: z.record(z.string(), z.unknown()).optional().describe("Additional metadata"),
|
|
39
|
+
}, wrapTool("mm_store", (args) => handleMmStore(args)));
|
|
40
|
+
server.tool("mm_recall", "Search your memory using natural language. Finds semantically similar memories even if exact words don't match.", {
|
|
41
|
+
query: z.string().max(1000).describe("Natural language search query"),
|
|
42
|
+
limit: z.number().int().min(1).max(500).optional().describe("Max results to return (default 10)"),
|
|
43
|
+
tier: z.enum(["hot", "warm", "cold"]).optional().describe("Filter by memory tier"),
|
|
44
|
+
type: z.enum(["learning", "error", "decision", "plan", "raw"]).optional().describe("Filter by memory type"),
|
|
45
|
+
}, wrapTool("mm_recall", (args) => handleMmRecall(args)));
|
|
46
|
+
server.tool("mm_read", "Read a specific memory by its ID. Returns the full memory with all fields.", {
|
|
47
|
+
id: z.string().describe("The memory ID to read"),
|
|
48
|
+
}, wrapTool("mm_read", (args) => handleMmRead(args)));
|
|
49
|
+
server.tool("mm_update", "Update an existing memory. Only the fields you provide will be changed.", {
|
|
50
|
+
id: z.string().describe("The memory ID to update"),
|
|
51
|
+
title: z.string().max(500).optional().describe("New title"),
|
|
52
|
+
content: z.string().max(51200).optional().describe("New content"),
|
|
53
|
+
type: z.enum(["learning", "error", "decision", "plan", "raw"]).optional().describe("New type"),
|
|
54
|
+
tags: z.array(z.string().max(100)).max(20).optional().describe("New tags"),
|
|
55
|
+
metadata: z.record(z.string(), z.unknown()).optional().describe("New metadata"),
|
|
56
|
+
tier: z.enum(["hot", "warm", "cold", "archived"]).optional().describe("New tier"),
|
|
57
|
+
}, wrapTool("mm_update", (args) => handleMmUpdate(args)));
|
|
58
|
+
server.tool("mm_delete", "Archive a memory (soft delete). The memory is moved to archived tier and won't appear in recall results, but is not permanently removed.", {
|
|
59
|
+
id: z.string().describe("The memory ID to archive"),
|
|
60
|
+
}, wrapTool("mm_delete", (args) => handleMmDelete(args)));
|
|
61
|
+
server.tool("mm_status", "Get MoltMind server status: memory stats, health score, embedding model readiness, and uptime.", {}, wrapTool("mm_status", () => handleMmStatus()));
|
|
62
|
+
server.tool("mm_init", "Initialize a project-local memory vault in the current directory. Creates .moltmind/memory.db for project-specific memories.", {}, wrapTool("mm_init", () => handleMmInit()));
|
|
63
|
+
server.tool("mm_handoff_create", "Create a structured handoff document for agent-to-agent context transfer. Captures goal, state, next steps, and constraints.", {
|
|
64
|
+
goal: z.string().describe("What the next agent should accomplish"),
|
|
65
|
+
current_state: z.string().describe("Where things stand right now"),
|
|
66
|
+
next_action: z.string().describe("The immediate next step to take"),
|
|
67
|
+
constraints: z.array(z.string()).optional().describe("Rules or limitations to respect"),
|
|
68
|
+
known_unknowns: z.array(z.string()).optional().describe("Things that still need investigation"),
|
|
69
|
+
artifacts: z.array(z.string()).optional().describe("Files or resources involved"),
|
|
70
|
+
stop_conditions: z.array(z.string()).optional().describe("When to consider the goal complete"),
|
|
71
|
+
}, wrapTool("mm_handoff_create", (args) => handleMmHandoffCreate(args)));
|
|
72
|
+
server.tool("mm_handoff_load", "Load the most recent handoff to resume context from a previous session or agent.", {}, wrapTool("mm_handoff_load", () => handleMmHandoffLoad()));
|
|
73
|
+
server.tool("mm_feedback", "Report a bug, request a feature, or flag friction with MoltMind. Your feedback directly shapes what gets built next.", {
|
|
74
|
+
type: z.enum(["bug", "feature_request", "friction"]).describe("Feedback type"),
|
|
75
|
+
message: z.string().max(2000).describe("Your feedback message"),
|
|
76
|
+
tool_name: z.string().optional().describe("Which tool the feedback is about"),
|
|
77
|
+
}, wrapTool("mm_feedback", (args) => handleMmFeedback(args)));
|
|
78
|
+
server.tool("mm_metrics", "Get a full adoption and health dashboard: install age, session count, per-tool usage stats, error rates, and feedback summary.", {}, wrapTool("mm_metrics", () => handleMmMetrics()));
|
|
79
|
+
// --- Server lifecycle ---
|
|
80
|
+
function shutdown() {
|
|
81
|
+
console.error("MoltMind shutting down");
|
|
82
|
+
closeDb();
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
async function main() {
|
|
86
|
+
initMetrics();
|
|
87
|
+
const transport = new StdioServerTransport();
|
|
88
|
+
await server.connect(transport);
|
|
89
|
+
process.on("SIGINT", shutdown);
|
|
90
|
+
process.on("SIGTERM", shutdown);
|
|
91
|
+
console.error("MoltMind MCP server started");
|
|
92
|
+
}
|
|
93
|
+
main().catch((error) => {
|
|
94
|
+
console.error("Fatal error:", error);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare function initMetrics(): void;
|
|
2
|
+
export declare function recordToolCall(toolName: string, success: boolean): void;
|
|
3
|
+
export interface FullMetrics {
|
|
4
|
+
adoption: {
|
|
5
|
+
instance_id: string;
|
|
6
|
+
install_age_days: number;
|
|
7
|
+
total_sessions: number;
|
|
8
|
+
first_seen: string;
|
|
9
|
+
last_seen: string;
|
|
10
|
+
};
|
|
11
|
+
health: {
|
|
12
|
+
score: number;
|
|
13
|
+
total_tool_calls: number;
|
|
14
|
+
total_errors: number;
|
|
15
|
+
error_rate_percent: number;
|
|
16
|
+
};
|
|
17
|
+
tool_usage: Record<string, {
|
|
18
|
+
calls: number;
|
|
19
|
+
errors: number;
|
|
20
|
+
error_rate: number;
|
|
21
|
+
avg_latency_ms: number;
|
|
22
|
+
}>;
|
|
23
|
+
top_errors: Array<{
|
|
24
|
+
tool_name: string;
|
|
25
|
+
error_count: number;
|
|
26
|
+
}>;
|
|
27
|
+
feedback_summary: {
|
|
28
|
+
total: number;
|
|
29
|
+
recent: Array<{
|
|
30
|
+
type: string;
|
|
31
|
+
message: string;
|
|
32
|
+
tool_name: string | null;
|
|
33
|
+
created_at: string;
|
|
34
|
+
}>;
|
|
35
|
+
};
|
|
36
|
+
uptime_seconds: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function getFullMetrics(): FullMetrics;
|
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import crypto from "node:crypto";
|
|
5
|
+
import { getMetric, setMetric, getDiagnosticsSummary } from "./db.js";
|
|
6
|
+
import { getHealthScore, getRecentFeedback } from "./diagnostics.js";
|
|
7
|
+
const MOLTMIND_DIR = join(homedir(), ".moltmind");
|
|
8
|
+
const INSTANCE_ID_PATH = join(MOLTMIND_DIR, "instance_id");
|
|
9
|
+
let instanceId = null;
|
|
10
|
+
const startTime = Date.now();
|
|
11
|
+
function getOrCreateInstanceId() {
|
|
12
|
+
if (instanceId)
|
|
13
|
+
return instanceId;
|
|
14
|
+
mkdirSync(MOLTMIND_DIR, { recursive: true });
|
|
15
|
+
if (existsSync(INSTANCE_ID_PATH)) {
|
|
16
|
+
instanceId = readFileSync(INSTANCE_ID_PATH, "utf-8").trim();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
instanceId = crypto.randomUUID();
|
|
20
|
+
writeFileSync(INSTANCE_ID_PATH, instanceId, "utf-8");
|
|
21
|
+
}
|
|
22
|
+
return instanceId;
|
|
23
|
+
}
|
|
24
|
+
export function initMetrics() {
|
|
25
|
+
const id = getOrCreateInstanceId();
|
|
26
|
+
// Set first_seen if not already set
|
|
27
|
+
if (!getMetric("first_seen")) {
|
|
28
|
+
setMetric("first_seen", new Date().toISOString());
|
|
29
|
+
}
|
|
30
|
+
// Increment total_sessions
|
|
31
|
+
const sessions = parseInt(getMetric("total_sessions") ?? "0", 10);
|
|
32
|
+
setMetric("total_sessions", String(sessions + 1));
|
|
33
|
+
// Update last_seen
|
|
34
|
+
setMetric("last_seen", new Date().toISOString());
|
|
35
|
+
console.error(`MoltMind: instance ${id.slice(0, 8)}... session #${sessions + 1}`);
|
|
36
|
+
}
|
|
37
|
+
export function recordToolCall(toolName, success) {
|
|
38
|
+
// Increment total_tool_calls
|
|
39
|
+
const totalCalls = parseInt(getMetric("total_tool_calls") ?? "0", 10);
|
|
40
|
+
setMetric("total_tool_calls", String(totalCalls + 1));
|
|
41
|
+
// Update tool_calls_by_name
|
|
42
|
+
const byName = JSON.parse(getMetric("tool_calls_by_name") ?? "{}");
|
|
43
|
+
byName[toolName] = (byName[toolName] ?? 0) + 1;
|
|
44
|
+
setMetric("tool_calls_by_name", JSON.stringify(byName));
|
|
45
|
+
// Update errors_by_tool if failed
|
|
46
|
+
if (!success) {
|
|
47
|
+
const errorsByTool = JSON.parse(getMetric("errors_by_tool") ?? "{}");
|
|
48
|
+
errorsByTool[toolName] = (errorsByTool[toolName] ?? 0) + 1;
|
|
49
|
+
setMetric("errors_by_tool", JSON.stringify(errorsByTool));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function getFullMetrics() {
|
|
53
|
+
const id = getOrCreateInstanceId();
|
|
54
|
+
const firstSeen = getMetric("first_seen") ?? new Date().toISOString();
|
|
55
|
+
const lastSeen = getMetric("last_seen") ?? new Date().toISOString();
|
|
56
|
+
const totalSessions = parseInt(getMetric("total_sessions") ?? "0", 10);
|
|
57
|
+
const totalToolCalls = parseInt(getMetric("total_tool_calls") ?? "0", 10);
|
|
58
|
+
const errorsByTool = JSON.parse(getMetric("errors_by_tool") ?? "{}");
|
|
59
|
+
const totalErrors = Object.values(errorsByTool).reduce((sum, n) => sum + n, 0);
|
|
60
|
+
const healthScore = getHealthScore();
|
|
61
|
+
// Build tool_usage from diagnostics summary
|
|
62
|
+
const diagSummary = getDiagnosticsSummary();
|
|
63
|
+
const toolUsage = {};
|
|
64
|
+
for (const row of diagSummary) {
|
|
65
|
+
toolUsage[row.tool_name] = {
|
|
66
|
+
calls: row.calls,
|
|
67
|
+
errors: row.errors,
|
|
68
|
+
error_rate: row.calls > 0 ? row.errors / row.calls : 0,
|
|
69
|
+
avg_latency_ms: Math.round(row.avg_latency_ms * 100) / 100,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Top errors: tools sorted by error count descending
|
|
73
|
+
const topErrors = Object.entries(errorsByTool)
|
|
74
|
+
.map(([tool_name, error_count]) => ({ tool_name, error_count }))
|
|
75
|
+
.sort((a, b) => b.error_count - a.error_count)
|
|
76
|
+
.slice(0, 5);
|
|
77
|
+
// Feedback
|
|
78
|
+
const recentFeedback = getRecentFeedback(5);
|
|
79
|
+
const installAgeDays = Math.floor((Date.now() - new Date(firstSeen).getTime()) / (1000 * 60 * 60 * 24));
|
|
80
|
+
return {
|
|
81
|
+
adoption: {
|
|
82
|
+
instance_id: id.slice(0, 8),
|
|
83
|
+
install_age_days: installAgeDays,
|
|
84
|
+
total_sessions: totalSessions,
|
|
85
|
+
first_seen: firstSeen,
|
|
86
|
+
last_seen: lastSeen,
|
|
87
|
+
},
|
|
88
|
+
health: {
|
|
89
|
+
score: healthScore,
|
|
90
|
+
total_tool_calls: totalToolCalls,
|
|
91
|
+
total_errors: totalErrors,
|
|
92
|
+
error_rate_percent: totalToolCalls > 0
|
|
93
|
+
? Math.round((totalErrors / totalToolCalls) * 10000) / 100
|
|
94
|
+
: 0,
|
|
95
|
+
},
|
|
96
|
+
tool_usage: toolUsage,
|
|
97
|
+
top_errors: topErrors,
|
|
98
|
+
feedback_summary: {
|
|
99
|
+
total: recentFeedback.length,
|
|
100
|
+
recent: recentFeedback,
|
|
101
|
+
},
|
|
102
|
+
uptime_seconds: Math.floor((Date.now() - startTime) / 1000),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { deleteMemory } from "../db.js";
|
|
2
|
+
export async function handleMmDelete(args) {
|
|
3
|
+
const deleted = deleteMemory(args.id);
|
|
4
|
+
if (!deleted) {
|
|
5
|
+
return { success: false, message: "Memory not found" };
|
|
6
|
+
}
|
|
7
|
+
return { success: true, message: "Memory archived" };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mm_delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_delete.js","sourceRoot":"","sources":["../../src/tools/mm_delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAEpC;IACC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { submitFeedback } from "../diagnostics.js";
|
|
2
|
+
export async function handleMmFeedback(args) {
|
|
3
|
+
submitFeedback(args.type, args.message, args.tool_name ?? null);
|
|
4
|
+
return { success: true, message: "Feedback recorded. Thank you." };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=mm_feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_feedback.js","sourceRoot":"","sources":["../../src/tools/mm_feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAItC;IACC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;IAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function handleMmHandoffCreate(args: {
|
|
2
|
+
goal: string;
|
|
3
|
+
current_state: string;
|
|
4
|
+
next_action: string;
|
|
5
|
+
constraints?: string[];
|
|
6
|
+
known_unknowns?: string[];
|
|
7
|
+
artifacts?: string[];
|
|
8
|
+
stop_conditions?: string[];
|
|
9
|
+
}): Promise<Record<string, unknown>>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { insertHandoff } from "../db.js";
|
|
3
|
+
export async function handleMmHandoffCreate(args) {
|
|
4
|
+
const handoff = insertHandoff({
|
|
5
|
+
goal: args.goal,
|
|
6
|
+
current_state: args.current_state,
|
|
7
|
+
next_action: args.next_action,
|
|
8
|
+
constraints: args.constraints ?? [],
|
|
9
|
+
known_unknowns: args.known_unknowns ?? [],
|
|
10
|
+
artifacts: args.artifacts ?? [],
|
|
11
|
+
stop_conditions: args.stop_conditions ?? [],
|
|
12
|
+
session_id: crypto.randomUUID(),
|
|
13
|
+
});
|
|
14
|
+
return { success: true, handoff };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=mm_handoff_create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_handoff_create.js","sourceRoot":"","sources":["../../src/tools/mm_handoff_create.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAQ3C;IACC,MAAM,OAAO,GAAG,aAAa,CAAC;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;QACzC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAC/B,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;QAC3C,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;KAChC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleMmHandoffLoad(): Promise<Record<string, unknown>>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getLatestHandoff } from "../db.js";
|
|
2
|
+
export async function handleMmHandoffLoad() {
|
|
3
|
+
const handoff = getLatestHandoff();
|
|
4
|
+
if (!handoff) {
|
|
5
|
+
return { success: false, message: "No handoff found" };
|
|
6
|
+
}
|
|
7
|
+
return { success: true, handoff };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mm_handoff_load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_handoff_load.js","sourceRoot":"","sources":["../../src/tools/mm_handoff_load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_init.js","sourceRoot":"","sources":["../../src/tools/mm_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleMmMetrics(): Promise<Record<string, unknown>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_metrics.js","sourceRoot":"","sources":["../../src/tools/mm_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getMemory } from "../db.js";
|
|
2
|
+
export async function handleMmRead(args) {
|
|
3
|
+
const memory = getMemory(args.id);
|
|
4
|
+
if (!memory) {
|
|
5
|
+
return { success: false, message: "Memory not found" };
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
success: true,
|
|
9
|
+
memory: {
|
|
10
|
+
id: memory.id,
|
|
11
|
+
type: memory.type,
|
|
12
|
+
title: memory.title,
|
|
13
|
+
content: memory.content,
|
|
14
|
+
tags: memory.tags,
|
|
15
|
+
metadata: memory.metadata,
|
|
16
|
+
tier: memory.tier,
|
|
17
|
+
created_at: memory.created_at,
|
|
18
|
+
updated_at: memory.updated_at,
|
|
19
|
+
accessed_at: memory.accessed_at,
|
|
20
|
+
access_count: memory.access_count,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=mm_read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_read.js","sourceRoot":"","sources":["../../src/tools/mm_read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAElC;IACC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IACzD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE;YACN,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MemoryType, MemoryTier } from "../types.js";
|
|
2
|
+
export declare function handleMmRecall(args: {
|
|
3
|
+
query: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
tier?: MemoryTier;
|
|
6
|
+
type?: MemoryType;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
success: boolean;
|
|
9
|
+
results: Array<Record<string, unknown>>;
|
|
10
|
+
count: number;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { searchMemoriesFTS, getAllMemories } from "../db.js";
|
|
2
|
+
import { embed, cosineSimilarity, bufferToEmbedding, isModelReady } from "../embeddings.js";
|
|
3
|
+
export async function handleMmRecall(args) {
|
|
4
|
+
const limit = args.limit ?? 10;
|
|
5
|
+
const fetchLimit = limit * 2;
|
|
6
|
+
// FTS5 keyword search
|
|
7
|
+
const ftsResults = searchMemoriesFTS(args.query, fetchLimit);
|
|
8
|
+
// Build FTS score map (rank by position, normalized 0-1)
|
|
9
|
+
const ftsScoreMap = new Map();
|
|
10
|
+
ftsResults.forEach((mem, i) => {
|
|
11
|
+
ftsScoreMap.set(mem.id, 1 - i / Math.max(ftsResults.length, 1));
|
|
12
|
+
});
|
|
13
|
+
// Semantic search (if model available)
|
|
14
|
+
const semanticScoreMap = new Map();
|
|
15
|
+
const queryEmbedding = await embed(args.query);
|
|
16
|
+
if (queryEmbedding) {
|
|
17
|
+
// Get all non-archived memories with embeddings
|
|
18
|
+
const allMemories = getAllMemories(args.tier, 1000);
|
|
19
|
+
for (const mem of allMemories) {
|
|
20
|
+
if (mem.embedding) {
|
|
21
|
+
const memEmbedding = bufferToEmbedding(mem.embedding);
|
|
22
|
+
const score = cosineSimilarity(queryEmbedding, memEmbedding);
|
|
23
|
+
semanticScoreMap.set(mem.id, score);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Merge: collect all unique IDs
|
|
28
|
+
const allIds = new Set([...ftsScoreMap.keys(), ...semanticScoreMap.keys()]);
|
|
29
|
+
const scored = [];
|
|
30
|
+
for (const id of allIds) {
|
|
31
|
+
const ftsScore = ftsScoreMap.get(id) ?? 0;
|
|
32
|
+
const semScore = semanticScoreMap.get(id) ?? 0;
|
|
33
|
+
// Hybrid weighting: semantic 0.7, keyword 0.3
|
|
34
|
+
const combinedScore = isModelReady()
|
|
35
|
+
? semScore * 0.7 + ftsScore * 0.3
|
|
36
|
+
: ftsScore; // FTS-only fallback
|
|
37
|
+
scored.push({ id, score: combinedScore });
|
|
38
|
+
}
|
|
39
|
+
scored.sort((a, b) => b.score - a.score);
|
|
40
|
+
const topIds = scored.slice(0, limit);
|
|
41
|
+
// Build result objects from FTS results + all memories
|
|
42
|
+
const allMemMap = new Map();
|
|
43
|
+
for (const mem of ftsResults)
|
|
44
|
+
allMemMap.set(mem.id, mem);
|
|
45
|
+
if (queryEmbedding) {
|
|
46
|
+
const allMems = getAllMemories(args.tier, 1000);
|
|
47
|
+
for (const mem of allMems)
|
|
48
|
+
allMemMap.set(mem.id, mem);
|
|
49
|
+
}
|
|
50
|
+
const results = topIds
|
|
51
|
+
.map(({ id, score }) => {
|
|
52
|
+
const mem = allMemMap.get(id);
|
|
53
|
+
if (!mem)
|
|
54
|
+
return null;
|
|
55
|
+
// Filter by type if specified
|
|
56
|
+
if (args.type && mem.type !== args.type)
|
|
57
|
+
return null;
|
|
58
|
+
return {
|
|
59
|
+
id: mem.id,
|
|
60
|
+
title: mem.title,
|
|
61
|
+
content: mem.content,
|
|
62
|
+
type: mem.type,
|
|
63
|
+
score: Math.round(score * 1000) / 1000,
|
|
64
|
+
tags: mem.tags,
|
|
65
|
+
created_at: mem.created_at,
|
|
66
|
+
};
|
|
67
|
+
})
|
|
68
|
+
.filter((r) => r !== null);
|
|
69
|
+
return { success: true, results, count: results.length };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=mm_recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm_recall.js","sourceRoot":"","sources":["../../src/tools/mm_recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleMmStatus(): Promise<Record<string, unknown>>;
|