{"_id":"@wtfalch/email","_rev":"17-88ecb35422f36e766fe06d2f9b9f7665","name":"@wtfalch/email","dist-tags":{"latest":"0.14.0"},"versions":{"0.1.0":{"name":"@wtfalch/email","version":"0.1.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.1.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"9d3943a824cb04fd803a9b8bf55ce74a2f4c92b3","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.1.0.tgz","fileCount":77,"integrity":"sha512-pStRlG+lku3GHXKIVHUthVd6kMoLLTvzKAH6RyllpWeWmzGKzos1XHMjK3RJleChumUsnOEmF73A/SBSVPWtaQ==","signatures":[{"sig":"MEYCIQCk6mr9mTOc9aYEwAWOgk0kK+AQgYGkEOy+cDDZbaM+UwIhALG+Jr2s0ygy1VfwSBx9OtV45a4/exgbxxn6rJOPLNgA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250231},"type":"module","_from":"file:wtfalch-email-0.1.0.tgz","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"wtfalch","email":"wtfalch.business@pm.me"},"_resolved":"/private/var/folders/gv/h5r3zh7x7hd9h4vg4z8987p40000gn/T/869c1f2bc6e03f54fed812a207d0b163/wtfalch-email-0.1.0.tgz","_integrity":"sha512-pStRlG+lku3GHXKIVHUthVd6kMoLLTvzKAH6RyllpWeWmzGKzos1XHMjK3RJleChumUsnOEmF73A/SBSVPWtaQ==","repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"11.17.0","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"jmap-jam":"^0.13.6","server-only":"^0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.4.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.1.0_1788793319198_0.20570295243210568","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@wtfalch/email","version":"0.1.1","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.1.1","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"09902b27e79fb7eab18f0a20378328dee7a60984","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.1.1.tgz","fileCount":79,"integrity":"sha512-Ihx0y2ZIR0rY22z6UG+04rOG4yp6FFBXCWg9ackwW7SGwwpoDhfphENjvHDA0Cn+J/XMWTR6Vyo4VI58mPTmDg==","signatures":[{"sig":"MEYCIQCXfHWplnGCYJT4I3P5g+Lh+AH5n+ox2YJRNRBwuO1AjAIhAMWTELPtzqHkGMgITONchAfkQnlmK+IPEaVd9PdoaoMI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250572},"type":"module","_from":"file:wtfalch-email-0.1.1.tgz","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"wtfalch","email":"wtfalch.business@pm.me"},"_resolved":"/private/var/folders/gv/h5r3zh7x7hd9h4vg4z8987p40000gn/T/a46d3b3699b9c42382870cc73f3e62a5/wtfalch-email-0.1.1.tgz","_integrity":"sha512-Ihx0y2ZIR0rY22z6UG+04rOG4yp6FFBXCWg9ackwW7SGwwpoDhfphENjvHDA0Cn+J/XMWTR6Vyo4VI58mPTmDg==","repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"11.17.0","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.4.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.1.1_1788794000397_0.7961747019895633","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@wtfalch/email","version":"0.3.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.3.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"dadaa5328de47f3ed180b6ce07162d5344ac64c0","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.3.0.tgz","fileCount":79,"integrity":"sha512-NY8hyFA5mDr2Mnx5W8M/JyLbX6CLb0huGgt32mDJi+MqTCFjp/IYBWEUasD2Sf7skxkCG2jztXgt5oALo2AQUw==","signatures":[{"sig":"MEYCIQD7t4JAvoPHVh4t57TNMVlxbaEN5JzUf2GAVd9K7JJBHwIhAMtMQyRfmXH4celgNO9aYaEUfSxj6aOsTEjqr05/KP3S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254030},"type":"module","_from":"file:wtfalch-email-0.3.0.tgz","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"wtfalch","email":"wtfalch.business@pm.me"},"_resolved":"/private/var/folders/gv/h5r3zh7x7hd9h4vg4z8987p40000gn/T/00943a79ae8863fe5ccaa141c2439704/wtfalch-email-0.3.0.tgz","_integrity":"sha512-NY8hyFA5mDr2Mnx5W8M/JyLbX6CLb0huGgt32mDJi+MqTCFjp/IYBWEUasD2Sf7skxkCG2jztXgt5oALo2AQUw==","repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"11.17.0","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.4.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.3.0_1788864797103_0.39389214924395066","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@wtfalch/email","version":"0.4.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.4.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"292d9eb623f3cb073489f9735cc8f5e5c9b67a87","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.4.0.tgz","fileCount":78,"integrity":"sha512-e3BAX0rlaQeJRFMvtWzRcW4mOz1AYHVpMuGFQn5NcaSHGWWSZz/+w6SaWuhet8leq8mTlxJmSWl5NuHo08RSjw==","signatures":[{"sig":"MEQCIDkrykKPUcRR6Wsh9blBra3Id4+nM3waHmCCkSk+vJHkAiA0jqWsrcGiPNVyNnIu3ANKHlvfsiIXqJ2w/w+vbufEhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254026},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"3309f372030f3abcc481803fbd764c2c7baaaf76","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"wtfalch","email":"wtfalch.business@pm.me"},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"11.17.0","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.4.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.4.0_1788948358346_0.6687659538183968","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@wtfalch/email","version":"0.4.1","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.4.1","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"2655d6c4bdaf848a7defcea7ab5b39e1f7098048","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.4.1.tgz","fileCount":78,"integrity":"sha512-q43EVrgA48AjpXyno0H3HobJxLNy19goR3MjotpL0zJffLrRH4wBYQK3GD+M/mRkiW2sP0YvzuaZrwm6qhYMFg==","signatures":[{"sig":"MEUCIDPkYHAuTVWw3hGIgkRuE7HAofcMyVrkUinOl+UEUQvSAiEAgE6Kz8+uEqOEIIAHYgJHoFbpx9d+HGg8C62jrwDW4pM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":255199},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"bbf1308a6af4ecfe98cb3e5883ff5626a0793c63","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.4.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.4.1_1789039662364_0.9083407769111871","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@wtfalch/email","version":"0.5.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.5.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"8dab6f3977420f2fca306d04795650ffcf42d117","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.5.0.tgz","fileCount":82,"integrity":"sha512-IB8P5SM2Xy1FhK6WxvVJTi+FeezxOjEw4Jysl07nZh7lRDzdfFRJmPFBn/7Ee7tlNovAGKOmaODC6RuSROGomg==","signatures":[{"sig":"MEQCIDdbXNU+6D8+1rRBoog7/tyD6W2UUC/55z+NZG4J5+BcAiApCd5Gyavd0lAYsY7IUs/X9C94wyTGaPHL3t9GqOhVUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":328338},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"0f65d0c975e099bcc61b27ffa489a4140e108303","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.5.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.5.0_1789071501550_0.5151111367797769","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@wtfalch/email","version":"0.6.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.6.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"f00ecfd37d47fbbb66027ce8929ca06014e0696f","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.6.0.tgz","fileCount":86,"integrity":"sha512-l/8bz0KE3sSSMePPMN+J6K98BNUpyyDhzuiRd9UAWhysgJLEx/Vj0fO8onMro97MeWtCTzmMPA+7Iveaud403A==","signatures":[{"sig":"MEQCIAvhdc/0B+yh5DkMk3XgvA7o1d6U6F7DOXtZ+B3dP2EkAiByq0RvFHVoB3vqSxLM+Kvg+Q7mM+8HpWBdZJQW+bXyPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339824},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"73ed199a2dfe95d98160f0824f800dc89cf8cb0a","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.6.0_1789079422891_0.8205239274921106","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@wtfalch/email","version":"0.6.1","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.6.1","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"3f8e8cd3538bf4836e354c3e23b6c212e47423c3","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.6.1.tgz","fileCount":86,"integrity":"sha512-S/lbWV0SwnN23iqji7cVyp0rkvLu0/Adj3H5foPTmb8R5tKPrN+F9gkSvQf1xlI/PrdIb92I10MIDR31JNcIng==","signatures":[{"sig":"MEQCIF+lHc+EUem1pJ8uBoJ9XiBXgZaKr+08Fn0JZw/WjXNAAiAj/JtDtw4Ao25QSO4HwnOQrGDwUxaYUIp9sQFqatRXZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340610},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"22d90d68f2e5b74630ccb5717e050dd35362d208","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.6.1_1789084143797_0.09058710836277672","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@wtfalch/email","version":"0.7.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.7.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"ba077dd3e2d9d617a6bca48c2bda2564bc48489a","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.7.0.tgz","fileCount":88,"integrity":"sha512-Xc8OJdd15qZoD+Ra/2x6UdRfdFzTphi5Dosm6aHxdQIT4rNTS/ChAvjIyBEWAv0krMVAZ1WNS3vUdyjpbIpriw==","signatures":[{"sig":"MEUCIFYn6uPcUKOVbD+Va72jnCezFox5+bP8dvKpjAJwX2IwAiEA65vnEiMGFfzcJQIPLQwLzxkQLezyqOUp89Pq8EKgksg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344360},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"5a0d96bfe950f676840aa8fc5a1ca5eaf2e496be","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.7.0_1789162325072_0.3704269623930019","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@wtfalch/email","version":"0.8.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.8.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"b9c37fdeb4237c12d4d00316585280bb4fd7a2ca","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.8.0.tgz","fileCount":94,"integrity":"sha512-HxRAObNWUJb7Vmgcd/8Zb75vvtwF4HvvU0/oh8FbQ6i4dwP8vBPHOxwOn+eu3vEZyfHMIYRhyjPh/nMF2FhxNQ==","signatures":[{"sig":"MEUCIBaGtF421reetyqhluQ/SO2ePPOg8AuvL34Km3KT4PHZAiEAhCbakdvJ4bFwngobOG8krpA4Fkagc42i1kKG75aGDgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":403154},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"4763e58653a1abd6bbcece1213072d4a4c94ae4b","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.8.0_1789251739267_0.17387705804572295","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@wtfalch/email","version":"0.9.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.9.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"8bbb18348e84fbc74b311625381d7a2b7bf4f113","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.9.0.tgz","fileCount":94,"integrity":"sha512-ILlLLk4IXgju6HafaJadoPStWtxN7agqiMz+f5p+iThuBcv8fI3+1H4hHSn2FbNWVGE7r6EQ0NcLsLw8wSu/tQ==","signatures":[{"sig":"MEUCIQD/91iwnZP+iTw9A23B9E3IcFkwGm0DXNMSo3k0F5dLhQIgeDhHBw2FLoi+bMD8zJWWX/rquXcg+CO4hN3jOuDYB4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD+D22PuD7aN3L8N7WLlY9B4DTCpihDRjJZE+hWHytz2AIhAOfWbiZ/ZuJAXkAaSjCC9WcFJD90CoUWBn7zLeIkWhja","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":405710},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"94c3d7d4735d4f0211ed7f57a98fe11ce24cc623","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.9.0_1789553123003_0.7041051123542807","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@wtfalch/email","version":"0.10.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.10.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"5c93d10256929636f1470408edeb44ae823b8f07","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.10.0.tgz","fileCount":96,"integrity":"sha512-B5om92jsL/W6BfmsKFrPoDFXI2QEAopI/eqVjWOHDsJ7N2lvtG0H9YJ51SKLk86mH/cRWC0jXsgVwGwCljFYrg==","signatures":[{"sig":"MEYCIQCQPtmXPt9J4CodOlkqiavlcJrYIXBN37MtAf6LY+H6oAIhAMeBtZ4hr/IeTjr1whbIIbqstpfz/Uv0I8CmgJV2kNL7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGaWTZE+PIXEo0I/Z//ZTocNL3d6WMOmPEyQTirK9Lk+AiEAjo1BKllj0r+UjqQ0ioajJzOoWkk6wSU+7xzb0TpdqVw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425935},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"7492b8801573666ae8ca716b63fc973196a26684","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.7.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.5.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.10.0_1789559224159_0.6701027052431279","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@wtfalch/email","version":"0.11.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.11.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"3f428ce6feafaee3c8d053e3edd02a6293f3a9b2","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.11.0.tgz","fileCount":96,"integrity":"sha512-GF2U0lrAkjWYcp5CjaQBeYJPLUHheZEabtvaWQD5Eqwt1VesGoLpYoVNS+f3/gxZKXecZ/BropF8myS/ETWUSA==","signatures":[{"sig":"MEUCIA4k+m0ByjZHx120VhEwfelrNzk7u+krhkUaAx1iwJ+QAiEA63UBDV+oIkwTNVjPKnNFVaxySSu6Nh6dnfdbJ0PFOSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBtr0FxSvQxKSbcG7gUPHSA6lu5OebNAuULSwQr9Dm4GAiBW4GNrQ+CPyzR80JXkUpwyghwRpsDjj0pnm+fC2RIVZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":426325},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"d2d107d1fa3156742491f82df37444facb09f04b","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.16.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.16.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.11.0_1789611313832_0.20439789406499798","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@wtfalch/email","version":"0.12.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.12.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"390dc457834df46d03e3575105891f0d7d9fc394","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.12.0.tgz","fileCount":96,"integrity":"sha512-dhnA/bFT9kZ4HOylvc3NZ4FMFy1kAh7G1IbwD+Og4dEq1Ir+NLKej/SHl+t5VYKhRl1L8vxhOMsRRS3bmh+WPA==","signatures":[{"sig":"MEUCIQCleGkfgsdVCD8U2LFTl8l3Z4TDesuO5Ra3vXg8Pq9mKgIgK1eMxyXdzo8QvhM8r9UANtHr55velFp/h/ixV03rzd4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD6K2oXECfVDOuHvTOGQnLfS1retD2htSPOSkMHiueuBQIgEc1wjP7A+jfqVicbGzphNFMsShZVQL8ePZpqDQoSh6M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444676},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"40d69776fc58a0c157f4dafb41e6c94b6d69859a","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.16.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.16.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.12.0_1789947158517_0.39245621991379553","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@wtfalch/email","version":"0.13.0","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.13.0","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"a28e28e76eb646c0fb25cf80606812ccf89516e4","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.13.0.tgz","fileCount":96,"integrity":"sha512-o+11N6D18buJqlyZd6gHLKsjRgKG7lhUXaRxX1Ll33v2kZIpeos502ZOH39/oYjOysI3q1QLOifVP2rhqPpLRQ==","signatures":[{"sig":"MEYCIQDK51hNu2LlFQCvMHxvfjwfq83ZhK++cMbim1jxsZsfWAIhAMQyJurMZGF5caV6ZgvZ5GoVpGDNUsa/zVJLqx+sJg7i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGHYoVraUEFNHPAnuM85oopRyYBGXXaP5rRsuVYAfoTFAiEAoWVDXQA1xzzk4U3/s6DVSeoCCxNCWM4U8HKgCUj8sMg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":458970},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"30e82b90ec8312d2d3989b189bee0c3a90750938","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.16.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.16.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.13.0_1789979159539_0.300381654734146","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@wtfalch/email","version":"0.13.1","keywords":["jmap","email","mail","stalwart","rfc8621"],"license":"MIT","_id":"@wtfalch/email@0.13.1","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"homepage":"https://github.com/wtfalch/email#readme","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"cd112b99ae149c41cd6f97cfb039c85841a1c5d0","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.13.1.tgz","fileCount":96,"integrity":"sha512-NE4d0tgTvC785FPk+S5YSvFzNEhSSCZupiGe5lp8RiBmsrCC86ry/rVuADs6/c5lEjLHR+R34XTQnQr7AYRrug==","signatures":[{"sig":"MEYCIQD9vzg/dDDP4t3D5fzLVJAIjQzPftnlUv7uNulwX6qTUwIhALZN3Q0H3DGJpVCZ2BOo6RExRdBD0aTPEqMcLsof718X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQChV+ymX3dLd1FvMgZXXPf+4fNuRy5cSUf6oPE0k5ZC8AIhAMGOeMAfmQNWJIEDkmBgo/Kyszt1VmoKv3EM9Hy3Nwts","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460914},"type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"ca099bf1ef523da0a8537d248eac591e38b387ef","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.0.2","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.16.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.16.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/email_0.13.1_1789992754889_0.9542272047047096","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"_id":"@wtfalch/email@0.14.0","bugs":{"url":"https://github.com/wtfalch/email/issues"},"dist":{"shasum":"969693f96479c5125599b2feb4ce7465c802ae97","tarball":"https://registry.npmjs.org/@wtfalch/email/-/email-0.14.0.tgz","fileCount":104,"integrity":"sha512-AX1VifwbdSYEf4w7nmdoRSlRmWSsl7TDKjl6OQDOAaUkoFoP09pqsjb0u1NR0lG2Qe1Wlk9w1ElphqVTW5mFQA==","signatures":[{"sig":"MEYCIQDBJbqeTmhqUPzS8NV5Wd82QlFa3HYABKZ+H51tgcZU5wIhAMYAk7D3wd5k+C4wXQVuFFQNwVM6B5n9f3tfJUhxtw/a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDdnWwcKEBi//vrxoousxmfM8SzfXWNz5XnoQoRPVGwKwIgMVkF5Lh88oR0xc3zsixigsJzI1nZPSsHOJHouhRLE9k="}],"unpackedSize":609453},"name":"@wtfalch/email","type":"module","engines":{"node":">=22.0.0"},"exports":{"./mailbox":{"types":"./dist/mailbox/index.d.ts","default":"./dist/mailbox/index.js"},"./postmaster":{"types":"./dist/postmaster/index.d.ts","browser":"./dist/postmaster/browser-refusal.js","default":"./dist/postmaster/index.js"},"./mailbox/fake":{"types":"./dist/mailbox/fake/index.d.ts","default":"./dist/mailbox/fake/index.js"},"./package.json":"./package.json","./mailbox/react":{"types":"./dist/mailbox/react/index.d.ts","default":"./dist/mailbox/react/index.js"},"./mailbox/mail.css":"./dist/mailbox/mail.css","./postmaster/react":{"types":"./dist/postmaster/react/index.d.ts","default":"./dist/postmaster/react/index.js"}},"gitHead":"ba87fe9b52e1bc3dd20f971c7aa6018b5f0582ff","license":"MIT","scripts":{"test":"vitest run","build":"rm -rf dist && tsc -p tsconfig.build.json && cp src/mailbox/react/mail.css dist/mailbox/mail.css && cp ../../LICENSE ../../README.md .","prepack":"pnpm build","typecheck":"tsc --noEmit","record-fixtures":"node scripts/record-fixtures.mjs"},"version":"0.14.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a6f5d40-2d2c-4733-b34d-0ed61254c854"}},"homepage":"https://github.com/wtfalch/email#readme","keywords":["jmap","email","mail","stalwart","rfc8621"],"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"_npmVersion":"12.1.0","description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","directories":{},"maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","dependencies":{"jmap-jam":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","react":"^19","vitest":"^4.1.6","react-dom":"^19","typescript":"^5.9.0","@types/node":"^22","@types/react":"^19","@wtfalch/design":"^0.16.0","@types/react-dom":"^19"},"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","@wtfalch/design":">=0.16.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@wtfalch/design":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/email_0.14.0_1790113137281_0.163244282154132"}}},"time":{"created":"2026-09-07T15:01:58.994Z","modified":"2026-09-22T21:38:57.505Z","0.1.0":"2026-09-07T15:01:59.345Z","0.1.1":"2026-09-07T15:13:20.562Z","0.3.0":"2026-09-08T10:53:17.275Z","0.4.0":"2026-09-09T10:05:58.602Z","0.4.1":"2026-09-10T11:27:42.533Z","0.5.0":"2026-09-10T20:18:21.716Z","0.6.0":"2026-09-10T22:30:23.058Z","0.6.1":"2026-09-10T23:49:03.938Z","0.7.0":"2026-09-11T21:32:05.235Z","0.8.0":"2026-09-12T22:22:19.405Z","0.9.0":"2026-09-16T10:05:23.123Z","0.10.0":"2026-09-16T11:47:04.318Z","0.11.0":"2026-09-17T02:15:13.928Z","0.12.0":"2026-09-20T23:32:38.607Z","0.13.0":"2026-09-21T08:25:59.669Z","0.13.1":"2026-09-21T12:12:34.964Z","0.14.0":"2026-09-22T21:38:57.360Z"},"bugs":{"url":"https://github.com/wtfalch/email/issues"},"license":"MIT","homepage":"https://github.com/wtfalch/email#readme","keywords":["jmap","email","mail","stalwart","rfc8621"],"repository":{"url":"git+https://github.com/wtfalch/email.git","type":"git"},"description":"The wtfalch estate: reading a mailbox over JMAP, and administering the Stalwart server it lives on. Two entries with no code in common.","maintainers":[{"name":"wtfalch","email":"wtfalch.business@pm.me"}],"readme":"# @wtfalch/email\n\nThe estate's mail, in two entries with **no code in common**:\n\n    @wtfalch/email/mailbox      reading and writing messages   (RFC 8620/8621)\n    @wtfalch/email/postmaster   administering the server       (Stalwart's `x:` extension)\n\nThey share a subject, a scope and a repository, and nothing else. There is\ndeliberately no root entry: an entry named for a seam that does not exist is\nworse than no entry at all.\n\n`/mailbox` is for the person who has an address — inbox, threads, compose —\nrunning in their browser as them, able to touch only their own mail.\n`/postmaster` is for whoever runs the server — who gets a mailbox, what name\nis on it, who holds a key — running server-side with an administrator\ncredential, and never touching the contents of anybody's messages.\n\nThe post office holds the analogy: one is the letters, the other is the\npigeonholes.\n\n---\n\n## @wtfalch/email/mailbox\n\nRead and write mail over JMAP: session, mailbox tree, threads, bodies and\nattachments, search, identities, submission and push. RFC 8620 and 8621, over\n[`jmap-jam`](https://github.com/htunnicliff/jmap-jam), so it is not tied to\nStalwart the way its neighbour is.\n\n```ts\nimport { MailClient, mailboxes, findRole, listThreads, thread } from '@wtfalch/email/mailbox';\n\nconst client = new MailClient({\n  sessionUrl: 'https://email.example.com/.well-known/jmap',\n  bearerToken: accessToken,   // the signed-in person's, from the issuer\n});\n\nconst tree = await mailboxes(client);\nconst page = await listThreads(client, findRole(tree, 'inbox').id, { limit: 50 });\n```\n\nA login usually reaches more than one mailbox. `client.accounts()` lists them,\nthe person's own first: a shared mailbox such as `hr@` is an ordinary account\nthe server puts in the same session with `isPersonal: false`, because the\naccount is a member of it. A client stays on the account it was built with, so\nopening another one is `new MailClient({ …, accountId })` with the id from that\nlist — which is what keeps one client's cached session honest.\n\n**One folder can also be shared on its own**, finer than a whole account:\n`shareMailbox(client, mailboxId, accountId, rights)` grants another account\nsome of RFC 8621 §2's ten rights (`mayReadItems`, `mayAddItems`, …) on that one\nmailbox, and `unshareMailbox` takes them back. Both patch `Mailbox/set` at\n`shareWith/<accountId>` rather than sending the whole `shareWith` map, so\ngranting or revoking one account's access never touches another's, and needs\nno read first. `mailboxes()` returns each node's own `myRights` (what the\nsigned-in login may do there) and `shareWith` (who else can, and with what),\nboth always present, every right explicit — RFC 8621 requires `myRights`, and\nthe wire has been seen to fill in every unrequested right on `shareWith` as\n`false` too, which `buildTree` also does for a caller-built value that leaves\nsome out.\n\nA page of threads is **one round trip**: the query, the newest message per\nthread, the threads' member ids and the members are four method calls chained\nby JMAP result reference in a single request.\n\n`replyDraft` and `forwardDraft` are pure — give them a message and they\ncompute the recipients, the subject prefix, the `In-Reply-To` and `References`\nchain and the quoted body, with no client and no network, so a composer can\ncall them on every keystroke. `send` creates the draft, submits it, and files\nit in Sent; a `delay` in seconds holds it there first, and `cancel` unsends\nit while `undoStatus` is still `'pending'` — the only honest sign the window\nis still open, since a server not set up for held delivery answers `'final'`\nregardless. `queued` lists everything still held, soonest first, for a\n\"scheduled\" view that survives a reload: it filters its query on `undoStatus`\nrather than reading the field off an unfiltered one, since that filter is\nwhat makes the server recheck each submission against the mail queue and\ndemote one that already went, instead of answering a stale `'pending'`. Every\nrow it returns is safe to hand straight to `cancel`. `saveDraft` stores a\ndraft in Drafts so it outlives the compose sheet, and given the id it returned\nlast time, replaces that draft instead of adding one (messages are immutable,\nso the id changes each save). `send(…, { draftId })` sends and removes the\nsaved draft. Both refuse an id that is not a `$draft`, since replacing is a\ndestroy. `attach` uploads a file\nand gives back what a draft carries; the\nupload is refused before any of it is sent when the file is over the\nsession's `maxSizeUpload`, which `client.session()` reports alongside\n`maxSizeAttachmentsPerEmail`.\n\n`setRead`, `setFlagged`, `moveThread`, `moveToRole` and `removeFromMailbox`\nchange mail rather than read it, and every one of them takes a **thread**.\nRFC 8621 has no `Thread/set` — a thread is derived from its messages — so\neach resolves the members and patches all of them in one `Email/set`, because\na conversation half-archived or half-read is not a thing anybody asked for.\nThey resolve when the server has accepted the change; nothing here is\noptimistic, since the count is the one number people trust.\n\n```ts\nawait setRead(client, threadId, true);\nawait moveToRole(client, threadId, 'archive', { mailboxes: tree });\n```\n\n`setLabel` puts a label on a thread without moving it: the keyword\n`$label:<name>`, lowercased, since keywords are case-insensitive. A name a\nkeyword cannot hold (a space, any of `(){]%*\"\\`) is refused, not rewritten.\n`ThreadSummary.labels` carries the labels on any message in the thread.\n`listLabels` reads the newest 500 messages (`scan` to change it), because\nJMAP can search for a keyword but cannot list them.\n\n`snoozeThread` moves a thread into a top-level Snoozed mailbox, made on first\nuse, and stamps it `$snoozed:<unix seconds>`. JMAP has no snooze, so nothing\nbrings it back on its own: the host runs `wakeSnoozed(client, now)` on a\ntimer, and each thread whose time has come goes back to the Inbox, unread.\n\nNote that a stock Stalwart account has **no Archive mailbox** — it creates\nInbox, Drafts, Sent Items, Junk Mail and Deleted Items — so `moveToRole(…,\n'archive')` throws there rather than doing nothing, and a caller should offer\nthe action only where `findRole(tree, 'archive')` finds one.\n\n### The React\n\n`@wtfalch/email/mailbox/react` draws it, on `@wtfalch/design` >=0.16.0.\n`Mail` is the whole client — mailboxes, list, message, composer,\nsearch, a toolbar, and a command palette on Cmd-K — and the only piece that\nholds state or fetches.\n`MailboxTree`, `ThreadList`, `ThreadView` and `Composer` take their data as\nprops and know nothing about a client, so an application with its own layout\ntakes the four and skips the shell. `HtmlBody`, which `ThreadView` draws a\nmessage's HTML with, is exported on its own too. Import `@wtfalch/email/mailbox/mail.css`\nafter the design stylesheet.\n\n**Three layouts, and the middle one is not decoration.** Three panes above\n1150px, an icon rail and two panes above 860px, one pane at a time below it.\nThat last is why `usePanes` is a hook and not a media query: at one column the\nlist and the message are the same space, so which of them is showing is state\nthe shell has to hold.\n\n**The keyboard is the point.** Arrows and `j`/`k` move through the list, which\nis a single tab stop rather than fifty; `c` writes, `r`/`a`/`f` answer,\n`e`/`#`/`u`/`s` file, `/` searches and `?` lists them all. They are ignored\nwhile a field has focus, or `c` could never be typed into a subject.\n\n**Opening a conversation marks it read**, which is what opening means — and\nonly when there is something unread in it, because a `set` that changes\nnothing still moves the account's state and wakes every other client's push\nconnection.\n\n**A file is on the draft only once it has uploaded.** Attach opens the file\npicker, and a file dropped anywhere on the composer is taken too. Until its\nupload lands it sits in the list with a spinner and Send waits, because a\nmessage that went while a file was on its way arrives without it. One that\nfailed says why and can be tried again; one over the server's limits is\nrefused before a byte is sent. Either stays in the list, and Send keeps\nwaiting, until it is retried or removed. `Composer` takes the upload as an\n`onAttach` prop, since it holds no client, and `Mail` supplies `attach`.\n\n**HTML is drawn in a frame it cannot climb out of.** Mail arrives from\nstrangers, and a client that injects their markup into its own document is one\nscript tag from being read by them. So `HtmlBody` never does. Three walls,\neach of which holds if the other two fall:\n\n- **A sandboxed frame.** A `srcdoc` iframe with no `allow-scripts`, no\n  `allow-forms` and no `allow-top-navigation`: nothing in it runs, submits or\n  replaces the page. Links open a tab of their own. It has\n  `allow-same-origin`, deliberately, so the view can size the frame to the\n  message; that is safe only because nothing in it can run, and\n  `FRAME_SANDBOX` is pinned by a test that fails if `allow-scripts` joins it.\n- **A content policy of its own.** `default-src 'none'`, inline styles and\n  nothing else, `form-action` and `base-uri` closed, no fonts, and images from\n  `data:` only.\n- **A sanitiser.** An allowlist of elements and attributes, walked over an\n  inert `DOMParser` document, for what the other two do not stop — a `<meta>`\n  refresh, a `<base>`, a `ping`, a relative address that would fetch from this\n  application. CSS is read back through the CSSOM rather than matched with a\n  pattern, so `u\\72l(` is caught as the `url(` it is.\n\n**Remote images wait to be asked for.** An image on the sender's server tells\nthe sender the message was opened, when and from where, so they are withheld\nand the reader is told how many, with a button that shows them for that\nmessage. Inline `cid:` pictures are part of the message and are drawn — fetched\nthrough `fetchInline`, behind the same credential as everything else.\n\n**Plain text first, where there is a choice.** A message with both bodies is\nshown as its text, with the formatted version a button away. HTML is drawn on\nwhite in either theme, because it was written for white.\n\nA `srcdoc` frame inherits the embedding page's content policy as well as\ncarrying its own, so a host whose policy has no `style-src 'unsafe-inline'`\nwill draw mail unstyled, and one whose `img-src` has no `data:` will draw it\nwithout pictures.\n\n**Mailboxes are drawn in reading order, not the server's.** Stalwart gives all\nfive `sortOrder: 0`, so the tie-break by name puts Deleted Items first and\nInbox third. `mailboxes()` still reports what the server said.\n\n### A mailbox with no server\n\n`@wtfalch/email/mailbox/fake` is an inbox in memory, for stories, for a\ndevelopment build and for tests.\n\n```ts\nconst { client, mailbox, dispose } = fakeMail();\nconst tree = await mailboxes(client);   // the real function, over the real wire code\n```\n\n**It fakes the transport, not the API.** Stubbing the exported functions would\nmean every story exercises the stub while the four-call chain, the result\nreferences, the body resolution and the null-handling never run. It answers\nJMAP instead. It replaces the global `fetch`, because `jmap-jam` calls the\nbare global and takes no way to pass another one; the replacement delegates\nanything not addressed to it, and `dispose()` puts it back.\n\n## What it knows that the RFCs do not\n\n**RFC 8621 §7.5's `onSuccessUpdateEmail` collides.** The server returns the\nimplicit `Email/set` under the *same method call id* as the\n`EmailSubmission/set` that triggered it, so a client reading a multi-call\nresponse into a map by id loses the submission's own result. `jmap-jam` does\nexactly that, so `send` submits through the single-call path — and creates the\ndraft in a separate request, which also leaves a failed send in Drafts rather\nthan losing it.\n\n**The event source is authenticated**, and the browser `EventSource` cannot\nsend a header. `push` reads the stream with `fetch` and parses the\nserver-sent events itself.\n\n**Session URLs are templates that need encoding.** RFC 8620 §6.2 requires it,\nand `jmap-jam`'s expander does not: an attachment called `Q3 report (final).pdf`\notherwise builds a URL addressing the wrong thing.\n\n**Stalwart sends `null`, not an omitted property**, for an absent header or\ndisplay name. `src/mailbox/fixtures/instance-one.json` is recorded from a live\n0.16.20 instance and pins it.\n\n**`jmap-jam` is kept internal.** It ships raw TypeScript with `.ts` import\nspecifiers, which only compiles under `allowImportingTsExtensions`; nothing of\nit reaches this package's public types, so a consumer does not inherit the\nflag.\n\n**Per-mailbox sharing is real, and it is the plain `Mailbox` object, not a\nseparate capability.** `shareWith`/`myRights` are confirmed on the schema at\n`stalwartlabs/stalwart` tag `v0.16.20`\n(`crates/jmap-proto/src/object/mailbox.rs:31-53`) and exercised end to end —\ngrant, partial patch, revoke, and the server's own fill-in of every\nunrequested right as `false` on read-back — by the sibling `AddressBook`\nobject's ACL suite, `tests/src/jmap/contacts/acl.rs`, which shares the same\n`shareWith`/`myRights` machinery. Not yet confirmed against a live instance\nthe way `instance-one.json`'s fixture is: nothing in this package wrote a\n`shareWith` grant before now.\n\n## @wtfalch/email/postmaster\n\nAdminister a [Stalwart](https://stalw.art) mail server: its domain, its\nmailboxes, their aliases, their app passwords and their quotas, over the JMAP\nmanagement API.\n\n**This is not a JMAP mail client.** It speaks the `urn:stalwart:jmap`\nmanagement extension — `x:Account`, `x:Domain`, `x:ApiKey` and their\nneighbours — which is a different surface from RFC 8620 and 8621 entirely.\n\n**The credential is why this entry must never reach a browser.** `/mailbox`\nruns in a browser holding the signed-in person's token. This runs on a server\nholding an administrative one. A minted key **can** be scoped — that is what\n`DASHBOARD_PERMISSIONS` is for — but nothing obliges a caller to hand this\nentry a scoped one, and an account password or an `'inherit'` key is as\npowerful as the account itself.\n\nNeither a package boundary nor an entry name enforces that: bundlers follow\nimports. What does is the `browser` condition in the exports map, which\nresolves this entry to a module that throws with an explanatory message. It\nwas `server-only` for one commit, which was wrong — that throws in *any*\nenvironment without React's `react-server` condition, plain Node included, so\nit blocked `pnpm bootstrap` and `mail:sync`, which are exactly the callers\nthis entry is Node-safe for. The `browser` condition tells the illegitimate\ncaller from the legitimate one; `server-only` could not.\n\n```ts\nimport { openInstance, overview } from '@wtfalch/email/postmaster';   // pure Node\nimport { DomainCard, Mailboxes, People } from '@wtfalch/email/postmaster/react';\n```\n\nThe first entry has no React in it, so a provisioning script can use it. The\ncomponents are server components except the two interactive leaves, and they\ntake data and already-bound actions: **nothing here fetches, gates or\ndecides.** The consuming app reads the instance, asks its own authorisation,\nbinds its own Server Actions and passes the results in — the division\n`@wtfalch/threads` draws, and what keeps a package free of anybody's session.\n\n**`openInstance` refuses with a reason, not a sentence.** It throws\n`InstanceRefused`, whose `reason` is `'not-https'` or `'account-missing'`.\nBranch on that. Both refusals were once a plain `Error`, so consumers told\nthem apart by matching words in the message, and rewording a sentence here\nquietly changed which error a dashboard showed.\n\n```ts\ntry {\n  openInstance({ url, secret, user });\n} catch (e) {\n  if (e instanceof InstanceRefused && e.reason === 'account-missing') …\n}\n```\n\n`@wtfalch/design` is an optional peer dependency, needed only for `/react`.\n\n## What it knows that the docs do not\n\nEvery one of these was established against a live 0.16.20 instance, and each\ncost an afternoon.\n\n**An API key authenticates as `Authorization: Bearer`, never Basic.** The\nsame secret sent as Basic is refused with 401 whatever username accompanies\nit — the account name, the local part, the key itself, none. `authFor` picks\nthe scheme from the secret's own shape, since a key is `API_`-prefixed.\n\n**An API key is scoped with the `sys*` permission names.** `permissions` takes\n`{'@type': 'Replace', permissions: {…}}`, a Set, so `{sysDomainGet: true}`.\nThe names live in `enums.Permission`, and the management ones read\n`sys<Object><Verb>`. An earlier round of sixty guessed names accepted only\n`authenticate` and `impersonate`, which is what made a scoped key look\nimpossible; the guesses were wrong, not the feature.\n\n`createApiKey` therefore mints a scoped key by default. `DASHBOARD_PERMISSIONS`\nis the set verified on 0.16.20: `authenticate` plus `sysAccountQuery`,\n`sysAccountGet`, `sysAccountCreate`, `sysAccountUpdate`, `sysDomainQuery`,\n`sysDomainGet`, `sysSystemSettingsGet`, `sysMtaExtensionsGet`,\n`sysMtaExtensionsUpdate` and `sysActionCreate`. It serves every `/email` page, and\nit is `forbidden` on `Email/query` for every account on the instance —\nincluding its own, so the key administers mail and cannot read any. Pass\n`'inherit'` for a key as powerful as the account; prefer not to.\n\n`sysActionCreate` is the widest of these: Stalwart has one permission for\nevery action, so the key that can reload settings can also pause the mail\nqueue. It is there because a changed setting does nothing until a\n`ReloadSettings` action runs. A key minted before a name joined the set does\nnot gain it; mint a new one.\n\n**A server that is not holding mail says nothing.** With\n`MtaExtensions.futureRelease` unset, Stalwart sends a held submission at once\nand reports it as held. Provisioning sets it (`FUTURE_RELEASE`, 30 days); an\ninstance provisioned before it did stays off. `holdLimit(instance)` returns\nthe limit, or `null` when the server will not hold at all, and\n`enableHolding(instance)` sets it and reloads.\n\n**An API key can never create a credential.** It authenticates, and both\n`x:ApiKey/set` and `x:AppPassword/set` answer `forbidden` whatever permissions\nit holds, so a key cannot mint its own successor. Rotating one needs the\naccount's password or app password. On a domain with an external directory the\naccount password stops being verified locally as well, which leaves an app\npassword the only credential that can still write — and the admin UI will not\nadd one from the account form, answering \"Secondary credentials cannot be set\ndirectly\". Provision the replacement before revoking the one in use.\n\n**A `List<T>` write replaces the whole list.** Adding one alias means sending\nback every alias that survives. A read-modify-write that drops an entry does\nnot fail; it deletes somebody's alias, or every app password on their phone.\n`withAlias`, `withoutAlias` and `withoutAppPassword` exist so that arithmetic\nis decided by a unit test rather than at the end of a request.\n\n**A shared mailbox is a `Group` account.** `hr@` that a team reads together is\nan ordinary account whose `@type` is `Group`: same delivery, same aliases, no\npassword, because nobody ever signs in as it. Who reads it is written on the\n*people* — an account's `memberGroupIds` names the groups it belongs to, and\nthe server turns each one into a second account on that person's own JMAP\nsession, which is how `/mailbox`'s `client.accounts()` sees it.\n`createGroupMailbox` makes one, `addToGroup` and `removeFromGroup` say who\nreads it, and `withMembership`/`withoutMembership` do the arithmetic. A\nmembership map is a set on the wire (`{\"<id>\": true}`) and is replaced whole,\nexactly like a `List<T>`. `addToGroup` refuses a group id that turns out to be\na person's own mailbox: the server would store that happily and it would give\nnobody access to anything.\n\n**There is no conditional write.** JMAP's answer to the above is `ifInState`,\nand these objects do not offer it: `x:Account/get` returns `accountId`,\n`list` and `notFound` with no state token, and `x:Account/set` rejects an\n`ifInState` argument outright as `notRequest`. So two overlapping writes to\none mailbox still lose one, and what `apply.ts` does instead is notice: it\nre-reads afterwards and names anything the caller never touched that has\ngone.\n\n**Wire shapes are not what the docs show.** A `List<T>` is a map keyed by\nindex (`{\"0\": …}`), a `Map<T>` is `{\"value\": true}`, a `SecretKey` from the\nenvironment is `{\"@type\":\"EnvironmentVariable\",\"variableName\":\"…\"}`, and\nsingletons are addressed with the id `singleton`. An administrator's `roles`\nis `{'@type': 'Admin'}`. `usedDiskQuota` is a plain byte count; `quotas` is\nan object whose key for a *set* quota has never been observed, so\n`overview()` reports no limit rather than inventing a number.\n\n## Refusals\n\nThe write helpers refuse rather than doing something surprising: an alias\ngiven as a whole address (it would become an address at\n`w@example.com@example.com`), a duplicate (an unreachable second entry),\nrevoking an account `Password` or an `ApiKey` through a call meant for app\npasswords, and creating a mailbox on a domain that keeps its own passwords,\nwhich needs a first password shown once and so points at a terminal tool\ninstead.\n\n## The audit\n\n`createMailbox`, `createGroupMailbox`, `addToGroup`, `removeFromGroup`, `addAlias`, `removeAlias`,\n`revokeAppPassword`, `enableHolding`, `retryQueuedMessage` and `purgeQueuedMessage` take an\noptional last argument, a `PostmasterAudit`: a `write` the host bound to its\nown ledger, the principal it resolved for this request, and the request id\nits log uses. Without one, nothing changes.\n\n```ts\nconst applied = await addAlias(instance, { accountId, name, domainId, apex }, {\n  write: (event) => ledger.record(event),     // the host's, bound to `mail`\n  actor: { id: principal.id, display: principal.display },\n  requestId,\n});\n```\n\n**A write records what happened, after the server has answered.** The\nevent carries the before/after pair the write computed — which alias, on\nwhich mailbox; which app password, by its description — so a host does not\nreassemble it from `Applied`. It is never a secret: `target.id` is an\naddress or a credential id.\n\n**A refused write records nothing.** It throws before `write` is called, and\nrecording the attempt is the caller's, since only the caller knows who was\nrefused and why. Nor can the two be atomic — one is a mail server, the other\nis the host's database — so a crash between them loses the row, and the\nrequest id is what joins it back to a log line.\n\n**The names are `mail.*`, declared in `POSTMASTER_AUDIT_EVENTS`** so a host\ncan merge them into its ledger's vocabulary. A host whose vocabulary is\nclosed maps them instead: `wtfalch-manage`'s database refuses any action\noutside its authorisation package's set, so its writer puts each back on the\ncore event it already recorded these under, and signs the row with the\nprincipal it resolved rather than the one the event echoes.\n","readmeFilename":"README.md"}