{"_id":"@shadowforge0/aquifer-memory","_rev":"27-885cc20ac3b4f9e799bfca708019581a","name":"@shadowforge0/aquifer-memory","dist-tags":{"latest":"1.9.2"},"versions":{"0.2.0":{"name":"@shadowforge0/aquifer-memory","version":"0.2.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.2.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"97afe21c02da3cc271e34c7d057a0b62af3672cb","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.2.0.tgz","fileCount":18,"integrity":"sha512-rZUw3tz+gvNhLMjjlCK8d3k9Tw3op3GWLYqgaxIRe6gR7Qj6OYcMsX6hhl+1aRyp51fDdk4EQMxslrjUrB8SPQ==","signatures":[{"sig":"MEQCICgRxZQ7RbkwRINJnYe4q+001jEyyA1A4uLhLqHOfNunAiAs6VYXFfH5SvWlFJxCN4CiTun7qJBpfFbskfw1wCp2Cw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135342},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"1889440689d7b7fad8f292ee0aeee0976ec6863c","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.2.0_1775712444868_0.9135360243844788","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@shadowforge0/aquifer-memory","version":"0.3.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.3.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"724d090eac15fca71303ad96a2804545173ece5b","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.3.0.tgz","fileCount":19,"integrity":"sha512-Aso0PB0AI/WY7Q1CNnb+RqXKty44kW/F+b3AEACgMtcCuyquHb6c2XpNKQVHoSSAu4ETTIyh8EakeSHeny9x+Q==","signatures":[{"sig":"MEYCIQCK8tWFrSPbU8tI8qBHWIqW2+qqq+mziAczUbWp2mBvLAIhAMwIJjocXDYXth6IGHys0BN1NQFGC9EBnoVDNMbEIBIU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149172},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"6b24502fac88e02ab10378b09bc58138deedc9b7","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.3.0_1775970824274_0.7667471392243159","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@shadowforge0/aquifer-memory","version":"0.3.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.3.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"5b6a33018f6bcd4243137477889c3e7317e477bd","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.3.1.tgz","fileCount":19,"integrity":"sha512-UHdck/iNZwpuj8LlFwMezAS/e5TQYLdg4iiOBI6oIm38jyTGLubOt9vaDvzQeDxcIC2NkpPl3CqFaaTc9SR2Bw==","signatures":[{"sig":"MEYCIQC1QR2a60doIDQb737gWx3lbqlBq0guof8pzOzzgVRadAIhAPLXCHfac1ZV9tDy+sBpJ6wRZYOJpRWAla/pU1q3IaIC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149650},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"2c0fa10af1d795527409117865d01b7ee2ef894d","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.3.1_1775971552716_0.9564982199971488","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@shadowforge0/aquifer-memory","version":"0.4.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.4.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"03c0c84b419853d68fb063cb1956b1b3c92e95e1","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.4.0.tgz","fileCount":19,"integrity":"sha512-5VfZTkjspAelRMgh6Ok2gdqTobnybxWjjz79h+qt1TUW3T9MhZ/ezhTrNZRmmCdqms1jwhsN+dVbGafhKAC6zA==","signatures":[{"sig":"MEQCIEIY6kLdonr0fFMxjeh9+Wur9F0ojFbv5NkgvAENZO8UAiBF6qThDNPGLX8i6mKG0yWocslu5KPvzB/gRPMPgHWCdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154478},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"0b1178a8694d0fb9f474b1232253fffd2f6607de","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.4.0_1775977291600_0.737415408531165","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@shadowforge0/aquifer-memory","version":"0.4.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.4.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"17810770e65db8fd876d1127c62064c72a6fd22f","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.4.1.tgz","fileCount":19,"integrity":"sha512-l9udHVdHz5XeEsdzhJjxLz9GTe5TgOXfhAek1Km9MiBU3dcY73skXgSQxYut7ODm9HTlkl4ItRusS6CArZ6vfA==","signatures":[{"sig":"MEUCIQConGCkyNd5JqIYHN/3buAQo6Vk8fVIanP7+KZRSd7pdwIgONonwHIuVM3nqAAZnLevWVBIPXmWDy74jYxTGTOfMwU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154495},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"0b1178a8694d0fb9f474b1232253fffd2f6607de","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.4.1_1775983121187_0.133650732712423","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@shadowforge0/aquifer-memory","version":"0.5.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.5.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"7f39eaf81bf511d62bf07256a3fcd79eab2eec46","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.5.0.tgz","fileCount":19,"integrity":"sha512-Cn+m8tQ3YrkEzXCcb4dxWNQeHsFrBQDaEBmB5LX2C1zuw5qkFbrvYDoljezcEhCmR67O96yuX6/U/mFI+0aa7A==","signatures":[{"sig":"MEQCIGhe+Z0zYf7eCVDsdvJz19VD+485w932g1rn7QzFvluxAiBXU49q0BkumTO18zN1UR/Drw8btffhgAlYQBiumIA7Xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156341},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"e55685e5e190255ab2880354967523df9fcbe230","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.5.0_1775987723565_0.6712990459907164","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@shadowforge0/aquifer-memory","version":"0.6.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.6.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"fc262096717073768d0df946a3dbec68d95f2f7b","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.6.0.tgz","fileCount":19,"integrity":"sha512-WATX3JXGv9Snv0Uw3s3eLbgiQCTGDE6NEwou/S8rJ+YSXtHEsw7rJzhFEA4M79eYJ//uThM9DWgBVkRFkSncKg==","signatures":[{"sig":"MEUCIB0S2S1Ga7ZG63uLaPvKDmYJOM7MBQgl5EKBS5eGHUgjAiEA0xIntptA/mnjaDnp3hK8smVaVC+/PfGzu0Il2tHyWME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160924},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"0359daf8120060e6b6cff8c8dc41831f2f6ae319","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.6.0_1776145168907_0.6834819899353854","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@shadowforge0/aquifer-memory","version":"0.7.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.7.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"6942f6cb7871f256fa7711a23063132b8f622380","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.7.0.tgz","fileCount":21,"integrity":"sha512-MjIU06/4Lf0NMoJ/rzDxk7SUdOXQPYfG5poRAppHavvvRstUW0XfTO2VnhvGUjHgn+boe2pTlbpu+iXHzSeb1w==","signatures":[{"sig":"MEYCIQDu7i8RPohuf/omO0Z2Q9fulgMulu6MtuKOuLuBcLwUfAIhAM7cFU7sZNh7k7CLd0KkLTXie0naiqblyBRV83Z26Tlq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172429},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"0d81af999f8a10f1f4d11e57170b919e1c3f2aa4","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.7.0_1776164500013_0.3896688630764489","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@shadowforge0/aquifer-memory","version":"0.8.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.8.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"0c25fd2b452ef0b60a653c40aea2cdb6e33c0999","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.8.0.tgz","fileCount":28,"integrity":"sha512-IauZgO36Tu/LWH2iDgRCjFJDPuGXs/5fCU/OqkB0EEVYXmqEn3OF8JO1iARGpR8EdMdO37kp+0SI3W1WfJMuDQ==","signatures":[{"sig":"MEQCIF0GPHqXJBi8MdpYyEIoU51iEjlFoJ79gNngMzXGbN4IAiArz4AsXHnG1clByBNwGLzfATmGsAc9RvSzwlk0qctUlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197106},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"3162e619fd9a9c821f6096ceafa212893904465c","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. Includes CLI, MCP server, and OpenClaw plugin.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0"},"_hasShrinkwrap":false,"optionalDependencies":{"zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.8.0_1776249363521_0.21726423477698953","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@shadowforge0/aquifer-memory","version":"0.9.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.9.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"914e9d2aff7ce6cb511432986cbbf4c6b83760a1","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.9.0.tgz","fileCount":30,"integrity":"sha512-byhDWEqJg++NwD/r5rnyX7E+VOUsVxEkPYxW1az2X7snHHFdxVyef+qQemGpfDpw4Vi7l7SEX6wqxz2aYFEQxg==","signatures":[{"sig":"MEUCIElBkG+chrNw44FAwG4g40+Qg8mViU60yhSJEsAFAJU9AiEAqQQ2IT0hsIlaYMzMSrx+Eo4AKMQAbj6Xl7qvti209og=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214064},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"3904bb6239348df7e3375faccbac014cc40a3cc6","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.9.0_1776250811810_0.07855518790158111","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@shadowforge0/aquifer-memory","version":"0.9.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@0.9.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"9807e85d1db5ce548c23d53e26a69c2d22c13d08","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-0.9.1.tgz","fileCount":30,"integrity":"sha512-iN1XLym3zOunqQfHDp99GXMEyVy37XIC1LrproyHPfD1qUeqvOMuYD2fXBlGXj7k+NrnOTgQx0Qx51lQGCMhIQ==","signatures":[{"sig":"MEUCIQDupGEPa4vd7pihr8501zmV88kOir124zN2JcoCWjKltQIgJFZJRXMt196zn+VJeZ0pM4p4L0emTsItCoFpZJsO51o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215959},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"9a2bece9b5d437aba645547d88fa1226d76b7d2d","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_0.9.1_1776301118935_0.8500486064637414","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@shadowforge0/aquifer-memory","version":"1.0.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.0.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"ced3072c8d3e4030c9dd3d58eef1a81ada3119c8","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.0.0.tgz","fileCount":31,"integrity":"sha512-J8ZhIoHEIErGLW9K76OcA56yexTx73nmihUjfOIlLmJ/FynVwknYAqO4ezRl8jw2CyVhIHULrCrh0KgazHv4Qw==","signatures":[{"sig":"MEQCIB2PfA3/SolgLf+fsKe+H0JTFUEGmx4nSxe58zOkOhUaAiAuKN5goTpWzzyWyx7PbGalAWPQNa6qC13Q77+lh8TGHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235554},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./core/*":"./core/*.js","./pipeline/*":"./pipeline/*.js","./consumers/mcp":"./consumers/mcp.js","./consumers/opencode":"./consumers/opencode.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"d1e014a6b8e63f1e714e5dc14578459642863a81","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.0.0_1776335662144_0.8092991196850645","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@shadowforge0/aquifer-memory","version":"1.0.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.0.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"2730ebc82efcb26f8c56b972ec5cf7d734b2d5df","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.0.1.tgz","fileCount":31,"integrity":"sha512-p7wt/xEEpoyqqiSnt4S3fJn7DpPWZ6f+FWo2XdXNtCxhwP2r0z+UC+lbEC55P9nlH3ITdJfgop1iSprOIPkcrw==","signatures":[{"sig":"MEUCIAxHtksIOgrwTEP2+TlWY4eHfdTmHy1RHpRaqN0udHUcAiEA+D4wjPlmGDefADQ8eGDDo7Z9VUykQ78qiuDJxFm1yzc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232393},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/opencode":"./consumers/opencode.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"e44a59130976dcbd79070ec3b43b5382aebaf0ac","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.0.1_1776345732001_0.23722498375747914","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@shadowforge0/aquifer-memory","version":"1.0.2","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.0.2","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"a4d595c7f00321eb816a93cbfa1ed9cb47c2a839","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.0.2.tgz","fileCount":32,"integrity":"sha512-dh9SQxXaHfzAHrkwwGOtMqvSoUbQZ/Bigsyx54GJ0Zxv3Mt2ZJbubQvhvQBOUbZ0VJyWqbjzGFKZe3oSLMOzVQ==","signatures":[{"sig":"MEUCICAwoXiq7ALuC3VmC+hwtD2Jwyt7AOIVmsNV0gYG0yUfAiEAtX96nlH+ib7xoxTKzFuavzcOqambSOtk7GVOJuiyAhw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":237937},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/opencode":"./consumers/opencode.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"cac006dbf3d82cd97edf2a483e7b1ab0066e00a5","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.0.2_1776348645455_0.3909414991033575","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@shadowforge0/aquifer-memory","version":"1.0.3","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.0.3","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"ff27d232af8fb8bc253fe2c4dc3ffa2d3fe0ac1d","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.0.3.tgz","fileCount":32,"integrity":"sha512-m58Rcfonep1qNp2RfAXZVws/rPLzJJhhTywVpzIBBDqinnPmTy+lNXY8Pi3yo4+gMY6BOx89ZNGF6d9OvnpJCQ==","signatures":[{"sig":"MEUCIBm9I0LJP4dDjZYOeml2XnzH58IMJLraQ4DEahMDU+hnAiEA2knYAQM55pZe+pK6BP4MjK1A0UJll2zsuxac3D0RHcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239162},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/opencode":"./consumers/opencode.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js"},"gitHead":"7a63a7fb84d21ce1e25684088b4b1f453696d8e8","_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.0.3_1776349169701_0.3523512894448999","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@shadowforge0/aquifer-memory","version":"1.2.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.2.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"81b3595d74ec394338d2fba4b4521981a748521f","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.2.1.tgz","fileCount":59,"integrity":"sha512-3z7X/t2Pmj02Ab58a1l3sUhyG/K+vTd3TSxvvur1vzDEk2MVSGCA+f9yw2exaAhIlYkFu4z2OJMXnzPoXs/zbA==","signatures":[{"sig":"MEUCIFZckqg4vTOGfHYretl0ik7GkO3vcMz+l/MIgbYpsBlIAiEAxF66l46Vxx/XQ6BrmH2WjhKZgNjeiayvQgpGYX3XiKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390872},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/default":"./consumers/default/index.js","./consumers/miranda":"./consumers/miranda/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"gitHead":"5e93413892255e96c5532ba0ad9aa9faf9fb0a02","scripts":{"lint":"eslint index.js core/*.js consumers/*.js consumers/shared/*.js consumers/miranda/*.js consumers/miranda/prompts/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","prepare":"git config core.hooksPath .githooks 2>/dev/null || true","test:integration":"node --test test/integration.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.2.1_1776557397166_0.7820519579940433","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@shadowforge0/aquifer-memory","version":"1.3.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.3.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"32fc05bb8be81748da4e7a436fab85d58c94b24f","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.3.0.tgz","fileCount":73,"integrity":"sha512-HZ0+AMeLW7FO8KZ7KC8P6lZiLa6pMbMUIFbTCe5QsCbCmvDlSot1Cm52PfQqcYu+tlt4l+mvYQGQmV6otovkwA==","signatures":[{"sig":"MEUCIQCs8p/6CgAHiHJT/NWs/9Gbm7YWM6pBwJTxYe0Z+yl46gIgM9KvvlR+RFBH3ZW7rbTlPNY/bZDF4z/uhbg5inaN6Z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":501142},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/default":"./consumers/default/index.js","./consumers/miranda":"./consumers/miranda/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"gitHead":"ab004820cb6dbd2fe3ada75e2c70e0fa9551180d","scripts":{"lint":"eslint index.js core/*.js consumers/*.js consumers/shared/*.js consumers/miranda/*.js consumers/miranda/prompts/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","prepare":"git config core.hooksPath .githooks 2>/dev/null || true","test:integration":"node --test test/integration.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.3.0_1776577132132_0.982056058382077","host":"s3://npm-registry-packages-npm-production"}},"1.5.8":{"name":"@shadowforge0/aquifer-memory","version":"1.5.8","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.5.8","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"161a61b2ec237bbf64eca7a347b628a1bb9fb162","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.5.8.tgz","fileCount":85,"integrity":"sha512-MmaSn8rDLsRJp/znInl+aSI089mwxOzFL1HqV+7Xx6GXiNmoaKatjhSdu/O1ccrUQejB1Y8DZ7l4SSm4TSrsdA==","signatures":[{"sig":"MEUCIAY3w2L1KfQJIngjZuW5eH6z08WLVlVUfuQf0YfDRqU1AiEA3WQN7vix1y6ctuf21y3NkNwKnq4YcG6GRxy08CiFDmA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":643832},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/default":"./consumers/default/index.js","./consumers/miranda":"./consumers/miranda/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"gitHead":"49e0e91a6cf2e6bf3aec3c89a9751f23c8b5d28f","scripts":{"lint":"eslint index.js core/*.js consumers/*.js consumers/shared/*.js consumers/miranda/*.js consumers/miranda/prompts/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","prepare":"git config core.hooksPath .githooks 2>/dev/null || true","test:integration":"node --test test/integration.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.5.8_1776686352812_0.5037757113292924","host":"s3://npm-registry-packages-npm-production"}},"1.5.9":{"name":"@shadowforge0/aquifer-memory","version":"1.5.9","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.5.9","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"3d3b720d49e0ac16ee1cdc2838a9f56ca6ceb70a","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.5.9.tgz","fileCount":85,"integrity":"sha512-oWc5qeyXsau7SY1Z4ISHjHeD0TPT666ZC9MiwOvWqwGvXKrU168UZpuWjkcYnTR3ZXVaffUGiaJ0k2FxCcROWA==","signatures":[{"sig":"MEUCIACrZrGww1CbaxIkPjNcZcof9OMLS2QnvEzKt3QaQPmiAiEAgwAxaS0Pk6DUVtzjrG7U6PfXItxdOTIZclbW5HV9r+o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":649709},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/default":"./consumers/default/index.js","./consumers/miranda":"./consumers/miranda/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"gitHead":"a80481f85a0fb6559e9a298e21784a4216c74554","scripts":{"lint":"eslint index.js core/*.js consumers/*.js consumers/shared/*.js consumers/miranda/*.js consumers/miranda/prompts/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","prepare":"git config core.hooksPath .githooks 2>/dev/null || true","test:integration":"node --test test/integration.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.5.9_1776692417561_0.5128217100537324","host":"s3://npm-registry-packages-npm-production"}},"1.5.12":{"name":"@shadowforge0/aquifer-memory","version":"1.5.12","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.5.12","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"0621b02613140f5943ba15f5b54c4136614d754b","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.5.12.tgz","fileCount":83,"integrity":"sha512-uZHSeVqOAL0ctGzOqR3j1UROjAjMdS8znWP6KsN8mbmOd6sfAoQdvyNPPuM9OpaEykJGi7YrdRdvNdNcyESCgQ==","signatures":[{"sig":"MEYCIQCQDD5Otd0uCS4BborPQ9u0OHZRcKZLHJuPKZ/jjK62uAIhAIzKHvDbdsFRXHrNiiOp0MMHA/dI70vQTNbqdhYRvvnO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":658418},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/default":"./consumers/default/index.js","./consumers/miranda":"./consumers/miranda/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"gitHead":"989e306fde52fd52a7802e8748c73cf3824e67ab","scripts":{"lint":"eslint index.js core/*.js consumers/*.js consumers/shared/*.js consumers/miranda/*.js consumers/miranda/prompts/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","prepare":"git config core.hooksPath .githooks 2>/dev/null || true","test:integration":"node --test test/integration.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.5.12_1776812153285_0.7709138093809189","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@shadowforge0/aquifer-memory","version":"1.6.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.6.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"b1dc8c104bdcc9cd3f4dab7892459396331d84b0","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.6.0.tgz","fileCount":95,"integrity":"sha512-Y5sOnlZuf1yx0zNwnl7TRw5xirKWQBYSFffNk0aBKm8SHqeWCZqZxJIT2sh7A+mkiiKGUahJE9MRvS5zMTkPZg==","signatures":[{"sig":"MEUCIB9WYYxnXvl3i5c1xAOVS+ax7PSSpI84ncr6k/amhfToAiEAupc2FndWpTqfc8U1WIEOpejHUdKLGzcBniJB/WAVD0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":978282},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"56f243a005e4e4a91295284c0790f392ff195c81","scripts":{"lint":"eslint index.js core/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-handoff.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.6.0_1777319469366_0.3639489049374869","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@shadowforge0/aquifer-memory","version":"1.7.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.7.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"bf8f74bedb37a188be8a2916abb0a9e4ca342a16","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.7.0.tgz","fileCount":95,"integrity":"sha512-5ux/fL43i5zVFEaM2EqnUD6Y4r7JhoGGwmV7AR2wP1Ht7dUjdcvyzcsP2zn3AAp+thXVRKkwS3qa/hgGX63igw==","signatures":[{"sig":"MEQCIDBuYSgvzB9Ivwz+tgjzWq++fdHDkmOWHtaA/U4Lljk0AiAnieIDK3ntmQKp9qMfIJJe2HNPKIx3a8SeBcQ+izSWNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1023172},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"dda592e78d16b16d0ea0bd351344091468353bd5","scripts":{"lint":"eslint index.js core/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-handoff.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/consumer-codex.test.js test/codex-handoff.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.7.0_1777398306472_0.34917919731675684","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@shadowforge0/aquifer-memory","version":"1.8.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.8.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"17a5b79cecdca2d300eb7de2115c0e5a2452615c","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.8.0.tgz","fileCount":115,"integrity":"sha512-dczjdJY1oKndWysSERv57OQrLpb0hlcjEerYwlo1dJ1S7hCoUBRKpM2xnnUzfZMJmo6AjHagCAYDjKC/nbzXPA==","signatures":[{"sig":"MEUCIQDJUK8ynlgDEJ1bs28hofvyMoRPOlzT4KFDjPpPKKBkMwIgbL8LUnxspec/bTH4YHBQVUAWSjRvU4tt/z9QlTOGtVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1260939},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"8f7335a3104292bd0fac3a7a0e746a4d92b197fe","scripts":{"lint":"eslint index.js core/*.js core/backends/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-active-checkpoint.js consumers/codex-current-memory.js consumers/codex-handoff.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test test/v1-evidence-items.test.js test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js test/local-backend.test.js test/scope-attribution.test.js test/v1-checkpoint-ledger-schema.test.js test/v1-finalization-envelope-schema.test.js test/v1-evidence-items.test.js test/v1-curated-semantic-recall.test.js test/session-checkpoints.test.js test/session-checkpoint-producer.test.js test/session-checkpoint-planner.test.js test/storage-checkpoint-ranges.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/v1-scope-inheritance.golden.test.js test/v1-bootstrap-determinism.test.js test/consumer-codex.test.js test/codex-recovery-script.test.js test/codex-handoff.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.8.0_1777586666570_0.5987346352003038","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"@shadowforge0/aquifer-memory","version":"1.8.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.8.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"a5410671564b876b5c4009bd99a856f7c3f33581","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.8.1.tgz","fileCount":115,"integrity":"sha512-YNxoVzHa1DHP1+d9C7tXHZ/1y9DXILaJYsylwYD/ZHlcj/XNH4x9qoomHZa9pTISE7vzvqewTRl5BNBy919vHw==","signatures":[{"sig":"MEUCIQDVe/ljclEC5u29FG+3fEX2Nca0nkCrVQ5o47K5qjrjpQIgfFKEggBZESoEhaSnMhtCeW7s5ZZoAD6s1SDNjIV3p0w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1261710},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"092ec4a72356f309b1e20a264dcc7a4c70696f22","scripts":{"lint":"eslint index.js core/*.js core/backends/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-active-checkpoint.js consumers/codex-current-memory.js consumers/codex-handoff.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test test/v1-evidence-items.test.js test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js test/local-backend.test.js test/scope-attribution.test.js test/v1-checkpoint-ledger-schema.test.js test/v1-finalization-envelope-schema.test.js test/v1-evidence-items.test.js test/v1-curated-semantic-recall.test.js test/session-checkpoints.test.js test/session-checkpoint-producer.test.js test/session-checkpoint-planner.test.js test/storage-checkpoint-ranges.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/v1-scope-inheritance.golden.test.js test/v1-bootstrap-determinism.test.js test/consumer-codex.test.js test/codex-recovery-script.test.js test/codex-handoff.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.8.1_1777587654940_0.4574169381821658","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@shadowforge0/aquifer-memory","version":"1.9.0","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.9.0","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"d54339554e125bbc71551eaba6e27c194d593bf0","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.9.0.tgz","fileCount":122,"integrity":"sha512-ASegkwGGf/8UvB+u8t5IB6xkT7YemnNXVs4rsIcYWV8FrBKz5QBSeU9BH7+FToXiFJ6TBBVW5QoJ6tZknpl1pw==","signatures":[{"sig":"MEUCIQDQRZ498/jSWntGSMysEGW29Ub8ERDx41ZIZS8BK71HjQIgSVfMB4ZS9Z04MwHoScoRhcmzShxNvXF7DWG9WpomMCg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1440344},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"af2ee0b730f1ef6cb363a32c07d8bd4cdc61e731","scripts":{"lint":"eslint index.js core/*.js core/backends/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-active-checkpoint.js consumers/codex-current-memory.js consumers/codex-handoff.js consumers/openclaw-install.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test --test-concurrency=1 test/v1-evidence-items.test.js test/memory-review.integration.test.js test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js test/local-backend.test.js test/scope-attribution.test.js test/doctor.test.js test/finalization-inspector.test.js test/memory-explain.test.js test/memory-review.test.js test/operator-observability.test.js test/storage-finalization-status.test.js test/cli-parseargs.test.js test/v1-checkpoint-ledger-schema.test.js test/v1-finalization-envelope-schema.test.js test/v1-memory-review-resolutions-schema.test.js test/v1-evidence-items.test.js test/v1-curated-semantic-recall.test.js test/session-checkpoints.test.js test/session-checkpoint-producer.test.js test/session-checkpoint-planner.test.js test/storage-checkpoint-ranges.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/v1-scope-inheritance.golden.test.js test/v1-bootstrap-determinism.test.js test/consumer-codex.test.js test/codex-recovery-script.test.js test/codex-handoff.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.9.0_1778197394265_0.1237391260216103","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"@shadowforge0/aquifer-memory","version":"1.9.1","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"author":{"name":"shadowforge0"},"license":"MIT","_id":"@shadowforge0/aquifer-memory@1.9.1","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"bin":{"aquifer":"consumers/cli.js"},"dist":{"shasum":"5a698cab01c9b30d472a997f591f76f4b0564023","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.9.1.tgz","fileCount":127,"integrity":"sha512-7mXrKudE4KaO8dDhuhtQ0vNCPCjCn0BpVU+s2IBbV+4ho9mkW0Au/VuPivPI50+r8gqbuTOjegu7B5vuxQm4dQ==","signatures":[{"sig":"MEQCIHvWn0i9nop67K1f5Dpi17uvDRmMhhQoNvSGvh98kPTDAiAMbpczuwwNCCf+gi/CCIw/N+eOpJG/c8TcIfhP58NSSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1546677},"main":"index.js","engines":{"node":">=18.0.0"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/opencode":"./consumers/opencode.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js"},"gitHead":"eab91d28db890cae916dee1cf1bd724ae70f3fa3","scripts":{"lint":"eslint index.js core/*.js core/backends/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-active-checkpoint.js consumers/codex-current-memory.js consumers/codex-handoff.js consumers/openclaw-install.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js scripts/*.js test/*.js","test":"node --test test/*.test.js","hooks:install":"git config core.hooksPath .githooks","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test --test-concurrency=1 test/v1-evidence-items.test.js test/memory-review.integration.test.js test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","test:integration":"node --test test/integration.test.js","test:release:package":"node --test test/package-surface.test.js test/mcp-manifest.test.js test/local-backend.test.js test/scope-attribution.test.js test/doctor.test.js test/finalization-inspector.test.js test/memory-explain.test.js test/memory-review.test.js test/operator-observability.test.js test/storage-finalization-status.test.js test/cli-parseargs.test.js test/v1-checkpoint-ledger-schema.test.js test/v1-finalization-envelope-schema.test.js test/v1-memory-review-resolutions-schema.test.js test/v1-evidence-items.test.js test/v1-curated-semantic-recall.test.js test/session-checkpoints.test.js test/session-checkpoint-producer.test.js test/session-checkpoint-planner.test.js test/storage-checkpoint-ranges.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/v1-assistant-shaping-memory.test.js test/v1-assistant-shaping-review-explain.test.js test/v1-scope-inheritance.golden.test.js test/v1-bootstrap-determinism.test.js test/consumer-codex.test.js test/codex-recovery-script.test.js test/codex-handoff.test.js"},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"repository":{"url":"git+https://github.com/shadowforge0/aquifer.git","type":"git"},"_npmVersion":"10.9.4","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"pg":"^8.13.0","zod":"^3.25.76","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aquifer-memory_1.9.1_1778375674187_0.5487481055186774","host":"s3://npm-registry-packages-npm-production"}},"1.9.2":{"name":"@shadowforge0/aquifer-memory","version":"1.9.2","description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","main":"index.js","bin":{"aquifer":"consumers/cli.js"},"exports":{".":"./index.js","./consumers/mcp":"./consumers/mcp.js","./consumers/openclaw-plugin":"./consumers/openclaw-plugin.js","./consumers/opencode":"./consumers/opencode.js","./consumers/hermes-agent":"./consumers/hermes-agent.js","./consumers/codex-handoff":"./consumers/codex-handoff.js","./consumers/claude-code":"./consumers/claude-code.js","./consumers/codex":"./consumers/codex.js","./consumers/default":"./consumers/default/index.js","./consumers/openclaw-ext":"./consumers/openclaw-ext/index.js","./consumers/shared/config":"./consumers/shared/config.js","./consumers/shared/factory":"./consumers/shared/factory.js","./consumers/shared/entity-parser":"./consumers/shared/entity-parser.js","./consumers/shared/normalize":"./consumers/shared/normalize.js","./consumers/shared/ingest":"./consumers/shared/ingest.js","./consumers/shared/recall-format":"./consumers/shared/recall-format.js","./consumers/shared/compat-recall":"./consumers/shared/compat-recall.js","./consumers/shared/session-start-policy":"./consumers/shared/session-start-policy.js","./consumers/shared/summary-parser":"./consumers/shared/summary-parser.js","./consumers/shared/llm-autodetect":"./consumers/shared/llm-autodetect.js"},"repository":{"type":"git","url":"git+https://github.com/shadowforge0/aquifer.git"},"homepage":"https://github.com/shadowforge0/aquifer#readme","bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"author":{"name":"shadowforge0"},"scripts":{"test":"node --test test/*.test.js","test:integration":"node --test test/integration.test.js","qc:release":"node consumers/cli.js qc release","qc:release:gate":"node consumers/cli.js qc release --strict","qc:publish:gate":"node consumers/cli.js qc release --strict --require-version-tag","test:release:package":"node --test test/package-surface.test.js test/release-qc.test.js test/mcp-manifest.test.js test/mcp-runtime.test.js test/compat-recall.test.js test/explicit-ingest.test.js test/shared-normalize.test.js test/hermes-agent-consumer.test.js test/local-backend.test.js test/scope-attribution.test.js test/doctor.test.js test/finalization-inspector.test.js test/memory-explain.test.js test/memory-review.test.js test/operator-observability.test.js test/storage-finalization-status.test.js test/cli-parseargs.test.js test/daily-memory.test.js test/spec-contract.test.js test/v1-checkpoint-ledger-schema.test.js test/v1-finalization-envelope-schema.test.js test/v1-memory-review-resolutions-schema.test.js test/v1-daily-memory-items-schema.test.js test/v1-memory-upgrade-apply-ledger-schema.test.js test/v1-evidence-items.test.js test/v1-curated-semantic-recall.test.js test/session-checkpoints.test.js test/session-checkpoint-producer.test.js test/session-checkpoint-planner.test.js test/storage-checkpoint-ranges.test.js test/v1-serving-cutover.test.js test/v1-current-memory-contract.test.js test/v1-assistant-shaping-memory.test.js test/v1-assistant-shaping-review-explain.test.js test/v1-scope-inheritance.golden.test.js test/v1-bootstrap-determinism.test.js test/session-start-policy.test.js test/consumer-codex.test.js test/codex-recovery-script.test.js test/codex-handoff.test.js","test:release:db":"node -e \"if (!process.env.AQUIFER_TEST_DB_URL) { console.error('AQUIFER_TEST_DB_URL is required for test:release:db'); process.exit(1); }\" && node --test --test-concurrency=1 test/session-source-identity.integration.test.js test/migration-handshake.integration.test.js test/v1-evidence-items.test.js test/memory-review.integration.test.js test/consumer-mcp.integration.test.js test/consumer-cli.integration.test.js test/codex-finalization-serving.integration.test.js","lint":"eslint index.js core/*.js core/backends/*.js consumers/cli.js consumers/mcp.js consumers/claude-code.js consumers/codex.js consumers/codex-active-checkpoint.js consumers/codex-current-memory.js consumers/codex-handoff.js consumers/hermes-agent.js consumers/openclaw-install.js consumers/openclaw-plugin.js consumers/opencode.js consumers/shared/*.js consumers/default/*.js consumers/default/prompts/*.js consumers/openclaw-ext/*.js pipeline/*.js pipeline/consolidation/*.js pipeline/normalize/*.js pipeline/normalize/adapters/*.js scripts/*.js test/*.js","hooks:install":"git config core.hooksPath .githooks"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","pg":"^8.13.0","zod":"^3.25.76"},"devDependencies":{"eslint":"^9.0.0"},"engines":{"node":">=18.0.0"},"license":"MIT","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"_id":"@shadowforge0/aquifer-memory@1.9.2","gitHead":"8d3589ba60c82de70a46866e383e18c9cdcab281","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-F8IG3evPBMKcHZMZXW5r5DgnAJv1zzNxVXeMhvwUqqUA6JvVJLSHV39soYA26kPSJCEi5NH5M+rrdyyBDXnF5A==","shasum":"f0403daa53b8df1ffe4a99798cc143b496a356fd","tarball":"https://registry.npmjs.org/@shadowforge0/aquifer-memory/-/aquifer-memory-1.9.2.tgz","fileCount":138,"unpackedSize":1799483,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGFu4UcCVjTrP7QwECxKfrEOrZhL3mIByOjcvDyFQgrUAiEAu+15rxhf6cbue77o3Kb7ebxjXjuGro1lkOncKUz+o8E="}]},"_npmUser":{"name":"shadowforge0","email":"burkechung@gmail.com"},"directories":{},"maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aquifer-memory_1.9.2_1779409188121_0.8728605621110539"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-09T05:27:24.752Z","modified":"2026-05-22T00:19:48.470Z","0.2.0":"2026-04-09T05:27:25.065Z","0.3.0":"2026-04-12T05:13:44.457Z","0.3.1":"2026-04-12T05:25:52.863Z","0.4.0":"2026-04-12T07:01:31.757Z","0.4.1":"2026-04-12T08:38:41.323Z","0.5.0":"2026-04-12T09:55:23.715Z","0.6.0":"2026-04-14T05:39:29.060Z","0.7.0":"2026-04-14T11:01:40.163Z","0.8.0":"2026-04-15T10:36:03.656Z","0.9.0":"2026-04-15T11:00:12.118Z","0.9.1":"2026-04-16T00:58:39.069Z","1.0.0":"2026-04-16T10:34:22.305Z","1.0.1":"2026-04-16T13:22:12.149Z","1.0.2":"2026-04-16T14:10:45.608Z","1.0.3":"2026-04-16T14:19:29.869Z","1.2.1":"2026-04-19T00:09:57.305Z","1.3.0":"2026-04-19T05:38:52.415Z","1.5.8":"2026-04-20T11:59:12.968Z","1.5.9":"2026-04-20T13:40:17.756Z","1.5.12":"2026-04-21T22:55:53.473Z","1.6.0":"2026-04-27T19:51:09.520Z","1.7.0":"2026-04-28T17:45:06.698Z","1.8.0":"2026-04-30T22:04:26.789Z","1.8.1":"2026-04-30T22:20:55.144Z","1.9.0":"2026-05-07T23:43:14.505Z","1.9.1":"2026-05-10T01:14:34.347Z","1.9.2":"2026-05-22T00:19:48.342Z"},"bugs":{"url":"https://github.com/shadowforge0/aquifer/issues"},"author":{"name":"shadowforge0"},"license":"MIT","homepage":"https://github.com/shadowforge0/aquifer#readme","keywords":["ai","memory","postgres","pgvector","agent","long-term-memory","embedding","knowledge-graph","rrf","hybrid-search","mcp","openclaw"],"repository":{"type":"git","url":"git+https://github.com/shadowforge0/aquifer.git"},"description":"PG-native long-term memory for AI agents. Turn-level embedding, hybrid RRF ranking, optional knowledge graph. MCP server, CLI, and library API.","maintainers":[{"name":"shadowforge0","email":"burkechung@gmail.com"}],"readme":"<div align=\"center\">\n\n# 🌊 Aquifer\n\n**Long-term memory for AI agents, backed by PostgreSQL.**\n\n*Store sessions, enrich them, and recall the exact turn where a decision happened — without adding a separate vector database.*\n\n[![npm version](https://img.shields.io/npm/v/@shadowforge0/aquifer-memory)](https://www.npmjs.com/package/@shadowforge0/aquifer-memory)\n[![PostgreSQL 15+](https://img.shields.io/badge/PostgreSQL-15%2B-336791)](https://www.postgresql.org/)\n[![pgvector](https://img.shields.io/badge/pgvector-0.7%2B-blue)](https://github.com/pgvector/pgvector)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n\n[English](README.md) | [繁體中文](README_TW.md) | [简体中文](README_CN.md)\n\n</div>\n\n---\n\n## Start Here\n\nAquifer is designed to have a short default path: start PostgreSQL + embeddings, run `quickstart`, then point your MCP client at `aquifer mcp`.\n\nFor library API usage, skip to [API Reference](#api-reference). For a slightly more guided first run, see [docs/getting-started.md](docs/getting-started.md).\n\n### 1. Start the local stack\n\n```bash\ndocker compose up -d\n# PostgreSQL 16 + pgvector and Ollama with bge-m3 (auto-pulled).\n# First run pulls the model — `docker compose logs -f ollama-pull` to watch.\n```\n\nAlready running PostgreSQL + pgvector and an embedding endpoint? Skip this step. `quickstart` picks up `DATABASE_URL` and embed settings from your environment if you already have them.\n\n### 2. Verify end-to-end\n\n```bash\nnpx --yes @shadowforge0/aquifer-memory quickstart\n```\n\n`quickstart` autodetects `localhost:5432` PostgreSQL and `localhost:11434` Ollama (from step 1 or your own), runs migrations, embeds a test session, recalls it, and cleans up. If it prints `✓ Aquifer is working`, you're done.\n\nFor ongoing use, install it into your project so you skip the `npx` resolution cost: `npm install @shadowforge0/aquifer-memory` then `npx aquifer quickstart`.\n\nUsing OpenAI instead of Ollama? `export EMBED_PROVIDER=openai` + `OPENAI_API_KEY=sk-...` before `quickstart` — model defaults to `text-embedding-3-small`.\n\n### 3. Connect your MCP client\n\nClaude Code, Claude Desktop, or any MCP-capable client — drop this into `.mcp.json` (project-level) or `claude_desktop_config.json`:\n\n```jsonc\n{\n  \"mcpServers\": {\n    \"aquifer\": {\n      \"command\": \"npx\",\n      \"args\": [\"--yes\", \"@shadowforge0/aquifer-memory\", \"mcp\"],\n      \"env\": {\n        \"DATABASE_URL\": \"postgresql://aquifer:aquifer@localhost:5432/aquifer\",\n        \"EMBED_PROVIDER\": \"ollama\",\n        \"AQUIFER_MEMORY_SERVING_MODE\": \"legacy\"\n      }\n    }\n  }\n}\n```\n\nOr run it directly: `DATABASE_URL=... EMBED_PROVIDER=ollama npx aquifer mcp`. The MCP server itself stays strict about env; `quickstart` autodetect is the try-it path, not the production one.\n\nKeep `AQUIFER_MEMORY_SERVING_MODE=legacy` for first rollout. Switch to `curated` only when you want compatibility `session_recall` to serve active curated memory and `session_bootstrap` to use the curated daily/current-memory contract. Curated bootstrap is daily-first and returns daily continuity by default; hosts must explicitly request current memory when they need it. Use `memory_recall` for explicit current-memory lookup, `historical_recall` for the historical/session plane, and `evidence_recall` for the audit/debug lane. Rollback is just flipping env or config back to `legacy`.\n\nHistorical `dateFrom`/`dateTo` filters are local-day windows. They match sessions whose `started_at`, `last_message_at`, or delayed-ingest `created_at` falls within the requested day, so session-end imports are not hidden by UTC date drift.\n\nCurated serving is scope-bound. `AQUIFER_MEMORY_ACTIVE_SCOPE_PATH` is the ordered inheritance path, while `AQUIFER_MEMORY_ALLOWED_SCOPE_KEYS` is the caller boundary. If `activeScopePath` is omitted, Aquifer defaults it to `global` plus the configured `activeScopeKey`, or to `global` alone when no active scope is configured. If `allowedScopeKeys` is omitted, Aquifer defaults it to that active scope path. Runtime requests outside that boundary are rejected before reading current memory rows.\n\n### Common commands\n\n| Goal | Command |\n|---|---|\n| Verify setup | `npx aquifer quickstart` |\n| Run read-only governance diagnostics | `npx aquifer doctor --json` |\n| Run release QC | `npx aquifer qc release --json` |\n| Inspect selected backend capabilities without DB connection | `AQUIFER_BACKEND=local npx aquifer backend-info --json` |\n| Start the MCP server | `npx aquifer mcp` |\n| Search memory manually | `npx aquifer recall \"auth middleware\"` |\n| Explain current-memory bootstrap selection | `npx aquifer explain bootstrap --active-scope-key project:aquifer --json` |\n| Explain current-memory recall selection | `npx aquifer explain memory --query \"serving contract\" --active-scope-key project:aquifer --json` |\n| Inspect finalized-session ledger rows | `npx aquifer finalization list --status finalized --json` |\n| Inspect operator ledgers | `npx aquifer operator status --json` |\n| Review current-memory feedback issues | `npx aquifer review queue --scope-key project:aquifer --feedback-type incorrect --json` |\n| Resolve a reviewed memory queue item | `npx aquifer review resolve --memory-id 42 --resolution resolved --reason \"verified current\" --expected-latest-issue-feedback-id 9 --json` |\n| Plan curated memory compaction | `npx aquifer compact --cadence daily --period-start 2026-04-27T00:00:00Z --period-end 2026-04-28T00:00:00Z` |\n| Generate a timer synthesis prompt | `npx aquifer operator compaction daily --include-synthesis-prompt --json` |\n| Apply reviewed timer synthesis candidates | `npx aquifer operator compaction daily --synthesis-summary-file /tmp/timer-summary.json --apply --promote-candidates --json` |\n| Generate a finalized-session checkpoint prompt | `npx aquifer operator checkpoint --scope-key project:aquifer --min-finalizations 10 --include-synthesis-prompt --json` |\n| Heartbeat-check an active Codex session for checkpoint work | `npx aquifer codex-recovery checkpoint-heartbeat --hook-stdin --scope-key project:aquifer` |\n| Inspect pending Codex checkpoint spool files | `npx aquifer codex-recovery checkpoint-spool-status --json --limit 10` |\n| Preview a Codex UserPromptSubmit heartbeat hook install | `npx aquifer codex-recovery checkpoint-heartbeat-hook --scope-key project:aquifer --hooks-path \"$CODEX_HOME/hooks.json\" --json` |\n| Check memory readiness | `npx aquifer stats` |\n| Check saved-content preparation | `npx aquifer backlog --json` |\n| Dry-run a saved-content policy decision | `npx aquifer backlog --plan skip --status pending --source openclaw-mcp` |\n| Enrich pending sessions | `npx aquifer backfill` |\n\n`stats`, `backlog`, MCP `memory_stats`, and MCP `memory_pending` default to the\nsame public status surface: `Aquifer status` or `Saved content status`, plus\n`Available`, `Attention`, and `Action` where relevant. Use `stats --diagnostics`,\n`backlog --diagnostics`, or MCP `diagnostics: true` for raw counters, buckets,\nguidance, and samples.\n\nReviewed timer synthesis is gated before promotion. Candidate items must carry\n`mergeKey`, `scopeClass`, `durability`, `promotionTarget`, and\n`sourceCanonicalKeys` that reference `sourceCurrentMemory`; runtime state also\nneeds `staleAfter` or `validTo`. The temporal distillation gate rejects\nworkspace/operator policy, transient material, unsupported promotion targets,\ninvalid or missing source lineage, and duplicate merge keys before current\nmemory promotion. `assistant_shaping` is retained only as a compatibility,\nreview, or provenance surface. It is not an active runtime memory type and is\nnot pinned into bootstrap.\n\nTimer synthesis output is candidate material until an operator applies a\nreviewed synthesis summary with `--promote-candidates`; it does not become\nactive curated memory from the prompt or summary file alone. The deterministic\ndaily/weekly/monthly aggregate proposals in a dry-run are source-rollup\nmaterial for review and ledger lineage only, and are blocked from normal active\npromotion unless a reviewed synthesis summary is attached.\n\nCheckpoint output follows the same boundary. `operator checkpoint` plans from\nfinalized session summaries and only writes `checkpoint_runs` when you pass an\nexplicit reviewed synthesis summary with `--apply`. `codex-recovery\ncheckpoint-heartbeat` is the active-session hook heartbeat for Codex JSONL\nfiles: it first checks a tiny local scheduler marker, reads the transcript only\nwhen the time window is due, then writes local spool process material only when\nthe message threshold is also due. It does not print prompt text by default and\ndoes not write DB memory.\nUse `codex-recovery checkpoint-spool-status --json` to inspect pending local\nspool files by session, coverage, byte size, and modified time without printing\nthe checkpoint prompt text.\n\nRead-only governance commands are diagnostic surfaces. `doctor`,\n`finalization list|inspect`, `explain bootstrap|memory`, and\n`operator status|inspect` do not apply migrations, promote memory, mutate\nfinalization status, reclaim operator leases, or add MCP tools. `review\nqueue|inspect` is read-only with respect to memory truth, but uses the normal\nAquifer migration gate because it depends on the resolution ledger schema. It\nderives an operator queue from curated memory feedback such as `incorrect`,\n`stale`, and `scope_mismatch` without printing raw transcripts, feedback notes,\nfeedback metadata, or memory payloads. `review resolve` is the narrow write path\nfor this surface: it appends a snapshot-bound resolution ledger row\n(`resolved`, `ignored`, or `deferred`) without mutating `memory_records` or\nrewriting feedback history. Newer issue feedback reopens the queue item. Use\nthese commands to answer why a session did not finalize, why a current-memory\nrow was selected or excluded, which visible memory rows need human review, and\nwhether operator ledgers contain stale claims before running write paths.\nExplain output includes stable scope inheritance details for selected and\nexcluded rows; non-selected rows redact `title` and `summary` so diagnostics\ncannot become a cross-scope content probe.\n\nRelease QC is a package-maintainer surface. `qc release` runs the fixed release\nchecks from the product package root: lint, package release tests, DB release\ngate when `AQUIFER_TEST_DB_URL` is set, whitespace check, npm pack dry-run,\nworktree private-artifact hygiene, npm version provenance, and local git tag\nprovenance. Use `--json` for automation, `--strict` when warnings or skipped\nchecks should fail CI, and `--require-version-tag` for the final publish gate\nafter tagging the reviewed release commit.\n\nNeed LLM summarization, the knowledge graph, OpenAI embeddings, reranking, or operations details? See [docs/setup.md](docs/setup.md) and [Environment Variables](#environment-variables).\n\n---\n\n## Why Aquifer?\n\nMost AI memory systems bolt a vector DB on the side. Aquifer takes a different approach: **PostgreSQL is the memory**.\n\nSessions, summaries, turn-level embeddings, entity graph — all live in one database, queried with one connection. No sync layer, no eventual consistency, no extra infrastructure.\n\n### What makes it different\n\n| | Aquifer | Typical vector-DB approach |\n|---|---|---|\n| **Storage** | PostgreSQL + pgvector | Separate vector DB + app DB |\n| **Granularity** | Turn-level embeddings (not just session summaries) | Session or document chunks |\n| **Ranking** | 3-way RRF: FTS + session embedding + turn embedding | Single vector similarity |\n| **Knowledge graph** | Built-in entity extraction & co-occurrence | Usually separate system |\n| **Multi-tenant** | `tenant_id` on every table, day-1 | Often an afterthought |\n| **Dependencies** | `pg` + MCP SDK | Multiple SDKs |\n\n### Before and after\n\n**Without turn-level memory — search misses precise moments:**\n\n> Query: \"What did we decide about the auth middleware?\"\n> → Returns a 2000-word session summary that mentions auth somewhere\n\n**With Aquifer — search finds the exact turn:**\n\n> Query: \"What did we decide about the auth middleware?\"\n> → Returns the specific user turn: \"Let's rip out the old auth middleware — legal flagged it for session token compliance\"\n\n---\n\n## Requirements\n\n| Component | Required? | Purpose | Example |\n|-----------|-----------|---------|---------|\n| Node.js >= 18 | Yes | Runtime | — |\n| PostgreSQL 15+ | Yes | Storage for sessions, summaries, entities | Local, Docker, or managed |\n| pgvector extension | Yes | Vector similarity search | `CREATE EXTENSION vector;` (included in `pgvector/pgvector` Docker image) |\n| Embedding endpoint | Yes (for recall) | Turn + session embedding | Ollama `bge-m3`, OpenAI `text-embedding-3-small`, any OpenAI-compatible API |\n| LLM endpoint | Optional | Built-in summarization during `enrich` | Ollama, OpenRouter, OpenAI — or provide your own `summaryFn` |\n| `@modelcontextprotocol/sdk` + `zod` | Yes (for MCP server) | MCP protocol runtime | Included in dependencies — installed automatically |\n\n---\n\n## Environment Variables\n\n| Variable | Required? | Purpose | Example |\n|----------|-----------|---------|---------|\n| `DATABASE_URL` | Yes | PostgreSQL connection string | `postgresql://user:pass@localhost:5432/mydb` |\n| `AQUIFER_BACKEND` | No | Backend profile selector: `postgres` full backend or explicit degraded `local` starter | `postgres` |\n| `AQUIFER_LOCAL_PATH` | No | Local starter JSON store path | `.aquifer/aquifer.local.json` |\n| `AQUIFER_SCHEMA` | No | PG schema name (default: `aquifer`) | `memory` |\n| `AQUIFER_TENANT_ID` | No | Multi-tenant key (default: `default`) | `my-app` |\n| `AQUIFER_EMBED_BASE_URL` | Yes (for recall) | Embedding API base URL | `http://localhost:11434/v1` |\n| `AQUIFER_EMBED_MODEL` | Yes (for recall) | Embedding model name | `bge-m3` |\n| `AQUIFER_EMBED_API_KEY` | Provider-dependent | API key for hosted embedding providers | `sk-...` |\n| `AQUIFER_EMBED_DIM` | No | Embedding dimension override (auto-detected) | `1024` |\n| `AQUIFER_LLM_BASE_URL` | No | LLM API base URL (for built-in summarization) | `http://localhost:11434/v1` |\n| `AQUIFER_LLM_MODEL` | No | LLM model name | `llama3.1` |\n| `AQUIFER_LLM_API_KEY` | Provider-dependent | API key for hosted LLM providers | `sk-...` |\n| `AQUIFER_ENTITIES_ENABLED` | No | Enable knowledge graph (default: `false`) | `true` |\n| `AQUIFER_ENTITY_SCOPE` | No | Entity namespace (default: `default`) | `my-app` |\n| `AQUIFER_RERANK_ENABLED` | No | Enable cross-encoder reranking | `true` |\n| `AQUIFER_RERANK_PROVIDER` | No | Reranker provider: `tei`, `jina`, `openrouter` | `tei` |\n| `AQUIFER_RERANK_BASE_URL` | No | Reranker endpoint | `http://localhost:8080` |\n| `AQUIFER_AGENT_ID` | No | Default agent ID | `main` |\n| `AQUIFER_MEMORY_SERVING_MODE` | No | Public serving mode: `legacy` default, or opt-in `curated` | `curated` |\n| `AQUIFER_MEMORY_ACTIVE_SCOPE_KEY` | No | Default active curated scope for recall/bootstrap | `project:aquifer` |\n| `AQUIFER_MEMORY_ACTIVE_SCOPE_PATH` | No | Ordered curated scope path for inheritance | `global,project:aquifer` |\n| `AQUIFER_MEMORY_ALLOWED_SCOPE_KEYS` | No | Caller boundary for curated scope requests; defaults to the configured active scope path | `global,project:aquifer` |\n| `AQUIFER_CODEX_CHECKPOINT_CHECK_INTERVAL_MINUTES` | No | Active Codex checkpoint heartbeat time gate (default: `10`) | `10` |\n| `AQUIFER_CODEX_CHECKPOINT_EVERY_MESSAGES` | No | Active Codex checkpoint message delta gate (default: `20`) | `20` |\n| `AQUIFER_CODEX_CHECKPOINT_EVERY_USER_MESSAGES` | No | Optional user-message delta gate | `10` |\n| `AQUIFER_CODEX_CHECKPOINT_QUIET_MS` | No | Quiet period before reading due transcripts (default: `3000`) | `3000` |\n| `AQUIFER_MIGRATIONS_MODE` | No | Startup handshake mode: `apply` (default), `check`, `off` | `apply` |\n| `AQUIFER_MIGRATION_LOCK_TIMEOUT_MS` | No | Advisory-lock wait before `AQ_MIGRATION_LOCK_TIMEOUT` (default 30000) | `30000` |\n| `AQUIFER_INSIGHTS_DEDUP_MODE` | No | Insights semantic dedup mode: `off` (default), `shadow`, `enforce` — env wins over code for this field only, so operators can kill-switch without redeploy | `shadow` |\n| `AQUIFER_INSIGHTS_DEDUP_COSINE` | No | Cosine threshold for semantic merge (default `0.88`; warn outside `[0.75, 0.95]`) | `0.90` |\n| `AQUIFER_INSIGHTS_DEDUP_CLOSE_BAND_FROM` | No | Lower bound for close-band logging (`dedupNear`); must be below threshold (default `0.85`) | `0.82` |\n\nFull env-to-config mapping is in [consumers/shared/config.js](consumers/shared/config.js).\n\nCurated serving is opt-in. If a host needs rollback during rollout, set `AQUIFER_MEMORY_SERVING_MODE=legacy` and restart the MCP/CLI process; no destructive DB rollback is required.\n\n### Insights semantic dedup (1.5.10)\n\nWhen a cron extractor (`scripts/extract-insights-from-recent-sessions.js`) or any other caller writes insights via `commitInsight`, the canonical-key layer (1.5.3+) dedupes rows whose `canonicalClaim + entities` hash to the same value. But LLMs don't always produce the same `canonicalClaim` across runs, so 1.5.10 adds a second tier: `title + body` are embedded, matched against `(tenant, agent, type)`-scoped active rows, and a top cosine above `AQUIFER_INSIGHTS_DEDUP_COSINE` triggers supersede (enforce) or metadata-only would-merge logging (shadow). Close-band hits (`closeBandFrom ≤ cos < threshold`) write `metadata.dedupNear` without supersede so operators can tune thresholds without committing.\n\nRecommended rollout: `shadow` for one weekly cycle, inspect `SELECT metadata->>'shadowMatch' FROM insights WHERE metadata ? 'shadowMatch'`, then flip to `enforce`. Kill-switch: `AQUIFER_INSIGHTS_DEDUP_MODE=off` and restart.\n\nPre-1.5.3 rows with `canonical_key_v2 IS NULL` are caught by the semantic tier but skip the canonical path; a startup warn points at the one-shot backfill:\n\n```bash\nDATABASE_URL=... \\\n  node scripts/backfill-canonical-key.js --schema <schema> --agent <id>\n```\n\nThe script is idempotent (`WHERE canonical_key_v2 IS NULL` guard) and race-safe with live writers.\n\n---\n\n## Host Integration\n\nMCP is the primary integration surface. Agent hosts connect to the Aquifer MCP server. The complete contract contains eleven tools: `memory_recall`, `historical_recall`, `session_recall`, `evidence_recall`, `ingest_session`, `session_feedback`, `memory_feedback`, `memory_stats`, `memory_pending`, `feedback_stats`, `session_bootstrap`.\n\nThe default runtime surface is read-only/status-only and registers eight tools: `memory_recall`, `historical_recall`, `session_recall`, `evidence_recall`, `memory_stats`, `memory_pending`, `feedback_stats`, `session_bootstrap`. Write tools (`ingest_session`, `session_feedback`, `memory_feedback`) must be enabled explicitly with `AQUIFER_MCP_ENABLE_WRITES=true` for trusted lifecycle or operator hosts.\n\n| Integration | Route | Status | When to use |\n|-------------|-------|--------|-------------|\n| MCP server | `consumers/mcp.js` | Primary | Claude Code, OpenClaw, Codex, any MCP-capable host |\n| Library API | `createAquifer()` | Primary | Backend apps, custom pipelines, direct Node.js usage |\n| CLI | `consumers/cli.js` | Secondary | Operations, debugging, manual recall/backfill (`aquifer bootstrap`, `aquifer ingest-opencode`, etc.) |\n| OpenCode ingest | `consumers/opencode.js` | Secondary | Import sessions from OpenCode's SQLite DB |\n| OpenClaw plugin | `consumers/openclaw-plugin.js` | Compatibility only | Session capture/finalization via `session_end` with `before_reset` fallback — not for tool delivery |\n\n### Claude Code\n\nAdd to your project's `.claude.json` or user-level MCP config:\n\n```json\n{\n  \"mcpServers\": {\n    \"aquifer\": {\n      \"type\": \"stdio\",\n      \"command\": \"node\",\n      \"args\": [\"/path/to/aquifer/consumers/mcp.js\"],\n      \"env\": {\n        \"DATABASE_URL\": \"postgresql://...\",\n        \"AQUIFER_EMBED_BASE_URL\": \"http://localhost:11434/v1\",\n        \"AQUIFER_EMBED_MODEL\": \"bge-m3\"\n      }\n    }\n  }\n}\n```\n\nBy default, tools appear as `mcp__aquifer__memory_recall`, `mcp__aquifer__historical_recall`, `mcp__aquifer__session_recall`, `mcp__aquifer__evidence_recall`, `mcp__aquifer__memory_stats`, `mcp__aquifer__memory_pending`, `mcp__aquifer__feedback_stats`, `mcp__aquifer__session_bootstrap`. With `AQUIFER_MCP_ENABLE_WRITES=true`, `mcp__aquifer__ingest_session`, `mcp__aquifer__session_feedback`, and `mcp__aquifer__memory_feedback` are added.\n\nFor Codex long sessions, Aquifer exposes a UserPromptSubmit-friendly heartbeat\ncommand instead of installing a daemon:\n\n```bash\nnpx aquifer codex-recovery checkpoint-heartbeat \\\n  --hook-stdin \\\n  --scope-key project:aquifer\n```\n\nRun that from a host hook with Codex hook JSON on stdin. The heartbeat uses a\ntime-first gate: if the local marker says the next check is not due, it exits\nwithout validating or reading the transcript. When due, it validates the\n`transcript_path` realpath under the Codex sessions directory, waits for the\nquiet period, checks the configured message delta, and writes a local spool file\nfor later review. Scheduler, claim, and spool files live under the Codex state\ndirectory by default; they are process-control files, not DB memory.\n\nHeartbeat policy resolves as command flags first, then Aquifer env/config, then\ndefaults. The default policy is 10 minutes, 20 safe messages, no user-message\ngate, 3000 ms quiet period, and 60000 ms claim TTL. In config files this lives at\n`codex.checkpoint`:\n\n```json\n{\n  \"codex\": {\n    \"checkpoint\": {\n      \"checkIntervalMinutes\": 10,\n      \"everyMessages\": 20,\n      \"quietMs\": 3000\n    }\n  }\n}\n```\n\nTo prepare the Codex hook entry, generate or apply the merged `hooks.json`:\n\n```bash\nnpx aquifer codex-recovery checkpoint-heartbeat-hook \\\n  --scope-key project:aquifer \\\n  --hooks-path \"$CODEX_HOME/hooks.json\" \\\n  --json\n```\n\nThe hook installer is dry-run by default. Add `--apply` only after reviewing the\nmerged `UserPromptSubmit` command. `codex-recovery doctor --json` reports whether\nthe heartbeat hook is present.\n\n### OpenClaw\n\nInstall or update Aquifer inside the OpenClaw host root, then let the installer\nwire both the MCP server and the optional extension from the same package root:\n\n```bash\nnpm install --prefix \"$OPENCLAW_HOME\" @shadowforge0/aquifer-memory@1.9.2\nnode \"$OPENCLAW_HOME/node_modules/@shadowforge0/aquifer-memory/consumers/cli.js\" install-openclaw --openclaw-home \"$OPENCLAW_HOME\"\n```\n\nThe installer enables `plugins.entries[\"aquifer-memory\"]`, adds the extension\nto `plugins.load.paths`, preserves existing `mcp.servers.aquifer.env` values,\nand backs up `openclaw.json` before writing. Use `--dry-run --json` to inspect\npackage version, plugin config, MCP target, and extension link without changing\nfiles.\n\nBy default, tools materialize as `aquifer__memory_recall`, `aquifer__historical_recall`, `aquifer__session_recall`, `aquifer__evidence_recall`, `aquifer__memory_stats`, `aquifer__memory_pending`, `aquifer__feedback_stats`, `aquifer__session_bootstrap` (server name prefix added by the host). With `AQUIFER_MCP_ENABLE_WRITES=true`, `aquifer__ingest_session`, `aquifer__session_feedback`, and `aquifer__memory_feedback` are added.\n\nThe OpenClaw plugin (`consumers/openclaw-plugin.js`) is retained for session capture via `session_end` with a `before_reset` fallback, then uses the v1 finalization path when enrichment produced a summary. It is **not** the recommended tool delivery path. Use MCP.\n\n### Other MCP-capable hosts\n\nAny host that supports MCP stdio can connect the same way — point it at `node consumers/mcp.js` with the required env vars. The MCP server is the canonical external contract.\n\n---\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│                     Agent Hosts                              │\n│   Claude Code · OpenClaw · Codex · OpenCode · ...            │\n└──────────────────────┬───────────────────────────────────────┘\n                       │ MCP (stdio or HTTP)\n┌──────────────────────▼───────────────────────────────────────┐\n│              Aquifer MCP Server (canonical API)               │\n│   session_recall · session_feedback · memory_stats · ...     │\n└──────────────────────┬───────────────────────────────────────┘\n                       │\n┌──────────────────────▼───────────────────────────────────────┐\n│                    createAquifer (engine)                     │\n│         Config · Migration · Ingest · Recall · Enrich        │\n└────────┬──────────┬──────────┬──────────┬────────────────────┘\n         │          │          │          │\n    ┌────▼───┐ ┌────▼────┐ ┌──▼───┐ ┌───▼──────────┐\n    │storage │ │hybrid-  │ │entity│ │   pipeline/   │\n    │  .js   │ │rank.js  │ │ .js  │ │summarize.js   │\n    └────────┘ └─────────┘ └──────┘ │embed.js       │\n         │                     │    │extract-ent.js │\n    ┌────▼───────────┐    ┌───▼──┐  │rerank.js      │\n    │  PostgreSQL     │    │ LLM  │  └───────────────┘\n    │  + pgvector     │    │ API  │\n    └────────────────┘    └──────┘\n\n    ┌──────────────────────────────────┐\n    │         schema/                  │\n    │  001-base.sql (sessions,         │\n    │    summaries, turns, FTS)        │\n    │  002-entities.sql (KG)           │\n    │  003-trust-feedback.sql (trust)  │\n    └──────────────────────────────────┘\n```\n\n### File Reference\n\n| File | Purpose |\n|------|---------|\n| `index.js` | Entry point — exports `createAquifer`, `createEmbedder`, `createReranker` |\n| `core/aquifer.js` | Main facade: `migrate()`, `ingest()`, `recall()`, `enrich()` |\n| `core/storage.js` | Session/summary/turn CRUD, FTS search, embedding search |\n| `core/entity.js` | Entity upsert, mention tracking, relation graph, normalization |\n| `core/hybrid-rank.js` | 3-way RRF fusion, time decay, trust multiplier, entity boost, open-loop boost |\n| `pipeline/summarize.js` | LLM-powered session summarization with structured output |\n| `pipeline/embed.js` | Embedding client (any OpenAI-compatible API) |\n| `pipeline/extract-entities.js` | LLM-powered entity extraction (12 types) |\n| `pipeline/rerank.js` | Cross-encoder reranking (TEI, Jina, OpenRouter) |\n| `pipeline/normalize/` | Session normalization for Claude Code / gateway noise |\n| `consumers/opencode.js` | OpenCode SQLite ingest — reads sessions from OpenCode's local DB |\n| `schema/001-base.sql` | DDL: sessions, summaries, turn_embeddings, FTS indexes |\n| `schema/002-entities.sql` | DDL: entities, mentions, relations, entity_sessions |\n| `schema/003-trust-feedback.sql` | DDL: trust_score column, session_feedback audit trail |\n\n---\n\n## Core Features\n\n### 3-Way Hybrid Retrieval (RRF)\n\n```\nQuery ──┬── FTS (BM25)              ──┐\n        ├── Session embedding search ──├── RRF Fusion → Time Decay → Entity Boost → Results\n        └── Turn embedding search   ──┘\n```\n\n- **Full-text search** — PostgreSQL `tsvector` with language-aware ranking\n- **Session embedding** — cosine similarity on session summaries\n- **Turn embedding** — cosine similarity on individual user turns\n- **Reciprocal Rank Fusion** — merges all three ranked lists (K=60)\n- **Time decay** — sigmoid decay with configurable midpoint and steepness\n- **Entity boost** — sessions mentioning query-relevant entities get a score boost\n- **Trust scoring** — multiplicative trust multiplier from explicit feedback (helpful/unhelpful)\n- **Open-loop boost** — sessions with unresolved items get a mild recency boost\n\n### Entity Intersection\n\nWhen you know which entities you're looking for, pass them explicitly:\n\n```javascript\nconst results = await aquifer.recall('auth decision', {\n  entities: ['auth-middleware', 'legal-compliance'],\n  entityMode: 'all',  // only sessions containing BOTH entities\n});\n```\n\n- `entityMode: 'any'` (default) — boost sessions matching any queried entity\n- `entityMode: 'all'` — hard filter: only return sessions containing every specified entity\n\n### Trust Scoring & Feedback\n\nSessions accumulate trust through explicit feedback. Low-trust memories are suppressed in rankings regardless of relevance.\n\n```javascript\n// After a recall result was useful\nawait aquifer.feedback('session-id', { verdict: 'helpful' });\n\n// After a recall result was irrelevant\nawait aquifer.feedback('session-id', { verdict: 'unhelpful' });\n```\n\n- Asymmetric: helpful +0.05, unhelpful −0.10 (bad memories sink faster)\n- Multiplicative in ranking: trust=0.5 is neutral, trust=0 halves the score, trust=1.0 gives 50% boost\n- Full audit trail in `session_feedback` table\n\n### Turn-Level Embeddings\n\nNot just session summaries — Aquifer embeds each meaningful user turn individually.\n\n- Filters noise: short messages, slash commands, confirmations (\"ok\", \"got it\")\n- Truncates at 2000 chars, skips turns under 5 chars\n- Stores turn text + embedding + position for precise retrieval\n\n### Knowledge Graph\n\nBuilt-in entity extraction and relationship tracking:\n\n- **12 entity types**: person, project, concept, tool, metric, org, place, event, doc, task, topic, other\n- **Entity normalization**: NFKC + homoglyph mapping + case folding\n- **Co-occurrence relations**: undirected edges with frequency tracking\n- **Entity-session mapping**: which entities appear in which sessions\n- **Entity boost in ranking**: sessions with relevant entities score higher\n\n### Multi-Tenant\n\nEvery table includes `tenant_id` (default: `'default'`). Isolation is enforced at the query level — no cross-tenant data leakage by design.\n\n### Schema-per-deployment\n\nPass `schema: 'my_app'` to `createAquifer()` and all tables live under that PostgreSQL schema. Run multiple Aquifer instances in the same database without conflicts.\n\n---\n\n## API Reference\n\n### `createAquifer(config)`\n\nReturns an Aquifer instance. Config:\n\n```javascript\n{\n  db,          // pg connection string or Pool instance (required)\n  schema,      // PG schema name (default: 'aquifer')\n  tenantId,    // multi-tenant key (default: 'default')\n  embed: { fn, dim },      // embedding function (required for recall)\n  llm: { fn },             // LLM function (required for built-in summarize)\n  entities: {\n    enabled,               // enable KG (default: false)\n    scope,                 // entity namespace (default: 'default')\n    mergeCall,             // merge entity extraction into summary LLM call (default: true)\n  },\n  rank: { rrf, timeDecay, access, entityBoost },  // weight overrides\n}\n```\n\n#### `aquifer.init()`\n\nStartup handshake — resolves pending migrations and returns a StartupEnvelope. Hosts should `await` this before accepting traffic. In `apply` mode a `ready=false` envelope is the signal to abort startup.\n\n```javascript\nconst envelope = await aquifer.init();\n// {\n//   ready:             true,\n//   memoryMode:        'rw',        // 'rw' | 'ro' | 'off'\n//   migrationMode:     'apply',     // 'apply' | 'check' | 'off'\n//   pendingMigrations: [],          // migration ids still outstanding\n//   appliedMigrations: ['001-base', '003-trust-feedback', '004-completion', '006-insights'],\n//   error:             null,        // { code, message } on failure\n//   durationMs:        1035,\n// }\n```\n\nThe MCP consumer (`consumers/mcp.js`) already wires `aquifer.init()` before `server.connect()` and exits non-zero if `ready=false` under `apply` mode.\n\n#### `aquifer.listPendingMigrations()` / `aquifer.getMigrationStatus()`\n\nReturns `{ required, applied, pending, lastRunAt }` via table and column signature probes (`pg_tables` plus `information_schema.columns` for alter-only migrations). No DDL runs. Use it from a health check or from a consumer that wants to surface drift before calling `init()`.\n\n#### `aquifer.migrate()`\n\nRuns SQL migrations (idempotent). Creates tables, indexes, triggers, and extensions. Uses `pg_try_advisory_lock` with a 250 ms poll and a `lockTimeoutMs` deadline (30 s default); on exhaustion throws with `code: 'AQ_MIGRATION_LOCK_TIMEOUT'`. On success returns `{ ok: true, durationMs, notices, ddlExecuted }`; on failure throws an error whose `err.notices` / `err.failedAt` describe the stage that blew up. Most callers should go through `aquifer.init()` instead.\n\n#### `aquifer.ensureMigrated()`\n\nLazy idempotent wrapper — fires `migrate()` once on first call, no-ops afterwards. Honors `migrations.mode`: `check` only probes, `off` marks the instance migrated without touching the DB.\n\n#### `aquifer.commit(sessionId, messages, opts)`\n\nStores a session. Returns `{ id, sessionId, isNew }`.\n\n```javascript\nawait aquifer.commit('session-001', messages, {\n  agentId: 'main',\n  source: 'api',\n  sessionKey: 'optional-key',\n  model: 'gpt-4o',\n  tokensIn: 1500,\n  tokensOut: 800,\n  startedAt: isoString,\n  lastMessageAt: isoString,\n});\n```\n\n#### `aquifer.enrich(sessionId, opts)`\n\nEnriches a committed session: summarize, embed turns, extract entities. Uses optimistic locking with stale-reclaim (sessions stuck processing > 10 min are reclaimable).\n\n```javascript\nconst result = await aquifer.enrich('session-001', {\n  agentId: 'main',\n  summaryFn,          // custom summarize pipeline (bypasses built-in LLM)\n  entityParseFn,      // custom entity parser\n  postProcess,        // async callback after tx commit\n  model: 'override',  // model metadata override\n  skipSummary: false,\n  skipTurnEmbed: false,\n  skipEntities: false,\n});\n// Returns: { summary, turnsEmbedded, entitiesFound, warnings, effectiveModel, postProcessError }\n```\n\n**postProcess hook**: runs after transaction commit, receives full context (session, summary, embedding, parsedEntities, etc.). Best-effort, at-most-once. If the hook throws, the error is captured and returned as `postProcessError` on the enrich result — the session itself remains committed and is not retried.\n\n#### `aquifer.recall(query, opts)`\n\nHybrid search across sessions using 3-way RRF.\n\n```javascript\nconst results = await aquifer.recall('search query', {\n  agentId: 'main',\n  limit: 10,\n  entities: ['postgres', 'migration'],\n  entityMode: 'all',            // 'any' (default) or 'all'\n  weights: { rrf, timeDecay, access, entityBoost },\n});\n// Returns: [{ sessionId, score, trustScore, summaryText, matchedTurnText, _debug, ... }]\n```\n\n#### `aquifer.feedback(sessionId, opts)`\n\nRecords trust feedback. Returns `{ trustBefore, trustAfter, verdict }`.\n\n```javascript\nawait aquifer.feedback('session-id', {\n  verdict: 'helpful',   // or 'unhelpful'\n  agentId: 'main',\n  note: 'reason',\n});\n```\n\n#### `aquifer.bootstrap(opts)`\n\nLoads recent session context for a new conversation — summaries, open loops, and decisions. Time-based (no embedding search), designed for session-start injection.\n\n```javascript\nconst result = await aquifer.bootstrap({\n  agentId: 'main',\n  limit: 5,              // max sessions (default: 5)\n  lookbackDays: 14,      // how far back (default: 14)\n  maxChars: 4000,        // max output chars (default: 4000)\n  format: 'text',        // 'text', 'structured', or 'both'\n});\n// format='text': result.text contains XML block ready for injection\n// format='structured': result.sessions, result.openLoops, result.recentDecisions\n```\n\nCross-session dedup on open loops and decisions, sentinel filtering (removes 無/none/n/a), and maxChars truncation.\n\n#### `aquifer.insights.commitInsight(opts)` / `recallInsights(query, opts)` / `markStale(id)` / `supersede(oldId, newId)`\n\nHigher-order reflections distilled from session windows (preferences, patterns, frustrations, workflows). Split into two identities: a **canonical key** that describes what the insight is *about* (stable across rewordings), and an **idempotency key** that describes which revision of that claim was written.\n\n```javascript\nawait aquifer.insights.commitInsight({\n  agentId:        'main',\n  type:           'preference',\n  canonicalClaim: 'mk prefers checking context before coding',  // required — short declarative claim\n  title:          'Context-first discipline',                    // best-effort display\n  body:           '…',\n  entities:       ['mk', 'claude code'],\n  sourceSessionIds: ['sess-a', 'sess-b'],\n  evidenceWindow:  { from: isoString, to: isoString },\n  importance:     0.9,\n});\n```\n\nWrite rules: **duplicate** (same idempotency key → return existing), **revision** (same canonical key + newer evidence → INSERT + inline supersede of prior active), **back-fill revision** (same canonical key + older evidence → INSERT without supersede), **stale replay** (same canonical + same body → return existing). Old pre-1.5.6 rows are not retrofitted; their `canonical_key_v2` stays `NULL` and they age out naturally.\n\n#### `aquifer.close()`\n\nCloses the PostgreSQL connection pool (only if Aquifer created it).\n\n---\n\n## Configuration\n\nAquifer resolves config from three sources in priority order: config file → environment variables → programmatic overrides. See [consumers/shared/config.js](consumers/shared/config.js) for the full env-to-config mapping.\n\nConfig file is auto-discovered at `aquifer.config.json` in the working directory, or set `AQUIFER_CONFIG=/path/to/config.json`.\n\n```javascript\ncreateAquifer({\n  db: 'postgresql://user:pass@localhost/mydb',  // or an existing pg.Pool\n  schema: 'aquifer',           // PG schema (default: 'aquifer')\n  tenantId: 'default',         // multi-tenant key\n  embed: {\n    fn: myEmbedFn,             // async (texts: string[]) => number[][]\n    dim: 1024,                 // optional dimension hint\n  },\n  llm: {\n    fn: myLlmFn,               // async (prompt: string) => string\n  },\n  entities: {\n    enabled: true,             // enable KG (default: false)\n    scope: 'my-app',           // entity namespace — decoupled from agentId\n    mergeCall: true,           // merge entity extraction into summary prompt\n  },\n  rank: {\n    rrf: 0.65,                 // FTS + embedding fusion weight\n    timeDecay: 0.25,           // recency weight\n    access: 0.10,              // access frequency weight\n    entityBoost: 0.18,         // entity match boost\n  },\n  migrations: {\n    mode: 'apply',             // 'apply' | 'check' | 'off'\n    lockTimeoutMs: 30000,      // abort init() if advisory lock held this long\n    startupTimeoutMs: 60000,   // overall init() deadline (plan probe + DDL combined)\n    onEvent: null,             // (e) => void — lifecycle hook, see below\n  },\n});\n```\n\n### Startup observability\n\nSet `migrations.onEvent` to observe the lifecycle without parsing logs. Event names: `init_started`, `check_completed`, `apply_started`, `apply_succeeded`, `apply_failed`. Each payload carries `schema`, `mode`, the plan, `ddlExecuted`, `durationMs`, and on failure the `error` / `failedAt` / `notices`. No listener → zero cost.\n\n### Entity Scope\n\n`entities.scope` defines the namespace for entity identity. The unique constraint is `(tenant_id, normalized_name, entity_scope)` — the same entity name in different scopes creates separate entities. This decouples entity identity from `agentId`, allowing multiple agents to share an entity namespace.\n\nFallback chain: `config.entities.scope` → `'default'`.\n\n---\n\n## Database Schema\n\n### 001-base.sql\n\n| Table | Purpose |\n|-------|---------|\n| `sessions` | Raw conversation data with messages (JSONB), token counts, timestamps |\n| `session_summaries` | LLM-generated structured summaries with embeddings |\n| `turn_embeddings` | Per-turn user message embeddings for precise retrieval |\n\nKey indexes: GIN on messages, GiST on `tsvector`, ivfflat on embeddings, B-tree on tenant/agent/timestamps.\n\nNote: the schema uses basic ivfflat indexes suitable for development and moderate-scale use. For large deployments (100k+ embeddings), consider adding HNSW indexes — this is a future optimization area, not included out of the box.\n\n### 002-entities.sql\n\n| Table | Purpose |\n|-------|---------|\n| `entities` | Normalized named entities with type, aliases, frequency, entity_scope, optional embedding |\n| `entity_mentions` | Entity × session join with mention count and context |\n| `entity_relations` | Co-occurrence edges (undirected, `CHECK src < dst`) |\n| `entity_sessions` | Entity-session association for boost scoring |\n\nKey indexes: trigram on entity names, GiST on embeddings, unique on `(tenant_id, normalized_name, entity_scope)`.\n\n### 003-trust-feedback.sql\n\n| Table | Purpose |\n|-------|---------|\n| `session_feedback` | Explicit feedback audit trail (helpful/unhelpful verdicts, trust deltas) |\n\nAlso adds `trust_score` column to `session_summaries` (default 0.5, range 0–1).\n\n### 005-entity-state-history.sql *(entities enabled)*\n\n| Table | Purpose |\n|-------|---------|\n| `entity_state_history` | Temporal state-change log with partial `UNIQUE (tenant, agent, entity, attribute) WHERE valid_to IS NULL` to enforce at-most-one-current. Out-of-order backfill is supported via predecessor/successor overlap checks |\n\nOpt-in pipeline (`createAquifer({stateChanges: {enabled, whitelist, confidenceThreshold, timeoutMs, ...}})`) extracts temporal state transitions from session text during `enrich()`; off by default to control LLM cost.\n\n### 006-insights.sql\n\n| Table | Purpose |\n|-------|---------|\n| `insights` | Higher-order reflections with TSTZRANGE evidence window, importance, GIN on source_session_ids, HNSW on 1024-dim embedding, and a non-unique partial index on `canonical_key_v2` for the canonical/revision dedup contract |\n\nKey indexes: `idx_insights_canonical_v2_active` (partial on active rows with canonical key set), `idx_insights_idempotency_key` (unique on revision key).\n\n---\n\n## Troubleshooting\n\n**`error: type \"vector\" does not exist`** — pgvector extension is not installed. Run `CREATE EXTENSION IF NOT EXISTS vector;` as a superuser, or use the `pgvector/pgvector` Docker image which includes it.\n\n**`aquifer mcp requires @modelcontextprotocol/sdk and zod`** — These are now regular dependencies and should be installed automatically. If you see this error, run `npm install` again to ensure all deps are present.\n\n**Recall returns no results** — Make sure you've run `enrich` after `commit`. Raw sessions are not searchable until enriched (summarized + embedded). Check `aquifer stats` to see if summaries and turn embeddings exist.\n\n**OpenClaw tools not visible** — Use `mcp.servers.aquifer` in `openclaw.json`, not the plugin. Tools appear as `aquifer__memory_recall`, `aquifer__historical_recall`, `aquifer__session_recall`, etc. The plugin (`consumers/openclaw-plugin.js`) is for session capture only.\n\n**Embedding provider connection refused** — Verify your `AQUIFER_EMBED_BASE_URL` is reachable. For local Ollama, make sure the server is running and the model is pulled (`ollama pull bge-m3`).\n\n**`AQ_MIGRATION_LOCK_TIMEOUT` on startup** — another process holds the migration advisory lock for `aquifer:<schema>`. Either it is a concurrent `aquifer.init()` racing yours (expected; one will win, the other re-runs and finds `pending=[]`) or a crashed worker left the lock held. Raise `migrations.lockTimeoutMs`, or drop the stale backend via `SELECT pg_terminate_backend(pid) FROM pg_locks WHERE locktype='advisory'` after you have confirmed which pid is dead.\n\n**MCP process exits non-zero at startup** — expected when `migrations.mode=apply` and `aquifer.init()` returns `ready=false`. Read the `[aquifer-mcp] startup aborted` line on stderr for the `error.code` / `failedAt`. If you need the old lazy-migrate-on-first-tool-call behaviour instead, set `AQUIFER_MIGRATIONS_MODE=check` (and run `migrate()` out of band) or `=off`.\n\n---\n\n## Dependencies\n\n| Package | Purpose |\n|---------|---------|\n| `pg` ≥ 8.13 | PostgreSQL client |\n| `@modelcontextprotocol/sdk` ≥ 1.29 | MCP server protocol |\n| `zod` ≥ 3.25 | Schema validation (MCP tools) |\n\nLLM and embedding calls use raw HTTP — no additional SDK required.\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}