{"_id":"@anona-labs/memory","_rev":"7-9c9e936f904fb92bae0909738f2bd68d","name":"@anona-labs/memory","dist-tags":{"latest":"0.13.0"},"versions":{"0.6.0":{"name":"@anona-labs/memory","version":"0.6.0","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.6.0","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"9c07a28653ae0e5d5d415a9747f254136ef52402","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.6.0.tgz","fileCount":23,"integrity":"sha512-XRMHRCcuneQ84accPnjsAcaTAxpjJxEBcyGZprA7ThVqcGjqW7UWByDYxXHKtkhHGpdzVOOkZdHt9m00BRG6yA==","signatures":[{"sig":"MEUCIQDQTFy9L2hs/jVYxnpvOPzTUAm99s20vtwc0AuD9z0LvwIgSdfnixx2jr3zPbRx0N6IcHKMI+Ic4bP/eJITw7A1m9g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":304971},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"72c41a841b1adb7b7e8bf86cf18faf1ab58f310f","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.6.0_1788535413739_0.9824431164655358","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@anona-labs/memory","version":"0.6.1","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.6.1","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"390c24260c060da862d12bcd68e99bc1dcc402cb","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.6.1.tgz","fileCount":23,"integrity":"sha512-OUy//YHJLf1NvfCApkEiozLenA5tIdAryzXgTo4qzH+Br/XSjiwts5bucNiXQ/HaYpjSb+NSXDbKSNTJ3ioygQ==","signatures":[{"sig":"MEUCIQCJ1CXgovbBxnORZAnjd12pgHBEby84bqhtXHF5SZ9F1gIgXd3CeK4cKA54cD8a3sd7ArY0W/FeDVnFXlmJBlEg5ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDbxVoTrhGkDTGLQd11gOgASen4VBaIjMX9oQrDkbThAwIgbZBR4nb0dwzB8PVX8ZJ5LIPhTK+Kplz/oF1u0flHhes=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":306069},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"b32fd8e66a34f125992c438744ff206ec65b3b63","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.6.1_1788536746942_0.11827715759741131","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@anona-labs/memory","version":"0.7.0","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.7.0","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"fc1347f636c3badb645fb4d76b55e42465d910e1","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.7.0.tgz","fileCount":23,"integrity":"sha512-+DjjMMgw6v4mOIEcB61ataAO0fZ5EcBXgvqzDahxCmz6foDWfQDOp/QAWl5FrYZRaGW86T1hiWeURYqt079wTg==","signatures":[{"sig":"MEYCIQDbny+PfAmMsPlfKUyZROriGeNw2+6D2uWXvVG95icS9gIhALsnRjE8o17gUFqi1peGAC7OWBp5HuFdISM9ALbKQoON","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD7zOFK+zHuGD82eH9rbzfPk/bvQy+YBGNv7KQhgrXw1QIhAJ4AiCFzg6BjA76W5reX2k0TpbtQWdid5a0Fzwq1/+hn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":408314},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"3217158388c395e7ad08ee25d35bcb94f40a2f19","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.7.0_1788622029447_0.857319452446492","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@anona-labs/memory","version":"0.7.1","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.7.1","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"fedf4c4efad6b5a78f06500101e91f623f325cfa","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.7.1.tgz","fileCount":23,"integrity":"sha512-PsxjUNwQ4nb8yM7D0M/xPAUKuGrQvy5zJrRGM/MoT4bGChLVPdz27gxHmdnTHt2Io3JFE6ZAfZ9cG5YO4unc+g==","signatures":[{"sig":"MEUCIQCZWr6Tc6dILa3OUQRJK2PZt2lCM7v7HaWxGJEf9SaiqAIgbplVLv789QAsMbghYXdJitDytoF3H6kP0Gwb8BO7Vb0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICqbfp+k/msJWX5RMyXhZlvfKc1ZNpiUp8kS+B4g0jp3AiAFHrDCEyG8P2Gv0jhSzYJbqvnrjgCV5d1m3zG+ftphYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":408869},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"fe6a66a6d24d0564b03e7002fbbb78b8917aa17c","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.7.1_1788841703499_0.9479876852820213","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@anona-labs/memory","version":"0.7.2","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.7.2","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"9f29cca5cf7ffd8352094025d979eb404168182c","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.7.2.tgz","fileCount":23,"integrity":"sha512-7MUTjKgawF2HkslGWz2yMW+Rh2ShH9bPzKkkWNtQjwGSADU1gu4APPbEnMZhXHQaJ+m21sc+5GAHmU9LR6fpuw==","signatures":[{"sig":"MEYCIQCulEd+cQvybdNRN0f/UQbG8tFJxIoiYXD8EHplYLPvBgIhALtjEDJtz5l02kfwcndPc3OrN3Ze4oLxL4I9jZV84JZg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGRX6iG2mO5GtbBuMOAOOSTlQBzzVzRGbQ45tBlTWkPgAiBhQEdmmP/FkN4Syc3VQvbdWJH43nrjCiqiIe9kx4WWsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":408924},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"da1592f51ece0047517d04af2d28148573404627","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.7.2_1789107052898_0.8672682618307062","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@anona-labs/memory","version":"0.10.0","keywords":["ai","memory","agents","llm","rag"],"license":"MIT","_id":"@anona-labs/memory@0.10.0","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"homepage":"https://anonalabs.com","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"13adb8826d97d38d5fb442dc3beb1221da47f3bb","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.10.0.tgz","fileCount":23,"integrity":"sha512-R1FrfxRJRSpEjGqjaao+NXYaMayWRJm8YPUXy2xHpyfygH1zxCeKmT5vz2sBbxuIKWn0KPqjJuUGZWni/B4f8A==","signatures":[{"sig":"MEUCIGEujnsQteCJ80APWmQPAAmQG1BOE7Q+7hU1orDSVqKhAiEAvKcWX8ybB0FvTHejLyEI+0iruWk5G1iZ8MYrEKow0Lk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDtsBGfkoLcUTflSlKJCX0P2qbFtpfk11R4fJ7PjM+b9AIhAMq8D6Hgt3Rib9wIR/helICkZh1ojFs0rC2szAWvbgA3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":438427},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"e9fe4aae115550116e077297b3fed271b22b5894","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.0.2","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/memory_0.10.0_1789908756670_0.05039903466504403","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"_id":"@anona-labs/memory@0.13.0","bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"dist":{"shasum":"af8b952fb84068be1362dc3f444f85394b622aca","tarball":"https://registry.npmjs.org/@anona-labs/memory/-/memory-0.13.0.tgz","fileCount":23,"integrity":"sha512-G07Hj60bJEw2pgJGsPdfsN8vkYEJywB0ooKEVY6/vjPz82zLvYzJ5687kpeatoqHCC76X3C6jHtBeNo0GdWNtw==","signatures":[{"sig":"MEUCIAQLT87zQAa5mbxWR5RkPyIufCivlIUtkg7l23w5ys1CAiEA/fTF3mVeYTfwHPCC+ABFKRKljp2ILIeBllLLES9sNes=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCAlSVv6C+gIW3Csh8n/oVBwcAPfYFbBrbP0t65tc9waQIgJ6QRlJgL832udNciRJ5oQtjcSBhDT7lZK51+ydZY8kI="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anona-labs%2fmemory@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":533231},"main":"./dist/index.cjs","name":"@anona-labs/memory","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vercel":{"import":{"types":"./dist/adapters/vercel.d.ts","default":"./dist/adapters/vercel.mjs"},"require":{"types":"./dist/adapters/vercel.d.cts","default":"./dist/adapters/vercel.cjs"}},"./openai-agents":{"import":{"types":"./dist/adapters/openai-agents.d.ts","default":"./dist/adapters/openai-agents.mjs"},"require":{"types":"./dist/adapters/openai-agents.d.cts","default":"./dist/adapters/openai-agents.cjs"}}},"gitHead":"4b08fdf3a23e7c519bdc021500a441ce57faba09","license":"MIT","scripts":{"test":"vitest run","build":"tsup","smoke":"npm run build && node --experimental-strip-types scripts/smoke.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"0.13.0","_npmUser":{"name":"raisrujan","email":"srujan@anonalabs.com"},"homepage":"https://anonalabs.com","keywords":["ai","memory","agents","llm","rag"],"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"_npmVersion":"12.1.0","description":"Anona Memory SDK — managed AI memory for intelligent agents","directories":{},"maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^5.0.0","tsup":"^8.3.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/node":"^22.0.0","@openai/agents":"^0.14.0","@ai-sdk/provider":"^2.0.0"},"peerDependencies":{"ai":">=5","zod":">=3","@openai/agents":">=0.1"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"@openai/agents":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/memory_0.13.0_1790784441209_0.2174675450874688"}}},"time":{"created":"2026-09-04T15:23:33.544Z","modified":"2026-09-30T16:07:21.847Z","0.6.0":"2026-09-04T15:23:33.887Z","0.6.1":"2026-09-04T15:45:47.045Z","0.7.0":"2026-09-05T15:27:09.565Z","0.7.1":"2026-09-08T04:28:23.600Z","0.7.2":"2026-09-11T06:10:52.971Z","0.10.0":"2026-09-20T12:52:36.762Z","0.13.0":"2026-09-30T16:07:21.311Z"},"bugs":{"url":"https://github.com/anonalabs/Anona-Memory-SDK/issues"},"license":"MIT","homepage":"https://anonalabs.com","keywords":["ai","memory","agents","llm","rag"],"repository":{"url":"git+https://github.com/anonalabs/Anona-Memory-SDK.git","type":"git","directory":"typescript"},"description":"Anona Memory SDK — managed AI memory for intelligent agents","maintainers":[{"name":"anona-admin","email":"anona-admin@anonalabs.com"},{"name":"raisrujan","email":"srujan@anonalabs.com"}],"readme":"# @anona-labs/memory\n\nManaged memory for AI agents. Zero dependencies, runs on Node 18+, Bun, Deno,\nCloudflare Workers and the browser.\n\n```bash\nnpm i @anona-labs/memory\n```\n\n**Documentation** — [TypeScript SDK](https://docs.anonalabs.com/sdk/javascript) ·\n[Quickstart](https://docs.anonalabs.com/quickstart) ·\n[Concepts](https://docs.anonalabs.com/concepts) ·\n[API reference](https://docs.anonalabs.com/api-reference/overview) ·\n[MCP server](https://docs.anonalabs.com/mcp-integration)\n\nLooking for Python? `pip install anona` — see\n[docs.anonalabs.com/sdk/python](https://docs.anonalabs.com/sdk/python).\n\n## Agent Skills\n\nTwo installable [Agent Skills](https://docs.anonalabs.com/integrations/skills)\nthat teach a coding agent to use Anona without being told to — recall before a\ntask, record after it — in Claude Code, Codex, Hermes, OpenCode or Cursor.\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/anonalabs/Anona-Memory-SDK/main/skills/install.sh | bash\n```\n\nOr `npx skills add anonalabs/Anona-Memory-SDK`, or the Claude Code plugin\nmarketplace (`/plugin marketplace add anonalabs/Anona-Memory-SDK`). Source and\noptions: [`skills/`](skills/).\n\n## Quickstart\n\n```ts\nimport { Anona } from \"@anona-labs/memory\";\n\nconst anona = new Anona({ apiKey: process.env.ANONA_API_KEY! });\n\nawait anona.createSpace({ name: \"support\" });\nawait anona.record({ spaceId: \"support\", content: \"Alice prefers email over phone.\" });\n\nconst memories = await anona.retrieve({ spaceId: \"support\", query: \"how should I contact Alice?\" });\nconsole.log(memories[0]?.content);\n```\n\n## Vercel AI SDK\n\n```ts\nimport { openai } from \"@ai-sdk/openai\";\nimport { generateText, wrapLanguageModel } from \"ai\";\nimport { Anona } from \"@anona-labs/memory\";\nimport { anonaMemory } from \"@anona-labs/memory/vercel\";\n\nconst anona = new Anona({ apiKey: process.env.ANONA_API_KEY! });\n\nconst model = wrapLanguageModel({\n  model: openai(\"gpt-4o\"),\n  middleware: anonaMemory({ client: anona, spaceId: \"support\" }),\n});\n\nconst { text } = await generateText({ model, prompt: \"How should I contact Alice?\" });\n```\n\nRequires `ai` v5 or newer.\n\n## OpenAI Agents SDK\n\n```ts\nimport { Agent, run } from \"@openai/agents\";\nimport { Anona } from \"@anona-labs/memory\";\nimport { anonaTools } from \"@anona-labs/memory/openai-agents\";\n\nconst anona = new Anona({ apiKey: process.env.ANONA_API_KEY! });\nconst agent = new Agent({\n  name: \"support\",\n  tools: anonaTools({ client: anona, spaceId: \"support\" }),\n});\n\nawait run(agent, \"What do you know about Alice?\");\n```\n\n## Uploading files\n\n```ts\nimport { readFile } from \"node:fs/promises\";\n\nawait anona.uploadFiles({\n  spaceId: \"support\",\n  files: [{ data: await readFile(\"handbook.pdf\"), filename: \"handbook.pdf\" }],\n  tags: [\"handbook\"],\n});\n```\n\nLimits: 25 MB per file, 50 MB per request, 20 files per request — all checked\nbefore anything is sent. Ingestion is asynchronous; poll the returned job ids\nwith `getJob`.\n\n## Correcting or retiring a memory\n\n```ts\n// Fix the content\nawait anona.updateMemory({ spaceId, memoryId, text: \"Alice moved to Berlin in March\" });\n\n// Retire it without losing it — reversible, unlike deleteMemory\nawait anona.updateMemory({ spaceId, memoryId, state: \"invalidated\", reason: \"superseded\" });\nawait anona.updateMemory({ spaceId, memoryId, state: \"active\" }); // put it back\n\n// How the system's understanding of it evolved\nconst { history } = await anona.getMemoryHistory({ spaceId, memoryId });\n```\n\n`getMemoryHistory` reflects supersession inside the memory layer, not your own\nedits — a memory you just changed still reports an empty history. The `reason`\nyou pass to `updateMemory` is what gets retained for audit.\n\n`state: \"invalidated\"` drops a memory out of retrieve, consolidation and\nreasoning while keeping it for audit. Prefer it over `deleteMemory`, which is\npermanent. Memories the system synthesised from your raw facts cannot be\nedited — they are derived, so the API rejects the attempt.\n\n## What a space knows about one end user\n\nIf you scope writes with `userId`, a space accumulates a per-user history.\nThese two read it back without you reconstructing it from a wide-open search:\n\n```ts\nconst profile = await anona.getUserProfile({ spaceId: \"support\", userId: \"alice_123\" });\nconsole.log(profile.memory_count, profile.last_active);\n\n// Prompt-ready instead of a list\nconst { context } = await anona.getUserProfile({\n  spaceId: \"support\",\n  userId: \"alice_123\",\n  format: \"block\",\n  contextMaxTokens: 500,\n});\n\n// One synthesised answer, from this user's memories only\nconst { insights, model } = await anona.askAboutUser({\n  spaceId: \"support\",\n  userId: \"alice_123\",\n  query: \"How does she prefer to be contacted?\",\n});\n```\n\n- **An unknown user is not a 404.** A `userId` is a scope tag created by the\n  first write naming it, not a resource you register, so there is nothing for a\n  typo to fall outside of — a user nobody has recorded under comes back with\n  `memory_count: 0` and an empty `memories`. An unknown *space* is still a 404.\n- **`memory_count` can go down.** Consolidation folds several raw facts into\n  one note and the default view counts the note, so a profile read during an\n  import can go 115 → 67 → 15 while the corpus behind it grows the whole time.\n  It is \"how many distinct things we know about this user\", not an ingestion\n  counter — do not build a progress bar on it.\n- **`askAboutUser` reports the model that answered** in `model`, which is not\n  necessarily the one you asked for, since omitting it resolves a default.\n  Reconcile the credits on the call against that field.\n\n## Errors\n\n```ts\nimport { AnonaError } from \"@anona-labs/memory\";\n\ntry {\n  await anona.retrieve({ spaceId: \"nope\", query: \"x\" });\n} catch (error) {\n  if (error instanceof AnonaError) {\n    console.error(error.statusCode, error.code, error.requestId, error.retryAfter);\n  }\n}\n```\n\n429 and 5xx are retried twice by default. 4xx is never retried, and neither is a\n5xx on a write (`record`, `recordBatch`, `uploadFiles`, `createSpace`,\n`createWebhook`, `reason`) — a 5xx can arrive after the work landed, so\nreplaying it would store the memory twice.\n\n**A 429 waits as long as the server says to.** The rate-limit window is a whole\nminute, so a client backing off on its own schedule tops out in the low seconds,\nspends both retries landing on the same full bucket, and fails anyway. The\nclient reads `Retry-After`, falling back to the `window_seconds` the rate-limit\nbody carries, and waits that out (capped at 60s). `error.retryAfter` carries the\nsame number if you would rather schedule it yourself.\n\n**A 503 with no `requestId` may be a Cloudflare-mangled 502 or 504.** The edge\nstrips the body of those two statuses, so the API rewrites them to 503 before\nthey leave. Report such a failure with a timestamp rather than treating it as a\nmalformed response.\n\n## Staying inside the rate limit\n\nEvery metered response reports the budget it left you, so you can pace a bulk\njob instead of discovering the ceiling by hitting it.\n\n```ts\nawait anona.retrieve({ spaceId: \"support\", query: \"billing\" });\nconst { remaining, limit, windowSeconds, creditsRemaining } = anona.rateLimit;\nif (remaining !== undefined && remaining < 5) {\n  await new Promise((r) => setTimeout(r, (windowSeconds ?? 60) * 1000));\n}\n```\n\nFields are `undefined` until a metered call has been made. The unmetered routes\n— spaces, settings, webhooks — report no budget and leave the last reading in\nplace rather than blanking it. `getUsage()` asks the API directly instead, which\ncosts a request but does not need one to have happened first.\n\n## Notes that save debugging time\n\n- **A space's id is its name.** There is no separate id to assign, and passing\n  one is rejected. A name with spaces or slashes is legal — the client encodes\n  it for you.\n- **`relevance_score` can exceed 1.0.** It is a product of four factors, not a\n  normalised probability. It is `null` for memories returned outside a ranked\n  recall.\n- **`retrieve` deduplicates by default.** Raw evidence facts are omitted when a\n  consolidation already covers them. Pass `preferObservations: false` to see\n  both layers.\n- **`asOf` and `queryTimestamp` are not the same knob.** `asOf` is a hard\n  cutoff on when a memory was *recorded*; `queryTimestamp` only re-ranks and\n  never removes a result. Reach for `asOf` when the cutoff has to be enforced.\n- **`occurredAfter` / `occurredBefore` bound a third thing again:** when the\n  event *happened*. That is the one question `asOf` cannot answer, since a year\n  of history imported this morning has one record time and twelve months of\n  event time. Either bound alone is an open-ended window, and the test is an\n  overlap, so an event straddling an edge is inside.\n- **A null `occurred_start` on a result is not a missing date.** Those fields\n  are filled only from a date found in the memory's own text; the `timestamp`\n  you recorded it with comes back as `timestamp`, and is what the window above\n  matches against.\n\n## Scoping one space to many users\n\n```ts\nawait anona.record({\n  spaceId: \"support\",\n  content: \"Alice prefers email\",\n  userId: \"alice\",\n});\n\n// Only Alice's memories come back. The filter is strict, so memories stored\n// without a scope are not returned to a scoped search.\nawait anona.retrieve({ spaceId: \"support\", query: \"how to contact\", userId: \"alice\" });\n```\n\n`userId`, `agentId` and `sessionId` nest in that order, and a call that passes\nnone of them behaves exactly as it always did.\n\n## Prompt-ready context\n\n```ts\nconst context = await anona.getContext({\n  spaceId: \"support\",\n  query: \"what does Alice need\",\n  maxTokens: 500,\n});\n```\n\nThe same search as `retrieve`, already formatted, with the token budget applied\nserver-side rather than by a loop that does not have one. Returns `\"\"` when\nnothing matched, so it can go straight into a system prompt.\n\n## Extraction settings\n\nRecording a memory is not storage. Your text goes through one pass that decides\nwhich facts are worth keeping, and only what survives is stored — so a detail\ndropped there is not ranked low later, it is not there at all. These settings\npoint that pass at your domain.\n\n```ts\nawait anona.setExtractionSettings({\n  spaceId: \"engineering\",\n  guidance:\n    \"Engineering log. Always capture service names, metric values with units, \" +\n    \"and the named owner. Treat incidents as dated events. Skip standup small talk.\",\n});\n```\n\n`guidance` is added to the standard rules and applies in every mode — start\nthere. `mode` is `\"concise\"` (the default), `\"verbose\"`, `\"verbatim\"`, or\n`\"custom\"`; `customPrompt` replaces the standard rules and only applies while\nthe mode is `\"custom\"`.\n\n`setExtractionSettings` **replaces** the record, so anything you leave out is\ncleared. Settings apply to writes made after the call — stored memories are\nnever re-extracted, so changing these never rewrites history. Unhelpful guidance\nproduces no error; extraction simply keeps different things.\n\n### Labels: tag your memories as they are written\n\nFiltering recall is only as good as the tags a memory carries, and by default\nevery one of them has to be supplied by hand on the write that created it. A\nlabel taxonomy hands that job to extraction: name a dimension once, and every\nmemory is classified along it as it is written.\n\n```ts\nawait anona.setExtractionSettings({\n  spaceId: \"engineering\",\n  labels: [{\n    key: \"name\",\n    type: \"multi-text\",\n    tag: true,\n    description:\n      \"Every name the subject of this memory is known by, including \" +\n      \"abbreviations, acronyms and short forms. Write them lowercase, words \" +\n      \"separated by single spaces, with no punctuation.\",\n  }],\n});\n```\n\nA group with `tag: true` is written onto the memory as the tag\n`\"<key>:<value>\"`, so `retrieve` can filter on it through `tagGroups`. A memory\nabout Kubernetes then carries `name:kubernetes`, `name:k8s` and `name:kube`, and\nany of the three finds it:\n\n```ts\nawait anona.retrieve({\n  spaceId: \"engineering\",\n  query: \"what did we decide about k8s\",\n  tagGroups: [{ tags: [\"name:k8s\"], match: \"any_strict\" }],\n});\n```\n\nFour group types, in two pairs. `value` and `multi-values` pick from a `values`\nlist you supply, one or several. `text` and `multi-text` take whatever the\nmemory itself supplies, one value or all of them, for a vocabulary you cannot\nenumerate in advance. `multi-text` is the one identity needs: a thing rarely has\na single surface form, and `text` would keep only the first.\n\nTags match as exact strings, so describe the format you want in the group's\n`description` and normalise your query the same way.\n\nSome things are refused rather than stored, because each would look saved and do\nnothing: an enumerated group with no `values`; a `text`/`multi-text` group *with*\n`values`; two groups sharing a `key`; a key that is not already in tag form\n(lowercase letters, digits, `-`, `_`); and `freeFormEntities: false` with no\nlabels, which would keep no entities at all rather than only labelled ones.\nTwelve groups maximum, since the taxonomy rides the extraction prompt on every\nwrite.\n\n## Rules a space must follow\n\nA rule is a standing instruction the space obeys whenever it answers. It is not\na preference and not a tone setting: a rule applies to **every** answer the\nspace gives, and it overrides what the memories say.\n\n```ts\nawait anona.createRule({\n  spaceId: \"accounts\",\n  name: \"Never call revenue committed\",\n  content:\n    \"Never describe revenue as committed unless a memory records a signed \" +\n    \"document. Name the stage the deal is actually at instead.\",\n  priority: 100,\n});\n```\n\n`priority` orders the rules, highest first, with ties broken by whichever was\nwritten most recently. `name` is the label an answer reports back, so write it\nfor whoever reads that answer.\n\nRules shape the answers the API synthesises for you — `reason`, `askAboutUser`,\nand the memory models a space keeps. They do not change what `retrieve` returns.\n\nA space may have **25 active** rules at once. A rule that is switched off is\nstored and still editable but never applied, and does not count against the\ncap — so switching one off is always a way back under it without throwing work\naway:\n\n```ts\nfor (const rule of await anona.listRules(\"accounts\")) {\n  console.log(rule.priority, rule.name, rule.is_active ? \"active\" : \"off\");\n}\n\nawait anona.updateRule({ spaceId: \"accounts\", ruleId: \"rl_1\", isActive: false });\nawait anona.deleteRule({ spaceId: \"accounts\", ruleId: \"rl_1\" });\n```\n\n`updateRule` changes only the fields you pass, so switching a rule off or\nlifting its priority never means resending the text of something enforced on\nevery answer.\n\nAn answer says which rules shaped it:\n\n```ts\nconst result = await anona.reason({\n  spaceId: \"accounts\",\n  query: \"Is the two-year renewal a done deal?\",\n});\n\nfor (const rule of result.rules_applied ?? []) {\n  console.log(\"shaped by:\", rule.name);\n}\n```\n\n`rules_applied` carries the id and name of each rule that applied, and\ndeliberately not its text — that is your own configuration and already in hand.\nAn empty array is the useful finding that no rule applied, which is what\nseparates \"the memories are wrong\" from \"a rule said otherwise\".\n\nRules are owner-only, and free — an organisation out of credits must still be\nable to switch off a rule that is producing bad answers.\n\n## Compound tag filters\n\n`tags` is a flat list under a single match mode, so it can say \"any of these\" or\n\"all of these\" and nothing else. `tagGroups` takes a boolean expression instead,\nfor the moment a filter has two clauses that combine differently, or a clause\nthat excludes.\n\n```ts\nawait anona.retrieve({\n  spaceId: \"support\",\n  query: \"what is left to do\",\n  tagGroups: [\n    { or: [{ tags: [\"project:alpha\"] }, { tags: [\"project:beta\"] }] },\n    { not: { tags: [\"status:archived\"] } },\n  ],\n});\n```\n\nGroups in the list are AND-ed. Each is either a leaf `{ tags, match }` or one of\n`{ and }`, `{ or }`, `{ not }`, nested as deep as you need. `match` on a leaf\ntakes the same values as `tagsMatch` and defaults to `\"any_strict\"`.\n\nThree things worth knowing:\n\n- **The non-strict modes treat an untagged memory as matching**, so a leaf\n  written with `\"any\"` or `\"all\"` widens an expression rather than narrowing it,\n  and both are refused inside a `not` for that reason.\n- **The filter is compiled into the search**, not applied to its output, so an\n  excluded memory never competes for a slot.\n- **It composes rather than replaces.** `tags`, `userId`, `agentId` and\n  `sessionId` are all AND-ed onto your expression.\n\nLimits: 25 leaves and 5 levels of nesting per request; 500 tags in any one leaf\nand 1,000 across the whole expression. A leaf naming hundreds of tags is a\nnormal shape rather than abuse: one leaf is a single set-containment test, so\nnaming every candidate you might mean and letting the filter decide which of\nthem the space actually has is cheaper than spreading them over separate\nleaves. `reason` accepts the same argument.\n\n### Matching a name you are not sure of\n\nTags match as exact strings, which is right when your own code wrote them and\nwrong when it did not. An agent building a filter out of something a user typed\nhas to guess the exact string a memory was stamped with, and one typo means the\nmemory is unreachable.\n\nSet `resolve` to `\"fuzzy\"` on a leaf and its tags become candidates instead of\nrequirements. Each is compared against the tags the space actually holds, and\nthe close ones are added to the filter:\n\n```ts\nawait anona.retrieve({\n  spaceId: \"support\",\n  query: \"what did we decide about the checkout rewrite\",\n  tagGroups: [{ tags: [\"name:typsecript\", \"name:chekcout\"], resolve: \"fuzzy\" }],\n});\n```\n\n`name:typsecript` matches nothing on its own. Resolved, it also matches\n`name:typescript`.\n\nFive things worth knowing:\n\n- **It widens, it never narrows.** The tags you named are always kept, so a\n  fuzzy leaf matches at least everything the same leaf matched exactly.\n- **Resolution stays inside the tag's namespace.** The part before the first\n  colon must match exactly and only what follows it is compared, so\n  `name:chekcout` can reach `name:checkout` and never `status:checkout`.\n- **Short candidates are matched literally.** Below four characters after the\n  namespace nothing is resolved, because similarity on two or three characters\n  is noise: `api` and `apis` score 0.5 and they are different things.\n- **A word of a longer tag is not a misspelling of it.** A candidate has to be\n  about as long as what it matches, so `name:pipeline` does not resolve to\n  `name:functional pipeline`.\n- **It fixes misspellings, not abbreviations.** `kubernetes` and `k8s` have\n  almost no letters in common, so nothing resolves one to the other. That is\n  what [labels](#labels-tag-your-memories-as-they-are-written) are for: a\n  `multi-text` group records every name a thing is known by, and the exact\n  filter finds them.\n\n`resolve` may only be combined with a `match` of `\"any\"` or `\"any_strict\"`, or\nleft unset: a resolved leaf is a set of alternatives, so `\"all_strict\"` would\nask one memory to carry every alternative at once.\n\n## Automatic space routing\n\nNaming a space is the normal way to work. `route: \"auto\"` hands that decision to\nAnona instead, matched against what each space declares it is for.\n\n```ts\nconst result = await anona.record({ route: \"auto\", content: \"Acme is on net-30.\" });\nfor (const target of result.routed_to ?? []) {\n  console.log(target.space_id, target.stage, target.reason);\n}\n\nconst memories = await anona.retrieve({ route: \"auto\", query: \"Acme's payment terms?\" });\nfor (const looked of memories.searched ?? []) {\n  console.log(looked.space_id, looked.stage, looked.reason);\n}\n```\n\n`spaceId` and `route` are a union: passing both, or neither, is a **compile**\nerror, and at runtime an `AnonaError` with `code: \"route_conflict\"` thrown\nbefore the request goes out. \"Neither\" is an error rather than an implicit\nauto-route — a caller who merely forgot `spaceId` should not have their memory\nfiled somewhere they never named.\n\n**Read the decision.** A routed write answers with `routed_to`, a routed read\nwith `searched`; each entry is `{ space_id, confidence, stage, reason }`, where\n`stage` is `\"rule\"`, `\"model\"` or `\"fallback\"` and `confidence` is `null` on the\nfirst and last of those. Nothing else distinguishes a misroute from a correct\ncall: both succeed. `retrieve` still resolves to a plain `SearchResult[]` —\n`searched` rides on the array and is `undefined` on an addressed read.\n\n**An abstention searches nothing.** If no space is judged to answer the\nquestion, `searched` is one entry whose `space_id` is `null` and the array is\nempty. `fallbackSpaceId` has no default on a read, deliberately: the fallback\nspace is where everything that fitted nowhere ends up, so it is the least\ntopically coherent space you own and the worst place to look — searching it\nreturns irrelevant memories that read exactly like real ones. On a write it does\ndefault, to your organization's default space, because a memory has to be stored\nsomewhere. `maxTargets` (writes only) is capped at 1 server-side today.\n\nA batch is routed **as one unit**, so `recordBatch` takes the same fields and\nanswers with job ids and no `routed_to`.\n\nRouting matches against each space's routing profile — a charter, topics and\nrules, set on `/v1/spaces/{space_id}/routing-settings`. That endpoint is\nREST-only for now; the SDK does not model it yet.\n\n## API\n\n| Method | Purpose |\n| --- | --- |\n| `record` | Store a memory — pass `background: true` to queue it, which is ~10× faster; pass `route: \"auto\"` instead of `spaceId` to let Anona choose the space |\n| `recordBatch` | Up to 100 memories, always queued |\n| `getJob` | Status of a queued job |\n| `retrieve` | Search memories — `tagGroups` filters with a boolean expression, see below; `route: \"auto\"` picks the space and reports it as `searched` |\n| `getContext` | The same search, returned as one prompt-ready string |\n| `reason` | Synthesised answer across a space |\n| `listSpaces` / `getSpace` / `createSpace` / `deleteSpace` | Space management |\n| `listSpaceTypes` | What a new space can be born knowing — pass one as `createSpace({ spaceType })` |\n| `listMemories` / `getMemoryHistory` / `updateMemory` / `deleteMemory` | Memory management |\n| `uploadFiles` / `listDocuments` / `getDocument` / `deleteDocument` | Documents |\n| `getUserProfile` / `askAboutUser` | What a space knows about one end user |\n| `getGraph` / `listEntities` / `getEntity` | Entity graph |\n| `getExtractionSettings` / `setExtractionSettings` / `resetExtractionSettings` | Steer what a write keeps — see below |\n| `getChatSettings` / `setChatSettings` / `resetChatSettings` | Per-space defaults for the drop-in proxy endpoints |\n| `createWebhook` / `listWebhooks` / `updateWebhook` / `deleteWebhook` | Webhook management |\n| `listWebhookDeliveries` | Recent delivery attempts, for debugging a receiver |\n| `getUsage` | Credits and rate limit for this key |\n| `cancelJob` | Stop the parts of a queued job that have not started |\n| `getReasonSettings` / `setReasonSettings` / `resetReasonSettings` | The model and the depth `reason` uses for a space |\n| `listRules` / `createRule` / `updateRule` / `deleteRule` | Rules every answer from a space must follow |\n| `listMemoryModels` / `createMemoryModel` / `getMemoryModel` / `updateMemoryModel` / `deleteMemoryModel` | Standing questions a space keeps an answer to |\n| `refreshMemoryModel` / `clearMemoryModel` / `getMemoryModelHistory` | Re-answer, wipe, or read earlier versions |\n| `getSpaceProfile` | A space's mission and disposition |\n| `listCatalogModels` | The LLMs this deployment will answer with, and what each costs |\n| `retrieveReceipt` / `getReceipt` / `explain` | A search plus the receipt id for it, and why it returned what it did |\n\n## Documentation\n\nFull guides and the complete REST reference live at\n[docs.anonalabs.com](https://docs.anonalabs.com):\n\n| Page | What it covers |\n| --- | --- |\n| [TypeScript SDK](https://docs.anonalabs.com/sdk/javascript) | Every method on the `Anona` client |\n| [Quickstart](https://docs.anonalabs.com/quickstart) | First key to first memory |\n| [Concepts](https://docs.anonalabs.com/concepts) | Spaces, scoping, observations, credits |\n| [API reference](https://docs.anonalabs.com/api-reference/overview) | The REST API this client wraps |\n| [MCP server](https://docs.anonalabs.com/mcp-integration) | Local stdio and remote transports |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}