memory-forge 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/dist/setup.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemoryForge 一键安装: npx memory-forge setup
4
+ */
5
+ import { installHooks, getHooksStatus } from "./hooks/install.js";
6
+ import { importRules, rulesToMemories } from "./migrate/import.js";
7
+ import { preload } from "./embedding.js";
8
+ import { saveMemory } from "./storage/local.js";
9
+ export async function setup() {
10
+ console.log(`
11
+ ╔══════════════════════════╗
12
+ ║ MemoryForge Setup ║
13
+ ╚══════════════════════════╝
14
+ `);
15
+ // 1. Install Claude Code hooks
16
+ console.log("🪝 Installing Claude Code hooks…");
17
+ const hooksOk = installHooks();
18
+ console.log(hooksOk ? " ✅ Hooks installed (SessionStart / Stop / PreCompact)" : " ⚠️ Hooks skipped (Claude Code not found)");
19
+ // 2. Import existing rules
20
+ console.log("\n📋 Scanning existing rules…");
21
+ const rules = importRules();
22
+ if (rules.length > 0) {
23
+ console.log(` Found ${rules.length} rules in CLAUDE.md / .cursor/rules / .gitconfig`);
24
+ const memories = rulesToMemories(rules);
25
+ for (const mem of memories) {
26
+ saveMemory(mem);
27
+ }
28
+ console.log(` ✅ Imported ${memories.length} rules as memories`);
29
+ }
30
+ else {
31
+ console.log(" ℹ️ No existing rules found — starting fresh");
32
+ }
33
+ // 3. Preload embedding model in background
34
+ console.log("\n🧠 Preloading embedding model (background)…");
35
+ preload();
36
+ console.log(" ℹ️ Model will download on first use (~23MB, one-time)");
37
+ // 4. Verify hooks status
38
+ console.log("\n🔍 Verifying setup…");
39
+ const hookStatus = getHooksStatus();
40
+ console.log(` SessionStart: ${hookStatus.sessionStart ? "✅" : "⚠️ not configured"}`);
41
+ console.log(` Stop: ${hookStatus.stop ? "✅" : "⚠️ not configured"}`);
42
+ console.log(` PreCompact: ${hookStatus.preCompact ? "✅" : "⚠️ not configured"}`);
43
+ console.log(`
44
+ ┌──────────────────────────────────────┐
45
+ │ MemoryForge is ready! │
46
+ │ │
47
+ │ Your AI Agent now has memory. │
48
+ │ It will automatically: │
49
+ │ • Remember your preferences │
50
+ │ • Load context on session start │
51
+ │ • Capture learnings each session │
52
+ │ │
53
+ │ No further setup needed. │
54
+ └──────────────────────────────────────┘
55
+ `);
56
+ }
57
+ // Allow running directly: npx memory-forge setup
58
+ if (process.argv[1]?.endsWith("setup.js") || process.argv[2] === "setup") {
59
+ setup().catch((err) => {
60
+ console.error("[MemoryForge] Setup failed:", err);
61
+ process.exit(1);
62
+ });
63
+ }
64
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,OAAO,CAAC,GAAG,CAAC;;;;GAIX,CAAC,CAAC;IAEH,+BAA+B;IAC/B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yDAAyD,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAElI,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,kDAAkD,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,MAAM,oBAAoB,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAEzE,yBAAyB;IACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEtF,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;GAYX,CAAC,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;IACzE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 本地 Markdown 存储: ~/.memory-forge/memories/{id}.md
3
+ */
4
+ import type { Memory } from "../store.js";
5
+ export declare function saveMemory(memory: Memory): void;
6
+ export declare function loadAllMemories(): Memory[];
7
+ export declare function deleteMemoryFile(id: string): void;
@@ -0,0 +1,105 @@
1
+ /**
2
+ * 本地 Markdown 存储: ~/.memory-forge/memories/{id}.md
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ const BASE = path.join(process.env.MEMORYFORGE_HOME ?? path.join(requireHome(), ".memory-forge"), "memories");
7
+ function requireHome() {
8
+ return process.env.HOME ?? process.env.USERPROFILE ?? "/tmp";
9
+ }
10
+ function ensureDir() {
11
+ if (!fs.existsSync(BASE)) {
12
+ fs.mkdirSync(BASE, { recursive: true });
13
+ }
14
+ }
15
+ export function saveMemory(memory) {
16
+ ensureDir();
17
+ const lines = [
18
+ `# ${memory.name}`,
19
+ `> category: ${memory.category}`,
20
+ `> tags: ${memory.tags.join(", ")}`,
21
+ `> priority: ${memory.priority}`,
22
+ `> created: ${memory.created_at}`,
23
+ `> access_count: ${memory.access_count}`,
24
+ ``,
25
+ memory.content,
26
+ ];
27
+ fs.writeFileSync(path.join(BASE, `${memory.id}.md`), lines.join("\n"));
28
+ }
29
+ export function loadAllMemories() {
30
+ if (!fs.existsSync(BASE))
31
+ return [];
32
+ return fs
33
+ .readdirSync(BASE)
34
+ .filter((f) => f.endsWith(".md"))
35
+ .map((f) => parseMemoryFile(path.join(BASE, f)))
36
+ .filter((m) => m !== null);
37
+ }
38
+ function parseMemoryFile(filepath) {
39
+ try {
40
+ const content = fs.readFileSync(filepath, "utf-8");
41
+ const id = path.basename(filepath, ".md");
42
+ const lines = content.split("\n");
43
+ // Parse YAML-like frontmatter
44
+ let name = id;
45
+ let category = "general";
46
+ let tags = [];
47
+ let priority = 5;
48
+ let created = new Date().toISOString();
49
+ let accessCount = 0;
50
+ let bodyStart = 0;
51
+ for (let i = 0; i < lines.length; i++) {
52
+ const line = lines[i].trim();
53
+ if (line.startsWith("# ")) {
54
+ name = line.slice(2);
55
+ continue;
56
+ }
57
+ if (line.startsWith("> category:")) {
58
+ category = line.slice(12).trim();
59
+ continue;
60
+ }
61
+ if (line.startsWith("> tags:")) {
62
+ tags = line.slice(8).trim().split(",").map((t) => t.trim()).filter(Boolean);
63
+ continue;
64
+ }
65
+ if (line.startsWith("> priority:")) {
66
+ priority = parseInt(line.slice(12).trim(), 10) || 5;
67
+ continue;
68
+ }
69
+ if (line.startsWith("> created:")) {
70
+ created = line.slice(11).trim();
71
+ continue;
72
+ }
73
+ if (line.startsWith("> access_count:")) {
74
+ accessCount = parseInt(line.slice(16).trim(), 10) || 0;
75
+ continue;
76
+ }
77
+ if (line === "" && i + 1 < lines.length) {
78
+ bodyStart = i + 1;
79
+ break;
80
+ }
81
+ }
82
+ const body = lines.slice(bodyStart).join("\n").trim();
83
+ return {
84
+ id,
85
+ name: name || id,
86
+ content: body,
87
+ category,
88
+ tags,
89
+ priority,
90
+ vector: [],
91
+ created_at: created,
92
+ access_count: accessCount,
93
+ last_accessed: null,
94
+ };
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ export function deleteMemoryFile(id) {
101
+ const filepath = path.join(BASE, `${id}.md`);
102
+ if (fs.existsSync(filepath))
103
+ fs.unlinkSync(filepath);
104
+ }
105
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shelby 云存储 (Pro 层)。
3
+ * 使用 @shelby-protocol/sdk 官方 SDK + Gas Station 代付。
4
+ */
5
+ import { ShelbyNodeClient } from "@shelby-protocol/sdk/node";
6
+ import { Account } from "@aptos-labs/ts-sdk";
7
+ import type { Memory } from "../store.js";
8
+ export declare function initShelby(apiKey: string, privateKey?: string): {
9
+ address: string;
10
+ generatedKey?: string;
11
+ };
12
+ export declare function getShelbyClient(): ShelbyNodeClient | null;
13
+ export declare function getShelbyAccount(): Account | null;
14
+ /** 上传记忆到 Shelby */
15
+ export declare function uploadMemory(memory: Memory): Promise<string | null>;
16
+ /** 从 Shelby 下载记忆(30s 超时) */
17
+ export declare function downloadMemory(blobName: string): Promise<Memory | null>;
18
+ /** 列出 Shelby 上的所有记忆 */
19
+ export declare function listBlobs(): Promise<string[]>;
20
+ /** 从 Shelby 删除记忆 */
21
+ export declare function deleteBlob(blobName: string): Promise<void>;
22
+ /** 将本地记忆导出为 blob 名称列表 */
23
+ export declare function getBlobName(memoryId: string): string;
24
+ /** 从 blob 名称解析 memory_id */
25
+ export declare function getMemoryId(blobName: string): string | null;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Shelby 云存储 (Pro 层)。
3
+ * 使用 @shelby-protocol/sdk 官方 SDK + Gas Station 代付。
4
+ */
5
+ import { ShelbyNodeClient } from "@shelby-protocol/sdk/node";
6
+ import { Account, Ed25519PrivateKey, Network } from "@aptos-labs/ts-sdk";
7
+ const DOWNLOAD_TIMEOUT_MS = 30_000; // 30s
8
+ let client = null;
9
+ let account = null;
10
+ export function initShelby(apiKey, privateKey) {
11
+ client = new ShelbyNodeClient({
12
+ network: Network.SHELBYNET,
13
+ apiKey,
14
+ });
15
+ let generatedKey;
16
+ if (privateKey) {
17
+ account = Account.fromPrivateKey({
18
+ privateKey: new Ed25519PrivateKey(privateKey),
19
+ });
20
+ }
21
+ else {
22
+ const edKey = Ed25519PrivateKey.generate();
23
+ account = Account.fromPrivateKey({ privateKey: edKey });
24
+ generatedKey = edKey.toString();
25
+ }
26
+ return {
27
+ address: account.accountAddress.toString(),
28
+ generatedKey,
29
+ };
30
+ }
31
+ export function getShelbyClient() {
32
+ return client;
33
+ }
34
+ export function getShelbyAccount() {
35
+ return account;
36
+ }
37
+ /** 上传记忆到 Shelby */
38
+ export async function uploadMemory(memory) {
39
+ if (!client || !account)
40
+ return null;
41
+ const blobData = Buffer.from(JSON.stringify(memory));
42
+ const blobName = `memories/${memory.id}.json`;
43
+ try {
44
+ await client.upload({
45
+ signer: account,
46
+ blobData,
47
+ blobName,
48
+ expirationMicros: (Date.now() + 365 * 86400000) * 1000, // 1 year
49
+ });
50
+ return blobName;
51
+ }
52
+ catch (err) {
53
+ console.error("[MemoryForge] Shelby upload failed:", err.message);
54
+ return null;
55
+ }
56
+ }
57
+ /** 从 Shelby 下载记忆(30s 超时) */
58
+ export async function downloadMemory(blobName) {
59
+ if (!client || !account)
60
+ return null;
61
+ try {
62
+ const blob = await client.download({
63
+ account: account.accountAddress,
64
+ blobName,
65
+ });
66
+ const streamPromise = (async () => {
67
+ const chunks = [];
68
+ for await (const chunk of blob.readable) {
69
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
70
+ }
71
+ return Buffer.concat(chunks).toString();
72
+ })();
73
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Download timeout after ${DOWNLOAD_TIMEOUT_MS}ms`)), DOWNLOAD_TIMEOUT_MS));
74
+ const data = await Promise.race([streamPromise, timeoutPromise]);
75
+ return JSON.parse(data);
76
+ }
77
+ catch (err) {
78
+ console.error("[MemoryForge] Shelby download failed:", err.message);
79
+ return null;
80
+ }
81
+ }
82
+ /** 列出 Shelby 上的所有记忆 */
83
+ export async function listBlobs() {
84
+ if (!client || !account)
85
+ return [];
86
+ try {
87
+ const metadata = await client.coordination.getAccountBlobs({
88
+ account: account.accountAddress,
89
+ });
90
+ return metadata.map((m) => m.name).filter((n) => n.startsWith("memories/"));
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ }
96
+ /** 从 Shelby 删除记忆 */
97
+ export async function deleteBlob(blobName) {
98
+ if (!client || !account)
99
+ return;
100
+ // Shelby blobs are immutable once uploaded.
101
+ // Deletion in our model = upload empty file as tombstone
102
+ try {
103
+ await client.upload({
104
+ signer: account,
105
+ blobData: Buffer.from("{}"),
106
+ blobName: blobName + ".deleted",
107
+ expirationMicros: Date.now() * 1000 + 86400000,
108
+ });
109
+ }
110
+ catch {
111
+ // ignore
112
+ }
113
+ }
114
+ /** 将本地记忆导出为 blob 名称列表 */
115
+ export function getBlobName(memoryId) {
116
+ return `memories/${memoryId}.json`;
117
+ }
118
+ /** 从 blob 名称解析 memory_id */
119
+ export function getMemoryId(blobName) {
120
+ const match = blobName.match(/^memories\/(.+)\.json$/);
121
+ return match ? match[1] : null;
122
+ }
123
+ //# sourceMappingURL=shelby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shelby.js","sourceRoot":"","sources":["../../src/storage/shelby.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGzE,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,MAAM;AAE1C,IAAI,MAAM,GAA4B,IAAI,CAAC;AAC3C,IAAI,OAAO,GAAmB,IAAI,CAAC;AAEnC,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,UAAmB;IAC5D,MAAM,GAAG,IAAI,gBAAgB,CAAC;QAC5B,OAAO,EAAE,OAAO,CAAC,SAAS;QAC1B,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,YAAgC,CAAC;IAErC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;YAC/B,UAAU,EAAE,IAAI,iBAAiB,CAAC,UAAU,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC3C,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE;QAC1C,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mBAAmB;AACnB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,YAAY,MAAM,CAAC,EAAE,OAAO,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,OAAO;YACf,QAAQ;YACR,QAAQ;YACR,gBAAgB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,SAAS;SAClE,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACjC,OAAO,EAAE,OAAO,CAAC,cAAc;YAC/B,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,cAAc,GAAG,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACvD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,mBAAmB,IAAI,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAC5G,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAW,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC;YACzD,OAAO,EAAE,OAAO,CAAC,cAAc;SAChC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO;IAChC,4CAA4C;IAC5C,yDAAyD;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,QAAQ,GAAG,UAAU;YAC/B,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,QAAQ;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,YAAY,QAAQ,OAAO,CAAC;AACrC,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 记忆索引层: LRU 缓存 + 余弦相似度 + 关键词 fallback。
3
+ */
4
+ export interface Memory {
5
+ id: string;
6
+ name: string;
7
+ content: string;
8
+ category: string;
9
+ tags: string[];
10
+ priority: number;
11
+ vector: number[];
12
+ created_at: string;
13
+ access_count: number;
14
+ last_accessed: string | null;
15
+ similarity?: number;
16
+ _score?: number;
17
+ _fallback?: string;
18
+ }
19
+ interface SearchOptions {
20
+ limit: number;
21
+ category?: string | null;
22
+ tags?: string[] | null;
23
+ minSimilarity?: number;
24
+ queryVec?: Float32Array;
25
+ }
26
+ export declare class MemoryStore {
27
+ private memories;
28
+ private vectorCache;
29
+ add(memory: Memory): void;
30
+ get(id: string): Memory | null;
31
+ remove(id: string): boolean;
32
+ touch(id: string): void;
33
+ size(): number;
34
+ list(opts: {
35
+ category?: string | null;
36
+ tags?: string[] | null;
37
+ limit: number;
38
+ offset: number;
39
+ }): Memory[];
40
+ search(rawQuery: string, options: SearchOptions): Memory[];
41
+ /** 余弦相似度检索 */
42
+ private vectorSearch;
43
+ /** 降级: 无向量时的关键词匹配 */
44
+ keywordSearch(query: string, options: {
45
+ limit: number;
46
+ category?: string | null;
47
+ tags?: string[] | null;
48
+ }): Memory[];
49
+ stats(): {
50
+ total: number;
51
+ categories: Record<string, number>;
52
+ top_tags: [string, number][];
53
+ oldest: string;
54
+ newest: string;
55
+ total_accesses: number;
56
+ };
57
+ }
58
+ export {};
package/dist/store.js ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * 记忆索引层: LRU 缓存 + 余弦相似度 + 关键词 fallback。
3
+ */
4
+ export class MemoryStore {
5
+ memories = new Map();
6
+ vectorCache = new Map();
7
+ add(memory) {
8
+ this.memories.set(memory.id, memory);
9
+ if (memory.vector?.length) {
10
+ this.vectorCache.set(memory.id, new Float32Array(memory.vector));
11
+ }
12
+ // LRU: keep max 5000 in memory
13
+ if (this.memories.size > 5000) {
14
+ const oldest = [...this.memories.values()]
15
+ .sort((a, b) => (a.access_count || 0) - (b.access_count || 0) || (a.priority || 5) - (b.priority || 5))
16
+ .slice(0, 1000);
17
+ for (const m of oldest) {
18
+ this.memories.delete(m.id);
19
+ this.vectorCache.delete(m.id);
20
+ }
21
+ }
22
+ }
23
+ get(id) {
24
+ return this.memories.get(id) ?? null;
25
+ }
26
+ remove(id) {
27
+ this.vectorCache.delete(id);
28
+ return this.memories.delete(id);
29
+ }
30
+ touch(id) {
31
+ const m = this.memories.get(id);
32
+ if (m) {
33
+ m.access_count++;
34
+ m.last_accessed = new Date().toISOString();
35
+ }
36
+ }
37
+ size() {
38
+ return this.memories.size;
39
+ }
40
+ list(opts) {
41
+ let results = [...this.memories.values()];
42
+ if (opts.category) {
43
+ results = results.filter((m) => m.category === opts.category);
44
+ }
45
+ if (opts.tags?.length) {
46
+ results = results.filter((m) => opts.tags.some((t) => m.tags.includes(t)));
47
+ }
48
+ return results
49
+ .sort((a, b) => b.access_count - a.access_count)
50
+ .slice(opts.offset, opts.offset + opts.limit);
51
+ }
52
+ search(rawQuery, options) {
53
+ const queryVec = options.queryVec;
54
+ if (queryVec) {
55
+ return this.vectorSearch(queryVec, options);
56
+ }
57
+ return this.keywordSearch(rawQuery, options);
58
+ }
59
+ /** 余弦相似度检索 */
60
+ vectorSearch(queryVec, options) {
61
+ const { limit, category, tags, minSimilarity } = options;
62
+ let candidates = [...this.memories.values()];
63
+ if (category)
64
+ candidates = candidates.filter((m) => m.category === category);
65
+ if (tags?.length)
66
+ candidates = candidates.filter((m) => tags.some((t) => m.tags.includes(t)));
67
+ const scored = candidates.map((m) => {
68
+ const mv = this.vectorCache.get(m.id);
69
+ if (!mv)
70
+ return { memory: m, similarity: 0, score: 0 }; // 无向量 → 不得分
71
+ const sim = cosineSimilarity(queryVec, mv);
72
+ const score = sim * ((m.priority || 5) / 5) * (1 + Math.min(m.access_count, 10) * 0.05);
73
+ return { memory: m, similarity: sim, score };
74
+ });
75
+ return scored
76
+ .filter((s) => s.score > 0 && s.similarity >= (minSimilarity ?? 0.6))
77
+ .sort((a, b) => b.score - a.score)
78
+ .slice(0, limit)
79
+ .map((s) => ({ ...s.memory, similarity: s.similarity, _score: s.score }));
80
+ }
81
+ /** 降级: 无向量时的关键词匹配 */
82
+ keywordSearch(query, options) {
83
+ const tokens = query.toLowerCase().split(/\s+/).filter((t) => t.length > 1);
84
+ if (tokens.length === 0)
85
+ return [];
86
+ let candidates = [...this.memories.values()];
87
+ if (options.category) {
88
+ candidates = candidates.filter((m) => m.category === options.category);
89
+ }
90
+ if (options.tags?.length) {
91
+ candidates = candidates.filter((m) => options.tags.some((t) => m.tags.includes(t)));
92
+ }
93
+ return candidates
94
+ .map((m) => {
95
+ const content = m.content.toLowerCase();
96
+ const hits = tokens.filter((t) => content.includes(t)).length;
97
+ const nameHits = tokens.filter((t) => m.name.toLowerCase().includes(t)).length;
98
+ const keywordScore = hits * 2 + nameHits * 3;
99
+ if (keywordScore === 0)
100
+ return { memory: m, score: 0 };
101
+ return { memory: m, score: keywordScore + (m.priority || 5) };
102
+ })
103
+ .filter((s) => s.score > 0)
104
+ .sort((a, b) => b.score - a.score)
105
+ .slice(0, options.limit)
106
+ .map((s) => ({ ...s.memory, similarity: 0, _score: s.score, _fallback: "keyword" }));
107
+ }
108
+ stats() {
109
+ const all = [...this.memories.values()];
110
+ const categories = {};
111
+ const tagCounts = {};
112
+ for (const m of all) {
113
+ categories[m.category] = (categories[m.category] || 0) + 1;
114
+ for (const t of m.tags)
115
+ tagCounts[t] = (tagCounts[t] || 0) + 1;
116
+ }
117
+ const sorted = all.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
118
+ return {
119
+ total: all.length,
120
+ categories,
121
+ top_tags: Object.entries(tagCounts).sort((a, b) => b[1] - a[1]).slice(0, 10),
122
+ oldest: sorted[sorted.length - 1]?.created_at ?? null,
123
+ newest: sorted[0]?.created_at ?? null,
124
+ total_accesses: all.reduce((s, m) => s + m.access_count, 0),
125
+ };
126
+ }
127
+ }
128
+ function cosineSimilarity(a, b) {
129
+ let dot = 0, normA = 0, normB = 0;
130
+ for (let i = 0; i < a.length; i++) {
131
+ dot += a[i] * b[i];
132
+ normA += a[i] ** 2;
133
+ normB += b[i] ** 2;
134
+ }
135
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
136
+ return denom === 0 ? 0 : dot / denom;
137
+ }
138
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "memory-forge",
3
+ "version": "0.1.0",
4
+ "description": "Forge persistent memories for your AI agent. 8 MCP tools + 5 auto-engines. Powered by Shelby decentralized cloud.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "shelby-ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/shelby-ai/memory-forge"
11
+ },
12
+ "keywords": [
13
+ "mcp",
14
+ "model-context-protocol",
15
+ "ai-agent",
16
+ "memory",
17
+ "persistent-memory",
18
+ "vector-search",
19
+ "embeddings",
20
+ "claude-code",
21
+ "cursor",
22
+ "shelby",
23
+ "decentralized-storage",
24
+ "memory-forge"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18.0.0"
28
+ },
29
+ "main": "dist/index.js",
30
+ "bin": {
31
+ "memory-forge": "./dist/index.js"
32
+ },
33
+ "files": [
34
+ "dist/",
35
+ "README.md",
36
+ "LICENSE"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "start": "node dist/index.js",
41
+ "dev": "tsc && node dist/index.js",
42
+ "test": "npx tsx src/test.ts",
43
+ "prepublishOnly": "npm run build"
44
+ },
45
+ "dependencies": {
46
+ "@huggingface/transformers": "^3.0.0",
47
+ "@modelcontextprotocol/sdk": "^1.0.0",
48
+ "got": "^11.8.6",
49
+ "zod": "^3.24.0"
50
+ },
51
+ "optionalDependencies": {
52
+ "@aptos-labs/ts-sdk": "^5.2.1",
53
+ "@shelby-protocol/sdk": "^0.3.1"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.0.0",
57
+ "typescript": "^5.7.0"
58
+ }
59
+ }