{"_id":"pxpipe-proxy","_rev":"23-7d6b15edd85565c1f561a6a93bb6df07","name":"pxpipe-proxy","dist-tags":{"latest":"0.8.0"},"versions":{"0.2.0":{"name":"pxpipe-proxy","version":"0.2.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.2.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"67f38398d2d731ab94b30ddce05476e86195fa00","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.2.0.tgz","fileCount":50,"integrity":"sha512-OMCnBSoReGhZDvGc4HYPHUq6NL8T/EB4hcIJv7DKwurQY7x25BPb4Rd+CaGcgrDPov/BjJCq5or1ySPHX9NSsg==","signatures":[{"sig":"MEYCIQC9z8cn86A0Qzpo/ZuAIOMl/kmH63YwJwQ3oSXzPqBJBgIhAMzleLyT8M6Suz9MGbkypCCdZaKY+H5OcfXBThrJLrHe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10930236},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"47d6097ecd8b50902a877a60d8014db62a0db5c0","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"teamch","email":"teamchong@outlook.com"},"deprecated":"Deprecated — token-savings were overstated (baseline-accounting bug)","repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.12.1","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@napi-rs/canvas":"^0.1.53"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"8.0.13","vitest":"^4.1.6","esbuild":"^0.28.0","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.2.0_1781089822987_0.45018323958953443","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"pxpipe-proxy","version":"0.2.1","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.2.1","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"9031864ace6f1d6941685e5668b98d5d811008ae","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.2.1.tgz","fileCount":50,"integrity":"sha512-FHvgkJue8e8llsreK4WFFG1qy+Yg6wDDmj2I+2VFDTghwvDWM/RoucrceaQkf+7Vw73tnyWF2ufSpGWiFdzR0Q==","signatures":[{"sig":"MEQCIBVGzYGkMlf89PCaV4PHaWv+g+U7gByFEmA7moFFwhXRAiB2B+CvRR8EoPoMQVvWGIVhro0509p+iF1cdA7h30g6eg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10934934},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"b9e0e06cdbd5b888a8c6b8ab41d50df58db2badf","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"deprecated":"Deprecated — token-savings were overstated (baseline-accounting bug)","repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@napi-rs/canvas":"^0.1.53"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"8.0.13","vitest":"^4.1.6","esbuild":"^0.28.0","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.2.1_1781258172302_0.3926503161624313","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"pxpipe-proxy","version":"0.3.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.3.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"accb576e22d99f036b79db10de59d0a3751ec0de","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.3.0.tgz","fileCount":50,"integrity":"sha512-W/AaUcSlS4EFN61MH9pI0ddOGT6c8nYzCyjpGsTaBrouk1gTbVAAvQdkodonqZ/Xocyz747MQI8zVQxfoBLw+w==","signatures":[{"sig":"MEUCID+j2l1dossODlsAEqN8nE9/oCf7JCriCCeM1+K02Y2MAiEA1pYYgEj/uM9N+MALM3C4ivaZVLQrrYkPj7y03IQqH3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10982645},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"a9ff92d3e18b6099083b07250690f6f1fd23df2f","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"teamch","email":"teamchong@outlook.com"},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.12.1","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@napi-rs/canvas":"^0.1.53"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"8.0.13","vitest":"^4.1.6","esbuild":"^0.28.0","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.3.0_1781716662249_0.3056268127004538","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"pxpipe-proxy","version":"0.3.1","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.3.1","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"e6f6517fabeaf017906f8b998b6fa7ecd2029022","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.3.1.tgz","fileCount":50,"integrity":"sha512-To3NQbju1JibqfXcNd+u+wDoHviwjpE+kUw4IELBfuYXWaQ2BL6eoNinrDghtqCzeCwt0O3M7SxQgwoOXp6jAw==","signatures":[{"sig":"MEUCIAIGlS1GhGxlt+q36woBKzLM5Bw6mWlhqVMqSyc2b5T7AiEAiOQpBlIUHJxD33ve0yqWsCvNb4rcZnIgwBjFSyyetwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10982677},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"af1e838f0f040dca33317c31cbf9c1a77ddf8348","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"teamch","email":"teamchong@outlook.com"},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.12.1","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@napi-rs/canvas":"^0.1.53"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"8.0.13","vitest":"^4.1.6","esbuild":"^0.28.0","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.3.1_1781725672678_0.22936336748531572","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"pxpipe-proxy","version":"0.4.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.4.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"72c4de3a9693e11945a2c09240b87e22d10efa9d","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.4.0.tgz","fileCount":50,"integrity":"sha512-l+leXuTZ3Dr7TAeYomFeQNwlCmpSNt3TwQltZi+ddX7YEr98cMiLp4685blQECz1EqMQz3/Z3XFq5iVOM5WO/A==","signatures":[{"sig":"MEUCIQC1ry+7PIE26WHh7lNUTMZ66I55WHFHKdRFhYAMQGBFZAIgIOFFAAVf/hVZZTaqwCwa1ik3IsqbbZ9Iw9sv2Zz92pE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10906432},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"c44cdf4258a2ce48ba95b2c1a7c423ded231e8be","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.4.0_1781902442057_0.5673342623674356","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"pxpipe-proxy","version":"0.5.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.5.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"83d2493fd66e7584e57c6353441a10340650bc73","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.5.0.tgz","fileCount":56,"integrity":"sha512-eEytyQ8qXsrHUanT+Cm6ZZm98wLEqDOxs4vhMPWjtIoTbzK5qjdfq7IuR5/9lxUmVzfXWFfK/tlGjryArNxTFA==","signatures":[{"sig":"MEUCIHz1r2XWh8AfvKC1I7D4GGHUryPiPTcDLNQL8r1RPWzhAiEAob3tczo+D9J9TLVtCcasZIoC4XiW5Qc43SziCkMxETc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14000546},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"dbc6d895f249f78af765ced037d2bb344b38ea37","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.5.0_1782004665418_0.15147397191968714","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"pxpipe-proxy","version":"0.6.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"374b0da81f1fafb9475e6ce87bc65195d4245dcf","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.0.tgz","fileCount":58,"integrity":"sha512-dFqP2tIyYBcpnhA2olohUGnKg94/ZzWLrdK3YZJ4RklfNgT0f6HUbR3Uvw521lJRJYNTUbEsaluFeD4nwv5sng==","signatures":[{"sig":"MEQCIGMkxOoBhAgzshZCgQh0zamyWsHLVHR49sI/6381opfOAiAz6HndEkBM9qvMPXILNO+JVs1xMLtd1zdcbe0qRPTsxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14036364},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"62b9c872ac92cfe5d86cc811b431ceb5f26b0962","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.0_1782076760354_0.5918602326158531","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"pxpipe-proxy","version":"0.6.1","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.1","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"5a9b9617be8c2707847e0668424e6eb40bc913de","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.1.tgz","fileCount":58,"integrity":"sha512-PEuVNhK2xm7YZzBKhUDhewtRUHN7dL7m5RvPtwaw4x49p5Myct6/usgHMEfpUSY9Iepu09TkwI98h4ESwLxeDw==","signatures":[{"sig":"MEQCIHNtcdTXmB+ddVRDxS5oq2wdtS1WMvIjj0klDtfBTh77AiAaE4GBKXX3lC6unLNDUGxVMhpjFxHQYr3y56JVq9/lmw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14036267},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"023669dec41c6c555626ef17891a83b7eb2698d8","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.1_1782078234228_0.8868057399856528","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"pxpipe-proxy","version":"0.6.2","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.2","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"319bb1ab0004bdf3a8dea54b00359b57ed120e00","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.2.tgz","fileCount":58,"integrity":"sha512-qEb9qVRYspNqMQt1GFgX6mK+EwEFTXmnmWohy/yPF2nFeqTzgOGo+ntm9xZzsdhOXcT5FFSXA3qRg5W04bjXAQ==","signatures":[{"sig":"MEUCIQC5J/Wc5yJCPtaYZrgrlsiPy/Xc8DOPFTfaiQKYwNxwlwIgRt2JO1wUP+uKG57+Q95m/wOzoO3Tb0YihK2+Ger40c0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14040752},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"681f40fd5b4a1cf72ad640e2e15c5768c157ded6","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.2_1782140902700_0.7416264305940059","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"pxpipe-proxy","version":"0.6.3","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.3","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"f207ec49e6d075c6c088f5f5f944bbb308a66d1a","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.3.tgz","fileCount":58,"integrity":"sha512-vvkhrPn/fpify79sK8i0V90uSsul6gYwAF2gEd1H/JWoatirZmmtDqovAnVuOaqGhGNK5BSy/0kA+aB76WBuog==","signatures":[{"sig":"MEUCIQCT5gJN6AnVTwyVrBPIvhcUoT7DmuQENLMq6TBSIf2YNwIgYy99VarYmkT62ACjBSlfZ2ORGzjRY2S1Dh5afyvqgHA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14052818},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"85f8536b67aa8d7972e6d525ce95508dd141ea20","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.3_1782159965103_0.4371070117462106","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"pxpipe-proxy","version":"0.6.4","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.4","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"73c3cf54a6e2e7009952f3a4d13c4d669b833795","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.4.tgz","fileCount":58,"integrity":"sha512-EfcEYdljLpYDKiZV0um0sdKApxElGbZD5KGh30pYTHA7zhBuz0SEaUAPOok+TMowbySJnBHk+SMpvUPXKhjPxA==","signatures":[{"sig":"MEUCICOOO+sB5tExQ7/U2iGdk0K17ur1zQkQ10MEQUHYf2XsAiEA/EDQzvh/rLWdQjUAly6NpimKfss4D5cgxsMqfe2/1o8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14056382},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"c75179b50f2c8e08d5e56e0fbd1195bf66a7b0b0","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.4_1782211594345_0.8645307054143128","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"pxpipe-proxy","version":"0.6.5","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.5","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"115ce622b25dc5716ac1c4377a9ac622bf572614","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.5.tgz","fileCount":60,"integrity":"sha512-cEKs7CDrO2GlvsXhiNs8E+b2QlZ1C9CgIIXVi5UT83gjI08iLj98uQZKUebYQthKDeGNeZrhNddoMTBCRh5D4A==","signatures":[{"sig":"MEQCIFxooxUzSNLm+HSxgm5mkgXwg7D7fRqnKP1oft+WfCGQAiAvpJ5Jfo30+TUsWBlJtBIwPLpqvczykgRstivMnm1Ppg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14068270},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"f1cc22b8b6f38d5d1b34b4b762cac4e3626deefc","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.5_1782422703160_0.5970823828805523","host":"s3://npm-registry-packages-npm-production"}},"0.6.6":{"name":"pxpipe-proxy","version":"0.6.6","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.6","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"92541f15c4bced3101599e14851d85668b74ae50","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.6.tgz","fileCount":60,"integrity":"sha512-SRjWOuwhSqNKcTlTotl1pUeDn1Q0iDNVXgiVx6YhUWyxxpzp37Ov4kmIOnKFixfDh+EU5bvPMpl8DpUHctradA==","signatures":[{"sig":"MEQCICsTXIZQGL3ongRhvbSBDGrpxvQGBfAOEP+vBcOsMS56AiBzfUE85fTTa4zUYXfGmBuO7SpdzHqhQLKFwFngYe9yNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14079158},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"7d15271587f0fbf21baa816c999b532e3d39e13d","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.6_1782432058861_0.30793548802957127","host":"s3://npm-registry-packages-npm-production"}},"0.6.7":{"name":"pxpipe-proxy","version":"0.6.7","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.7","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"e753829c4e3aa83406c572c4b909c7706e34ed62","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.7.tgz","fileCount":60,"integrity":"sha512-vBPMsJjWT+naQvrfbqaDhOw23j8i+L/s4/BfnYHTJulrODVMzZduHvuupOHy4BlCmdu48JsZoPOiz3GwZ6u6Sw==","signatures":[{"sig":"MEQCIHOZ7VnGBvHdTEzM9F+q2uFNkEaibmlDXyg/tO4RS7brAiApdA1QgHJCYZ8myeG16SpXmPBwgWaAL/K8Sl6mCwHL1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14084848},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"6ca72260e83d10e8cc574c68f01699856a3dbf99","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.7_1782440173893_0.279955229759808","host":"s3://npm-registry-packages-npm-production"}},"0.6.8":{"name":"pxpipe-proxy","version":"0.6.8","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.8","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"78a040191d9a604942971bb67ca0acec587433f8","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.8.tgz","fileCount":60,"integrity":"sha512-ZdQr1U6kjRzMgRa2SjnVSUJx7G28df/puLCvT9du509Z3/wAsWDWS1O8xX4Wy3V8at4MyQ+8zCRRiVAXLbb9nw==","signatures":[{"sig":"MEQCIGIhGnuXgbvGuDXvrTTH15MtP40NUOdVqbWzvxiuGySwAiBze+QgpbZK/k4eYcSiiVUR0A1HyNPQvUbhjGSh2PaN7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14092069},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"873cbaf94f71d16bc91c29cb1db80e1609e163b6","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.8_1782447507284_0.4295622265745811","host":"s3://npm-registry-packages-npm-production"}},"0.6.9":{"name":"pxpipe-proxy","version":"0.6.9","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.9","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"95db666573d65f5081b7ffab46a82edcfdb93c98","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.9.tgz","fileCount":62,"integrity":"sha512-F9s4e2XTk5lEaBEas4e9OXqQC41sQawmBVro8R2ipOvWa5MY5KLvr/xCuiIiUwATlSDLoOZVkLNB4CUhwC/0oQ==","signatures":[{"sig":"MEQCIB3wMn17/QzsVPixnNcd7SPkIi2WU9t5S1dWD7P36SUeAiATEAOTSGVeoCLd0g5rCuJpxd+3ZAdrYxx9YHJSuxafDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14161831},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"ec43bf5370263e1e608d2b1cd42de0e61ae5f250","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.17.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.9_1782618186436_0.8745317683789879","host":"s3://npm-registry-packages-npm-production"}},"0.6.10":{"name":"pxpipe-proxy","version":"0.6.10","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.6.10","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"c36471ae6f6debf86e4b4d0faf8fd7df24138072","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.6.10.tgz","fileCount":62,"integrity":"sha512-wrVI7uftY3AMeotkh1KJCxpqAv7TYpZ8PZ8p4To1+Di5DoSusDsculXp+yQKDOj1mRbJoEx5xH/iuwfagjbRBA==","signatures":[{"sig":"MEUCIQDmCIHS4T1mIb2XsywyXZWUqd2LtJHglKzP5Iduux7L/AIgPla1qD/ZHmA+qlIQwsB2p7jEiX2qktdnz1du49VXZUs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.6.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14160129},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"f472566cc1ff9f1ad86d23423a29f2ea6620914d","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.18.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.6.10_1782838001419_0.9193709313751806","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"pxpipe-proxy","version":"0.7.0","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.7.0","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"2fa3cd2db0d41e1f92f190ea82cbb62f44e0fdeb","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.7.0.tgz","fileCount":62,"integrity":"sha512-5x1IU/mwBOrldNEW+TZT/fRnsQ3nfIMN6Ognf9zIlSF1H3+X31Yx4Epcp9BnAq2i3X8bpK+5BirQZ/drqHpb9A==","signatures":[{"sig":"MEQCIAqaW3hQRNesln1vfjqSUhTXI++SuYNM5DMu17wj4wIvAiBYUHvaXBK6iQpovxB2B+irJXf9L77fjHGvPyN8r1H4Jw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14186477},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"bb7aaa9fec380f389eb2666a73e174c142517df2","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.18.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.7.0_1783053716812_0.29655336833889767","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"pxpipe-proxy","version":"0.7.1","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.7.1","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"1fa63cfad3198357f1e5ceaf0b5b5eb4829aa449","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.7.1.tgz","fileCount":62,"integrity":"sha512-7weuVAyJdSqo1geYzKA22orGZy3tR27dwx3PqQpj66COJcmENSNU3hBm8jgJ7vk8mIcweYNCjjQPY+AvXnUMJw==","signatures":[{"sig":"MEQCIHf3sgUqYn2uzEnjmTiJW0jkPy3MiaOs/UBUYp6uDCatAiBYFa2CbBzb4OjpnLm5a3fCIFFk208lVev/Wf5ZFG1uQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14187692},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"0dce007d4c072268eb63e0b0c07e758914f1b731","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.18.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.7.1_1783057887479_0.34234904484927653","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"pxpipe-proxy","version":"0.7.2","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"license":"MIT","_id":"pxpipe-proxy@0.7.2","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"bin":{"pxpipe":"bin/cli.js"},"dist":{"shasum":"12acfc689c611eddcc4b58f099c6be0e7649542a","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.7.2.tgz","fileCount":62,"integrity":"sha512-VaqoeDLiiZQHJMRotdK3iDFtmUWZm+p2SLA3kBQPpBeiK8I9vQMpICPzh2ehUVKrvFAjdkIFloSkIQcJo3TUdA==","signatures":[{"sig":"MEUCICJLWycwzMa/LTrxueGfjdnMoMFtb0tPwhCia37lgcM5AiEAktv5dhTitybn0z8DOuzerAlcbpO/v8ey1CHNuE8e4gA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14191770},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"type":"module","engines":{"node":">=18"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"}},"gitHead":"2070c9697e206f646ef248f1bb961733012aab58","scripts":{"test":"vitest run","build":"node scripts/build.mjs","restart":"bash scripts/restart.sh","dev:node":"tsx watch src/node.ts","typecheck":"tsc --noEmit","vendor:ui":"node scripts/vendor-ui.mjs","dev:worker":"wrangler dev","test:watch":"vitest","build:atlas":"tsx scripts/gen-atlas.ts","test:restart":"bash tests/restart.test.sh","deploy:worker":"wrangler deploy","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"repository":{"url":"git+https://github.com/teamchong/pxpipe.git","type":"git"},"_npmVersion":"11.18.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"gpt-tokenizer":"^3.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.21.0","devDependencies":{"tsx":"^4.10.0","vite":"^8.0.16","vitest":"^4.1.6","esbuild":"^0.28.1","wrangler":"^4.92.0","typescript":"^5.4.0","@types/node":"^20.12.0","@napi-rs/canvas":"^0.1.53","@cloudflare/workers-types":"^4.20240512.0"},"_npmOperationalInternal":{"tmp":"tmp/pxpipe-proxy_0.7.2_1783083783955_0.06357866967004955","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"pxpipe-proxy","version":"0.8.0","description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","type":"module","bin":{"pxpipe":"bin/cli.js"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"},"./transform":{"types":"./dist/core/library.d.ts","import":"./dist/core/library.js"},"./measurement":{"types":"./dist/core/measurement.d.ts","import":"./dist/core/measurement.js"},"./applicability":{"types":"./dist/core/applicability.d.ts","import":"./dist/core/applicability.js"},"./proxy":{"types":"./dist/core/proxy.d.ts","import":"./dist/core/proxy.js"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.js"},"./worker":{"types":"./dist/worker.d.ts","import":"./dist/worker.js"}},"scripts":{"build":"node scripts/build.mjs","build:atlas":"tsx scripts/gen-atlas.ts","dev:node":"tsx watch src/node.ts","dev:worker":"wrangler dev","deploy:worker":"wrangler deploy","restart":"bash scripts/restart.sh","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","test:restart":"bash tests/restart.test.sh","prepublishOnly":"pnpm run typecheck && pnpm test && pnpm run build","vendor:ui":"node scripts/vendor-ui.mjs"},"keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"engines":{"node":">=18"},"packageManager":"pnpm@10.21.0","license":"MIT","devDependencies":{"@cloudflare/workers-types":"^4.20240512.0","@napi-rs/canvas":"^0.1.53","@types/node":"^20.12.0","esbuild":"^0.28.1","tsx":"^4.10.0","typescript":"^5.4.0","vite":"^8.0.16","vitest":"^4.1.6","wrangler":"^4.92.0"},"pnpm":{"overrides":{"ws@>=8.0.0 <8.20.1":"^8.20.1","vite@>=8.0.0 <8.0.16":"^8.0.16","undici@>=7.0.0 <7.28.0":"^7.28.0","esbuild@>=0.27.3 <0.28.1":"^0.28.1"}},"dependencies":{"gpt-tokenizer":"^3.4.0"},"repository":{"type":"git","url":"git+https://github.com/teamchong/pxpipe.git"},"homepage":"https://github.com/teamchong/pxpipe#readme","bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"gitHead":"7dd54d395d119f5f822da5c1944ba5afbb02fa88","_id":"pxpipe-proxy@0.8.0","_nodeVersion":"22.23.1","_npmVersion":"11.18.0","dist":{"integrity":"sha512-zmh319/seaTOGG46TYq+kGk/RcXSuBcfHENNsIriuqqKiJWd6709DNQfqzf6J+lL+Nc1QtOg5F/TNIOe7YeTBQ==","shasum":"1f5353dc0b8829d62737a1d454dfe8adc9d08b59","tarball":"https://registry.npmjs.org/pxpipe-proxy/-/pxpipe-proxy-0.8.0.tgz","fileCount":62,"unpackedSize":14197065,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pxpipe-proxy@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDQePcS0BO8QxyKKPD4aIV1O4jK/QkQzlZwkE5vocPhVQIgLgeKm0iow5Pr02/YMkm40wUHNG50/XKZGwzdKJFd5e0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:93bec180-eeb4-428b-a500-4c7499cf21ef"}},"directories":{},"maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pxpipe-proxy_0.8.0_1783133377203_0.2852470869572896"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-10T11:10:22.692Z","modified":"2026-07-04T02:49:37.704Z","0.2.0":"2026-06-10T11:10:23.215Z","0.2.1":"2026-06-12T09:56:12.774Z","0.3.0":"2026-06-17T17:17:42.487Z","0.3.1":"2026-06-17T19:47:52.876Z","0.4.0":"2026-06-19T20:54:02.302Z","0.5.0":"2026-06-21T01:17:45.657Z","0.6.0":"2026-06-21T21:19:20.596Z","0.6.1":"2026-06-21T21:43:54.494Z","0.6.2":"2026-06-22T15:08:22.973Z","0.6.3":"2026-06-22T20:26:05.358Z","0.6.4":"2026-06-23T10:46:34.570Z","0.6.5":"2026-06-25T21:25:03.556Z","0.6.6":"2026-06-26T00:00:59.148Z","0.6.7":"2026-06-26T02:16:14.190Z","0.6.8":"2026-06-26T04:18:27.603Z","0.6.9":"2026-06-28T03:43:06.668Z","0.6.10":"2026-06-30T16:46:41.671Z","0.7.0":"2026-07-03T04:41:57.099Z","0.7.1":"2026-07-03T05:51:27.751Z","0.7.2":"2026-07-03T13:03:04.205Z","0.8.0":"2026-07-04T02:49:37.456Z"},"bugs":{"url":"https://github.com/teamchong/pxpipe/issues"},"license":"MIT","homepage":"https://github.com/teamchong/pxpipe#readme","keywords":["claude","claude-code","anthropic","fable-5","proxy","token-optimization","prompt-cache","vision-tokens","cloudflare-workers"],"repository":{"type":"git","url":"git+https://github.com/teamchong/pxpipe.git"},"description":"Token-saving proxy for Claude Code: renders bulky context (system prompt, tool docs, old history) as dense PNGs to cut input tokens. Runs on Node and Cloudflare Workers.","maintainers":[{"name":"teamch","email":"teamchong@outlook.com"}],"readme":"# pxpipe\n\n**Cut Claude Code's input tokens by rendering bulky context as images — the same system prompt, tool docs, and history, in a fraction of the tokens.**\n\nAn image's token cost is fixed by its pixel dimensions, not by how much text\nis inside it. Dense content (code, JSON, tool output) packs ~3.1 chars per\nimage-token vs ~1 char per text-token on real Claude Code traffic. pxpipe is\na local proxy that exploits the gap: it rewrites the bulky parts of each\nrequest into compact PNGs before it leaves your machine. At current Fable\nlist prices that lands as a **~59–70% lower end-to-end bill** — but prices\nmove and workloads differ, so the durable number is the token cut itself,\nmeasured per-request against a free `count_tokens` counterfactual in\n`~/.pxpipe/events.jsonl`.\n\nThis is what the model sees instead of text:\n\n![example: a real `transformRequest` output: system prompt + tool docs reflowed into one dense 1573×1248 page, instruction banner on top, ↵ marking original newlines](https://raw.githubusercontent.com/teamchong/pxpipe/main/docs/assets/example-render.png)\n\n*~48k chars of system prompt + tool docs: ≈25k tokens as text, ≈2.7k image\ntokens as this page. Real pipeline output; the model reads renders like this\nat 100/100 (see benchmarks).*\n\n## Demo\n\n**Fable 5 (the default, 100/100 reader) — plain left, pxpipe right:**\n\nhttps://github.com/user-attachments/assets/1c8ee63a-fcd7-4958-917b-da788d718349\n\npxpipe counts an exact token **10/10** across 39 imaged filler files\n(matches `grep` line-for-line), gets the multi-step ledger arithmetic right,\nand ends the session at **$6.06** with context to spare (73.5k/1M) vs\n**$42.21** at 96% full. One caveat visible in the clip: the pxpipe arm\nneeded a nudge to match the requested one-line output format.\n\n**Opus 4.8 (disabled by default) — same layout:**\n\nhttps://github.com/user-attachments/assets/f4e50137-31b5-426f-a6ed-b83f829b4a2c\n\nText needles read fine on both arms; the imaged phrase-count doesn't read on\nOpus — and pxpipe **says so instead of fabricating a number**. That misread\nrate is why Opus is opt-in.\n\n## Try it (30 seconds)\n\n```bash\nnpx pxpipe-proxy                                  # proxy on 127.0.0.1:47821\nANTHROPIC_BASE_URL=http://127.0.0.1:47821 claude  # point Claude Code at it\n```\n\nDashboard at <http://127.0.0.1:47821/>: tokens saved, every text→image\nconversion side by side, kill switch, live model chips. Responses stream\nnormally — pxpipe compresses the *request* only, never the model's output.\nRecent turns stay text; the system prompt, tool docs, and older bulk history\nare imaged.\n\n## The honest part\n\n- **It is lossy.** Exact 12-char hex strings in dense imaged content:\n  **13/15** on Fable 5, **0/15** on Opus — and misses are *silent\n  confabulations*, not errors. Byte-exact values (IDs, hashes, secrets)\n  must stay text; recent turns do. A dedicated verbatim-risk guard is not\n  built yet.\n- **Escape hatch:** subagents on non-allowlisted models pass through as\n  text — route byte-exact work there\n  (`CLAUDE_CODE_SUBAGENT_MODEL=claude-sonnet-4-6`, or `model: sonnet` in\n  agent frontmatter).\n- **Real work:** SWE-bench Lite pilot **10/10 both arms** at −65% request\n  size; SWE-bench Pro **14/19 ON vs 15/19 OFF** at −60%, verdicts agree\n  18/19, and the single split re-resolved 3/3 on replication — run-to-run\n  variance, not compression. Small n; receipts in `eval/`.\n- **Workload-dependent.** Wins on token-dense content (~1 char/token),\n  loses money on sparse prose (~3.5 chars/token); a profitability gate\n  (calibrated on N=391 production rows) images only where the math wins.\n- **Model scope:** default `PXPIPE_MODELS=claude-fable-5,gpt-5.6`. Opus\n  4.7/4.8 misread ~7% of renders and GPT 5.5 degrades on imaged context, so\n  both are opt-in via `PXPIPE_MODELS` or the dashboard chips.\n  `PXPIPE_MODELS=off` disables imaging. Everything else passes through\n  byte-identical. On the GPT path, tool definitions stay native JSON and no\n  Anthropic `cache_control` markers are used.\n\n## Benchmarks (reproducible)\n\nMeasured with novel random-number problems the model cannot have memorized:\n\n| test | N | text | pxpipe (image) | tokens |\n|---|---:|---:|---:|---|\n| novel arithmetic, `claude-fable-5` | 100 | 100% | **100%** | **−38%** |\n| novel arithmetic, `claude-opus-4-8` | 100 | 100% | 93% | −38% |\n| gist recall A/B (decisions, values, paths, names, negations; with distractors; 15k-45k char sessions), Fable 5 | 98/arm | 98/98 | **98/98** | - |\n| state tracking (value mutated 3x, final/first/count), Fable 5 | 18/arm | 18/18 | **18/18** | - |\n| confabulation on never-stated facts (lower is better), Fable 5 | 16/arm | 0/16 | **0/16** | - |\n| verbatim 12-char hex recall, dense render, Opus | 15 | 15/15 | **0/15** | - |\n| verbatim 12-char hex recall, dense render, Fable 5 | 15 | - | **13/15** | - |\n\nSWE-bench run totals, receipts, and caveats:\n[`eval/swe-bench/`](eval/swe-bench/) ·\n[`eval/swe-bench-pro/`](eval/swe-bench-pro/) ·\n[`eval/needle-haystack/`](eval/needle-haystack/) ·\n[`eval/gist-recall/`](eval/gist-recall/) · analysis in\n[`FINDINGS.md`](FINDINGS.md). (GSM8K scored 96% imaged, but it's in training\ndata — memorized answers survive misreads — so we lead with the novel-number\nevals.)\n\n## How it works\n\n```\ntool_result string ──► wrap at 1928px-wide columns ──► pack ~92,000 chars/page ──► PNG[]\n```\n\nThe proxy intercepts `/v1/messages`, rewrites eligible bulk into image\nblocks, splices them back cache-friendly (static prefix preserved, prompt\ncaching keeps working), and forwards. A 1928×1928 image costs ≈4,761 vision\ntokens and holds ≈92,000 chars, so text wins only above ~19 chars/token —\nClaude Code traffic runs ~1.91 (N=391). A per-request estimator decides;\nsparse prose stays text. Events log to `~/.pxpipe/events.jsonl`.\n\n## Library use (no proxy)\n\n```ts\nimport { renderTextToPngs, transformAnthropicMessages } from \"pxpipe\";\n\nconst imgs = await renderTextToPngs(toolResultText);            // RenderedImage[]\nconst { body, applied, info } = await transformAnthropicMessages({\n  body: requestBytes,\n  model: \"claude-fable-5\",\n});\n```\n\n`options.keepSharp(block)` pins blocks as text; `options.emitRecoverable`\nreturns the originals of imaged blocks. Pure-JS runtime (Node and\nedge/Workers); `@napi-rs/canvas` is build-time only. Full API:\n`src/core/index.ts`.\n\n## Development\n\n```bash\npnpm install && pnpm test\npnpm run build                # regenerates dist/\n```\n\n## FAQ\n\n**Is the headline end-to-end, or only on the requests you touched?**\nEnd-to-end, the whole bill. Most compression tools report savings only on\nthe input slice they touched, which flatters the number. The end-to-end\ndenominator is *every* production request: the small ones pxpipe correctly\nleft untouched, all cache writes and reads, and all output tokens (which the\nproxy never compresses). On a 13,709-request snapshot that was 59% ($100 →\n~$41); a later 8,904-compressed-request trace measured ~70%. Compressed-only\nruns higher (~72–74%) and is quoted separately, never as the headline. The\nexact figure is workload-dependent — reproduce it on your own log.\n\n**How is the math measured?**\nBoth sides of the same request, at the same moment. For every `/v1/messages`\nPOST the proxy fires a free `count_tokens` probe on the original uncompressed\nbody (the counterfactual) in parallel with the real forward, and reads\nAnthropic's actually-billed usage block off the response. Both land in the\nsame row of `~/.pxpipe/events.jsonl`, so there is no turn-count or\nrun-to-run confound. Dollar conversion uses Fable 5 list ratios: input ×1.0,\ncache write ×1.25, cache read ×0.1, output ×5. Cache pricing is applied\nidentically to both sides, so the caching discount cancels and cannot be\ndouble-counted as \"savings\". Re-derive it yourself from the events log: the\nformula and field names are documented in `src/core/baseline.ts`.\n\n**What does it actually compress?**\nThree kinds of *input* blocks, each behind a profitability gate:\n\n1. large `tool_result` bodies (file reads, command output, logs) above\n   ~6k chars of token-dense content\n2. older collapsed history: turns behind the live tail get re-rendered as\n   image pages, recent turns always stay text\n3. the static system prompt + tool docs slab\n\nEverything else passes through byte-identical: your messages, recent turns,\nthe model's output (it is the response, the proxy never touches it), sparse\nprose, and anything too small to win. Models outside the allowlist pass\nthrough entirely — the default scope is Fable 5 and GPT 5.6 only. Opus 4.8\nand GPT 5.5 read imaged content measurably worse (FINDINGS.md 2026-06-16),\nso they are deliberately opt-in via the dashboard or `PXPIPE_MODELS`, never\nsilently imaged.\n\n**Has it ever failed for real, outside the benchmarks?**\nYes, once in weeks of daily use: the model recalled a person's name from\nimaged chat history and got it confidently wrong. No error, just a\nplausible wrong name. That is the documented failure mode: exact strings\nin imaged content are not byte-safe. Coding sessions tolerate this because\nthe agent re-reads files before editing; pure chat recall has no such check.\nThis failure mode is measured, not anecdotal:\n[the legibility audit](docs/LEGIBILITY-AUDIT-2026-07-01.md) quantifies\nexact-string recall off rendered pages (blind reads top out at 63% on dense\nidentifiers, with every miss predicted by a glyph-confusability matrix) and\ndocuments the shipped mitigations — page geometry clamped to the API's\nresample cap so billed pixels actually reach the vision encoder, and exact\nidentifiers (SHAs, numbers) riding alongside as text.\n\n**Why does the README read like an AI wrote it?**\nBecause one did. Most of this repo's commits — the code and the docs — were\nauthored by Opus/Fable agent sessions running behind pxpipe itself, reading\ntheir own collapsed history as image pages while they worked.\n\n## Limitations\n\n- Lossy (above); verbatim recall from images is unreliable.\n- PNG encoding adds latency to large requests before they leave.\n- ASCII/Latin-1 well tested; CJK works but conservatively.\n\n## Roadmap\n\nHypotheses, not claims — they ship as numbers with an n or they get cut:\nsharper glyph rendering (`eval/glyph-matrix/`, paused mid-run), whether\nimaged bulk stretches effective context (~2x the real content in the same\n1M window), and whether a smaller active context improves long-task\naccuracy.\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}