{"_id":"@dongkseo/store-memory","_rev":"4-5f0c38b7ed2db6e8424e038cfec77a84","name":"@dongkseo/store-memory","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@dongkseo/store-memory","version":"0.1.0","_id":"@dongkseo/store-memory@0.1.0","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"72e056db2525769eb11fc5d14b274260a3c2cd62","tarball":"https://registry.npmjs.org/@dongkseo/store-memory/-/store-memory-0.1.0.tgz","fileCount":21,"integrity":"sha512-x9GlOdVOgZvbMMnip7dFw9oHmoAgxk2xeKfiOR2HTuakK7oVm24SEDnfUwNJnVfjiU8cYjTyLoU0SsayqG/oWA==","signatures":[{"sig":"MEUCIQCSQJ4s8XL1ZxBOr4OAp8r4JjW+EC+w6dLQxajIkZe85QIgYHPa7SezWx18+bGyUc3pHZmgEa8MLyu1TXfQ4kJ5lXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48580},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-store-memory-0.1.0.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/b07b5e7c63a52e94dcdc7f0f17ac53e5/dongkseo-store-memory-0.1.0.tgz","_integrity":"sha512-x9GlOdVOgZvbMMnip7dFw9oHmoAgxk2xeKfiOR2HTuakK7oVm24SEDnfUwNJnVfjiU8cYjTyLoU0SsayqG/oWA==","_npmVersion":"11.12.1","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/store-memory_0.1.0_1781668545634_0.2722389334687827","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dongkseo/store-memory","version":"0.1.1","_id":"@dongkseo/store-memory@0.1.1","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"3d4b9a3396c1b656b128a0df4d51dca3af326b53","tarball":"https://registry.npmjs.org/@dongkseo/store-memory/-/store-memory-0.1.1.tgz","fileCount":21,"integrity":"sha512-TmgbmXb0vSgu6d5ZQREtgbsE4oZaQLACT+29Na0Kjs98ifJ4G3w3PzsbUhrxBXmZTIkIRJkr8+FUKBiXogYlWQ==","signatures":[{"sig":"MEQCIAH/0X47fBC616BA+TGDb/GJlPPLdnW0xDUyEMSGpVNTAiAQ6o5v6A4+HId3HvkM5Fu2S/o0nmxjQdomGjsdt/5Phg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48581},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-store-memory-0.1.1.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/f6/dfc3mm717vx9xjh0vbgqnddr0000gn/T/729b196765908929d0b2dde834669579/dongkseo-store-memory-0.1.1.tgz","_integrity":"sha512-TmgbmXb0vSgu6d5ZQREtgbsE4oZaQLACT+29Na0Kjs98ifJ4G3w3PzsbUhrxBXmZTIkIRJkr8+FUKBiXogYlWQ==","_npmVersion":"11.12.1","directories":{},"_nodeVersion":"26.0.0","dependencies":{"@dongkseo/contracts":"^0.1.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/store-memory_0.1.1_1782200185992_0.9868367626261205","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dongkseo/store-memory","version":"0.1.2","_id":"@dongkseo/store-memory@0.1.2","maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"dist":{"shasum":"5fe08c34fb8425dbb8497b2b0d31be9761f0cddd","tarball":"https://registry.npmjs.org/@dongkseo/store-memory/-/store-memory-0.1.2.tgz","fileCount":22,"integrity":"sha512-t4W8u+3vd0RvKHbdymu5iesxx4k6NpjCrh4L8WeT/nreiYLpS3dSKhssZ2Ivw/9g2aKkMDPBuzHagySLs9sHYQ==","signatures":[{"sig":"MEUCIQCr9VjXg3BOiuauAP1CyE4LHWo+/FSA6ND7YHza0ekacAIgUys48iZ5g2uSK0oGvwo2/RL77QkvFtVcE2AdZbGTI0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54512},"main":"./dist/index.js","type":"module","_from":"file:dongkseo-store-memory-0.1.2.tgz","types":"./dist/index.d.ts","nexora":{"stability":"experimental"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf dist .tsbuildinfo"},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"_resolved":"/private/var/folders/lw/t8yfg__j2nxd25m53gt8840h0000gn/T/d0e800135af60a8d26dcb221f2cc397b/dongkseo-store-memory-0.1.2.tgz","_integrity":"sha512-t4W8u+3vd0RvKHbdymu5iesxx4k6NpjCrh4L8WeT/nreiYLpS3dSKhssZ2Ivw/9g2aKkMDPBuzHagySLs9sHYQ==","_npmVersion":"11.16.0","description":"**Stability: experimental** · `pnpm add @dongkseo/store-memory`","directories":{},"_nodeVersion":"26.3.1","dependencies":{"@dongkseo/contracts":"^0.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/store-memory_0.1.2_1782389354332_0.7850283594801375","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dongkseo/store-memory","version":"0.1.3","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"@dongkseo/contracts":"^0.1.32"},"devDependencies":{"@types/node":"^26.1.2","typescript":"^7.0.2"},"nexora":{"stability":"experimental"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run","clean":"rm -rf dist .tsbuildinfo"},"_nodeVersion":"26.7.0","_id":"@dongkseo/store-memory@0.1.3","dist":{"integrity":"sha512-IYgUdComRKA8j2Om3bVSIV1xSrEciLWpazGcA5cilAD7uSBqrNN4a5OdQf2l913HgbvoLPU2Fp6ctgIMsQ3Baw==","shasum":"f78defd27d9ad74e67d0196aaf064eabb235bb72","tarball":"https://registry.npmjs.org/@dongkseo/store-memory/-/store-memory-0.1.3.tgz","fileCount":22,"unpackedSize":54609,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF8dbEc0t0SKKbfY7AKHe7kmgR5ZjozIv7y0sUTFtrqMAiEAncQA0YyUqhxkt9a0P82NVa3a5eQIQvXp5UZBxEUX2xs="}]},"_npmUser":{"name":"dongkseo","email":"ssddgg99@daum.net"},"directories":{},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/store-memory_0.1.3_1786622527046_0.45054797712218564"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T03:55:45.534Z","modified":"2026-08-13T12:02:07.360Z","0.1.0":"2026-06-17T03:55:45.762Z","0.1.1":"2026-06-23T07:36:26.123Z","0.1.2":"2026-06-25T12:09:14.471Z","0.1.3":"2026-08-13T12:02:07.192Z"},"maintainers":[{"name":"dongkseo","email":"ssddgg99@daum.net"}],"readme":"# @dongkseo/store-memory\n\n**Stability: experimental** · `pnpm add @dongkseo/store-memory`\n\n> 이 파일은 에이전트(사람·LLM)가 **소스를 열지 않고도** 이 패키지를 쓸 수 있게 하는 오리엔테이션 문서다.\n> 정확한 API 타입은 \"API 표면\" 섹션의 방법으로 `signatures`만 읽어라 — 본문을 베끼지 말 것.\n\n## 무엇인가 / 무엇이 아닌가\n\n에이전트의 **연상 기억(associative memory)** 을 담는 인메모리 그래프 패키지다. Key(개념) ↔ Memory(사실)\n의 N:M 이분 그래프 위에서 임베딩 기반 의미 검색·2-hop 연상·시간 감쇠·버전 체인을 제공한다.\n\n- ✅ 담는 것: `MemoryGraph` (remember/recall), 임베딩 프로바이더 팩토리(`createOpenAIEmbedding`,\n  `createOllamaEmbedding`), 벡터 헬퍼(`cosineSim` …), 관련 타입\n- ❌ 안 담는 것: 영속화(디스크/DB) — 상태는 프로세스 메모리에만 있고 `export()`/`data` 옵션으로만\n  주고받는다. 임베딩 모델 자체도 안 담는다(외부 API/Ollama 호출 또는 직접 주입)\n- ⚠️ **optional 패키지**. 기억이 필요한 에이전트만 의존하면 된다.\n\n의존 방향은 **store-memory → contracts** 단방향(타입만). store-memory를 의존하는 쪽은 기억을 쓰는 에이전트/툴.\n\n## 핵심 개념\n\n| 개념 | 무엇 | 대표 export |\n| --- | --- | --- |\n| **MemoryGraph** | 기억 그래프의 진입점. remember로 저장, recall로 의미 검색 | `MemoryGraph`, `MemoryGraphOptions` |\n| **Memory / Key** | 사실(Memory)과 개념(Key)을 잇는 N:M 노드 | `Memory`, `MemoryKey`, `MemoryKeyLink`, `KeyType` |\n| **RecallResult** | recall 결과. 점수·depth·hop(1=직접, 2=연상)·매칭 경로 | `RecallResult` |\n| **EmbeddingProvider** | 텍스트→벡터 변환 계약. 직접 구현하거나 팩토리 사용 | `EmbeddingProvider` |\n| **Embedding 팩토리** | OpenAI API / 로컬 Ollama용 프로바이더 생성기 | `createOpenAIEmbedding`, `createOllamaEmbedding` |\n| **Vector 헬퍼** | 코사인 유사도 계산 순수 함수 | `cosineSim`, `batchCosineSim` |\n| **GraphData** | 그래프 전체 스냅샷(영속화 복원용) | `GraphData`, `export()` |\n\n특징: 2-hop 연상 검색(Newton → apple → fruit → strawberry), depth 강화(자주 떠올리면 강해짐),\n시간 감쇠(얕은 기억은 흐려지고 깊은 기억은 유지), supersede 체인(덮어쓰기 대신 버전 관리),\n중복 감지(cosine ≥ 0.90 → supersede), 키 병합(cosine ≥ 0.85 → 개념 재사용).\n\n## 사용 레시피\n\nOpenAI 임베딩으로 기억을 저장·연상한다 (`src/index.ts` TSDoc 기준, 실제 동작 코드):\n\n```ts\nimport { MemoryGraph, createOpenAIEmbedding } from '@dongkseo/store-memory';\n\nconst graph = new MemoryGraph({\n  embedding: createOpenAIEmbedding({ apiKey: process.env.OPENAI_API_KEY }),\n});\n\nawait graph.remember('User prefers TypeScript', ['programming', 'preference']);\nconst results = await graph.recall('What language does the user like?');\n// results[0].content === 'User prefers TypeScript', .hop === 1\n```\n\n로컬 Ollama로 키 없이 돌린다:\n\n```ts\nimport { MemoryGraph, createOllamaEmbedding } from '@dongkseo/store-memory';\n\nconst graph = new MemoryGraph({\n  embedding: createOllamaEmbedding({ model: 'nomic-embed-text' }), // 기본 http://localhost:11434\n});\n```\n\n임베딩 프로바이더를 직접 주입한다 (테스트/커스텀 모델, `src/__tests__` 기준):\n\n```ts\nconst graph = new MemoryGraph({\n  embedding: {\n    embed: async (text) => /* number[] 반환 */,\n    embedBatch: async (texts) => /* number[][] 반환 */,\n  },\n});\n```\n\n스냅샷 내보내기/복원 (영속화는 호출자 몫):\n\n```ts\nconst snapshot = graph.export();                                  // GraphData\nconst restored = new MemoryGraph({ embedding, data: snapshot });  // 복원\n```\n\n## API 표면 (소스 안 열고 타입만)\n\n`index.ts` 맨 위에 **섹션 맵 주석**이 있다. 정확한 시그니처가 필요하면 구현 본문 대신\n**signatures 모드**로만 읽어라:\n\n```\nctx_read(path=\"packages/store-memory/src/memory-graph.ts\",        mode=\"signatures\")\nctx_read(path=\"packages/store-memory/src/embedding-providers.ts\", mode=\"signatures\")\nctx_read(path=\"packages/store-memory/src/types.ts\",               mode=\"signatures\")\nctx_read(path=\"packages/store-memory/src/index.ts\",               mode=\"map\")   # 전체 export 목록\n```\n\n어떤 파일에 뭐가 있는지는 `src/index.ts` 상단 주석 맵을 먼저 보면 된다.\n\n## 유지보수 (drift 방지)\n\n- 이 README = **목적·개념·레시피** 만. 거의 안 변하므로 손으로 관리.\n- **API 정본은 각 소스의 TSDoc** (`/** … */`). API가 바뀌면 코드 옆 TSDoc만 고치면 됨 — 여기 표는 복제하지 말 것.\n- 새 모듈을 export하면 `index.ts` 상단 섹션 맵에 한 줄만 추가.\n\n## Tests\n\n```bash\ncd packages/store-memory && pnpm test\n```\n\nPart of the [Nexora](../../README.md) multi-tenant agent framework. · [Package map](../../docs/architecture/packages-map.md)\n","readmeFilename":""}