{"_id":"@andrewjacop/pi-herdr","_rev":"12-1f5f64dccebe5b2811cfe9c29d0c882f","name":"@andrewjacop/pi-herdr","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@andrewjacop/pi-herdr","version":"0.1.0","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.1.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"79edb74e4cda42316556cb0d2122b1b4333cf6d0","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.1.0.tgz","fileCount":11,"integrity":"sha512-t9QP/syqcq+Sbt0wNeTUR5fqw1/7XkWFICv56sBJ3Vtk2WDeEIN9NXIbkMoEwOoZyXiGY3Qesr3ar1AF44jsxQ==","signatures":[{"sig":"MEUCIQCAhqL5f8tu4jNaEzaIRgHvVqKu4V0EwzsFMCWrt0b5SAIgOK191rJ4Q8yl6CJuLTjV8vyM3PMH3Q01AqifEtbo3aw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57077},"type":"module","engines":{"node":">=20"},"gitHead":"8fd5d8f168464adb6a7568f4baf010f99431ef2d","scripts":{"test":"node tests/smoke.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.1.0_1783882508505_0.8328163055583826","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@andrewjacop/pi-herdr","version":"0.1.1","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.1.1","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"d0b0c8c09de4f58b39ee8de849375bfd3d602c90","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.1.1.tgz","fileCount":11,"integrity":"sha512-ZWMF7beOm306LgR5f7YxSuNvpaTkzk2i2bALZUUbNyzbSjmhz32DaaWHKnvrkc0ZHtUC/1Dype+m1K5efF0Yqg==","signatures":[{"sig":"MEUCIQCSxhVt9l6UVSctWAXs7zAttnthrO2FarkbyERvyEouEQIgcIP/VD9bO4T4Scv0thvK9DIShiRxb46SMYledVME6ww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57635},"type":"module","engines":{"node":">=20"},"gitHead":"33f3c1f1abae481368545c3ef11ad43fc8122b90","scripts":{"test":"node tests/smoke.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.1.1_1783883064395_0.6954454618296055","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@andrewjacop/pi-herdr","version":"0.2.0","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"7be6e6671ca161cbf14085db3a8039e5958cdbbc","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.0.tgz","fileCount":11,"integrity":"sha512-jh4aJB6POmh3OdKMzWIhQvHpAOz/UZcQ8Uw9z3oMJ6LIribUgH3oCd68UQiBxbKCNYjG15tMIeqHDZlyoQ6Ozg==","signatures":[{"sig":"MEYCIQC7xpU5VYhN9DCvZQJB3Z11bEntBoJlaAVu7ZYD90mzEAIhAJa+/5KBeU9e1Etnz+6ToEeVU6n0mOi3+x42d94sBLSK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63754},"type":"module","engines":{"node":">=20"},"gitHead":"c58d6c0be89adf16dcb0190e5731164c543ba9a3","scripts":{"test":"node tests/smoke.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.17.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.0_1783940514795_0.5824229246539003","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@andrewjacop/pi-herdr","version":"0.2.1","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.1","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"20aa656af4fbb6ad9e54b208d4b90c164efdc09e","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.1.tgz","fileCount":12,"integrity":"sha512-89OLZ6eNip/MHHLRDD8z//oaBlT/H3QQtSM8fEeFgmLuQFwGhynptGkZOBxhTT+rUGy91b0pEzjcQJIPoehNgA==","signatures":[{"sig":"MEUCIGLOG1TpHhMVjfY9JqAnzSJSE6FfPi4v15gMkehED5eqAiEAlw/WPL4GLh3G1mFyT/Ll1BIAYy1f/pUIzgW4ZU9SB10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75787},"type":"module","engines":{"node":">=20"},"gitHead":"80b748935110944fec4e4a4de8b3bba33f820b63","scripts":{"test":"node tests/smoke.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.17.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.1_1785313612391_0.5381941888790647","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@andrewjacop/pi-herdr","version":"0.2.2","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.2","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"e9b508b2dc8cd6193068156cf69391cb9db63034","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.2.tgz","fileCount":12,"integrity":"sha512-P5nIedut9A2EeBSbtNo8TJKjFd0zTDwR9cSFsOXxr45GLvxteOeVZcFuchxz3Rd632Kp69e8qzKXt8XWGyvaCg==","signatures":[{"sig":"MEYCIQC4/1YaBjMyqH+Gy6hASK9bgpYwXbE6w3zohzNda1SFIgIhAIL8uC4GkaPU6ZR1Z1Z9jimUHTt6AZz9+zNIVZF5/6uV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79148},"type":"module","engines":{"node":">=20"},"gitHead":"262903166c5447beb1d23796bd8e2d4aa1de6aa7","scripts":{"test":"node tests/smoke.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.17.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.2_1785317871189_0.017161677127590202","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@andrewjacop/pi-herdr","version":"0.2.3","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.3","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"bf6be2d7fa1f48dd526c33deb791945591895b86","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.3.tgz","fileCount":12,"integrity":"sha512-07b2PXgVmxJNlhJOJ2vTqN68LrUTdw3Ft5PzkUhQkMQeM6lHrpor9VW8LoV+8ZBXQ9yAAz7X6qBl2mFxBDRc4w==","signatures":[{"sig":"MEUCIQDaPOVos+f51vZm63r04o0QyLrdXrDceEGL60MD3KsD1AIgVjTdOAiKnxFMMyXS/KXn/sLmj4sgJKQCHD9v02vYl2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84841},"type":"module","engines":{"node":">=20"},"gitHead":"082fc094b7caf1266e1268e1428c8c2fecccdf61","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.3_1785349546772_0.3082094391490411","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@andrewjacop/pi-herdr","version":"0.2.4","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.4","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"6fcb0bfea168fefbaa9de714f6463dfc5295cdb0","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.4.tgz","fileCount":12,"integrity":"sha512-F1rxn4TTaHoVb7ZYxMPrfNP1nfEINxrz+bYdE66P/zpWFgFBSx5aGkjYWqvaQrTIeJtu+EfMnNRWmzD1XXNtFQ==","signatures":[{"sig":"MEYCIQDNm4s9ZMdnMtn+hHqgMdY16yvL21aOYDSUY72NMcTqCAIhALyjpI3LrXhLNOnGj9I6hmJeF4FtJ2d1K6Wn20dPmLLG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87741},"type":"module","engines":{"node":">=20"},"gitHead":"20e4cff94b735fdc238d0ccd4bb9d97d8b7bebfe","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.4_1785665666414_0.9250314844862693","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@andrewjacop/pi-herdr","version":"0.2.5","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.2.5","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"3277c0169ea57a44152fd51799712e76f2069c09","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.2.5.tgz","fileCount":16,"integrity":"sha512-8C2DiMV+tsPlSKmk942/TD+UVb7kyHrfdbEcD5XMU00MVN+GYZ95aeeTEtOiud+FDuSyk+kVGjrjS/qobOhPNg==","signatures":[{"sig":"MEQCIHb6vgRS/MmMlGKqrhKzzZWUrl+y4LBzD9KImJofo6uqAiAVrH+R1QSwcihTyQOg9bp+uAxiWvYVkMk0S2DFHsulpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168057},"type":"module","engines":{"node":">=20"},"gitHead":"6bc060792da86f8934162210f7c02317b0ad20db","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.2.5_1785678774638_0.885201525971349","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@andrewjacop/pi-herdr","version":"0.3.0","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.3.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"535badae4463c555251755f6861c7b36a4603690","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.3.0.tgz","fileCount":16,"integrity":"sha512-FV5BcVb8d1bUB0uGLu+FjiIpdaHJxaa/bNoQQdrvP7wYeUh8vxGeGGFVSPsitO0NYBapo3FeydB4sD/l8a6Qtw==","signatures":[{"sig":"MEQCIENtu8FTHfs+gpin19S8KF/R58Xory8nDQhi9L+uz8P2AiA/bu4V92lDZjonzgXkPa4MNntQuWkOSagMK9VoiokfLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177240},"type":"module","engines":{"node":">=20"},"gitHead":"a5cffbf4337d0cd4a4b94e3286a4310ac2512eb9","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs && node tests/blocked.mjs && node tests/dev-load.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.3.0_1786461382626_0.5924774666730066","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@andrewjacop/pi-herdr","version":"0.4.0","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.4.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"79d26a666a875cd784c02fa8f74e2bca2abc4b46","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.4.0.tgz","fileCount":16,"integrity":"sha512-umBDIL7WKXB6w+XA3kzoW9ty1YmS8Ko7w6osdB/zgkqSiouAx9fxuWKav8SUidyb0qzirhtp/288wVAR0mtasw==","signatures":[{"sig":"MEUCIQCA61pDHP8MqAOTcHo0cp4ufFBquNeOL05Awo7XHE0TPQIgJR2iCdj/phfqplhEGtN3PjG+L3eguo/pXespaa+OzEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186260},"type":"module","engines":{"node":">=20"},"gitHead":"c49ed8b9abec28c96171add46a38916c412e0042","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs && node tests/blocked.mjs && node tests/dev-load.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.4.0_1788078728298_0.809977743296296","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@andrewjacop/pi-herdr","version":"0.5.0","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"author":{"name":"Andrew"},"license":"MIT","_id":"@andrewjacop/pi-herdr@0.5.0","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"pi":{"extensions":["./src/index.ts"]},"dist":{"shasum":"c6981ce10d700681d60ede7e532953df93dba01d","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.5.0.tgz","fileCount":16,"integrity":"sha512-fpHBUipbs5NZeTc0kRy1KRIneOuapWNKIo8SxrwthZSc8THUYx5AohIqYXIJzUqWXucB+Db1C9ClmKfwFeYwyg==","signatures":[{"sig":"MEYCIQC/QuRWyM/Z+rmpAV+sJaEVApDhHRBS2qNFRSm00QPpZQIhAJLjQiusEwWi+OA1/eQ6jD4z7HvRUVhMs64rvBSVtJuV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD41AZPs06FChblIeR1Ki25wyoOxP7bjm1FiiNC9tUDOwIgS6uZ5zYx0IqwV304fAT6CpwxhHH3QIfkuLpROvJMhvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189494},"type":"module","engines":{"node":">=20"},"gitHead":"519c92e18f5c1d4aafe4fe40cf8d8e3215760981","scripts":{"test":"node tests/smoke.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/pong.mjs && node tests/delegate.mjs && node tests/fallback.mjs && node tests/blocked.mjs && node tests/dev-load.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-herdr_0.5.0_1789196748602_0.8533552823138464","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"pi":{"extensions":["./src/index.ts"]},"_id":"@andrewjacop/pi-herdr@0.6.0","bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"dist":{"shasum":"ef1c89e98dc28b654efb0d2eae9083bcfdfd0eda","tarball":"https://registry.npmjs.org/@andrewjacop/pi-herdr/-/pi-herdr-0.6.0.tgz","fileCount":39,"integrity":"sha512-+Xd9LsZMFj+7L657NG0/rGJ4EMT8nhrvLxjYBo/DP9FzNeisJeD3tWZemadbT1MjPV1+igvIAFnbRGUS4xlGmw==","signatures":[{"sig":"MEQCICNJwKoheYUDwqMsEc5iX1O82XIQeyFma2S8ZJtUnXIZAiB7KqbrEGz8UfRck/8FM8+7nW/ECTrIUTQLZ5Ap7mZQNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDmR6uP9LHC8dXuH9uaH4c1VjpCfCSHqMBTyre3TODgIwIgbUQyJeLlIalF7GXMlea2dqSVTm/DCk9bIqjVgYmN7C4="}],"unpackedSize":639571},"name":"@andrewjacop/pi-herdr","type":"module","author":{"name":"Andrew"},"engines":{"node":">=20"},"gitHead":"e8e6f8272f50a990abc563421c86bd4492f47e22","license":"MIT","scripts":{"test":"node tests/smoke.mjs && node tests/substrate.mjs && node tests/settings.mjs && node tests/launchplan.mjs && node tests/modes.mjs && node tests/spawn.mjs && node tests/agentfiles.mjs && node tests/message.mjs && node tests/lifecycle.mjs && node tests/delivery.mjs && node tests/status.mjs && node tests/widget.mjs && node tests/workflow.mjs && node tests/workflow-journal-saved.mjs && node tests/workflow-card.mjs","test:win":"node tests/win-start.mjs","test:live":"node tests/live.mjs && node tests/selfreport.mjs && node tests/blocked.mjs && node tests/spawn-live.mjs && node tests/modes-live.mjs && node tests/message-live.mjs && node tests/push-live.mjs && node tests/lifecycle-live.mjs && node tests/workflow-live.mjs && node tests/dev-load.mjs","typecheck":"tsc --noEmit","test:multi":"node tests/multi.mjs","test:stress":"node tests/stress.mjs"},"version":"0.6.0","_npmUser":{"name":"andrewjacop","email":"andrewjacop@ymail.com"},"homepage":"https://github.com/AndrewJacop/pi-herdr#readme","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"_npmVersion":"11.13.0","description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","directories":{},"maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"_nodeVersion":"26.1.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.7.0","typebox":"^1.3.6","typescript":"^7.0.2","@types/node":"^22.20.1","@earendil-works/pi-ai":"^0.80.6","@earendil-works/pi-coding-agent":"^0.80.6"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-herdr_0.6.0_1790536176023_0.2556966216869152"}}},"time":{"created":"2026-07-12T18:55:08.354Z","modified":"2026-09-27T19:09:36.293Z","0.1.0":"2026-07-12T18:55:08.681Z","0.1.1":"2026-07-12T19:04:24.530Z","0.2.0":"2026-07-13T11:01:54.932Z","0.2.1":"2026-07-29T08:26:52.544Z","0.2.2":"2026-07-29T09:37:51.324Z","0.2.3":"2026-07-29T18:25:46.941Z","0.2.4":"2026-08-02T10:14:26.566Z","0.2.5":"2026-08-02T13:52:54.798Z","0.3.0":"2026-08-11T15:16:22.778Z","0.4.0":"2026-08-30T08:32:08.427Z","0.5.0":"2026-09-12T07:05:48.691Z","0.6.0":"2026-09-27T19:09:36.108Z"},"bugs":{"url":"https://github.com/AndrewJacop/pi-herdr/issues"},"author":{"name":"Andrew"},"license":"MIT","homepage":"https://github.com/AndrewJacop/pi-herdr#readme","keywords":["pi-package","pi","pi-coding-agent","herdr","ai-agent","orchestration","multi-agent","coding-agent","terminal","claude","codex"],"repository":{"url":"git+https://github.com/AndrewJacop/pi-herdr.git","type":"git"},"description":"herdr integration for the pi coding agent — spawn, drive, wait for, and harvest AI agent panes running in herdr.","maintainers":[{"name":"andrewjacop","email":"andrewjacop@ymail.com"}],"readme":"# pi-herdr\n\n[![npm version](https://img.shields.io/npm/v/@andrewjacop/pi-herdr.svg)](https://www.npmjs.com/package/@andrewjacop/pi-herdr)\n[![license](https://img.shields.io/github/license/AndrewJacop/pi-herdr)](./LICENSE)\n[![platform](https://img.shields.io/badge/platform-macOS%20%26%20Windows%20tested-blue)](#platform-support)\n\nA [pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) coding-agent\nextension that turns pi into an **orchestrator over a fleet of visible AI agent\npanes** running in [herdr](https://herdr.dev). Spawn another `pi`, `claude`,\n`codex`, or `opencode` in its own terminal pane with a task, steer it while it\nworks, wait for it to finish, and harvest its response — all from your pi\nsession. Each spawned agent is an independent CLI process you can watch, attach\nto, and intervene in while pi coordinates them.\n\nThe v0.6 surface is deliberately small: **one surface, twelve tools**\n(spawn, save, result, message, interrupt, resume, list, run_workflow, and\nthe pane quartet). Everything\nelse — layout, tab/workspace CRUD, worktrees, fleet introspection — is\nmachinery you never have to switch to: the herdr UI stays the human's surface\nfor that.\n\n> **Complementary to [`pi-subagents`](https://www.npmjs.com/package/pi-subagents):**\n> `pi-subagents` runs children **in-process** (fast, shared context). `pi-herdr`\n> runs agents in **separate herdr panes** (visible, heterogeneous, resumable,\n> directly attachable). They work well together.\n\n---\n\n## Platform support\n\n**Tested on Windows and macOS.** The code is platform-aware (`herdr` is spawned\ndirectly as a native binary, argv passed literally with `shell: false`) and is\n*expected* to work on Linux too, though that has not been verified. herdr's own\navailability on each platform follows [herdr.dev](https://herdr.dev). If you try\nLinux, please open an issue with the result.\n\n> **macOS — launch herdr from your terminal, not `brew services`.** A launchd-managed\n> herdr server inherits macOS's minimal PATH (no `node`), and spawned `pi` agents die\n> silently. See [Requirements → herdr](#2-herdr-the-workspace-manager).\n\n---\n\n## What is herdr?\n\n[**herdr**](https://herdr.dev) is a **terminal workspace manager for AI coding\nagents**. It runs multiple terminal panes/tabs/workspaces, each of which can host an\nagent CLI (`pi`, `claude`, `codex`, …), and it tracks each pane's agent state\n(`idle` / `working` / `blocked`). herdr exposes a local JSON-over-socket API and a\n`herdr` CLI; **this extension speaks that CLI** so the pi LLM can spawn and drive\npanes.\n\n`pi-herdr` does **not** bundle herdr — herdr is a separate product you install and\nrun yourself (see below).\n\n## Requirements\n\nYou need all of these before `pi-herdr` can do anything useful.\n\n### 1. pi (the host agent)\n\n```bash\nnpm install -g @earendil-works/pi-coding-agent\npi --version          # verify\n```\n\npi needs at least one model + API key configured (run `pi` and use `/login`, or see\n`pi --help`). **Spawned agents inherit this config**, so they can respond too.\n\n### 2. herdr (the workspace manager)\n\nInstall herdr from **<https://herdr.dev>** (follow the instructions there for your\nplatform). Then verify it's on your `PATH` and start a session:\n\n```bash\nherdr --version       # verify, e.g. \"herdr 0.9.0\" — pi-herdr requires ≥ 0.9.0\nherdr status          # shows server + socket; \"server: not running\" until you launch it\nherdr                 # launch the herdr workspace (starts its local server)\n```\n\nThe `herdr` server must be running for `pi-herdr`'s tools to work — they talk to that\nserver. If herdr is missing or not running, every tool returns a clean\n`HERDR_UNAVAILABLE` error instead of hanging.\n\n> ℹ️ **Version floor: herdr ≥ 0.9.0 (hard).** `pi-herdr` probes `herdr --version`\n> once at session start. Below the floor it refuses to run — one clean\n> `HERDR_TOO_OLD` error naming the upgrade pointer (<https://herdr.dev>), the\n> same style as `HERDR_UNAVAILABLE`; no tool half-works, no degraded paths.\n> 0.9.0 is the release that fixed Windows `agent start --kind` (shim launch +\n> flaky process-tree detection), which is what lets every platform share ONE\n> launch path. Above the floor the probe keeps reporting for diagnostics: the\n> detected version shows in the footer, e.g. `herdr 0.9.4`.\n\n> ⚠️ **macOS — do not manage herdr with `brew services`.** `brew services` runs the\n> herdr server under launchd, which gives it macOS's *minimal* PATH\n> (`/usr/bin:/bin:/usr/sbin:/sbin`) with no `node`. Spawned `pi` is a\n> `#!/usr/bin/env node` script, so it can't find `node` and the pane dies silently\n> (~2s, no output). (`claude`/`codex` survive because they're standalone binaries.)\n>\n> Launch herdr from your terminal instead, so the server inherits your shell PATH:\n>\n> ```bash\n> brew services stop --all 2>/dev/null; brew services stop herdr   # if you enabled it\n> herdr                            # from your project dir; starts a server w/ your full PATH\n> herdr status                     # confirm \"server: running\"\n> ```\n>\n> herdr attaches to a *persistent* session, so you must stop the launchd server first\n> — otherwise `herdr` just reattaches to the minimal-PATH one. There is no per-spawn\n> env injection on the v0.6 surface, so a minimal-PATH server can't be worked around\n> from a spawn — run herdr from your terminal.\n\n### 3. This extension\n\n```bash\npi install npm:@andrewjacop/pi-herdr\n```\n\nThat's it — every pi session (including agents you later spawn) will now load it.\nRestart pi (or `/reload`) if a session was already running.\n\n> **Quick test without installing:** `pi -ne -e ./src/index.ts` from a clone of\n> this repo — `-ne` skips installed-extension discovery so only this local copy\n> loads (great for end-to-end checks against a real herdr server).\n\n## Install\n\n### From npm (recommended)\n\n```bash\npi install npm:@andrewjacop/pi-herdr\n```\n\n### From source / local dev\n\n```bash\ngit clone https://github.com/AndrewJacop/pi-herdr.git\ncd pi-herdr\nnpm install\npi install ./          # register the local checkout globally\n```\n\n---\n\n## Quick start\n\nWith **herdr running** (you've launched `herdr` and `herdr status` shows the server\nup), open **another** terminal and start pi in a project:\n\n```bash\ncd my-project\npi\n```\n\nThen just ask pi in natural language:\n\n```\nSpawn a background agent to summarize README.md in 3 bullets, wait for it, and give me the result.\n```\n\nYou'll see a new pane appear in herdr, the spawned agent work, and pi return its\nanswer. While orchestrating, the fleet widget above the editor shows every\nin-flight agent — elapsed, name, projected `state · tool`, state age — with\nthe header counting `N active · M open` (amber border when nothing is active)\nand a loud callout beneath the table when an agent is blocked on a question.\nThe footer keeps diagnostics only (version tag, install/upgrade verdicts).\n\n---\n\n## Examples\n\n### Example 1 — One-shot task (the core pattern)\n\nHand a self-contained task to a fresh agent and collect the result.\n\n> 1. `Spawn an agent named \"summ\" with the task \"Summarize README.md in 3 bullets\" (herdr_spawn_agent).`\n> 2. `Pull the result (herdr_get_agent_result, wait: true) and give me the summary.`\n\n**What happens:** `herdr_spawn_agent` splits a pane, launches the agent, submits\nthe task, and returns a handle. Pi children run **autonomous** by default: when\nthe work settles they write their typed completion sidecar, close their pane,\nand the result lives on in the retained session file — pass `interactive: true`\nto keep the pane open for follow-ups instead. Passing `wait: 180000` (ms) folds\nthe timing into the spawn call: it blocks until the terminal status.\n\n### Example 2 — Parallel fan-out (do N things at once)\n\nBackground spawns run concurrently, so you can fan work out:\n\n> *Prompt:* `In parallel, spawn three background agents — one to write tests for auth.ts, one for payment.ts, one for user.ts (herdr_spawn_agent ×3). Pull all three results (herdr_get_agent_result, wait: true), then give me a combined summary and any failures.`\n\n**What happens:** Three panes spawn at once, each works its task concurrently.\nAt `max_parallel_agents` the extra spawns are accepted **queued** — they start\nwhen a slot frees. Pair with `isolated: true` to give each agent its own\nauto-created git worktree (fresh checkout, no interference).\n\n### Example 3 — Heterogeneous review (a different agent reviews pi's work)\n\n> *Prompt:* `Spawn a claude agent (inline definition, kind: \"claude\") with the task \"review the diff in git diff main\" and wait for its verdict.`\n\n**What happens:** A `claude` pane boots, receives the diff, and returns a review.\nBecause each agent is a real CLI in its own pane, you can mix models/vendors freely.\n\n### Example 4 — Steering and questions (stay in control)\n\nWhile an **interactive** agent (`interactive: true` — the pane stays open) is at\nwork you can steer it, and if it asks a question you can answer:\n\n> *Prompt:* `Send \"focus only on the auth module\" to agent \"tests\" (herdr_message_agent), then keep waiting.`\n\nIf an agent blocks on an ask-user overlay, `herdr_get_agent_result` reports it\n(`status: blocked`); answer **freeform** questions with `herdr_message_agent`\n— the message is delivered as the raw answer, typed into the overlay — and\n**option-list** questions with `herdr_send_keys` (typed text never reaches an\noption list — bare `Enter` picks option 1, `down` then `Enter` picks option 2).\n\n> ⚠️ **Interrupting a stuck pane:** to send Ctrl-C to a runaway agent, use\n> `herdr_send_keys` with `[\"ctrl+c\"]` (set `agentScope: true` to target an agent\n> rather than the raw pane).\n\n### Example 5 — Raw panes (logs, servers, builds)\n\nThe pane quartet drives *non-agent* panes you have open in herdr:\n\n> *Prompt:* `In pane w1:p3, run \"npm run dev\" (herdr_run_command), wait for the \"ready\" line (herdr_wait_output), and show me the first requests as they land (herdr_read_pane).`\n\n**What happens:** The command is typed + submitted in that pane; pi watches the\noutput without spawning an agent for it.\n\n---\n\n## Tools\n\n`pi-herdr` exposes **one surface of twelve tools**. Every agent-surface tool accepts `target` as a **pane id**\n(`w1:p3`), **agent name**, or **label**.\n\n### The agent registry\n\nSpawn `type` names resolve through a layered registry — **session** (inline\ndefinitions from accepted spawns this session) > **project** (`.pi/agents/*.md`)\n> **global** (`~/.pi/agent/agents/*.md`) > **built-in** (`general-purpose`,\n`Explore`, `Plan`). First-hit-wins per name, so a project file shadows a\nglobal one and a session definition shadows both. The file layers are\nread-at-use: a freshly saved `.md` resolves without a reload. A spawn that\nnames neither `type` nor `agent` — a bare prompt — resolves the built-in\n`general-purpose` through this same chain (a project `general-purpose.md`\nstill shadows it).\n\nAn agent file is YAML-ish frontmatter plus the system prompt as the body:\n\n```markdown\n---\nname: auditor\ndescription: Audits a diff for quality and security\nkind: pi\nmodel: anthropic/claude-opus-4-6\nthinking: high\nsession-mode: fork\nauto-exit: true\ninteractive: false\nspawning: false\ntools: read, bash\ndeny-tools: [\"write\", \"edit\"]\nskills: [\"/skills/audit\"]\nargs: [\"--plan\"]\ncwd: /repo\nprompt_mode: append\n---\n\nYou audit things. Be thorough.\n```\n\nThe folder is **shared** with other agent-definition tools (same locations,\nsame precedence as the coinstallable prior art): unknown frontmatter keys are\nignored on both sides, and list values accept either a JSON array or a plain\ncomma list. A malformed file is skipped and reported (in the unknown-type\nerror) — it never kills the rest of the registry. `model`/`thinking` resolve\nthrough the five-level routing chain (spawn param > frontmatter > settings pin\n> settings default > this session's model — exact `provider/model-id` only,\nenforce-or-error naming the level; see [Concepts](docs/concepts.md));\n`session-mode`, `auto-exit`, and `interactive` ride the spawn; `session-mode`\nselects how the child session begins (see [Session modes](#session-modes)).\n\n### The spawn entry point\n\n| Tool | What it does |\n| --- | --- |\n| `herdr_spawn_agent` | Spawn a background agent in a herdr pane, submit the task prompt, return `{name, paneId, status, sessionPath, stance, model, thinking, session_mode}`. Prompt-only spawn works: omitting both specifier fields defaults to the built-in `general-purpose` type (pi kind, autonomous stance). Otherwise a registry `type` (`general-purpose` / `Explore` / `Plan`, plus `.md`-registry and session-inline definitions) or an inline `agent: {…}` definition — never both. `model`/`thinking` resolve down the five-level routing chain — spawn param > frontmatter > `models.agents.<name>` > `models.default` > this session's model — exact authenticated `provider/model-id` only, enforce-or-error naming the offending level. `fork: true` boots a pi child with this conversation as context, truncated before your last user message (see [Session modes](#session-modes)). Gates (kill-switch → depth → parallel cap, over-cap = queued), `isolated: true` worktrees, `wait` to block for the result. Prompts over 2000 chars ride `<session>.task.md` beside the child's session file, delivered as a one-line reference. Every pi child runs on a parent-owned session file in pi's default sessions dir (`herdr/<name>` in `/resume`) with the injected child extension (`agent_done`, identity strip, typed completion sidecars); stance: autonomous (auto-exit on settle — pane closes, session retained) by default, `interactive: true` keeps the pane open. |\n| `herdr_save_agent` | Persist an inline `agent` definition or an existing registry `type` to a `.md` file in the project (`.pi/agents/`, default) or global registry — spawn it by `type` in any session afterwards. Ungated (delete the file to undo); refuses to overwrite an existing file unless `overwrite: true`. |\n\nAn inline `agent` definition takes: `name`, `description`, `kind` (default: the\n`default_kind` setting, `\"pi\"` — an unopinionated passthrough onto herdr's\nnative `agent start --kind` axis), `model`, `thinking`, `system_prompt`,\n`prompt_mode` (`replace`\\|`append`), `tools`, `exclude_tools`, `skills`\n(pi-only), `agent_args` (raw CLI flags, e.g.\n`[\"-ne\",\"-e\",\"./src/index.ts\"]` to load a local extension — spawn-level\n`agent_args` append after the definition's, last-wins), `session_mode`\n(`standalone`\\|`lineage-only`\\|`fork` — see [Session modes](#session-modes)),\n`auto_exit`, `interactive`,\n`spawning`, `cwd`. Honesty rule: a field the chosen kind cannot enforce refuses\nthe spawn naming the field — use `agent_args` or another kind.\n\n### Session modes\n\nHow a spawned pi child's session begins relative to this conversation — selected\nby frontmatter `session-mode:` or the spawn-level `fork: true` override:\n\n- **`standalone`** (default) — fresh session, no lineage. Today's behavior.\n- **`lineage-only`** — the child's seeded session header carries the\n  `parentSession` link to this session, with zero copied turns; pi's `/resume`\n  shows the relationship (lineage discovery, later forking).\n- **`fork`** — this conversation is copied into the child's session file,\n  **truncated just before your last user message**, session-entry noise\n  (model/thinking changes, compaction and branch summaries, custom extension\n  entries) filtered out — the child boots knowing everything discussed and\n  receives its prompt as the natural next user turn. Honest costs: fork is a\n  **context-copy tax** (the child re-processes the whole copied conversation)\n  and a **snapshot** (it freezes at spawn; the parent keeps moving; the pushed\n  result is the only sync-back). For \"you know what we've discussed, now do\n  X\" — never a default. A fork requested when this session has no readable\n  session file seeds an empty file (standalone on disk); the mode still\n  reports what was selected.\n\nThe registry records the mode alongside the session path; resume replays the\nfile whatever its lineage.\n\n### Results and steering\n\n| Tool | What it does |\n| --- | --- |\n| `herdr_get_agent_result` | **The result tool.** For spawned pi children it reads the EXACT final assistant message from the child's parent-owned session file (byte-identical, complete — no screen scraping); mid-flight calls return an interim snapshot. A failing child surfaces as a typed error (`stopReason`/`errorMessage` mined off the session). Panes this session didn't spawn (or non-pi kinds) fall back to pane-tail reading. A gone pane still answers with last-known metadata — its session file stays readable and resumable. `wait: true` blocks until done/failed/blocked/gone (through the queue). |\n| `herdr_message_agent` | **The open channel** — anyone ↔ anyone, no broker. Resolves `target` (pane id → herdr name → spawn handle → reserved `orchestrator` role; real names win) and injects text through the send machinery. Physics-adaptive: a blocked target gets the raw text as its answer; everything else is wrapped as `<agent-message from=\"…\" to=\"…\">` — spawner-declared identity, never verified. Fire-and-forget: the receipt reports `{delivery: \"message\"\\|\"answer\"}`; delivered-to-the-pane ≠ consumed-by-the-model. |\n| `herdr_interrupt_agent` | **Turn cancel** (pi children) — sends Escape to the pane and stamps the registry so the fleet reports `interrupted` immediately, even while herdr still shows the pane working; a lagging pre-interrupt activity snapshot can't overwrite it. The pane, session file, and supervision all stay intact. Not a terminate — closing panes is the kill-all action. Follow with `herdr_message_agent` for stop-and-redirect. Refuses honestly: non-pi kinds (use `herdr_send_keys` for a raw Escape), queued/never-started agents, settled panes, and gone panes — which point at `herdr_resume_agent`. |\n| `herdr_resume_agent` | **The recovery move** — relaunch a `gone` agent on its retained session file (`pi --session <retained>` in a fresh pane), by registry HANDLE (never a raw path). The launch plan re-derives NOW (the routing chain against current settings and this session's model — a settings change since death takes effect); the optional `message` is the opening prompt. Re-enters normal supervision: fleet row, watchdog, push-on-completion. Same gates as any spawn (kill-switch → depth → cap, over-cap = queued). Stance follows the definition: autonomous resumes auto-exit-and-push, interactive stay open. Honest limit: resume replays the session file — anything that lived only in the dead process is gone. |\n\n> `herdr_wait_agent` / `herdr_read_agent` are **retired** (v0.6 issue 04):\n> `herdr_get_agent_result` replaces them with exact session-file reads.\n\n### Push delivery, takeover, and idle re-arm\n\nYou never have to poll. When a spawned pi child finishes — by settling\nautonomously or by calling its injected `agent_done` — the child's **full\nfinal message is steered straight into your session**: the push carries the\nletter, not a doorbell. Detection is triply redundant: the child's typed\ncompletion sidecar first, then the session JSONL's last message when a child\ndied without one (typed error if it died failing), then an honest gone note\nafter a bounded grace when a pane vanished. Transient herdr hiccups never\nfake a completion. Each terminal event is pushed exactly once, and a **blocked**\nchild always wakes you (answer via `herdr_message_agent`) regardless of settings.\n\nThe `notifications` setting governs the wake: `normal` steers the result in\nand wakes you immediately; `quiet` delivers it on your next natural turn\nwithout waking; `none` pushes nothing — pull with `herdr_get_agent_result`\nwhenever you want (blocked still always wakes).\n\n**User takeover** splits two effects. If *you* type into a running child's\npane, its auto-exit is disabled — a pane never slams shut on a human — while\nthe result contract stays intact (`agent_done` still works, the session file\nis readable throughout). Your orchestrator gets a quiet\n`user took over <agent>` note on its next turn, and no mid-conversation\npushes land from that pane. The child distinguishes your keystrokes from its\norchestrator's own follow-ups (a steer watermark the parent stamps before it\ndrives the pane), so `herdr_message_agent` never fakes a takeover.\n\n**Idle re-arm** is the headless plug: after a takeover, once the child\nsettles and stays quiet for `idle_rearm_minutes` (default 15; any keystroke\nresets the timer), its latest final message auto-delivers — honestly labeled\n*auto-delivered after user steer* — the pane closes, and the session file is\nretained for resume. SSH in, steer, log out: the result still arrives, no\norphan panes.\n\n`herdr_get_agent_result` stays pure inspection: mid-flight snapshot, bounded\nwait, re-read — never a mandatory second step after spawn.\n> Raw pane reads remain on the pane-sync quartet (`herdr_read_pane`).\n\n### Interrupt, resume, and recovery\n\n**Interrupt** (`herdr_interrupt_agent`) cancels an agent's CURRENT turn, not\nthe agent: Escape lands in the pane, the session file and supervision stay\nuntouched, and the fleet row flips to `interrupted` on the spot (the parent's\nEscape receipt leads herdr's own view — a lagging activity snapshot can't\noverwrite it). New work ends the interrupt: `herdr_message_agent` returns the\nagent to `active` — stop-and-redirect in one flow. A human typing into the\npane ends it too (the projection self-corrects on the first fresh active\nsnapshot).\n\n**Resume** (`herdr_resume_agent`) is the documented recovery move for a\ngone agent — crashed, errored, or pane-closed mid-run. The registry kept the\nretained session file; resume relaunches on it, so the child boots with its\nfull conversation, not from scratch. The launch plan re-resolves at resume\ntime (routing levels against current settings — change `models.default`\nbetween death and resume and the child relaunches on the new model), and the\nrun re-enters every supervision path as any spawn. Same gates, same honest\nlimit: the session file is the whole truth — anything that lived only in the\ndead process is gone.\n\n### Scripted workflows\n\n| Tool | What it does |\n| --- | --- |\n| `herdr_run_workflow` | Run a small sandboxed JavaScript program in the background that fans out real agents: `agent(prompt, opts)` spawns one pi child and resolves to its exact final text; `pipeline(items, ...stages)` (no barrier) and `parallel(thunks)` (barrier) coordinate many; `phase()`, `log()`, `args`, `budget` round out the globals. Returns immediately — one aggregated completion push lands when the run settles. |\n\nThe script is the coordinator, not a worker: it has no filesystem, no\nnetwork, no `eval`, and `Date.now()` / `new Date()` / `Math.random()` throw\n(runs must be replayable — issue 13's resume journal is what replay buys).\nEvery `agent()` spawns a real pane through the ordinary gates (kill-switch →\ndepth → parallel cap, over-cap = queued — no separate pool), options mapped:\n`agentType` → registry type (pi-kind pinned), `model` → the routing chain\n(exact IDs, enforce-or-error), `effort` → thinking, `isolation: \"worktree\"` →\nherdr-side worktree, `gate` → a shell command that must pass after settle\n(failure = a typed agent error), `resume: label` → the resume machinery on\nthe retained session. A failed `agent()` resolves to `null` — scripts\n`.filter(Boolean)`; an un-awaited one fails the run. The workflow's children\nreport to the run, not the session: the run sends exactly one aggregated\ncompletion push, and a blocked child still wakes you (answer it with\n`herdr_message_agent` and the run continues). Source comes from an inline\n`script`, a `scriptPath`, or a saved `name` — `<name>.js` looked up in\n`.pi/workflows/` → `.agents/workflows/` → the agent dir's `workflows/`, first\nhit wins, and the `export const meta = { name, description }` literal (a\nvalidation rule, pre-parsed before anything runs) is what marks a file as a\nworkflow. Every run journals each settled `agent()` call beside its scratch\nscript as `<run id>.workflow.jsonl`; re-running with `resumeFromRunId` replays\nthe unchanged prefix from that journal — an edited suffix pays only the delta,\na journaled failure ends the prefix (resuming retries from the failure), and a\nrun that used `agent({ resume })` is never replayed. Same session only.\nWhile the run is going, a live progress card renders above the editor —\nworkflow name, `N/M agents · elapsed`, the phase tree with per-agent rows\n(✔/⟳, label, type, state, tool calls, duration), and `log()` lines beneath —\nand the fleet table shows ONE row for the run instead of a row per child (the\nrun reports for them). A schema'd call — `agent(prompt, { schema })` —\nregisters a `StructuredOutput` tool in the child and delivers the validated\npayload as the answer (pressure, not guarantee — the runtime re-checks, and\none retry prompt is sent if the child never called the tool). `budget.spent()`\nreturns the run's real output-token usage where the children's session files\nreport it, honest `Infinity` when one is unrecoverable; `total` is always\n`null`. Stopping a run = the /subagents “Stop workflow run” action (kill-all\nstops runs too); `workflows_enabled: false` removes the tool from the surface\n(evaluated at load) and refuses new runs after a mid-session toggle.\n\n### Fleet introspection\n\n| Tool | What it does |\n| --- | --- |\n| `herdr_list_agents` | List all running agents with status — the fleet's single introspection tool. |\n\n### The pane-sync quartet (raw pane control)\n\n| Tool | What it does |\n| --- | --- |\n| `herdr_run_command` | Run a shell command (text + Enter) in an existing raw pane. |\n| `herdr_read_pane` | Read a raw pane's terminal output. |\n| `herdr_wait_output` | Block until a pane emits matching output (e.g. a server `ready` marker). |\n| `herdr_send_keys` ⚠️ | Send logical key presses (`ctrl+c`, `esc`, `Enter`) — interrupts, option-list answers. |\n\nPer-tool reference: [docs/tools/orchestration.md](docs/tools/orchestration.md) ·\n[docs/tools/workflow.md](docs/tools/workflow.md) ·\n[docs/tools/pane-sync.md](docs/tools/pane-sync.md) ·\n[docs/concepts.md](docs/concepts.md).\n\n## How completion is detected (and why it's reliable)\n\nherdr auto-detects a pi pane's state from its TUI. It reliably catches `idle → working`\nbut **sometimes misses `working → idle`**, which can leave a finished pane stuck on\n`working` and hang a wait. `pi-herdr` solves this with **self-report**:\n\nWhen pi runs inside a herdr pane, this extension pushes its real state to herdr on\nlifecycle hooks — `agent_start → working`, `agent_settled → idle` — and on the\nblocked EventBus channels. The current channel is `herdr:blocked`, emitted by\n[`pi-ask-user`](https://www.npmjs.com/package/pi-ask-user) (v0.14+) when `ask_user`\nwaits/resumes **and** by `pi-subagents` for attention states; the legacy\n`rpiv:ask-user:blocked` ([`@juicesharp/rpiv-ask-user-question`](https://www.npmjs.com/package/@juicesharp/rpiv-ask-user-question))\nand `pi-cursor-sdk:ask-question:blocked` ([`pi-cursor-sdk`](https://github.com/fitchmultz/pi-cursor-sdk))\nare kept for back-compat (`active: true → blocked`, `active: false → working` so\nthe turn resumes). pi-herdr is the bridge that turns `herdr:blocked` into a herdr\n`pane report-agent --state blocked` — nothing else in JS consumes it, so without\nthis bridge blocked detection relies on herdr's native TUI-watching. A global install\n(`pi install npm:@andrewjacop/pi-herdr`) loads the extension into **every** pi —\nincluding spawned ones — so all pi agents report reliably.\n\nCompletion is read from herdr's state events — never inferred from the\nrendered `Working…` spinner (tool-call output replaces that spinner mid-work, which\nwould otherwise cause false \"idle\" reports). The spawn submits its task with one\natomic `agent prompt <pane> <text> --wait` call; its wait vocabulary races a\npolling `agent get` fallback alongside the event wait: if the event never fires\n(e.g. a `done`/`idle` state herdr doesn't derive), the poll still detects the\nsettled state promptly —\ninstead of hanging on the event or timing out the budget. For an agent that can't\nself-report (e.g. `claude`/`codex`), the poll catches the settled state too.\n\n> **Tip:** You can always unstick a pane manually:\n> `herdr pane report-agent <pane> --source manual --agent pi --state idle`.\n\n## Configuration (environment variables)\n\n| Variable | Default | Purpose |\n| --- | --- | --- |\n| `HERDR_BIN` | `herdr` (resolved via `PATH`/`PATHEXT`) | Override the herdr binary path. |\n| `PI_HERDR_NO_SELF_REPORT` | unset | Set to `1` to disable self-report in this pi. |\n\n## Settings (`/subagents config`)\n\nRun `/subagents` (or `/subagents config`) for the settings menu: one flat list of\n`key = value (source: project | global | default)` rows plus a confirmed\n**Kill all agents** action. Bool rows toggle, enum rows pick, number rows\ninput, `default_kind` picks from the live kind list, `models.default` takes a\nfree model id (empty unsets it), and the `models.agents` row edits one\nagent-name pin at a time (empty model removes the pin). Each edit persists to\nwhichever file owns the key (a default-sourced key writes the project file), so\na project checkout never mutates your global config. There is deliberately\n**no** `/subagents set key value` args form: settings are user knobs, and\nhand-editing the JSON files stays the scriptable path.\n\nSettings live in two JSON files, deep-merged with the project file winning per\nkey (and per agent name for `models.agents`):\n\n| File | Scope |\n| --- | --- |\n| `~/.pi/agent/herdr.json` | global |\n| `<project>/.pi/herdr.json` | project (wins per key) |\n\n| Key | Default | Purpose |\n| --- | --- | --- |\n| `agents_kill_switch` | `false` | Refuse new agent spawns. A gate only — never terminates running agents (that's the menu's Kill-all action). |\n| `default_kind` | `\"pi\"` | Agent kind spawned when none is given (validated against the live `herdr agent` kind list). |\n| `models.default` | *(unset)* | Model id every spawned agent falls back to (routing level 4). Empty/absent = routing falls through to the parent session's model. |\n| `models.agents.<name>` | `{}` | Per-agent model pins (routing level 3): agent name → model id. Entries merge across both files, project winning per name. |\n| `max_parallel_agents` | `3` | Concurrency cap; spawns beyond it are queued until a slot frees. |\n| `max_spawn_depth` | `2` | Guard against runaway recursive fleets. |\n| `notifications` | `\"normal\"` | Wake behavior when a spawned agent completes: `normal` = the full result is steered in and the session wakes; `quiet` = delivered on the next natural turn, no wake; `none` = no pushes at all (pull-only). A blocked agent always wakes, whatever this is set to. |\n| `idle_rearm_minutes` | `15` | After a user takeover, minutes of quiet (any keystroke resets) before the agent's latest final message auto-delivers — labeled *auto-delivered after user steer* — and its pane closes. The timer starts on settle, never mid-work; the session file is retained for resume. |\n| `workflows_enabled` | `true` | `false` removes `herdr_run_workflow` from the surface (evaluated at load) and refuses new runs after a mid-session toggle — never stops one in flight. |\n\nEvery key is read at the moment it matters, so menu edits take effect on the\nnext operation — no restart needed. Malformed JSON in a settings file is\nreported (and ignored) rather than silently dropping your other file's values;\nthe menu never overwrites a file it can't parse. The v0.5 `surface` and\n`allow_save_agent` keys are gone (see [Upgrading](#upgrading-v05--v06)).\n\n## Upgrading v0.5 → v0.6\n\n**Breaking: the tool surface was cut from 43 to one deliberate surface** (10\ntools today, 12 at v0.6 completion), and `/herdr` became `/subagents config`.\nRemoved tools and their replacements:\n\n| Removed | Use instead |\n| --- | --- |\n| `herdr_send_prompt` | `herdr_message_agent` (v0.6 issue 05) — same delivery path, plus the envelope, the full resolution chain, and the reserved `orchestrator` role. |\n| `herdr_wait_agent` / `herdr_read_agent` | `herdr_get_agent_result` (exact session-file reads; `wait: true` blocks until terminal). |\n| `herdr_delegate` | `herdr_spawn_agent` + `herdr_get_agent_result(wait: true)` (spawn + wait is the one-shot form; push delivery now brings the result to the session on its own). |\n| `herdr_start_agent` | `herdr_spawn_agent` (same single `agent start --kind` launch path underneath; registry types or inline definitions instead of loose flag bags). |\n| `herdr_get_agent`, `herdr_explain_agent` | `herdr_list_agents`. |\n| `herdr_stop_agent` | The confirmed **Kill all agents** action in `/subagents config`; for one runaway agent, `herdr_send_keys` with `[\"ctrl+c\"]`, or close the pane in the herdr UI. |\n| `herdr_rename_agent`, `herdr_focus_agent` | The herdr UI (rename/focus a pane yourself). |\n| `herdr_split_pane`, `herdr_close_pane` | The herdr UI — open/arrange panes yourself; drive them by id with `herdr_run_command` / `herdr_read_pane` / `herdr_wait_output` / `herdr_send_keys`. |\n| All layout CRUD (`herdr_list_panes`, `herdr_get_pane`, `herdr_resize_pane`, `herdr_zoom_pane`, `herdr_move_pane`, `herdr_swap_panes`, `herdr_list_tabs`, `herdr_create_tab`, `herdr_get_tab`, `herdr_focus_tab`, `herdr_rename_tab`, `herdr_close_tab`, `herdr_list_workspaces`, `herdr_create_workspace`, `herdr_get_workspace`, `herdr_focus_workspace`, `herdr_rename_workspace`, `herdr_close_workspace`) | The herdr UI — layout is a human action; the machinery survives internally where later tickets need it (pane focus for \"go look\"). |\n| Worktree CRUD (`herdr_worktree_create`, `herdr_worktree_open`, `herdr_worktree_list`, `herdr_worktree_remove`) | `isolated: true` on a spawn (auto-created worktree), or `herdr worktree …` in your own terminal. |\n| Introspection (`herdr_api_snapshot`, `herdr_session_list`, `herdr_session_stop`, `herdr_session_delete`) | `herdr` CLI directly (`herdr api snapshot`, `herdr session …`). |\n| Settings keys `surface`, `allow_save_agent` | Gone — one surface, nothing to switch to; `save_agent` lands ungated (ticket 03). Stale keys in your JSON files are ignored harmlessly. |\n\nNo runtime nagging, no shim tools — a clean cut ([wayfinder ticket 09](wayfinder/tickets/09-surface-cut-settings.md)).\n\n## Platform notes\n\n- **Requires herdr ≥ 0.9.0** (hard floor — see Requirements). Everything above the\n  floor goes through exactly one launch path on every OS: split a pane, then\n  `agent start <name> --kind <kind> --pane <id> [-- <argv>]`. herdr resolves\n  the kind to its CLI itself, so npm `.cmd` shims on Windows need no special\n  handling here — 0.9.0 is the release that fixed that (and the flaky\n  process-tree detection) on herdr's side.\n- **macOS:** the only macOS gotcha is environmental: a herdr server started by\n  `brew services` / launchd (or a GUI launch) inherits macOS's minimal PATH, so\n  node-based agents like `pi` can't find `node`. Launch herdr from your terminal\n  instead (see Requirements).\n\n## Development\n\n```bash\nnpm install\nnpm test                 # offline suites (smoke + settings + spawn) — no herdr required\nnpm run typecheck        # tsc --noEmit\nnpm run test:live        # requires a running herdr session\nnpm run test:multi       # 3 parallel agents, multi-step, artifact-verified\nnpm run test:stress      # 5 parallel agents, heavy multi-tool, artifact-verified\n```\n\nThe extension is TypeScript loaded via jiti — **no build step**. Edit `src/` and\n`/reload` (or restart pi).\n\n### Project layout\n\n```text\nsrc/\n  index.ts               # entry; registers the 11-tool surface + diagnostics footer + self-report\n  widget.ts              # the fleet widget (table + blocked callout), a consumer of the delivery tick\n  herdr.ts               # the one spawn module (envelope parse, timeouts, errors, version probe + floor gate)\n  version.ts             # pure version-floor logic (parse/compare/HERDR_TOO_OLD)\n  config.ts              # binary resolution + live agent-kind list (env + PATH)\n  env.ts                 # shared types + unwrap/normalize/extractText helpers\n  selfreport.ts          # push this pi's state to herdr (reliable completion)\n  child.ts               # the injected child extension (agent_done, session naming, sidecars, auto-exit, identity strip)\n  sessionfile.ts         # parent-owned session files (pi-default dir, seeding, JSONL result extraction, .exit sidecars)\n  spawn.ts               # the herdr_spawn_agent engine (gates, spec merge, queue, wait, launch plan, stance)\n  agentdefs.ts           # agent-definition registry (built-in + session + .md file layers)\n  settings.ts            # effective-settings resolution (global + project JSON, models.* routing keys)\n  menu.ts                # the /subagents config menu + Kill-all-agents action\n  tools/agents.ts        # herdr_spawn_agent registration (the spawn entry point)\n  tools/result.ts        # herdr_get_agent_result (exact JSONL result; pane-tail fallback for unspawned panes)\n  tools/message.ts       # herdr_message_agent (the open channel: resolution chain, envelope, physics-adaptive delivery)\n  tools/lifecycle.ts     # herdr_interrupt_agent + herdr_resume_agent (turn cancel; the gone-agent recovery move)\n  tools/orchestration.ts # list_agents + the send machinery (spawn submit, message delivery, launch/wait paths)\n  tools/sync.ts          # pane-sync quartet (run/read/wait_output/send_keys)\n  tools/worktrees.ts     # worktree machinery (powers isolated; no model-facing tools)\ntests/\n  smoke.mjs, substrate.mjs, settings.mjs, spawn.mjs, agentfiles.mjs, message.mjs, lifecycle.mjs   # offline suites (npm test)\n  live.mjs, selfreport.mjs, blocked.mjs, spawn-live.mjs, message-live.mjs, dev-load.mjs, …\n```\n\n## Contributing\n\nContributions are welcome — especially macOS/Linux testing! Please open an issue\nfirst to discuss substantial changes. See [CONTRIBUTING.md](./CONTRIBUTING.md).\n\n## Appendix: fleet machinery (internal, off the model surface)\n\nThese capabilities exist in herdr and remain fully available **to you** — they\nare just no longer registered as model-facing tools (the v0.6 surface cut).\npi-herdr keeps the thin slices it needs internally:\n\n- **Worktree create/remove** — powers `isolated: true` spawns (auto branch +\n  path). Hand management: `herdr worktree create|open|list|remove`.\n- **Pane close / focus** — powers the menu's confirmed Kill-all action and\n  future \"go look\" affordances. Hand use: the herdr UI, or\n  `herdr pane close|focus …`.\n- **`agent get` polling** — the internal fallback that catches settled states\n  the event waits miss. Hand use: `herdr agent get <pane>`.\n- **Sessions & snapshot** — `herdr session list|stop|delete`, `herdr api\n  snapshot` (herdr's own debugging surface).\n\n## Limitations / roadmap\n\n- **v0.6 in flight** (the subagent experience layer): the session substrate\n  (parent-owned session files + injected child extension) and\n  `herdr_get_agent_result` landed; still coming: push delivery with\n  user-takeover and idle re-arm, a 10-state projected lifecycle with watchdog\n  and activity sidecars, fork/lineage/standalone session modes,\n  model/thinking routing (`models.default` / `models.agents.<name>`),\n  interrupt + resume, a fleet widget, and scripted workflows\n  (`run_workflow`). See [wayfinder/map.md](wayfinder/map.md).\n- **Tested on Windows and macOS** (see [Platform support](#platform-support)).\n- Self-report is pi-only; heterogeneous (claude/codex) completion relies on herdr's\n  auto-detect (also caught by the `agent get` polling fallback).\n\n## Acknowledgements\n\nThe workflow runtime is ported from\n[`tintinweb/pi-subagents`](https://github.com/tintinweb/pi-subagents)\n(MIT): `src/workflow/runtime.ts`, `src/workflow/worker-source.ts`, and\n`src/workflow/meta.ts` are near-verbatim ports of its `src/workflow/` core —\nthe vm worker bootstrap, the determinism jail, the caps table, the\nun-awaited-launch ruling, and the `meta` pre-parse — with pi-herdr trims\nmarked in each file's header (no separate concurrency pool, run control\ndeferred post-v0.6). Issue 13 added `src/workflow/journal.ts`\n(the resume journal and prefix replay) and `src/workflow/saved.ts` (saved-workflow\ndiscovery), ported on the same terms. Issue 14 added `src/workflow/progress.ts`\n(the progress model), `src/workflow/json-schema.ts` (schema validation), and\nthe child-side `StructuredOutput` tool (ported from its `structured-output.ts`);\nthe card arrangement follows its `workflow-card.ts`, trimmed. The host seam,\nrun lifecycle, card module, and tool surface are pi-herdr's own. One borrowed\nerror message (the un-awaited-launch ruling) is kept verbatim upstream by\ndesign.\n\n## License\n\n[MIT](./LICENSE) © Andrew\n","readmeFilename":"README.md"}