{"_id":"@bacnh85/pi-a2a","_rev":"18-847016b48d020440e843611de2ec69e0","name":"@bacnh85/pi-a2a","dist-tags":{"latest":"0.7.13"},"versions":{"0.1.1":{"name":"@bacnh85/pi-a2a","version":"0.1.1","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.1.1","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"e97c0931bd9909f9daeaaa2c33721c5cc40cd677","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.1.1.tgz","fileCount":12,"integrity":"sha512-Sic1MJpMjk7dJ7SYiyH0p25aEDdkLJeyUu7VaB9xacN3JC+8HkYzRX697ajqsqtaVNN8vNevxHKN4wqvfz8e7Q==","signatures":[{"sig":"MEUCIBwTuldpFeAh7xgFNill51GDAs4ChaKrz06YdeLzXHO1AiEA6eam65kmO1IATOPoHTIK7KcY5gOFwwzTphLBKcaacOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114609},"type":"module","gitHead":"f075ae57b029a84f2ad8029ba15a99576d271858","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents and be called by them.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.1.1_1786605338360_0.7067201580356692","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bacnh85/pi-a2a","version":"0.3.1","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.3.1","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"cc68878545c3aa23c26d77425791c1ebeb07c993","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.3.1.tgz","fileCount":18,"integrity":"sha512-1K61RCMmXl3JYDHZZm6k923olp3Lfq+7Wyo900XQ005iKuaNZK45AbsqnRwTfTF2m19AkAUfoROKllb0qSZt5Q==","signatures":[{"sig":"MEUCIAfaYc9TqBP4GQ7hKSeTw4NQ4LF/f93t4MM3ya8h3TS/AiEA0mUWhi/CKmsGTt6hQp3WvLgdFbQ2jaaIvyRqKz5AzIc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204084},"type":"module","gitHead":"3534e2baa960ae7f8636a08bb30170432bd581fb","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.3.1_1786713192946_0.23118553963583865","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bacnh85/pi-a2a","version":"0.5.0","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.5.0","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"8978a10240057ee505f97ee7ffd515788b4ff483","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.5.0.tgz","fileCount":19,"integrity":"sha512-Ch5RIbotm2J+2vhXjKkPhtRZ6e4kAIgBVSDeNOQ1jF+Mbm6NVASOqqDniho3Z/uaQyTcHZt0v2pRpdakh8yhMQ==","signatures":[{"sig":"MEQCIDJxuJJXEh6kQP53YKafobtQ9yMTWEI8Q9y6Cvq174RzAiAqoBS2hrtmsafLYTpb3eKOpHgqFreFc1kO3wdntdS4JA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248529},"type":"module","gitHead":"d7e264d6a415cdb5bffdaabae8bfc24d064ed972","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.5.0_1786768604917_0.2606150688420794","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@bacnh85/pi-a2a","version":"0.5.1","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.5.1","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"c1a055a9d336fe7958237db5cb8398e2098f618d","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.5.1.tgz","fileCount":19,"integrity":"sha512-lH9Wp4Au2qn8AazcH3KLTftP300sgwH/reHOI9j79WUSKUIX65zxqE9nhzPBgEKihDGrdG1lHlaOXbZhtEDg9w==","signatures":[{"sig":"MEYCIQC3hcsL3oYzQ7WMZfTcadJX8GBbWabqOkQgWvioyaVg4wIhAOJVXiPoKYCc9JnJy4epWy8OctSMg2dI8NIC+R2OC06Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":255758},"type":"module","gitHead":"4270897d68395f1a41b85ecd26aa439aead9c84b","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.5.1_1786809231154_0.6428316458531929","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bacnh85/pi-a2a","version":"0.6.0","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.6.0","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"ff01cc7acca3de186f4651b02a1b73bd881158bd","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.6.0.tgz","fileCount":19,"integrity":"sha512-i6kecW9Lr3sUUY5jCyv3x5j4QQW9b05GJYJhP7CWoj/TH5pTQ1AMxzJnIDgbSGuOFl/VF4nq951DSNHHzMb7Vw==","signatures":[{"sig":"MEUCIBDlTqg26QZvdVSIm5SQssKpiEeTejLLfIQgO1swc5UuAiEA54EZKmq3FHF5XvpPgqjQuWDs5uescPJwib2tuPdx7Cc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278463},"type":"module","gitHead":"372258c90019d8473335cf07528fd35416cadfb0","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.6.0_1786875910460_0.2065574149806404","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@bacnh85/pi-a2a","version":"0.6.1","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.6.1","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"d2311492ab51f262b354b0775ce1ccb0d03e1b14","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.6.1.tgz","fileCount":19,"integrity":"sha512-W6SttA4/Co6lN2bmiqz6K8gAYVwzZAJ20AZDCQFEVXROC0q4hhWem5XjH/+lBmyMyeVcRz5PzafI+8YUR4r2xw==","signatures":[{"sig":"MEUCIFfe560FIUlp96tPLcLZngFtkjQB7ymdrk8xJjr2v7YXAiEAiwbJd637Bf+ChZhaTYR0zpNaSk0OzxgmKmHOQdK2YzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298113},"type":"module","gitHead":"311b285adabb3b153617acd191222aa74aa0e4dd","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^10.8.2","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.6.1_1786972705546_0.12242520008790736","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@bacnh85/pi-a2a","version":"0.6.3","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.6.3","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"ea7702b0e05b04a5958c2605978862902a98dd55","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.6.3.tgz","fileCount":19,"integrity":"sha512-3dt5rsBLBBePopGmvXZMH5381MkO4Or+few4Q4FHlT9URQD0y0G4gHCdNBYg8wITP2iHzb7U58X3GFe5RZzMSw==","signatures":[{"sig":"MEYCIQDxntfETqmy1ayQ7Ka4rIRayKCSueKFIQNVFbtB1PmZbQIhAMJ0snKmE78ZW2G15+p6OfNh3VPA4J8b2NURx5CyazCU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310614},"type":"module","gitHead":"9990fe3b415a7e0a1c3bfce5a923e06a10f8a290","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.6.3_1787320573333_0.9177241793980193","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bacnh85/pi-a2a","version":"0.7.0","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.0","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"59ebf2c526d37c1d2e6bcc360b4f26556f625926","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.0.tgz","fileCount":19,"integrity":"sha512-Pn0x5YFnzllwD7gaOdoY2NXK/PSpyIUpKUXv8D0jXxS3f8g0/WqrN8o03HGaCbMN/2poj5oG5uoHezTBw/CSgg==","signatures":[{"sig":"MEUCIQDsRc6qN/M2NXfiaox82AxwOIrzxUSxWE1QKQspSTbNtAIgaPKTCprCvwgOefEFv0rvwK/88hzfVGX0QZn9wZpayLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294915},"type":"module","gitHead":"0afe1c2ce62b2aad560b85f50e7e2a084e914bcd","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.0_1787454127613_0.6984020139108789","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@bacnh85/pi-a2a","version":"0.7.1","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.1","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"ca8a436e40c98de559e6e916e6d4231456aa0840","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.1.tgz","fileCount":19,"integrity":"sha512-LIM5G4QwVt1ESGFfLG0ZlzIVumTSq8LRorV/fnFtLC1p8sLmeT2D1B0jr0/5i9jeaf6/M0sMhU/qzoYI0R6MhA==","signatures":[{"sig":"MEUCIA8LSwI5O+fo2bZLjwBdiYFqkY2IH0LzzJsSM9Ju+1p5AiEA3u4LcyFpi828Sn335HOO9EMxkNsfKSpJg8mYSQuAikc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296381},"type":"module","gitHead":"fb130ee80571d4a6ec161fe7d7736085f32eff74","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.3"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.1_1788013781317_0.7485534180806925","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@bacnh85/pi-a2a","version":"0.7.2","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.2","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"fab29d7600631c9cd69c5f32935a1fdc2a662ecb","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.2.tgz","fileCount":19,"integrity":"sha512-SFgzbnqAaQQWCjYJh4g6ic+ykSvRQ774g1iVZWpbzklQARBugQwUGDtmugQRMYgi4ll+Z9erY/Zi91sH5WsraA==","signatures":[{"sig":"MEUCIQC+ZIcCYpJThpQenf3lTCJFU9YUL3Lgo+dFCg48C4zvQAIgO0ZkcwCWPHC8MOWWDq5zJvJGffGp/CtXObobns+AHkM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296763},"type":"module","gitHead":"749c7e1133b72dbe30e749dce182180b0fda0619","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.3"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.2_1788139288025_0.7489443699907037","host":"s3://npm-registry-packages-npm-production"}},"0.7.6":{"name":"@bacnh85/pi-a2a","version":"0.7.6","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.6","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"95f10270c257a2c704fdc3b17b5b12eb94873721","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.6.tgz","fileCount":19,"integrity":"sha512-eL16Ptm3kTuT+ajmXGuzAYB5CxUbkva2M7O0qQjGk8RNBrz0LkD4egbSGI5yTiqtUXpckrwNGBE6TUbqSNXgwQ==","signatures":[{"sig":"MEUCIQDlApgaD/Woiw/iHVeuMz4E4swBvpMbEDVOQxNaL0j3pgIgXXlDfvGXoq8NaUvNU0Zm/ynn8ZRyjoL/uNwbsjC0eA0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":307036},"type":"module","gitHead":"3ca0e23f50a8c4b23c089651c88dcf2795636b3d","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.84.3"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.6_1788275829250_0.9567745579190845","host":"s3://npm-registry-packages-npm-production"}},"0.7.7":{"name":"@bacnh85/pi-a2a","version":"0.7.7","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.7","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"1c5c843b24367256250a1732777894c52e710f26","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.7.tgz","fileCount":19,"integrity":"sha512-qb3FCSQqHR6LQMEuXLLKAiF3r6dRegwV5qeh57Bz5bYbYd2jzrzCSTDju0Dl95NOIJLO4OyXgo/ayfHyGkAeFw==","signatures":[{"sig":"MEYCIQD40yXt4eBeANRxrk0ynWNNj+g3Jdzaco1OgrGD/ait0AIhAPlxmCKngdaW/ppZld+4wKPEGoiRxIBE2vy6aDTATEh/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":357499},"type":"module","gitHead":"1b9a30247c0ab140a62efbaa9bf5f77d0f4495c7","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.85.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.7_1789083127139_0.9097206468553989","host":"s3://npm-registry-packages-npm-production"}},"0.7.8":{"name":"@bacnh85/pi-a2a","version":"0.7.8","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.8","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"2a4d226723876b17dfc99ed91dfc7f5e1ed46237","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.8.tgz","fileCount":19,"integrity":"sha512-zzW+pg00u2EYTyy0hcTQ+lZ/u9l65qLwS7qzZiBrx5cBPdRCHmuqlUiH+l5hzznrRnz9oQ5+ISLJ48vFywo71A==","signatures":[{"sig":"MEUCIQCfs6KSp0VBli0E9RrZEK5m4nesJtCNR8d1joOPTiFIYwIgeMwPk4bkxXz/x3EtgESxcjRudX+bQbolYxIJKBXlXeg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359017},"type":"module","gitHead":"fc25702c6bed994da1dd5071c5ec8071bfd28393","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.85.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.8_1789204290424_0.5726504410953146","host":"s3://npm-registry-packages-npm-production"}},"0.7.9":{"name":"@bacnh85/pi-a2a","version":"0.7.9","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.9","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"a186c27486493baab03cfb1a81fc79761f9934ee","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.9.tgz","fileCount":19,"integrity":"sha512-8GzzxnWousynYaarW7Agu3RPLwe2Le6FNpQ6OSGJZDuELVgK7W6f918srMjXJ+02IBs6YXtnqQklsroV9hawLA==","signatures":[{"sig":"MEQCICS1q8h3Zlp+xAPd0yNRm9nzJ+HAfw6YHvw/mwsxe0j6AiA/W0IVRD0X465OvZ7PjJ/4tEtM2OZF95b2u/lSW2jWYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCP8bHrxClYYUzhE59eOQYX/RaEd8eSXr9v1R6CDvE+UQIgL/We7nR6pV50IGNcLxKu67w+DJzyBRzQYAIx/NeUjNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368027},"type":"module","gitHead":"fdf44f60a4ad34359a855de70f0de2edb64c7f2b","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.85.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.9_1789784458635_0.5969934522390439","host":"s3://npm-registry-packages-npm-production"}},"0.7.10":{"name":"@bacnh85/pi-a2a","version":"0.7.10","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.10","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"3115adc478ff310e72933fc3bd2b8e0dee1f88da","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.10.tgz","fileCount":19,"integrity":"sha512-X9y9/9BHpc9+j2FIDUbnO1DbV7qC8w3UfQOvIL588Ee2kuowDGqtH4Uc+iCwfcriq5RSU2jz7ras6Nw2jal6/w==","signatures":[{"sig":"MEUCIAIhVd+sVrjA4ZUFTCLf+fP6hs6/FbWnUVVCSwCIJnJcAiEA2nwEQttqREiLrvcJFWym37xFSM8nBcnfjDr4koDS898=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCG84u6DIJ9/KiZbDerGd/eBi/N+NEyXWQrSX91qnwW3AIgJCKIwVdVZoox63CSNo7EW0VmlHNn0r/PkqTcKFKbN5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368431},"type":"module","gitHead":"d00c3deaa5f3423b44adc2e160397b2feaf8465f","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.85.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.10_1789881030307_0.9690794169666002","host":"s3://npm-registry-packages-npm-production"}},"0.7.11":{"name":"@bacnh85/pi-a2a","version":"0.7.11","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.11","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"0142cec7439be2aef410574a6cd2400e916d9032","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.11.tgz","fileCount":19,"integrity":"sha512-kVj1vTzVpT0rtyeCo+2KLuatw9utT5V88P0ALCiHqRiIcA8We7U3MwAASMr3mTbu5o4XxvArLovcbUhXScHMqQ==","signatures":[{"sig":"MEQCIHtWWCbHBlv99MMBzrZf5BPLucuJ1j2tcXJOpvfXakidAiB32LmMo/wIR1KSSBDB6NRVf19w/L6trlq3E1QUJrO0xA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC4X4XawT89JBXD8xSZHm6XA7eCIxnF1aJQtGMpasnGqAiEAiOQ5eI+I6HOPt/MPATSzktiQioQwHKHJQAKSoSWhwuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370102},"type":"module","gitHead":"b5330ac3d014f92dff97a2b90cd9ebdbf0de22fd","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.86.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.11_1789962662366_0.6958272723176262","host":"s3://npm-registry-packages-npm-production"}},"0.7.12":{"name":"@bacnh85/pi-a2a","version":"0.7.12","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"license":"MIT","_id":"@bacnh85/pi-a2a@0.7.12","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"dist":{"shasum":"48b6f32da2e5e6d8c1d6e0a567b64f1b4ccfc875","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.12.tgz","fileCount":21,"integrity":"sha512-60G7iwOZD+Mucpe9JU2tjUDboll/4OqxlLX0OkW+4jEyRyGgoSU1x5AYXleJHanl5TXfejVgAHrSGbLxtPrsfA==","signatures":[{"sig":"MEYCIQCcGxMUFnQB/A83q3HMyAsDygwcYuYGotr8WV7aTeUnfAIhALgRa2SwO4UORiKCH1xsFC+2w/q9IdRAFbqkVne0Rzyc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCJQJHIqkG7Vbpy+0aQ3t+kt4dLlHe6xbzGdJT2GpQCewIgGanjWiFMQIdcFkiNZQsc50PVV4SxyTdhdq9hIkmgXPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392893},"type":"module","gitHead":"a37fa7f98d8aefe02d677c2772905c94e6781431","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.87.0","@earendil-works/pi-coding-agent":"^0.87.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-a2a_0.7.12_1790266403278_0.2273888528423651","host":"s3://npm-registry-packages-npm-production"}},"0.7.13":{"pi":{"skills":["./skills"],"extensions":["./extensions/index.ts"]},"_id":"@bacnh85/pi-a2a@0.7.13","bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"dist":{"shasum":"337492a83ddcd5290d2319eca815b7ae53559f2f","tarball":"https://registry.npmjs.org/@bacnh85/pi-a2a/-/pi-a2a-0.7.13.tgz","fileCount":21,"integrity":"sha512-CQxZOU+lMn7PPCHqJefICfqIEOtGDXP1TcVFBxiJleR/HZ+WrRnC2Ss8wpPkDNSLPl2TMytL9B3boWjB5gJarg==","signatures":[{"sig":"MEUCIQDbudyE7NZ4HkiIncCJmePmMcx0C+rVXTon5bbls0demgIgMyQfM+ecVfJygO5FqaWQJwI9ppNE4DcHY3f8NVaSIuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDsumMgCmtzgftG/5r68+6GcnZwJmG73a8LPhJ4dBFbMgIhALo5EfRncAnb15eyMdToZAKAQs+d9kxg3B9Sbqfctkir"}],"unpackedSize":353322},"name":"@bacnh85/pi-a2a","type":"module","gitHead":"500cfa53e96e9ff2b5279062cba5fb58d44f2abf","license":"MIT","scripts":{"test":"cd extensions && mocha","check":"npm run typecheck && npm test","typecheck":"tsc --noEmit"},"version":"0.7.13","_npmUser":{"name":"bacnh85","email":"mail@bacnh.com"},"homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"overrides":{"diff":"^8.0.3","js-yaml@>=4.0.0 <4.3.1":"^4.3.1","brace-expansion@>=2.0.0 <2.1.4":"^2.1.4","serialize-javascript@>=5.0.0 <7.0.5":"^7.0.5"},"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"_npmVersion":"10.9.8","description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","directories":{},"maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"_nodeVersion":"22.23.2","dependencies":{"@bacnh85/pi-config-panel":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","chai":"^4.5.0","mocha":"^11.8.0","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","@types/mocha":"^10.0.10","@earendil-works/pi-tui":"^0.87.0","@earendil-works/pi-coding-agent":"^0.87.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"optionalDependencies":{"bonjour-service":"^1.2.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-a2a_0.7.13_1790296133493_0.23720339864532836"}}},"time":{"created":"2026-08-13T07:15:38.188Z","modified":"2026-09-25T00:28:53.752Z","0.1.1":"2026-08-13T07:15:38.707Z","0.3.1":"2026-08-14T13:13:13.099Z","0.5.0":"2026-08-15T04:36:45.086Z","0.5.1":"2026-08-15T15:53:51.317Z","0.6.0":"2026-08-16T10:25:10.612Z","0.6.1":"2026-08-17T13:18:25.702Z","0.6.3":"2026-08-21T13:56:13.490Z","0.7.0":"2026-08-23T03:02:07.786Z","0.7.1":"2026-08-29T14:29:41.483Z","0.7.2":"2026-08-31T01:21:28.188Z","0.7.6":"2026-09-01T15:17:09.376Z","0.7.7":"2026-09-10T23:32:07.308Z","0.7.8":"2026-09-12T09:11:30.597Z","0.7.9":"2026-09-19T02:20:58.735Z","0.7.10":"2026-09-20T05:10:30.416Z","0.7.11":"2026-09-21T03:51:02.441Z","0.7.12":"2026-09-24T16:13:23.368Z","0.7.13":"2026-09-25T00:28:53.604Z"},"bugs":{"url":"https://github.com/bacnh85/pi-extensions/issues"},"license":"MIT","homepage":"https://github.com/bacnh85/pi-extensions/tree/main/pi-a2a","keywords":["pi-package","pi-extension","a2a","agent-to-agent","agent-interop","multi-agent","task-distribution"],"repository":{"url":"git+https://github.com/bacnh85/pi-extensions.git","type":"git","directory":"pi-a2a"},"description":"A2A Protocol v1.0 bidirectional extension for the Pi coding agent — distribute tasks to remote agents, be called by them, and self-declare for local session discovery.","maintainers":[{"name":"bacnh85","email":"mail@bacnh.com"}],"readme":"# @bacnh85/pi-a2a\n\nA2A Protocol v1.0 bidirectional extension for the [Pi coding agent](https://pi.dev/).\n\nPi becomes a first-class **Agent2Agent** peer: it can **distribute tasks to\nremote agents** (Hermes, Google ADK, LangChain, CrewAI, anything A2A-compliant)\nand **be called by them**. Follows the upstream\n[A2A Protocol v1.0](https://a2a-protocol.org/latest/specification/) — JSON-RPC 2.0\nover HTTP, Agent Card discovery, task lifecycle, streaming.\n\n- **Zero runtime dependencies** — pure Node.js stdlib + global `fetch`\n- **Outbound** always available; **inbound** opt-in (default off)\n- Security model ported from Hermes: localhost-default bind, token-gated\n  remote, outbound redaction, inbound injection filtering, audit log, anti-loop\n\n## Install\n\n```bash\npi install npm:@bacnh85/pi-a2a\n# or from the monorepo\npi install ./pi-a2a\n```\n\nThen `/reload` in Pi.\n\n## Quick start\n\n### Call a remote agent\n\n```bash\n# Discover what an agent can do\n/a2a-discover http://localhost:9900\n\n# Send it a task\n/a2a-send hermes_desktop \"Summarize today's arXiv postings on retrieval-augmented generation\"\n```\n\nOr let the model delegate via the `a2a_call` tool:\n\n> \"Ask the researcher agent to summarize today's arXiv postings.\"\n\n### Be callable by other agents\n\n```bash\n/a2a-server start\n# → A2A server listening on 127.0.0.1:9910.\n#   Agent Card: http://127.0.0.1:9910/.well-known/agent-card.json\n```\n\nOther agents can now discover and call Pi:\n\n```bash\ncurl http://127.0.0.1:9910/.well-known/agent-card.json\n\ncurl -X POST http://127.0.0.1:9910/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"SendMessage\",\n       \"params\":{\"message\":{\"messageId\":\"m1\",\"role\":\"ROLE_USER\",\n                 \"parts\":[{\"text\":\"Find all TODO comments in src/\"}]}}}'\n```\n\n## Configuration\n\nEdit `~/.pi/agent/settings.json` under the `a2a` key. Key reference:\n\n| Key | Default | Meaning |\n|-----|---------|---------|\n| `peers` | `{}` | Static peer directory: `name → { url, auth, timeout, capabilities }` |\n| `selfIdentity` | `\"\"` | Outbound caller identity — a key in `server.peerTokens` (unique audit attribution) |\n| `server.enabled` | `false` | Auto-start the inbound server on session start |\n| `server.port` | `9910` | Inbound port |\n| `server.portFallback` | `10` | Consecutive ports to try if busy (then OS-assigned) |\n| `server.host` | `127.0.0.1` | Bind host (widen to `0.0.0.0` ONLY with a token set) |\n| `server.workspace` | cwd | Workspace for inbound isolated sessions |\n| `server.agentName` | hostname | Name on the Agent Card |\n| `server.publicUrl` | `\"\"` | Externally-routable URL for the Agent Card (reverse proxy / k8s) |\n| `server.sharedToken` | `\"\"` | Shared bearer token for the inbound server |\n| `server.peerTokens` | `{}` | Per-peer token directory `name → token` (unique identities) |\n| `server.trustedPeers` | `[]` | Allow-list of authenticated identities |\n| `server.allowAllUsers` | `false` | Allow any authenticated peer (dev only) |\n| `server.childTranscripts` | `true` | Persist each dispatched child session's transcript to `<agentDir>/a2a_sessions/<timestamp>_<taskId>.jsonl` (a real pi session file, openable with pi's session tooling) so stalled/killed workers leave a forensic step history. Off = stock in-memory children |\n| `server.childTranscriptRetentionDays` | `30` | Delete child transcripts older than N days on server start. `0` = keep forever. Transcripts carry everything the worker read — keep the window bounded |\n| `server.maxConcurrent` | `3` | Max concurrent inbound tasks (blocking **and** detached — see the operator note under [Non-blocking dispatch](#non-blocking-dispatch-returnimmediately)) |\n| `server.replyTimeoutSec` | `300` | Seconds to wait for the agent's reply on a blocking send. `0` = no reply-window timer (unbounded — the request stays open until the run settles; deliberate, rare) |\n| `server.asyncTimeoutSec` | `86400` | Supervision window (seconds) for **detached** tasks sent with `returnImmediately` — the caller's request already returned an ack, so this bound replaces the reply window. `0` = unbounded (caller-supervised via `tasks/get` / `tasks/cancel`) |\n| `server.maxPingpongTurns` | `5` | Anti-loop turn cap per context (max 20) |\n| `server.rateLimitPerMin` | `60` | Requests/minute per identity |\n| `server.skills` | `[]` | Skills advertised on the Agent Card. When empty (default), skills are **self-discovered** from the live session — no config needed |\n| `timeouts.send` | `360000` | Outbound send timeout (ms); kept above the default 300s server reply deadline |\n| `timeouts.async` | `30000` | Async task poll interval (ms) |\n| `timeouts.stream` | `120000` | Streaming timeout (ms) |\n| `retryAttempts` | `2` | Outbound retry count |\n| `verifySsl` | `true` | Verify TLS on outbound calls |\n| `discovery.local` | `{enabled:true, heartbeatSec:15, ttlSec:60}` | Local file registry |\n| `discovery.mdns` | `{enabled:false, serviceType:\"a2a\"}` | mDNS broadcast + discovery |\n| `discovery.gateway` | _(unset)_ | Legacy single upstream a2a-switchboard registration (`enabled`, `url`, `token`, `name`, `upstreamToken`, `heartbeatSec`, `channel`) — see [a2a-switchboard gateway](#a2a-switchboard-gateway) |\n| `discovery.gateways` | _(unset)_ | **Multiple** upstream a2a-switchboard gateways (0.6.0): a keyed map `{ <key>: {enabled, url, token, ...} }` — each gateway registers + heartbeats independently; peers appear as `gw/<key>/<name>` |\n| `discovery.enrichCard` | `true` | Publish session metadata into the Agent Card |\n| `ui.transcript` | `true` | Show inbound activity as transcript messages |\n\nExample:\n\n```jsonc\n{\n  \"a2a\": {\n    \"peers\": {\n      \"hermes_desktop\": {\n        \"url\": \"http://172.30.55.31:9900\",\n        \"auth\": { \"type\": \"bearer\", \"token\": \"...\" },\n        \"timeout\": 120,\n        \"capabilities\": [\"web_search\", \"research\"]\n      },\n      \"researcher\": {\n        \"url\": \"http://localhost:9999\",\n        \"auth\": { \"type\": \"bearer\", \"token\": \"...\" },\n        \"capabilities\": [\"research\"]\n      }\n    },\n    \"server\": {\n      \"enabled\": false,       // set true to auto-start the inbound server\n      \"port\": 9910,\n      \"portFallback\": 10,     // if port is busy (another Pi session), climb to port+1 … +10, then OS-assigned\n      \"host\": \"127.0.0.1\",    // widen to 0.0.0.0 ONLY with a token set\n      \"workspace\": \"\",        // defaults to the host session's cwd\n      \"agentName\": \"pi\"\n      // \"skills\": [...] — optional override; when omitted the card\n      // self-discovers the session's loaded skills\n    },\n    \"timeouts\": { \"send\": 360000, \"async\": 30000, \"stream\": 120000 }\n  }\n}\n```\n\nPeers can also be addressed by direct URL (no config needed): `a2a_call` with\n`agent: \"http://host:port\"` works. For **loopback** URLs that match a known\npeer (configured `a2a.peers` or a live local-registry entry), the session's\nshared token is auto-attached so discovered local Pi sessions are callable\nwithout manual per-peer config. Arbitrary loopback URLs never receive the\ntoken (prompt-injection guard).\n\n### Multiple Pi sessions (port fallback)\n\n`a2a.server.enabled: true` is **per-session** — every Pi session with it enabled\nstarts its own inbound server. With a **global** setting, the first session\nbinds the configured port; subsequent sessions hit `EADDRINUSE` and\nautomatically **climb to the next free port** (`port+1` … `port+10`, then an\nOS-assigned port), so they start cleanly instead of failing. Each session's\nAgent Card advertises the port it actually bound, so peers can always call it\nback.\n\nTo avoid surprise ports, prefer enabling the server **per project** — via env\n(`A2A_SERVER_ENABLED=true` from your shell or the global `~/.pi/agent/.env.local`)\nor the global `~/.pi/agent/settings.json` keyed per project. Note: a\n**project-local `.pi/settings.json` can no longer enable the server** —\nsecurity-relevant keys (`server.enabled`, tokens, host, gateway, …) are ignored\nfrom repo-controlled files, because a checked-out repo must not be able to turn\non an inbound agent server on whoever opens it. (`portFallback: 0` means\n\"configured port only, straight to OS-assigned on conflict\".)\n\n### Environment variables\n\n| Env | Default | Meaning |\n|-----|---------|---------|\n| `A2A_BEARER_TOKEN` | _(unset)_ | Shared bearer token for the inbound server |\n| `A2A_PEER_TOKENS` | _(unset)_ | Per-peer tokens `name:token,...` |\n| `A2A_HOST` | `127.0.0.1` | Inbound bind host (only widens with a token set) |\n| `A2A_PORT` | `9910` | Inbound port |\n| `A2A_PORT_FALLBACK` | `10` | Consecutive ports to try if `A2A_PORT` is busy before OS-assigned |\n| `A2A_AGENT_NAME` | hostname | Name on the Agent Card |\n| `A2A_PUBLIC_URL` | _(unset)_ | Externally-routable URL for the Agent Card (reverse proxy / k8s) |\n| `A2A_TRUSTED_PEERS` | _(unset)_ | Allow-list of authenticated identities |\n| `A2A_ALLOW_ALL_USERS` | `false` | Allow any authenticated peer (dev only) |\n| `A2A_RATE_LIMIT` | `60` | Requests/minute per identity |\n| `A2A_MAX_PINGPONG_TURNS` | `5` | Anti-loop turn cap per context (max 20) |\n| `A2A_REPLY_TIMEOUT` | `300` | Seconds to wait for the agent's reply (`0` = unbounded: no reply-window timer) |\n| `A2A_ASYNC_TIMEOUT` | `86400` | Detached-task supervision window in seconds (`0` = unbounded) — see [Non-blocking dispatch](#non-blocking-dispatch-returnimmediately) |\n| `A2A_CHILD_TRANSCRIPTS` | `true` | Persist dispatched child-session transcripts to disk (`false` = in-memory only) |\n| `A2A_CHILD_TRANSCRIPT_RETENTION_DAYS` | `30` | Days to keep child-session transcripts before cleanup |\n| `A2A_SERVER_ENABLED` | `false` | Auto-start the inbound server on session start |\n| `A2A_SELF_IDENTITY` | _(unset)_ | Outbound caller identity: a key in `server.peerTokens`. When set, this session presents its OWN per-peer token (not the shared token) so receivers attribute calls to it uniquely. Empty = use the shared token (anonymous caller). |\n| `A2A_DISCOVERY_LOCAL` | `true` | Enable the local file registry |\n| `A2A_DISCOVERY_MDNS` | `false` | Enable mDNS broadcast + discovery |\n| `A2A_MDNS_TYPE` | `a2a` | mDNS service type (advertised as `_<type>._tcp`) |\n| `A2A_GATEWAY_URL` | _(unset)_ | Agent-gateway base URL (with `A2A_GATEWAY_TOKEN`) |\n| `A2A_GATEWAY_TOKEN` | _(unset)_ | Agent-gateway API/bearer token |\n| `A2A_GATEWAY_ENABLED` | _(see gateway)_ | Explicit on/off for gateway registration; defaults to true when url+token are set |\n| `A2A_HEARTBEAT_SEC` | `15` | Registry heartbeat interval (seconds) |\n| `A2A_TTL_SEC` | `60` | Registry entry TTL before stale-sweep (seconds) |\n| `A2A_ENRICH_CARD` | `true` | Publish session metadata into the Agent Card |\n| `A2A_UI_TRANSCRIPT` | `true` | Show inbound task activity as transcript messages (false = toasts + footer only) |\n\n### Session discovery (0.2.0)\n\nEach inbound session self-declares its identity so peers can find it **and**\njudge whether it's the right delegate (working folder, model, abilities) — no\nport-scanning, no manual config. Three layers, all on by default (except mDNS):\n\n1. **Local file registry** (zero-dep) — `<piDir>/a2a_registry/<pid>.json`.\n   Instant same-machine discovery with dual stale-GC (mtime TTL + pid liveness\n   probe). The proven pattern (VS Code server, Emacs `server`, tmux).\n2. **Enriched Agent Card** — the card advertises an A2A v1.0 Extension + a\n   `metadata` map with pid/cwd/model/tools. Any A2A peer reads it.\n3. **mDNS** (`_a2a._tcp`) — cross-machine LAN discovery. Optional: install\n   `bonjour-service` to enable (`npm i bonjour-service`); without it the\n   extension degrades to the file registry + card. Each session advertises a\n   **unique, pid-suffixed name** (`<hostname>-a2a-<pid>.local`), never the OS\n   local hostname — so enabling mDNS cannot make macOS rename the machine\n   (\"local hostname already in use\"). If an earlier 0.3.0 session already\n   triggered a rename, restore it: System Settings → General → Sharing, or\n   `sudo scutil --set LocalHostName <name>`.\n\nConfigure under `a2a.discovery` in `settings.json`:\n\n```jsonc\n\"a2a\": {\n  \"discovery\": {\n    \"local\": { \"enabled\": true, \"heartbeatSec\": 15, \"ttlSec\": 60 },\n    \"mdns\":  { \"enabled\": false, \"serviceType\": \"a2a\" },\n    \"enrichCard\": true\n  }\n}\n```\n\nList discovered peers with the `a2a_peers` tool or `/a2a-peers` command — they\nshow each peer's name, url, source (`local`/`mdns`/`config`), cwd, model, and\ntools so you (or the model) pick the right one before `a2a_call`.\n\n### a2a-switchboard gateway\n\nRegister this session with a self-hosted [a2a-switchboard](https://github.com/bacnh85/a2a-switchboard)\nso other accepted peers discover and call it through the gateway's proxy\n(gateway peers appear as `gw/<key>/<name>` and carry the gateway bearer token).\nConfigure under `a2a.discovery.gateway` (single) or `a2a.discovery.gateways`\n(multiple) in `settings.json` (or the `/a2a-config` panel → Gateway\n(discovery.gateway) / Gateways (discovery.gateways) groups; the legacy single-\ngateway group is hidden when its block is inert — all-empty + disabled):\n\n```jsonc\n\"a2a\": {\n  \"discovery\": {\n    \"gateway\": {\n      \"enabled\": true,              // explicit on/off; defaults true when url+token set\n      \"url\": \"http://127.0.0.1:9920\",\n      \"token\": \"<gateway-api-token>\",\n      \"name\": \"pi-s2-9913\",          // optional; default <agentName>-<port>\n      \"upstreamToken\": \"...\",         // optional: token the gateway presents when proxying TO us\n      \"heartbeatSec\": 60,             // re-register interval\n      \"channel\": true                 // reverse channel so firewalled peers can call us\n    },\n    \"gateways\": {                     // 0.6.0: multiple gateways\n      \"work\": { \"enabled\": true, \"url\": \"http://10.0.0.5:9920\", \"token\": \"...\" },\n      \"lab\":  { \"enabled\": true, \"url\": \"http://127.0.0.1:9921\", \"token\": \"...\", \"channel\": false }\n    }\n  }\n}\n```\n\n- Registration is a **per-session** upstream per gateway: each configured\n  gateway registers itself, re-registers on heartbeat, and deregisters on\n  graceful stop — independently of the others.\n- `enabled: false` (or `A2A_GATEWAY_ENABLED=false`) disables registration\n  entirely while keeping the url/token for later.\n- **Peer naming (0.6.0, breaking):** gateway-proxy peers are ALWAYS prefixed\n  with the gateway key — `gw/<key>/<name>`. The single legacy `gateway` block\n  uses a key derived from its URL host-port (e.g. `gw/127.0.0.1-9920/<name>`),\n  so the old `gw/<name>` names no longer resolve. Use the `gateways` map with a\n  stable key if you want predictable names. Add/remove gateways from the\n  `/a2a-config` panel (Gateways group).\n- The panel renders tokens masked (`••••`); the token is stored in settings.json\n  in plaintext (same as `server.sharedToken`) — use env `A2A_GATEWAY_TOKEN` if\n  you'd rather keep secrets out of files (env feeds the single `gateway` block).\n- **Heartbeat method (PATCH /register):** the first registration with no\n  known `caller_token` (first ever, or the state file was lost) is a\n  `POST /register` with the shared token — the only path that mints the\n  per-peer `caller_token`. Once known, every heartbeat switches to\n  `PATCH /register` authenticated as that `caller_token` (full card refresh;\n  re-sending the URL covers IP changes). On `405` (old switchboard) or `401`\n  (stale token) the heartbeat falls back to POST and the fallback re-mints\n  when the response carries a new `caller_token`.\n\n  | Situation | Method | Auth |\n  |---|---|---|\n  | First register / unknown peer | `POST /register` | shared token |\n  | Steady-state heartbeat (`caller_token` known) | `PATCH /register` | `caller_token` |\n  | PATCH unsupported (`405`) or rejected (`401`) | `POST /register` | shared token |\n\n  The `caller_token` is disclosed by the gateway **only at mint**, so it is\n   persisted per gateway key and peer name at\n   `~/.pi/agent/a2a_gateways/<key>/<name>.json` (`{name, callerToken}`) — after\n   a restart, heartbeats PATCH immediately instead of re-minting. If both the\n   file and caller token are lost while the old peer still exists, delete that\n   peer in the switchboard admin UI once, then restart Pi; the next POST mints\n   a replacement token.\n- The directory fetch (`GET /.well-known/agent.json`) always uses the shared\n  token — unchanged by PATCH heartbeats.\n- **Failed registers back off exponentially (capped at 5 min).** A numeric\n  `Retry-After` header is honored when larger, the heartbeat pauses while\n  backed off, and success resets the backoff — no user action needed.\n\n### Per-session identity (unique caller attribution)\n\nWhen all sessions share one `sharedToken`, every caller authenticates as the\nSAME anonymous identity (`ip:127.0.0.1`) — the audit log can't tell callers\napart, and the rate-limit bucket is pooled across all local sessions. To give\neach session a **unique identity**, add a global `peerTokens` directory and set\nthis session's self-identity:\n\n```jsonc\n\"a2a\": {\n  \"selfIdentity\": \"session-a\",          // ← this session presents session-a's token\n  \"server\": {\n    \"sharedToken\": \"...fallback...\",\n    \"peerTokens\": {                        // ← global directory every session reads\n      \"session-a\": \"<tokenA>\",\n      \"session-b\": \"<tokenB>\"\n    }\n  }\n}\n```\n\nOr per-terminal via env: `A2A_SELF_IDENTITY=session-a`.\n\n- The token a session presents outbound is `peerTokens[selfIdentity]` (falls\n  back to `sharedToken` if unset/absent).\n- The receiver matches the presented token against `peerTokens` FIRST, so the\n  call is attributed to `session-a` (unique audit entry + separate rate-limit\n  bucket). Only tokens NOT in `peerTokens` fall through to the shared identity.\n- Sessions still reach each other: A presents `tokenA`, B's server looks it up\n  → identity `session-a`; no caller needs anyone else's token.\n\n### Outbound asserted identity (X-A2A-Identity)\n\nEvery outbound peer request carries the caller's configured identity\n(`selfIdentity`, falling back to `server.agentName`) as an\n`X-A2A-Identity` header, in addition to the `pi/self` message metadata. The\nuse case: when peers live behind a reverse proxy (or on other machines\nreached through one), every caller arrives from the proxy's address —\n`ip:127.0.0.1` tells the receiver nothing about WHICH agent dispatched. The\nheader lets a receiving peer's audit log attribute the call to a name\n(`pi-kimchi`, `librarian-bingsu`, …) instead of the address.\n\n- **Asserted display provenance, never authentication.** Any client can send\n  any name; a receiving server must only use it to refine the display name of\n  a caller it has ALREADY admitted (e.g. an authenticated shared-token\n  caller), never to grant admission or override a token-authenticated\n  identity. Receivers that don't know the header simply ignore it.\n- The header is omitted when no identity is configured (both empty).\n\n### Inbound asserted identity (0.7.12)\n\nThe receiving side honors that same `X-A2A-Identity` header — but only as\nattribution, and only inside a hard boundary:\n\n- **Loopback client of a loopback-bound server only.** The asserted name is\n  read only when the request arrives on `127.0.0.1`/`::1` AND the server's\n  listening socket actually bound a loopback host. A wider bind never trusts\n  the header, whatever address the client claims — remote callers must\n  authenticate with a token.\n- **Refines a name, never grants admission.** It applies only to the two\n  identity-less admissions (anonymous loopback, shared-bearer), never borrows a\n  name that a per-peer token could produce, and never turns a 401 into an\n  admit. A token-authenticated identity is never overridden.\n- **Sanitized before use.** 1–64 chars of `[A-Za-z0-9._-]` with an\n  alphanumeric first char; anything else is ignored and the caller falls back\n  to `ip:<addr>`. The name flows into audit logs, task-ownership keys, and\n  rate-limiter buckets, so it is bounded hard.\n- **Honest framing.** The inbound wrapper injected into the agent now states\n  how the peer connected (loopback / tailnet / remote) and how its identity was\n  derived (token-verified / asserted / address-only) — an asserted name is\n  labeled self-reported, not authenticated.\n\nUse case: when local pi sessions call each other through a loopback proxy,\nevery caller lands as `ip:127.0.0.1`; the header lets the receiver attribute\nthe dispatch to a name (`pi-kimchi`, `librarian-bingsu`, …) without weakening\nthe token boundary for anyone off loopback.\n\n### Session identity (0.7.12)\n\nOutbound messages stamp two advisory fields as A2A v1.0 message metadata:\n`pi/session` (the sender's pi session id) and `pi/self` (the configured\n`selfIdentity`). The local registry and agent card also advertise the host\n`sessionId`. Distinct live pi sessions share an agent name but never a session\nid, so a receiving peer can join a dispatch to its own ledger rows and records\non one stable key. All display/join data — receivers must never authenticate\non it.\n\n### Inbound activity in the host TUI (0.3.0)\n\nWhen a remote peer sends Pi an A2A task, the **host session** now shows what's\nhappening — you no longer wonder whether Pi is silently doing work:\n\n- **Arrival** — `[A2A inbound] dispatch from <peer>: <preview>` transcript\n  message + a toast.\n- **Progress** — the isolated session's tool calls and assistant text deltas\n  appear as compact one-line transcript messages (`⚙ bash …`, `✎ …`).\n- **Completion** — `[A2A inbound] A2A dispatch <label> completed (12.3s) —\n  <reply preview>` or `failed: <error>` toast + message. A footer status line\n  shows how many inbound dispatches are in flight and from whom.\n\nProtocol task ids are labeled as dispatches (`task-1b4f8d1c30d54819` →\n`a2a-1b4`) so a delegated execution reads as one peer-to-peer dispatch, not\na todo-list item; the raw id stays in the audit log. Transcripts written by\nolder versions say `task from` / `task <id> completed` — same meaning.\n\nToggle with `a2a.ui.transcript` (default `true`):\n\n```jsonc\n\"a2a\": { \"ui\": { \"transcript\": false } }  // toasts + footer only\n```\n\n> **Note:** transcript messages are `role: custom` and enter the host agent's\n> LLM context as user-role content. They're kept terse and prefixed with\n> `[A2A inbound]` so the host agent treats them as informational. Set\n> `ui.transcript: false` if you'd rather keep inbound activity out of context\n> entirely.\n\n### Interactive config panel (0.3.0)\n\nStop hand-editing settings.json — run `/a2a-config` in TUI mode to open an\narrow-key panel covering **Server** (enabled, port, host, agent name, reply\n timeout, concurrency, rate limit), **Discovery** (local registry, mDNS,\n enrich-card), **Identity** (selfIdentity), **Peers** (edit URLs, add/remove),\nand **UI** (transcript toggle).\n\n- ↑/↓ navigate · Enter toggles/edits · Esc to save/close.\n- Saving **persists to settings.json** (preserving all other keys) **and**\n  applies live via in-memory overrides — no `/reload` needed.\n- Changing server/discovery settings while the inbound server is running\n  auto-restarts it.\n- `/a2a-config show` prints the plain-text summary (also used in non-TUI\n  modes).\n\n## Tools\n\n| Tool | What it does |\n|------|--------------|\n| `a2a_call(agent, message, context_id?, async_dispatch?)` | Send a task to a peer, return its reply; multi-turn via `context_id`. `async_dispatch: true` returns an ack with the task id immediately (see [Non-blocking dispatch](#non-blocking-dispatch-returnimmediately)) |\n| `a2a_status(agent, task_id, wait_seconds?)` | Poll a previously dispatched task by id (GetTask); with `wait_seconds`, poll until terminal or deadline |\n| `a2a_discover(url)` | Fetch and summarize a peer's Agent Card |\n| `a2a_list()` | Configured peers, persisted conversations, metrics |\n| `a2a_history(context_id, limit?)` | Recall a persisted conversation |\n| `a2a_orchestrate(capability, message, mode?)` | Fan-out to all peers advertising a capability (`all`/`first`/`best`) |\n| `a2a_peers()` | List discoverable peers (local registry + mDNS + configured) with cwd/model/tools |\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `/a2a-discover <url>` | Fetch an agent's Agent Card |\n| `/a2a-agents` | List configured peers |\n| `/a2a-send <agent> <msg>` | Send a task to a peer |\n| `/a2a-broadcast <msg> --agents a,b,c` | Parallel fan-out to listed agents |\n| `/a2a-status` | Metrics + server status |\n| `/a2a-config` | Interactive config panel (TUI); `show` for summary |\n| `/a2a-server start\\|stop\\|status` | Manage the inbound server |\n| `/a2a-peers` | List discoverable peers (local registry + mDNS + configured) |\n| `/a2a-help` | Show help |\n\n## Safety\n\n- **Secure by default; every widening step is explicit.** No token ⇒ the inbound\n  server binds `127.0.0.1`; remote exposure requires a bearer token **and** an\n  explicit `a2a.server.host`.\n- **Per-peer tokens** (`A2A_PEER_TOKENS=\"alice:tok1,bob:tok2\"`) give each peer\n  its own credential; the authenticated name drives rate limiting and trust.\n- **Token attach is known-peer-only** — outbound calls attach the session token\n  ONLY to loopback URLs matching a configured peer or a live local-registry\n  entry. Arbitrary/prompt-injected `http://localhost:<port>` URLs never receive\n  any credential.\n- **Prompt-injection filtering** — inbound text is defanged and framed as\n  untrusted peer input. Remote peers cannot invoke operator slash commands.\n- **Outbound redaction** — credential-shaped strings (API keys, JWTs, tokens,\n  emails) are scrubbed from replies before they leave.\n- **Asserted identity is display-only** — the `X-A2A-Identity` header sent\n  outbound names the caller for attribution; it is self-reported, carries no\n  credential, and must never be trusted for admission on the receiving side.\n- **Untrusted metadata sanitized** — mDNS TXT records and registry files are\n  network/world-readable input; peer names/cwd/model are sanitized\n  (single-line, length-capped) before display.\n- **Audit log** — every exchange appends to `<piDir>/a2a_audit.jsonl`.\n- **Anti-loop** — per-context turn caps stop two agents ping-ponging forever.\n\n## Inbound: isolated sessions, not the live TUI\n\nPi has no platform-adapter API, so an inbound A2A task spawns an **isolated Pi\nagent session** (`createAgentSession`) in the configured workspace, runs it to\ncompletion, and returns the reply as a task artifact. The caller gets a\nreproducible, tool-equipped agent invocation in your repo — not the interactive\nTUI session. This is the correct boundary for a coding agent (and the same\nproven path `pi-subagent` uses).\n\nThe isolated session's activity is **surfaced to the host TUI** as transcript\nmessages + toasts (see \"Inbound activity in the host TUI\") — you see what the\ninbound task is doing without it running in your live session.\n\nThe isolated session runs the **full extension lifecycle**: after creation it\nfires `session_start` (via `bindExtensions`, the same thing the SDK's print\nmode does), so extensions that wire their tools on session start — e.g.\npi-mcp-extension's MCP servers — are available to the dispatched agent, and\n`session_shutdown` is emitted on completion so extension-started processes\nare cleaned up. The child never touches the host's own inbound server:\nserver lifecycle handlers are host-session-only.\n\nLong dispatches run with **auto-compaction enabled** and a keep window scaled\nto the model's context window, and the runner waits for the session's\npost-run recovery before reporting completion. Without that, a task that\ngrows near the context window dies misleadingly: pi clamps `max_tokens` to\nwhat remains (down to 1), the model's final turn ends on a length stop with\nno text, and the task would otherwise complete with the *previous* turn's\nstale reply. Such a turn now fails the task (`FAILED`, status message\n\"no usable reply was produced\") instead of masquerading as success.\n\n## Non-blocking dispatch (returnImmediately)\n\nA blocking `message/send` holds the HTTP request open until the agent finishes\n— so the caller's reply window bounds the **worker's** runtime: a long job\n(reindex, multi-file refactor, an ops run) gets killed when the caller stops\nwaiting, even though the caller only wanted to submit it.\n\nA2A v1.0 §3.2.2 `SendMessageConfiguration.returnImmediately` decouples the\ntwo. On the wire it is one extra field:\n\n```jsonc\n{\n  \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"message/send\",\n  \"params\": {\n    \"message\": { \"role\": \"ROLE_USER\", \"parts\": [{ \"text\": \"long job\" }] },\n    \"configuration\": { \"returnImmediately\": true }\n  }\n}\n```\n\nThe server acks immediately with the Task in `TASK_STATE_WORKING` and keeps\nrunning it **detached** from the request. The ack no longer waits for the\nwork; the work no longer dies with the caller's patience. The caller then\npolls `tasks/get` (or cancels via `tasks/cancel`) by task id.\n\nFrom Pi's tools this is `async_dispatch` + `a2a_status`:\n\n```text\na2a_call(agent=\"worker\", message=\"reindex everything\", async_dispatch=true)\n# → [A2A → worker · context … · working · detached]\n#   Dispatch accepted — task task-1b4f… is running on the peer (non-blocking).\n#   Poll the result with a2a_status(agent: \"worker\", task_id: \"task-1b4f…\").\n\na2a_status(agent=\"worker\", task_id=\"task-1b4f…\")          # one fetch\na2a_status(agent=\"worker\", task_id=\"task-1b4f…\", wait_seconds=300)  # poll until terminal\n```\n\n- A peer that does not understand `returnImmediately` simply blocks and\n  returns the finished task — `a2a_call` falls through to the normal reply\n  formatting, so the flag is always safe to send.\n- A **fast** task may complete before the ack is serialized; the ack then\n  carries the terminal state and artifacts (the client treats it as a normal\n  reply — no polling needed).\n- Detached runs count against `server.maxConcurrent` exactly like blocking\n  ones, and overflow is supervised by `server.asyncTimeoutSec` (default\n  24h, `0` = unbounded/caller-supervised) → `TASK_STATE_FAILED` with a\n  descriptive status message, mirroring the reply-window semantics.\n- **Operator note — a detached run pins a concurrency slot for its whole\n  lifetime.** The gate runs *before* the blocking/detached split, and a\n  detached run holds its `maxConcurrent` slot from the ack until it reaches\n  a terminal state — up to `asyncTimeoutSec` (24h by default) each. Three\n  slow or hung detached dispatches at the default `maxConcurrent: 3`\n  therefore block **all** inbound work — blocking `message/send` included\n  (`server busy`) — until they drain. Levers: keep `asyncTimeoutSec` as low\n  as your longest legitimate detached job (it is the kill switch that frees\n  the slot), raise `maxConcurrent` if you routinely dispatch long jobs, and\n  `tasks/cancel` a stuck task to free its slot immediately. (A separate\n  `maxDetached` budget is a plausible follow-up.)\n- `returnImmediately` has **no effect on `message/stream`** (per §3.2.2) —\n  streaming keeps its blocking semantics.\n- The snake_case spelling `return_immediately` is accepted for early\n  v1.0-draft clients.\n\nFor fleet agents: the natural completion signal is still the shared queue\n(knowfleet) — poll `a2a_status` only to surface progress or fetch artifacts,\nnot as the source of truth for whether the worker finished its bookkeeping.\n\n## Hermes interop\n\nThe primary interop target. Hermes (`~/.hermes/hermes-agent`, A2A platform\nplugin) implements the same v1.0 wire format bidirectionally, so Pi ↔ Hermes\nworks out of the box:\n\n```bash\n# Discover the local Hermes\n/a2a-discover http://localhost:9900\n\n# Send Pi a task FROM Hermes (once /a2a-server start)\n# In Hermes: a2a_call(\"http://<pi-host>:9910\", \"Find all TODO comments in src/\")\n```\n\n## Protocol compliance\n\nImplements the A2A Protocol v1.0 JSON-RPC binding. v1.0 method names\n(`SendMessage`, `SendStreamingMessage`, `GetTask`, `ListTasks`, `CancelTask`,\n`SubscribeToTask`) speak the v1.0 wire shapes — `SendMessage` replies with the\noneof `{\"task\": …}` / `{\"message\": …}` wrapper, streaming emits\n`TaskStatusUpdateEvent` / `TaskArtifactUpdateEvent` frames, and `ListTasks`\nreturns full `Task` objects. The pre-1.0 path aliases (`message/send`,\n`message/stream`, `tasks/get`, …) keep the legacy wire shapes (bare `Task`\nresults, `{id, state}` list stubs) so existing peers see no change.\n\n| Feature | Status |\n|---------|--------|\n| Agent Card (`/.well-known/agent-card.json`) | ✅ + legacy `agent.json` |\n| `message/send` (sync) | ✅ |\n| `message/send` non-blocking (`configuration.returnImmediately`) | ✅ (see [Non-blocking dispatch](#non-blocking-dispatch-returnimmediately)) |\n| `message/stream` (SSE) | ✅ |\n| `tasks/get`, `tasks/list`, `tasks/cancel`, `tasks/subscribe` | ✅ |\n| Part types (text, file, data) | ✅ (v1.0 + v0.3 tolerant) |\n| Task lifecycle states | ✅ |\n| Push notifications | 🔜 (HMAC signing scaffolded) |\n| gRPC / HTTP-REST bindings | Not implemented (JSON-RPC only) |\n\n## Development\n\n```bash\ncd pi-a2a\nnpm install\nnpm test         # mocha + tsx\nnpm run typecheck\nnpm pack --dry-run\n```\n\nLive mDNS tests are opt-in: `MDNS_NETWORK_TESTS=1 npm test` (they publish\nreal `_a2a._tcp` records on the local network).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}