{"_id":"@aigclab/memory","_rev":"6-84f49cae4c5454119d3facc2ec0f8314","name":"@aigclab/memory","dist-tags":{"latest":"1.0.2"},"versions":{"0.1.0":{"name":"@aigclab/memory","version":"0.1.0","_id":"@aigclab/memory@0.1.0","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"bin":{"memory":"dist/cli.js"},"dist":{"shasum":"61fa9d017c6d5d575a318111b93ac3f879939bef","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-0.1.0.tgz","fileCount":106,"integrity":"sha512-QRtRh/hJzjda8TPbVFzl/mCvokJ6SFlqr/+AaSgvhcFMKLQayvsNhHGDMN66A+nqEJ5IOrNyRGuQZNTQ+ZuQ/w==","signatures":[{"sig":"MEUCIDMoh7BjEUekPqHCXcyN9TFnAegSl2YnTranmBvGprK1AiEA2dlbnCOyhFYmP1TtWfEPkJxvphPwOdqds6cZGp1GVsk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194665},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"0fcf9e7e42d30b984d7ffabc18d7245ea81d8fb3","scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\""},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"_npmVersion":"11.3.0","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","directories":{},"_nodeVersion":"24.0.0","dependencies":{"chokidar":"^4.0.1","env-paths":"^4.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.0","@modelcontextprotocol/sdk":"^1.27.1"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/memory_0.1.0_1772092047611_0.6382071078412423","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aigclab/memory","version":"0.1.1","_id":"@aigclab/memory@0.1.1","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"bin":{"memory":"dist/cli.js"},"dist":{"shasum":"14eee8b9def28b0c555f6a5b3055d2f5cb251bb0","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-0.1.1.tgz","fileCount":106,"integrity":"sha512-YglobaWvA4fCwaBej9HNWCpM3OKO5YyBaktbSblYzP0pnkXo+JZO26CbZ8orh5emVzz4FZQs9sIPnvljJ8sKtQ==","signatures":[{"sig":"MEQCIFsf8aJf6hpiesfepxAREjAc/n6JVP1TidFE+jwbTbXtAiBobk8258J3UtKq5buFRW6xAvz78syBOmep6lsD5tyvPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194665},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"0fcf9e7e42d30b984d7ffabc18d7245ea81d8fb3","scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\""},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"_npmVersion":"11.3.0","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","directories":{},"_nodeVersion":"24.0.0","dependencies":{"chokidar":"^4.0.1","env-paths":"^4.0.0","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.0"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/memory_0.1.1_1772092668205_0.030360466291702526","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aigclab/memory","version":"0.1.2","_id":"@aigclab/memory@0.1.2","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"bin":{"memory":"dist/cli.js"},"dist":{"shasum":"ccf05d30745ebb39dfc9c406da595f9192265720","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-0.1.2.tgz","fileCount":106,"integrity":"sha512-V8dLtgm/sbJwv7iO2gk/ewMYcQY5rIi0/pSOxhGlQkpRtxDHpz+jIa9OOUFaRv4lGxWmKuXtM9Lpz8ydwn+WUw==","signatures":[{"sig":"MEUCIQDwpeSR1b4Te16bKsP+8hHlmyXb+HgoDXRvxu3SM0jl0wIgK94A2z2zAnR6qNpoapyMdp/9ND1SGWj9/BCuKlWONH0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194967},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"0fcf9e7e42d30b984d7ffabc18d7245ea81d8fb3","scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\""},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"_npmVersion":"11.3.0","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","directories":{},"_nodeVersion":"24.0.0","dependencies":{"chokidar":"^4.0.1","env-paths":"^4.0.0","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.0"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/memory_0.1.2_1772093114526_0.16323218744822188","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aigclab/memory","version":"1.0.0","_id":"@aigclab/memory@1.0.0","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"bin":{"memory":"dist/cli.js"},"dist":{"shasum":"9a437ed70e90ae45da54a5131729eac5ab1a6f3f","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-1.0.0.tgz","fileCount":110,"integrity":"sha512-av85CGsc9TsDVD6c3wIxAX5YgsD0v/ryr1eNm21vsh+F3E4FQZ9X/TEkkNeD3ik4qNprO4UR0FCKGVp/gmSI4g==","signatures":[{"sig":"MEUCIQDF3wNAxle1IcufSCw2zBUutV5bcYC3sVZjFL4ZuVxNugIgRRi4MvIjcNwowcc/28IP/ihMEm1v9BfD1upK1dWRPFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205756},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"0fcf9e7e42d30b984d7ffabc18d7245ea81d8fb3","scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\""},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"_npmVersion":"11.3.0","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","directories":{},"_nodeVersion":"24.0.0","dependencies":{"chokidar":"^4.0.1","env-paths":"^4.0.0","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.0"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/memory_1.0.0_1772107106025_0.9751055154348787","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aigclab/memory","version":"1.0.1","_id":"@aigclab/memory@1.0.1","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"bin":{"memory":"dist/cli.js"},"dist":{"shasum":"757467ddc97d60bad18e81e8bc4b13db7f287e01","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-1.0.1.tgz","fileCount":110,"integrity":"sha512-bq/IaEjn8Vqsj1Dc3XMoGLeUrxazVeUOsGf/sXNjyD6XeFprwVuxhWNf5wFGbia4e4OvkZix8nNPaGJVr3WVZw==","signatures":[{"sig":"MEQCIC1kNeGHvkwsV0bFqJ5aYJQfLA12+OfTs0W2kD9qFvpNAiA+0IcepywyG/A1H/d74Mhka5n5tC/2kA2cYQnQPklE/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208313},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"9d44da70edd44c4d9564f7d3420962aa8a5c5d15","scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\""},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"_npmVersion":"11.3.0","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","directories":{},"_nodeVersion":"24.0.0","dependencies":{"chokidar":"^4.0.1","env-paths":"^4.0.0","@modelcontextprotocol/sdk":"^1.27.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.0"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/memory_1.0.1_1772174322358_0.445153024418532","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aigclab/memory","version":"1.0.2","description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"memory":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","clean":"node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"","memory-daemon":"node scripts/memory-daemon.js"},"dependencies":{"@modelcontextprotocol/sdk":"^1.27.1","chokidar":"^4.0.1","env-paths":"^4.0.0"},"optionalDependencies":{"sqlite-vec":"^0.2.0"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.2"},"engines":{"node":">=22.0.0"},"_id":"@aigclab/memory@1.0.2","gitHead":"e027e89f603a19ba822c1ba106aabcb782b5f55e","_nodeVersion":"24.0.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-zLL4aOeP4NdulPlNaJJkCJEm2d6zRlgIgsYo+1WLSUSOztaUUjzZwL+yYfSUZaGNXiUfwOK6HtZKyQbtbJTdbw==","shasum":"eff8aaf4f4a71f281394758d2a11b30e15164c74","tarball":"https://registry.npmjs.org/@aigclab/memory/-/memory-1.0.2.tgz","fileCount":122,"unpackedSize":240199,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF18omtX94uy5uUApe20XSlzkXk/5xHiMi5jOuYkESBpAiACMVIM4Y8zVt8VKpcrlD06VS/A7eK8+EHdYaT1IxiaxA=="}]},"_npmUser":{"name":"shinehs","email":"nutsuf@126.com"},"directories":{},"maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/memory_1.0.2_1773135708312_0.7044029699832042"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-26T07:47:27.540Z","modified":"2026-03-10T09:41:48.688Z","0.1.0":"2026-02-26T07:47:27.785Z","0.1.1":"2026-02-26T07:57:48.365Z","0.1.2":"2026-02-26T08:05:14.679Z","1.0.0":"2026-02-26T11:58:26.167Z","1.0.1":"2026-02-27T06:38:42.506Z","1.0.2":"2026-03-10T09:41:48.549Z"},"description":"Standalone memory system (Markdown index + semantic/keyword search) extracted from OpenClaw","maintainers":[{"name":"shinehs","email":"nutsuf@126.com"}],"readme":"# @aigclab/memory\n\nStandalone memory system extracted from OpenClaw: index Markdown files under a root directory and run semantic + keyword search.\n\n## Install\n\n```bash\nnpm install @aigclab/memory\n```\n\n## Usage (library)\n\n```ts\nimport { createMemory } from \"@aigclab/memory\";\n\nconst memory = await createMemory({\n  memoryRoot: \"./memory\",       // directory containing MEMORY.md and memory/*.md\n  storePath: \"./.cache/memory.sqlite\",\n  embedding: {\n    provider: \"openai\",\n    apiKey: process.env.OPENAI_API_KEY,\n    model: \"text-embedding-3-small\",\n  },\n});\n\n// Search\nconst results = await memory.search(\"user preferences\");\n// Read a file\nconst { text, path } = await memory.readFile({ relPath: \"memory/2025-01-15.md\", from: 1, lines: 50 });\n// Sync index (or leave to watch + interval)\nawait memory.sync({ force: true });\n// Status\nconst status = memory.status();\nawait memory.close();\n```\n\n## Configuration\n\n- **memoryRoot** (required): Root directory for `MEMORY.md` and `memory/*.md`.\n- **storePath** (required): SQLite database path for the index.\n- **embedding**: `provider: \"openai\" | \"none\"`, and when `openai`: `apiKey`, optional `baseUrl`, `model`.\n- **chunking**: `tokens` (default 400), `overlap` (default 80).\n- **sync**: `watch`, `watchDebounceMs`, `intervalMinutes`.\n- **query**: `maxResults`, `minScore`, `hybrid` (vectorWeight, textWeight, mmr, temporalDecay).\n- **cache**: `enabled`, `maxEntries`.\n- **extraPaths**: Extra paths (relative to memoryRoot or absolute) to index as `.md`.\n- **vector**: `enabled`, optional `extensionPath` for sqlite-vec.\n\n## MCP integration (optional)\n\n本包是 **库**，不提供现成的 MCP 服务进程。若要在 Cursor 等支持 MCP 的客户端里用「记忆」能力，需要有一个 **调用了本库** 的 MCP 服务（你自己写的脚本、或其它项目提供的 MCP 服务）。\n\n在你自己实现的 MCP 服务里，用 `getMemoryManager` 和 `handleMemoryTool` 把记忆能力接到 MCP 的 tool 上：\n\n```ts\nimport { getMemoryManager, handleMemoryTool } from \"@aigclab/memory\";\n\nconst options = {\n  config: { memoryRoot: \"./memory\", storePath: \"./.cache/memory.sqlite\" },\n  toolNames: { search: \"memory_search\", get: \"memory_get\" },\n  // 可选：后台 Flush + 抽取。首次调用任一 memory 工具时自动启动，每次调用续命 1 小时，闲置 1 小时后停止。设 background: { enable: false } 可关闭。\n  background: { transcriptDir: \"%LOCALAPPDATA%/memory\", idleShutdownHours: 1 },\n};\n// 在你的 MCP tool 处理函数里：\nconst result = await handleMemoryTool(toolName, args, options);\n```\n\n**后台行为**：当 `background.enable !== false` 时，第一次调用任意 memory 工具会启动「Flush 触发 + 对话抽取」循环；之后每次工具调用都会将「闲置 1 小时自动停止」的计时重置；若 1 小时内没有新的工具调用，后台自动停止，下次调用时再启动。\n\n若本包日后提供可执行入口（例如通过 `npx @aigclab/memory mcp` 启动 MCP 服务），则 Cursor 的 MCP 配置会类似：\n\n```json\n{\n  \"mcpServers\": {\n    \"memory\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@aigclab/memory\", \"mcp\", \"--memoryRoot\", \"D:\\\\your-project\\\\memory\", \"--storePath\", \"D:\\\\your-project\\\\.cache\\\\memory.sqlite\"],\n      \"env\": { \"OPENAI_API_KEY\": \"your_openai_api_key\" }\n    }\n  }\n}\n```\n本地调试\n```json\n{\n  \"memory\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"D:\\\\memory\\\\dist\\\\cli.js\",\n        \"mcp\",\n        \"--memoryRoot\",\n        \"D:\\\\memory\",\n        \"--storePath\",\n        \"D:\\\\memory\\\\.cache\\\\memory.sqlite\"\n      ]\n  }\n}\n```\n当前版本没有上述 `mcp` 子命令，如需在 Cursor 中使用，需自行实现一个 MCP 服务进程并在其中调用本库的 `handleMemoryTool`。\n\n## 职责划分\n\n| 模块                         | 职责                                                                             |\n| ---------------------------- | -------------------------------------------------------------------------------- |\n| **config.ts**                | 配置类型、默认值、路径解析（`memoryRoot` / `storePath` / `extraPaths`）          |\n| **src/logger.ts**            | 日志接口与默认/静默实现                                                          |\n| **src/utils.ts**             | `truncateUtf16Safe` 等工具                                                       |\n| **src/fs-utils.ts**          | 文件存在检查、`statRegularFile`                                                  |\n| **src/types.ts**             | 对外类型：`MemorySearchResult`、`MemoryProviderStatus`、`MemorySearchManager` 等 |\n| **src/internal.ts**          | 内部：列举 MD、构建 file entry、分块、哈希、路径规范化                           |\n| **src/memory-schema.ts**     | SQLite 表结构（meta, files, chunks, embedding_cache, FTS5）                      |\n| **src/sqlite.ts**            | 加载 `node:sqlite`                                                               |\n| **src/sqlite-vec.ts**        | 可选加载 `sqlite-vec` 扩展                                                       |\n| **src/embedding-*.ts**       | 嵌入输入/模型/分块限制                                                           |\n| **src/http.ts**              | 简单 POST JSON（用于 OpenAI 等）                                                 |\n| **src/embeddings-openai.ts** | OpenAI 嵌入（apiKey/baseUrl/model）                                              |\n| **src/embeddings.ts**        | 根据配置创建嵌入提供方（当前仅 openai / none）                                   |\n| **src/manager-search.ts**    | 向量检索、关键词检索（FTS）、listChunks                                          |\n| **src/query-expansion.ts**   | 关键词抽取（FTS 用）                                                             |\n| **src/hybrid.ts**            | 混合结果合并、FTS 查询构建、BM25→分数                                            |\n| **src/mmr.ts**               | MMR 重排                                                                         |\n| **src/temporal-decay.ts**    | 时间衰减                                                                         |\n| **src/manager.ts**           | 索引管理：建库、watch、定时同步、indexFile、search、readFile、status、close      |\n| **src/create-memory.ts**     | `createMemory(options)`，返回 `MemorySearchManager`                              |\n| **src/mcp-server.ts**        | MCP 用：`getMemoryManager`、`handleMemoryTool`（memory_search / memory_get）     |\n| **src/index.ts**             | 汇总导出（含 MCP 入口）                                                          |\n\n# 内容整理命令\n「整理当前项目」「整理记忆」「梳理项目」「项目复盘」","readmeFilename":"README.md"}