{"_id":"@useanvil/sdk","_rev":"33-3f02252fe9b07dd8a3bd3f5db0b2eceb","name":"@useanvil/sdk","dist-tags":{"latest":"0.5.6"},"versions":{"0.1.0":{"name":"@useanvil/sdk","version":"0.1.0","_id":"@useanvil/sdk@0.1.0","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"f814c225ad334be21556850348bff70b7f76f097","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.0.tgz","fileCount":68,"integrity":"sha512-zgUn4gV1Bk1Eix9NhVXbC/yJ/uzQsfjZwJzojxaGp89B4FvRqyXdZS28BKSCIbhPAfqmsvw8O4JUZvYni6ft4A==","signatures":[{"sig":"MEYCIQC6eqjN/twapaY+05h3M4j73LzT5Ea/E1LwKe80X6JrlQIhALQBSZn7emzyJtYBXRBaNLPI1W2W/0pTTCxZJKHT/At4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22701409},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"88fa963eae4046d3fcb937413b7a5aa6836b3fac","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.9.4","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"22.22.0","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1777937558537_0.6616379447834841","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@useanvil/sdk","version":"0.1.1","_id":"@useanvil/sdk@0.1.1","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"96f8bb1e7e7e1d24c6cbd5b513546d7b28188721","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.1.tgz","fileCount":70,"integrity":"sha512-v8pDyAHyheCqXf6U8unCvzumk0m3pOCFQVsGIoa30yStahWRXNk8BAujY5HOqR9CcUmtVJCldTSMSdHvdgHLqQ==","signatures":[{"sig":"MEQCICqa1+zJYVVDlnd9o8akf9cZ8lZ9pDkeVAsZ+zafxlOkAiAnPChM2kr0PZJxw8nVN7dBH4UD5sTizKrryyNVoVMkzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22921572},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"f66d8166f7ccbf9b7522a4ae87b7791d0c507d57","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1778035833398_0.3012602630836656","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@useanvil/sdk","version":"0.1.2","_id":"@useanvil/sdk@0.1.2","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"1667a06e5917ae86c7b1f2116268cbb68b9af32e","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.2.tgz","fileCount":70,"integrity":"sha512-TgefG8B9ZgOKSscmCC8+bn7u5rosNLwiZZm5Zl3ZkEWgUgvaIb9aTT2rwz24uBs0XPku6jbf4pJd7QgFi57PNQ==","signatures":[{"sig":"MEYCIQCYKaAGsgafAMkAHBDZgRWJ4HOaipjwfCqn3ypyXSu2oQIhAKvDNOLbyBilEjTk1slET9Qt0THPTykA9tIAbkCPEQb4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22921675},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"6fbd5d5900cbc57a143ec8b84e1327fa2ff94200","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1778036259564_0.3985809954765127","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@useanvil/sdk","version":"0.1.3","_id":"@useanvil/sdk@0.1.3","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"b0ac2c700d7e34a0270166d1a973ec0a2101abd6","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.3.tgz","fileCount":70,"integrity":"sha512-xuSr2r/mrF5f9KSEsI8ruPTrRAp18vrv7/n4QZ4zS7DmRUBi1RJbkrBoY62PPLzSCXSwf8WvoNd1q6S0d4U7ZQ==","signatures":[{"sig":"MEYCIQCM7/B6k7IP0Ihdey4CgIGhvVPzamAQr3qhiU8yS1oliAIhAJ6Fo7oSU51b6FxCOkwN9H2R9NONvmSPWjeew7fzeDgj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22921831},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"3856109ba4397159fe70ddb1f0803747422471ab","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.3_1778036440477_0.03403173544039251","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@useanvil/sdk","version":"0.1.4","_id":"@useanvil/sdk@0.1.4","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"60b2f6ca6ca38ec6f4480ca98b4cf7ddeddf08a1","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.4.tgz","fileCount":70,"integrity":"sha512-Wq7puTWSktPj1z3JWHLvJt9A5OkhqL93VdGE5vsyxB5L+0Mofsv6Vqs8HQ9Q9MJsBgXZyYZ8ZYrlfxaLMYuzcw==","signatures":[{"sig":"MEUCIDL9dGuL05Mchgl84iDxitJm/GimteVaG4ltRAvZoQ2rAiEA7roU77hHIfFeR8VreWsqR7osN1JmspjuBT4c3qQd5uw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23051126},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"adda96224abb767834272eac5fc3597a038e8f99","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.4_1778133938035_0.29821547491010336","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@useanvil/sdk","version":"0.1.5","_id":"@useanvil/sdk@0.1.5","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"d6bd5c12c1b362e7121b526adfbac4f3a01d70dd","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.5.tgz","fileCount":70,"integrity":"sha512-Ga0HrZwQahJXjqVuZemq4UTP4OuoQiO3Sln/qUtikFuUdkyd2dgTKO/TROQruy5U6KmCasVUETSJFeX7JKZcPQ==","signatures":[{"sig":"MEQCIFu9yqgkIzx1h7vvlaYafuOPCqUcJGoT0VJyrx5p1tNpAiBdOABwRoCbwX08zuHkxS0XbHnpjTBHDitOYR9lC63Mhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23057688},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"8c5a80995413ae9142fd72d93c35719e1edcfbb7","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","prove:guard":"node scripts/prove-guard.mjs","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.5_1778136646659_0.37714643172754503","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@useanvil/sdk","version":"0.1.6","_id":"@useanvil/sdk@0.1.6","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"159dd2024c624a14b5c96e42b21ac9f477c72dcf","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.6.tgz","fileCount":75,"integrity":"sha512-l5uzXDIjqzdF8q09Zegy4Sl5T4EqkWteWxQS1f0LhlzZZ7nhlVBZpSp7naU8st0r7DZQUjkwOPgSUpz5vmd5xA==","signatures":[{"sig":"MEYCIQDWj/lTl2c6ERFUY9XmYhsDxkaH0uAovwp7ob33dNY1bwIhAOWj9j/uB2xoSiVFACCp7l2BKI/n4travnrT/9kjDi/n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30383360},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"4337c91ffe7961735348a7c9b7cfbdadaedbebab","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"npm run build:agent-pack && tsup","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","policy:studio":"npm run build --silent && node dist/cli.js policy studio","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","typescript":"^5.0.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.6_1779504477065_0.6350854564013673","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@useanvil/sdk","version":"0.1.7","_id":"@useanvil/sdk@0.1.7","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"e597b530e8e57abe5d43936967b94fd4e758e4f4","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.7.tgz","fileCount":121,"integrity":"sha512-lZalPbRghJIU6jZ+POPhpzy5h/GxUAp9Q1+0Ltirsth1xx+05tjzSJs/Pf0e4yqUgceFo90nDeWkO7p8BQ/4pA==","signatures":[{"sig":"MEUCIQDPtnTzg9+HdzCRFA745ff2v9FFMHAnV5Q+ZiVli4dcigIgBHAelYMvOPnZuL5fMnGFOD7O7FFKBEaFNvN2SyBEZFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56989286},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"1bf0024dcfe3138e149848ed023b35c55d11902d","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"npm run build:agent-pack && tsup","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"node --import tsx scripts/policy-import-server.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@useanvil/sdk":"^0.1.6","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.7_1782409124815_0.5491196052652674","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@useanvil/sdk","version":"0.1.8","_id":"@useanvil/sdk@0.1.8","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"15da0d1e38e56e4e41df02eb91b61cbfcebbcd60","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.8.tgz","fileCount":121,"integrity":"sha512-GQI1QCoVspciR9zgOcONavGTeGKPx8syYWVTCTrSchMj3mjlb7lB4/l+oQKOTWSGWhcEdbE7X1oHBVL3I8yeFw==","signatures":[{"sig":"MEUCIELDfC2kesHvBjgdl9frxukAb3ey3s8lo8k/R0v5NfjzAiEAvXTal3KidhyLmHDKP2MXCBbrxB7ISI+I8y22MK24Ek8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57227230},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"1bf0024dcfe3138e149848ed023b35c55d11902d","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"npm run build:agent-pack && tsup","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"node --import tsx scripts/policy-import-server.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@useanvil/sdk":"^0.1.6","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.8_1782433811724_0.9946039802834461","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@useanvil/sdk","version":"0.1.9","_id":"@useanvil/sdk@0.1.9","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"e06633b38479903efca665786d2c8ba5a4760caf","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.9.tgz","fileCount":122,"integrity":"sha512-p6/0hORLEsrV3u7J/jIgwv3q3K5PhLU5/ohVGJgVdbkm2e5rq/Vhxiwm3XIaBw9PHYd3axxnM/nSWcqTa2GxAQ==","signatures":[{"sig":"MEUCIQCWLyIzOAz7xb80OkbFgOhAy69fs/UdFlfBUsKfMXD6bwIgAerYUaXBUF/vIYUfQpf5OhcIVTrwPt6qGAsSAdPy9cU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58329399},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"aebf14cc29806b254a87e4c7badd7aef25a94904","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"npm run build:agent-pack && tsup","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"node --import tsx scripts/policy-import-server.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.9_1782461958971_0.008695842196765335","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@useanvil/sdk","version":"0.1.10","_id":"@useanvil/sdk@0.1.10","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"840e8efcfea9222679170b8f0e3408e79291e017","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.10.tgz","fileCount":132,"integrity":"sha512-J8bVYb4yGtaQ8azQ7+1G0UEgO8sxmwT2nFxa0OtujEvlOHlyATrLNCgDvHKP2/zZFpogKwuTTfcfs38uP48Xmg==","signatures":[{"sig":"MEYCIQCHQ+cF6nqYHfZILgiPKcKeND8Lnv8ZombidIMw7dUnkAIhALmAq+x6eC45J8QHqeddIZXvDVV19F+dgYV5tsKBRxw4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59549652},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"930e5d395ff4f17088574df390b06a2d61448258","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:fresh-deploy":"node scripts/check-fresh-deploy.mjs","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.10_1783040198343_0.413980295796168","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@useanvil/sdk","version":"0.1.11","_id":"@useanvil/sdk@0.1.11","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"f9a8666e0ec6c98f8ffbc645ee336e79c36e8901","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.1.11.tgz","fileCount":134,"integrity":"sha512-cNhA3TGBzjxzS18qM2QD6lqKDk1SboxGNBxSzih9E+uiDgooCYuHpwGbUu32z+zTeNN6ZkA0wkrGmrqtJIOvig==","signatures":[{"sig":"MEUCIQDXbcnspyGzRGzeukNjxWcUeC6rj9bYlKEo4ioO9KO2twIgeYE0+7ELcsR/72oC+qV2idGadgHT9/DFCpjWetN/gN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60734801},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"11.11.1","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"25.8.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@useanvil/sdk":"^0.1.10","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^1.0.0","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.11_1783642026291_0.5415622921929029","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@useanvil/sdk","version":"0.2.0","_id":"@useanvil/sdk@0.2.0","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"e473433645971880827f88392ba9ae1f8b002a30","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.2.0.tgz","fileCount":137,"integrity":"sha512-D7l2Ua+5aGVsmjEI1xnwhlAJ+L9FrFxp9aa7PRXvAcOh3hWr3JRP029WVbwCC2vDyR7CMoUiV70iU0sd/Zio3w==","signatures":[{"sig":"MEUCIQDJ77J1wnIKpqDU9jDbO7bAHHmTUl/2gwgNqRVt322hCAIgZrLTyYlxKxDczsYyATN+Ta0yhJfCDxicwrqBnBKgKC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64897255},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"63db5c6770f5445fb8f6ef6f5573748feb15d0c6","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@useanvil/sdk":"^0.1.11","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1784440914611_0.9205772679707447","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@useanvil/sdk","version":"0.2.1","_id":"@useanvil/sdk@0.2.1","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"37f8133a7c2c1826a1226f753bd4078f8f5d7de2","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.2.1.tgz","fileCount":137,"integrity":"sha512-jBeu7N8n7sKmAdtroQP1kHYl7+1xBuI5he5vTCqOgN/91gWWCMkpmQf9X8iym5yyWGUZKYXfKjAv+eoR4+cpxg==","signatures":[{"sig":"MEUCIHTjRdBv8UP0nkIJcxQO+WimW4culZnFBtvS8EKWXBkvAiEAi7ETBgXKNclbicwGm8JZpWgHgCdclB7ZStrlxF6Q6cA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64926947},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"7a3dff06a694517411a70fae5fc0e4ba0c201787","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@useanvil/sdk":"^0.1.11","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.1_1784443920218_0.9706534342491018","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@useanvil/sdk","version":"0.3.0","_id":"@useanvil/sdk@0.3.0","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"77d42533937aee92557d479f598e8bff1d307069","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.0.tgz","fileCount":425,"integrity":"sha512-BcrERBMU7lwH1uMTt5oAtKmcd1v2QMMDlLhMeP4krJKjFoJsJknG1X1XYBNUuWyYqOAAPDQIOSywUuR4+Amn2g==","signatures":[{"sig":"MEYCIQD668Ur4wUXuXxTFo9/2AQPbCeQlTcOV9+NBWcmN6UWCgIhAN0Z1eeKTpoI8e2hpEeKyIEtR/kH4l0jiDATzD1qu3E9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79589833},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"bfab34a88ec3a886e617c0e701d374c8e8f1f455","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.0_1784952334263_0.8355981942227619","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@useanvil/sdk","version":"0.3.1","_id":"@useanvil/sdk@0.3.1","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"5d5daf63b2e59b43f83c5064ad72d9a74b37eb4d","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.1.tgz","fileCount":425,"integrity":"sha512-7cdm+J+rZ2kLeC6NHs+qbmmRUsy6mRAhkRk+zRCpUW7emlzXa6w6Sg2D70xegdb7TMZIv26oopE+YUYI3sJOIA==","signatures":[{"sig":"MEQCIBK+6lZLu32EFdqzaY69h7zAh5vDnhsiK5FYXGBIvbP+AiAZmu8OOHBSAOgtkN/i9pPvx/YNdJb3vg7EYMZTHTz5CQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79599053},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"51decf9117fec4ed9181f852e5c347ea268664e3","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.1_1784994253524_0.40593076773978254","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@useanvil/sdk","version":"0.3.2","_id":"@useanvil/sdk@0.3.2","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"7f3186b7d04b08a89c4145f9be38c909ebcaf572","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.2.tgz","fileCount":377,"integrity":"sha512-pUjl3ABnnBBHzX+9Img7YlDijlR5DCUZM4CuF04ElqbYszkL9vq6cobrHS6NqrU9OOhmIffjqA3szZpUI6Y+Kg==","signatures":[{"sig":"MEQCIC3wc7LAgoR17J6Vl6TSqU8sqwYZYuJX6GaS6uuRY89SAiBXhCtBTDlQZkfV+s0AZ8zrEL2oEJav2sD1wQ+TZUnmDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32859724},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"b0b4ca5da01e2b0e3e1bea19ebddc55558e48cf2","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.2_1784994856412_0.731540327380116","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@useanvil/sdk","version":"0.3.3","_id":"@useanvil/sdk@0.3.3","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"a0656b1750bf891978eb8ee0bd1cf4ecd3d9f988","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.3.tgz","fileCount":377,"integrity":"sha512-1tigY/f1IwBJbt1WVilsnOjptp7mJsC/T2py3ao/DIDtNzqP7G2VE5EQZBr/rEXhKIxS9+figzlwYzg+z9Gs5Q==","signatures":[{"sig":"MEYCIQD2ES2PzDahC1n04uXD3tiLvxqpdfx6l3h4KZp0bSgpEgIhAJNfMDIsQ9gg7b/GQDE8L7fAeqpCW5EZ+kyelRl24nz+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33444805},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./sinks/otel":{"types":"./dist/sinks/otel.d.ts","import":"./dist/sinks/otel.js","require":"./dist/sinks/otel.cjs"},"./sinks/stdout":{"types":"./dist/sinks/stdout.d.ts","import":"./dist/sinks/stdout.js","require":"./dist/sinks/stdout.cjs"},"./policy-export":{"types":"./dist/policy-export.d.ts","import":"./dist/policy-export.js","require":"./dist/policy-export.cjs"},"./sinks/metrics":{"types":"./dist/sinks/metrics.d.ts","import":"./dist/sinks/metrics.js","require":"./dist/sinks/metrics.cjs"},"./integrations/openai":{"types":"./dist/integrations/openai.d.ts","import":"./dist/integrations/openai.js","require":"./dist/integrations/openai.cjs"},"./sinks/policy-latency":{"types":"./dist/sinks/policy-latency.d.ts","import":"./dist/sinks/policy-latency.js","require":"./dist/sinks/policy-latency.cjs"},"./integrations/anthropic":{"types":"./dist/integrations/anthropic.d.ts","import":"./dist/integrations/anthropic.js","require":"./dist/integrations/anthropic.cjs"},"./integrations/langchain":{"types":"./dist/integrations/langchain.d.ts","import":"./dist/integrations/langchain.js","require":"./dist/integrations/langchain.cjs"},"./integrations/vercel-ai":{"types":"./dist/integrations/vercel-ai.d.ts","import":"./dist/integrations/vercel-ai.js","require":"./dist/integrations/vercel-ai.cjs"}},"gitHead":"47fe2b7e3c27c5746905401babdebfa93342dd97","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","demo:merchant":"node --import tsx demo-merchant/index.ts run","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-vitest.mjs run --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-vitest.mjs run --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.3_1785094655345_0.7135994071770042","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@useanvil/sdk","version":"0.3.4","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.3.4","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"3775affd5b30189b3f3517ff7822a43a14a0ac97","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.4.tgz","fileCount":403,"integrity":"sha512-Lf7wl5E0AXvPtT1BzcEuFBOZhuv0VJNxGlDQ61EW/WDABToEWsOqWEk9sxeS/HRkqvCnhGw/NNaUyTecKSq00A==","signatures":[{"sig":"MEUCIDwI7hj8S6s6Hnpzo2Yg9Lq4BrzQ03zS2AXLAz9EpWmwAiEA8ehM2G5t9Hh6wmK/9AWbnLnnzLqotJxRLQv3/EUZtOY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36927496},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"gitHead":"0f593231256709d569c4d7f8adf789c1328bd396","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"@ts-morph/common":{"brace-expansion":"^5.0.8"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.4_1785619343648_0.8133822310950254","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@useanvil/sdk","version":"0.3.5","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.3.5","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"5888903011105426c200ad9ee794ccb33502ee26","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.5.tgz","fileCount":406,"integrity":"sha512-gi7uzdi0NOeL/m7HzAS0HcqsP1unCRx0qPf0rWxmTGn0nTPocwJo7gXsIV2XzFRH7TufdIry0vgfomXdMNNWpA==","signatures":[{"sig":"MEYCIQDK/e5RiPBGz4z6zY+nVkRAG25d0kZImLbj55Y2GUoT3wIhAM4ZPeQTe8SoztCsjH3kMreD1SxXZvMweSpmV/AmKJRs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37308377},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"@ts-morph/common":{"brace-expansion":"^5.0.8"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.5_1785693478923_0.34303807084181837","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@useanvil/sdk","version":"0.3.6","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.3.6","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"caaf9f0098ec04d54fa2eb49ffb2f7cb966ee26a","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.6.tgz","fileCount":409,"integrity":"sha512-Db8fKYehzL+eYzKU50KTcCTIAJJ4YuGacAroyKfGOaEvoWU7DuITDSgEKwLn7+Q1YKTMWDW3zf8AWuC9UfuZXg==","signatures":[{"sig":"MEYCIQCs8C6NV561VXH4T7mO920r3IGm9RPgWbHDemypsVw43wIhAJ2A2e99FMcq5yNKZRK8fWkw4ajQcEok71gfLlcn4EHs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37411414},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.6_1785818273808_0.40318987339112566","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@useanvil/sdk","version":"0.3.7","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.3.7","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"756053fdb69641a32bb99258a3dfae697bec50e6","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.7.tgz","fileCount":420,"integrity":"sha512-p/zVSsihNyDIE/mEvlHSB8aF1K9SXgD1Pyr1rfdjZgs2zmcmlcz4OWz7fHdK+lAUV5WGotG+jowlDvn+FAyY7g==","signatures":[{"sig":"MEYCIQCEVCzDxjlUtDL/qUP1UhgylfegEMGtBPo15QP4vMh9UAIhALIPK+Q25BwzBDQydTaqdIV6rHRf56GsIZsz+2ROHoDX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38440120},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.7_1786515285456_0.4508764898075246","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@useanvil/sdk","version":"0.3.8","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.3.8","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"8b00a30624411776ab9ea6922e6c7e00da6639fb","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.3.8.tgz","fileCount":442,"integrity":"sha512-MYUnuhTo1ENQPrlxPIy9u2MeBGJqBsPSHSGFogIdW2OpsklwXb07zbPoKTbKmEapPZPEuF6CgfR66cvZqN46Ig==","signatures":[{"sig":"MEYCIQCcAoRJOCUA65TbU3rj6jdbigz1gyDMzfAqh++l0GDkJQIhAOzSL+QcMMWJniTJBRS1ZPIY9P5hFqqhgGtlUPaCHTQT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39357270},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.8_1786783284607_0.0562104689250289","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@useanvil/sdk","version":"0.4.0","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.4.0","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"eee757e562b2e26f07c210faf66905dfe0f2137e","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.4.0.tgz","fileCount":445,"integrity":"sha512-5OcphzlQ2XEXW04rCkzz5vzb80iuw+pY5L5zWJHHIRy0xDzPhScuptN8v+HEUstpsgNdnVQr5a7vdXf5txdhTg==","signatures":[{"sig":"MEUCIQC8Q1r2sNbqh7aaYv/hu6Eth/tVkMRHK+Us8HWv9ma4nwIgBcqfxhDANyppYJH/tDI6Ae8O9z8l2x9uBDtpGvvZdH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39629202},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.0_1786840775681_0.9390876553662244","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@useanvil/sdk","version":"0.4.1","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.4.1","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"2c3e0af687edaeabe1f4b4c32f2b1ef71359cd39","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.4.1.tgz","fileCount":445,"integrity":"sha512-R2a41acg3WkBYdsPLDPaSt4TbnfDjZwS32o86qgn6ExFlHIir1Q9edP8facyf+I7tILLkzsR9yBDBA7eNf0RPw==","signatures":[{"sig":"MEUCIQC8erwr4a68OdNV9L4/WxGXgvB+PVQ+bH+J7e1h4RjwggIgalyKwkH4nQS2mVYrnoPWyCDjqxXV66sx0JACOf7sJ6g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39635728},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.1_1786845113369_0.9818176834542816","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@useanvil/sdk","version":"0.4.2","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.4.2","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"5f5de82d6bf06210129b3317b3110fc7e9d528af","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.4.2.tgz","fileCount":445,"integrity":"sha512-Jzg4BSsZvL8WuIMRc+h4RU8q1ihH4mjawdCDpXOINui93tlaM+10rohHgA5wWSP7M/Utz4GNpCdKbF0f6qx9pw==","signatures":[{"sig":"MEYCIQDGsYWbcJpKXdpEQlSq6iyEefBsAIgQMVz1JJUP2G9K1QIhAJvawJW4XFauiVMTKKuKxsQ24RpSpz74b/aF7cfKDgC2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39637967},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.4.2_1786847149366_0.0014963559282681338","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@useanvil/sdk","version":"0.5.0","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.0","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"03b9e97f293cefbfda5edac15e0c78aad8fac357","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.0.tgz","fileCount":445,"integrity":"sha512-0q66IrdIh0AX+M6hDOicLNzwM5k5NNhj4GtkzkCAkUNmmyP6yk24QKF4/Hqjlbu3fAXXZB8WDkYD07yy+e0pkg==","signatures":[{"sig":"MEQCID4KU8oGh4gKNFcv2zem0hKfOQV/2gChYlADBdCeZ9nkAiAqQqYMKIchE5IBXQ1WbqlfU0X4gqEswD+/6ngZToF9fQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39665817},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.0_1786865366870_0.08183530010215545","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@useanvil/sdk","version":"0.5.1","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.1","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"369cc030ec06a0ce3c51dd657964c9f44b87cba7","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.1.tgz","fileCount":446,"integrity":"sha512-AYfJsEPr+JanQ8cVIdSY151dEN8QnX9zk8WoroCJUiw/e3U+7FTUuxOdvV/Eii7Y5hNaryyeEvzCJ2+pXakWDQ==","signatures":[{"sig":"MEUCICKBGF0/0GmRDHHSHFnrfi5Jtm+KEmdNODKznF1XSHj8AiEAwk8Lr58BlA4XI3kARPWiuGJwmYRsujeUcodprIAqf6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39894444},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.1_1786994816415_0.6976351874035318","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@useanvil/sdk","version":"0.5.2","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.2","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"529bb746e0b0be0969322c15bacd29d02c55123d","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.2.tgz","fileCount":458,"integrity":"sha512-t4R3PaZhZMka0fLW4UIHJYcCpIIPZx5APSW2j5SNcNkgz3JzAszneZmjO4gpH86nYmRKYgoV6p6rO6ISwJ7jUA==","signatures":[{"sig":"MEYCIQC+8qYZejGl4pNPEznzBF5HoFQs+evHe0p6xR3s/Q6sPwIhALh1Wm+CaUHv60fTMejz9TqmS9ySPxa2GM3nmHT464Os","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40865334},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts tests/policy-backfill-boot.live.test.ts tests/bug-report-store.live.test.ts tests/bug-reports-api.live.test.ts tests/bug-reports-preflight.live.test.ts tests/bug-report-worker.live.test.ts tests/bug-attachments-api.live.test.ts tests/bug-report-pipeline.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.5"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.2_1787514099489_0.32092609751852086","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@useanvil/sdk","version":"0.5.3","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.3","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"a84895b1d003eeb8443436646010448a0239a13e","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.3.tgz","fileCount":467,"integrity":"sha512-L0SxB/TG6oxqrhD3P18XXILjrZfPxiAXFX3SVhJxpwRvibEtfHKFRcX5l5XqEJo8IzS1Nq8+8yiNNVeD4GrMwQ==","signatures":[{"sig":"MEYCIQCatz9gGslS/aFsc822vjwMaLkT5visw6m7OVL5jnvYVAIhAPPW2Akw1f05pF7Q5t+stNTJR1ktjSZOdKc803PB3YiQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45396185},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","gate:beta":"node scripts/gate-local.mjs --beta","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:claims":"node scripts/run-claims-lane.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/reconcile-pending-hosted.live.test.ts tests/approvals-reconcile-postgres.live.test.ts tests/audit-read-contract-postgres.live.test.ts tests/audit-record-of-truth.live.test.ts tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/action-mode-history-anchor.live.test.ts tests/wo10-break-glass-visibility.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/code-map-read-does-not-starve.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/hosted-register-on-wrap.live.test.ts tests/hosted-actions-list-sees-registration.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts tests/policy-backfill-boot.live.test.ts tests/bug-report-store.live.test.ts tests/bug-reports-api.live.test.ts tests/bug-reports-preflight.live.test.ts tests/bug-report-worker.live.test.ts tests/bug-attachments-api.live.test.ts tests/bug-report-pipeline.live.test.ts tests/wo13-who-stalled.live.test.ts tests/holds-survive-a-redis-flush.test.ts tests/hosted-read-path-speaks-for-the-tenant.live.test.ts tests/deactivation-is-real-on-hosted.live.test.ts tests/hosted-approval-loop-closes.live.test.ts tests/inventory-truth-on-hosted.live.test.ts tests/control-survives-redis-loss.live.test.ts tests/holds-are-actionable-after-a-flush.test.ts tests/holds-recovered-is-not-a-clean-slate.test.ts tests/anvil-cc-agrees-about-money.test.ts tests/approval-revocation.test.ts tests/internal-usage-cross-tenant.test.ts tests/money-from-writer-to-screen.live.test.ts tests/hosted-control-seed-never-adopts-a-wiped-store.test.ts tests/a-policy-survives-the-studio.hosted.live.test.ts tests/part1-durability-e2e.live.test.ts tests/durable-command-idempotency-live.test.ts tests/deploy-preflights-live.test.ts tests/integration/two-tenant-rate-isolation-e2e.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","check:record-mode":"node scripts/check-record-mode.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","check:tense-honesty":"node scripts/check-tense-honesty.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:beta-readiness":"node scripts/check-beta-readiness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","check:proof-coverage":"node scripts/check-proof-coverage.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","migrate:legacy-rules":"node --import tsx scripts/migrate-legacy-custom-rules.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","gate:production-shape":"node --import tsx scripts/gate3-production-shape.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs","check:durable-claim-settlement":"node scripts/check-durable-claim-settlement.mjs","check:hold-disposition-authority":"node scripts/check-hold-disposition-authority.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.7"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.3_1788842422121_0.9621099463453247","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@useanvil/sdk","version":"0.5.4","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.4","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"9a39034bd9310c400f92735953da7fd9414f93ed","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.4.tgz","fileCount":467,"integrity":"sha512-Hp1i/geBkL9fdUi7zaCpHel9JYwzom1oXqOJCJJf9eamacCsbehg8zdoxGK5g49ZuhwYjdoJz9C6RNn4q70c0A==","signatures":[{"sig":"MEUCICDXWp4BLjSIWh1fJ6U52luG/+JvJTcmv/LEqhN85dWsAiEAqEeHpssK2MkpS3H7lXgZQCjOTIQa7DQm0GilUnBe/YY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45970123},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","gate:beta":"node scripts/gate-local.mjs --beta","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:claims":"node scripts/run-claims-lane.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/reconcile-pending-hosted.live.test.ts tests/approvals-reconcile-postgres.live.test.ts tests/audit-read-contract-postgres.live.test.ts tests/audit-record-of-truth.live.test.ts tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/action-mode-history-anchor.live.test.ts tests/wo10-break-glass-visibility.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/code-map-read-does-not-starve.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/hosted-register-on-wrap.live.test.ts tests/hosted-actions-list-sees-registration.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts tests/policy-backfill-boot.live.test.ts tests/bug-report-store.live.test.ts tests/bug-reports-api.live.test.ts tests/bug-reports-preflight.live.test.ts tests/bug-report-worker.live.test.ts tests/bug-attachments-api.live.test.ts tests/bug-report-pipeline.live.test.ts tests/wo13-who-stalled.live.test.ts tests/holds-survive-a-redis-flush.test.ts tests/hosted-read-path-speaks-for-the-tenant.live.test.ts tests/deactivation-is-real-on-hosted.live.test.ts tests/hosted-approval-loop-closes.live.test.ts tests/inventory-truth-on-hosted.live.test.ts tests/control-survives-redis-loss.live.test.ts tests/holds-are-actionable-after-a-flush.test.ts tests/holds-recovered-is-not-a-clean-slate.test.ts tests/anvil-cc-agrees-about-money.test.ts tests/approval-revocation.test.ts tests/internal-usage-cross-tenant.test.ts tests/money-from-writer-to-screen.live.test.ts tests/hosted-control-seed-never-adopts-a-wiped-store.test.ts tests/a-policy-survives-the-studio.hosted.live.test.ts tests/part1-durability-e2e.live.test.ts tests/durable-command-idempotency-live.test.ts tests/deploy-preflights-live.test.ts tests/integration/two-tenant-rate-isolation-e2e.test.ts tests/hosted-fail-open-receipt.live.test.ts tests/every-cent-reconciles-on-postgres.live.test.ts tests/a-stuck-claim-is-reclaimable.live.test.ts tests/a-blocked-exit-is-still-an-ending.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","check:record-mode":"node scripts/check-record-mode.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:no-catch-null":"node scripts/check-no-catch-null.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","check:tense-honesty":"node scripts/check-tense-honesty.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:beta-readiness":"node scripts/check-beta-readiness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","check:proof-coverage":"node scripts/check-proof-coverage.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","migrate:legacy-rules":"node --import tsx scripts/migrate-legacy-custom-rules.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","gate:production-shape":"node --import tsx scripts/gate3-production-shape.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs","check:one-mode-authority":"node scripts/check-one-mode-authority.mjs","check:durable-claim-settlement":"node scripts/check-durable-claim-settlement.mjs","check:hold-disposition-authority":"node scripts/check-hold-disposition-authority.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"overrides":{"ajv":{"fast-uri":"^3.1.7"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.4_1789014470144_0.3250864532762241","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@useanvil/sdk","version":"0.5.5","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","_id":"@useanvil/sdk@0.5.5","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"homepage":"https://anvilcontrol.ai","bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"bin":{"anvil":"dist/cli.js"},"dist":{"shasum":"6ffc384b10816f2474f4963594cf21d47ffc2982","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.5.tgz","fileCount":468,"integrity":"sha512-fOZAqHzDR/MY4yu5aOWAQznzjHqfV4dOu0ZVa4bpoNEJRibJS9bUV4/ELSKsuBz8BtZbEa8jfLfC3ROeyizO0g==","signatures":[{"sig":"MEQCIBxYA6kgwwsFNhm8JAu6a+LU1aWEf32bkBuvfGOyPr/HAiBNtxkK3pBpPBz6bUEhFJ91TxLWFLi0G6NH7N7Vd7Enhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFZv4+jnrb8cbJ1V2QCZMsuQkYLmzpRYcAlbsv431QHqAiAKlvocNFtvkliDcgV0GMvNv0emLh8GJfnok+U+JClynw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46397788},"main":"dist/index.cjs","type":"module","_from":"file:/private/tmp/claude-501/-Users-henrymiller-Desktop-Ledger-Anvil-Repo-WIP-anvil-sdk-prod-v0-1/76555feb-85dd-464e-a666-3db63bce8c59/scratchpad/release-0.5.5/frozen/useanvil-sdk-0.5.5.tgz","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","gate:beta":"node scripts/gate-local.mjs --beta","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","test:node":"node --test tests/*.test.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:claims":"node scripts/run-claims-lane.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/reconcile-pending-hosted.live.test.ts tests/approvals-reconcile-postgres.live.test.ts tests/audit-read-contract-postgres.live.test.ts tests/audit-record-of-truth.live.test.ts tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/action-mode-history-anchor.live.test.ts tests/wo10-break-glass-visibility.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/code-map-read-does-not-starve.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/hosted-register-on-wrap.live.test.ts tests/hosted-actions-list-sees-registration.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts tests/policy-backfill-boot.live.test.ts tests/bug-report-store.live.test.ts tests/bug-reports-api.live.test.ts tests/bug-reports-preflight.live.test.ts tests/bug-report-worker.live.test.ts tests/bug-attachments-api.live.test.ts tests/bug-report-pipeline.live.test.ts tests/wo13-who-stalled.live.test.ts tests/holds-survive-a-redis-flush.test.ts tests/hosted-read-path-speaks-for-the-tenant.live.test.ts tests/deactivation-is-real-on-hosted.live.test.ts tests/hosted-approval-loop-closes.live.test.ts tests/inventory-truth-on-hosted.live.test.ts tests/control-survives-redis-loss.live.test.ts tests/holds-are-actionable-after-a-flush.test.ts tests/holds-recovered-is-not-a-clean-slate.test.ts tests/anvil-cc-agrees-about-money.test.ts tests/approval-revocation.test.ts tests/internal-usage-cross-tenant.test.ts tests/money-from-writer-to-screen.live.test.ts tests/hosted-control-seed-never-adopts-a-wiped-store.test.ts tests/a-policy-survives-the-studio.hosted.live.test.ts tests/part1-durability-e2e.live.test.ts tests/durable-command-idempotency-live.test.ts tests/deploy-preflights-live.test.ts tests/integration/two-tenant-rate-isolation-e2e.test.ts tests/hosted-fail-open-receipt.live.test.ts tests/every-cent-reconciles-on-postgres.live.test.ts tests/a-stuck-claim-is-reclaimable.live.test.ts tests/a-blocked-exit-is-still-an-ending.live.test.ts tests/spend-caps-postgres-fallthrough.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:docs-fresh":"node scripts/check-docs-fresh.mjs","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","check:record-mode":"node scripts/check-record-mode.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:docs-symbols":"node scripts/check-docs-symbols.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:no-catch-null":"node scripts/check-no-catch-null.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","check:tense-honesty":"node scripts/check-tense-honesty.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:beta-readiness":"node scripts/check-beta-readiness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","check:proof-coverage":"node scripts/check-proof-coverage.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","migrate:legacy-rules":"node --import tsx scripts/migrate-legacy-custom-rules.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","gate:production-shape":"node --import tsx scripts/gate3-production-shape.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs","check:one-mode-authority":"node scripts/check-one-mode-authority.mjs","check:durable-claim-settlement":"node scripts/check-durable-claim-settlement.mjs","check:hold-disposition-authority":"node scripts/check-hold-disposition-authority.mjs"},"_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"_resolved":"/private/tmp/claude-501/-Users-henrymiller-Desktop-Ledger-Anvil-Repo-WIP-anvil-sdk-prod-v0-1/76555feb-85dd-464e-a666-3db63bce8c59/scratchpad/release-0.5.5/frozen/useanvil-sdk-0.5.5.tgz","overrides":{"ajv":{"fast-uri":"^3.1.7"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"_integrity":"sha512-fOZAqHzDR/MY4yu5aOWAQznzjHqfV4dOu0ZVa4bpoNEJRibJS9bUV4/ELSKsuBz8BtZbEa8jfLfC3ROeyizO0g==","repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.5.5_1789725244118_0.9800187352512248","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"_id":"@useanvil/sdk@0.5.6","bin":{"anvil":"dist/cli.js"},"bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"dist":{"shasum":"9263599255d8be3d4dfd71f43ad606ba59aa7a51","tarball":"https://registry.npmjs.org/@useanvil/sdk/-/sdk-0.5.6.tgz","fileCount":473,"integrity":"sha512-wuY3Uxm0AFFOUcJ8WmRu4tebZSRgntXHplhkWTRvHtku4zcePGwMyQ3cv1PUVRbyi08mC6yEvjm/8DiwQ0TG4g==","signatures":[{"sig":"MEUCIQDbZLyMvBcug56P55OXYC7oK1btlx6k85fzSswkLRA2uQIgZoj98ew4eP5jSYti81r58m9JgontOAZTfPT+0Y/AbN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDaipUUN49VVsGPEpqaUciB+zd6qEe5JqZODV00OU3wJAiEAhIpnIitbogqbWgO0JfNpNohbwynR5jkCtNpuD2sEo4c="}],"unpackedSize":47582827},"main":"dist/index.cjs","name":"@useanvil/sdk","type":"module","_from":"file:useanvil-sdk-0.5.6.tgz","types":"dist/index.d.ts","author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./init":{"import":{"types":"./dist/instrument/init.d.ts","default":"./dist/instrument/init.js"}},"./sinks/otel":{"import":{"types":"./dist/sinks/otel.d.ts","default":"./dist/sinks/otel.js"},"require":{"types":"./dist/sinks/otel.d.cts","default":"./dist/sinks/otel.cjs"}},"./package.json":"./package.json","./sinks/stdout":{"import":{"types":"./dist/sinks/stdout.d.ts","default":"./dist/sinks/stdout.js"},"require":{"types":"./dist/sinks/stdout.d.cts","default":"./dist/sinks/stdout.cjs"}},"./policy-export":{"import":{"types":"./dist/policy-export.d.ts","default":"./dist/policy-export.js"},"require":{"types":"./dist/policy-export.d.cts","default":"./dist/policy-export.cjs"}},"./sinks/metrics":{"import":{"types":"./dist/sinks/metrics.d.ts","default":"./dist/sinks/metrics.js"},"require":{"types":"./dist/sinks/metrics.d.cts","default":"./dist/sinks/metrics.cjs"}},"./integrations/openai":{"import":{"types":"./dist/integrations/openai.d.ts","default":"./dist/integrations/openai.js"},"require":{"types":"./dist/integrations/openai.d.cts","default":"./dist/integrations/openai.cjs"}},"./sinks/policy-latency":{"import":{"types":"./dist/sinks/policy-latency.d.ts","default":"./dist/sinks/policy-latency.js"},"require":{"types":"./dist/sinks/policy-latency.d.cts","default":"./dist/sinks/policy-latency.cjs"}},"./integrations/anthropic":{"import":{"types":"./dist/integrations/anthropic.d.ts","default":"./dist/integrations/anthropic.js"},"require":{"types":"./dist/integrations/anthropic.d.cts","default":"./dist/integrations/anthropic.cjs"}},"./integrations/langchain":{"import":{"types":"./dist/integrations/langchain.d.ts","default":"./dist/integrations/langchain.js"},"require":{"types":"./dist/integrations/langchain.d.cts","default":"./dist/integrations/langchain.cjs"}},"./integrations/vercel-ai":{"import":{"types":"./dist/integrations/vercel-ai.d.ts","default":"./dist/integrations/vercel-ai.js"},"require":{"types":"./dist/integrations/vercel-ai.d.cts","default":"./dist/integrations/vercel-ai.cjs"}}},"license":"BUSL-1.1","scripts":{"cc":"npm run build --silent && node dist/cli.js cc","dev":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs & python3 '.claude/nocache-server.py' & wait","demo":"npm run build --silent && node dist/cli.js demo","eval":"npm run build --silent && tsx scripts/run-eval.ts","home":"node --import tsx -e \"import('./src/ui/home-card.ts').then(m=>m.printHome())\"","init":"npm run build --silent && node dist/cli.js init","lint":"eslint src --ext .ts","test":"node scripts/run-vitest.mjs run","build":"node scripts/check-build-node.mjs && rm -rf dist && npm run build:agent-pack && tsup && node scripts/build-instrument-entry.mjs && node scripts/copy-web-assets.mjs","serve":"ANVIL_DEV_NO_AUTH=1 node --import tsx scripts/policy-import-server.mjs","smoke":"node --import tsx scripts/smoke-server.mjs","start":"npm run build --silent && node dist/cli.js start","doctor":"npm run build --silent && node dist/cli.js doctor","verify":"npm run check:ghost-perimeter && npm run build && npm test","monitor":"node scripts/anvil-monitor.mjs","test:ci":"node scripts/run-ci-tests.mjs","sync:web":"node scripts/sync-web.mjs","backup:pg":"node scripts/pg-backup.mjs","demo:suzy":"sh demo-suzy/run.sh","gate:beta":"node scripts/gate-local.mjs --beta","readiness":"node scripts/readiness.mjs","serve:web":"ANVIL_DEV_NO_AUTH=1 ANVIL_SERVE_WEB=1 node --import tsx scripts/policy-import-server.mjs","test:node":"node --test tests/*.test.mjs","typecheck":"tsc --noEmit","api:server":"node dist/api-server.js","db:migrate":"npm run build --silent && node dist/cli.js db migrate","gate:local":"node scripts/gate-local.mjs","serve:prod":"NODE_ENV=production node --import tsx scripts/policy-import-server.mjs","smoke:pack":"node scripts/pack-smoke.mjs","test:watch":"node scripts/run-vitest.mjs","api:migrate":"node scripts/migrate-saas.mjs","bench:ghost":"npm run build --silent && node scripts/benchmark-ghost-parser.mjs","bench:guard":"node scripts/benchmark-guard.mjs","build:legal":"node scripts/build-legal-pages.mjs","check:legal":"node scripts/build-legal-pages.mjs --check","demo:stripe":"npm run build --silent && node dist/cli.js demo stripe","deploy:gate":"node scripts/ci-deploy-gate.mjs","eval:import":"node --import tsx scripts/eval-import.mjs","perf:egress":"tsx scripts/egress-perf-check.ts","postinstall":"node scripts/postinstall-editor.mjs","prove:guard":"node scripts/prove-guard.mjs","reset:blank":"node scripts/reset-blank.mjs","test:claims":"node scripts/run-claims-lane.mjs","test:parity":"node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","bench:egress":"tsx scripts/bench-egress.ts","ghost:intake":"npm run build --silent && node dist/server.js","ghost:sample":"npm run build --silent && node dist/cli.js ghost --sample","score:egress":"tsx scripts/score-egress.ts","spike:parity":"node --import tsx scripts/spike-hosted-parity.mjs","typecheck:ci":"tsc -p tsconfig.ci.json --noEmit","check:ci-gate":"node scripts/check-ci-gate.mjs","check:release":"node scripts/check-release.mjs","demo:merchant":"node --import tsx demo-merchant/index.ts run","drill:restore":"node scripts/pg-restore-drill.mjs","policy:studio":"npm run build --silent && node dist/cli.js policy studio","test:ci:flaky":"node scripts/run-ci-tests.mjs --flaky","test:packaged":"node scripts/verify-packaged-cli.mjs","test:postgres":"node scripts/run-lane-files.mjs --no-file-parallelism tests/reconcile-pending-hosted.live.test.ts tests/approvals-reconcile-postgres.live.test.ts tests/audit-read-contract-postgres.live.test.ts tests/audit-record-of-truth.live.test.ts tests/guard-postgres-dedup-live.test.ts tests/audit-workspace-isolation-live.test.ts tests/action-mode-history-workspace-live.test.ts tests/action-mode-history-anchor.live.test.ts tests/wo10-break-glass-visibility.test.ts tests/api-server-provision-abuse.test.ts tests/api-server-guard-ratelimit.test.ts tests/api-server-observability.test.ts tests/api-server-floor-first-run.test.ts tests/api-server-ghost-spend-cap-e2e.test.ts tests/api-server-custom-rule-attestation.test.ts tests/api-server-workspace-boundary.test.ts tests/policy-store.test.ts tests/policy-import-server-durability-gate.test.ts tests/integration/audit-plane-hosted-e2e.test.ts tests/integration/audit-chain-concurrent-writers-live.test.ts tests/integration/hosted-approvals-e2e.test.ts tests/integration/two-tenant-hosted-e2e.test.ts tests/badge-per-workspace-e2e.test.ts tests/parity/transport-differential.test.ts tests/parity/spend-lifecycle.test.ts tests/parity/mode-learning-live.test.ts tests/integration/policy-survives-redeploy.test.ts tests/integration/composed-wrap-hosted-e2e.test.ts tests/bypass-tokens.store.live.test.ts tests/override.integration.live.test.ts tests/override.guard-e2e.live.test.ts tests/override.api.live.test.ts tests/override.api.ssrf.live.test.ts tests/override.api.ssrf.hatch.live.test.ts tests/override.api.actor.live.test.ts tests/status-page/store.postgres.live.test.ts tests/whoami-endpoint.test.ts tests/install-token-handoff-live.test.ts tests/keys-revocation-live.test.ts tests/email-precedence-live.test.ts tests/cli-keys.test.ts tests/verified-ownership-live.test.ts tests/session-workspace-boundary.test.ts tests/invite-posture-live.test.ts tests/double-charge-fault-injection.test.ts tests/approval-identity.test.ts tests/approval-revocation-bridged.live.test.ts tests/audit-schema-degradation.live.test.ts tests/enforcement-ceiling-live.test.ts tests/enforcement-ceiling-dashboard.test.ts tests/durable-idempotency-claim.test.ts tests/durable-claim-local-live.test.ts tests/durable-claim-concurrency-live.test.ts tests/durable-claim-latency-live.test.ts tests/migrate-saas-fresh-database.live.test.ts tests/editor-hosted-registration-live.test.ts tests/editor-handoff-live.test.ts tests/editor-token-dashboard-live.test.ts tests/editor-connect-live.test.ts tests/code-map-endpoint.live.test.ts tests/code-map-reader.live.test.ts tests/code-map-hosted-find.live.test.ts tests/code-map-read-does-not-starve.live.test.ts tests/coverage-hosted.live.test.ts tests/code-map-e2e.live.test.ts tests/instrument-e2e.live.test.ts tests/instrument-coverage-bridged.live.test.ts tests/modes-read-failure-live.test.ts tests/integration/rollback-without-control-plane.test.ts tests/audit-export-paging.live.test.ts tests/breakglass-hosted-control.live.test.ts tests/hosted-register-on-wrap.live.test.ts tests/hosted-actions-list-sees-registration.live.test.ts tests/api-server-ensure-provisioning.test.ts tests/signin-provisions-workspace.live.test.ts tests/cli-login-pairing.live.test.ts tests/verify-production-topology.live.test.ts tests/reap-orphaned-pairing-keys.test.ts tests/policy-backfill-boot.live.test.ts tests/bug-report-store.live.test.ts tests/bug-reports-api.live.test.ts tests/bug-reports-preflight.live.test.ts tests/bug-report-worker.live.test.ts tests/bug-attachments-api.live.test.ts tests/bug-report-pipeline.live.test.ts tests/wo13-who-stalled.live.test.ts tests/holds-survive-a-redis-flush.test.ts tests/hosted-read-path-speaks-for-the-tenant.live.test.ts tests/deactivation-is-real-on-hosted.live.test.ts tests/hosted-approval-loop-closes.live.test.ts tests/inventory-truth-on-hosted.live.test.ts tests/control-survives-redis-loss.live.test.ts tests/holds-are-actionable-after-a-flush.test.ts tests/holds-recovered-is-not-a-clean-slate.test.ts tests/anvil-cc-agrees-about-money.test.ts tests/approval-revocation.test.ts tests/internal-usage-cross-tenant.test.ts tests/money-from-writer-to-screen.live.test.ts tests/hosted-control-seed-never-adopts-a-wiped-store.test.ts tests/a-policy-survives-the-studio.hosted.live.test.ts tests/part1-durability-e2e.live.test.ts tests/durable-command-idempotency-live.test.ts tests/deploy-preflights-live.test.ts tests/integration/two-tenant-rate-isolation-e2e.test.ts tests/hosted-fail-open-receipt.live.test.ts tests/every-cent-reconciles-on-postgres.live.test.ts tests/a-stuck-claim-is-reclaimable.live.test.ts tests/a-blocked-exit-is-still-an-ending.live.test.ts tests/spend-caps-postgres-fallthrough.test.ts tests/a-stuck-claim-can-be-settled.live.test.ts tests/a-capped-flip-is-never-reported-as-enforcing.live.test.ts tests/arming-a-gate-that-reaches-nobody.live.test.ts tests/a-retired-variable-is-named-by-the-api.live.test.ts tests/a-settle-touches-only-its-own-claim.live.test.ts","verify:deploy":"node scripts/verify-deploy-topology.mjs","loadtest:ghost":"node scripts/ghost-analyze-loadtest.mjs","patch:homepage":"node scripts/patch-homepage.mjs","prepublishOnly":"node scripts/check-release.mjs && npm run build && node scripts/verify-packaged-cli.mjs --skip-build","score:ghost-ai":"npm run build --silent && node scripts/score-ghost-ai-inference.mjs","test:coldstart":"node scripts/run-lane-files.mjs --no-file-parallelism tests/integration/cold-start-truth-e2e.test.ts","verify:removal":"node --import tsx scripts/verify-removal-lifecycle.mjs","check:dep-audit":"node scripts/check-dep-audit.mjs","eval:agent-pack":"tsx scripts/run-agent-eval.ts","eval:import:llm":"node --import tsx scripts/eval-import.mjs --llm","seed:usage-demo":"node scripts/seed-usage-demo.mjs","backup:pg:if-due":"node scripts/pg-backup.mjs --if-due","build:agent-pack":"node scripts/build-agent-pack.mjs","check:agent-pack":"node scripts/build-agent-pack.mjs --check","check:docs-fresh":"node scripts/check-docs-fresh.mjs","check:ssrf-guard":"node scripts/check-ssrf-guard.mjs","check:ui-honesty":"node scripts/check-ui-honesty.mjs","evidence:release":"node scripts/release-evidence.mjs","fix:money-format":"node scripts/check-money-format.mjs --fix","ghost:intake:dev":"npm run build --silent && PORT=7332 node dist/server.js","preflight:golive":"node scripts/preflight-golive.mjs","reset:blank:list":"node scripts/reset-blank.mjs --list","check:clean-state":"node scripts/check-clean-state.mjs","check:record-mode":"node scripts/check-record-mode.mjs","demo:merchant:gen":"node --import tsx demo-merchant/index.ts generate","ghost:alerts:send":"npm run build --silent && node dist/cli.js ghost alerts --send","ghost:weekly:send":"npm run build --silent && node dist/cli.js ghost weekly-report --send","prove:idempotency":"npm run build --silent && node dist/cli.js prove idempotency","verify:production":"node scripts/verify-production.mjs","check:docs-symbols":"node scripts/check-docs-symbols.mjs","check:money-format":"node scripts/check-money-format.mjs","check:no-self-wrap":"node scripts/check-no-self-wrap.mjs","reap:orphaned-keys":"node scripts/reap-orphaned-pairing-keys.mjs","test:module-shapes":"node scripts/module-shapes-harness.mjs","test:parity:report":"ANVIL_PARITY_REPORT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","test:parity:strict":"ANVIL_PARITY_STRICT=1 node scripts/run-vitest.mjs run --no-file-parallelism tests/parity","check:ci-quarantine":"node scripts/check-ci-quarantine.mjs","check:no-catch-null":"node scripts/check-no-catch-null.mjs","check:resolved-mode":"node scripts/check-resolved-mode.mjs","check:serving-drift":"node scripts/check-serving-drift.mjs","check:tense-honesty":"node scripts/check-tense-honesty.mjs","coldstart:scorecard":"node scripts/cold-start-scorecard.mjs --finalize","demo:merchant:ghost":"node --import tsx demo-merchant/index.ts ghost","demo:merchant:smoke":"node --import tsx demo-merchant/index.ts smoke","ghost:intake:sample":"npm run build --silent && node dist/server.js --open-sample","reset:blank:dry-run":"node scripts/reset-blank.mjs --dry-run","reset:blank:restore":"node scripts/reset-blank.mjs --restore latest","test:coldstart:full":"node scripts/cold-start-harness.mjs","check:beta-readiness":"node scripts/check-beta-readiness.mjs","check:no-self-import":"node scripts/check-no-self-import.mjs","check:parity-origins":"node scripts/parity-origins.mjs --check","check:proof-coverage":"node scripts/check-proof-coverage.mjs","demo:merchant:before":"node --import tsx demo-merchant/index.ts before","drill:redis-recovery":"node scripts/drill-redis-recovery.mjs","ghost:alerts:dry-run":"npm run build --silent && node dist/cli.js ghost alerts --dry-run","ghost:alerts:preview":"npm run build --silent && node dist/cli.js ghost alerts","ghost:weekly:preview":"npm run build --silent && node dist/cli.js ghost weekly-report","migrate:amount-units":"node --import tsx scripts/migrate-amount-units.mjs","migrate:legacy-rules":"node --import tsx scripts/migrate-legacy-custom-rules.mjs","test:ci:expected-red":"node scripts/run-ci-tests.mjs --expected-red","check:control-columns":"node scripts/check-control-columns.mjs","check:ghost-perimeter":"node scripts/check-ghost-perimeter.mjs","check:worker-artifact":"node scripts/check-worker-artifact.mjs","demo:merchant:journey":"node --import tsx demo-merchant/index.ts journey","demo:merchant:protect":"sh demo-merchant/try-protect.sh","gate:production-shape":"node --import tsx scripts/gate3-production-shape.mjs","readiness:bench-smoke":"npm run build --silent && node scripts/readiness-bench-smoke.mjs","build:instrument-entry":"node scripts/build-instrument-entry.mjs","check:instrument-entry":"node scripts/build-instrument-entry.mjs --check","check:stranded-enforce":"node --import tsx scripts/check-stranded-enforce.mjs","check:tenant-fallbacks":"node scripts/check-tenant-fallbacks.mjs","verify:merge-readiness":"node scripts/verify-merge-readiness.mjs","check:mode-blast-radius":"node --import tsx scripts/check-mode-blast-radius.mjs","check:double-charge-nets":"node scripts/check-double-charge-nets.mjs","check:no-raw-tenant-keys":"node scripts/check-no-raw-tenant-keys.mjs","check:one-mode-authority":"node scripts/check-one-mode-authority.mjs","check:durable-claim-settlement":"node scripts/check-durable-claim-settlement.mjs","check:hold-disposition-authority":"node scripts/check-hold-disposition-authority.mjs"},"version":"0.5.6","_npmUser":{"name":"tryanvil","email":"henrymil@usc.edu"},"homepage":"https://anvilcontrol.ai","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"_resolved":"/Users/henrymiller/Desktop/Ledger/Anvil Repo WIP/anvil-publish-0.5.6/useanvil-sdk-0.5.6.tgz","overrides":{"ajv":{"fast-uri":"^3.1.7"},"@ts-morph/common":{"brace-expansion":"^5.0.9"},"express-rate-limit":{"ip-address":"^10.3.1"}},"_integrity":"sha512-wuY3Uxm0AFFOUcJ8WmRu4tebZSRgntXHplhkWTRvHtku4zcePGwMyQ3cv1PUVRbyi08mC6yEvjm/8DiwQ0TG4g==","repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"_npmVersion":"10.8.2","description":"Anvil: execution correctness layer for AI-triggered actions","directories":{},"maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"_nodeVersion":"20.20.2","dependencies":{"pg":"^8.20.0","tsx":"^4.0.0","zod":"^4.4.3","dotenv":"^16.0.0","pdfkit":"^0.18.0","qrcode":"^1.5.4","stripe":"^14.0.0","ioredis":"^5.3.2","ts-morph":"^28.0.0","typescript":"^5.0.0","@anthropic-ai/sdk":"^0.106.0","import-in-the-middle":"^3.3.3","require-in-the-middle":"^8.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"eslintConfig":{"root":true,"rules":{"@typescript-eslint/no-unused-vars":["error",{"argsIgnorePattern":"^_","varsIgnorePattern":"^_","caughtErrorsIgnorePattern":"^_"}]},"parser":"@typescript-eslint/parser","extends":["plugin:@typescript-eslint/recommended"],"plugins":["@typescript-eslint"],"overrides":[{"files":["src/**/*.ts"],"rules":{"no-restricted-imports":["error",{"paths":[{"name":"@useanvil/sdk","message":"Do not self-import the package — src/ IS @useanvil/sdk. Import from the local relative module instead (e.g. './wrap.js'). A self-import resolves to the built dist (absent at typecheck/DTS time) and reds tsc (TS2209), the .d.ts build, and every source test."}],"patterns":[{"group":["@useanvil/sdk/*"],"message":"Do not self-import a subpath of the package. Import from the local relative module instead. A self-import reds tsc (TS2209), the .d.ts build, and source tests."}]}]}}],"parserOptions":{"project":"./tsconfig.json","sourceType":"module"}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^7.3.6","jsdom":"^29.1.1","eslint":"^8.57.0","vitest":"^3.2.7","@types/pg":"^8.20.0","inter-font":"^3.19.0","@types/node":"^20.11.30","ioredis-mock":"^8.0.0","@types/pdfkit":"^0.17.5","@types/qrcode":"^1.5.6","@playwright/test":"^1.60.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"peerDependencies":{"ai":">=3.0.0","@langchain/core":">=0.1.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@langchain/core":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.5.6_1789891627860_0.18580413505532167"}}},"time":{"created":"2026-05-04T23:32:38.461Z","modified":"2026-09-20T08:07:08.349Z","0.1.0":"2026-05-04T23:32:38.870Z","0.1.1":"2026-05-06T02:50:33.713Z","0.1.2":"2026-05-06T02:57:39.849Z","0.1.3":"2026-05-06T03:00:40.788Z","0.1.4":"2026-05-07T06:05:38.323Z","0.1.5":"2026-05-07T06:50:46.966Z","0.1.6":"2026-05-23T02:47:57.397Z","0.1.7":"2026-06-25T17:38:45.145Z","0.1.8":"2026-06-26T00:30:12.026Z","0.1.9":"2026-06-26T08:19:19.263Z","0.1.10":"2026-07-03T00:56:38.624Z","0.1.11":"2026-07-10T00:07:06.587Z","0.2.0":"2026-07-19T06:01:55.141Z","0.2.1":"2026-07-19T06:52:00.589Z","0.3.0":"2026-07-25T04:05:34.766Z","0.3.1":"2026-07-25T15:44:14.017Z","0.3.2":"2026-07-25T15:54:16.688Z","0.3.3":"2026-07-26T19:37:35.634Z","0.3.4":"2026-08-01T21:22:23.925Z","0.3.5":"2026-08-02T17:57:59.299Z","0.3.6":"2026-08-04T04:37:54.095Z","0.3.7":"2026-08-12T06:14:45.752Z","0.3.8":"2026-08-15T08:41:24.894Z","0.4.0":"2026-08-16T00:39:35.967Z","0.4.1":"2026-08-16T01:51:53.676Z","0.4.2":"2026-08-16T02:25:49.724Z","0.5.0":"2026-08-16T07:29:27.235Z","0.5.1":"2026-08-17T19:26:56.744Z","0.5.2":"2026-08-23T19:41:39.829Z","0.5.3":"2026-09-08T04:40:22.462Z","0.5.4":"2026-09-10T04:27:50.506Z","0.5.5":"2026-09-18T09:54:04.346Z","0.5.6":"2026-09-20T08:07:08.161Z"},"bugs":{"url":"https://anvilcontrol.ai/security","email":"henry@anvilcontrol.ai"},"author":{"url":"https://anvilcontrol.ai","name":"Anvil","email":"henry@anvilcontrol.ai"},"license":"BUSL-1.1","homepage":"https://anvilcontrol.ai","keywords":["idempotency","guardrails","ai-agents","policy-enforcement","audit-log","payments","llm-tools"],"repository":{"url":"git+https://github.com/2millerhenry/anvil.git","type":"git"},"description":"Anvil: execution correctness layer for AI-triggered actions","maintainers":[{"name":"tryanvil","email":"henrymil@usc.edu"}],"readme":"# Anvil\n\nAnvil is an execution correctness layer for risky actions.\n\nPut it in front of the calls that can move money, mutate a system, trigger an irreversible workflow step, or cause an expensive side effect if they happen twice.\n\nAnvil helps teams make sure those actions:\n- do not run twice by accident\n- stay inside policy before they run\n- leave behind durable receipts operators can inspect later\n- help verify whether the downstream side effect actually happened\n- can be observed safely in ghost before enforce\n- stay under centralized rollout control\n- leave an operational record teams can trust\n\nThe point is not “more infrastructure.” The point is fewer bad outcomes, safer automation rollout, less hand-rolled defensive code, and clearer proof that AI or software is operating correctly in production.\n\n**Docs:** [anvilcontrol.ai/docs](https://anvilcontrol.ai/docs) — [Quickstart](https://anvilcontrol.ai/docs/quickstart) · [Ways to protect an action](https://anvilcontrol.ai/docs/ways-to-protect-an-action) · [CLI Reference](https://anvilcontrol.ai/docs/cli-reference) · [Dashboard](https://app.anvilcontrol.ai/app)\n\n## Quick start — wrap one action in 60 seconds\n\nOne command finds a risky call, wraps it, and puts it on your dashboard in **ghost mode** — Anvil watches and records what it *would* have caught while your code runs exactly as before.\n\n```bash\nnpx -y @useanvil/sdk@latest protect payment.charge\n```\n\nIt asks for a work email the first time (that creates your workspace), writes `ANVIL_API_KEY`, `ANVIL_API_BASE_URL`, and `ANVIL_MODE=ghost` into your `.env`, and opens your dashboard. No Redis, no database, no infrastructure — the hosted control plane is doing that work.\n\nAlready signed in at [app.anvilcontrol.ai](https://app.anvilcontrol.ai/app)? Run `anvil login` first and this machine joins that account instead of creating a second one.\n\nHere's what lands in your source:\n\n```ts\nimport { wrap, key } from '@useanvil/sdk';\n\nconst wrappedCharge = wrap({\n  fn: (...args) => stripe.charges.create(...args),\n  key: ({ args }) => key.for('payment.charge', String(args[0].orderId)),\n  action: 'payment.charge',\n  amount: ({ args }) => args[0]?.amount,   // integer cents\n});\n```\n\nWhen the ghost log shows Anvil catching what you expected, flip that one action to **enforce** from the dashboard. Same code; the verdict changes.\n\n> **Wiring it by hand instead?** `safe.wrap` and `guard()` are the same engine without the codemod — but note that an SDK configured by hand declares **enforce** by default and needs Redis, so set `ANVIL_MODE=ghost` while you're watching. `anvil protect` writes that for you, which is why it's the recommended first run.\n\n> **Don't want a code edit at all?** For the eight calls Anvil ships adapters for — across `stripe`, `@octokit/rest`, `twilio` and `resend` — add one flag to your start command and register the action from the dashboard — see below.\n\n## No code edit at all — one flag, once\n\nWrapping a call is the most precise way to get Anvil into the path, and it costs a code edit per call site. For the money calls Anvil already understands, there is a second way that costs one line in your start command and nothing else:\n\n```bash\nnode --import @useanvil/sdk/init app.js\n```\n\nAnvil attaches to your process the way Datadog, Sentry and OpenTelemetry do — a module hook, installed before your code loads — and puts itself in the call path of the Stripe calls you already have. No file is edited. No call site changes.\n\n**Nothing happens until you say so.** A covered call is a *pure pass-through* — a map lookup and a direct call to your original function — until you set a mode for that action in the dashboard. No policy evaluation, no receipt, no ghost slot spent, no data sent. Adding the flag to a service you never configure costs you nothing.\n\nOnce you set a mode, it takes effect on the **next call** — no restart:\n\n| What Anvil says | What it means |\n|---|---|\n| `payment.refund — live via stripe@14.25.0` | The hook is installed and **inert**, waiting for a mode. |\n| `not covered: version 21.0.0 is outside the tested range 12–18` | Deliberately **not patched**. Your call is untouched and runs exactly as before. |\n| *(absent)* | No running process has reported it. Absence is never coverage. |\n\nCovered today, eight calls across four packages: `payment.refund`, `payment.charge`, `payment.payout`, `payment.transfer` (via `stripe`, tested 12–18) · `github.repo.delete`, `github.ref.delete` (via `@octokit/rest`, stable 21–22) · `sms.send` (via `twilio`, stable 5–6) · `email.send` (via `resend`, stable 5–6). Everything else still uses `safe.wrap()` or `npx @useanvil/sdk protect` — the honest answer for your own internal functions, and it always will be.\n\nSee what a live process actually reports:\n\n```bash\nnpx -y @useanvil/sdk@latest doctor\n```\n\nTurn it off without changing your start command: `ANVIL_NO_INSTRUMENT=1`.\n\nTwo things worth knowing before you rely on it. Anvil only patches versions it has been **tested against** — outside that range it refuses and says so, because a patched-but-wrong adapter is the one failure that could break your payments. And an adapter that throws while attaching disables itself and leaves the module completely unmodified: instrumentation is a guard, never a dependency.\n\n## Production Truth\n\nFor design-partner production deployments, the durable model is:\n\n- Postgres is the source of truth for receipts, receipt events, audit records, durable commands, workflow recovery state, and control history.\n- Redis is coordination only: locks, leases, counters, and short-lived in-flight coordination.\n- Local JSONL is optional debug/export output only.\n\nPractical consequence:\n- if Postgres is unavailable before a risky side effect starts, Anvil fails closed\n- if a process crashes after the provider may have accepted the action, the durable attempt record is still in Postgres\n- if Redis is flushed, recovery still works because the durable truth is not in Redis\n\nRuntime boot rule:\n- if `ANVIL_POSTGRES_URL` is set, Anvil now auto-registers the built-in `PostgresPersistenceAdapter` at startup\n- you only need to call `registerPersistenceAdapter()` yourself when you want a custom adapter or test double\n\nLock lease invariant:\n- `ANVIL_LOCK_TTL_SECONDS` defaults to `30` and must be longer than the slowest real `execute()` call.\n- `ANVIL_LOCK_KEEPALIVE_ENABLED=true` renews the Redis lock every half-TTL while the action is still running.\n- Example: if a Stripe charge can take `25s`, a `30s` lease leaves only `5s` of margin. That is risky in production. Increase the TTL rather than relying on luck.\n\n## Repo Layout\n\nThe repo is organized around a few clear layers:\n\n- `src/`: runtime SDK, CLI, control plane, receipts, policies, and UI generators\n- `src/ui/`: generated local product surfaces like Start, Ghost Report, Policy Studio, and Control Center\n- `src/sinks/`: optional output adapters for observability and local metrics\n- `policies/`: bundled starter and production-ready policy files\n- `demo/`: runnable demos\n- `eval/fixtures/`: bundled Ghost evaluation datasets\n- `scripts/`: verification, benchmarking, evidence, and ops drills\n- `tests/`: unit and integration coverage\n- `docs/`: product docs, PRDs, and operations notes\n- `preview/`: static prototype and marketing previews\n- `artifacts/`: generated local output only, not source of truth\n- `dist/`: build output only\n\n## Ghost Modes\n\nThere are two different Ghost stories in this repo, and they are not the same thing:\n- Runtime ghost mode is the SDK/CLI/app rollout mode for live traffic. It still runs the real provider call and returns the real result or thrown error to the app. It only records what Anvil would have done as a separate shadow decision: `would_allow`, `would_dedup`, `would_block`, or `would_unknown`.\n- Ghost replay reconstructs execution truth from messy logs after the fact.\n\nGhost replay works like this:\n- parse raw logs into normalized events\n- group normalized events into entities\n- run deterministic inference for attempts, final status, retries, and duplicates\n- optionally attach AI only for narrow low-confidence unknown cases\n\nThe deterministic layer is the source of truth. AI is optional enrichment only and never gets to rewrite a deterministic success or failure.\n\nRun the Ghost pipeline directly:\n\n```bash\nnpm run eval -- --logs ./eval/fixtures/adversarial_logs.ndjson --truth ./eval/fixtures/adversarial_ground_truth.json --out ./artifacts/ghost-eval\n```\n\nThat writes:\n- `artifacts/.../summary.json`\n- `artifacts/.../comparisons.json`\n- `artifacts/.../operations.json`\n\nPractical rule:\n- If it defines behavior, it belongs in `src/`, `policies/`, `tests/`, or `docs/`.\n- If it is generated by a command, it belongs in `artifacts/` or `dist/`.\n\n### Runtime Ghost Mode v2 Migration\n\nOld runtime ghost behavior skipped the protected `execute()` callback and returned synthetic runtime statuses such as `blocked`, `duplicate`, or `executed` with `result = null`. That was wrong for live traffic because enabling ghost could suppress real side effects or break caller-visible return contracts.\n\nGhost Mode v2 fixes that contract:\n- `execute()` still runs in runtime ghost mode.\n- The app still gets the real return value or the real thrown error.\n- The top-level runtime `status` is the real execution outcome.\n- The shadow decision now lives in `response.ghost` and audit `record.ghost` as `would_allow`, `would_dedup`, `would_block`, or `would_unknown`.\n- Ghost observation state is kept separate from enforce-mode idempotency state.\n\nFor the runtime hot-path map, Redis round-trip counts, benchmark command, and provider-facing idempotency audit, see [`docs/GHOST_MODE_V2_GA_READINESS.md`](docs/GHOST_MODE_V2_GA_READINESS.md).\n\n## Run the full local experience (this repo)\n\n1. Install dependencies:\n\n```bash\nnpm install\n```\n\n2. Start with the guided front door:\n\n```bash\nanvil start\n```\n\nThat command now writes the Start page, runs a protected local execution, blocks the duplicate replay, and prints a real receipt path so the first experience ends with proof instead of setup trivia.\n\n3. Create your local config if you want a `.env` scaffold:\n\n```bash\nnpm run init\n```\n\n4. Check your environment:\n\n```bash\nnpm run doctor\n```\n\nBy default, runtime installs now start in `ANVIL_MODE=enforce`. Switch to `ANVIL_MODE=ghost` explicitly when you want observe-only rollout on real traffic.\n\nIf you are bringing up production durability:\n\n```bash\nnpm run db:migrate\n```\n\n5. Re-run the dead-simple local demo directly any time:\n\n```bash\nnpm run demo\n```\n\n6. See value immediately with the built-in ghost sample:\n\n```bash\nnpm run ghost:sample\n```\n\n7. Measure runtime overhead on your own Redis before rollout changes:\n\n```bash\nnpm run build --silent\nnpm run bench:guard\n```\n\nThat benchmark compares `enforce` and runtime `ghost` in separate child processes and reports the delta in throughput plus average and p95 latency.\n\n8. Run the duplicate-prevention demo with a Stripe test key:\n\n```bash\nnpm run demo:stripe -- --stripe-key sk_test_...\n```\n\n9. For existing product code, start with the default adoption namespace:\n\n```ts\nimport { safe } from '@useanvil/sdk';\n```\n\nThere is one mental model: **point Anvil at the risky thing and protect it.** You do\nnot have to know Anvil's primitive taxonomy first.\n\n- `safe.protect(...)` — protect one inline risky side effect.\n- `safe.wrap(...)` — protect an existing function without changing its contract.\n\nDescribe the risky call in plain business terms and Anvil infers the surface\n(payment / subscription / external mutation / agent step) and applies the right\nkeying, metadata, reporting vocabulary, and policy defaults automatically:\n\n```ts\nimport { safe } from '@useanvil/sdk';\n\n// Inferred as a payment charge — keyed on orderId, reported as payments.charge.\nawait safe.protect({\n  orderId,\n  amount: cents,\n  execute: async () =>\n    stripe.charges.create({ amount: cents, currency: 'usd', customer: customerId })\n});\n\n// Inferred as a refund (the `reason` field is the high-confidence refund signal).\nawait safe.protect({ orderId, amount: cents, reason: 'customer_request', execute });\n\n// Inferred as an external mutation — keyed on stable business identity.\nawait safe.protect({\n  provider: 'salesforce', resourceType: 'contact', resourceId, operation: 'update-email',\n  method: 'PATCH', execute\n});\n\n// Inferred as an agent/workflow step — enforces workflow budgets.\nawait safe.protect({ workflow, stepId, toolName, execute });\n\n// Inferred as inbound event processing — dedups a retried webhook on its eventId,\n// so your handler runs exactly once. (Outbound delivery has a deliveryId; inbound never does.)\nawait safe.protect({ eventId: evt.id, provider: 'stripe', execute: () => handleEvent(evt) });\n\n// Inferred as a payout / transfer — keyed on the durable payout/transfer id.\nawait safe.protect({ payoutId, amount: cents, execute });\nawait safe.protect({ transferId, amount: cents, destinationAccount, execute });\n\n// Inferred as an OUTBOUND webhook delivery — keyed on eventId + deliveryId.\n// (An eventId WITHOUT a deliveryId is inferred as inbound webhook.received instead.)\nawait safe.protect({ endpoint, eventId, deliveryId, provider: 'stripe', execute });\n\n// Inferred as an email send — keyed on messageId + recipient.\nawait safe.protect({ messageId, recipient, execute });\n\n// Inferred as a support ticket create — keyed on provider + externalCaseId.\nawait safe.protect({ provider: 'zendesk', externalCaseId, execute });\n```\n\n`execute()` receives the same computed context the explicit surface would hand it,\nso migrating loses nothing — most importantly the `idempotencyKey` to forward to\nyour provider for provider-level idempotency, plus the resolved `surface`, the\nbusiness `metadata`, the provider-ready `providerMetadata`, and any `workflow`:\n\n```ts\nawait safe.protect({\n  paymentIntentId,\n  amount: cents,\n  confirm: true,\n  execute: async ({ idempotencyKey, providerMetadata }) =>\n    stripe.paymentIntents.confirm(paymentIntentId, { idempotencyKey, metadata: providerMetadata })\n});\n```\n\nAnvil leads with inference but never guesses an idempotency key. When the data is\nambiguous (e.g. a `paymentIntentId` that could be a confirm *or* a capture), it\nthrows `AnvilAmbiguousProtectionError` telling you the candidate surfaces and the\nfield — or `as` override — that resolves it. For the confirm/capture case you just\nadd the intent boolean — no taxonomy needed:\n\n```ts\n// Disambiguate a payment intent with a plain business word:\nawait safe.protect({ paymentIntentId, amount: cents, confirm: true, execute }); // → payment.confirm\nawait safe.protect({ paymentIntentId, amount: cents, capture: true, execute }); // → payment.capture\n\n// Or, if you prefer, pin the surface explicitly — same key, same result:\nawait safe.protect({ as: 'payment.capture', paymentIntentId, amount: cents, execute });\n```\n\n`safe.wrap(...)` works the same way; business fields may be plain values or\nfactories of the call context so keys can be derived from arguments:\n\n```ts\nconst createCharge = safe.wrap({\n  fn: stripe.charges.create,\n  orderId: ({ args }) => args[0].metadata.orderId,\n  amount: ({ args }) => args[0].amount\n}); // → inferred payment.charge\n```\n\n**Fully explicit / advanced path.** The productized surfaces are still first-class\nand remain the right choice when you want zero inference or provider-shaped\nnaming. Use them directly, or pin any universal call with `as`:\n- `safe.payments.charge|confirm|capture|refund(...)`\n- `safe.subscriptions.create|change|cancel|resume(...)`\n- `safe.external.mutation(...)`\n- `safe.agent.toolCall(...)` / `safe.agent.step(...)`\n\nYou can also stay fully explicit on `safe.protect`/`safe.wrap` by passing `key`\nand `action` yourself — that is the original contract and is unchanged.\n\n```ts\n// Explicit: you supply the key and canonical action yourself.\nconst charge = await safe.protect({\n  key: safe.key.payment(orderId),\n  action: 'payment.charge',\n  amount: cents,\n  execute: async () =>\n    stripe.charges.create({ amount: cents, currency: 'usd', customer: customerId })\n});\n```\n\n9. Use `guard()` directly only when you explicitly want Anvil's structured response object in your own code:\n\n```ts\nimport { guard, key } from '@useanvil/sdk';\n\nawait guard({\n  key: key.payment('order-8821'),\n  action: 'payment.charge',\n  amount: 4999,\n  execute: async () => ({ ok: true })\n});\n```\n\n`policy` defaults to `stripe-v1`, so you only need to pass it when using a different policy.\n\nPractical rule:\n- Start with `safe.protect()` (inline) or `safe.wrap()` (existing function) and describe the risky thing in business terms. Let Anvil infer the surface.\n- Reach for `safe.payments.*`, `safe.subscriptions.*`, `safe.external.mutation()`, or `safe.agent.toolCall()` when you want to be fully explicit, or pin a universal call with `as`.\n- Pass `key` + `action` to `safe.protect()`/`safe.wrap()` when you want to control the idempotency key yourself.\n- Use `guard()` when you want the full structured `AnvilResponse`.\n\nSafe adoption rule:\n- If a team is unsure which surface to choose, that is exactly the case the universal path is for — `safe.protect({ ...business fields, execute })` and let inference decide.\n- If Anvil throws `AnvilAmbiguousProtectionError`, it is telling you the data is genuinely ambiguous. Add the field it names or pin the surface with `as` — do not work around it, because a wrong key means a wrong dedup decision.\n- Move to direct `guard()` handling only when you actually want downstream code to consume Anvil statuses like `duplicate`, `blocked`, or `unknown`.\n\nUniversal protection — design decisions:\n- **Smart defaults, safe fallbacks — never magic.** Inference keys off stable, structured business fields (provider/resourceId, subscriptionId, paymentIntentId, workflow+stepId+toolName), never on function or variable names. Callee-name heuristics are fine for CLI suggestions but too weak for runtime keying.\n- **Refuse over guess.** When two surfaces are plausible from the same data (confirm vs capture, or a bare `subscriptionId`), Anvil throws instead of guessing. A wrong classification is a wrong idempotency key, which in a dedup engine can mean a double-charge or a swallowed write.\n- **Fail loud on bad input.** Malformed input is rejected up front with `AnvilInvalidProtectionInputError` *before* anything is classified or executed, so a poisoned value can never reach the key, the payload hash, or a budget comparison. A non-finite or negative `amount` (`NaN`/`Infinity`/`-5`) is refused outright — it would otherwise silently defeat budget caps (`NaN > limit` is always `false`) — and a missing/non-function `execute` fails with a clear message instead of a deep crash. Empty or whitespace-only identity fields are treated as absent, so a typo can never key on `\"   \"`.\n- **Name the missing field.** When you are one field short of a valid surface (e.g. an external mutation without `method`, or a `customerId` with no `priceId`), the error names exactly what to add rather than a generic \"could not infer\" — because a confusing error is what pushes people toward hand-rolling keys, the footgun this layer exists to remove.\n- **Single source of truth.** The universal path does not re-implement keying or metadata. It classifies, then dispatches to the existing product surfaces, so Ghost/audit/receipts keep speaking the correct business language for free.\n- **Zero-loss migration (semantic fidelity).** The universal path dispatches to the same surfaces, so the result, the thrown errors (provider errors, `duplicate` replay, `blocked`), the receipts, and the metadata are byte-for-byte what the explicit surface produces. The `execute()` callback receives the same computed context too — `idempotencyKey`, `surface`, `metadata`, `providerMetadata`, `workflow` — so moving an explicit call to the universal form never drops information you were relying on.\n- **Override precedence.** `as` pins the surface; an explicit `key` pins the idempotency key; explicit `action` (on `safe.protect`/`safe.wrap`) keeps the original low-level contract. Explicit always wins over inference.\n- **Backward compatible.** Existing callers that pass `action` (and `key`) are routed down the exact original path, including `wrap`'s lightweight hosted lock/complete protocol. The universal path is purely additive. Hosted mode still works: universal `protect`/`wrap` dispatch through the product surfaces into `guard()`, which has its own full hosted-API path (`ANVIL_API_KEY`), so no local Redis is required.\n\nIntegration proof:\n- See [docs/INTEGRATION_PROOF.md](docs/INTEGRATION_PROOF.md) for four production-style examples: existing backend function, API handler, worker/job, and webhook handler.\n\nProduction deployment:\n- See [docs/OPERATIONS.md](docs/OPERATIONS.md) for the runbook.\n- See [docs/DESIGN_PARTNER_PRODUCTION_ARCHITECTURE.md](docs/DESIGN_PARTNER_PRODUCTION_ARCHITECTURE.md) for the blessed topology.\n\n## What Anvil Is\n\nAnvil is a runtime execution control layer for side-effectful actions.\n\nUse it when an agent, workflow, or service can:\n- move money\n- mutate an external system\n- trigger a step that should not run twice\n\nIn practice, Anvil sits between “request received” and “real-world side effect happens.”\n\nAnvil is strongest on:\n- payments and refunds\n- external API calls\n- workflow steps with real-world side effects\n\n## What Anvil Is Not\n\nAnvil is not:\n- a general workflow engine\n- a broad authorization platform\n- a replacement for business logic or provider-native idempotency\n\nIf a path is read-only or low-risk, Anvil is probably unnecessary.\n\nThe strongest setup is usually:\n- provider-native idempotency where available\n- Anvil around the full side-effectful workflow\n\nThat combination is stronger than either layer alone.\n\n## Common Commands\n\n```bash\nnpm run init\nnpm run doctor\nnpm run start\nnpm run demo\nnpm run cc\nnpm run policy:studio\nnpm run ghost:sample\nnpm run demo:stripe -- --stripe-key sk_test_...\nnpm run verify\n```\n\n## Claude Code / Agent Quick Start\n\n### One-command setup\n\nTurn on every surface at once — the agent pack and the MCP server registration —\nwith a single command (it's all bundled in the package; this just activates it):\n\n```bash\nnpx @useanvil/sdk setup\n```\n\nIt drops the agent guidance for Claude Code / Cursor / Codex, registers the MCP\nserver in `.mcp.json` and `.cursor/mcp.json`, and points you to the editor\nextension. Nothing runs on install and nothing enforces — surfaces are activated\nexplicitly here, and protected calls stay in ghost mode until you flip them.\nPrefer to wire just one surface? Use `anvil init-agents` or `anvil mcp --config`.\n\n### Born protected: the agent pack\n\nThe highest-leverage protection is to never make it a separate step. `init-agents`\nteaches your AI coding tools to write risky calls already wrapped, in ghost mode,\nat generation time:\n\n```bash\nnpx @useanvil/sdk init-agents\n```\n\nIt detects which agents your repo uses and drops one drop-in guidance file for each:\n\n- **Claude Code** → `.claude/skills/anvil-protect/SKILL.md`\n- **Cursor** → `.cursor/rules/anvil.mdc`\n- **Codex / others** → an `AGENTS.md` section\n\nAll three are compiled from a single source ([`agent-pack/anvil-wrap-guidance.md`](agent-pack/anvil-wrap-guidance.md)),\nso every agent writes the byte-identical `wrap({ fn, key, action })` shape. After\nthis, asking any of them to \"add a Stripe charge\" yields code that compiles, runs,\nsits in ghost mode, and shows up in your dashboard — with a durable idempotency key\nor an honest `TODO(anvil)` when one can't be inferred. Reads are never wrapped.\n\n```bash\nnpx @useanvil/sdk init-agents --all      # install for every agent regardless of detection\nnpx @useanvil/sdk init-agents --check    # CI-friendly: exit 1 if a dropped file is stale\n```\n\nThe pack is regenerated on every publish and guarded by a drift test, so the files\nyou install always match the SDK you installed.\n\n### MCP server: protect & introspect from your agent\n\nThe agent pack makes new code born-protected. The **MCP server** lets the agent\nretrofit *existing* calls and verify protection on demand — same codemod, so the\nwraps are byte-identical. It runs locally over stdio and inherits \"which repo /\nwhich file\" from the agent's workspace, so there's nothing to point at.\n\nFive small tools: `find_action`, `protect_action` (wraps the real call in ghost\nmode, returns a unified diff + the durable key it chose or an honest TODO,\nreversible via `.anvil-bak`), `check_protection`, `list_observations`, and\n`set_mode` (self-hosted only — a project with a hosted key sets per-action modes in the\ndashboard, where the change is recorded with an actor and a reason, so `set_mode` refuses\nrather than changing nothing quietly).\n\nConfigure once — no global install (npx fetches it):\n\n```bash\nclaude mcp add anvil -- npx -y @useanvil/sdk mcp\n```\n\nOr add to Claude Code's `.mcp.json` / Cursor's `.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"anvil\": { \"command\": \"npx\", \"args\": [\"-y\", \"@useanvil/sdk\", \"mcp\"] }\n  }\n}\n```\n\nRun `anvil mcp --config` to print this any time. Then just ask: *\"protect the\npayment.charge in this repo\"* — the agent wraps it, shows the diff, done.\n\n### Editor extension (VS Code / Cursor)\n\nFor editing by hand, the [Anvil extension](editor/) surfaces protection right on\nthe call. Risky calls show an inline **⚡ Protect with Anvil** lens (also a\nright-click action and a lightbulb quick-fix); one click previews the wrap as a\ndiff, and on accept it's applied in ghost mode — fully undoable with `Cmd/Ctrl+Z`.\nIt reuses the same codemod, so editor wraps are byte-identical to the CLI and MCP.\nIf a durable key can't be inferred, your cursor lands on the `TODO(anvil)` key to\nfill in. Build the `.vsix` with `cd editor && npm install && npm run package`,\nthen install it in VS Code or Cursor (Cursor runs VS Code extensions unchanged).\n\n### Inline protection\n\nFor AI-triggered payments or API calls, the safest copy-paste path for an existing system is to describe the risky thing and let Anvil infer the surface:\n\n> **Hand-wiring means enforce.** `anvil protect` writes `ANVIL_MODE=ghost` for you; pasting the\n> snippets in this section does not. An SDK configured by hand declares **enforce** by default and\n> needs Redis, so the first call these wrap can be *blocked*, not observed. Put `ANVIL_MODE=ghost`\n> in your `.env` before you paste, and flip it when you have watched real traffic.\n\n```ts\nimport { safe } from '@useanvil/sdk';\n\nawait safe.protect({\n  orderId,\n  // Integer CENTS, on every money action. Omit it and your spend caps and amount thresholds\n  // are dormant: configured in the dashboard, never firing on a real call.\n  amount: cents,\n  execute: async () => stripe.charges.create({\n    amount: cents,\n    currency: 'usd',\n    customer: customerId\n  })\n});\n```\n\nPrefer to pin the key and action yourself? That contract is unchanged:\n\n```ts\nawait safe.protect({\n  key: safe.key.payment(orderId),\n  action: 'payment.charge',\n  amount: cents,\n  execute: async () => stripe.charges.create({ amount: cents, currency: 'usd', customer: customerId })\n});\n```\n\nIf you need to persist the key in a queue or workflow step, round-trip it safely:\n\n```ts\nimport { key, safe } from '@useanvil/sdk';\n\nconst storedKey = safe.key.payment(orderId).toString();\n\nawait safe.protect({\n  key: key.from(storedKey),\n  action: 'payment.charge',\n  amount: cents,\n  execute: async () => doWork()\n});\n```\n\nProduct surface example:\n\n```ts\nimport { safe } from '@useanvil/sdk';\n\nawait safe.payments.confirm({\n  paymentIntentId: 'pi_123',\n  amount: 4999,\n  execute: async ({ paymentIntentId, idempotencyKey }) =>\n    stripe.paymentIntents.confirm(paymentIntentId, {\n      idempotencyKey\n    })\n});\n```\n\nStripe money movement rule:\n- Use `safe.payments.charge(...)`, `safe.payments.confirm(...)`, `safe.payments.capture(...)`, or `safe.payments.refund(...)` as the default path.\n- Key charges and refunds from durable business identity like `orderId`, refund business identity, or the payment intent being acted on. Do not key from request IDs, retry attempts, or webhook delivery IDs.\n- Keep Stripe idempotency turned on with the `idempotencyKey` Anvil gives you, but do not confuse that with full execution correctness.\n\nForward it with `withProviderIdempotency`, which also makes the forwarding **observable** —\nAnvil reports `providerIdempotency: 'forwarded' | 'not_forwarded'` on the response and the audit\nreceipt, and it is never inferred. The generic `guard()` / `safe.wrap()` surfaces receive the\nsame context, so this is no longer adapters-only:\n\n```ts\nimport { safe, key, withProviderIdempotency } from '@useanvil/sdk';\n\nawait safe.protect({\n  action: 'payment.charge',\n  key: key.payment(orderId),\n  amount: cents,\n  execute: (ctx) => stripe.paymentIntents.create(params, withProviderIdempotency(ctx))\n});\n```\n\nWhy bother, when Anvil already deduplicates? Because there is one window Anvil cannot see: after\nyour request is on the wire and before any outcome comes back. Crash there and Anvil's state says\n`pending` at best — safe, but a key a human has to resolve. The provider received the request and\ncan recognise the retry, and it is the only participant that can. Note the asymmetry: Stripe\nretains idempotency keys ~24h, so this is a **24-hour** net over that window, while Anvil's own\ndurable claim is permanent and does not cover the window. Neither replaces the other.\n\nFor a provider called over raw HTTP, `providerIdempotencyHeaders(ctx)` returns\n`{ 'Idempotency-Key': … }` and sets the same flag.\n\nWhat Stripe idempotency alone does not solve:\n- it does not enforce your retry or amount policy before the call fires\n- it does not give operators one durable receipt across retries, duplicates, and unknown outcomes\n- it does not tell you whether a provider timeout is safe to retry without reconciliation\n- it does not protect non-Stripe work around the same money movement path\n\nReplay safety rule:\n- replay is safe only when Anvil captured a replayable original provider result, so duplicate callers can receive the same value without re-running the charge or refund\n- replay is not safe when the original result was not serializable or otherwise not replayable; in that case Anvil preserves the protection decision and throws instead of fabricating a fake provider result\n- when runtime truth is unknown, hold retries until Stripe reconciliation or manual operator review says the next attempt is safe\n\n## Built-In Adapters\n\nPlain English: built-in adapters mean you do not have to hand-build the Anvil wrapper for the most common risky calls.\n\nYour app still performs the real provider call inside `execute`, but Anvil now gives you the recommended key shape, metadata, receipt context, and verification posture by default.\n\nMost application code should prefer `safe.payments.*`, `safe.external.*`, `safe.subscriptions.*`, or `safe.agent.toolCall(...)` first. Reach for `safe.adapters.*` only when the provider-shaped surface is the more natural fit than the product-shaped one.\n\nAdapters return an `AnvilResponse` on purpose. If you need a non-breaking call surface for existing code paths, prefer `wrap()`, `protect()`, or `adapters.protected.*` instead of swapping call sites straight to `guard()` or an adapter response object.\n\nBuilt in today:\n- Stripe charge\n- Stripe refund\n- Stripe payout\n- Stripe transfer\n- Stripe subscription cancel\n- Webhook delivery\n- Email send\n- Support ticket create\n- Generic external API mutation\n\nExample: Stripe charge\n\n```ts\nimport Stripe from 'stripe';\nimport { adapters } from '@useanvil/sdk';\n\nconst stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n\nawait adapters.stripe.charge({\n  orderId: 'order-8821',\n  amount: 4999,\n  execute: async (context) =>\n    stripe.charges.create({\n      amount: context.amount,\n      currency: context.currency,\n      metadata: context.stripeMetadata\n    }, {\n      idempotencyKey: context.idempotencyKey\n    })\n});\n```\n\nSame adapter, production-safe return contract:\n\n```ts\nconst charge = await adapters.protected.stripe.charge({\n  orderId: 'order-8821',\n  amount: 4999,\n  execute: async (context) =>\n    stripe.charges.create({\n      amount: context.amount,\n      currency: context.currency,\n      metadata: context.stripeMetadata\n    }, {\n      idempotencyKey: context.idempotencyKey\n    })\n});\n```\n\nExample: email send\n\n```ts\nimport { adapters } from '@useanvil/sdk';\n\nawait adapters.comms.emailSend({\n  recipient: 'user@example.com',\n  messageId: 'welcome-8821',\n  provider: 'resend',\n  template: 'welcome',\n  execute: async () => sendEmailSomehow()\n});\n```\n\nExample: support ticket create\n\n```ts\nimport { adapters } from '@useanvil/sdk';\n\nawait adapters.support.ticketCreate({\n  provider: 'zendesk',\n  externalCaseId: 'case-8821',\n  customerId: 'cust-42',\n  execute: async () => createTicketSomehow()\n});\n```\n\nIf the risky call is a plain outbound HTTP write, the default path should be `safe.external.mutation(...)`, not a custom wrapper.\n\nMinimum fields for a safe generic mutation:\n- `method`: the write verb that will fire\n- `provider`: the external or internal system being changed\n- `resourceType`: what business object is being changed\n- `resourceId`: the stable business identifier for that object\n- `operation`: the business mutation being attempted\n- `target`: optional request path or URL for operator context\n- `actorId` / `workflow`: optional governance and runtime context when the mutation sits inside a job or agent workflow\n\nKeying rule:\n- Prefer the same stable business identity you would use to explain the mutation to an operator: `provider + resourceType + resourceId + operation`.\n- Do not key by request IDs, trace IDs, queue attempt IDs, retry counters, timestamps, webhook delivery attempts, or process-local UUIDs.\n- If the same business mutation can be sent to multiple URLs over time, keep the same business key and record the URL in `target`.\n\nExamples:\n\nUpdate Salesforce contact\n\n```ts\nimport { safe } from '@useanvil/sdk';\n\nawait safe.external.mutation({\n  provider: 'salesforce',\n  resourceType: 'contact',\n  resourceId: '0038A00000F1ABC',\n  operation: 'update-email',\n  method: 'PATCH',\n  target: '/services/data/v60.0/sobjects/Contact/0038A00000F1ABC',\n  actorId: 'ops-user-7',\n  execute: async () =>\n    salesforce.patch('/services/data/v60.0/sobjects/Contact/0038A00000F1ABC', {\n      Email: 'new-email@example.com'\n    })\n});\n```\n\nPatch HubSpot record\n\n```ts\nawait safe.external.mutation({\n  provider: 'hubspot',\n  resourceType: 'company',\n  resourceId: '9482211',\n  operation: 'patch-lifecycle-stage',\n  method: 'PATCH',\n  target: '/crm/v3/objects/companies/9482211',\n  workflow: {\n    workflowId: 'nightly-crm-sync'\n  },\n  execute: async () =>\n    hubspot.patch('/crm/v3/objects/companies/9482211', {\n      properties: {\n        lifecyclestage: 'customer'\n      }\n    })\n});\n```\n\nCancel account in internal billing API\n\n```ts\nawait safe.external.mutation({\n  provider: 'internal-billing-api',\n  resourceType: 'account',\n  resourceId: account.id,\n  operation: 'cancel-account',\n  method: 'POST',\n  target: `/v1/accounts/${account.id}/cancel`,\n  actorId: req.user.id,\n  execute: async () =>\n    billingClient.post(`/v1/accounts/${account.id}/cancel`, {\n      reason: 'fraud-review'\n    })\n});\n```\n\nCreate support artifact in a third-party tool\n\n```ts\nawait safe.external.mutation({\n  provider: 'zendesk',\n  resourceType: 'ticket',\n  resourceId: caseId,\n  operation: 'create-followup-ticket',\n  method: 'POST',\n  target: '/api/v2/tickets',\n  reconciliationMode: 'custom',\n  execute: async () =>\n    zendesk.tickets.create({\n      external_id: caseId,\n      subject: 'Follow-up required'\n    })\n});\n```\n\nIf you explicitly need the lower-level `AnvilResponse` surface or a workflow-local `api.call` shape, use `adapters.external.mutation(...)`. If you need downstream verification for a generic mutation, register a custom reconciliation adapter.\n\n## Agent Workflow Limits\n\nAnvil now supports first-class workflow limits for agent systems:\n- max tool calls per workflow\n- max retries per workflow\n- max spend budget per workflow\n- max recursion / step depth per workflow\n\nThese limits apply when you pass a `workflowId` into the guarded call. Anvil now auto-tracks tool call count, run-level retry pressure, and guarded spend for the run by default, then enforces those limits before the side effect runs. `stepDepth` remains optional caller-supplied context when the workflow runtime already knows nesting.\n\nExample policy — **this file does not exist until you create it.** Save it as\n`policies/agent-runtime-v1.json` in your project, then either activate it from the dashboard or\nname it explicitly (`config: { workflowId, policy: 'agent-runtime-v1' }`):\n\n```json\n{\n  \"name\": \"agent-runtime-v1\",\n  \"allowed_actions\": [\"api.call\"],\n  \"workflow_limits\": {\n    \"max_tool_calls\": 20,\n    \"max_retries\": 6,\n    \"max_spend\": 20000,\n    \"max_step_depth\": 12\n  },\n  \"limits\": {\n    \"api.call\": {\n      \"max_retries\": 5,\n      \"execute_timeout_ms\": 8000\n    }\n  }\n}\n```\n\nNaming a policy that does not resolve is not a no-op. Ghost observes permissively and logs a\nwarning; **enforce fails closed**, so a snippet that names a policy you never saved turns every\nguarded call into a refusal the day you flip enforcement on. The snippets further down therefore\nname no policy at all — with `policy` omitted, your active policy applies.\n\nPlain English:\n- `max_tool_calls`: stop the workflow before tool loop number 21\n- `max_retries`: stop the workflow before retry count 7\n- `max_spend`: stop the workflow before cumulative guarded amount goes above `$200.00` — the value in **this** example. There are no default limits: the package ships no policies, so every number here is one you author.\n- `max_step_depth`: stop runaway recursion or planner depth before step 13\n\n## Zero-Config Agent Runtime\n\nThe intended system is simple:\n- Anvil is the runtime control point in front of a risky tool call\n- agent and workflow teams use it when a step can mutate a real system, move money, or create an expensive side effect\n- they use it at the exact point where the tool would normally run\n- their workflow changes from “call the provider directly” to “call the provider through Anvil once”\n\nConcrete example:\n- an agent tries to verify a customer five times in the same run after a planner loop starts drifting\n- the developer passes `workflowId`, `stepId`, and `toolName`\n- Anvil derives the business key, blocks duplicate step execution, increments the run counter, and blocks the fifth tool call before the provider sees it\n\nWhat works once a policy of yours is active (the package ships none — see the example above):\n- idempotent tool steps from `workflowId + stepId`\n- automatic per-run tool call counting\n- automatic per-run retry counting when the same guarded work is reclaimed after failure\n- automatic per-run guarded spend accumulation when `amount` is provided\n- explicit `status`, `safeToRetry`, and `nextAction`\n- destructive-action flags with `destructive` and `requiresConfirmation`\n- durable receipts through `anvil.receipts`\n\n## Agent Starter\n\nFor an existing agent or workflow, the lowest-risk path is `safe.agent.toolCall(...)` because it preserves the normal tool return contract while still enforcing Anvil. A full starter lives in [demo/agent-starter.ts](demo/agent-starter.ts).\n\n```ts\nimport { safe } from '@useanvil/sdk';\n\nawait safe.agent.toolCall({\n  workflow: {\n    workflowId: run.id\n  },\n  stepId: `verify-customer-${customerId}`,\n  toolName: 'kyc.verify',\n  action: 'api.call',\n  amount: 80,\n  metadata: {\n    provider: 'persona',\n    customer_id: customerId\n  },\n  execute: async () =>\n    persona.verifications.create({\n      customerId\n    })\n});\n```\n\nWhy this matters:\n- the workflow limits now live in policy, not scattered in agent code\n- Anvil now owns the tool-count, retry-count, and guarded-spend bookkeeping for the guarded steps\n- receipts now capture workflow context cleanly\n- the same runtime can govern both ordinary risky API calls and agent tool execution\n- if the tool succeeds, your workflow still gets the tool result instead of a new wrapper object\n\n## Direct OpenAI Tool Execution\n\nIf your team is using the OpenAI Responses API directly, the minimal safe path is:\n- generate one stable `workflowId` when the agent run starts\n- use the provider's `function_call.call_id` as the Anvil `stepId`\n- hand the model's `function_call` items to `runOpenAIToolCalls(...)`\n- send the returned `function_call_output` items back to `client.responses.create(...)`\n\nThis stays faithful to the normal OpenAI loop. Anvil only governs whether the risky tool is allowed to run and whether a retry should replay or stop.\n\n```ts\nimport OpenAI from 'openai';\nimport { runOpenAIToolCalls, safe } from '@useanvil/sdk';\n\nconst client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n\nconst workflowId = crypto.randomUUID(); // create once per agent run\n\nconst response = await client.responses.create({\n  model: 'gpt-5.2',\n  input: 'Refund order ord_8821 and then cancel the internal billing account if the refund succeeds.',\n  tools: [\n    {\n      type: 'function',\n      name: 'refund_order',\n      description: 'Refund a completed order exactly once.',\n      parameters: {\n        type: 'object',\n        properties: {\n          orderId: { type: 'string' },\n          paymentIntentId: { type: 'string' },\n          amountCents: { type: 'integer' }\n        },\n        required: ['orderId', 'paymentIntentId', 'amountCents']\n      }\n    },\n    {\n      type: 'function',\n      name: 'cancel_billing_account',\n      description: 'Cancel an account in the internal billing API exactly once.',\n      parameters: {\n        type: 'object',\n        properties: {\n          accountId: { type: 'string' },\n          reason: { type: 'string' }\n        },\n        required: ['accountId', 'reason']\n      }\n    }\n  ]\n});\n\nconst toolCalls = response.output.filter((item) => item.type === 'function_call');\n\nconst toolOutputs = await runOpenAIToolCalls({\n  calls: toolCalls,\n  config: { workflowId },\n  tools: {\n    refund_order: {\n      action: 'payment.refund',\n      amount: ({ parsedArguments }) => parsedArguments.amountCents,\n      metadata: ({ parsedArguments }) => ({\n        provider: 'stripe',\n        order_id: parsedArguments.orderId,\n        payment_intent_id: parsedArguments.paymentIntentId\n      }),\n      execute: async ({ orderId, paymentIntentId, amountCents }) =>\n        safe.payments.refund({\n          provider: 'stripe',\n          paymentIntentId,\n          amount: amountCents,\n          businessId: orderId,\n          execute: async () =>\n            stripe.refunds.create({\n              payment_intent: paymentIntentId,\n              amount: amountCents\n            })\n        })\n    },\n    cancel_billing_account: {\n      action: 'api.call',\n      metadata: ({ parsedArguments }) => ({\n        provider: 'internal_billing_api',\n        account_id: parsedArguments.accountId,\n        operation: 'account.cancel'\n      }),\n      execute: async ({ accountId, reason }) =>\n        safe.external.mutation({\n          system: 'internal_billing_api',\n          operation: 'account.cancel',\n          method: 'POST',\n          target: `/accounts/${accountId}/cancel`,\n          businessId: accountId,\n          execute: async () =>\n            billingClient.post(`/accounts/${accountId}/cancel`, { reason })\n        })\n    }\n  }\n});\n\nawait client.responses.create({\n  model: 'gpt-5.2',\n  previous_response_id: response.id,\n  input: toolOutputs\n});\n```\n\nPractical rules:\n- `workflowId` comes from your runtime. It must stay stable across retries of the same agent run.\n- `stepId` comes from OpenAI's `call_id`. Do not replace it with a request-local UUID.\n- If Anvil blocks or cannot confirm execution, `runOpenAIToolCalls(...)` returns a structured `function_call_output` payload the model can reason about.\n- If the exact same tool call is replayed later with the same `call_id`, Anvil replays the original result instead of running the side effect again when replay is safe.\n\n## Direct Anthropic Tool Execution\n\nIf your team is using the Anthropic Messages API directly, the minimal safe path is the same:\n- generate one stable `workflowId` per agent run\n- use the provider's `tool_use.id` as the Anvil `stepId`\n- hand the `tool_use` blocks to `runAnthropicToolUses(...)`\n- append the returned `tool_result` blocks immediately after the assistant tool-use message\n\n```ts\nimport Anthropic from '@anthropic-ai/sdk';\nimport { runAnthropicToolUses, safe } from '@useanvil/sdk';\n\nconst client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n\nconst workflowId = crypto.randomUUID(); // create once per agent run\n\nconst message = await client.messages.create({\n  model: 'claude-opus-4-7',\n  max_tokens: 1024,\n  tools: [\n    {\n      name: 'create_refund_case',\n      description: 'Create a support artifact exactly once for a risky refund incident.',\n      input_schema: {\n        type: 'object',\n        properties: {\n          orderId: { type: 'string' },\n          customerId: { type: 'string' },\n          summary: { type: 'string' }\n        },\n        required: ['orderId', 'customerId', 'summary']\n      }\n    }\n  ],\n  messages: [{ role: 'user', content: 'Create a support case for the customer who saw a duplicate refund attempt.' }]\n});\n\nconst toolUses = message.content.filter((block) => block.type === 'tool_use');\n\nconst toolResults = await runAnthropicToolUses({\n  toolUses,\n  config: { workflowId },\n  tools: {\n    create_refund_case: {\n      action: 'api.call',\n      metadata: ({ input }) => ({\n        provider: 'zendesk',\n        order_id: input.orderId,\n        customer_id: input.customerId,\n        operation: 'ticket.create'\n      }),\n      execute: async ({ orderId, customerId, summary }) =>\n        safe.external.mutation({\n          system: 'zendesk',\n          operation: 'ticket.create',\n          method: 'POST',\n          target: '/api/v2/tickets',\n          businessId: `refund-case:${orderId}`,\n          execute: async () =>\n            zendesk.tickets.create({\n              subject: `Refund incident for ${orderId}`,\n              comment: { body: summary },\n              requester_id: customerId\n            })\n        })\n    }\n  }\n});\n\nawait client.messages.create({\n  model: 'claude-opus-4-7',\n  max_tokens: 1024,\n  messages: [\n    { role: 'assistant', content: message.content },\n    { role: 'user', content: toolResults }\n  ]\n});\n```\n\nPractical rules:\n- `workflowId` is your run identity, not Anthropic's request id.\n- `tool_use.id` is the step identity. That is what makes duplicate retries collapse onto the same guarded execution.\n- Blocked or unknown outcomes come back as `tool_result` blocks with `is_error: true`, so Claude can reason about the stop condition instead of blindly retrying.\n- If the tool use is retried after a successful completion, Anvil returns the prior result and does not run the side effect again.\n\n## Framework Integrations\n\nFramework wrappers are the right choice when your team already lives inside that framework's tool loop and wants to keep the framework ergonomics intact.\n\nRecommended path:\n- use the direct OpenAI and Anthropic integrations when you are already calling those provider SDKs directly\n- use `withAnvilGuard(...)` for Vercel AI SDK when your tool execution already runs through `tool()`\n- use `anvilToolkit(...)` for LangChain or LangGraph when your tools already run through `invoke()`\n\nThe trust boundary is simple:\n- `workflowId` must come from your runtime and stay stable across retries of the same run\n- `stepId` must come from a stable per-tool-call identity if the framework can provide one\n- if the framework cannot provide stable step identity, Anvil can still enforce workflow budgets, but durable per-call replay semantics become weaker\n\n## Vercel AI SDK\n\n`withAnvilGuard(...)` is the production path when your tools execute through the Vercel AI SDK.\n\nWhat it guarantees:\n- if the SDK provides `toolCallId`, Anvil uses it as the guarded `stepId`\n- repeated execution of the same `toolCallId` replays the original result when replay is safe\n- blocked or unknown outcomes throw readable tool errors so the model can adapt\n\nWhat it does not guarantee unless the SDK provides `toolCallId`:\n- durable call-level deduplication across retries outside the current process\n\n```ts\nimport { generateText, tool } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { z } from 'zod';\nimport { withAnvilGuard } from '@useanvil/sdk/integrations/vercel-ai';\n\nconst workflowId = request.id; // stable for this agent run\n\nconst tools = withAnvilGuard(\n  {\n    refund_order: tool({\n      description: 'Refund an order exactly once.',\n      parameters: z.object({\n        orderId: z.string(),\n        paymentIntentId: z.string(),\n        amountCents: z.number().int().positive()\n      }),\n      execute: async ({ orderId, paymentIntentId, amountCents }) =>\n        stripe.refunds.create({\n          payment_intent: paymentIntentId,\n          amount: amountCents,\n          metadata: { orderId }\n        })\n    }),\n    cancel_billing_account: tool({\n      description: 'Cancel an account in the internal billing API exactly once.',\n      parameters: z.object({\n        accountId: z.string(),\n        reason: z.string()\n      }),\n      execute: async ({ accountId, reason }) =>\n        billingClient.post(`/accounts/${accountId}/cancel`, { reason })\n    })\n  },\n  {\n    workflowId,\n    actions: {\n      refund_order: 'payment.refund',\n      cancel_billing_account: 'api.call'\n    },\n    requireToolCallId: true\n  }\n);\n\nawait generateText({\n  model: openai('gpt-5.2'),\n  tools,\n  prompt: 'Refund order ord_8821 and cancel the internal billing account.'\n});\n```\n\nOperational rule:\n- set `requireToolCallId: true` if you want the integration to fail fast instead of silently falling back to a generated local step id\n\n## LangChain And LangGraph\n\n`anvilToolkit(...)` is the right wrapper when your tools already execute through LangChain.\n\nThe honest default:\n- generic LangChain does not expose a stable per-tool-call id through this wrapper surface\n- Anvil therefore generates a fresh local `stepId` by default\n- that still enforces workflow-level tool counts, retry budgets, and spend budgets\n- it does not give durable per-call deduplication across process restarts unless you provide a stable `getStepId(...)`\n\n```ts\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { AgentExecutor, createOpenAIFunctionsAgent } from 'langchain/agents';\nimport { anvilToolkit } from '@useanvil/sdk/integrations/langchain';\n\nconst workflowId = request.id; // stable for this agent run\n\nconst tools = anvilToolkit(\n  [\n    new DynamicStructuredTool({\n      name: 'refund_order',\n      description: 'Refund an order exactly once.',\n      schema: refundSchema,\n      func: async ({ orderId, paymentIntentId, amountCents }) =>\n        stripe.refunds.create({\n          payment_intent: paymentIntentId,\n          amount: amountCents,\n          metadata: { orderId }\n        })\n    }),\n    new DynamicStructuredTool({\n      name: 'patch_salesforce_contact',\n      description: 'Patch a Salesforce contact exactly once.',\n      schema: salesforceSchema,\n      func: async ({ contactId, email }) =>\n        salesforce.patch(`/services/data/v60.0/sobjects/Contact/${contactId}`, {\n          Email: email\n        })\n    })\n  ],\n  {\n    workflowId,\n    actions: {\n      refund_order: 'payment.refund',\n      patch_salesforce_contact: 'api.call'\n    }\n  }\n);\n```\n\nIf you are in LangGraph and your runtime already has durable step identity, pass it in:\n\n```ts\nconst tools = anvilToolkit(myTools, {\n  workflowId: graphThreadId,\n  actions: {\n    refund_order: 'payment.refund'\n  },\n  getStepId: ({ toolName, options }) => {\n    const configurable = options?.configurable as { checkpoint_id?: string; task_id?: string } | undefined;\n    if (!configurable?.task_id) return undefined;\n    return `langgraph:${toolName}:${configurable.task_id}`;\n  }\n});\n```\n\nOperational rule:\n- if you cannot provide a durable `getStepId(...)`, trust `anvilToolkit(...)` for workflow budgets and policy enforcement, not for provider-style per-call replay across restarts\n\nFramework retry semantics:\n- replayable duplicate: framework wrapper returns the original tool result\n- non-replayable duplicate: framework wrapper throws a clear Anvil error instead of re-running the side effect\n- blocked or unknown outcome: framework wrapper throws a readable error so the framework can surface it back into the loop\n- conflict: if the winning result is replayable, the wrapper returns it; otherwise it throws and tells the caller to wait and inspect the receipt\n\n## Runtime Response Contract\n\nEvery guarded call now returns or persists the same high-signal runtime fields:\n- `status`: `executed`, `duplicate`, `blocked`, or `unknown`\n- `safeToRetry`: whether a retry is currently safe\n- `nextAction`: `none`, `retry`, `do_not_retry`, `reconcile`, or `review`\n- `destructive`: whether the action looks irreversible by default\n- `requiresConfirmation`: whether the caller should force an explicit confirmation step\n\nExample unknown outcome:\n\n```ts\nconst response = await agent.toolCall({\n  workflow: { workflowId: run.id },\n  stepId: 'issue-refund',\n  toolName: 'stripe.refunds.create',\n  action: 'payment.refund',\n  amount: 15000,\n  metadata: {\n    operation: 'refund'\n  },\n  execute: async () => stripe.refunds.create({ payment_intent: paymentIntentId, amount: 15000 })\n});\n\nif (response.status === 'unknown') {\n  console.log(response.safeToRetry, response.nextAction);\n}\n```\n\n## Receipts API\n\nThe simplest operator surface is now:\n\n```ts\nimport { anvil } from '@useanvil/sdk';\n\nconst recent = anvil.receipts.list({ action: 'payment.charge', limit: 10 });\nconst receipt = anvil.receipts.show(recent[0]!.id);\n```\n\nIf you need explicit lifecycle control for long-lived runs:\n\n```ts\nconst current = await anvil.workflowState.read(run.id);\nawait anvil.workflowState.reset(run.id);\n```\n\n8. Open the visual policy editor:\n\n```bash\nanvil policy studio\n```\n\nThis writes a self-contained HTML policy editor you can open in a browser, tune visually, and download as valid Anvil policy JSON.\n\n## Tamper-evident receipts\n\nEvery decision Anvil makes is written to an append-only audit log. Set one secret to make that log **cryptographically tamper-evident**:\n\n```bash\nexport ANVIL_AUDIT_SIGNING_KEY=\"$(openssl rand -hex 32)\"   # any 32+ char secret\n```\n\nWith the key set, each audit record is HMAC-SHA-256 **hash-chained** to the record before it — altering, deleting, or reordering any past record breaks the chain. Without the key the log is still append-only; it just isn't cryptographically signed, and the dashboard and CLI say exactly that (never more).\n\nCheck the chain at any time, from the CLI or over HTTP:\n\n```bash\nanvil verify                                 # walks the chain, reports the first break if any\ncurl <your-anvil-server>/api/audit/verify    # returns whether signing is enabled + whether the chain verifies\n```\n\nIt is off by default so a fresh install never claims a guarantee it isn't making — and it's the one trust feature worth turning on the day you start moving real money.\n\n## Overrides — the human escape valve\n\nEnforcement is only trustworthy if there's a clean way out when it's wrong. `AnvilBlockedError` (thrown by the wrappers on every enforce-mode block) exposes `retryable: true` — a stable, typed contract any retry queue can pattern-match on to keep a job alive while an operator decides. Combined with the **Override** button in the Actions dashboard, one wrongly-blocked call becomes a two-click fix, not a \"flip the kill switch\" moment.\n\n**Zero-touch: retry queue re-fire.** If your app runs guarded calls inside a retry queue (BullMQ, Sidekiq, Temporal, Rails ActiveJob), you already get the magical path for free. Just re-throw:\n\n```ts\nimport { safe, AnvilBlockedError } from '@useanvil/sdk';\n\n// BullMQ processor\nexport async function process(job) {\n  try {\n    return await safe.protect({ key: `pay:${job.data.orderId}`, action: 'payment.charge',\n                                 execute: () => chargeCustomer(job.data) });\n  } catch (err) {\n    if (err instanceof AnvilBlockedError) throw err;  // retryable → BullMQ keeps trying\n    throw err;\n  }\n}\n```\n\nNow when an operator arms an override in the dashboard, the queue's next backoff cycle re-hits `guard()`, consumes the token, and the charge executes — zero additional clicks.\n\n**Same shape without a queue — try/catch:**\n\n```ts\ntry {\n  await safe.protect({ key, action, execute });\n} catch (err) {\n  if (err instanceof AnvilBlockedError) {\n    // Point ops at err.overrideStatusUrl — the deep-link opens the row where they'd\n    // click Override. On the next retry, guard() consumes the token automatically.\n    notify.slack(`Anvil blocked ${err.durableKey}: ${err.blockReason}. Review: ${err.overrideStatusUrl}`);\n  }\n  throw err;\n}\n```\n\n**Instant retry: workspace webhook + dispatcher.** For synchronous requests / admin actions / apps without a queue, the \"Retry now\" button in the dashboard dispatches to a workspace-configured webhook (HMAC-signed). Wire the receiver with `createRetryDispatcher`:\n\n```ts\n// app/anvil/retry/route.ts (Next.js App Router)\nimport { createNextRetryDispatcher } from '@useanvil/sdk';\nimport { chargeCustomer, sendEmail } from '@/lib/actions';\n\nexport const POST = createNextRetryDispatcher({\n  handlers: {\n    'payment.charge':    (payload) => chargeCustomer(payload),\n    'notification.send': (payload) => sendEmail(payload)\n  }\n});\n```\n\n```ts\n// Express — mount with express.raw() so the dispatcher can HMAC-verify the exact\n// wire bytes. `express.json()` re-serializes the payload before verification and\n// can produce false 401s if any middleware reformats the body.\nimport express from 'express';\nimport { createRetryDispatcher } from '@useanvil/sdk';\nconst app = express();\napp.post(\n  '/anvil/retry',\n  express.raw({ type: 'application/json', limit: '1mb' }),\n  createRetryDispatcher({\n    handlers: {\n      'payment.charge':    (p) => chargeCustomer(p),\n      'notification.send': (p) => sendEmail(p),\n    }\n  })\n);\n```\n\nSet `ANVIL_RETRY_DISPATCH_SECRET` to the secret shown once in the dashboard settings, deploy, and Retry now clicks execute your guarded call within a couple seconds. If the caller function throws, Anvil surfaces the error inline on the row — the override stays armed so the operator can Retry again or cancel.\n\nEvery override is recorded as a `human_override` audit row, cross-linked to the original blocked row — visible in the Impact tab and in `anvil verify`. The feature is off by default; enable with `ANVIL_OVERRIDE_ENABLED=true` on both the SDK caller and the dashboard server. See [docs/OVERRIDE_ACTION_SPEC.md](./docs/OVERRIDE_ACTION_SPEC.md) for the full data + security model.\n\n## Start Here If You Are New\n\nIf you only want the easiest path to understanding the product, run:\n\n```bash\nanvil start\n```\n\nThat writes `./artifacts/anvil-start.html`, a simple guided home page that explains:\n- what Anvil does in plain English\n- which command to run first\n- how ghost mode, policies, and enforce mode fit together\n- the fastest path for business users and the fastest path for engineers\n\n## Why Teams Use It Instead Of Hand-Rolling\n\nTeams usually do not adopt Anvil just for a Redis lock.\n\nThey adopt it because it combines:\n- duplicate prevention\n- policy enforcement before risky execution\n- action-specific required business context when a path needs stronger guardrails\n- durable execution receipts and unknown-outcome recovery\n- downstream reconciliation when teams need to verify real provider truth\n- explicit unknown-outcome handling\n- audit visibility and ghost-to-enforce rollout\n- centralized rollout control across services\n- per-action defaults like retries, amount caps, and timeouts\n\nThat is the part most in-house versions either skip or only discover after incidents.\n\nThe simple reason to wrap the call is:\n\n- the expensive mistake is in execution, not in the request object\n- the painful incident is the charge, refund, workflow step, or external mutation happening twice or outside policy\n- the thing teams need in production is one product that covers prevention, policy, receipts, recovery, rollout safety, and operational visibility together\n\nThat is what Anvil is for.\n\n## First Production Path\n\nThe best first path to protect is usually:\n- high-value enough to matter\n- common enough to produce real signal\n- simple enough that unknowns can be investigated quickly\n\nGood examples:\n- `payment.charge`\n- `payment.refund`\n- one external API step with clear ownership\n\n## CLI\n\n```bash\nanvil start\nanvil init\nanvil init-agents\nanvil mcp --config\nanvil doctor\nanvil policy studio\nanvil policy export refunds-runbook\nanvil policy export refunds-runbook --format md --out ./docs\nanvil ghost --sample\nanvil ghost --logs ./your-logs.ndjson\nanvil ghost --logs ./your-logs.ndjson --report ./artifacts/anvil-ghost-report.html\nanvil control show\nanvil receipts list --current-status unknown\nanvil receipts inspect <receipt-id>\nanvil receipts resolve <receipt-id> manual_review_required --note \"Investigate provider outcome\"\nanvil receipts reconcile-auto <receipt-id>\nanvil control resolve checkout-service payment.refund\nanvil control set-mode enforce\nanvil control kill-switch on\nanvil control set-service-policy checkout-service payments-prod-v3\nanvil control set-action-mode checkout-service payment.refund ghost\nanvil audit incident --action payment.charge\nanvil demo\nanvil demo stripe --stripe-key sk_test_...\n```\n\n`anvil ghost --report` writes a polished HTML report you can open in a browser, hand to engineering or business, and export from with built-in JSON/CSV download buttons.\n\n`anvil policy studio` writes a visual policy editor at `./artifacts/anvil-policy-studio.html` by default. Use it to add actions, set max amounts and retries, then download a policy JSON file and point `ANVIL_POLICY_PATH` at it.\n\n`anvil policy export <name>` turns any policy into a portable artifact — **export for runtime, agents, or code.** Four formats:\n\n- **JSON** (`.policy.json`) — a versioned, machine-readable policy contract for runtimes, APIs and workflows.\n- **Markdown** (`.policy.md`) — a plain-English document for humans, agents, docs, GitHub and reviews.\n- **TypeScript** (`.policy.ts`) — a dependency-free typed contract plus a local pre-check helper for wrapping risky actions / tool calls.\n- **Plain text** (`.policy.txt`) — a prose brief anyone can read.\n\nDefaults to writing all four into the current directory; narrow with `--format md|json|ts|txt|all`, redirect with `--out <dir>`, or stream one to stdout with `--stdout`. Exports describe **what** a policy enforces (its declared limits, scope and guarantees) — never Anvil's internal enforcement logic, secrets, or rule source. The same artifacts download from each policy card in the dashboard (Export → pick a format), or programmatically via `import { serializePolicyExport } from '@useanvil/sdk/policy-export'`.\n\n## Make A Policy By Hand\n\nYou do not need Policy Studio.\n\nAn Anvil policy is just JSON. Put a file in `./policies/` like this:\n\n```json\n{\n  \"name\": \"my-payments-policy\",\n  \"allowed_actions\": [\"payment.charge\", \"payment.refund\", \"api.call\"],\n  \"limits\": {\n    \"payment.charge\": {\n      \"max_amount\": 50000,\n      \"max_retries\": 2,\n      \"execute_timeout_ms\": 15000\n    },\n    \"payment.refund\": {\n      \"max_amount\": 25000,\n      \"max_retries\": 1,\n      \"execute_timeout_ms\": 15000\n    },\n    \"api.call\": {\n      \"max_retries\": 3,\n      \"execute_timeout_ms\": 8000\n    }\n  }\n}\n```\n\nThen point Anvil at it:\n\n```bash\nexport ANVIL_POLICY_PATH=./policies/my-payments-policy.json\n```\n\nThen use it in code:\n\n```ts\nimport { guard, key } from '@useanvil/sdk';\n\nawait guard({\n  key: key.payment(orderId),\n  action: 'payment.charge',\n  policy: 'my-payments-policy',\n  amount: 4999,\n  execute: async () => stripe.charges.create({ amount: 4999, currency: 'usd' })\n});\n```\n\nRules of thumb:\n- `allowed_actions` is the allowlist.\n- `max_amount` is in cents.\n- `max_retries` is how many tries Anvil will allow.\n- `allowed_services` and `blocked_services` let you scope a policy to specific services.\n- `required_metadata` lets you require stable facts like `actor_id`, `request_id`, or `approval_ticket`.\n- `custom_rule` points to a local JS/MJS/CJS module when the JSON model is not enough.\n- `custom_rule.run_in_ghost` lets that custom code run during ghost replay when your logs contain enough context for it to be meaningful.\n- If you set `max_amount`, you must pass `amount` to `guard()`.\n- If you set `allowed_services`, set `ANVIL_SERVICE` in the running service.\n- If you set `required_metadata` or use `custom_rule`, pass `metadata` to `guard()`.\n- Every action in `allowed_actions` should have a matching row in `limits`.\n- If several policy files live in the same directory, Anvil can load them by policy name.\n\nAdvanced example:\n\n```json\n{\n  \"name\": \"anvil-payments-governed\",\n  \"allowed_actions\": [\"payment.charge\", \"payment.refund\", \"api.call\"],\n  \"allowed_services\": [\"checkout-service\", \"payments-worker\"],\n  \"blocked_services\": [\"admin-dashboard\"],\n  \"required_metadata\": [\"actor_id\", \"request_id\"],\n  \"custom_rule\": {\n    \"module\": \"./custom/anvil-payments-governed-rule.mjs\",\n    \"export\": \"default\",\n    \"timeout_ms\": 500,\n    \"run_in_ghost\": false,\n    \"config\": {\n      \"approvalAmountCents\": 100","readmeFilename":"README.md"}