{"_id":"@sandprivacy/sandgate","_rev":"31-ddcf719958fe2c34c9811cd0e4ce0a25","name":"@sandprivacy/sandgate","dist-tags":{"latest":"0.8.1"},"versions":{"0.1.0":{"name":"@sandprivacy/sandgate","version":"0.1.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"a6eab790e52b59fb89ba9e7c5fc83d0bde7e27ad","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.0.tgz","fileCount":23,"integrity":"sha512-SOWiQzHWG50lxQ0ttV+zjdM0BXK35qqLcibPMzhSVLCP+A6P8dXrizFjgF6ZMg6B6jtoaM6yQYG4xFJ8QXRrXw==","signatures":[{"sig":"MEQCIGi4bxVSQ6toWpdwXTfKGlreBpcZIUi9juUgYBz0yaIzAiAFbW0yE+HLGpysY1LSnhCvv8R8vNvQ64ltyVtrIZuXEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128192},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"f333af3382989b9eb7d13d8a03dc2d4513942ed2","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.0_1788458663468_0.5494620258761278","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@sandprivacy/sandgate","version":"0.1.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"7763c6984c7086469aa8dd1818d9d1e0546452a8","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.1.tgz","fileCount":23,"integrity":"sha512-dKd9ZwBfjU4EOotondVcsvLObrp5kjcV6Cn3KTWrvUkx2YcAigR/sFbkpJxJ7f67zDFTmJeI0UYPeg+401xN9A==","signatures":[{"sig":"MEUCIG2YZCoZJJeLkKIENCBJlJH4GDL77sJEs+eFJxAUEeCSAiEA0qkfpeHFkZP4AX5ZI2lUwJTrMGeiOF9XmCpuoZ2VYxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128824},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"62d95bf6901960cead1a84392b16235535e091f6","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.1_1788465281662_0.38408186537260236","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@sandprivacy/sandgate","version":"0.1.2","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.2","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"9ac8e1162098f61a8aa410d0d006d6178a91ef73","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.2.tgz","fileCount":23,"integrity":"sha512-VAtMQkAFir0fSKzGPnsENvWpUwtKdtsbKgz6qusqJ8qAxVc7OWxgacDe2YukCdqVuXI2ZDRHF8vJARy8xsBQpw==","signatures":[{"sig":"MEQCIECQtm+ek3t9L3p9xP6WutjbxEuSz/rbZZU7nPJKKNM4AiBQS9QmTvBZ+soUgfwPzSyTzdEMUvOcnZYLSWqgZTXKHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137081},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"bee1c5c8c66f60ba8d3feeeaac13431cb6845705","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.2_1788466266859_0.1841570948929252","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@sandprivacy/sandgate","version":"0.1.3","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.3","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"0d947efb641f3ff6fec7c390677e071952651edd","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.3.tgz","fileCount":23,"integrity":"sha512-nn8eg5tHRV7LK4M6TGrxRMcNEzvYP56sW4qf3mDV4ersmaisP6TeFEAbiPCWixfBpXgH8KKgrL6dhApLgusOVg==","signatures":[{"sig":"MEUCIQDtzc0LLuLuZPXOVnydCNmzUugRBEvV0eOj+n8WwLx7+AIgQRML/3tcp13EVo/wYBGwjm67EkwD2KxKr6OdE7Lov8U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140498},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"dd7059c8aa41059edea470ce90a598af00cdb848","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.3_1788467569663_0.6364438720549068","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@sandprivacy/sandgate","version":"0.1.5","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.5","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"5996a7892de9654b6c8e0d4a43087d85aa7a26b2","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.5.tgz","fileCount":23,"integrity":"sha512-NyrvNFoNIJki6ZMZJlVg3bPLCLmf+NBchZpqGrldfhK0DFIrjw/0Yc8TUkVFBc0DYIW02Ft9PVTLeQ7FPilI5w==","signatures":[{"sig":"MEUCIHophT5pzbauN96Fg+FBTwk2NRvwfIXC+kV18RNtsbihAiEA2X8ySOtiL4dx+41zbFq+bET1JPQ8uqXKvRRCzEVTrSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146541},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"45e3cee45ea61ad7b806c6e4c766b30c86f718f0","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.5_1788469022649_0.5683602670409194","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@sandprivacy/sandgate","version":"0.1.6","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.6","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"f55612f0eb6348cc752d4b8a6b4212f1d0ebf9df","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.6.tgz","fileCount":23,"integrity":"sha512-BbrpsMYXTB4L7zNlP/vbwK9v6DFviSPfzMqPoGlcVgksYgoJFGYRClScSBH5GEUAlzafR55/ccIpdy/dMk9pWA==","signatures":[{"sig":"MEYCIQCWnYFpqw07tWNip4q2584wKyiNOi8iMSIAvl3RmVt+tAIhAP/gd5xSgJ4bjXHldLS42jPcAaB4dPpWAV97jZkwbPuR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147493},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"407f5ecce0901b4b3504e92149e7997c09daff65","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","typescript":"^7.0.2","@types/node":"^26.4.1","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.6_1788469817604_0.9572247770724858","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@sandprivacy/sandgate","version":"0.1.7","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.7","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"0c625732585bb08f087cb80197fd7b31d1d3d9a1","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.7.tgz","fileCount":24,"integrity":"sha512-Md6w7vaPUgHk2pfmrBAY1ebJceip1eW5VUUtfERu9N4PlYdzrai/bvny/8HbOtOkxugDmguX/VOePFhlTS3Wyw==","signatures":[{"sig":"MEUCIQDUyOtugvmCQtLLVLf26RAEUFI6cKhoBut4M6ocV2sDDgIgbbSgglR9+iaKmMiAlDBw+LRAXSEiTYKtvTBQujCXCQw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154233},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"db84040479776b3e4a2f0e811401b082af579166","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.7_1788471245876_0.6631942397313719","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@sandprivacy/sandgate","version":"0.1.8","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.1.8","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"b4eb4d023b55f4cb10c536da614ed2ea7896321a","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.1.8.tgz","fileCount":24,"integrity":"sha512-yAzxf4RWN7QMce8gp/5jFvl952OtqQ11MFw7F8f3HRY+XIoXab5SYjZ260ZgVXdhB5zAtOxFweW6gBRPb2jKtw==","signatures":[{"sig":"MEUCIEu2E+CuGHcv+mFmUxSLqbm7eadkbdhA1I95dk4VNApHAiEA5zfRszZvdj96J0UfzJnlCZ782mQypYTLA37GhiV60Eg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154233},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"ced2ab1b4adc78a441e835c5ac57d2d3bb956144","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.1.8_1788472827618_0.20348277050756036","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@sandprivacy/sandgate","version":"0.2.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.2.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"14a47a6c9d5438851bb0c76b6199dd8af1454b9e","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.2.0.tgz","fileCount":24,"integrity":"sha512-3DqkQhGoocyzrCa1RajDbNdCy+SynLxYHtNH5NVcLKCM4seySkhimJ6jP1SES/exGF7cTZUBtHgLM/ANRRnAPQ==","signatures":[{"sig":"MEQCIHwpKjYh4wW4e4eNFxah9Lofs7FSOW2b4lzJzsJYSEqfAiAmiSH8amhM1k9zbogudM1qSHOAdQ2c5pFSl1/JKUAviQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162260},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"0bb5702fa0ddfd0ef260b6c4da7e166b6baca928","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.2","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.2.0_1788477204969_0.2969810169362732","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@sandprivacy/sandgate","version":"0.2.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.2.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"6fc1e264c8ed708b87b1e5024f98d758234b6b94","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.2.1.tgz","fileCount":26,"integrity":"sha512-GxLhuJKbYyXLk696KUM7OalaXW38cKwzdP8qeirWWiKbXr1k0icbuNflBMnNLhvLc0nxt9B+79NWaywyY6fdSg==","signatures":[{"sig":"MEYCIQDzTqhZMXQPhFK0wfZPfsHkkKbuSaYU6svk2Vs7sgfQRgIhAMc/bO98sSoAxvCOwAWIxjPWIyahdy36rfTy+t2l0qs1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165314},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"4afa9ab1e69f9c57a46226f3890789f143c420a3","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.2.1_1788478554657_0.46888133439696644","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@sandprivacy/sandgate","version":"0.2.2","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.2.2","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"edc328c4232b28a00430852ec6038eb9c97aff9b","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.2.2.tgz","fileCount":27,"integrity":"sha512-+zLwB9H8BcjhxLz4QWJXjuxSXyvMpqNtDjuQVXK0NG3o/BJbu3Qs3NUzwQ/XnrJQZGNskWnwmEuUnuqe2jZ+hw==","signatures":[{"sig":"MEQCIEEGryuO9ohfTG1Ji2H3q8tcdoMMf3Q4+dZwH8mIMpO6AiA+lzNjVsf0dla1LFRvidnBDyAr8HMJdgoHAmantMYMqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170174},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"8f1a5b6b21d54ed7a9cb8c5eb3ce27fcfff2162b","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.2.2_1788519641171_0.28356621181989916","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@sandprivacy/sandgate","version":"0.3.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.3.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"63687507445e7943d683280713ea98ab9e081d2b","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.3.0.tgz","fileCount":31,"integrity":"sha512-PmrEY778g7rtCkFomxbkL+o54yfxsAzoJdtQcZ4Ugt0LRlHb2UlubdyJM1ICtt00T7zUjQ+lllt1ik5dYOIZDQ==","signatures":[{"sig":"MEUCIQDyWCbqaONJEhGNnDet0s5TyP/mqY3jdcQtPIYeFkctRgIgXxTl7q6jEWzHcWYgdhJF7mSWaDpwRns5Trptiy5j7+Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195500},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"64a1b93991ebd8046e3f82551bbb639387ef8f88","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.3.0_1788526791023_0.6136681148480225","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@sandprivacy/sandgate","version":"0.3.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.3.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"0259bb6f4ce3d131184b06332b13a2fd9a33b0bd","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.3.1.tgz","fileCount":32,"integrity":"sha512-hvqfBUIg8DJ7gsJOZ2IGVJYyA9jn/9V4lu1pbrQ7Xy28s7AP8QL4eLEaDTlioaKtttViMIdx9T9A6Z7fhGQGVQ==","signatures":[{"sig":"MEYCIQCLSvRhTiLxkKbU+zOSJLdgW13HZrTuOLpUm2yrQqP+AAIhAJ9rg/tOnxAWcH6XeR7OggdvLr9vi8x/rFNlXZi6hlgC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201060},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"3e1688ee43ad774675100f306bc3c2f8e202c722","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.3.1_1788527553859_0.7369328719435195","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@sandprivacy/sandgate","version":"0.3.2","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.3.2","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"3ee34234103cbdb78e6b0ad5605effaa5749bcd1","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.3.2.tgz","fileCount":33,"integrity":"sha512-QKTi3YtLI2CUxMUpGsELawrUE/eIJGVUyfrUteOg9clq6wZYr+uSO/QK8oVZ/hv75DswgsexzhZxDhN2Ch0oqQ==","signatures":[{"sig":"MEUCICuQuXz5ZuehbQY7+BNGVAe8ooG1rx+E18zxplqoYkQVAiEAmWBbHhW9hyyFMJCMau7lf43IIHCcMaqYwWX2YwZdzCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207130},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"230427e6b17ab52c08afddabfa6d11248f58ab5e","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.3.2_1788528849684_0.41000094748428295","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@sandprivacy/sandgate","version":"0.4.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.4.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"9642f520f6df1da2da9fff35ec5483b2de191d06","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.4.0.tgz","fileCount":33,"integrity":"sha512-mFFqog0kO3y8zu6FubRaN1i8dFYKYNVWnjhEvFdzO4067TzHuDQebztlTW0GC5LMUOQbsWjXTtAynZv1lZaVsA==","signatures":[{"sig":"MEUCIQC7SNxkSOplBWGgSQ0Mg+dL1KGemdwHeJ5Skjx19K2NhgIgG61OIdGwEGS71cfsxo6Zcyrnnow07Kh9ycWSXZDmacs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":211267},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"461437e8b179f3b7d4e76ea48ad2948648da7d4b","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.4.0_1788542359279_0.8383850992482007","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@sandprivacy/sandgate","version":"0.5.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.5.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"e32196801ba1d861013b8416b5bb75592db82280","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.5.0.tgz","fileCount":36,"integrity":"sha512-BPD3I9jJ5cJGahszUj9B31va2vCHr0FfmtHBbsosHEtI0b4B1w1y8rzZ9JDgtu5FusoklqVTfJaykWt1WZt2EA==","signatures":[{"sig":"MEUCICZ85NdY+nE3hcfPERJYv8fZEOA2dWRHAqmFvD0GlP/8AiEA6AMFlsI6Dir4s0KxxsX7fSXSSS7D7G7cZlyHCKjZ7Ws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229638},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"12dd4b5ccebaa3df67a50d70c9070a6daf17e5c5","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.5.0_1788545051789_0.9628595356665188","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@sandprivacy/sandgate","version":"0.5.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.5.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"11220b3a5f3b292b8fdf15a20ae8a1ede3586206","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.5.1.tgz","fileCount":36,"integrity":"sha512-ym+aampMElQk3N4y7idcfJgmEdvLbxQaSXTjUvmeSH3xN65iimmgtQIeH0IO/V7aTY2JWnlodRNnZ+N4qY+nvg==","signatures":[{"sig":"MEQCIEZUFYQdZs7Ujs6GjwTMzLcI3q5djUL2AZwQMYUxyTfJAiBQV3ZBHw/1lhOwXwK8SL9fcZuJ65uGGDtvHErAQ5rPhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231994},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"b51193cde6d2ff750ea5cbc06c4a371997234a52","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.5.1_1788545959599_0.5294936604999909","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@sandprivacy/sandgate","version":"0.6.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"8fe2b19d8bc0b9d444b2a5ac71c23a4ee3a3cc93","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.0.tgz","fileCount":38,"integrity":"sha512-2sJW1k/jJOJ/lUuI57o3FuRaQ6JdVcWlAxUmpEOEdpsnfBWNoNivVNqCS9hmB5AMRiXcgoGyQBSxx/EJc4V0qw==","signatures":[{"sig":"MEUCIQCOWv5dqzK45CWULeb2itE9utihg8mk0iH5D2q5ymFmdQIgKpOPgqzT7EshKOZiFfOc3V+m2hzl8MuIwGbNIdImw6o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248112},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"462ebeb4489e9ace6e556acf64c8a4823d2e03ab","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.0_1788546715795_0.6435867284041588","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@sandprivacy/sandgate","version":"0.6.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"9a9a9f9eb7992419847f4fff9dc0017f2ad8c439","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.1.tgz","fileCount":38,"integrity":"sha512-JYy9iMP645HbQUzuEFUWehEgZNRONM68qoIbWW0sJDSV6X/0qEJb+Jur3vAZD3Zx8UKyuEVJZkb7mX7S/bojBw==","signatures":[{"sig":"MEYCIQCbA7X5839oqjj9SEcyCJ4dNIHdnpZ+6QSwnmyHDPmCsgIhANCB9dS0Zr/oflVFDnsHT3aji20beTC39fUy0iK8mL/y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":251600},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"dac3ca1f94bb44cdf0808cf8632a22bf7edcbecb","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.1_1788549193104_0.13903303725688776","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@sandprivacy/sandgate","version":"0.6.2","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.2","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"b974d3e896e380989268ba328197659588c6a290","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.2.tgz","fileCount":38,"integrity":"sha512-MgIv6UCH4cV748e3S0YT1HG+0XRzIC1DkoqswcfGxwGeicwwmT7jV7RDV6Wzep/4QaToIWHqYcIVA6LNLg6F3w==","signatures":[{"sig":"MEYCIQClDkHFjIY3PUt5oHON/SDWQ1BkBioSczD3LJ3GqEIVVwIhAI80z5oq1CSeJF4PO5WCnuVpi3HPhMANcbMNyc5djTmk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258797},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"f7b572d2a36f31c6a4e936b21eefe45e4533722b","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.2_1788550890116_0.7193451113845384","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@sandprivacy/sandgate","version":"0.6.3","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.3","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"19342c15f91aee2b95b4186005254a83f7f206e4","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.3.tgz","fileCount":38,"integrity":"sha512-DI5v9hD9wi3mt4pr19Vta1GPr+TjSGm01DCExbNWx3Uo2CUM3x510/14JbTB/rF5NjqdAWtfQCWF7jDNziOGxg==","signatures":[{"sig":"MEQCIA5QqCSV16L7Lb1zACOO3uLOthgUd3B5yc8SaOYLUZxFAiBGYKZs7C444WEyydo/GNBQsIQFFH8JQrGrb38cr1R1KQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":262026},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"ebf6bea79709fde4e7b4898913c33ccbd892ec8d","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.3_1788552483664_0.9076921214292761","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"@sandprivacy/sandgate","version":"0.6.5","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.5","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"41e290892de01ef544edd272d3f25f10abb50c2f","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.5.tgz","fileCount":40,"integrity":"sha512-rf2JGrljrmbqgVqUi+G4+FQ8qpReoqZC7vLIdmlp1vrUUSidg1jPdtCqdudGh/qEuHVM6Gxvg9fue6NI9XPBMQ==","signatures":[{"sig":"MEUCIQD8rS9He4HvcxdP1Ykn63QO+a+LoEWkERwFysQhNbibowIgQ3YgmjgXvZyRvlstF1RwI6oTUTvFi1yAIYxfx4q44sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":275315},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"82ca1510569e1732cf8b3f0271e8ba96761bb81b","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.5_1788554505402_0.40506908468007485","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"@sandprivacy/sandgate","version":"0.6.6","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.6","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"b64fa5d42e9f975170ea342c1df264dc1d1dfef1","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.6.tgz","fileCount":40,"integrity":"sha512-IZa9n3fDMRc8ofyATo0goV7XZcZaCFM13zL6uSPkEJeo8tEpug2XkR763hOmVZkfLDl38QzT6XKdQXnPCm5Ezw==","signatures":[{"sig":"MEUCIQCX4z87EWxuvaLAxj4mbglROSrgUA7AyloO+EgyUEZ5cAIga48o3t7Khnw3Pwox5v3J/dBev4gJhJiVDM75nYV5WFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":275363},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"6e853f35384a205ed4d0cf6ac27da74a104584d3","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.6_1788554840615_0.8125965986562511","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"@sandprivacy/sandgate","version":"0.6.7","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.6.7","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"5d2597063d0cc83f059fcf8af1560266657d49c5","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.6.7.tgz","fileCount":40,"integrity":"sha512-oqXpBtG+YWavYiw3NVepjzCA5wnAeQWBJsPmm48/0upJyHjUoS4AYSo+GSmlggqaAXbwVAvk7hxNCnvq3naVuA==","signatures":[{"sig":"MEUCIQC6XyoXyzf7T4TGYGxvfEihItQ8+qrzQ50NSMB66xEn8QIgJm6zWHRJYhmO0kc5d5kpDfNtCFiHCAfM1eeQ85kxgmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279183},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"0f7c76a10cce0d1625d0297976e1abebe6943b57","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.6.7_1788557033863_0.6135882060702995","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@sandprivacy/sandgate","version":"0.7.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.7.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"cb392c11b47985fbb1b0281019697983c4e38dfa","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.7.0.tgz","fileCount":47,"integrity":"sha512-3pMAeHGYZice2X0w9TazdUqhmNTYtCK44CNawbLzWC3wYp3cdyA6ePypTPM/Qt3wj/fdG4ftUGfGAjuKerPiHQ==","signatures":[{"sig":"MEYCIQDqo+2P6R1KA3pG1Y/1BZmnjlG61OFijPsD+IYVrO1UZQIhAOnCig74eWo1ADsXLxYq+97iGHK2oIvSe5BnDqYYYPfM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363417},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"f987b95501bc8a18c93eff23b431bffa60c98379","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.7.0_1788561709468_0.40329511677238616","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@sandprivacy/sandgate","version":"0.7.1","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.7.1","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"9f6fbd7faec6c212e32c374e473e5517ddbc96e1","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.7.1.tgz","fileCount":47,"integrity":"sha512-8gDQdtgfNjHgkK7oV5fdW6nKIHeDsIW3k/Pg6pTEcvjOP3q8OKlMFz7uzoMxE4N7j0UVneuYTUFXS5mpEIb38w==","signatures":[{"sig":"MEUCIQCwt2dj07MLLP7lOQ1P1I5dp2FWKcY5Ox8SE3KMCtRMEgIgJ+92/7RTW4P/Rhiqr2UwDo41JNKuTnEbf8ZDMnQ1kU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":364204},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"d4160e32436b4a683a98c43948c93f39957e4f74","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.7.1_1788561905534_0.04327071890556633","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@sandprivacy/sandgate","version":"0.7.2","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.7.2","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"9e14cc262716aa008edb264bb38a90a3808645c0","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.7.2.tgz","fileCount":47,"integrity":"sha512-ShoocvGKy07C1z/f4CBPuQ93/nrpi7ZPYYR/OuxiViMmxaBvSpnise/VuTLFkfe7eXtWyuTXCS3Qb/o1whBLKw==","signatures":[{"sig":"MEUCIHKonFNbnKLQLaaESag9GXFgO8jz2TDsuo/NY0fljBAiAiEAl5edPn7fkGfgTFeObmgMBzaGCQEzqaRs2NneVA3T88A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365912},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"17ddb8bf3c0164475af89e587d829283e534b207","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.7.2_1788563582180_0.8181278464271786","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@sandprivacy/sandgate","version":"0.7.3","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.7.3","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"5f9b45da88566c39071a62bc8db7a739d5b215fe","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.7.3.tgz","fileCount":47,"integrity":"sha512-sXzgTYwSdOBDNHohvd5t3WoXQpW6lbEXgOackFX6A1+qn5fkuMWv5NjuTN+Er1ZmiRaIzogHUGy9mR1Ou/96kA==","signatures":[{"sig":"MEUCIHvTPkuTiwP2aNznAsGcogQWAWlaz6ASAedtD7mYEMc3AiEA459zE26tXPfn1gh3ZZ9VYMONPVcdhQ1uiWSF/Uy/aEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369352},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"42e6974ed0a0824d4f06feac502d25c49a9ebea7","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.7.3_1788565195120_0.7672148836050019","host":"s3://npm-registry-packages-npm-production"}},"0.7.4":{"name":"@sandprivacy/sandgate","version":"0.7.4","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.7.4","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"03d134987de995c09502f5c8a40d59da4ce4c366","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.7.4.tgz","fileCount":47,"integrity":"sha512-U034WCOhW9kNj1k4AVAxH5QNrMdiaqEKVGHwBsSsNvQciGcnuKU9EKQGBjJ7yhhE87DbSNr/Va6HASlnYTlRwA==","signatures":[{"sig":"MEQCIB5Wnzd4+Ga0GbSIkTVDd1KBPT5Za8vI4uM4SfVyWz7RAiBCtTijmPL8kdau4WMjLoqTV/uQMeC65lNDei8Piy7c5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375092},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"8c889b23be9a1a84f080a0d7d0b8f33f3349ad35","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.7.4_1788566438515_0.5260552422216442","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@sandprivacy/sandgate","version":"0.8.0","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"license":"AGPL-3.0-only","_id":"@sandprivacy/sandgate@0.8.0","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"homepage":"https://sandgate.dev","bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"bin":{"sandgate":"dist/index.js"},"dist":{"shasum":"72062a90b4982a9544a076dfb2feafe0b1173f7d","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.8.0.tgz","fileCount":49,"integrity":"sha512-S8+UrH6JImD0IBXJ+yYj1mVzKaXQkP6iT33ucCbkeSb/FvcEKh1pbmWJL1BSK79ygr+2dXZjo8Bx3MEYTYriOw==","signatures":[{"sig":"MEQCIDcmSpvrr/1v3SNHtoohPZpUmGjvL0FB93rAlw5fiu4OAiBsrGaixQaUkktH8ylURTdq1yF5lD3WxB7LGuLVVajzVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":377797},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"b8c52ce8b0e1f73dbdf9a2bf3b3307a6e6d0808a","scripts":{"dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs","build":"tsc"},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"repository":{"url":"git+https://github.com/sandprivacy/sandgate.git","type":"git"},"_npmVersion":"10.9.8","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","jsqr":"^1.4.0","read":"^5.0.1","otpauth":"^9.5.1","imapflow":"^1.7.8","web-push":"^3.6.7","mailparser":"^3.9.20","qrcode-terminal":"^0.12.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","jsdom":"^29.1.1","typescript":"^7.0.2","@types/node":"^26.4.1","@types/jsdom":"^30.0.0","@types/web-push":"^3.6.4","@types/mailparser":"^3.4.6","@types/qrcode-terminal":"^0.12.2"},"_npmOperationalInternal":{"tmp":"tmp/sandgate_0.8.0_1788604580993_0.37866452789071015","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@sandprivacy/sandgate","version":"0.8.1","description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","license":"AGPL-3.0-only","type":"module","bin":{"sandgate":"dist/index.js"},"main":"dist/index.js","scripts":{"build":"tsc","dev":"tsx src/index.ts","test":"npm run build && node scripts/test.mjs"},"homepage":"https://sandgate.dev","repository":{"type":"git","url":"git+https://github.com/sandprivacy/sandgate.git"},"bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"engines":{"node":">=18"},"dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","imapflow":"^1.7.8","jsqr":"^1.4.0","mailparser":"^3.9.20","otpauth":"^9.5.1","qrcode-terminal":"^0.12.0","read":"^5.0.1","web-push":"^3.6.7","zod":"^4.5.4"},"devDependencies":{"@types/jsdom":"^30.0.0","@types/mailparser":"^3.4.6","@types/node":"^26.4.1","@types/qrcode-terminal":"^0.12.2","@types/web-push":"^3.6.4","jsdom":"^29.1.1","tsx":"^4.23.13","typescript":"^7.0.2"},"_id":"@sandprivacy/sandgate@0.8.1","gitHead":"c465da66f980958f3af9277f7e81054bba107f52","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-4xMkcSuzKs99+lTsm4BF5gjxR0pw4hCMSlj3+7OYR5wRQ0A6gWxG0tvZ2dlDqzn8oIkvjp4cZrM7DUBmxBCAaQ==","shasum":"c768cd4f344c26d6349753ecf37af212144ceb33","tarball":"https://registry.npmjs.org/@sandprivacy/sandgate/-/sandgate-0.8.1.tgz","fileCount":50,"unpackedSize":382611,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCnC9oRDT05/AIJg+sZB5GXGFt2pTs/FwcGXeAuNIcSLgIgF/nAfUVedtqg866eX5XNqwn5Z+W5zLjJq8r6wP6zW8Y="}]},"_npmUser":{"name":"sandmail","email":"dev@sandmail.dev"},"directories":{},"maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sandgate_0.8.1_1788622677292_0.7695800136360587"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-03T18:04:23.297Z","modified":"2026-09-05T15:37:57.638Z","0.1.0":"2026-09-03T18:04:23.615Z","0.1.1":"2026-09-03T19:54:41.964Z","0.1.2":"2026-09-03T20:11:06.992Z","0.1.3":"2026-09-03T20:32:49.802Z","0.1.5":"2026-09-03T20:57:02.800Z","0.1.6":"2026-09-03T21:10:17.738Z","0.1.7":"2026-09-03T21:34:06.013Z","0.1.8":"2026-09-03T22:00:27.764Z","0.2.0":"2026-09-03T23:13:25.114Z","0.2.1":"2026-09-03T23:35:54.804Z","0.2.2":"2026-09-04T11:00:41.312Z","0.3.0":"2026-09-04T12:59:51.154Z","0.3.1":"2026-09-04T13:12:34.000Z","0.3.2":"2026-09-04T13:34:09.834Z","0.4.0":"2026-09-04T17:19:19.431Z","0.5.0":"2026-09-04T18:04:11.911Z","0.5.1":"2026-09-04T18:19:19.729Z","0.6.0":"2026-09-04T18:31:55.941Z","0.6.1":"2026-09-04T19:13:13.238Z","0.6.2":"2026-09-04T19:41:30.261Z","0.6.3":"2026-09-04T20:08:03.802Z","0.6.5":"2026-09-04T20:41:45.576Z","0.6.6":"2026-09-04T20:47:20.753Z","0.6.7":"2026-09-04T21:23:54.018Z","0.7.0":"2026-09-04T22:41:49.584Z","0.7.1":"2026-09-04T22:45:05.689Z","0.7.2":"2026-09-04T23:13:02.367Z","0.7.3":"2026-09-04T23:39:55.233Z","0.7.4":"2026-09-05T00:00:38.644Z","0.8.0":"2026-09-05T10:36:21.117Z","0.8.1":"2026-09-05T15:37:57.449Z"},"bugs":{"url":"https://github.com/sandprivacy/sandgate/issues"},"license":"AGPL-3.0-only","homepage":"https://sandgate.dev","keywords":["mcp","ai-agents","human-in-the-loop","2fa","totp","approval","email-verification","browser-use","claude"],"repository":{"type":"git","url":"git+https://github.com/sandprivacy/sandgate.git"},"description":"The human gateway for AI agents — approvals, 2FA codes and email verification, self-hosted. Your agent asks; you decide; secrets never touch the LLM.","maintainers":[{"name":"sandmail","email":"dev@sandmail.dev"}],"readme":"# sandgate\n\n**The human gateway for AI agents.** Approvals, 2FA codes and email verification — one self-hosted MCP server. Your agent asks; your phone buzzes; you decide. Secrets never touch the LLM.\n\n<!-- TODO(launch): hero GIF — agent hits a 2FA screen → phone buzzes → tap Approve → agent finishes the task -->\n\n```\nAgent: \"I need the 2FA code for github.com\"\n   │\n   ▼\nsandgate ──► your phone: [✅ Approve] [❌ Deny]\n   │\n   ▼  (approved)\nAgent gets: 483 921        ← a 30-second code\nAgent never gets: the seed ← stays AES-256-GCM encrypted in your vault\n```\n\n## Why\n\nAgents stall on everything that needs a human: TOTP prompts, verification emails, magic links, \"are you sure?\" moments. Today the workarounds are ugly — TOTP seeds in plaintext `.env` files, agents with full access to your inbox, or a human babysitting the terminal. sandgate replaces all of that with one MCP server any agent can call:\n\n| | DIY (`.env` + custom tools) | sandgate |\n|---|---|---|\n| TOTP seed storage | plaintext | encrypted vault (AES-256-GCM, scrypt) |\n| What the LLM sees | the seed | a 30-second code, after policy check |\n| Sensitive actions | agent decides | your phone decides |\n| Verification emails | build it yourself | `create_identity` + `wait_for_verification` |\n| Audit trail | none | every request, decision and outcome |\n\n## Quickstart\n\n```bash\nnpm install -g @sandprivacy/sandgate\nsandgate init                          # vault passphrase (Telegram and inbox are optional)\nsandgate pair                          # scan the QR with the sandgate app on your phone\nsandgate add-totp github.com JBSWY3DPEHPK3PXP\nsandgate test-approval                 # your phone buzzes; approve from the lock screen\n```\n\nNo server to set up: `pair` uses the hosted relay by default, which\nforwards sealed blobs it cannot read — [what it sees and what it\ncannot](https://sandgate.dev/relay). Prefer your own? `sandgate relay`\nruns one, and `SANDGATE_RELAY=<url>` makes it the default.\n\nRegister it with your agent (Claude Code shown; any MCP client works):\n\n```bash\nclaude mcp add sandgate -e SANDGATE_PASSPHRASE=your-passphrase -- sandgate serve\n```\n\nThat's it. Your agent now has four new tools.\n\n## The five tools\n\n- **`request_approval`** — \"May I pay €300 on this site?\" → push to your phone → approve/deny. No answer = denied.\n- **`ask_human`** — \"What's the code you received by SMS?\" → your phone shows an input field → your typed answer returns over the same encrypted channel. Covers SMS codes on your *real* number (no VoIP numbers that sites reject), security questions, choices.\n- **`get_totp`** — the current 6-digit code for a domain. Per-domain policy: `auto` (trusted sites), `approve` (buzz first — the default), or `deny`. The seed itself is never exposed.\n- **`create_identity`** — a disposable email inbox so the agent can sign up for services without your real address.\n- **`wait_for_verification`** — long-polls that inbox and returns the extracted verification code and links the moment they arrive.\n\n## Recipes\n\n**CAPTCHAs.** sandgate will never auto-solve a CAPTCHA — that's the point of a CAPTCHA. The pattern that works today, by composition: tell your agent that on hitting one it should call `request_approval(\"CAPTCHA on <site> — solve it at the computer, then approve to continue\")`. Your phone buzzes, you solve it where the browser is, you tap approve, the agent resumes. Same behavior as OpenAI's Operator, plus the notification.\n\n## Face ID / Touch ID on sensitive approvals (optional)\n\nA tap proves someone holds your unlocked phone. A biometric assertion\nproves it was *you*, on the *enrolled* device — and the gateway verifies\nit cryptographically instead of trusting the page:\n\n```bash\nsandgate enroll-biometric    # your phone asks; Face ID confirms\nsandgate biometric on        # now every approval must be signed\n```\n\nEach approval carries a WebAuthn assertion over a challenge derived from\nthe request id, signed inside your phone's secure enclave. sandgate\nstores only the public key and checks the signature, the relying party,\nthe challenge and the user-verification flag. Anything off — a replayed\nassertion, another device, a missing biometric — is a denial, never an\napproval. Off by default; `sandgate status` tells you where you stand.\n\nTurning it back off (`sandgate biometric off`) asks for the vault\npassphrase: the switch lives inside the encrypted vault, so editing a\nconfig file — or running the command without the passphrase — cannot\nweaken your setup.\n\n## Your authenticator too, not just your agents'\n\nThe seeds are already in the vault, so stop opening an authenticator app\nto read six digits:\n\n```bash\nsandgate totp                    # what's in the vault\nsandgate totp github.com --copy  # code in your clipboard, seconds left on screen\n```\n\nAfter `sandgate protect`, this doesn't even ask for the passphrase — the\nsame OS-store lookup the MCP server uses. Read-only convenience;\nanything that changes state still asks.\n\n## From any script: `sandgate ask`\n\n```bash\nsandgate ask \"Rotate the production DB password?\" --body \"Runs pg_rotate.sh\" && ./pg_rotate.sh\nCODE=$(sandgate ask \"SMS code from the bank?\" --input)     # the typed answer, on stdout\n```\n\nExit 0 approved, 1 refused, 2 no answer. The same phone, the same\nend-to-end channel, from cron, CI, or a shell one-liner.\n\n## Teams: several devices, or a Slack channel\n\n```bash\nsandgate add-device          # a second phone on the same pairing\nsandgate quorum 2            # two distinct devices must approve; one Deny refuses\nsandgate connect-slack xoxb-… xapp-… \"#approvals\" --approvers U0123,U0456\nsandgate channel slack       # send requests there instead of the phone\n```\n\nSlack requests are messages with Approve / Deny buttons (typed answers\nthrough a modal), settled in place so the channel keeps the record.\nSocket Mode, so no public URL. Slack does see the request text — that is\nwhat a shared channel is for, and why a personal secret still goes to\nthe phone.\n\n## Beyond agents: SSH logins that wait for your thumb\n\n```bash\nsandgate ssh-guard pair vps-prod         # on your workstation: prints one line\nsudo sandgate ssh-guard setup eyJ...     # on the server: that line, and you are done\nsandgate ssh-guard enforce --yes         # once verified, start blocking\n```\n\nNo Node on the server? Each release ships standalone Linux binaries\n(x64, arm64): one file under `/usr/local/bin`, same commands.\n\nAn SSH login pauses until you approve it on your phone. Duo does this\nfrom their cloud, for a fee; ntfy plus a PAM script only *notifies* you\nafter the fact. This blocks, end-to-end encrypted, on your own\ninfrastructure — and the server holds nothing but its own pairing.\n\nRead [docs/ssh-guard.md](docs/ssh-guard.md) before enabling it: the\ndanger is locking yourself out, not cryptography.\n\n## Policies\n\n```bash\nsandgate policy github.com auto      # trusted: no buzz, code released instantly\nsandgate policy mybank.com deny      # never\n# everything else defaults to \"approve\" — your phone decides\n```\n\n## What's in `~/.sandgate/`\n\n- `vault.enc` — TOTP seeds, bot token, API keys. AES-256-GCM, key derived from your passphrase with scrypt. Nothing sensitive is ever written in clear.\n- `config.json` — policies and preferences, plaintext, hand-editable.\n- `audit.jsonl` — append-only log of every request: which tool, which domain, what was decided, when. Codes and secrets are never logged.\n\n## Design principles\n\n1. **Zero disclosure.** The LLM sees derived, short-lived values (a 6-digit code, an approval verdict) — never seeds, tokens or passwords.\n2. **Deny by default.** Unknown domains refuse. Unanswered approvals refuse. Policy gaps refuse.\n3. **Self-hosted.** Runs on your machine; the vault and the audit trail never leave it. The email backend is pluggable: [sandmail](https://sandmail.dev) works out of the box (managed disposable inboxes), or bring your own mailbox with `sandgate connect-imap` — identities become plus-addressed aliases (`you+sg1a2b@domain`) and codes/links are extracted locally.\n4. **Everything audited.** If an agent asked for it, it's in the log.\n\n## The PWA approval channel (E2EE)\n\nThe phone app is the channel; Telegram remains as a fallback. Pairing takes one command:\n\n```bash\nsandgate pair                     # hosted relay (relay.sandgate.dev)\nsandgate pair https://your-relay  # or your own: `sandgate relay` serves the app and forwards blobs\n```\n\nHow the trust works: the link carries a **one-time claim**, not the secret. The gateway seals the channel secret under the claim and parks it on the relay, which hands it out once and forgets it after ten minutes — the link is dead after use, and the secret itself only ever lives in the URL **fragment** on the phone, never on a server. Both ends derive an AES-256-GCM key (HKDF); every approval request and every tap is sealed with the request id bound into the AAD. The relay stores and forwards blobs it cannot read, and cannot forge — a malicious relay can at worst drop or delay an answer, which is just a deny. A real phone needs the relay behind TLS (service workers require it); `http://localhost:8787` works for a desktop-browser test.\n\nOn the phone: scan the QR from inside the app (\"+ add a vault\" → *Scan a QR code*) or paste the link. Notifications show what is actually being asked — the sealed request rides inside the push, which is end-to-end encrypted, and the app decrypts it on the device — with Approve / Deny right on the lock screen for plain approvals (a switch in the app turns the details off). Several vaults (your laptop, your servers) live side by side under their own names.\n\nHousekeeping: `sandgate pairings` lists what is paired and whether the relay has seen it; `sandgate unpair` revokes the phone channel; `sandgate pair` again rotates it.\n\nFull threat model, including what it does *not* protect against and its\nknown weaknesses: [SECURITY.md](SECURITY.md).\n\n## Security notes, honestly\n\n- MCP clients launch servers non-interactively, so the vault passphrase must come from the environment. `SANDGATE_PASSPHRASE` (the value, cleartext in your config) protects the vault *at rest* — a stolen `vault.enc` alone is useless. For more, `SANDGATE_PASSPHRASE_CMD` runs a command whose stdout is the passphrase, so it can live in your OS secret store: Windows DPAPI (`ConvertFrom-SecureString` once, decrypt in the command), macOS `security find-generic-password`, Linux `secret-tool lookup`, or any password manager CLI. Either way, a fully compromised machine defeats any local secret store — that threat class is out of scope for all of them.\n- Approval taps are only accepted from your own Telegram chat; anything else — including silence — is a deny. Agent-supplied text in approval messages is escaped and truncated.\n- Email content handled by `wait_for_verification` is untrusted third-party input. The tool description tells agents so; only the extracted code and hint-filtered links are returned, never the raw body.\n- Several agents can wait on you at once: approvals are served by a single dispatcher, first tap wins per request — or the first quorum, if you set one.\n- The pairing link is a credential while it lives: ten minutes, one use. After that it is a 404. Someone who finds it inside the window and beats you to it holds the channel — your own claim then fails visibly, which is the cue to run `sandgate pair` again.\n\n## Roadmap\n\n- [x] Generic IMAP backend for verification emails (`sandgate connect-imap`)\n- [x] `sandgate audit` — pretty-print the audit trail\n- [x] Mobile PWA with end-to-end-encrypted push (`sandgate relay` + `sandgate pair`), multi-vault, on-device history\n- [x] `ask_human` — free-text answers (SMS codes on your real number, security questions)\n- [x] OS keychain for the vault passphrase (`SANDGATE_PASSPHRASE_CMD`, `sandgate protect`)\n- [x] Face ID / Touch ID on approvals, verified server-side (`sandgate enroll-biometric`)\n- [x] Blocking SSH approval (`sandgate ssh-guard`)\n- [x] Slack approval channel with multiple approvers (`sandgate connect-slack`, `sandgate quorum`)\n- [x] `sandgate ask` — the human step from any script\n- [x] One-time pairing links, revocation (`sandgate unpair`), QR scanning in the app, lock-screen approvals\n- [x] Standalone Linux binaries for servers; SELinux policy for RHEL-family systems\n- [ ] Native iOS / Android app (lock-screen approvals; the PWA stays the\n      no-install and self-hosted path) — the wire protocol is documented in\n      [docs/protocol.md](docs/protocol.md) with test vectors\n- [ ] Passkey signing on the phone: agents cannot use a passkey, but your\n      phone can sign the challenge for them, once, with your face\n- [ ] Team policies (shared vault, centralized audit)\n- [x] Framework guides: [Claude Code](docs/integrations/claude-code.md), [browser-use](docs/integrations/browser-use.md), [Playwright MCP](docs/integrations/playwright-mcp.md), [LangGraph](docs/integrations/langgraph.md)\n\n## License\n\nAGPL-3.0. Part of the [sandprivacy](https://github.com/sandprivacy) suite — your data and your agents, under your control.\n","readmeFilename":"README.md"}