{"_id":"@axtary/approvals","_rev":"10-3d68cb2be3eda380c9877759af8d66a6","name":"@axtary/approvals","dist-tags":{"latest":"0.6.1"},"versions":{"0.0.1":{"name":"@axtary/approvals","version":"0.0.1","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"UNLICENSED","_id":"@axtary/approvals@0.0.1","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/axtary/axtary#readme","bugs":{"url":"https://github.com/axtary/axtary/issues"},"dist":{"shasum":"682919fe7f23cb95442260f7d97288f60ca877b0","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.0.1.tgz","fileCount":6,"integrity":"sha512-CuPq6bAPgM20hMqwyFIANxVdDYJ4E/ksAvbA+td6vpSsz3SRqKGlQCQmsVdDJ9fPBQWA447+z+bHlxvsq9LwVg==","signatures":[{"sig":"MEQCIC+4c5Kxw9IMH1MuVMvS11fkRIVAJjbmpiBqrlNZsp4aAiBHLoC+eYLO6YVfHwCrKv/tAvAmxYVqyQ03O2nsBXy1mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83987},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d4ba1d3959b2f7ad34d7f30da7632f3cd652ede3","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"axtary-user","email":"major.snack5x@icloud.com"},"repository":{"url":"git+https://github.com/axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"10.9.2","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.0.1_1780706483981_0.7714765652603903","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@axtary/approvals","version":"0.1.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.1.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/axtary/axtary#readme","bugs":{"url":"https://github.com/axtary/axtary/issues"},"dist":{"shasum":"bcd43c558c0bcf94677a69f79e6850446e7f3964","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.1.0.tgz","fileCount":7,"integrity":"sha512-8seu9xS2xoex8VXDBCA2lpRlAQjfi7eypj4JH+nfcLnhlgtLNU8Q4Gkg9ob9pMiQ8sX3Pyk7y+jU/syjJMMYFQ==","signatures":[{"sig":"MEQCIHlzq7kNVxLdx7Oh7C7dfM5pe8HWSluIa7ARSSW0SNX1AiBzLA0YhiBa1DHXxhchqctU+FFrnTLGpPZvzcMn4vNKEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97156},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fb000224f8a36b7d5558164705780172ea2f4b89","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"axtary-user","email":"major.snack5x@icloud.com"},"repository":{"url":"git+https://github.com/axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"10.9.2","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.1.0_1781151139975_0.6316249362855728","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@axtary/approvals","version":"0.2.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.2.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/axtary/axtary#readme","bugs":{"url":"https://github.com/axtary/axtary/issues"},"dist":{"shasum":"485004960aa0dadab4ec5a5afeec13b31050f540","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.2.0.tgz","fileCount":7,"integrity":"sha512-E6FeUaSJndzge+ZYUdcvoGyfYZBf0wVCExv7+Ay0ICtOmm150tmTveg3AyvEc+nTttzZyWasJQCuO6iE6ub0ow==","signatures":[{"sig":"MEUCIQCmunyi/na7GGFuJnujByxkuL4lf+cr6oUXuhs+nyUPzQIgIIEPdHZYN8Otl3iSSJj2Ig1SgXUCLFjMNUtRUqoT5EQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108466},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fe535422b37b24d80e2f4b6e511f327f656c56d5","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"axtary-user","email":"major.snack5x@icloud.com"},"repository":{"url":"git+https://github.com/axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"10.9.2","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.2.0_1783367145373_0.5765238010762685","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@axtary/approvals","version":"0.3.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.3.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/axtary/axtary#readme","bugs":{"url":"https://github.com/axtary/axtary/issues"},"dist":{"shasum":"20a86c7c98c1b6851a2dc2cb62a050bed9b37b1e","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.3.0.tgz","fileCount":7,"integrity":"sha512-BLav95ag4pkqQC9I8p9M1Z/kvEDNHi2UbzTJ6bpVSOg/2O0dOvuO6LL/vJ+9AJsLbrwP14qLvEMZba8EMYUv8w==","signatures":[{"sig":"MEUCIQCr434dCWwL4sfKxanOubtocYUct39lqnUmj2+go1LdeAIgVQeN+yq/yFm51Q18c11sD8OFpSD54GQjfgqtqa0utWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108712},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5530b13c9606ead4376d05a969f5bc938205468b","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"axtary-user","email":"major.snack5x@icloud.com"},"repository":{"url":"git+https://github.com/axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"10.9.2","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"22.13.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.3.0_1783550475615_0.7418894436121004","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@axtary/approvals","version":"0.4.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.4.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/Axtary/axtary#readme","bugs":{"url":"https://github.com/Axtary/axtary/issues"},"dist":{"shasum":"86871160ab46b7f408fbb43bba4ef6fa38e80510","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.4.0.tgz","fileCount":7,"integrity":"sha512-h3WlUqux186yIXb68dl5pkDbBH6aVZQYy+Sy2BUUbj/lvRRC4r/G24Z5boTdu7qSA9oHWPFuUVt+OR7RWW+oxg==","signatures":[{"sig":"MEUCIEcypC3CLxMObCEuvhsXamu+F5BRyqh7q8/mtI88Gbi5AiEAm8mBt3TLTiuQz8XWIxPUjWSP9aZ0y2PEPoZ/tXD9N3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108861},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"850624faf0c7f79f0cc1446bc3eded5a3e34e105","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:11563ec7-c497-4de8-8bed-1952bfcdc050"}},"repository":{"url":"git+https://github.com/Axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"11.18.0","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.4.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.4.0_1783985857335_0.8745749744296065","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@axtary/approvals","version":"0.5.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.5.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/Axtary/axtary#readme","bugs":{"url":"https://github.com/Axtary/axtary/issues"},"dist":{"shasum":"dad343ea5223d2f18d01ac49cb0e2c03995708ad","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.5.0.tgz","fileCount":7,"integrity":"sha512-P2olMyrKLI2Tjw+XypgaijPHBcTrzYh1z3Wt6mWh5QvSKG9hS31x/xjzlaejp+J0LOtWw8HTkg0EP3wzW/D/OA==","signatures":[{"sig":"MEQCIFPuNOuFHgdCsv1Jq50z4ilYLmXDVmdD8YqKAidrhkr9AiBvf/PlpBjvmphava8FLrh44FFJIwtcEKXNrqtTQGsgoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109508},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f0bce01c4543e5c0f1685ebbb5087a2ac653b9df","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:11563ec7-c497-4de8-8bed-1952bfcdc050"}},"repository":{"url":"git+https://github.com/Axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"11.18.0","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.5.0_1785026682437_0.4373692205585189","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@axtary/approvals","version":"0.6.0","keywords":["ai-agents","authorization","approvals","actionpass"],"license":"Apache-2.0","_id":"@axtary/approvals@0.6.0","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"homepage":"https://github.com/Axtary/axtary#readme","bugs":{"url":"https://github.com/Axtary/axtary/issues"},"dist":{"shasum":"092ad5feda660609bf73554a17c304d2ddde0b4c","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.6.0.tgz","fileCount":7,"integrity":"sha512-oeOFDLj20/RymdGb6xaOwFMUGxtvlXZM0D6H8FErne+scb/oCdWghFioWP1KoQxOgppQC/cYOQE5s2cCNfU/Rg==","signatures":[{"sig":"MEYCIQCVlT6FJddfUlKRTX2HQrgqMhZUIK+szu+fD26iD8NroQIhANY1S1j3iMW8kWVWbHgDCGwtoSDzPbovd0xc3K/Pf6kj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109508},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fbd46405637d3765f8d316009e640bdf0cb275dc","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build","prebuild":"npm run build -w @axtary/actionpass"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:11563ec7-c497-4de8-8bed-1952bfcdc050"}},"repository":{"url":"git+https://github.com/Axtary/axtary.git","type":"git","directory":"packages/approvals"},"_npmVersion":"11.18.0","description":"Hosted approval queue contract for exact Axtary step-up approvals.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","@axtary/actionpass":"^0.6.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/approvals_0.6.0_1785707355103_0.6457105242316938","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@axtary/approvals","version":"0.6.1","private":false,"description":"Hosted approval queue contract for exact Axtary step-up approvals.","type":"module","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/Axtary/axtary.git","directory":"packages/approvals"},"keywords":["ai-agents","authorization","approvals","actionpass"],"engines":{"node":"^20.19.0 || ^22.13.0 || >=24"},"scripts":{"prebuild":"npm run build -w @axtary/actionpass","build":"npm run clean && tsc -p tsconfig.json","clean":"rm -rf dist","prepack":"npm run build"},"main":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"types":"./dist/index.d.ts","dependencies":{"@axtary/actionpass":"^0.6.1","zod":"^4.4.3"},"gitHead":"d1621a5d0eb7ae06e674c24119fb096d8a0c1ad8","_id":"@axtary/approvals@0.6.1","bugs":{"url":"https://github.com/Axtary/axtary/issues"},"homepage":"https://github.com/Axtary/axtary#readme","_nodeVersion":"24.18.0","_npmVersion":"11.18.0","dist":{"integrity":"sha512-yxhyokxx/68DBYL0sR8jaJ7k8HggWT6iTBHDG0ychljLX/JvQLwh0r9UFYsnjttTLKFduCjsr77Ca1zt7JiMIg==","shasum":"88fbce3cd59f08d541c0279f9c612f9d4bcf6f0b","tarball":"https://registry.npmjs.org/@axtary/approvals/-/approvals-0.6.1.tgz","fileCount":7,"unpackedSize":109508,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEVFIlE/dfNpiUFnyZB7/NtOvFcN+1UQAWRmiU7o2WGtAiAUpyyLJ7a6pMG7dyEVMKjD6vPzX0d6SGWpPytHV5uRwg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:11563ec7-c497-4de8-8bed-1952bfcdc050"}},"directories":{},"maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/approvals_0.6.1_1785711552047_0.6472505656314111"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-06T00:41:23.813Z","modified":"2026-08-02T22:59:12.338Z","0.0.1":"2026-06-06T00:41:24.138Z","0.0.2":"2026-06-06T00:45:25.085Z","0.1.0":"2026-06-11T04:12:20.123Z","0.2.0":"2026-07-06T19:45:45.535Z","0.3.0":"2026-07-08T22:41:15.754Z","0.4.0":"2026-07-13T23:37:37.478Z","0.5.0":"2026-07-26T00:44:42.560Z","0.6.0":"2026-08-02T21:49:15.253Z","0.6.1":"2026-08-02T22:59:12.177Z"},"bugs":{"url":"https://github.com/Axtary/axtary/issues"},"license":"Apache-2.0","homepage":"https://github.com/Axtary/axtary#readme","keywords":["ai-agents","authorization","approvals","actionpass"],"repository":{"type":"git","url":"git+https://github.com/Axtary/axtary.git","directory":"packages/approvals"},"description":"Hosted approval queue contract for exact Axtary step-up approvals.","maintainers":[{"name":"axtary-user","email":"major.snack5x@icloud.com"}],"readme":"# @axtary/approvals\n\nHosted approval queue contract for exact Axtary step-up approvals.\n\nEarly `0.x` release: the runtime path is real and tested, but the API is not stable yet and may change between minor versions.\n\nThe source repository is currently private. Public product documentation and runnable guides are at [axtary.com/docs](https://www.axtary.com/docs).\n\n```bash\nnpm install @axtary/approvals\n```\n\n## What It Does\n\n- Creates pending approval queue items from normalized actions and `step_up` policy decisions.\n- Stores exact action hashes and payload hashes for reviewer trust.\n- Records request provenance so reviewers can tell whether a request came from the proxy, SDK, API, dashboard, or demo tooling.\n- Carries optional provider diff metadata so reviewers can inspect changed files and hunks before approving.\n- Approves queue items by producing `@axtary/actionpass` approval artifacts.\n- Denies queue items without producing executable approval evidence.\n- Exposes a small in-memory queue implementation for API route tests and local demos.\n- Persists hosted approval queue state to local JSON for development and self-hosted demos.\n- Provides an HTTP client and resolver that local proxy runtimes can use to fetch approved artifacts. The client requires a caller-injected fetch-compatible transport and fails closed without one, so the package does not use ambient global network access on its own.\n\n## Contract\n\nThe hosted control plane should coordinate approval state only. It should not hold downstream provider secrets or execute customer tool calls.\n\nLocal enforcement remains in `@axtary/proxy`. When a queued item is approved, the proxy can fetch the approval artifact and submit it through its `approvalResolver`; ActionPass issuance still validates that the artifact binds to the exact action and payload.\n\nQueue items include provenance:\n\n```json\n{\n  \"provenance\": {\n    \"source\": \"proxy\",\n    \"createdBy\": \"agent:codex-prod\",\n    \"sourceId\": \"codex-cli\",\n    \"createdFrom\": \"axtary.proxy\"\n  }\n}\n```\n\nExisting local JSON records without provenance parse as `source: \"api\"` for compatibility.\n\nQueue items can also include provider-specific diff metadata:\n\n```json\n{\n  \"diff\": {\n    \"provider\": \"github\",\n    \"summary\": \"1 modified file, 2 additions, 1 deletion\",\n    \"files\": [\n      {\n        \"path\": \"infra/prod/main.tf\",\n        \"status\": \"modified\",\n        \"additions\": 2,\n        \"deletions\": 1,\n        \"hunks\": [\n          {\n            \"header\": \"@@ -12,3 +12,4 @@\",\n            \"lines\": [\n              { \"type\": \"context\", \"oldLine\": 12, \"newLine\": 12, \"content\": \"...\" },\n              { \"type\": \"deletion\", \"oldLine\": 13, \"content\": \"...\" },\n              { \"type\": \"addition\", \"newLine\": 13, \"content\": \"...\" }\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## HTTP Shape\n\nThe Next app exposes the first local hosted API contract:\n\n- `POST /api/approvals` creates a pending queue item from `{ action, decision }`.\n- `GET /api/approvals?status=pending` lists queued items.\n- `GET /api/approvals/:id` returns one queue item.\n- `POST /api/approvals/:id/approve` resolves an item and returns an approval artifact.\n- `POST /api/approvals/:id/deny` denies an item without returning approval evidence.\n- `POST /api/approvals/demo` creates a local dashboard exercise request with `source: \"demo\"`.\n\nOnly `step_up` decisions can enter the queue.\n\nBy default, the Next API routes persist local development queue state to `.axtary/approvals.json`, which is ignored by git. Set `AXTARY_APPROVAL_STORE_PATH` to choose a different JSON file, or `AXTARY_APPROVAL_STORE_MODE=memory` for ephemeral tests.\n\n## Proxy Resolver\n\n`createHostedApprovalResolver({ baseUrl })` returns a resolver compatible with the proxy `approvalResolver` shape:\n\n```ts\nimport { createHostedApprovalResolver } from \"@axtary/approvals\";\n\nconst approvalResolver = createHostedApprovalResolver({\n  baseUrl: \"https://app.axtary.com\",\n  requestedBy: \"agent:codex-prod\",\n});\n```\n\nThe resolver creates or reuses a deterministic approval request ID based on the action hash. It returns `null` while the request is pending or denied, and returns an approval artifact only after the hosted queue has approved the exact action payload.\n\n## Quickstart\n\nThis example runs as-is with Node 20+:\n\n```ts\nimport { InMemoryApprovalQueueStore } from \"@axtary/approvals\";\nimport { evaluatePolicy } from \"@axtary/policy\";\nimport { demoAction } from \"@axtary/actionpass\";\n\n// A step_up decision becomes a reviewable queue item bound to the exact payload.\nconst store = new InMemoryApprovalQueueStore();\nconst item = await store.create({\n  action: demoAction,\n  decision: evaluatePolicy(demoAction),\n  requestedBy: \"agent:codex-prod\",\n});\nconsole.log(item.status, item.payloadHash);\n\n// Approving produces a payload-bound approval artifact the proxy can execute with.\nconst approval = await store.approve({\n  id: item.id,\n  approvedBy: \"user:reviewer@example.com\",\n  reason: \"Reviewed the exact payload\",\n});\nconsole.log(approval.item.status, approval.artifact.payloadHash === item.payloadHash);\n```\n","readmeFilename":"README.md"}