{"_id":"pi-vision-handoff","_rev":"37-b2cd2e51ce4127fedc22762cd9d9930f","name":"pi-vision-handoff","dist-tags":{"latest":"0.10.8"},"versions":{"0.1.0":{"name":"pi-vision-handoff","version":"0.1.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.1.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"9d36d55af4c5e12e1462165749e072c533767134","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.1.0.tgz","fileCount":7,"integrity":"sha512-Ypo6dN2Es2PKUAvQsGIjsAFZ/+TLwgtAt6tDrvVyhSKMUKSmhlf3TiV7vTw7xBui8c21enpA9pWwG0wzaUhSbg==","signatures":[{"sig":"MEQCIDSKO60eWbhPmWSTcXx1OX1hYYUYFaP/NqMrQ0kTXfUJAiB70RT+KoKvoCGve3bSLMN8iSQ7JnqtitYto0JhW6VsEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46407},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.79.10","@earendil-works/pi-tui":"0.79.4","@earendil-works/pi-coding-agent":"0.79.4"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.1.0_1782198204945_0.24624028367595474","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"pi-vision-handoff","version":"0.2.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.2.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"ec5a1823d1a307cccc53f5d1cb3e8257a4b6f62c","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.2.0.tgz","fileCount":7,"integrity":"sha512-P9kDQ1X/ctNUbQ9pY5GWBUa6/uZ9uxbCR3GSMUHLEWOJr1SMSbw/nMuc2pV69e12ztnAQNx31QuwmiNqMj/ZPA==","signatures":[{"sig":"MEQCIA9R1zb0eV8seG88mEKOi9sOARLvmq7XHu2cFILWLCVJAiAenFTpTFhQ4Cff8PtUZ7cVfJJ+ityhGkh34pxz3y9fIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53960},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.79.10","@earendil-works/pi-tui":"0.79.4","@earendil-works/pi-coding-agent":"0.79.4"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.2.0_1782201554335_0.1416932575090828","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"pi-vision-handoff","version":"0.2.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.2.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"984ab4e29e3aede23139ed9dd60ef3d48f0d0d07","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.2.1.tgz","fileCount":7,"integrity":"sha512-gac0q0k2D9RldktARPYOn1YZHpfM4PRuiaPTXeFT/urkjd7tJ4hwgj8uUfQH7nMQWPDeG9lohhVDQZ1ClN+nkQ==","signatures":[{"sig":"MEYCIQDrRUojXD0kKuQnkpo9CEejEj57nayfE2QL35Xpg/mvOQIhAODhZ62BPPMZ1qW2YV6NOPPyAONcDh6ifROnp7aQU8yi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58235},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.79.10","@earendil-works/pi-tui":"0.79.4","@earendil-works/pi-coding-agent":"0.79.4"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.2.1_1782202212249_0.9809786024042491","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"pi-vision-handoff","version":"0.3.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.3.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"c379d1e3af2a432bbed85f566fcf9e69ed13341f","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.3.0.tgz","fileCount":8,"integrity":"sha512-QZ8e+MWCycIJcU3tTtH3NG6TfkLLqTycgPZCWRl87Yjj/ENfJVqXX1pBh08UFXZt8g72iCSsQuLK+STdcFGRxQ==","signatures":[{"sig":"MEUCIQCC/sjF07fpCvYJLB7nGyPxiLcs8Esann1Fr9uN+ZFcTgIgZgBXJgYXeR9l48aO9yWqwxWJS38+orwFe+33XXPXz0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72743},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.79.10","@earendil-works/pi-tui":"0.79.4","@earendil-works/pi-coding-agent":"0.79.4"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.3.0_1782227809896_0.7267753600056852","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"pi-vision-handoff","version":"0.3.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.3.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"f526da7dfa471d74fd8a127211612ba063bbec47","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.3.1.tgz","fileCount":8,"integrity":"sha512-EFSgJfLikzWB32ofNEGysKklqktEr6dtw/ezbLvImXIhVfzxFgqZ+njWpoCzliCFPHKDZHjDD8igbPSp7xP0sA==","signatures":[{"sig":"MEUCIQDRU2UrI7x/Zj0IKFG2aaGDXnbwQRpsLkpVg+2F1bpMGgIgeDpTyVypAXMF8Nm3//wUzKKaQNs7/Ex5B1tJ/zp233o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72750},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.79.10","@earendil-works/pi-tui":"0.79.4","@earendil-works/pi-coding-agent":"0.79.4"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.3.1_1782266156936_0.8280521217957508","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"pi-vision-handoff","version":"0.3.2","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.3.2","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"62405f0c5807ec253b84ae369fe24d30c19bf937","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.3.2.tgz","fileCount":12,"integrity":"sha512-DIW9nkuhYuUMIeH7FGshlD0kYmErp9upoRS4HchQ+37emlbX2aUGU5BwJlPe+xspsXmr5DI4o1lbJe2Xl7px+Q==","signatures":[{"sig":"MEUCIBCAk/e02ni6TP2sTtTeK0l8JR7rjQMAN2GA3NXtJPJJAiEAuqNSksXfNzqVA+O35z938IJ7BAl06HlRhmWz8arywz8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130984},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.3.2_1782309611504_0.6017048566509711","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"pi-vision-handoff","version":"0.4.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.4.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"9f4667ea7b2f18de78b59efe07c48211ddd0ebd9","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.4.0.tgz","fileCount":12,"integrity":"sha512-PRtVhR/rewZOdXY5oza6NSkaKHL+6zYti2SNaObY7TR2w+kpjXwInBd+pNLTIPdLcyq1f1lfI8y+r5QSIg4a2w==","signatures":[{"sig":"MEUCIQCbzt8thEF5Y77vRGYDfvwDQC6JI41yP2Q3A+QArsihZgIgC29S+OiBqzE4ourymDQhJRyAdV0gXqaJJ3ilc9mzMhs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138431},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.4.0_1782327417039_0.8636311704301063","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"pi-vision-handoff","version":"0.4.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.4.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"31c8b7f4539425d144b1f27dc200b86bc3a5662b","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.4.1.tgz","fileCount":12,"integrity":"sha512-gkjojCz+TFfFNKFcxydSxF191cnogdxsPDBCC5Icknwr/5rX4FeG8il/KkaUUfWEqzmRbZRh3vTSwAtDiRqwtA==","signatures":[{"sig":"MEUCIQCwLfYRaTQYh8Qb9/RN14MoXtgQ9vIlNK1xRUfQGzTtCgIgbrq27EVjXI5POZ5fjAvPdrD0soKpzODjMsY5onV1yWE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142429},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.4.1_1782359046718_0.19607791441847033","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"pi-vision-handoff","version":"0.4.2","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.4.2","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"513e4afcd76d38cc8e1c14974dd3a3fee512e8a9","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.4.2.tgz","fileCount":12,"integrity":"sha512-HHcWop1uxsh8VImjjOCejx+oFtDAXhUq7cfvIR8UkplPs9+BpdJDFT/O7znR3P8PUwRmKtINvytTE58vHHgi0g==","signatures":[{"sig":"MEUCIDlLNBlf19XlfmACGS80S3biaPPdELS73s3OTNwRwJcXAiEAvwPBqpAVHOiDGloFQSIOmTlqZ9AkwuU7/Z1Y6VzHwlc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143034},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.4.2_1782464178361_0.6053064270352695","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"pi-vision-handoff","version":"0.4.3","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.4.3","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"10aeca9361ebe53485cda938cd78ec1ac2e367e4","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.4.3.tgz","fileCount":12,"integrity":"sha512-HO96SMTuaJqnRbSL9TlFsKbFfgsohuWQ29y+vhC8OLdzAmaL614N+xtVixUy2IB4qQLC1AG7/AVehX6nMb3g7A==","signatures":[{"sig":"MEYCIQDScuV2FUccpxeD6JD3ME3i0Uafso5O1R+Iz276gY5qYAIhAMjpkP6aTAskRT/g32Tyiwk6f1/mbhT6B+JHi0fvBwki","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143190},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.4.3_1782498294794_0.32483766598067954","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"pi-vision-handoff","version":"0.5.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.5.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"5c61071b515d8c25079b191e3170c5322e3475de","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.5.0.tgz","fileCount":13,"integrity":"sha512-WMIWLkEjjN8TDrILuqg6+Dls4KqUv5pq5Tzb01t/CE39AitWLCivb3chj8YdgoNqddZ1HhvEtr6PRbrXylUc0A==","signatures":[{"sig":"MEYCIQDbzHmJI0AbxXzALo9Q5OC35qRkUvn/eSJrRJT0GHEccQIhANzHHNBtwufCGbalMbBEKw6YBaqwuaB+Zz9co7lbj22R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156838},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.5.0_1782499190138_0.9595393267450583","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"pi-vision-handoff","version":"0.5.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.5.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"f29d68bf2e76a7ce054b3084410d89301a274a16","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.5.1.tgz","fileCount":13,"integrity":"sha512-6rSXH/dc5ZC61Sw8BxMLVtDrVvw7eKZ3GsqkxoypvjXcxyPywOtIBZr5IOSty8UgDTywGJAcexgPUQrrRW+Hyw==","signatures":[{"sig":"MEQCIC4fCGof2Aec1d/rjzoHxV2jnzbfibCSbEXoAT7SwurHAiA0kGoNWPd29Wtll6PFmLWh3sdGfHOfvwHko7sgjG+oMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161091},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.5.1_1782842267433_0.09400176291788198","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"pi-vision-handoff","version":"0.6.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.6.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"964f323f1db2f4974e6f8760697349f107371661","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.6.0.tgz","fileCount":14,"integrity":"sha512-nJJkdikKdqFcUjOGXYqI1j9472Ga/Fvhe+ghwMkP0Pok4YK4uSyB2hjeXv+A2CevYZqGnCf3SxF2HbQiMune0Q==","signatures":[{"sig":"MEYCIQDDSyjGmHkK01SgICs94A/JX2AGqom3vYiZPkHUlK+JQwIhAIb07bW5ITXTx3Limo/dh5EkRTFwlgTPtwWxILHpIJf5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173583},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.2","@earendil-works/pi-tui":"0.80.2","@earendil-works/pi-coding-agent":"0.80.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.6.0_1783010830444_0.519576787686387","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"pi-vision-handoff","version":"0.6.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.6.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"aea2e80cbb1678303292510e6389ee9b687a1e76","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.6.1.tgz","fileCount":14,"integrity":"sha512-Ax9zOP4c4UDVCmm7M19mDaBXpJnaT8Ala0nU002Ycxes4oFMIGxaNVBvTdjK+QM00fLy5CAdxbMxBO8oOhpN+Q==","signatures":[{"sig":"MEUCIQDFD8UmURhnM/4Z2mHlAZnMyMgMD1j0n+fAnfp29BrSiwIgA5O4MN++Q4QES6qpQH07KRayKn55Kic4i2Y6E4t+QYE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173605},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.6","@earendil-works/pi-tui":"0.80.6","@earendil-works/pi-coding-agent":"0.80.6"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.6.1_1783731461268_0.9492469728724049","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"pi-vision-handoff","version":"0.7.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.7.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"7f5ec24af636deb745af181c08d21c4b279d1a48","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.7.0.tgz","fileCount":14,"integrity":"sha512-A3FMuN+5VqKX/yvMo2vUCR8+mI39e1pQQjbJpRkYSTg5QRSYikmpLthbrvJnoR9nvZJtKaKNFBHJVl24cQ7tOg==","signatures":[{"sig":"MEUCIGAxPyXLdwktVPLB/hH1vIfi6Pc1IPPqtGO6O/PeWMCpAiEArtX4bY5xzXbnQTDYY6UHPBYY230hI/bJUO9qIRdIQAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175825},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.6","@earendil-works/pi-tui":"0.80.6","@earendil-works/pi-coding-agent":"0.80.6"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.7.0_1783950587911_0.6432743598128836","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"pi-vision-handoff","version":"0.7.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.7.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"0708ccb957965733d6b04e41c068d94692e634f8","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.7.1.tgz","fileCount":14,"integrity":"sha512-iSiFKkxcpeKdolOFGnq2BjMnGkhUfWC6Bn7oBRqxF/23xDP6Ur2Gvo2Rcap14cJSJoe0W27kgTjjz7BWeBBGqg==","signatures":[{"sig":"MEUCIBtGpaGiQtDQ1448xedfHplmq4uu6GtwLKaUt+K4Hhd+AiEAsNcrHWNKGTwyV5NYmewt6Dxnkw7zmgkjPA81XYV/o80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173190},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.6","@earendil-works/pi-tui":"0.80.6","@earendil-works/pi-coding-agent":"0.80.6"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.7.1_1784089223498_0.8859493532105132","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"pi-vision-handoff","version":"0.8.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.8.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"235b6651bd01d06e284abfa0897a46b219e66845","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.8.0.tgz","fileCount":14,"integrity":"sha512-WeNqw4BbxSk1SB9P/nMkOvPMmiZ0cudOgEe2RlPoaH1fwwhktwKHpFUa5HUXsNu1Db3pJd1jazNhfvqwlFK9yQ==","signatures":[{"sig":"MEUCIF4cHWgSXr4yAt0lzGrovugjclR4hLnE9+ddy0k7OS1LAiEA2UU0dCxm0LnlYOA0ZinnLqptSDGQM81PLAhFF+Co4Ck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179712},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.6","@earendil-works/pi-tui":"0.80.6","@earendil-works/pi-coding-agent":"0.80.6"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.8.0_1784090134464_0.785556957824755","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"pi-vision-handoff","version":"0.8.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.8.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"64beb0804cb84015ee9a16e0121acf08efcdf755","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.8.1.tgz","fileCount":14,"integrity":"sha512-rDffEFAwbRlxJoqO5G4oGzLtWz2qAnOuR+wqiNs+BZin3G3N0DI2NrVkrl+aSvWDq1yZyaMUCRBeC4QQV1Gv7g==","signatures":[{"sig":"MEUCIQDleVBsvDAbAMAfPRFqLcwsRIJiTiAgoaGtFsWf7MFR2QIgayTfPjb7gsWET5Clfr3a35DCZz9xfbRm7lTvdRnC8XI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180717},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.6","@earendil-works/pi-tui":"0.80.6","@earendil-works/pi-coding-agent":"0.80.6"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.8.1_1784181814985_0.5188551010193885","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"pi-vision-handoff","version":"0.8.2","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.8.2","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"5dbb10e3957c2d67c642869a488b3a734f287c92","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.8.2.tgz","fileCount":14,"integrity":"sha512-rX0xPFbDI37BFXwT572Otp/PngmTKP4kCLouTfNRoKDOkHtzcXEZf1T1MhpTFIGXsTZK9olo3pGu7/ZgONy3OQ==","signatures":[{"sig":"MEUCIQDedBPOA7QP/AyUgbKWyMnm5Gq2XjhCHrfXiWb9PXzH4gIgDku3prcqrTsvR+DFkhyXybszdDYTWzmUmT2CWDAKnkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181901},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.10","@earendil-works/pi-tui":"0.80.10","@earendil-works/pi-coding-agent":"0.80.10"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.8.2_1784451813545_0.7131780341166531","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"pi-vision-handoff","version":"0.9.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"24e58155a9a044caa64cdc6f8403dc1521579f21","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.0.tgz","fileCount":14,"integrity":"sha512-ChKBv2j6CIuAkOT5ArSXYceo2VPGUB/Gyuqb0FI/EynU+XrzNXYPBWAaCpjTDfhcJl2DPRBz9tMizlG9wemlnw==","signatures":[{"sig":"MEYCIQC2OhEqAVLw7PWifBuZMa4V2T6JyXlqUf7WSPxEnwsjkwIhAJr3uU8NmPPlrDejcgwvj/n+x4j6VokoaCvehrx98E1q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192774},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.10","@earendil-works/pi-tui":"0.80.10","@earendil-works/pi-coding-agent":"0.80.10"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.0_1784891835871_0.976760795474072","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"pi-vision-handoff","version":"0.9.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"5a44885606e53a70c6cef175986bb0670e71ba39","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.1.tgz","fileCount":14,"integrity":"sha512-2m/y6YbX3Ra02mqWj8xDP3iAu4dXSgSdFCPCn5khAsmaEVoPMVLLzcj/cHE1VB9QG89YCryZnZiHsX958uN2LA==","signatures":[{"sig":"MEUCIFUCbJs+buH5Qq7mniW+QbksqaeXSyBCteN9QlfMMum2AiEA1wfozT45jRpRf+/goCGeVj98KFgbTJGc1XLr+HK8AME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193019},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.80.10","@earendil-works/pi-tui":"0.80.10","@earendil-works/pi-coding-agent":"0.80.10"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.1_1785169598530_0.5005947726057767","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"pi-vision-handoff","version":"0.9.2","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.2","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"493d3d6976f79dd47daa35c057d4c6356d625e4b","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.2.tgz","fileCount":14,"integrity":"sha512-U2IstS6JbUSpsFl5ShdPjAyTWFEt0lhfbHCJHA6bTxoxAe9tWAGmNYTOx88UXOpZwR3jwOvKTQxBZbhxu16brA==","signatures":[{"sig":"MEUCIQDiVNYNP7Z8jNDdTHyHgFyCwf1bflqq8CAbZSVS5pWbSgIgVAnbSceXUQ1xiJsLo9PGXPV3LQxgudQc6EaQewlIoEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193016},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.83.0","@earendil-works/pi-tui":"0.83.0","@earendil-works/pi-coding-agent":"0.83.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.2_1785370459440_0.7265170439553346","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"pi-vision-handoff","version":"0.9.3","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.3","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"6c408197980f85501aea0ee9875983c13eedac9b","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.3.tgz","fileCount":14,"integrity":"sha512-2FvXb9V6XWXVFptqVvuQo77vHWLFuyMg893PZAbqgZpFuHPA48+VtC0qTdn7YbO8Wy+nNIPS/xrof7ZN6SSNKA==","signatures":[{"sig":"MEYCIQCy7ZH6OFC/jnbgRyny5WOlZPXQXv1Yw9JMozo7MQkbJgIhAJ8ifxXvnU5bsy9HaJeV+FQhlIgUmnpFRWKA0PDPuyfc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194484},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.83.0","@earendil-works/pi-tui":"0.83.0","@earendil-works/pi-coding-agent":"0.83.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.3_1785954593337_0.36169062418627873","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"pi-vision-handoff","version":"0.9.4","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.4","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"2a9d0c26e702117359c0c869be930ad453593e6d","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.4.tgz","fileCount":14,"integrity":"sha512-lRsG/erxgbhsbfDatyqDQtVYdXUy63SWz/FEcxXCB0gf53S/E2QR2Bvct0hsO2jtwW344BRvg3og+Drexd0/Wg==","signatures":[{"sig":"MEUCIQChByWboFP9erKoM7M2WgJOz74zTBUZcjKC7s4t1NQQowIgOMBK1PrBWdyWJIKEeWHhvMhizE8LuWzDPIm2rC931LQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194484},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.4_1786020273297_0.32204914124617656","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"pi-vision-handoff","version":"0.9.5","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.5","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"902cd00f2c41e857e28a6e28d878c218b9d1c3be","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.5.tgz","fileCount":14,"integrity":"sha512-IayOy+yGgwmQnjPH5AhlzTCBqcK89aWMr28XbGQ1q+4DYWhtKSpJ2p1L6FoR0ZSElMG/z7TIy0olZQkT+2VW0g==","signatures":[{"sig":"MEUCIQDNIz+cTIO+zrPc+xrwdlEnpGrKD95VGhU0wGccx/lTfgIgWYUIG9+aVabYTYAIIs0SV0F/ubtW0ThPVAK0ww/NUE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197634},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.1","@earendil-works/pi-tui":"0.84.1","@earendil-works/pi-coding-agent":"0.84.1"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.5_1786090770965_0.20727072899067656","host":"s3://npm-registry-packages-npm-production"}},"0.9.6":{"name":"pi-vision-handoff","version":"0.9.6","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.6","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"bb7b91d42847c06d520566e1b982ee468965b44e","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.6.tgz","fileCount":14,"integrity":"sha512-YxRLgtAOaG86KLN2elN+o/Fv6w0xDQl3bllsdr6UtENnXhtGmNnRqqwpYFbm7b6cG91NKOWCRw0c1ftRjUfJwg==","signatures":[{"sig":"MEYCIQD/ollg/rtl+3SM0mLsQjiC2MQwWpEyeaxCr3Pfj0R9RAIhAMa7O7ZE8SfgrRM1oMqsWnXbNXDdoQ9Nk7z5it2k3xCM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197634},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.2","@earendil-works/pi-tui":"0.84.2","@earendil-works/pi-coding-agent":"0.84.2"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.6_1786752926963_0.7276815848020921","host":"s3://npm-registry-packages-npm-production"}},"0.9.7":{"name":"pi-vision-handoff","version":"0.9.7","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.7","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"4b05e0c3aebe2f3705643df7f62c72b3988d7638","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.7.tgz","fileCount":15,"integrity":"sha512-UtXY+h/kJuT3dIVPyg65tYwn7pSe2M/xuvLUqE7ICks/cjBcz3gJWjQDLhM7Mp3ns2q4TsWXfIQ66SAZRVwESg==","signatures":[{"sig":"MEUCIQDUiHmYhKA+TNYDOwPPpl48PXKKi4PpV8Vz7cNEuiTFHQIgQDJpR52IqQnb+N1aU8Xzv0mEKoF4spFqtqiEdxyQtE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD6wRENsS1ACVfmQs3OHfnitz+ll3e6nSseYpqIxEpANQIgVMQ/4iRNAzSxeChV7d2TEw2+g34oj0DNeaFEHyaYn58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199375},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.2","@earendil-works/pi-tui":"0.84.2","@earendil-works/pi-coding-agent":"0.84.2"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.7_1787328680029_0.256930366882677","host":"s3://npm-registry-packages-npm-production"}},"0.9.8":{"name":"pi-vision-handoff","version":"0.9.8","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.9.8","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"c8495a48f8c8913ed0ea1907de4973761e5458a7","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.9.8.tgz","fileCount":15,"integrity":"sha512-tlB/43bHN6q1MRuup3+NmyRLMHAtUI4AFGkbl0PfXR8EVASVd8+W9lyXAoKwIr/jC/St8GZLntctmSfAx8+9JA==","signatures":[{"sig":"MEUCIQCX4fTBXWX3kQqv2QWV4KjSk3z680yCDTs42yQjs5kPNAIgMoWGrQwFSPRDU4ZFRFyv6B+X/S+KSJeKlGuGjGk0bgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDvzW6UDuKs3/ya7GVh9SgEdfyNIiosSJgeOnzw13w6PAiBGuDByF8TFWC3NkwmhLnZYdCy1dT4xexhzsekeOY4KDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199375},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.3","@earendil-works/pi-tui":"0.84.3","@earendil-works/pi-coding-agent":"0.84.3"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.9.8_1787586393011_0.5472065211818742","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"pi-vision-handoff","version":"0.10.0","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.0","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"e28a335d3b2ea2e635c8b56893c5e03d16296248","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.0.tgz","fileCount":15,"integrity":"sha512-S6RC73IielEqfm5W4pwFTiZzBNgu8DjK01ZrRnUZsUm0aVbt8jM3/mNAneANeweESnbVKl+ski1QSwulE07AOA==","signatures":[{"sig":"MEYCIQDhpIFJRt1LWF///DXik0havu7QSetSFUul/ca0ZbjNcwIhAODm3cQADLQB7TZXK+npkii5v7D78NGIk8mrUuHOH0d2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEOU/nfh/zD5s3LNrSVXbXw3f7nHe73HPD/oo2ozYUiQAiANfkWRtgLcVrCdcG6J9s4/x+aN2lz/bH/kfxJPDaDLDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216527},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.3","@earendil-works/pi-tui":"0.84.3","@earendil-works/pi-coding-agent":"0.84.3"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.0_1787645978270_0.048049545777067104","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"pi-vision-handoff","version":"0.10.1","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.1","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"fe8cecd4bea45f2a25a1f0873f2ec77191ae8c65","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.1.tgz","fileCount":15,"integrity":"sha512-lHWqXExgTFB9PjVwmjm9iAX6CfHD5kR0NdoFM1kavwx0lYMkj2zV45k43c5N0mHDeFgruTHneHUUWD9mwCH5eg==","signatures":[{"sig":"MEYCIQD5IsEjjVwVdSkFKa23pO4RqKUBTLjf5yzHK3GDL0qCOAIhAPI9K6YZPDrmFbWO3ezeFjBJnGf1QtOhU7qYp8lLZizw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG8ihMSrRvpNtjx9PIstiKl6Kq6nsYOYR7fietknxwIpAiEAtLwvGsBInXR/dBQZ7q43fl6+vaOC0DpPYn7O6Ej7Xo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216527},"type":"module","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.84.4","@earendil-works/pi-tui":"0.84.4","@earendil-works/pi-coding-agent":"0.84.4"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.1_1788006121229_0.5821153105468757","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"pi-vision-handoff","version":"0.10.2","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.2","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"9c0b1b1c7d26fa7c8834e05ef1981f71ab3dbaca","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.2.tgz","fileCount":15,"integrity":"sha512-4TWA/IKRploZvGTogv8qJetZSNsznRhXGs0N+AGN5S3doaCSejTU5R6bHmcgug2HrQxfMksv7ZSXfsjhrRTi0Q==","signatures":[{"sig":"MEUCIQCblClb3hs9Lx/ckFduLYLw6yw+acnA+lakLT+BA9t+oAIgIQk4o2qljZJFdUq+KdCPen7rCpjZMSTKRrxCoaVXJdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCc8XagJqc+vBIvNawcfKztZfj+ZGFgnD7vKZT7N54KTgIhAIqOf3xS9Z2orxn2Gj9fxeJdjiKN/XvfIjK9wHO/I7/9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216528},"type":"module","shasum":"9c0b1b1c7d26fa7c8834e05ef1981f71ab3dbaca","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-4TWA/IKRploZvGTogv8qJetZSNsznRhXGs0N+AGN5S3doaCSejTU5R6bHmcgug2HrQxfMksv7ZSXfsjhrRTi0Q==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.85.0","@earendil-works/pi-tui":"0.85.0","@earendil-works/pi-coding-agent":"0.85.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.2_1788530339858_0.47899746077575633","host":"s3://npm-registry-packages-npm-production"}},"0.10.3":{"name":"pi-vision-handoff","version":"0.10.3","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.3","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"4056099e1d4da5317c4c8100e69ab2b19cbcb581","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.3.tgz","fileCount":15,"integrity":"sha512-79lQ81U2+bfI8uy0ijeW8K4VGXq8KnnalVWqZd1kXZyEIGyoeCpn8TXt7BY2vRmKo6tcpMtGFX0l+i9x5Lz28g==","signatures":[{"sig":"MEUCIQD6z4SeCvwuFJm4lzJIOz2yo75TBwO5Ah1wcz/vS9WosgIgPFPcEiLs5VWSo8Tgf5WMEeoYSVqpdERFpd2NeljUnkA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIErzPOjCMnIfGIeONoSrfTbYj6LogUeSxuxMV8glfTtEAiEA7pE39FlN6cC+MGJxOFC6VJXLHcrPucFfa6BYyVUZV28=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216528},"type":"module","shasum":"4056099e1d4da5317c4c8100e69ab2b19cbcb581","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-79lQ81U2+bfI8uy0ijeW8K4VGXq8KnnalVWqZd1kXZyEIGyoeCpn8TXt7BY2vRmKo6tcpMtGFX0l+i9x5Lz28g==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-tui":"0.85.1","@earendil-works/pi-coding-agent":"0.85.1"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.3_1788647925943_0.1585180170039091","host":"s3://npm-registry-packages-npm-production"}},"0.10.4":{"name":"pi-vision-handoff","version":"0.10.4","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.4","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"0c16e34ea2e5295e28be0f5c12ac5c7e336ffbb1","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.4.tgz","fileCount":15,"integrity":"sha512-JBczGjsF88zXZaVN3wLGUgOcgdyEvGBbIn3yH6MLH02G7a81zGBwVikD1QB7p2pTzygS3thqgewl7Ag4Fj8skw==","signatures":[{"sig":"MEQCIFhvaPCHl/eVHPGWIl9MwzGH+w1xQ/D/+vTtyLwDpNPWAiABWKoiofOxcNMPYC/oiwnaMBAP2jMaQ/cUv7O3BW0Ucw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCEwdT1T+jO35jcdHD6jEKuvBln1yBuLSlHgW6T4tA3zQIgZXwk0td5mU3Lm9vkJFC47eUCoA8YLop/4vZB8c74Bzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216700},"type":"module","shasum":"0c16e34ea2e5295e28be0f5c12ac5c7e336ffbb1","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-JBczGjsF88zXZaVN3wLGUgOcgdyEvGBbIn3yH6MLH02G7a81zGBwVikD1QB7p2pTzygS3thqgewl7Ag4Fj8skw==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.85.1","@earendil-works/pi-tui":"0.85.1","@earendil-works/pi-coding-agent":"0.85.1"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.4_1789574434924_0.24834911763666434","host":"s3://npm-registry-packages-npm-production"}},"0.10.5":{"name":"pi-vision-handoff","version":"0.10.5","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.5","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"9daf6ecf4960e6f9e8e9d08871ad4cb827908400","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.5.tgz","fileCount":15,"integrity":"sha512-K3Gh6V8cLw12swkb7I2kkLJI+gxM8TgFTBglwIE5DAqaEzHRNOGbMxOjitg8Gu4QYbB+k9RF2AHDhyLYpAGf/g==","signatures":[{"sig":"MEUCID/eLjnR6lNsxd/KhMs6kIMDEbiy7SolLi4HvXYFN9QxAiEA5Q2emGFtrsUJgyEvN3uBc5tRhAlDauhiyCT6DloOv0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEy8uLNyhvYo2BjESsPWZbQ9AzTcP6TnzXCn4NG9W2XjAiAIz2bqU/oZvB83+tn+zO5ypcjmoIIrad3YnpElc63RvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217279},"type":"module","shasum":"9daf6ecf4960e6f9e8e9d08871ad4cb827908400","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-K3Gh6V8cLw12swkb7I2kkLJI+gxM8TgFTBglwIE5DAqaEzHRNOGbMxOjitg8Gu4QYbB+k9RF2AHDhyLYpAGf/g==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.86.0","@earendil-works/pi-tui":"0.86.0","@earendil-works/pi-coding-agent":"0.86.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.5_1789893621527_0.2782637630751834","host":"s3://npm-registry-packages-npm-production"}},"0.10.6":{"name":"pi-vision-handoff","version":"0.10.6","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.6","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"51fd0c8d9f825760ce282a15eb4f1c5c1c8ec1b8","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.6.tgz","fileCount":15,"integrity":"sha512-VgamR33mCSZRDN3ItouxvCrNFmux0TqbmwIRigLcKvNbte2owE7/y22qIprgBAoqxKw16Wjsm4x/hSiTug668A==","signatures":[{"sig":"MEYCIQCYj/o51K3m4cyU0cFo4ghFf633Ix3mXIU20rxa+iCA6AIhAIq9DtoABbMIZnT4oh2rySsFVKakds3r/s9B0o/Bdt3w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGT1SEz1/MXNkaMM6x8A/8VV1U6idWkKMUBVYxplkXKAAiBk6zke032pC1kv1HhJsOBlrCCAieanDflhSrGP2q5emA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217279},"type":"module","shasum":"51fd0c8d9f825760ce282a15eb4f1c5c1c8ec1b8","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-VgamR33mCSZRDN3ItouxvCrNFmux0TqbmwIRigLcKvNbte2owE7/y22qIprgBAoqxKw16Wjsm4x/hSiTug668A==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.87.0","@earendil-works/pi-tui":"0.87.0","@earendil-works/pi-coding-agent":"0.87.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.6_1790029615271_0.35569955184826885","host":"s3://npm-registry-packages-npm-production"}},"0.10.7":{"name":"pi-vision-handoff","version":"0.10.7","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"author":"Tom X Nguyen","license":"MIT","_id":"pi-vision-handoff@0.10.7","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"pi":{"extensions":["./vision-handoff.ts"]},"dist":{"shasum":"35f014bcf83f35f4502561cb90c780efba0dee1d","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.7.tgz","fileCount":15,"integrity":"sha512-4uoYvxt3T34FZQUbfmK/FOt5moCDil6dD6mQYUN7/Rqu7y48fp+i2fJqyaBeOLXwYWd7vIrct5+qtLQMs2LuMA==","signatures":[{"sig":"MEQCIHQtjIwxR1TuCqsaMb7nWGjPnK+JjjLDrTBIaPJbNByaAiBO1lMkq2an+uM2VGonFdyk/ovZpTCqhyzd/SLe0fEuBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD4eFqeHRoBKiY6+xT4jXsbFNA/dshO/m2e4+o8Xb4nYAIgdf8HbYKkdEMIFGAlBeCTRGKxWFt+ellWXJBbHhzCFVs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":218599},"type":"module","shasum":"35f014bcf83f35f4502561cb90c780efba0dee1d","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","test:host":"node scripts/pi99-host.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"_integrity":"sha512-4uoYvxt3T34FZQUbfmK/FOt5moCDil6dD6mQYUN7/Rqu7y48fp+i2fJqyaBeOLXwYWd7vIrct5+qtLQMs2LuMA==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"0.99.0","@earendil-works/pi-tui":"0.99.0","@earendil-works/pi-coding-agent":"0.99.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-vision-handoff_0.10.7_1790708137661_0.7634543463097951","host":"s3://npm-registry-packages-npm-production"}},"0.10.8":{"pi":{"extensions":["./vision-handoff.ts"]},"_id":"pi-vision-handoff@0.10.8","bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"dist":{"shasum":"73dbaaac710c49061cbb0efd9a820eb4cd539889","tarball":"https://registry.npmjs.org/pi-vision-handoff/-/pi-vision-handoff-0.10.8.tgz","fileCount":15,"integrity":"sha512-u8Kg5vsvVRI6ZcxZuWByupxqUPdi8LigWGtTEm2yV6cL0a0cgnQQGf05X+fnmMRsmYBYTDBYpjb3CjquTt4q7g==","signatures":[{"sig":"MEUCIBI6y8la2DDdshVi/c5CW3ZPsknGulDnq/23Bndb/GMTAiEA6dCbZxxnrxbeiqiGrMe0OtCpViy1uUaqj9umaqtotZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDsYP1jCpiruW7aULN+vyI9pEB4Z0Vvqu9yi9qVTAiCrAIgaIugPOLlA5QNiAvOENFzwr9lGFFM3L9mHvvFaK2oG7U="}],"unpackedSize":218589},"name":"pi-vision-handoff","type":"module","author":"Tom X Nguyen","shasum":"73dbaaac710c49061cbb0efd9a820eb4cd539889","license":"MIT","scripts":{"test":"vitest run","lint:dead":"knip --no-gitignore","test:host":"node scripts/pi1-host.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"version":"0.10.8","_npmUser":{"name":"monotykamary","email":"tom81094@gmail.com"},"homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"_integrity":"sha512-u8Kg5vsvVRI6ZcxZuWByupxqUPdi8LigWGtTEm2yV6cL0a0cgnQQGf05X+fnmMRsmYBYTDBYpjb3CjquTt4q7g==","repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"_npmVersion":"10.8.3","description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","directories":{},"maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"_nodeVersion":"26.3.0","_hasShrinkwrap":false,"devDependencies":{"knip":"6.14.1","vitest":"4.1.7","typescript":"6.0.3","@types/node":"25.9.1","@vitest/coverage-v8":"4.1.7","@earendil-works/pi-ai":"1.0.0","@earendil-works/pi-tui":"1.0.0","@earendil-works/pi-coding-agent":"1.0.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-vision-handoff_0.10.8_1790884583847_0.3418937276968912"}}},"time":{"created":"2026-06-23T07:03:24.729Z","modified":"2026-10-01T19:56:24.151Z","0.1.0":"2026-06-23T07:03:25.096Z","0.2.0":"2026-06-23T07:59:14.496Z","0.2.1":"2026-06-23T08:10:12.385Z","0.3.0":"2026-06-23T15:16:50.065Z","0.3.1":"2026-06-24T01:55:57.102Z","0.3.2":"2026-06-24T14:00:11.648Z","0.4.0":"2026-06-24T18:56:57.180Z","0.4.1":"2026-06-25T03:44:06.848Z","0.4.2":"2026-06-26T08:56:18.531Z","0.4.3":"2026-06-26T18:24:55.140Z","0.5.0":"2026-06-26T18:39:50.279Z","0.5.1":"2026-06-30T17:57:47.572Z","0.6.0":"2026-07-02T16:47:10.587Z","0.6.1":"2026-07-11T00:57:41.416Z","0.7.0":"2026-07-13T13:49:48.051Z","0.7.1":"2026-07-15T04:20:23.640Z","0.8.0":"2026-07-15T04:35:34.597Z","0.8.1":"2026-07-16T06:03:35.103Z","0.8.2":"2026-07-19T09:03:33.676Z","0.9.0":"2026-07-24T11:17:16.003Z","0.9.1":"2026-07-27T16:26:38.684Z","0.9.2":"2026-07-30T00:14:19.617Z","0.9.3":"2026-08-05T18:29:53.499Z","0.9.4":"2026-08-06T12:44:33.437Z","0.9.5":"2026-08-07T08:19:31.113Z","0.9.6":"2026-08-15T00:15:27.120Z","0.9.7":"2026-08-21T16:11:20.135Z","0.9.8":"2026-08-24T15:46:33.113Z","0.10.0":"2026-08-25T08:19:38.336Z","0.10.1":"2026-08-29T12:22:01.319Z","0.10.2":"2026-09-04T13:58:59.961Z","0.10.3":"2026-09-05T22:38:46.036Z","0.10.4":"2026-09-16T16:00:35.022Z","0.10.5":"2026-09-20T08:40:21.633Z","0.10.6":"2026-09-21T22:26:55.365Z","0.10.7":"2026-09-29T18:55:37.747Z","0.10.8":"2026-10-01T19:56:23.968Z"},"bugs":{"url":"https://github.com/monotykamary/pi-vision-handoff/issues"},"author":"Tom X Nguyen","license":"MIT","homepage":"https://github.com/monotykamary/pi-vision-handoff#readme","keywords":["pi-package","pi","pi-coding-agent","extension","vision","image","handoff","multimodal","model-selector","accessibility"],"repository":{"url":"git+https://github.com/monotykamary/pi-vision-handoff.git","type":"git"},"description":"Give text-only pi models vision — describe images with a vision model you pick via an interactive picker, then hand off the text description to non-vision models","maintainers":[{"name":"monotykamary","email":"tom81094@gmail.com"}],"readme":"<div align=\"center\">\n\n# 👁️ pi-vision-handoff\n\n**Give text-only [pi](https://github.com/earendil-works/pi-coding-agent) models vision**\n\n_Describe images with a vision model you pick, then feed the text to models that can't see._\n\n[![pi extension](https://img.shields.io/badge/pi-extension-blueviolet)](https://github.com/earendil-works/pi-coding-agent)\n[![npm](https://img.shields.io/npm/v/pi-vision-handoff)](https://www.npmjs.com/package/pi-vision-handoff)\n[![license](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)\n\n<img src=\"https://raw.githubusercontent.com/monotykamary/pi-vision-handoff/main/assets/vision-handoff.jpg\" alt=\"Vision Handoff picker — an interactive TUI listing every model, vision-capable ones marked with an eye, to choose the describer for text-only models\" width=\"820\">\n\n</div>\n\n---\n\n## Pi 1.0 compatibility (0.10.8)\n\nTested with Pi **1.0.0**. Host-provided Pi packages and TypeBox are peers (`*`), not bundled runtime dependencies; development uses exact Pi 1.0.0 pins and host-compatible TypeBox where needed.\n\nVision calls use the native ModelRegistry streaming runtime (including native providers/auth/hooks). Fetch energy capture remains necessary for raw SSE comments, but cleanup now preserves later wrappers and retained predecessors cannot recurse after reinstall. Native nested read results are covered.\n\nRun `bun run test:host` for the offline real-host load, native codemode/nested-call, module-identity and reload checks. Set `PI1_HOST_PACKAGE` to an installed Pi package directory to test that host explicitly; add `PI1_HOST_ENTRY=bundle` to check the bundled CLI runtime's constructors.\n\n## The Problem\n\nSome of the best coding models are blind. You paste a screenshot, a UI mock, a stack trace, or a diagram into pi — and a text-only model either silently ignores the image or rejects the request outright. Up to now your only options were to describe the image yourself, or switch to a (often weaker-for-coding) vision model just to read it.\n\nThe `pi-umans-provider` extension quietly solved this for GLM 5.1: a hardcoded \"vision handoff\" pipeline that had `umans-flash` describe each image at prompt time and swapped the text in for the image block before the request left. It worked great — but it was welded to one provider, one describer, and one set of models.\n\n## The Solution\n\n`pi-vision-handoff` extracts that pipeline and makes it **provider-agnostic**:\n\n- **Pick any vision-capable model** from your registry via an interactive picker — OpenAI, Anthropic, Google, Ollama, or any custom provider pi knows about.\n- Your choice **persists** to `~/.pi/agent/extensions/pi-vision-handoff.json`.\n- For any model that doesn't declare image input (or any model you explicitly target), `pi-vision-handoff` describes the image with your chosen vision model and swaps the image block for its description text at the **`context`** event — which fires *before* pi-ai's `downgradeUnsupportedImages` can strip image blocks for non-vision models. This covers every image source: pasted/attached images, `read`-tool results, and custom extension-injected messages. (Read-tool images additionally keep the description + image in the stored `tool_result` for kitty inline rendering and `/resume`.)\n- Works across all four image-block shapes pi uses — the three provider-transformed formats (OpenAI Chat Completions, OpenAI Responses, Anthropic Messages) plus pi-ai's internal `{ type: \"image\", data, mimeType }` emitted by the `read` tool — detected by shape.\n- Descriptions are **cached per image hash** (LRU) and produced **one batched vision call per image set** (dataloader-style: a prompt describing N images does not spin up N describer calls), so the swap is instant by the time the request fires.\n\nNo `settings.json` touched. No per-provider glue. Pick a describer once and every text-only model you own can suddenly see.\n\n## Features\n\n- **🎮 Interactive picker** — `/vision-handoff` opens a TUI listing every model, vision-capable ones first (👁), to choose your describer.\n- **🖼️ DataLoader-batched descriptions** — the `read` tools are `load()` callers: N parallel reads coalesce into ONE batched vision call (dispatched via `setImmediate` after the poll phase, so reads completing together batch instead of splitting), awaited during the tool-result phase (free time) so the agent's next turn never blocks on the describer. Descriptions are ready before `context` fires, so the swap is a non-blocking cache hit.\n- **🧹 Hides pi's \"model does not support images\" note** — on read results the extension strips pi's `[Current model does not support images…]` note from the text block (it's misleading once the handoff delivers the image's content as text), while keeping the image block for kitty inline rendering and `/resume`.\n- **🔌 Provider-agnostic** — uses pi's own model execution machinery (`@earendil-works/pi-ai`'s `completeSimple()`), so it works with any provider/configured model, including custom provider extensions.\n- **🧠 Automatic targets** — by default, handoff applies to *every* model that lacks native vision. Opt out with `/vision-handoff auto off`.\n- **🗂️ Explicit overrides** — force handoff for specific models (e.g. a weak vision model) with `/vision-handoff add`.\n- **⚡ Pre-warmed at paste-enter** — the moment you press enter, `before_agent_start` scans the prompt for pasted image temp-file paths — pi-clipboard, localterm-paste, and any other paste mechanism that writes a pasted image to a temp file and inserts the path as text — reads them, and kicks off the ONE batched vision call concurrent with the agent's first response — so by the time the agent reads the files, they're already cache hits.\n- **🚀 Paste-time prewarm (opt-in)** — `prewarmPastedImages` (off by default) wraps the editor so pasted clipboard images are described the *instant* their path lands in the prompt — before you hit enter — not at submit. The vision call starts concurrent with you typing your question. Tradeoff: the description is generated without your typed question as context (the question usually isn't entered yet at paste time), and a paste-then-abandon wastes one vision call. TUI only; inactive if another extension replaces the editor. Toggle with `/vision-handoff prewarm on`.\n- **🏁 Async pasted-path fallback (opt-in)** — `asyncClipboardHandoff` races the normal read path against asynchronous delivery. A direct `read` or nested Fabric `pi.read` of the pasted path cancels the fallback and uses the normal tool-result/context flow; otherwise the completed description is queued as a steering message. Its transcript row is collapsed to one line by default and expands with `Ctrl+O`. Toggle it in the picker with `Ctrl+A` or run `/vision-handoff fallback on`.\n- **🧠 Aware prompt (opt-in)** — `awarePrompt` (off by default) injects a system-prompt note on handoff targets telling the text-only model it CAN read images via the read tool (the handoff swaps image blocks for descriptions). Some models otherwise refuse image-reading requests from self-knowledge even though the description is delivered as text. Toggle with `/vision-handoff aware on`.\n- **💾 Session persistence (opt-in)** — `persistDescriptions` writes each generated description into the session file as a `[Image described: <hash>]` marker + text block next to the read-result blob (the blob stays for kitty rendering). On `/resume` — a new process with an empty in-memory cache — the `context` hook matches the marker to the blob by hash and reuses the persisted description, so a resumed session **never re-calls the vision model** for already-described images (no 30-40s re-describe on the first resumed \"ciao\"). The persisted description is also seeded into the session cache, so later re-reads of the same image hit too. Toggle with `/vision-handoff persist on`.\n- **🛡️ Graceful degradation** — no API key? Describer unreachable? Aborted? The image is replaced with a clean `[Image: description unavailable]` placeholder instead of crashing your turn.\n- **📋 Error logging** — every describer failure and every `image description failed` warning is appended as a JSONL line to `~/.pi/agent/logs/pi-vision-handoff/errors.log`, so a warning like `image description failed — unknown error` is troubleshootable: the detailed reason (exception stack, `stopReason`, config snapshot) is captured at the describer's failure source even when the in-memory error string was already reset by the time the warning fired. Size-capped with a single `.1` backup.\n- **📊 Usage reporting** — every real describer call reports model + tokens (and Neuralwatt energy/cost when the vision model is a Neuralwatt model), via `pi.appendEntry` + a `vision-handoff:usage` event for live consumers.\n- **🔧 Tunable** — cap description length (`maxDescriptionLines`; unbounded by default, so `read`'s native `ctrl+o` collapse handles compactness) and cache size, in the config file.\n\n## Usage\n\n### Interactive Commands\n\n| Command | What it does |\n|---------|-------------|\n| `/vision-handoff` | Open the interactive picker to choose the vision model |\n| `/vision-handoff select` | Same as `/vision-handoff` |\n| `/vision-handoff model openai/gpt-4o` | Set the vision model directly |\n| `/vision-handoff status` | Show current config + whether handoff is active for the current model |\n| `/vision-handoff enable` / `disable` | Master switch (keeps your configured model) |\n| `/vision-handoff auto on` / `off` | Toggle automatic handoff for all non-vision models |\n| `/vision-handoff prewarm on` / `off` | Toggle paste-time prewarm (opt-in, off by default) |\n| `/vision-handoff fallback on` / `off` | Race matching reads against async pasted-path description injection (opt-in) |\n| `/vision-handoff aware on` / `off` | Tell handoff targets they can read images via the read tool (opt-in, off by default) |\n| `/vision-handoff persist on` / `off` | Persist descriptions to the session file; resumed sessions reuse them with no new vision call (opt-in) |\n| `/vision-handoff add ollama/llava:13b` | Force handoff for an extra model |\n| `/vision-handoff remove ollama/llava:13b` | Stop forcing handoff for a model |\n| `/vision-handoff clear` | Clear the configured vision model |\n| `/vision-handoff help` | Show usage reference |\n\n### Config File\n\nCreated automatically at `~/.pi/agent/extensions/pi-vision-handoff.json` on first change:\n\n```json\n{\n  \"enabled\": true,\n  \"visionModel\": \"openai/gpt-4o\",\n  \"autoHandoff\": true,\n  \"handoffModels\": [\"ollama/llava:13b\"],\n  \"prewarmPastedImages\": false,\n  \"asyncClipboardHandoff\": false,\n  \"awarePrompt\": false,\n  \"persistDescriptions\": false,\n  \"maxTokens\": null,\n  \"cacheMax\": 50,\n  \"maxDescriptionLines\": 0,\n  \"prompt\": \"Describe this image exhaustively…\",\n  \"userPromptPrefix\": \"The user's request about this image: \"\n}\n```\n\n| Field | Default | Effect |\n|-------|---------|--------|\n| `enabled` | `true` | Master switch. When `false`, no handoff occurs. |\n| `visionModel` | `null` | The describer, as `provider/id`. `null` = not configured (handoff inactive). |\n| `autoHandoff` | `true` | Apply handoff to every model whose `input` does not include `image`. |\n| `handoffModels` | `[]` | Extra `provider/id` refs that should also receive handoff. |\n| `prewarmPastedImages` | `false` | **Opt-in paste-time prewarm.** When `true`, a custom editor wrapper describes pasted clipboard images the instant their temp-file path lands in the prompt (pre-submit), instead of at submit. Trades a bit of description quality (the description is generated without your typed question as context, since the question usually isn't entered yet at paste time) and a speculative vision call on paste-then-abandon, for earlier prewarm. TUI mode only; inactive if another extension has replaced the editor. |\n| `asyncClipboardHandoff` | `false` | **Opt-in async fallback.** Starts from the existing submit-time prewarm. A matching direct `read` or Fabric-nested `pi.read` cancels message delivery; if no matching read wins, the description is queued asynchronously as a collapsed custom message and triggers/continues the agent turn. |\n| `awarePrompt` | `false` | **Opt-in aware prompt.** When `true`, injects a system-prompt note on handoff targets telling the text-only model it CAN read images via the read tool (the handoff swaps image blocks for descriptions). Some models otherwise refuse image-reading requests from self-knowledge. |\n| `persistDescriptions` | `false` | **Opt-in session persistence.** When `true`, every generated description is written into the session file as a `[Image described: <hash>]` marker + description text block in the read tool-result content, next to the blob (which stays for kitty rendering). On `/resume`, the `context` hook matches the marker to the blob by hash and reuses the persisted description — no vision call, no wait. Only real descriptions are persisted (a failed `[Image: description unavailable]` is not replayed; the next turn re-attempts). |\n| `maxTokens` | _(unset = model max, clamped to context window)_ | Cap on a single description's output. `null`/unset = use the vision model's declared max output (`model.maxTokens`), clamped so `maxTokens + 8192 <= contextWindow` (a model whose declared max equals its full context window would otherwise be rejected with a 400). Set a number only to cap cost/latency. A truncation is always surfaced via a `[... description truncated …]` marker when the model hits the limit, so a cut-off description is never mistaken for complete. |\n| `cacheMax` | `50` | Max described images kept in the in-memory cache per session. |\n| `maxDescriptionLines` | `0` | Cap on description lines (`0` = unbounded). Default keeps the full description so the `read` tool's native collapse (`ctrl+o`) handles compactness and the model gets complete context; setting `> 0` applies a lossy head-cap to both the TUI render and the model. |\n| `prompt` | _(built-in)_ | Override the describer system prompt. |\n| `userPromptPrefix` | _(built-in)_ | Override the prefix prepended to your original prompt. |\n\n> The config path uses pi's `getAgentDir()` — set `PI_CODING_AGENT_DIR` to relocate it.\n\n### Troubleshooting\n\nWhen handoff fails, pi shows a short warning like `pi-vision-handoff: image description failed — <reason>. Vision model: <model>`. The full detail is in the error log:\n\n```\n~/.pi/agent/logs/pi-vision-handoff/errors.log\n```\n\n(one JSON object per line; relocate via `PI_CODING_AGENT_DIR`). Each entry records the `phase` (`batch` / `single` = describer failure source, `warn` = the user-facing warning), the `reason`, the `visionModel`, the failing `imageHashes`, and — when applicable — the `stopReason`, `errorMessage`, `errorStack`, and a `config` snapshot (`maxTokens` / `thinking` / `thinkingLevel`).\n\n**`reason: \"unknown error\"`** in a `warn` entry means the engine's shared last-error string was already reset (typically a concurrent batch cleared it) by the time the warning fired — so the real cause isn't in the warning. Correlate it with the matching `batch`/`single` entry: match on the `imageHashes` (and the timestamp) to recover the actual exception/`stopReason`. Deliberate user cancels (ESC) are not logged — they aren't errors.\n\nThe log is append-only and size-capped (10 MB, rotating to `errors.log.1`), so a runaway broken vision model can't fill the disk; truncate it any time.\n\n## Installation\n\n**With `pi install`** (recommended):\n\n```bash\npi install npm:pi-vision-handoff\n```\n\nOr install from GitHub:\n\n```bash\npi install https://github.com/monotykamary/pi-vision-handoff\n```\n\n**With npm**:\n\n```bash\nnpm install pi-vision-handoff\n```\n\nOr in `~/.pi/agent/settings.json`:\n\n```json\n{\n  \"packages\": [\n    \"npm:pi-vision-handoff\"\n  ]\n}\n```\n\nThen `/reload` or restart pi.\n\nFor a quick one-off test:\n\n```bash\npi -e ./vision-handoff.ts\n```\n\n## How It Works\n\nThe extension implements the **Facebook DataLoader pattern** for image descriptions. The `read` tools are the `load()` callers; a per-image cache memoizes promises; all `load()` calls in the same execution frame coalesce into ONE batched vision call, dispatched via `setImmediate` after the poll phase (so reads completing together batch instead of splitting into N calls).\n\nWith `prewarmPastedImages` on (opt-in), an even earlier stage runs:\n\n    → editor onChange (paste-time, pre-submit)\n        • pi has no \"image pasted\" event; the earliest signal is the editor's\n          `onChange(text)`, which fires when pi's `handleClipboardImagePaste`\n          inserts the temp-file path via `insertTextAtCursor`\n        • a wrapping CustomEditor chains `onChange` (pi assigns its own\n          `onChange` — for bash-mode border tracking — after construction, so\n          the wrapper captures it via an accessor and runs it alongside an\n          observer that `diffPrewarmPaths`s new `pi-clipboard-*` paths and\n          `loadDescription()`s them at paste-time — the vision call starts\n          before you hit enter; `before_agent_start`'s same-path prewarm is\n          then a cache hit\n        • it does NOT override `handleInput`, so keybindings + `ctrl+v` paste\n          are untouched; TUI only, and skipped when another extension has\n          replaced the editor (installing over one would break paste, since\n          pi wires paste-image to the outermost editor only)\n\nWith `asyncClipboardHandoff` on, submit-time prewarm also schedules a non-blocking delivery race. A matching `read` tool call for the pasted path cancels only the custom-message injection (the in-flight description remains available to that read); if description delivery wins, Pi queues it as a steering message. The full description remains model-visible while the transcript shows a one-line row until `Ctrl+O` expands it.\n\nThe default submit-time pipeline below runs regardless:\n\n    → before_agent_start\n        • captures this turn's user prompt (shared by every image description)\n        • binds turn context (vision model + abort signal) to the loader\n        • PRE-WARMS at paste-enter via the loader, two sources coalescing into\n          ONE batch:\n          1. attached image blocks (event.images) — vision-capable targets\n          2. pasted image FILE PATHS in the prompt text — the common non-vision\n             flow: pi-clipboard, localterm-paste, and other paste mechanisms\n             write each pasted image to a temp file and insert the PATH as text\n             at the cursor, so on a non-vision model they arrive as path tokens\n             in `event.prompt`, NOT as `event.images`. The extension scans the\n             prompt for those temp paths (confined to the OS temp dir — a\n             prompt can't trick it into reading arbitrary files), reads the\n             files synchronously (keeps all load() calls in one batch frame →\n             one vision call), and `loadDescription()`s them — so the vision\n             call starts the INSTANT you press enter, concurrent with the\n             agent's first response, not waiting for it to `read` the files\n    → read tool / tool_result   (PRIMARY injection point)\n        • pi runs `read` calls in parallel (Promise.all); each read's\n          tool_result handler calls `loadDescription(img)` for its image\n          blocks and AWAITS the shared batch\n        • DataLoader: all `load()` calls in one event-loop poll iteration\n          land in ONE batch → ONE `completeSimple()` vision call for the whole read\n          set. `enqueuePostPromiseJob` schedules dispatch via `setImmediate`\n          (the check phase, which runs AFTER the whole poll phase — not\n          `process.nextTick`, which would drain between the reads' I/O\n          callbacks and split them into N single-image calls)\n        • awaits the shared batch — runs the describer during the tool-result\n          phase (free time: the agent is just waiting for tool results), so\n          the batch is COMPLETE before `context` fires → `context` is a\n          non-blocking cache hit, not a cold miss on the critical path\n        • does NOT mutate the result by default: the image stays in storage for\n          kitty inline rendering and `/resume`; the image→text swap happens in\n          the `context` hook (on the cloned LLM-bound payload only). With the\n          opt-in `persistDescriptions`, it additionally appends a\n          `[Image described: <hash>]` marker + description text block after\n          each image block, so the description survives in the session file\n          for `/resume` (the blob still stays for kitty rendering)\n    → context   (FALLBACK + swap — fires before each LLM call)\n        • catches image blocks that didn't go through `read`'s tool_result —\n          user-attached images, custom extension-injected messages — and\n          swaps read images too (cache hits from the tool_result priming)\n        • `loadDescription()` is a cache hit (warmed above) or queues into the\n          loader's current batch; swaps images for text in the cloned LLM-bound\n          payload (`emitContext` does a `structuredClone`), leaving storage\n          intact for kitty inline rendering and `/resume`\n        • persistence fast-path (opt-in): on `/resume` — new process, empty\n          in-memory cache — images whose session content carries a\n          `[Image described: <hash>]` marker matching their hash are NOT sent\n          to the vision model at all: the persisted description is reused\n          verbatim (blob dropped from the clone, marker stripped) and seeded\n          into the session cache for later re-reads\n\nBecause the describer runs during the **tool-result phase** (before the agent's next turn), not during the `context` transform (the critical path right before the LLM call), the agent gets described text immediately when its turn starts — it never waits on the describer inline.\n\n### Batching: the DataLoader\n\nA single frame's image set is described with **one** vision-model call, not one per image. `loadDescription(img)` is synchronous: on a cache miss it pushes the image's key (hash) into the current batch and returns a memoized promise; on a cache hit it returns the existing (in-flight or resolved) promise. `enqueuePostPromiseJob` schedules dispatch via `setImmediate` (the check phase, after the whole poll phase AND after the microtask queue drains), so every `load()` caller — whether from sync code, a `.then` cascade, or a separate I/O callback in the same poll iteration — registers its key before the single vision call fires. This is why N parallel reads coalesce into one call rather than splitting into N single-image calls: `setImmediate` defers past the entire poll phase, whereas DataLoader's classic `process.nextTick` would drain between the reads' I/O callbacks and fire a dispatch after the first read but before the second. The batched call sends every uncached image in a single user message with per-image `<<<IMAGE k>>> … <<<END>>>` delimiters; the response is parsed back into per-image descriptions (keyed by `sha256(mime + base64)` in the per-image cache). If the vision model ignores the delimiter format and the batched response can't be split, each unparsed image falls back to its own single-image `completeSimple()` call **in parallel** (no delimiters to cooperate with) — descriptions still arrive together. Only when a per-image call itself genuinely fails (auth, timeout, empty) does that image degrade to `[Image: description unavailable]`; one bad image never voids the rest.\n\nBecause pi runs parallel `read` tool calls via `Promise.all` and fires each read's `tool_result` event as that read's I/O completes (poll phase) — via `agent.afterToolCall` → `finalizeExecutedToolCall` — the loader's `setImmediate` dispatch defers to the check phase AFTER the whole poll iteration, so reads completing together share ONE batch → ONE vision call, all resolving together. Reads completing in separate poll iterations get separate calls, but always in parallel, never sequential. (The per-image cache also dedupes a duplicate `load()` of the same image in one frame: dispatch resolves every callback by hash, so a second load whose first cache entry was evicted mid-frame still resolves — it never hangs.)\n\n**Failures are never cached.**\n\n**Failures are never cached.** A genuine describer failure returns `[Image: description unavailable]` for that turn but is NOT written to the per-image cache, so the next turn re-attempts (and surfaces the real error via a `ctx.ui.notify` warning instead of serving a stuck placeholder). This avoids a transient failure poisoning the cache for the rest of the session.\n\n**Per-image-set warning.** The `context` hook fires before every LLM turn, and describer failures aren't cached — so without dedup the same broken vision model would re-warn every turn. Each distinct image is warned about at most once per session (tracked by image hash, reset on `/resume`/new session); subsequent turns for the same failing image degrade silently to the placeholder instead of spamming.\n\n**Timeout scales with batch size.** The describer generates an exhaustive multi-paragraph description per image, and the call is batched (N images → 1 request). The timeout is `DESCRIBE_TIMEOUT_MS` (120s) plus a per-image budget (45s × (imageCount − 1)), so a 5-image batch isn't held to the same wall-clock budget as one image. A timeout surfaces as `describer timed out after <N>s` rather than a misleading `stopReason \"aborted\"`.\n\n**No silent truncation.** The describer prompt says \"be exhaustive\", so the default `maxTokens` is **unset** — the describer uses the vision model's declared max output (`model.maxTokens`) as the cap, rather than relying on a provider's small omitted-default. That value is clamped so `maxTokens + 8192 <= contextWindow`: a model whose declared `maxTokens` equals its full `contextWindow` (e.g. a custom provider that sets both to the same number) would otherwise be rejected by the provider with a 400 (you can't request output tokens equal to the entire context window when you also have input), so the clamp subtracts a small input reserve. If the model still hits a token limit (a cap you set, or the provider's hard output maximum), `stopReason` becomes `\"length\"`; the describer appends a visible `[... description truncated …]` marker to the (still useful) partial text rather than letting a cut-off description pass as complete. For a batched call the marker lands on the last image being emitted when the cap hit (the one cut off mid-stream); earlier sections had `<<<END>>>` delimiters and are complete.\n\n**Aborts propagate.** The `context` hook runs in the foreground (pi awaits it before the LLM call), so a slow describer would also make aborting a turn slow — pi has to wait for the transform to return. The hook therefore wires the turn's abort signal (`ctx.signal`, the active run's `AbortController`) into the describer's `completeSimple()` call, so a user cancel kills the in-flight vision request immediately. A deliberate abort is not warned about (it's not a vision-model failure) and the LLM-bound payload is left untouched since the turn is being torn down anyway.\n\n### Image-block formats handled\n\n| Hook | Image block shape | Handling |\n|------|-------------------|----------|\n| `context` (all messages) | `{ type: \"image\", data, mimeType }` (pi-ai internal) | undescribed → replaced with description text; already-described (persisted `[Image described: <hash>]` marker present) → image dropped, marker stripped, persisted description reused — **no vision call on resume** |\n| `context` (all messages) | `{ type: \"image_url\", image_url: { url: \"data:…\" } }` (OpenAI Chat Completions) | detected by shape → replaced with `{ type: \"text\", text }` |\n| `context` (all messages) | `{ type: \"input_image\", image_url: \"data:…\" }` (OpenAI Responses) | detected by shape → replaced with `{ type: \"input_text\", text }` |\n| `context` (all messages) | `{ type: \"image\", source: { type: \"base64\", media_type, data } }` (Anthropic Messages) | detected by shape → replaced with `{ type: \"text\", text }` |\n\nThe describer call itself goes through pi's normal model machinery (`completeSimple()`), **not** the agent event loop — so it never re-triggers `context` (no recursion). Every real describer request receives a dedicated helper session ID. For Neuralwatt, the request also receives a matching isolated `X-NW-Conversation-ID` instead of inheriting the main Pi session ID; the unrelated image prompt therefore cannot replace the main agent's server-side cache lineage. The `read` tool result keeps its image block untouched (kitty inline + `/resume`); only the `context`-cloned LLM-bound payload has images swapped for text.\n\n### Usage reporting\n\nEvery **real** describer call (cache misses only — cache hits emit nothing) reports its model + tokens so pi and other extensions can account for the handoff cost. When the vision model is a **Neuralwatt** model, the response's `: energy` / `: cost` / `: mcr-session` SSE comments are also captured (the OpenAI SDK discards comment lines, so the response body is teed and parsed — the same technique `pi-neuralwatt-provider` uses). For non-Neuralwatt vision models the energy fields are **omitted** (not zeroed), so consumers can distinguish \"no energy\" from \"zero energy\".\n\nEach record is published two ways, mirroring `pi-neuralwatt-provider`'s `neuralwatt:turn-energy` pattern:\n\n- **`pi.appendEntry(\"vision-handoff-usage\", record)`** — persisted to the session log, so it replays on `/resume`, fork, and branch navigation.\n- **`pi.events.emit(\"vision-handoff:usage\", record)`** — live event-bus channel a consumer (e.g. a `pi-tps`-style extension) can filter on to see tokens **and** energy in one payload.\n\nRecord shape:\n\n```ts\n{\n  imageHash: string,            // sha256(mime + base64), first 32 hex chars\n  model: string, provider: string,\n  responseModel?: string, responseId?: string,\n  usage: Usage,                 // { input, output, cacheRead, cacheWrite, totalTokens, cost }\n  imageHash: string,            // representative (first) member of the batch; sha256(mime + base64), first 32 hex chars\n  imageHashes?: string[],        // present only for batched calls (length > 1): every image the call covered\n  model: string, provider: string,\n  responseModel?: string, responseId?: string,\n  usage: Usage,                 // { input, output, cacheRead, cacheWrite, totalTokens, cost }\n  // Present ONLY when Neuralwatt SSE energy comments were captured:\n  energyJoules?: number, costUsd?: number,\n  energyRaw?: object, mcrSessionRaw?: object, costRaw?: object,\n}\n```\n\nOne record is emitted per **real** describer call (a batched call describing several images still emits a single record, with `imageHashes` listing every member so consumers can attribute the call's tokens/energy per image without double-counting). Because `before_agent_start` fires a batched describe fire-and-forget, the fetch interception is **refcounted** (installed only while ≥1 describe is in flight) and uses `AsyncLocalStorage` to route each teed response body to the describe call that issued it — so concurrent describes each attribute their own energy correctly without clobbering `globalThis.fetch`. When the vision model is a Neuralwatt model, `pi-neuralwatt-provider`'s own `streamNeuralwatt` tee nests on top and restores back to this interceptor; both tees read the same comment lines independently (the accepted duplication for easy filtering).\n\n## Comparison with Alternatives\n\n| Approach | Pros | Cons |\n|----------|------|------|\n| **pi-vision-handoff** (this) | Provider-agnostic; pick any describer; automatic for text-only models; cached; batched (one call per image set); survives across providers | Adds one extra model call per image set per turn |\n| Native vision on every model | Zero overhead | Not all models support it; you may be forced off your preferred coding model |\n| Manually describing images | No extension | Tedious; lossy; kills the \"paste a screenshot\" workflow |\n| The original `pi-umans-provider` handoff | Battle-tested | Hardcoded to `umans-flash` + UMANS models only |\n| Switching to a vision model to read an image, then back | Works | Context loss across model swaps; worse coding model for the actual work |\n\n## Development\n\n```bash\npnpm install\npnpm test          # Vitest unit tests\npnpm typecheck     # TypeScript validation\npnpm lint:dead     # Dead code detection (knip)\n```\n\n### Structure\n\n```\n.\n├── vision-handoff.ts            # Wiring layer: pi hooks, /vision-handoff command\n├── src/\n│   ├── index.ts                  # Config schema, read/write, image-block helpers, batching (barrel)\n│   ├── dataloader.ts              # DescriptionLoader — DataLoader-batched descriptions (Disposable)\n│   ├── describer.ts              # Vision describer calls (runBatch / describeSingle) with `using` resource guards\n│   ├── image.ts                  # Image hashing, MIME sniffing, clipboard-path reading\n│   ├── prewarm-editor.ts        # Opt-in paste-time prewarm CustomEditor wrapper (chains onChange)\n│   ├── dispose.ts                 # `Disposable` guard factories for `using` (fetch interceptor, timer, abort wire)\n│   ├── error-log.ts              # Best-effort JSONL error log → ~/.pi/agent/logs/pi-vision-handoff/errors.log\n│   ├── usage.ts                  # Describer usage + Neuralwatt energy capture, fetch interceptor\n│   └── vision-model-selector.ts  # Interactive picker TUI component\n├── __tests__/unit/\n│   ├── config-dir.test.ts        # Ensures getAgentDir() usage\n│   ├── usage.test.ts             # Energy parsing, usage records, concurrency-safe fetch routing\n│   ├── vision-handoff.test.ts    # Config, refs, image-block extraction, insertion, truncation, round-trip\n│   ├── dataloader.test.ts        # Batch coalescing, memoization, failure eviction, Disposable reset\n│   ├── describer.test.ts        # stopReason handling (length → truncation marker, aborted/error), error-log wiring\n│   ├── image.test.ts             # MIME sniffing, clipboard-path confinement, file reading, diffPrewarmPaths\n│   ├── error-log.test.ts         # JSONL error log: path resolution, append, size-capped rotation, never-throws\n│   └── dispose.test.ts           # `using` guards: fetch refcount, timeout, abort-wire propagation\n├── package.json\n├── tsconfig.json\n├── knip.json\n└── vitest.config.ts\n```\n\n## Acknowledgements\n\nThe vision handoff concept and the exhaustive describer prompt originate from the [pi-umans-provider](https://github.com/monotykamary/pi-umans-provider) GLM 5.1 pipeline. The picker TUI builds on the patterns from [pi-hide-providers](https://github.com/monotykamary/pi-hide-providers), which in turn mirror pi core's built-in selectors.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}