{"_id":"@99percentpeople/pi-ssh-remote","_rev":"21-23ad10fed0d8a17d346a3ce1435bc11a","name":"@99percentpeople/pi-ssh-remote","dist-tags":{"latest":"0.6.2"},"versions":{"0.1.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.1.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.1.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"2c5cc33d5701f28d20c3560bfda663430040ab7f","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.1.0.tgz","fileCount":5,"integrity":"sha512-vX4wZ0tN7pAi8WJTETP7/Tev/BNZLZs6rptHlT8Diw4OWo7ZnFM9ZoHRqH5KvyIRSxwKCIP9JNJFCJBrWMW+1A==","signatures":[{"sig":"MEUCIFwNS9zKZNEUXx9xtxQQ64oLe3l5CyjNyZp4YLB3yWtiAiEA2XR7KwqGvHitpEjZESRrOys+lERimQQJ3t4MuKx+4Jc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183779},"type":"module","gitHead":"8e807d48d1d05b29c0517900c8d0a3962693f808","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"99percentpeople","email":"myzzzyearz@outlook.com"},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.11.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through OpenSSH","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.1.0_1785590791641_0.536801759802146","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.2.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.2.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"3b77f12486086df274c77ed9cc28a4bda7c59b6b","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.2.0.tgz","fileCount":5,"integrity":"sha512-uW4TUQYbKkUTllZMjEsUgjlfWSIiXNdcj6QQRXC5rIt82NPrUBAbTnFmWSbNyhjwxWKFnoZiAn2H8NeFMplM7g==","signatures":[{"sig":"MEUCIAzVjt8XOW//Rjzphd8Fo1ZGZ3UjCfECW4TPfkRTI2jcAiEA303kK/tcUXgAmK0+xo6cPJbXnaaua5OYMRHcfiZDuJU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268819},"type":"module","gitHead":"f9a96a438dbe56f1cab04e5b5392e5494bb7d686","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through OpenSSH","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.2.0_1785608045738_0.5496769962740875","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@99percentpeople/pi-ssh-remote","version":"0.2.1","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.2.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"bf55eb92b017d10d4e18ea35efbc6bdd17b27da2","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.2.1.tgz","fileCount":5,"integrity":"sha512-L81r0nKwIiPdmhDPBKwGgH9r+NbU0t4NvKQtadKnRUFYNGs+l2H7SKDv+vFRFe9faeBKFuTw9Ktw8wJfkXYpPA==","signatures":[{"sig":"MEUCIGR5HhM3dsH5V2gM5vQhtuFCmRsUs5M7u9UmKY15lYdDAiEA8IdzymCNF7iP4Qe6Fx9JzYIw42oNKec04A1vKfXO4N4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":271686},"type":"module","gitHead":"a4a440dc5af915e7b1fcb22a6911a61c0f912825","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through OpenSSH","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.2.1_1785608903253_0.9777453991038159","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.3.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.3.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"ec5a615b8dac3e52727de3922b2d2c2e649267d0","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.3.0.tgz","fileCount":5,"integrity":"sha512-9fcenXOQ3Jd9NzI+/riVg6QVsrj2Q6jO+XHA+khLgk1j7GLNhTSmVle3KIWeyGkEKFHZiFs7HeiwVmvlc/ivjg==","signatures":[{"sig":"MEQCIF08kF0/76Hhe510LoQIbl534z108plI/sB44Iw/yMr+AiAxlAF1vNzYqIxN0yBYNBtgyV1XOH4tWx+0NT5b1YmaqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":423777},"type":"module","gitHead":"2fc3ba3f92ceec1fdce1e770a167cfab3b26b897","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.3.0_1785641342161_0.13137975246151057","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@99percentpeople/pi-ssh-remote","version":"0.3.1","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.3.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"65671ad302c22e413045c1949d58aa953957008f","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.3.1.tgz","fileCount":5,"integrity":"sha512-WCFq/2iuun4tPtCNqXL1AE/88mVqqnnHNc9pz140GpXPF6gP3KjFDg1btm+ArhpDMaP2LW/R1eWNcFvcrn8LEQ==","signatures":[{"sig":"MEUCIQCyVjj2bvo1gHB6ZLkfEe6lA2nKR/VHz4fnfWYB8M4sRQIgAeMn21fiIwLOlQseWnztFHVGHVqocMJR4twX+lrXJy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":436634},"type":"module","gitHead":"80594f99ac6b5e887479e2ec585f245b67dc8b90","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.3.1_1785678360016_0.6113646570967723","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@99percentpeople/pi-ssh-remote","version":"0.3.2","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.3.2","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"c374eb465773e84e1ab1acfb2dca2518a3a0356c","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.3.2.tgz","fileCount":5,"integrity":"sha512-5f6rCimMaN8V6dDi1fum18ai0zinoH+1JY4uDTWf9M1YBdHJ1/v36a05yh1JCO83WIGrEulE7okY+Kk94eDapQ==","signatures":[{"sig":"MEUCIHQvbK10SCLNUcCSJwDvJUVwDZf/l++6gUo80QALLWS2AiEAkSo0Z17u17P9NT6jYCog10UOykfw7681zp/jAdnQCxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":438900},"type":"module","gitHead":"cc1e7fc2d8a1bb7d56af1fc1c6a0cf44e71d8028","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.3.2_1785679968289_0.9312350531250004","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@99percentpeople/pi-ssh-remote","version":"0.3.3","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.3.3","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"0b203e80f66083a80c4865c0d7afb2589f5396db","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.3.3.tgz","fileCount":5,"integrity":"sha512-8n/0qdtox3o4pnrv1z8GtfpnpMBOfcMgsdTRC7lStaRi3tg6hNFCqNl1zSDQFSW+yS1DlI4Yrx9hmc5jCYHQJw==","signatures":[{"sig":"MEQCIEbaTqvUVoE1xqc1/EHXhLbpZ6EfNtOnqkdZqb6sdenKAiBBPMR6H7Oe/DMy0hV5eVKa7QCs9yEOXNqSZuEE9oj20A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":509740},"type":"module","gitHead":"bb177ae88a6d4de913496f7a4c64edcaa65487d5","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.3.3_1785733131477_0.1472112020961942","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@99percentpeople/pi-ssh-remote","version":"0.3.4","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.3.4","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"ece72aff2a7970bef3fb6f5f48ec17808e904911","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.3.4.tgz","fileCount":5,"integrity":"sha512-TW02N0R8iHQN45bM1iTk0rNeKgHvuEqSgHIt2Nk4t1AZ8uq8Rih4DbbyEaXqqMIMsvjzP95ws/10wNAOO4j+8g==","signatures":[{"sig":"MEUCIEXHf4eZOZfOiDb2d9mKDvhJqlicwja2kZ269P7gfT3FAiEAm6GmprOdItNOYcAXs3fMOn3y6HEqEFAC7BkwSlZwRo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":515266},"type":"module","gitHead":"3333c1c0bfdb08a3c96da8b83aa569e4a3e94c6f","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.3.4_1785740309079_0.18330676654897982","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.4.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.4.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"5052ded64be9b4d0c71e6046bca843b0623e1a47","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.4.0.tgz","fileCount":5,"integrity":"sha512-uMMrBRAzr3g0c4tXz5qK6mZANddjRroe8f7df+yLOYTg+xiiZLzKpihVye3dFTs24ePkfxNB5D3ck35Rrs8zMA==","signatures":[{"sig":"MEYCIQDk1l0q9uywVdDWntxtbrPIibxVrb2T0Ty6mkvw6RO8RgIhAOyaoZwZag4oxokse1P5sm/lAtnX1Nvfszw6jX/fyfHJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":602561},"type":"module","gitHead":"b09917113595308f8757954ace16f706d3ed28c3","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.4.0_1785919991921_0.5861718623496761","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@99percentpeople/pi-ssh-remote","version":"0.4.1","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.4.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"206c0c273d8793ccb5ee9dd4ef534589d913fbf4","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.4.1.tgz","fileCount":5,"integrity":"sha512-AXUhArc3Yd6vT7Kb8hqdG2e9lvk/v3zOkTnPUOPyaUv6Ydo6F5yts8+2asGxSHIRoBtf1NE3m6KGHUx49eciUQ==","signatures":[{"sig":"MEYCIQCGx1uzLS8BJPsS43/+Z5ekpXnogPc8rBkN6TAJ4EVa3AIhAKWZAnrDUekNyGfA8sIt5fKEV3dtG+K9oku2uiMcpM/f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":604675},"type":"module","gitHead":"48fe5887b68a2a221ed4ba50ff1696748fe30ca5","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.4.1_1785922015858_0.40962273749951916","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"5af615695ddc943d33df344e7a85edbd36108b65","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.0.tgz","fileCount":5,"integrity":"sha512-oZK7Iy0mhx3INarJ36JMz4Z9L83i73x5mZvNVxc8afCwSXdNFvayG7OY2PM1jHGLHoLSut+Q0jY458SpxN2z6Q==","signatures":[{"sig":"MEQCIDXOW3sp+Jy9iUdTZK9Oy10gt1dkeSo3/bDM/kbus1erAiBABWqNyuRIn493TgeheLnOMNfnq4Hw34tHjrUYG3QKLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":694558},"type":"module","gitHead":"0d231ab3a6a438eff933532cd9c9e698d553f977","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.0_1785945430314_0.3014813351634611","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.1","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"411fe2e15a4fe472cc0b0fd04bc5430db620432c","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.1.tgz","fileCount":5,"integrity":"sha512-HbuQ70ls/p17SX06kMneuzOPuAcb5A46BrTQed7F4TnNTyUso/ttbxNythxsws+4J5HYWntLWm3z2y+988JAMA==","signatures":[{"sig":"MEUCIQDIkxl4oEEEEMal57z8JlcjcPRrmZxUIdk2eEYdBYoswgIgQPIi0vTQwiyIg+8aot1g0gs06nqxacTSYfS2fq9Dzag=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":708438},"type":"module","gitHead":"35fc93786754817f5a4f1ffcb3a08599e3f5c3e1","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.1_1785979145998_0.4472179666685261","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.2","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.2","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./dist/index.ts"]},"dist":{"shasum":"cd38274c236c7f5e2cc0af5f5a06a6404a1bb534","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.2.tgz","fileCount":5,"integrity":"sha512-Yx4yL5GWv6Fm3HM/fTyA5YH6r4qFgJdwDt/1swY0GL6/HUS4p31/MYLJ/zcAJJXKSDQ8gffeSUe3wkK7eBkIDQ==","signatures":[{"sig":"MEQCIE1SJKHI8GLS343b1bmtLvzgS4asN1dowY1UrHIntKnHAiAKieBR70MM0l6TD8z+k1z71EsgcC2xgSfXKMiV1S0lQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":709692},"type":"module","gitHead":"ad082dffa56b0023e231f343bc8fae97402f076c","scripts":{"build":"bun run ../../scripts/build-package.ts","prepack":"bun run build","prepublishOnly":"bun run --cwd ../.. check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.2","@99percentpeople/pi-workspace-files":"0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.2_1786015933772_0.5209418057817286","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.3","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.3","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"b2ab30b2615494a451de1230b4416d84fdc9ec58","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.3.tgz","fileCount":5,"integrity":"sha512-OrvmjiCPbmkU9KarBaJKOFOHOIjinehUvoB9kuEeS2486SG5dBrNTK5kqewzMh0VGrzjlFKgNJbeKbtXWxR+Dw==","signatures":[{"sig":"MEUCIQDuv2uJ/49MPbmqrhEEtDoiQKayaiK+6O/NwRjnzU1PcwIgLz7cXgL5Ob2nyGe2WX8fthslkDHKaJ36m4C+OgN8QKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":589228},"type":"module","gitHead":"e9fb82fa5b14fd22f55feb487bbb814e1ab45206","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.3","@99percentpeople/pi-workspace-files":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.3_1786199291672_0.32991013228076227","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.4","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.4","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"acff30db1c387547e55464057268d7b614d697a4","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.4.tgz","fileCount":5,"integrity":"sha512-TEOPJWZoDhrfc3DuBzxV1BXoxGAqkEeGKjDVzgRudV6GqV0//cwC7G2rP9PS+osSU0Jyj6Ro6PF9uaaKAil3Zg==","signatures":[{"sig":"MEQCIGwjMT7yQZek9gdRRvaZTSCw6JYp9+aUS5j8nL3fdGtlAiAWaICuDPLisa3HaKSJmGVx+nkcudv7aES7ICK04a2nhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":589762},"type":"module","gitHead":"f19e13091146bab1ddf1e24a0ca1b775353fe6fa","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.3","@99percentpeople/pi-workspace-files":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.4_1786332032134_0.6878598851820814","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.5","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.5","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"0ec0766d6a08a1829c290bd361fb8e43f61da767","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.5.tgz","fileCount":5,"integrity":"sha512-bsuIWosyjiEKpBu/ud10sQHWR3dupKsRRbKbJqSw3fwpGekJVXxvNDOd8Ba4dR3+wJeN0WDLUeCx9Du0ILYW9Q==","signatures":[{"sig":"MEUCIFKNmwBwRSgzCJWAQzJQwirREhuRRfJEr40icyBl8pyrAiEArTUcSLWKOdF4KmVJ0G1X1A/fMUKmXxURtzWPcyzErq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":610065},"type":"module","gitHead":"4c90931ba24abb368341b5d7afef24d91bcaf0de","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.16.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.3","@99percentpeople/pi-workspace-files":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.5_1786335180477_0.3402474151898125","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.6","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.6","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"ea4dd633ea0cdf84001b077514bb09bdb4ae8623","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.6.tgz","fileCount":5,"integrity":"sha512-APxGa3/G4d132WV/MGgQRV0nwVpc6WDgsbb5192vxsuvSVP77tlKzbXk3dv+gwaaMjxTY5ksCT/GHnP+CkKK+w==","signatures":[{"sig":"MEUCIQC7a5F0URhb5Hi0kWtvnG/1AKIJyS7S5tX+GLfht8q+7AIgfjNq3G/0ea2cYq8vpPcpetjQlBt8deOVOcFNT53irAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":642108},"type":"module","gitHead":"d637210b693cc1dd36473de087211a930cfd610b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.17.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ssh2":"1.17.0","@99percentpeople/pi-shared-settings":"0.1.3","@99percentpeople/pi-workspace-files":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.6_1786698378960_0.9539815063458026","host":"s3://npm-registry-packages-npm-production"}},"0.5.7":{"name":"@99percentpeople/pi-ssh-remote","version":"0.5.7","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.5.7","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"c397006cd6a3f6ecdcde5008b4c93b6ddaeb2be1","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.5.7.tgz","fileCount":5,"integrity":"sha512-WroRK/EaOooTdagt03OuJMiLOzKYMOZGb0V/9oPL1fANprzDgO3/NLwetO8btJc9al9BOfArnufbinRCOD2mRQ==","signatures":[{"sig":"MEUCIDnDNhbpdXvAR1/RhgSR0dJEZcGmaQeiDd8GJ/xg7HmpAiEAtZqaE4jL56e33iS+pvl2SvCXWztQjoPlmO+7ePQOv5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.5.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1258135},"type":"module","gitHead":"555160c2730fc23372cd23eaf6f3faaad1d6565f","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.17.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ssh2":"1.17.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.5.7_1786728468090_0.4548366478445298","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@99percentpeople/pi-ssh-remote","version":"0.6.0","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.6.0","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"b0a46667da0cccf150ca4a0da223c61141445fcb","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.6.0.tgz","fileCount":5,"integrity":"sha512-6dwNHuCKPOkFYJOl5rd2p/sUKb6xnn7+S+XLJE8wDWhmH1h87dKnnRXdReG4BRGdHptXePeh+dwCo4vcN76acw==","signatures":[{"sig":"MEQCIDzq3JuKGqX6Q3Yb6YIDhoaurmTIWiiC/9y4k3HcwY2xAiByvX/acyJV/5kFcs6i+VClN4wxSZ0zkBediSlRqI2b/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1267575},"type":"module","gitHead":"131ef707fc5fbc05fdd93d811f32f6f669127b09","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.17.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ssh2":"1.17.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.6.0_1786858494462_0.9724857188849867","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@99percentpeople/pi-ssh-remote","version":"0.6.1","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"author":{"name":"99percentpeople"},"license":"MIT","_id":"@99percentpeople/pi-ssh-remote@0.6.1","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"pi":{"extensions":["./index.min.js"]},"dist":{"shasum":"6b4327e5b75122c68928e271dbcc21c2eb9886c3","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.6.1.tgz","fileCount":5,"integrity":"sha512-PHrsdzCjsl6wIDZqfXlXd3oj4wUR8C0EH/zVSkUTTr5sHCK0cqg7Z8GnnKETSLi7/pzXXd1Z0SYXN0vI3vSWgw==","signatures":[{"sig":"MEYCIQDh6aEifaq1lweILSt8/H+IdvADFimfPxkBvVpNrnPEzQIhAOCSxyNNpvoXOYHQ2zOhIEphVdN9mPRfCZ3mkWzKuiNC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDPS1I78JYdCQufCij7q125Zeez+cOYsGAHji8cQyOApQIgD6llJyxYSzHJ2ZmhM+UIfbZ850LyaaGU2p76t+ve1mU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1290414},"type":"module","gitHead":"663964048fc8d5767dfe64d9bf89b68cb3322933","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.17.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ssh2":"1.17.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ssh-remote_0.6.1_1787751056257_0.6462229256065315","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"pi":{"extensions":["./index.min.js"]},"_id":"@99percentpeople/pi-ssh-remote@0.6.2","bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"dist":{"shasum":"51e19c0d2f016681611f2a9a82a994aaf9f630f5","tarball":"https://registry.npmjs.org/@99percentpeople/pi-ssh-remote/-/pi-ssh-remote-0.6.2.tgz","fileCount":5,"integrity":"sha512-+vdCD3QLnKXLfB24j1fSxsH1Dyq7/9HCoEVL/4TuZ2lLc9WhnMKF/zp7GGOsthBG7woteuuA2qPp6T67Vc1KUQ==","signatures":[{"sig":"MEYCIQCgMlXFRDiyOw7/BJCEuOF05qVtYtcSGr0z51yRmplJRQIhAPm/fDr+6uRr+xW4/VTuD2tSLXlEah0HmGmHmb+24G5c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBzP5zMT+gQQ4s30PgAkv93D2KHxix1nBJCrag5/XIFAAiAXqmondkIdVaAXYQZ+1CnoMsJaCJegGt5Txf480+Ya5Q=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@99percentpeople%2fpi-ssh-remote@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1290992},"name":"@99percentpeople/pi-ssh-remote","type":"module","author":{"name":"99percentpeople"},"gitHead":"61bd55d8f55f90fb736229cef1c8c65de4feaf34","license":"MIT","version":"0.6.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:087b53ff-f950-4970-ad87-f516372a6b2e"}},"homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"_npmVersion":"11.19.0","description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","directories":{},"maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"_nodeVersion":"24.20.0","dependencies":{"ssh2":"1.17.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-ssh-remote_0.6.2_1788856152885_0.9408899423614114"}}},"time":{"created":"2026-08-01T13:26:31.429Z","modified":"2026-09-08T08:29:13.301Z","0.1.0":"2026-08-01T13:26:31.772Z","0.2.0":"2026-08-01T18:14:05.873Z","0.2.1":"2026-08-01T18:28:23.394Z","0.3.0":"2026-08-02T03:29:02.300Z","0.3.1":"2026-08-02T13:46:00.152Z","0.3.2":"2026-08-02T14:12:48.433Z","0.3.3":"2026-08-03T04:58:51.637Z","0.3.4":"2026-08-03T06:58:29.221Z","0.4.0":"2026-08-05T08:53:12.089Z","0.4.1":"2026-08-05T09:26:56.011Z","0.5.0":"2026-08-05T15:57:10.530Z","0.5.1":"2026-08-06T01:19:06.190Z","0.5.2":"2026-08-06T11:32:13.938Z","0.5.3":"2026-08-08T14:28:11.826Z","0.5.4":"2026-08-10T03:20:32.315Z","0.5.5":"2026-08-10T04:13:00.608Z","0.5.6":"2026-08-14T09:06:19.137Z","0.5.7":"2026-08-14T17:27:48.236Z","0.6.0":"2026-08-16T05:34:54.597Z","0.6.1":"2026-08-26T13:30:56.366Z","0.6.2":"2026-09-08T08:29:12.985Z"},"bugs":{"url":"https://github.com/99percentpeople/pi-extensions/issues"},"author":{"name":"99percentpeople"},"license":"MIT","homepage":"https://github.com/99percentpeople/pi-extensions#ssh-remote","keywords":["pi-package","pi","coding-agent","ssh","remote-development","openssh","ssh2","background-tasks","pty","tui"],"repository":{"url":"git+https://github.com/99percentpeople/pi-extensions.git","type":"git","directory":"extensions/ssh-remote"},"description":"Route Pi's file and shell tools to remote Unix or Windows workspaces through reusable OpenSSH or ssh2 transports","maintainers":[{"name":"99percentpeople","email":"myzzzyearz@outlook.com"}],"readme":"# @99percentpeople/pi-ssh-remote\n\nUse the local [Pi coding agent](https://pi.dev/) against a remote Unix or\nWindows workspace without leaving the current Pi conversation.\n\nSSH Remote routes Pi's project-facing tools through SSH while keeping the TUI,\nmodel credentials, installed packages, session files, and conversation history\non the local machine.\n\n- **Local clients:** Linux, macOS, and Windows\n- **Remote Unix hosts:** POSIX `sh`, including Bash, Zsh, ash, and BusyBox\n- **Remote Windows hosts:** PowerShell 7 or Windows PowerShell 5.1 over OpenSSH\n\n## Highlights\n\n- Routes `read`, `write`, `edit`, `bash`, optional `grep`/`find`/`ls`, user\n  `!`/`!!` commands, and TUI `@` path completion to the remote workspace\n- Switches the same Pi session between local and SSH workspaces, or directly\n  between SSH hosts\n- Supports `auto`, `openssh`, and `ssh2` transports\n- Reuses authenticated connections by default: OpenSSH multiplexing on\n  Linux/macOS and a persistent `ssh2` connection on Windows\n- Listens for persistent transport close events, updating the footer and\n  failing closed when a device reboot or network loss is detected\n- Uses normal OpenSSH aliases and configuration, including multi-hop\n  `ProxyJump`\n- Connects to non-standard ports directly in the target, for example\n  `deploy@devbox:2201:/srv/project`; explicit ports override the configured\n  `Port`\n- Detects Unix and Windows shells automatically, with an explicit shell option\n  when needed\n- Restores branch-aware SSH state across resume, reload, fork, clone, and\n  `/tree`\n- Fails closed when an SSH workspace is unavailable instead of silently using\n  local files\n- Combines with\n  [`@99percentpeople/pi-background-tasks`](https://www.npmjs.com/package/@99percentpeople/pi-background-tasks)\n  to run and attach to remote PTY/TUI applications such as `lazygit`, `htop`,\n  `nvim`, and `k9s`\n- Integrates with `@99percentpeople/pi-workspace-files`,\n  `@99percentpeople/pi-codex-api`, and `@99percentpeople/pi-pwsh-adapter`\n\n## Demo\n\nSwitch the same Pi conversation into a disposable SSH workspace and run a\ncommand in its remote cwd. Every visible host, user, and path is fictional:\n\n![SSH Remote workspace demo](https://raw.githubusercontent.com/99percentpeople/pi-extensions/master/promo/demo/ssh-remote.gif)\n\nWith Background Tasks installed, start `htop` in a remote PTY, attach to its\nlive screen, interact with it, and press `Ctrl+]` to detach without stopping the\ntask:\n\n![SSH Remote htop demo](https://raw.githubusercontent.com/99percentpeople/pi-extensions/master/promo/demo/ssh-remote-htop.gif)\n\n## Contents\n\n- [Demo](#demo)\n- [Install](#install)\n- [Quick start](#quick-start)\n- [Targets and paths](#targets-and-paths)\n- [Configuration](#configuration)\n- [SSH transports](#ssh-transports)\n- [Authentication](#authentication)\n- [Remote platform and shell](#remote-platform-and-shell)\n- [Workspace and session lifecycle](#workspace-and-session-lifecycle)\n- [AI control tools](#ai-control-tools)\n- [Tool routing and integrations](#tool-routing-and-integrations)\n- [Compatibility and limitations](#compatibility-and-limitations)\n- [Security](#security)\n\n## Install\n\n```bash\npi install npm:@99percentpeople/pi-ssh-remote\n```\n\nThe system OpenSSH client (`ssh` or `ssh.exe`) must be available on `PATH`.\nSSH Remote uses it directly in OpenSSH mode, for `ssh -G` configuration\nresolution in `ssh2` mode, and for remote background jobs.\n\n> **Bun on Windows:** `bun add` or `bun install` may report\n> `Blocked N postinstalls` and skip the native crypto build used by `ssh2`.\n> This can make persistent `ssh2` connections hang during setup. Run\n> `bun pm untrusted` to allow the scripts, or install with `npm i`, before using\n> `ssh2` mode.\n\n## Quick start\n\n```bash\n# Unix workspace\npi --ssh devbox:/srv/project\n\n# Unix workspace on a non-standard SSH port\npi --ssh deploy@devbox:2201:/srv/project\n\n# Windows workspace, port 2201 plus remote cwd (quote the target in your shell)\npi --ssh 'winuser@winbox:2201:C:\\Users\\winuser\\project'\n\n# Windows workspace on the configured/default port\npi --ssh 'winuser@winbox:C:\\Users\\winuser\\project'\n```\n\nThe default transport is `auto`:\n\n- Linux/macOS clients start with multiplexed OpenSSH.\n- Windows clients start with a persistent `ssh2` connection.\n\nUseful commands inside Pi:\n\n```text\n/ssh-status                         Show the current local or SSH environment\n/ssh-cd /srv/another-project        Change the remote cwd without reconnecting\n/ssh-connect staging:2201:/srv      Enter SSH or switch directly to another host\n/ssh-reconnect                      Reconnect or apply a transport change\n/ssh-exit                           Return this conversation to its local workspace\n```\n\n### Remote background TUIs\n\nInstall Background Tasks 2.0.0 or newer alongside SSH Remote 0.5.0 or newer:\n\n```bash\npi install npm:@99percentpeople/pi-background-tasks\n```\n\nThese versions share Background Control protocol v2. Older Background Tasks\nbuilds are blocked for active SSH workspaces rather than risking local fallback;\nBackground Tasks 2.x likewise rejects older unnamed SSH providers. Update both\npackages together.\n\nWhile the SSH workspace is active, ask Pi to *\"start lazygit in a background\nPTY named remote-git\"*, then run `/bg-attach` and select it from the task list\n(or pass the generated task ID):\n\n```text\n/bg-attach <task-id>\n```\n\nKeyboard, mouse, resize, signals, retained terminal state, and cleanup are\nrouted to the original remote host. `Ctrl+]` detaches while the TUI keeps\nrunning. See the\n[Background Tasks remote TUI guide](https://github.com/99percentpeople/pi-extensions/tree/master/extensions/background-tasks#run-a-remote-tui-over-ssh)\nfor requirements and more examples.\n\nA typical OpenSSH alias works with either transport:\n\n```sshconfig\nHost devbox\n    HostName 192.0.2.20\n    User deploy\n    Port 2201\n    IdentityFile ~/.ssh/company\n    ProxyJump bastion\n```\n\n```bash\n# Use the Port from the alias\npi --ssh devbox:/srv/project\n\n# Override it for one command without editing the config\npi --ssh devbox:22:/srv/project\n```\n\n## Targets and paths\n\nSSH Remote accepts one unified target argument:\n\n```text\n[user@]host[:port][:path]\n```\n\n| Example | Meaning |\n| --- | --- |\n| `devbox` | Host alias `devbox`, remote login directory |\n| `deploy@devbox:/srv/project` | User `deploy`, remote cwd `/srv/project` |\n| `deploy@devbox:2201` | User `deploy`, port `2201`, remote login directory |\n| `deploy@devbox:2201:/srv/project` | User `deploy`, port `2201`, cwd `/srv/project` |\n| `deploy@[2001:db8::10]:2201:/srv/project` | Bracketed IPv6, port `2201`, cwd `/srv/project` |\n| `winbox` | Host alias `winbox`, remote profile directory |\n| `winuser@winbox:C:\\Users\\winuser\\project` | Windows path, configured/default port |\n| `winuser@winbox:2201:C:\\Users\\winuser\\project` | Windows path plus port `2201` |\n\n### Ports\n\nA pure number immediately after the first colon is an SSH port\n(`1-65535`), matching OpenSSH's `host:port` destination form. A second colon\nmay then introduce the remote path. An explicit port overrides any `Port`\nvalue from the OpenSSH configuration; omitting it keeps the configured or\ndefault port.\n\nA pure number that is not a valid port is rejected so a typo such as\n`devbox:22011` never becomes a remote path silently.\n\n| Write this | To get |\n| --- | --- |\n| `devbox:2201` | Connect on port 2201 |\n| `devbox:2201:/srv` | Connect on port 2201 with cwd `/srv` |\n| `devbox:~/2201` | Directory `2201` under the remote home |\n| `devbox:./2201` | Directory `2201` under the login directory |\n| `devbox:/srv` | Directory `/srv`, configured/default port |\n\n> **Breaking change:** a remote directory whose name is a number must now be\n> written with `./` (or `~/`) because `devbox:2201` now means port 2201.\n> Windows drive paths such as `winbox:C:\\Users\\winuser\\project` are\n> unaffected.\n\nIPv6 literals must use brackets. With no path, the remote login working\ndirectory is used, normally the remote home directory. A relative startup path\nis resolved from that directory.\n\n### Unix paths\n\n```bash\npi --ssh devbox:~/project\npi --ssh devbox:/srv/project\npi --ssh devbox:2201:/srv/project\n```\n\nUnix paths use POSIX syntax. `~` and `~/path` resolve from the remote home.\n`~other` paths are not supported.\n\n### Windows paths\n\n```bash\npi --ssh 'winbox:C:\\Users\\developer\\project'\npi --ssh 'winbox:D:\\source'\npi --ssh 'winbox:\\\\server\\share\\project'\npi --ssh 'winbox:2201:C:\\Users\\developer\\project'\n```\n\nWindows paths may be drive-qualified or UNC paths. Relative paths, `~`,\n`~/path`, and `~\\path` resolve against the remote user profile and cwd.\nDrive-relative paths such as `C:folder` and `~other` paths are rejected because\ntheir meaning is ambiguous.\n\n`/ssh-cd` and `ssh_cd` always interpret their argument in the **remote**\nfilesystem:\n\n- absolute paths remain remote absolute paths;\n- relative paths resolve from the current remote cwd.\n\n## Configuration\n\n### Command-line flags\n\n| Flag | Values | Purpose |\n| --- | --- | --- |\n| `--ssh` | `[user@]host[:port][:path]` | Start or resume in an SSH workspace |\n| `--ssh-config` | local path | Use an alternate local OpenSSH config |\n| `--ssh-shell` | `auto`, `bash`, `zsh`, `pwsh`, `powershell` | Select the remote shell |\n| `--ssh-transport` | `auto`, `openssh`, `ssh2` | Override the saved transport preference |\n\nExamples:\n\n```bash\npi --ssh devbox:/srv/project --ssh-transport openssh\npi --ssh devbox:2201:/srv/project --ssh-shell zsh\npi --ssh devbox:/srv/project --ssh-config ~/.ssh/work.conf\n```\n\n### `/99settings`\n\nOpen **SSH Remote** in `/99settings`:\n\n| Setting | Default | Behavior |\n| --- | --- | --- |\n| **Transport** | `Auto` | Chooses `auto`, `openssh`, or `ssh2`; reconnect to apply it to an active workspace |\n| **Password prompt** | On | Allows TUI password prompts when key/agent authentication fails |\n| **Persist passwords** | On | Saves entered passwords for later reconnects and `-r` resumes |\n| **AI control tools** | Off | Exposes SSH environment controls to the model |\n| **AI password auth** | On | Allows model-triggered connections to use or request a password |\n\nA command-line transport overrides the saved setting. Changing **AI control\ntools**, **AI password auth**, or password persistence takes effect immediately;\na transport change applies on the next connection or `/ssh-reconnect`.\n\n## SSH transports\n\n| Local platform | `auto` foreground transport | Connection reuse |\n| --- | --- | --- |\n| Linux / macOS | OpenSSH | Supervised foreground `ControlMaster` |\n| Windows | `ssh2` | One persistent TCP/authentication connection; one exec channel per operation |\n\nUse `/ssh-status` to run a live reachability check and see the effective\ntransport and whether its connection is reused.\n\n### Automatic fallback\n\n- **Linux/macOS `auto`:** starts with multiplexed OpenSSH. Direct-host password\n  authentication retries through `sshpass`. When an effective `ProxyJump`\n  chain needs authentication or OpenSSH masks the failing hop behind a KEX\n  error, it switches to `ssh2` so every endpoint can prompt independently. A\n  direct host can also fall back to `ssh2` when `sshpass` is unavailable.\n- **Windows `auto`:** starts with `ssh2`. A compatibility or connection-setup\n  failure before the first channel opens falls back to single-use OpenSSH and\n  reports the reason.\n- **Explicit `openssh` or `ssh2`:** does not hide incompatibilities by switching\n  transports.\n\nCancelling a password prompt or exhausting password retries is a terminal\nfailure; another transport would reject the same credentials.\n\n### OpenSSH mode\n\nOpenSSH mode invokes the system `ssh` executable and leaves the destination\nalias unchanged. Without `--ssh-config`, the client reads its normal user and\nsystem configuration, including `~/.ssh/config`. An explicit target port is\npassed as `-p <port>` and takes precedence over the configured `Port`. This is\nthe best choice for advanced OpenSSH behavior that `ssh2` cannot reproduce.\n\nOn Linux and macOS, SSH Remote creates a private ControlPath and owns a\nforeground `ssh -M -N` ControlMaster process for the workspace lifetime. Each\noperation still starts a lightweight local `ssh` process, but that process\nopens a channel on the existing authenticated connection. SSH Remote listens\nto the master process directly, so an unexpected exit updates the footer\nwithout running periodic remote commands. The remote host may be Unix or\nWindows.\n\nThe managed master sends SSH protocol keepalives every 10 seconds and closes\nafter three unanswered replies. A clean FIN/RST is observed immediately;\npower loss or a silent network partition is normally reported within about\n30 seconds. These are transport keepalives, not shell-command polling.\n\nNative Win32 OpenSSH still builds its mux entry points as\n[no-ops](https://github.com/PowerShell/openssh-portable/blob/v10.0.0.0/contrib/win32/win32compat/no-ops.c#L59-L86),\nso SSH Remote explicitly supplies `ControlMaster=no` and `ControlPath=none` on\nWindows. Each foreground OpenSSH operation therefore creates a separate\nconnection.\n\nOpenSSH starts non-interactively with `BatchMode=yes`, no remote PTY (`-T`),\nand a ten-second connection timeout. Password retries are performed only\nthrough `sshpass`; new-host and key-passphrase prompts never take over the Pi\nTUI.\n\n### `ssh2` mode\n\n`ssh2` keeps one authenticated connection open and creates an exec channel for\neach foreground operation. It runs `ssh -G` locally to resolve:\n\n- aliases, `Include`, and `Match` rules;\n- host, user, port, identities, and agent location;\n- keepalives and effective algorithm lists;\n- `ProxyJump` endpoints;\n- configured `known_hosts` files.\n\nAn explicit target port is resolved with `ssh -G -p <port>`, so it overrides\nthe configured `Port` and is used for known_hosts lookups and password cache\nkeys.\n\nSingle- and multi-hop `ProxyJump` are implemented with `direct-tcpip` channels.\nEach hop receives its own authenticated SSH connection, its own password cache\nkey and prompt when needed, and the next hop uses the preceding channel as its\nsocket. Jump servers do not need `ssh`, `nc`, or `socat`, but they must allow\nTCP forwarding to the next endpoint. Destination names are resolved from the\npreceding jump host's network.\n\nSupported authentication material includes unencrypted private keys and Unix,\nWindows OpenSSH named-pipe, Cygwin, or Pageant agents where supported by\n`ssh2`.\n\nThe following effective OpenSSH features require `openssh` mode:\n\n- arbitrary `ProxyCommand`;\n- `KnownHostsCommand` or `RemoteCommand`;\n- `CertificateFile` and `@cert-authority`;\n- `PKCS11Provider` and security-key/FIDO identities;\n- keyboard-interactive or GSSAPI login;\n- multi-step `AuthenticationMethods`;\n- encrypted keys combined with `IdentitiesOnly=yes`.\n\n`ControlMaster`, `ControlPersist`, and `ControlPath` are ignored because `ssh2`\nowns the persistent connection. Paths containing spaces in a multi-file\n`UserKnownHostsFile` or `GlobalKnownHostsFile` value may not be reproduced;\nchoose OpenSSH for those configurations.\n\nBun does not currently implement `chacha20-poly1305` in `node:crypto`\n([oven-sh/bun#8072](https://github.com/oven-sh/bun/issues/8072)). SSH Remote\nfilters it whenever the runtime cannot provide it. It also excludes chacha20\nfrom `ProxyJump` chains because ssh2's explicit-cipher path can corrupt a nested\n`sock` transport; those chains negotiate AES-GCM/CTR instead.\n\n## Authentication\n\nSSH keys or an agent are recommended. They work across foreground operations,\nreconnects, host switches, and background tasks without forwarding secrets\nthrough the TUI.\n\n### Host verification\n\n- OpenSSH uses the system client's normal host-key policy.\n- `ssh2` verifies every destination and jump host against direct entries in the\n  configured OpenSSH `known_hosts` files.\n- `ssh2` refuses unknown or changed keys and does not enroll trust\n  automatically. Connect once with the system OpenSSH client to review and\n  accept a new key before starting Pi.\n\n### Password authentication\n\nWhen key or agent authentication fails and **Password prompt** is enabled:\n\n| Mode | Password behavior |\n| --- | --- |\n| Linux/macOS `auto` | Direct hosts retry through `sshpass`; ProxyJump password failures switch to per-endpoint `ssh2` prompts |\n| Windows `auto` or explicit `ssh2` | Prompts separately for the target and every ProxyJump hop through persistent `ssh2` clients |\n| Explicit `openssh` | Requires `sshpass` or `sshpass.exe`; one password-prompting endpoint per connection chain |\n\nInstall `sshpass` with, for example, `apt install sshpass` on Debian/Ubuntu or\n`pacman -S sshpass` in Git Bash on Windows. OpenSSH passwords are placed only in\nthe `SSHPASS` environment variable, never in command arguments. `sshpass` can\nanswer only one password-prompting endpoint in a ProxyJump chain; a second\nprompt is treated as rejection even when both passwords are identical. Use\n`auto` or explicit `ssh2` when multiple endpoints require passwords. `ssh2`\nsends each password through that endpoint's authentication protocol.\n\nThe password prompt currently uses plain-text input because Pi does not yet\nprovide a masked input API. A wrong password re-prompts until cancelled or the\nretry safety limit is reached. Servers that advertise only public-key methods\nfail directly without opening a pointless prompt. Headless sessions never\nprompt.\n\nPasswords are held in process memory. With **Persist passwords** enabled, they\nare also written to `ssh-remote-secrets.json` next to Pi's settings so restarts\nand `-r` resumes can reuse them. The file uses mode `0600` on POSIX; Windows\nrelies on the inherited user-profile ACL.\n\n```text\n/ssh-forget-password        Forget target and ProxyJump passwords used by this Pi session\n/ssh-forget-password all    Forget all cached and persisted SSH passwords\n```\n\nDisabling **Password prompt** prevents both user- and model-triggered prompts.\nDisabling **Persist passwords** stops future reads and writes of the secrets\nfile but does not erase existing entries; use `/ssh-forget-password` to remove\nthem. Passwords already cached by the current process remain available.\n\n### Model-triggered password authentication\n\n**AI password auth** applies only to the model's `ssh_connect` tool:\n\n- **On:** cached passwords may be used, and each required target or ProxyJump\n  TUI prompt has a live 60-second timeout. The user must enter every password\n  directly in Pi and must never send one in chat.\n- **Off:** `ssh_connect` is key-only. It neither reads cached passwords nor\n  opens a prompt; an authentication failure recommends configuring SSH keys or\n  re-enabling the setting.\n\nManual `/ssh-connect`, `/ssh-reconnect`, and startup `--ssh` actions are not\nsubject to the 60-second AI timeout. They may wait until the user submits or\ncancels the prompt.\n\n## Remote platform and shell\n\nThe default is automatic detection:\n\n```bash\npi --ssh devbox --ssh-shell auto\n```\n\nSSH Remote first probes through POSIX `sh`, which also distinguishes Unix from\na native Windows host:\n\n- a Unix account whose login shell is Zsh uses Zsh;\n- other Unix hosts try Bash, then POSIX `sh` for ash-only systems;\n- Windows hosts try PowerShell 7, then Windows PowerShell 5.1;\n- when probing is inconclusive, the same deterministic candidate order is\n  validated during workspace inspection.\n\nChoose a shell explicitly when needed:\n\n```bash\npi --ssh devbox --ssh-shell bash\npi --ssh devbox --ssh-shell zsh\npi --ssh winbox --ssh-shell pwsh\npi --ssh winbox --ssh-shell powershell\n```\n\nAn explicit shell is checked first. Missing Bash or Zsh falls back to `sh` with\na warning; missing `pwsh` or `powershell` falls back to the other PowerShell.\n\nThe Pi tool remains named `bash` for compatibility, but commands use the\nselected remote syntax. The model context and `!`/`!!` commands follow that\nsame shell.\n\nUnix commands use a non-login shell. This avoids replaying `/etc/profile` for\nevery operation—most notably, OpenWrt no longer prints `/etc/banner` before\neach command. SSH's account environment is retained, but login-only profile\ncustomizations are not re-sourced; source a specific profile explicitly when a\ncommand needs it.\n\nWorkspace control operations—path inspection, file tools, and search tools—use\nPOSIX `sh` scripts on Unix and encoded PowerShell scripts on Windows. This lets\nOpenWrt, Alpine, BusyBox, and other Bash-free systems use the complete file-tool\nset. On Windows, PowerShell commands are encoded as UTF-16LE payloads so script\ncontent does not appear directly in `ssh.exe` arguments; file data still moves\nas binary stdin/stdout. Cancellable Windows shell calls also record the root\nPowerShell PID and start time. A Pi Esc cancellation or bash timeout uses a\nsecond SSH channel with `taskkill /T /F` to remove that validated remote process\ntree before closing the primary channel; a hard transport deadline prevents a\nPowerShell 5.1 or Windows OpenSSH close hang from wedging the tool call. Normal\nWindows shell completion also emits a private, operation-scoped frame that both\ntransports remove from stderr. If a detached descendant inherits the remote\nstdout/stderr handles and keeps the SSH channel open, the matching OpenSSH\nprocess or ssh2 channel is finalized after a short output-drain grace period\nwhile the rest of a persistent connection remains available.\n\nKnown POSIX-control-script limits:\n\n- filenames containing newlines are not supported;\n- `grep` or `find` glob patterns containing `)` are not supported.\n\n## Workspace and session lifecycle\n\n### Commands\n\n| Command | Effect |\n| --- | --- |\n| `/ssh-connect <[user@]host[:port][:path]>` | Enter SSH or switch directly from the active target |\n| `/ssh-exit` | Return this conversation to its local workspace |\n| `/ssh-cd <remote-path>` | Change the persistent remote cwd without reconnecting |\n| `/ssh-status` | Live-check and show target, port, platform, shell, transport, cwd, and home |\n| `/ssh-reconnect` | Retry the stored target or apply a transport change |\n| `/ssh-forget-password [all]` | Clear session-scoped or all cached passwords |\n\nThese commands are always registered, including in ordinary local sessions.\nEnvironment-changing commands wait for the current agent run to settle before\nswitching backends.\n\n### Transactional switching and failure behavior\n\nHost and cwd changes are validated before they are committed:\n\n- `/ssh-connect` can switch directly between hosts; do not run `/ssh-exit`\n  first.\n- A failed host switch keeps the previous target, cwd, session name, persisted\n  state, and connection active.\n- A failed `/ssh-cd` keeps the previous cwd and connection unchanged.\n- Existing background tasks remain on the host and cwd where they started.\n  Only later launches follow the new environment.\n\nInitial failures are handled by source:\n\n| Action | Result on failure |\n| --- | --- |\n| Manual `/ssh-connect`, startup `--ssh`, or restore | Session remains **Disconnected** and workspace tools fail closed |\n| Model `ssh_connect` from local | Session automatically returns to its local workspace |\n| Manual or model switch from active SSH | Previous SSH workspace remains active |\n| `/tree` restoration to another branch environment | Fails closed; the previous branch's host is not reused |\n\nWhile SSH is connecting or disconnected after failure, routed tools and\n`bg_start` report the SSH error instead of operating on Pi's local cwd. Use\n`/ssh-reconnect` to retry or `/ssh-exit` to explicitly return local.\n\n### Resume and branch state\n\nPi conversations and session files stay local. SSH Remote stores a hidden,\nbranch-aware entry containing only:\n\n- target or alias;\n- optional explicit SSH port;\n- resolved remote platform and shell;\n- resolved remote cwd and home;\n- optional local OpenSSH config path.\n\nIt does not put passwords, private keys, SSH config contents, or remote file\ncontents in session state. Legacy version 1 Unix/Bash entries are migrated in\nmemory.\n\nThe selected local or SSH environment is restored after `/resume`, `pi -r`,\n`pi -c`, reload, fork, clone, and `/tree`. `/new` inherits the previous remote\ntarget. `/ssh-exit` writes an explicit local marker, so later resume stays local\ninstead of finding an older SSH entry. Passing a conflicting target, port,\nconfig, cwd, or explicit shell while resuming is rejected to prevent an old\nconversation from modifying another machine.\n\nPi still groups sessions by its **local** cwd. Start remote projects from a\nstable local anchor directory; in `/resume`, press Tab to switch from\n**Current Folder** to **All**. Resume restores conversation and environment\nmetadata, not a snapshot of remote files or running processes.\n\n### Status and automatic session names\n\nThe footer status shows only `SSH: Connecting`, `SSH: Connected`, or\n`SSH: Disconnected`. Persistent OpenSSH and `ssh2` transports publish close\nevents directly; no periodic remote command is run. Any foreground operation\nthat observes a transport failure also updates the footer immediately.\n`/ssh-status` remains an explicit live probe, while single-use OpenSSH\nconnections are checked only on demand because there is no persistent\ntransport to observe.\n\nFor unnamed sessions, SSH Remote sets Pi's native session\nname to a stable location and then appends the remote Git branch and first user\nmessage when available:\n\n```text\nSSH devbox:/srv/project (main) • Fix the build\nSSH deploy@devbox:2201:/srv/project (main) • Fix the build\n```\n\nA user-assigned `/name` is never overwritten.\n\n## AI control tools\n\n**SSH Remote → AI control tools** defaults to **Off**. Enabling it in\n`/99settings` immediately adds:\n\n| Tool | Purpose |\n| --- | --- |\n| `ssh_connect { target }` | Enter SSH or switch directly to another `[user@]host[:port][:path]` target |\n| `ssh_exit {}` | Return to the local workspace |\n| `ssh_cd { path }` | Change the active remote cwd |\n| `ssh_status {}` | Inspect the current environment |\n\nDisabling the setting removes these tools from the active tool set without\naffecting manual commands or an active SSH workspace. `ssh_connect`, `ssh_exit`,\nand `ssh_cd` execute sequentially so environment transitions cannot race sibling\ntool calls. The model is instructed to complete a transition before issuing\nfile or shell calls against the new environment.\n\nSSH Remote deliberately provides no permission prompt, allowlist, or approval\nUI. A separate general-purpose extension can gate these stable tool names\nthrough Pi's `tool_call` event. Environment transitions are also published on\nthe `ssh-remote:environment` event bus channel for auditing and integration.\n\nSee [Model-triggered password authentication](#model-triggered-password-authentication)\nfor the independent **AI password auth** setting.\n\n## Tool routing and integrations\n\n### Routed and local behavior\n\n| Runs on the SSH workspace | Remains local |\n| --- | --- |\n| `read`, `write`, `edit`, `bash` | Pi TUI and conversation history |\n| Optional `grep`, `find`, `ls` | Model credentials and installed packages |\n| User `!` and `!!` commands | `todo`, `thinking-fold`, `cursor-effect`, `codex_search` |\n| Shared workspace-file providers | Session files, project discovery, and skill definitions |\n| TUI `@` path lookup | Pi's editor and autocomplete UI |\n| New background tasks | Pi's local anchor cwd |\n\nSSH Remote keeps Pi's native tool schemas, rendering, diffs, truncation, and\nmutation-queue behavior. Optional `grep`, `find`, and `ls` retain Pi's normal\ndisabled state and become remote only when enabled through `--tools` or the tool\nselector.\n\n### Remote `@` path completion\n\nWhile an SSH workspace is active, Pi's TUI `@` completion searches files and\ndirectories under the current remote cwd rather than the local anchor cwd. It\nkeeps Pi's normal token, quoting, scoped-path, fuzzy-ranking, and insertion\nbehavior, including paths containing spaces:\n\n```text\n@src/\n@config\n@\"docs/release notes.md\"\n```\n\n`/ssh-cd` and host switches update the completion root immediately. Returning\nto local mode restores Pi's built-in local provider. A connecting or unavailable\nSSH workspace returns no `@` paths instead of falling back to local files. This\nis an interactive TUI feature; print and RPC modes do not display completion\nmenus.\n\n### Shared workspace files and Codex images\n\nSSH Remote registers its active binary file backend through\n`@99percentpeople/pi-workspace-files`. Consumers follow the same remote adapter\nas Pi's `read` and `write` tools without tool-specific SSH hooks.\n\n`@99percentpeople/pi-codex-api` uses this provider automatically:\n\n- `output_path` resolves inside the remote workspace and is written there\n  directly;\n- `referenced_paths` are read remotely and sent to the image API;\n- no image is staged locally and no reverse SSH or `scp` step is required;\n- existing files are never overwritten;\n- paths outside the active remote workspace are rejected.\n\nExample for a Windows SSH workspace:\n\n```text\noutput_path: C:\\Users\\dev\\Desktop\\wallpaper.png\nreferenced_paths: [C:\\Users\\dev\\Desktop\\reference.jpg]\n```\n\n### Background tasks\n\nWhen `@99percentpeople/pi-background-tasks` is installed, SSH Remote registers a\nremote backend for pipe and PTY jobs. Version 1.2.7 or newer also allows\n`bg_start.cwd` to name a remote-only Unix or Windows directory. Remote signal,\ntransport-recovery, and ControlMaster-lease safety require Background Tasks\nprotocol v2; SSH Remote blocks remote `bg_start` with an actionable update\nmessage when an older build is detected.\n\nBackground jobs require a real local process or PTY, so they always launch the\nsystem OpenSSH client:\n\n- Linux/macOS OpenSSH foreground mode shares the managed ControlPath.\n- `ssh2`, Windows `auto`, and native Windows OpenSSH use separate\n  non-interactive OpenSSH connections for background jobs.\n- A foreground password is not forwarded to those separate processes; use an\n  SSH key or agent.\n\nSSH Remote registers a named, high-priority Background Tasks provider. Active\nSSH resolves remotely, connecting or failed SSH fails closed, and local mode\nfalls through to lower-priority providers such as Pwsh. This avoids\nlast-writer registration races and restores arbitrary local adapters without a\nper-`bg_start` reclaim.\n\nEvery SSH launch records an immutable label such as\n`SSH devbox:/srv/project`. Background task results—including start,\nstatus, wait, logs, input, and termination—repeat this label, and task rows show\nit inline in the widget. This lets the model and user distinguish old tasks\nafter a host or cwd switch. Finished task snapshots retain the label across\nextension reloads.\n\nEach launch also creates a private remote control record for its Unix process\ngroup or Windows process tree. `bg_send` signals and `bg_kill` use a short SSH\ncontrol channel to target that remote process directly; they do not mistake\ntermination of the local `ssh` launcher for termination of the command. Unix\nsupports its normal named signals and preserves the user shell's signal\nhandling, so Bash `trap` handlers continue to run for signals such as `INT`,\n`TERM`, `HUP`, `QUIT`, `USR1`, and `USR2`. Remote Windows termination uses\n`taskkill /T /F`, and unsupported Unix-only signals return an error.\n\nEach multiplexed job holds a task lease on its launch-time ControlMaster. Host\nswitches and even an earlier-running SSH shutdown handler defer socket removal\nuntil all leased jobs settle, so password-authenticated jobs remain\ncontrollable without copying a password into background or signal processes.\nA key- or agent-authenticated direct connection remains the fallback when no\nmanaged master exists.\n\nIf the local `ssh` transport exits unexpectedly, the task control probes its\nimmutable remote record, requests `SIGTERM`, escalates to `SIGKILL` when needed,\nand only then finalizes the task. If connectivity prevents confirmation,\nBackground Tasks reports `disconnected` and preserves signal control for a\nlater retry instead of claiming that the remote process exited. Running jobs\nstay on their original host and cwd across `/ssh-connect`, `/ssh-exit`, and\n`/ssh-cd`; resume does not reattach running jobs. Native Windows `ssh.exe` pipe\nlaunches use `-n` to avoid the OpenSSH stdio deadlock and therefore require PTY\nmode when later interactive stdin is needed.\n\n### Windows PowerShell adapter\n\nOn Windows, `@99percentpeople/pi-pwsh-adapter` may register the `bash` tool\nfirst. SSH Remote uses the shared `bash:delegate` protocol instead of competing\nfor that tool name:\n\n- active SSH sessions run the delegated shell remotely;\n- connecting or failed SSH sessions fail closed;\n- local sessions use the normal local PowerShell backend;\n- after `/ssh-exit`, the named SSH provider falls through to the registered\n  local PowerShell background provider.\n\nUse compatible versions of both packages.\n\n## Compatibility and limitations\n\n- Use SSH Remote 0.6.2 or newer with Pi 0.85.x. This fixes model-facing `bash`\n  calls passing Pi's local session cwd to the remote shell. The cwd is mapped\n  to the active remote workspace, including after `ssh-cd`, on both older and\n  newer Pi versions.\n- `ssh2` implements the documented compatibility subset only. Use explicit\n  OpenSSH for certificates, hardware keys, arbitrary routing, GSSAPI, or\n  keyboard-interactive authentication.\n- Windows PowerShell 5.1 can keep a manually nested native `ssh.exe` invocation\n  open long after its remote command exits when console stdin remains attached.\n  Prefer `ssh -n ...` for such nested commands or use PowerShell 7. Pi Esc and\n  bash timeout still terminate the outer recorded process tree.\n- Local `AGENTS.md`, `.pi`, project settings, registered skills, and references\n  inside skill directories are not virtualized. They continue to come from\n  Pi's local anchor directory.\n- `read` downloads the complete remote file before applying Pi's line and byte\n  truncation. Use the remote shell to select a range from very large files.\n- Unix `find` uses remote `rg` when available so `.gitignore` is honored. Its\n  POSIX fallback and the native Windows implementation always exclude `.git`\n  and `node_modules`, but do not reproduce every `.gitignore` rule.\n- Remote file paths are encoded into a reserved logical namespace before Pi's\n  file tools run. This prevents Pi's local mutation queue from resolving\n  remote-only paths such as `/root` or `/etc` against the local machine.\n- `edit` serializes mutations inside the current Pi process, but cannot stop\n  another process on the remote host from changing a file between read and\n  write.\n- Remote shells receive safe Pi model/session identifiers but never\n  `PI_SESSION_FILE`, because that path exists only on the local host.\n- Conversation resume does not restore remote processes or snapshot repository\n  contents.\n\n## Security\n\nThe package runs either the system OpenSSH client or the bundled `ssh2`\nprotocol client and executes commands with the same permissions as a manual SSH\nlogin. Model-provided shell commands are executable code; review the package and\nuse a restricted remote account where appropriate.\n\nFile paths are placed only in encoded control scripts or shell-quoted POSIX\ncommands, and file contents travel through SSH stdin/stdout channels. Passwords\nnever enter SSH command arguments, but TUI password input is currently unmasked\nand persisted passwords depend on the protections of the local settings\naccount. Prefer SSH keys or an agent for unattended and background work.\n\n## Development\n\nThe source tree keeps the Pi entrypoint thin and groups implementation by\nresponsibility:\n\n```text\nindex.ts                 # package entrypoint\nsrc/extension.ts         # Pi registration and workspace lifecycle\nsrc/adapters/            # Unix and Windows remote shell adapters\nsrc/background/          # background launch, control, and signaling\nsrc/transport/           # OpenSSH, ssh2, authentication, and selection\nsrc/workspace/           # paths, tools, completion, and file operations\nsrc/{config,settings,session-state}.ts\n```\n\n```bash\nbun run build:packages\nbun run --cwd extensions/ssh-remote build\npi -e ./extensions/ssh-remote/index.ts --ssh devbox:/srv/project\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}