{"_id":"@emilia-protocol/openai-guard","_rev":"7-bc3b84e4370f3363a419be737a97aba3","name":"@emilia-protocol/openai-guard","dist-tags":{"latest":"0.5.1"},"versions":{"0.1.0":{"name":"@emilia-protocol/openai-guard","version":"0.1.0","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.1.0","maintainers":[{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"8b97d095cad659e0f2444d5e8f517eca96f15d94","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.1.0.tgz","fileCount":4,"integrity":"sha512-TkYkbM5rVOETTOUpUr8X9sVQs9IYQseh0BZUCct5De1BGDcbojjnFlRFO8SeWaaAMn3duZeGEeBP2Kdiv0/iug==","signatures":[{"sig":"MEUCIGcq2+NBxHi0IzXWej+jE66R8DtjqpTbntWCH0hUSsa5AiEA2g40KFhf08QeWiMQ9Hdd37qv4N1ZcCJu0988L1iRv3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19620},"main":"index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./index.js"}},"gitHead":"ece04c3f62d7a9378b3b2a5af41254926665b270","_npmUser":{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"},"repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.11.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"25.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.1.0_1780899161322_0.3101256647567687","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@emilia-protocol/openai-guard","version":"0.2.0","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.2.0","maintainers":[{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"55d00c3539d27c85c304cdfddaec7c0e55206647","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.2.0.tgz","fileCount":5,"integrity":"sha512-O2SIHe6q8NAW59syA7CyU0R2FJhyMWpDLaWZOIImkNxPpYbco7IPN0t9VXV9A9IjH05tDAMlqApGQqNkWC7hHw==","signatures":[{"sig":"MEYCIQCPxk060+W7ohTCMwUkdn5DOBLH1tkPYUb8fvzsAJtb4QIhAIw6U2tLotGLElU0zyFQOiwHjN7y+Du2RBI9KO24gPZ+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25707},"main":"index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./index.js"},"./receipt":{"import":"./receipt.js"}},"gitHead":"c879efc9e811f11c875318b72d1493ce71ff4950","_npmUser":{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"},"repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.11.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"25.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.2.0_1780900106199_0.3204300165437379","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@emilia-protocol/openai-guard","version":"0.3.0","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.3.0","maintainers":[{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"b68047bea777e0e6d30f1b2bf850e3ad6c405b7d","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.3.0.tgz","fileCount":5,"integrity":"sha512-9n3quR6IYlYbmHXXF4Ikwck6PshluxmXGfZLCgbDEFL3+B5agpNkhrE67+QGKHgDwp+RyEvAGdMpqvd3+QBmMg==","signatures":[{"sig":"MEYCIQCE8m736qCQ0CTAO5E4+CO3KxqD21Bowa1psnJ3hLJCmQIhANwo84qxxT6YnYT+IdOnuwAUBFBVpM2D4aSl4WIZG/gY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27340},"main":"index.js","type":"module","engines":{"node":">=18"},"exports":{".":{"import":"./index.js"},"./receipt":{"import":"./receipt.js"}},"gitHead":"f18435d53f64db434a5d1f0a0d4e9daa7244e10d","_npmUser":{"name":"emiliaprotocol","email":"iman.schrock@gmail.com"},"repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.11.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"25.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.3.0_1780902028728_0.7101815296228509","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@emilia-protocol/openai-guard","version":"0.4.0","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.4.0","maintainers":[{"name":"emiliaprotocol","email":"team@emiliaprotocol.ai"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"245ecae4764a2cb78932c488f2f84a00f1e1b518","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.4.0.tgz","fileCount":5,"integrity":"sha512-doGu9tbCFWnF/Xg+Gg+G3dEJhMF+JFMsRymiEf3QvQKe31VV9hnc0PUHJtcNahT/y90KHVmq6y2i+dg3V5FChA==","signatures":[{"sig":"MEQCIGEFUtY3mx0Lqn8kyrtn+SaTza50+6xWqxqmd6+PDv4rAiBJA1EUT/6a4x4otacaZUeFwqi6fUw0X+8g1OHY60baFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emilia-protocol%2fopenai-guard@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":35774},"main":"index.js","type":"module","_from":"file:release-artifacts/openai-guard/emilia-protocol-openai-guard-0.4.0.tgz","engines":{"node":">=18"},"exports":{".":{"import":"./index.js"},"./receipt":{"import":"./receipt.js"}},"scripts":{"test":"node --test"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d0453ff-a06a-4ec9-9aff-da80fea0b5c4"}},"_resolved":"/home/runner/work/emilia-protocol/emilia-protocol/release-artifacts/openai-guard/emilia-protocol-openai-guard-0.4.0.tgz","_integrity":"sha512-doGu9tbCFWnF/Xg+Gg+G3dEJhMF+JFMsRymiEf3QvQKe31VV9hnc0PUHJtcNahT/y90KHVmq6y2i+dg3V5FChA==","repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.18.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@emilia-protocol/require-receipt":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@emilia-protocol/verify":"^3.10.0"},"peerDependenciesMeta":{"@emilia-protocol/verify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.4.0_1784276130146_0.24472722114521783","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@emilia-protocol/openai-guard","version":"0.4.1","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.4.1","maintainers":[{"name":"emiliaprotocol","email":"team@emiliaprotocol.ai"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"4553c61b0384efed2111c16e3e788a3e93ef8318","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.4.1.tgz","fileCount":16,"integrity":"sha512-nWZp6GoAztCNWuH/kmEe/aIXllrXsUHBeF2aV9VqyksCoCYiwMvSpYBy6LsR0dajTf4QJn2ngSYBhHRmy88mNw==","signatures":[{"sig":"MEQCIGTSW4A5U+nRdesovtOMvkiwVBQ0arSGeR5Hr5/cKht1AiAH0j45wbjcxtg0k4mCBffljcF7OD5FB/WEaZ/ED9Hi8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emilia-protocol%2fopenai-guard@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":84405},"main":"index.js","type":"module","_from":"file:release-artifacts/openai-guard/emilia-protocol-openai-guard-0.4.1.tgz","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.js"},"./receipt":{"types":"./dist/receipt.d.ts","import":"./receipt.js"}},"scripts":{"test":"node --test","build":"tsc -p tsconfig.json","pretest":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d0453ff-a06a-4ec9-9aff-da80fea0b5c4"}},"_resolved":"/home/runner/work/emilia-protocol/emilia-protocol/release-artifacts/openai-guard/emilia-protocol-openai-guard-0.4.1.tgz","_integrity":"sha512-nWZp6GoAztCNWuH/kmEe/aIXllrXsUHBeF2aV9VqyksCoCYiwMvSpYBy6LsR0dajTf4QJn2ngSYBhHRmy88mNw==","repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.18.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@emilia-protocol/require-receipt":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@emilia-protocol/verify":"^3.10.0"},"peerDependenciesMeta":{"@emilia-protocol/verify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.4.1_1784698553125_0.6620841438072897","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@emilia-protocol/openai-guard","version":"0.5.0","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"license":"Apache-2.0","_id":"@emilia-protocol/openai-guard@0.5.0","maintainers":[{"name":"emiliaprotocol","email":"team@emiliaprotocol.ai"}],"homepage":"https://www.emiliaprotocol.ai/agent-guard","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"d80606e42d0880cdbb0175745e6e5421d7f5c486","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.5.0.tgz","fileCount":17,"integrity":"sha512-TicEKmKiAKFZgOz9loSk/ECDfr+GdiLYIOWKbi3gDyRL6Ku5zIReUCXL5SE+08zDcvrHW2bww9mIBRkAUfrJNw==","signatures":[{"sig":"MEYCIQCBfUWtBURQuaCyxw6fXa9rnJzttMhYNdVMczptUZkXFwIhAK4Bg5pb+nKuWe+3Nr/BrK4XT8F64dowRg6noYYhaMLo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCkUnDqQTQFVxg0iRruUHK+cLPIUCJf5WLFWrBBWtX10gIhANktyC5quGEaCf+vQvhghjihQ/slTaScf5XS+uaIL6h5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emilia-protocol%2fopenai-guard@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90556},"main":"index.js","type":"module","_from":"file:publisher-input/emilia-protocol-openai-guard-0.5.0.tgz","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.js"},"./receipt":{"types":"./dist/receipt.d.ts","import":"./receipt.js"}},"scripts":{"test":"node --test","build":"tsc -p tsconfig.json","pretest":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d0453ff-a06a-4ec9-9aff-da80fea0b5c4"}},"_resolved":"/home/runner/work/emilia-protocol/emilia-protocol/publisher-input/emilia-protocol-openai-guard-0.5.0.tgz","_integrity":"sha512-TicEKmKiAKFZgOz9loSk/ECDfr+GdiLYIOWKbi3gDyRL6Ku5zIReUCXL5SE+08zDcvrHW2bww9mIBRkAUfrJNw==","repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.19.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@emilia-protocol/require-receipt":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@emilia-protocol/verify":"^3.21.0"},"peerDependenciesMeta":{"@emilia-protocol/verify":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/openai-guard_0.5.0_1789286348280_0.17847909032047737","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"_id":"@emilia-protocol/openai-guard@0.5.1","bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"dist":{"shasum":"bd9d392ae1f9c8ecd38c95f1bb3ffc931a2865cb","tarball":"https://registry.npmjs.org/@emilia-protocol/openai-guard/-/openai-guard-0.5.1.tgz","fileCount":17,"integrity":"sha512-U3l6h/nAOhe5qdDJ9doB6d5s1u0lVs48B3X3oY+kDHI9KCQbyoUL/gLU2ehGQlO5AB5MVQ3jCFFcq0M/rDooSw==","signatures":[{"sig":"MEQCIAX7PZJS03OwApixtgR7KTJJ2Ulzh+XJqhitJEW51bXsAiATlZ1ur0BFDGx7OAA5wQNjaW7E0d96BjzLpweJ9iYvrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICPlj2Zsq2dHUrfvXftf/S+twnJxrtolZjAO2W7kodctAiAgQ2gfe4EN5Tkw4oTYwIHVnYU/7VdZBYTIIVNjid83MQ=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emilia-protocol%2fopenai-guard@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90880},"main":"index.js","name":"@emilia-protocol/openai-guard","type":"module","_from":"file:publisher-input/emilia-protocol-openai-guard-0.5.1.tgz","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.js"},"./receipt":{"types":"./dist/receipt.d.ts","import":"./receipt.js"}},"license":"Apache-2.0","scripts":{"test":"node --test","build":"tsc -p tsconfig.json","pretest":"npm run build"},"version":"0.5.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d0453ff-a06a-4ec9-9aff-da80fea0b5c4"}},"homepage":"https://www.emiliaprotocol.ai/agent-guard","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"_resolved":"/home/runner/work/emilia-protocol/emilia-protocol/publisher-input/emilia-protocol-openai-guard-0.5.1.tgz","_integrity":"sha512-U3l6h/nAOhe5qdDJ9doB6d5s1u0lVs48B3X3oY+kDHI9KCQbyoUL/gLU2ehGQlO5AB5MVQ3jCFFcq0M/rDooSw==","repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"_npmVersion":"11.19.0","description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","directories":{},"maintainers":[{"name":"emiliaprotocol","email":"team@emiliaprotocol.ai"}],"_nodeVersion":"24.20.0","dependencies":{"@emilia-protocol/require-receipt":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@emilia-protocol/verify":"^3.21.0 || ^4.0.0"},"peerDependenciesMeta":{"@emilia-protocol/verify":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openai-guard_0.5.1_1789316154558_0.9343355763503423"}}},"time":{"created":"2026-06-08T06:12:41.200Z","modified":"2026-09-13T16:15:55.002Z","0.1.0":"2026-06-08T06:12:41.455Z","0.2.0":"2026-06-08T06:28:26.327Z","0.3.0":"2026-06-08T07:00:28.848Z","0.4.0":"2026-07-17T08:15:30.297Z","0.4.1":"2026-07-22T05:35:53.260Z","0.5.0":"2026-09-13T07:59:08.356Z","0.5.1":"2026-09-13T16:15:54.665Z"},"bugs":{"url":"https://github.com/emiliaprotocol/emilia-protocol/issues"},"license":"Apache-2.0","homepage":"https://www.emiliaprotocol.ai/agent-guard","keywords":["openai","grok","xai","tool-calling","function-calling","ai-agent","authorization","human-in-the-loop","guardrails","emilia-protocol","agent-safety"],"repository":{"url":"git+https://github.com/emiliaprotocol/emilia-protocol.git","type":"git","directory":"packages/openai-guard"},"description":"Guard OpenAI-compatible tool calls (OpenAI, xAI Grok, Together, …) with EMILIA Protocol — block irreversible agent actions until a named human signs off.","maintainers":[{"name":"emiliaprotocol","email":"team@emiliaprotocol.ai"}],"readme":"# @emilia-protocol/openai-guard\n\n**Guard OpenAI-compatible tool calls with EMILIA Protocol.** Works with any\nOpenAI-style tool-calling API — OpenAI, **xAI Grok**, Together, Fireworks, Groq.\nThe production path verifies a pinned, exact-action authorization receipt\noffline and consumes it before the tool runs. Missing, forged, wrong-action, or\nreplayed evidence is refused.\n\n```bash\nnpm install @emilia-protocol/openai-guard\n```\n\n## Production: offline receipt gate\n\n```js\nimport { requireReceiptForOpenAITool } from '@emilia-protocol/openai-guard';\n\nconst releasePayment = requireReceiptForOpenAITool(bank.wire, {\n  toolName: 'wire',\n  action: 'payment.release',\n  trustedKeys: [ISSUER_SPKI_B64URL],\n  assuranceClass: 'class_a',\n  approverKeys: ENROLLED_APPROVER_KEYS,\n  rpId: 'approvals.example.com',\n  allowedOrigins: ['https://approvals.example.com'],\n  store: durableAtomicReceiptStore,\n});\n\nawait releasePayment({\n  destination: 'acct_9f12',\n  amount: 82000,\n  __ep: { receipt },\n});\n```\n\nThe action is ALWAYS argument-bound. Whatever base action you give, the wrapper\nappends a digest of the tool name and the exact arguments that will execute:\n\n```\npayment.release:sha256:<digest of {tool, args}>\n```\n\nMint the receipt against that bound action (`bindToolAction` from\n`@emilia-protocol/require-receipt` computes it). A receipt for the bare string\n`payment.release` authorizes nothing, and a receipt bound to one set of\narguments cannot be spent on another. `actionFor(args, call)` only refines the\nbase action type; it cannot replace or disable the digest.\n\nPass `toolName` explicitly when the wrapped function is anonymous or the bundle\nis minified, so the binding does not move with a local identifier. The default\nreplay store is process-local; production fleets must provide a shared,\nownership-fenced `{ reserve, commit, release }` store.\n\n## Try it offline (~5s)\n\n```bash\nnode packages/openai-guard/example.mjs\n# 1) no receipt -> refused   2) bound receipt -> released\n# 3) same action, other args -> refused   4) replay -> refused\n```\n\n## Legacy hosted policy client\n\n```js\nimport { guard } from '@emilia-protocol/openai-guard';\n\nconst result = await guard({\n  action: 'payment.release',\n  actor: 'ep:entity:agent-7',\n  context: { value_usd: 82000, resource_ref: 'acct_9f12' },\n}, { apiKey: process.env.EP_API_KEY });\n```\n\nThis path accepts only a successful `allow` carrying a durable `commit_ref`.\nNetwork errors, non-2xx responses, unknown verdicts, and malformed bodies deny.\nIt is still the operator's online decision, not portable authorization evidence;\nuse the receipt gate above for irreversible work.\n\n## Guard a whole tool-calling loop (Grok / OpenAI)\n\n```js\nimport OpenAI from 'openai';\nimport { runToolCalls } from '@emilia-protocol/openai-guard';\n\nconst client = new OpenAI({ apiKey: process.env.XAI_API_KEY, baseURL: 'https://api.x.ai/v1' }); // Grok\nconst res = await client.chat.completions.create({ model: 'grok-4', messages, tools });\nconst msg = res.choices[0].message;\n\nconst toolResults = await runToolCalls(msg.tool_calls, {\n  lookup_invoice: { fn: lookupInvoice, readOnly: true },       // explicitly read-only\n  release_payment: {                                          // irreversible → gated\n    actionFor: (a) => `payment.release:${a.destination}:${a.amount}`,\n    fn: releasePaymentImpl,\n  },\n}, {\n  receipts: { [toolCallId]: receipt },\n  trustedKeys: [ISSUER_SPKI_B64URL],\n  assuranceClass: 'class_a',\n  approverKeys: ENROLLED_APPROVER_KEYS,\n  rpId: 'approvals.example.com',\n  allowedOrigins: ['https://approvals.example.com'],\n  store: durableAtomicReceiptStore,\n});\n\n// feed `toolResults` (role:\"tool\" messages) back to the model and continue the loop.\n```\n\nPoint it at OpenAI, Together, Fireworks, etc. by swapping the `baseURL` — the\nguard layer is identical.\n\n## Legacy hosted software-approval flow (`/receipt`)\n\nThis submodule maps 1:1 to the hosted API-key endpoints. The approval route\nauthenticates a different principal and enforces separation of duty; it does\n**not** by itself establish human presence, user verification, or a passkey\nceremony. Use the WebAuthn/mobile ceremony when a profile requires Class A.\n\n```js\nimport { mintReceipt, requestSignoff, approveSignoff, verifyReceipt } from '@emilia-protocol/openai-guard/receipt';\n\n// 1. Mint a pre-action receipt — the server runs EMILIA's verified policy engine.\nconst receipt = await mintReceipt({\n  apiKey: process.env.EP_API_KEY,\n  organization_id: 'org_123',\n  action_type: 'large_payment_release',   // a GUARD_ACTION_TYPES value\n  target_resource_id: 'invoice_4421',\n  amount: 84000,\n});\n\nif (receipt.signoff_required) {\n  // 2. Request signoff on that receipt.\n  const { signoff_id } = await requestSignoff({ apiKey: process.env.EP_API_KEY, receipt_id: receipt.receipt_id });\n\n  // 3. A DIFFERENT authenticated principal approves (software/API-key evidence).\n  await approveSignoff({ apiKey: process.env.APPROVER_EP_API_KEY, signoff_id });\n}\n\n// 4. Offline-verify a signed EP-RECEIPT-v1 (install @emilia-protocol/verify).\n// const v = await verifyReceipt(signedReceiptDoc, issuerPublicKey);\n```\n\nThe approval is an out-of-band authenticated-principal action. A dashboard or\nSlack UX does not upgrade it into cryptographic human-presence evidence.\nEndpoints: `/api/v1/trust-receipts`,\n`/api/v1/signoffs/request`, `/api/v1/signoffs/{id}/approve`.\n\n## Scope\n\nThis package enforces receipt verification, exact-action binding, and one-time\nconsumption at the tool boundary. It does not prove business correctness or what\na person perceived, and it does not replace the resource owner's authorization,\nfraud, safety, or legal controls. Apache-2.0.\n\nEnd-to-end runnable Grok demo: [`examples/grok-guard.mjs`](../../examples/grok-guard.mjs).\n","readmeFilename":"README.md"}