{"_id":"@cool-ai/beach-missives","_rev":"10-03acdf0113bb1bc5185170ca75e22140","name":"@cool-ai/beach-missives","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.1":{"name":"@cool-ai/beach-missives","version":"0.0.1","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.1","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"dist":{"shasum":"b5a4811830988127849bf4783b0112b828af9f24","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.1.tgz","fileCount":83,"integrity":"sha512-3NuGsDSnXa0xz7j+CYHUjUxKXuL/rAnLaMC0yRWI/ZqWII+4k8TKyLH3ZUX9cTAm845Krx0unN3fAArJSbHgTw==","signatures":[{"sig":"MEUCIQCa0WKKclDe0T/GgXrkm6zfTMBYBDBFgpuR7er/ZA9JBAIgVa+3VpZige4uw5cb1x01UENfutJjFOEfdLNppiZ408A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86068},"type":"module","_from":"file:cool-ai-beach-missives-0.0.1.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/26ccf7dbe9c069457a664117288bddd7/cool-ai-beach-missives-0.0.1.tgz","_integrity":"sha512-3NuGsDSnXa0xz7j+CYHUjUxKXuL/rAnLaMC0yRWI/ZqWII+4k8TKyLH3ZUX9cTAm845Krx0unN3fAArJSbHgTw==","_npmVersion":"10.9.7","description":"Universal message record with pluggable storage adapters","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.1_1776724578882_0.9523255306761702","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@cool-ai/beach-missives","version":"0.0.2","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.2","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"dist":{"shasum":"8af6d17ff2bd0a85a964e3d72e2285276cab76f7","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.2.tgz","fileCount":83,"integrity":"sha512-e5zE+EjA1OOk8K+KcEsWFLphhrhKtrpcRpqROJbFCqErYjPW6qdN0o6A60Q7JsmVRDcafMg6yELst4a9kb9OTA==","signatures":[{"sig":"MEUCIDovCW3pqr9JpbArJc+EbKBBJ79NtdkQeBVsBlkibhpYAiEA3ymokEgCsDpIHgGMIUyXhhwo8WPR6T9ayfchllxuhXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86647},"type":"module","_from":"file:cool-ai-beach-missives-0.0.2.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/b63d6348593a1d144abff7b6ad636faf/cool-ai-beach-missives-0.0.2.tgz","_integrity":"sha512-e5zE+EjA1OOk8K+KcEsWFLphhrhKtrpcRpqROJbFCqErYjPW6qdN0o6A60Q7JsmVRDcafMg6yELst4a9kb9OTA==","_npmVersion":"10.9.7","description":"Universal message record with pluggable storage adapters","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.2_1776943008968_0.08934997519094012","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@cool-ai/beach-missives","version":"0.0.3","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.3","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"dist":{"shasum":"1cf858e65701393a85a7514166aea849808e749a","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.3.tgz","fileCount":83,"integrity":"sha512-lEe3Upijhf8S/fG6mfcicvObEOEFsK9MNOijCi6uQjyHlil1B2iBptpqWYEPyk41R7bK8kwkHNFrXD9Ev/D/9w==","signatures":[{"sig":"MEQCIDdIc/PB51CY46SqlROBaO7AGXcQc/Z2BUqgP9Su3bFyAiAacCZ9sB14lr7ToLrkh+tcgen04CK045tPXlZmGIedeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89337},"type":"module","_from":"file:cool-ai-beach-missives-0.0.3.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/30b3d068fba85732ea75fb2c515e838f/cool-ai-beach-missives-0.0.3.tgz","_integrity":"sha512-lEe3Upijhf8S/fG6mfcicvObEOEFsK9MNOijCi6uQjyHlil1B2iBptpqWYEPyk41R7bK8kwkHNFrXD9Ev/D/9w==","_npmVersion":"10.9.7","description":"Universal message record with pluggable storage adapters","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.3_1776956403760_0.26041903467720506","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@cool-ai/beach-missives","version":"0.0.4","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.4","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"dist":{"shasum":"b38bd7cd1ba4430413274d4c4873f88d9f8d6997","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.4.tgz","fileCount":83,"integrity":"sha512-4RxkjbHyTSIXp8Ic9Sh+jSNptNC2vVx6XJcLfPjQHIKK5Y8pguMF5MgpeOpkEi7PIBxm4E/YlYV9k2Zlrw+xeg==","signatures":[{"sig":"MEUCIQDQITJrtAr2go6Nqct9JF7T3EdzfRp4zcsFym6KqXVmJQIgWAOJx3HOXWmayh9EBh4x5iJg1yff29QKWhPYphc9G0g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92578},"type":"module","_from":"file:cool-ai-beach-missives-0.0.4.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/f6f6bacdb73a0efce1b3d8ce5441338e/cool-ai-beach-missives-0.0.4.tgz","_integrity":"sha512-4RxkjbHyTSIXp8Ic9Sh+jSNptNC2vVx6XJcLfPjQHIKK5Y8pguMF5MgpeOpkEi7PIBxm4E/YlYV9k2Zlrw+xeg==","_npmVersion":"10.9.7","description":"Universal message record with pluggable storage adapters","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.4_1776985213287_0.8135007132594427","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@cool-ai/beach-missives","version":"0.0.5","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.5","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"homepage":"https://gitlab.com/johncandrew/beach/-/tree/main/packages/missives#readme","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"dist":{"shasum":"1235e2d01b40d1865404394505462045d352f834","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.5.tgz","fileCount":96,"integrity":"sha512-uwkjvdAVwvLYz9FbE/zSHP7Bjmug8hPjoFGeAeGJLQioM1YCqK+cJEfqCfkKppB1f10bDHokGDFStEs0gZEggw==","signatures":[{"sig":"MEUCIGnZkhoa2dW9HdwrH3ntnd5vNIt7JLiGj9zb9wGF2IfdAiEAySSqIHVHlGzTJPRjLPYkAifYPy6AJMTS66zgCNHibLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345544},"type":"module","_from":"file:cool-ai-beach-missives-0.0.5.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/4cf0545be91c660def5275bcb1a68a3f/cool-ai-beach-missives-0.0.5.tgz","_integrity":"sha512-uwkjvdAVwvLYz9FbE/zSHP7Bjmug8hPjoFGeAeGJLQioM1YCqK+cJEfqCfkKppB1f10bDHokGDFStEs0gZEggw==","repository":{"url":"git+https://gitlab.com/johncandrew/beach.git","type":"git","directory":"packages/missives"},"_npmVersion":"10.9.7","description":"Universal message record and pluggable storage adapters for Beach applications.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.5_1777054362231_0.565993917106717","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@cool-ai/beach-missives","version":"0.0.6","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.6","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"homepage":"https://cool-ai.org","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"dist":{"shasum":"f330b4a7a3b4014f1afa164a782c51ab54daa542","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.6.tgz","fileCount":96,"integrity":"sha512-bglQHD6Mh+6acdtbI73buxmocxbP1XlYFvSZAvCbgaXjtPpewxUb9cBE8NDZvd57BjaonTPUEkj039iAuPbtuw==","signatures":[{"sig":"MEYCIQD72yDEDgxU7mGFaAXdKXZCG33Zf2Rcim+QRF1XD/BZ5QIhAKEjJqSt3lVvLutbGflmx35vU/fii+cwEIv81IZcoj2y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":349299},"type":"module","_from":"file:cool-ai-beach-missives-0.0.6.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/87b1f6d3f9dada6a6f0151a47d55c923/cool-ai-beach-missives-0.0.6.tgz","_integrity":"sha512-bglQHD6Mh+6acdtbI73buxmocxbP1XlYFvSZAvCbgaXjtPpewxUb9cBE8NDZvd57BjaonTPUEkj039iAuPbtuw==","repository":{"url":"git+https://gitlab.com/johncandrew/beach.git","type":"git","directory":"packages/missives"},"_npmVersion":"10.9.7","description":"Universal message record and pluggable storage adapters for Beach applications.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.6_1777132126233_0.08377082217343435","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@cool-ai/beach-missives","version":"0.0.7","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.7","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"homepage":"https://cool-ai.org","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"dist":{"shasum":"7bd24bd5fbfbc214ba4e9907446bb951055f6ff8","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.7.tgz","fileCount":99,"integrity":"sha512-stV4LPrRgxCNOUJxYflyetuJxQignqd3Ejn5BUKi5avoMhEaUefaOehA0qypUuIqfU31XBZ8DL5SVFWRDa0rOQ==","signatures":[{"sig":"MEUCIQC6xTcjX4XW5+p74teBkXvVuRpbua9kcCIV8DlRJWYzqgIgXcIYs7yu46vX4aObrJwgjJao1Lf6JSFIeMNxRpi3tA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396786},"type":"module","_from":"file:cool-ai-beach-missives-0.0.7.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/ebc33930ee275643bb14bf228973f74c/cool-ai-beach-missives-0.0.7.tgz","_integrity":"sha512-stV4LPrRgxCNOUJxYflyetuJxQignqd3Ejn5BUKi5avoMhEaUefaOehA0qypUuIqfU31XBZ8DL5SVFWRDa0rOQ==","repository":{"url":"git+https://gitlab.com/johncandrew/beach.git","type":"git","directory":"packages/missives"},"_npmVersion":"10.9.7","description":"Universal message record and pluggable storage adapters for Beach applications.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.7_1778003257039_0.20743698528702548","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@cool-ai/beach-missives","version":"0.0.8","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.8","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"homepage":"https://cool-ai.org","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"dist":{"shasum":"894ee7ae366016767132d4509b0f51aa1dc76cda","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.8.tgz","fileCount":79,"integrity":"sha512-pLNSQ6I7MRgaBYgs0xWbdwgl4D4jByiBNUXN1w8ZopXbmocNMu3F3DcLZ6JwS2WtB25IgGgeYRzmuXVq3YFWmA==","signatures":[{"sig":"MEUCIAX1uRm+na5QC4JA2SbMn20Q5Sg0oA64A0TzB7XZwCiaAiEAl3uaq9pXYQKcAg5LrRwIlqFYP2TBmKdRluneRRclCqw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370146},"type":"module","_from":"file:cool-ai-beach-missives-0.0.8.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/d6a2ec068db2533e782d66d00e8b0d20/cool-ai-beach-missives-0.0.8.tgz","_integrity":"sha512-pLNSQ6I7MRgaBYgs0xWbdwgl4D4jByiBNUXN1w8ZopXbmocNMu3F3DcLZ6JwS2WtB25IgGgeYRzmuXVq3YFWmA==","repository":{"url":"git+https://gitlab.com/johncandrew/beach.git","type":"git","directory":"packages/missives"},"_npmVersion":"10.9.7","description":"Universal message record and pluggable storage adapters for Beach applications.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.8_1778186303056_0.6522832501837783","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@cool-ai/beach-missives","version":"0.0.9","license":"Apache-2.0","_id":"@cool-ai/beach-missives@0.0.9","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"homepage":"https://cool-ai.org","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"dist":{"shasum":"1b04a52653b491c288398fe315046ec5298d445b","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.9.tgz","fileCount":79,"integrity":"sha512-Me4Tvq21c+yu/8Syq6prHQeCC5LsFn2xQfyNuBZEQgUrKN1B0fmmbivyDexuIP7BMDt8xImUjoZcf6esgizmyQ==","signatures":[{"sig":"MEYCIQD+FIhg7hi06Tsd9cyDOg+nZKmEaf07dENdA78ZITTqXwIhAODUsGtjH3yFAam4EBxgTqtuR04D8NgpcWq7H0ukl6ZS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370618},"type":"module","_from":"file:cool-ai-beach-missives-0.0.9.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./stores":{"types":"./dist/stores/index.d.ts","import":"./dist/stores/index.js"},"./artifacts":{"types":"./dist/artifacts/index.d.ts","import":"./dist/artifacts/index.js"}},"scripts":{"dev":"tsc --project tsconfig.json --watch","test":"vitest run","build":"tsc --project tsconfig.json","coverage":"vitest run --coverage","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"_resolved":"/tmp/cebcc58547bf083bf7e86c6a98393e8f/cool-ai-beach-missives-0.0.9.tgz","_integrity":"sha512-Me4Tvq21c+yu/8Syq6prHQeCC5LsFn2xQfyNuBZEQgUrKN1B0fmmbivyDexuIP7BMDt8xImUjoZcf6esgizmyQ==","repository":{"url":"git+https://gitlab.com/johncandrew/beach.git","type":"git","directory":"packages/missives"},"_npmVersion":"10.9.7","description":"Universal message record and pluggable storage adapters for Beach applications.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/beach-missives_0.0.9_1778459524628_0.08471366336563557","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@cool-ai/beach-missives","version":"0.0.10","description":"Universal message record and pluggable storage adapters for Beach applications.","license":"Apache-2.0","repository":{"type":"git","url":"git+https://gitlab.com/johncandrew/beach.git","directory":"packages/missives"},"homepage":"https://cool-ai.org","bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"type":"module","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./stores":{"import":"./dist/stores/index.js","types":"./dist/stores/index.d.ts"},"./artifacts":{"import":"./dist/artifacts/index.js","types":"./dist/artifacts/index.d.ts"}},"publishConfig":{"access":"public"},"devDependencies":{"typescript":"^5.5.0","vitest":"^2.0.0"},"peerDependencies":{"ioredis":"^5.0.0"},"peerDependenciesMeta":{"ioredis":{"optional":true}},"scripts":{"build":"tsc --project tsconfig.json","dev":"tsc --project tsconfig.json --watch","test":"vitest run","coverage":"vitest run --coverage","test:watch":"vitest","typecheck":"tsc --noEmit"},"_id":"@cool-ai/beach-missives@0.0.10","_integrity":"sha512-YpEsloLW2/GrUn9vYnyzxGZctKqECIaRtrLeHQs6KF7oE2ZJWPfRoqdRpcP/H8zQyJ5JyM1HNYe0QKdLLT8Fvw==","_resolved":"/tmp/077a999b5e13a73420ee5dd933530c49/cool-ai-beach-missives-0.0.10.tgz","_from":"file:cool-ai-beach-missives-0.0.10.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-YpEsloLW2/GrUn9vYnyzxGZctKqECIaRtrLeHQs6KF7oE2ZJWPfRoqdRpcP/H8zQyJ5JyM1HNYe0QKdLLT8Fvw==","shasum":"6ab9ecafad6fbe14ba2442d16dd618eaefecd968","tarball":"https://registry.npmjs.org/@cool-ai/beach-missives/-/beach-missives-0.0.10.tgz","fileCount":79,"unpackedSize":368456,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICeNp7wVkoBQWLgxerpLQDPgHWQ0GwCGpFtU3kYBvx2MAiEAw6eeWBOa5QvgnahFaqRfmyBpd1xUTkvh3Xzor87mTuQ="}]},"_npmUser":{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"},"directories":{},"maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/beach-missives_0.0.10_1780677385730_0.006688609620699948"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T22:36:18.793Z","modified":"2026-06-05T16:36:25.994Z","0.0.1":"2026-04-20T22:36:19.014Z","0.0.2":"2026-04-23T11:16:49.123Z","0.0.3":"2026-04-23T15:00:03.895Z","0.0.4":"2026-04-23T23:00:13.425Z","0.0.5":"2026-04-24T18:12:42.365Z","0.0.6":"2026-04-25T15:48:46.471Z","0.0.7":"2026-05-05T17:47:37.192Z","0.0.8":"2026-05-07T20:38:23.262Z","0.0.9":"2026-05-11T00:32:04.778Z","0.0.10":"2026-06-05T16:36:25.886Z"},"bugs":{"url":"https://gitlab.com/johncandrew/beach/-/issues"},"license":"Apache-2.0","homepage":"https://cool-ai.org","repository":{"type":"git","url":"git+https://gitlab.com/johncandrew/beach.git","directory":"packages/missives"},"description":"Universal message record and pluggable storage adapters for Beach applications.","maintainers":[{"name":"johncandrew","email":"johncandrew@yahoo.co.uk"}],"readme":"# @cool-ai/beach-missives\n\nOwns the universal message record and its pluggable storage. Missives are the permanent history every Beach application writes alongside the event log — what the user said, what the assistant replied, and every outbound draft waiting for a batched edge to pick up. The storage backend is swappable (in-memory, Redis, file); the shape is not.\n\n> **Home:** [cool-ai.org](https://cool-ai.org) · **Documentation:** [cool-ai.org/docs](https://cool-ai.org/docs)\n\n## Why \"missive\"\n\nA **missive** is a message or letter — singular, un-ambiguous, covers any channel. The term was chosen over \"correspondence\" (ambiguous: means both *letter* and *matching between things*) and \"exchange\" (ambiguous: finance, currency, software). Readers unfamiliar with the word learn it once.\n\n## Install\n\n```sh\nnpm install @cool-ai/beach-missives\n```\n\nFor Redis-backed storage, install the optional peer:\n\n```sh\nnpm install ioredis\n```\n\n## Concern\n\n`@cool-ai/beach-missives` provides:\n\n- **The `Missive` type** — the universal message record (channel-agnostic). Every inbound and outbound message through any `ChannelAdapter` is saved as one.\n- **The `MissiveStore` interface** — `save`, `getById`, `getByThread`, `findByChannelAddress`, `search`.\n- **Thread ID normalisation** — `normaliseThreadId(subject)` strips `Re:/Fwd:`, lowercases, trims. Shared logic so every adapter threads consistently.\n- **`ArtifactStore` interface and `MissiveAttachment` references** — inbound/outbound files are stored as artifacts; missives carry references, not bytes (see BF-007 in the meta-plan).\n- **Reference storage adapters:**\n  - **`InMemoryStore`** — for tests and ephemeral use.\n  - **`RedisStore`** — Redis-backed with optional RediSearch for search. Requires Redis with AOF persistence for durability.\n  - **`JsonFileStore`** — single-file or per-thread JSON on disk. Zero-infra; suitable for prototypes and low-volume use.\n  - **`SqliteStore`** — SQLite with FTS5 for text search. Single-file; production-ready for single-node deployments. Throws `MissiveDeserialiseError` (exported) when a stored row fails shape validation — allows callers to distinguish corrupted records from other store errors.\n- **Extension hook** — consumers provide their own adapter for other stores (MariaDB, Postgres, DynamoDB, etc.) by implementing the interface.\n\n## What the missive record does\n\n- **Cross-channel continuity.** A conversation started on email continues in chat — same `threadId`, same linked entities.\n- **Searchable history.** \"What did we discuss last month about Corfu?\" resolves through the store's search.\n- **Entity linkage.** Missive records link to the consumer's domain entities (tasks, projects, basket items) via application-defined join tables.\n- **Audit trail.** Every external exchange — including peer-agent MCP/A2A calls — is recorded.\n- **Multi-modal body.** Missives can carry text, structured data, and references to artifact attachments (images, audio, files).\n\n## Record shape\n\n```typescript\ninterface Missive {\n  id: string;                     // UUID assigned at creation, immutable\n  sessionId: string;              // links to the session/conversation\n\n  triggerEventId?: string;        // links to the handler invocation that produced this missive\n  channelId?: string;             // e.g. 'email', 'chat', 'whatsapp' — populated by channel edges\n  threadId?: string;              // thread key for multi-message conversations; defaults to sessionId\n  externalId?: string;            // channel-native message ID (IMAP UID, WhatsApp msgId, etc.)\n  tenantId?: string;              // reserved for multi-tenancy; enforcement is v2+\n\n  origin: MissiveOrigin;          // sender identity — required\n  destination?: MissiveDestination;  // counterpart — populated by channel edges\n\n  parts: MissivePart[];           // the payload — multi-modal\n\n  subject?: string;               // email subject, Teams thread title, etc.\n  inReplyTo?: string;             // ID of the missive this is a direct reply to\n  references?: string[];          // RFC 5322-style ancestor chain for multi-hop threading, oldest → newest\n\n  createdAt: string;              // ISO 8601\n  updatedAt: string;              // ISO 8601\n}\n\ninterface MissiveOrigin {\n  address?: string;               // email address, phone number, UPN, etc.\n  messageId?: string;             // native message ID from the originating system\n  displayName?: string;\n}\n\ninterface MissiveDestination {\n  to?: string[];\n  cc?: string[];\n  bcc?: string[];                 // typically populated on outbound only\n  metadata?: Record<string, unknown>;  // opaque channel-specific fields the outbound edge may need\n}\n\ninterface MissivePart {\n  partType: string;               // open string validated against PartTypeRegistry\n  text?: string;\n  data?: unknown;\n  metadata?: Record<string, unknown>;\n}\n```\n\nChannel fields (`channelId`, `threadId`, `externalId`, `destination`, `references`) are optional and left unset by observability-only writers; channel inbound edges populate them fully so outbound edges can reconstruct channel artifacts.\n\n## Choosing a storage adapter\n\n| Adapter | When to use |\n|---------|-------------|\n| `InMemoryStore` | Tests, ephemeral agents with no need for cross-restart history |\n| `RedisStore` | When the consumer already runs Redis and wants zero new infrastructure |\n| `JsonFileStore` | Prototypes and low-volume agents; easy backup via git or rsync |\n| `SqliteStore` | Single-node production agents wanting durable search |\n| Custom adapter | Production agents with existing RDBMS or specialised stores |\n\nThe library imposes no adapter. A consumer picks one, configures it, and uses it from their handlers.\n\n## Artifact storage\n\nArtifacts (files, images, audio) live in an `ArtifactStore`, separate from the missive record. Reference adapters:\n\n- `InMemoryArtifactStore` — tests only.\n- `FilesystemArtifactStore` — local disk.\n- `S3ArtifactStore` — S3-compatible object storage.\n\nThe missive record carries only the `artifactId` reference. This keeps the missive store lean and allows storage of large files to scale independently.\n\n## Not in this package\n\n- Channel adaptors themselves (`@cool-ai/beach-channel-*`).\n- Channel rendering (`@cool-ai/beach-a2ui-renderer-*`).\n\n## Consumers\n\nAny agent that wants persistent cross-session or cross-channel message history. An agent that only serves stateless peer calls can skip this package.\n\n## Related\n\n- [../transport/](../transport/) — adapters that read/write missives.\n- [https://cool-ai.org/docs/design-principles](https://cool-ai.org/docs/design-principles) — principle 2.7 (channel-agnostic handlers) depends on a consistent record model.\n","readmeFilename":"README.md"}