{"_id":"@blogmcp/content-cache","_rev":"10-80c9e2d8dd6ea8366c2cdf3ca2e43133","name":"@blogmcp/content-cache","dist-tags":{"latest":"0.8.1"},"versions":{"0.2.1":{"name":"@blogmcp/content-cache","version":"0.2.1","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.2.1","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"}],"dist":{"shasum":"c5e31e714a98c2db5e27b519e26269f741211bf3","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.2.1.tgz","fileCount":15,"integrity":"sha512-1MTP0UVb6jxBHzDtfwnrRV5wG//xwXqhAMztnsqH8lDbGnZhVLXvqpl5XViZK62G7OX56h39bT/vEJWFs7fBCg==","signatures":[{"sig":"MEQCIE2opTKdpiItUiEOUBTVwrtDC7wSBGuD/ksokqBxZjGeAiB4JOFBTkJ7W7nGzIVzGLgfhPHgp6qT6kEVngZ+3W6Q1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49126},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"06814a04296c980bdd61bbc2715eccb84dfaffb0","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.3","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.2.1_1783487916226_0.39773213944309105","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@blogmcp/content-cache","version":"0.2.2","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.2.2","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"}],"dist":{"shasum":"0cbcf52e640298c81284edc99520bad5bff68396","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.2.2.tgz","fileCount":15,"integrity":"sha512-6vcn8DLdQLrlUUiZjcOxyJ6ompCmcxU/P7SAkamNyQcDpioNVuw6i/kGRNWN8dsAyZYJjBpm34GsSrWTBOXTwg==","signatures":[{"sig":"MEUCIQCNHqjSuql5RjmWxtkxiWAfCus4gT2FNDeJnw/DzbY09wIgFjdw9nhlCB4Dj/TX2i3h7khAAVKvm99I9F2xheVXLRI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49126},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"c83445d5e9236fcded1451db89e3bc410e64a739","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.3","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.2.2_1786475836240_0.17919220155067905","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@blogmcp/content-cache","version":"0.3.0","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.3.0","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"}],"dist":{"shasum":"ae1c174e8301ff28297b8e3c66af1ed80baa6bf9","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.3.0.tgz","fileCount":15,"integrity":"sha512-fgO+3GoLRff3GaQRvO4FKyArz3ff+3hhJ8cpU5OMEb+pQAfsEnY4hmjDODAnkKhl+3BVpdhmeuugJqeWi6aJSA==","signatures":[{"sig":"MEUCICeEO5VCuT2pA4I02Rey5X73qP8J2GpSd5tFku3HNhQhAiEAtaS7yHB9E07YnKN6OztN+n1MWdb67K+1Kbg53N4xmjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49126},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"074582484e9fa4f6d71a17bcced08ddc350126a4","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.3","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.3.0_1786700258903_0.7503538286320468","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@blogmcp/content-cache","version":"0.6.0","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.6.0","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"dist":{"shasum":"3d0eedab9540dd03a52f665722ca8291feae30f5","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.6.0.tgz","fileCount":16,"integrity":"sha512-+E/9EKEbPU8zRHCeNZquLliXLpF42qeUT2WUY8eQZdmiWnuZggPReU+wcgnGukFeaiN6FKUe7uAZ2czsJvDeCQ==","signatures":[{"sig":"MEYCIQDyKy76KjnVG4HU1yy+OKeklJAA0xQ0qYTfV5vibGluGwIhAIg8QB/6ahfGsLstaaH2AnZUzv0KnvqlxkStnLq5BotA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGC6TUAy/Vc8ujw2iG4j/s0CCRQaz8mIP4zg2TI5bldCAiAc2YSU/lwd4fNjn9CXteGb6QQ08ktZjEW6arR+9Go9ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50194},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"3ec0068322e4b9910955af557cf76981e994005e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.6.0_1790702913239_0.14861745296942486","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@blogmcp/content-cache","version":"0.6.1","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.6.1","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"dist":{"shasum":"23aa1f9f17dce2abeef129ce1e12559241e2bf8b","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.6.1.tgz","fileCount":16,"integrity":"sha512-GSlWeaN9fQSjCyzvCLwhF8m6JwReyhX8+JpuylcMyGVkwD1tGt6ndqZaJle6iotk1it6n1JdNS2D89bV1xgsng==","signatures":[{"sig":"MEUCIQDQBcIDFkOF2pXlliHGYPzUaKQILwUPW75HN+/Mbfj4zQIgWPGH0zQWsBFNynUqan22SHmsbpm02zlyi9OG30sLCjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDLoiDtVWENROVhiKOwyjA+h3UA5EBsSzn2wR7qI5MaXwIhAPGrhuN+DYXiqc/6/0XTZx8Q6lEgzIBls//Wgf1D03J7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50194},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"99d2ad19cd85d0f0d10f31fa0e13b24eb6d8639d","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.6.1_1790704024713_0.23476597875171823","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@blogmcp/content-cache","version":"0.7.0","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.7.0","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"dist":{"shasum":"dbee210f51681ea034b305a710329c1501378527","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.7.0.tgz","fileCount":16,"integrity":"sha512-yfkKFo6PSeqQ/89YdFBMu2VrIxLLNLTcHcL41DwUM4s/llK+C0QAy3Gi2zSAQsMcLS87AnBWb1B7PYZo1eS+WA==","signatures":[{"sig":"MEUCIFcPWYRtE2EQbzmirxFfLW0t+kpKpqgSPlnPJybolSLvAiEAvZroDR0Azd8gLScEARIze1lMgcfpi1qS/Qx7GJj7tS8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDa7gHbu11x185EG0BMKLpPHfUzH+bTK+Dhflna+fZL8gIgW0TV28fssunj2Powu9pmfM4PdE6JEqPxeAHI/X9V1Tk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50194},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"dd514a0b8bbf43d24e7f9c8ff2ab2164d885115d","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.7.0_1790860719077_0.4099950411449962","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@blogmcp/content-cache","version":"0.7.1","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.7.1","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"dist":{"shasum":"c142e9cdf769bcb2b9936853efc7ab751c6d7b07","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.7.1.tgz","fileCount":16,"integrity":"sha512-dm4FzPhOm4fuFiOItmBFYVbk5rRZeOgWaB6cD7pfis9Bugsxis9xPPaV3EGX/FG3Wfy/CTLXFzdMsZA4bX3b7g==","signatures":[{"sig":"MEUCIQDO1kNN+uPjNRbTFmxvpHtcqfs8D/uvsQR4QCYQiNT2MwIgIcq92F4q+CMDQO98pqDrtpuTg10hD3EaIpNjr8CnGaM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID57FwO7UhGi0FPjz/C0cAzs5DGy0utxRrhp2LUP6BsBAiANG2YaaX8LBqzlkuuJ5Zjf/7jn+Civb+rcR5QFfDwj9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50194},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"cad9a917b29aad8ab97cfebe0c3bd4bf9f94648f","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.7.1_1790872748067_0.7634959118507683","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@blogmcp/content-cache","version":"0.8.0","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"license":"MIT","_id":"@blogmcp/content-cache@0.8.0","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"dist":{"shasum":"4d13dac13f1aa8839c1a24dfaae040fddb5c94f5","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.8.0.tgz","fileCount":16,"integrity":"sha512-uQqjVkIElel3FWk+EZe9e3N13ewcy21SK7ldFcaSoXitrvTn55noIvBHag/A1NMsfnTCq6RB92SiHTLSHPdKSA==","signatures":[{"sig":"MEQCIDbALqmw2wvrODji2Qwad/ePJuRG83bTwQiF2GezkyTkAiBN+FtHbbvD6vAGc35FD+iWI9nOeHI6iU+j/rCyHhLbtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCfb9/Xvbyp1QLJok9F1UuScROz1pSz5Dy2zy/lsnztIgIgB28gcioBBRmAx9G/v3Q8CU2kJIaavOPI8u/0w9qP4gU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50194},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"5698355994d151c79a4cd0fb5e7ac2b17c41bfda","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/content-cache_0.8.0_1790931366415_0.6086941642049402","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"_id":"@blogmcp/content-cache@0.8.1","dist":{"shasum":"4ff32b4f4a034c0c34944aa2b28e1106dcfd2d6b","tarball":"https://registry.npmjs.org/@blogmcp/content-cache/-/content-cache-0.8.1.tgz","fileCount":16,"integrity":"sha512-kYL8GmBoMkCefmNHntSppjpV44PeB6Ftu5i9NtpsqjxbiTqDlUk+hP2Cl3yx8bygFeOaW9KpC4HPbSlmawhucg==","signatures":[{"sig":"MEUCIA1wiMVYYALVuKWhXT1dCjgOyKSfHeDvD1APmSitQa14AiEAuAszJy0iu6yFIS+OqD0mEELwL5tSpDOIFWutKr6hfuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCbV8ZWC8xVtdDZvspm7cEqCUFQnCN7YPsZAn4sFeJrvgIgDu4Pqgq8dszIu5lGqvPz1RDpmKe2+94LgwoZTn7T7po="}],"unpackedSize":50194},"main":"./src/index.ts","name":"@blogmcp/content-cache","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"}},"gitHead":"c8ea452fc9c90eea0ea1ee7dc5d9f59a2d08b380","license":"MIT","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","prepack":"node scripts/prepack.mjs","postpack":"node scripts/postpack.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"0.8.1","_npmUser":{"name":"huararanga","email":"lukas.zubal@gmail.com"},"keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"_npmVersion":"10.9.7","description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","directories":{},"maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.0","vitest":"^3.0.0","typescript":"^5.3.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/content-cache_0.8.1_1790932672765_0.006629967371635903"}}},"time":{"created":"2026-07-08T05:18:36.063Z","modified":"2026-10-02T09:17:53.099Z","0.2.1":"2026-07-08T05:18:36.435Z","0.2.2":"2026-08-11T19:17:16.371Z","0.3.0":"2026-08-14T09:37:39.069Z","0.6.0":"2026-09-29T17:28:33.318Z","0.6.1":"2026-09-29T17:47:04.821Z","0.7.0":"2026-10-01T13:18:39.187Z","0.7.1":"2026-10-01T16:39:08.146Z","0.8.0":"2026-10-02T08:56:06.496Z","0.8.1":"2026-10-02T09:17:52.864Z"},"license":"MIT","keywords":["cache","swr","last-known-good","blogmcp","storage-adapter","server"],"description":"Server-only durable content cache for blogmcp presentation layers: pluggable storage adapters (filesystem now; S3/Postgres later) behind an SWR + last-known-good read-through.","maintainers":[{"name":"huararanga","email":"lukas.zubal@gmail.com"},{"name":"blog-mcp-owner","email":"lukerovo@gmail.com"}],"readme":"# @blogmcp/content-cache\n\nServer-only durable content cache for blogmcp presentation layers.\n\nA consuming SSR app (the drhoubicka storefront, the reference blogs) sources\nKB-owned page MDX + navigation through a two-tier read-through: a per-process\nin-memory hot tier over a pluggable **durable** store. The durable copy is\nwritten through on every successful KB fetch, so it is always the last content\nthe KB actually served — a resilient offline floor with **no hand-maintained\nsecond source of truth to drift**.\n\n> Server-only: `FsCacheStore` imports `node:fs`. Import from `*.server.ts`\n> modules only — never a browser bundle.\n\n## API\n\n```ts\nimport { SwrCache, FsCacheStore } from '@blogmcp/content-cache';\n\n// Public (durable) tier — survives restarts, is the outage floor.\nconst articles = new SwrCache<{ mdx: string }>({\n  store: new FsCacheStore({ dir: process.env.CACHE_DIR! }),\n  freshMs: 60_000,      // serve memory without revalidating\n  staleMs: 600_000,     // serve stale + revalidate in the background\n  negTtlMs: 30_000,     // suppress refetch of a known-failing key\n  keyPrefix: 'article:',\n});\n\n// Gated/member tier — NEVER persisted to disk (omit `store`).\nconst memberArticles = new SwrCache({ freshMs: 60_000, staleMs: 600_000, negTtlMs: 30_000 });\n\nconst { value, source } = await articles.get(key, async () => {\n  const a = await kb.fetch(key);          // fetcher MUST throw on miss/failure\n  if (!a) throw new Error('no content');\n  return { mdx: a.content };\n});\n// source ∈ fresh | stale | cold | lkg-memory | lkg-durable | negative | error\n```\n\nDegradation ladder on a KB failure: prior in-memory value → durable store copy →\n`null` (negative-cached). Successful fetches write through to both tiers; the\ndurable write is fire-and-forget (never blocks or fails the request path).\n\n### Purge\n\n```ts\nawait articles.purge(key);        // evict one key (memory + durable)\nawait articles.purgeAll('article:'); // evict a prefix\nawait articles.purgeAll();        // evict everything\n```\n\n## Storage adapters\n\n`CacheStore` separates the caching pattern from where the last-known-good copy\nlives:\n\n- **`FsCacheStore`** — ships today. One atomic JSON file per entry under a dir.\n- **`S3CacheStore`** — designed-for (shared floor across pods). Not yet implemented.\n- **`PgCacheStore`** — designed-for (transactional/queryable). Not yet implemented.\n\nAll satisfy the same interface, so adopting one is a constructor swap.\n\n`T` must be JSON-serializable — cache the raw nav-tree array, not a built `Map`.\n\n## Bounds\n\nThe in-memory tier has no size cap or idle eviction — expired negative entries are\nreclaimed opportunistically on access, but distinct keys accumulate. Use it with a\n**bounded key space** (the storefront keys by tier + immutable id/filename + locale,\nand by nav scope + locale — dozens of entries). Don't key by unbounded/attacker-\ncontrolled input; a `maxEntries` LRU is a future add if a consumer needs one.\n\n## Build / publish\n\nDual package.json (like `@blogmcp/sdk`): in-repo `exports` point at `./src`;\n`prepack` rewrites them to `./dist` for the npm tarball. Version-locked with the\n`@blogmcp/sdk` fixed changeset group.\n\n```bash\nnpm run build   # vite → dist/*.js + tsc → dist/*.d.ts\nnpm test        # vitest\n```\n","readmeFilename":"README.md"}