{"_id":"termfleet","_rev":"22-154cce1b62d003bcdbf05b45e0a04c49","name":"termfleet","dist-tags":{"latest":"0.2.14"},"versions":{"0.1.0":{"name":"termfleet","version":"0.1.0","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.0","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"46209bca05a4c48ee7f0b7d4ea677baf54b2faef","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.0.tgz","fileCount":189,"integrity":"sha512-CA7IEYugqd6AmWtdVaLVNu6q+ko7wjGjPZdDJLCgLtNnuw98y87vAFPEp9u0OcvtL/O/q7GGRrzIQ6pAURiRvA==","signatures":[{"sig":"MEYCIQD7xxiYpW3nf7lMvO67kspOd7kArmr6ZouQzaP2Egz3jAIhAIhZ0ooDsi7r/YebfEU10XrNMonaHJ/Xz4UBJZpRMV9H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8308786},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"a8c7e5a6ef5b6ef0626e37c6257bb99a4945743f","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@hocuspocus/server":"^4.3.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.0_1782271820413_0.9908189790297546","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"termfleet","version":"0.1.1","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.1","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"f14e93dded411e14b7452df85d03e3f0dda8c55c","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.1.tgz","fileCount":189,"integrity":"sha512-Se2ExCPPARXxTzaklHaHfhXkcybDMA3j21dvHQKoLkebELiw5sQaRyBiMhrfoGw7Q8ebK4InRzzF5gF/DQeg5Q==","signatures":[{"sig":"MEQCIE9/BYpjZRrhUbSNRg5YzeIZTC29qo8kBs6Ino0GWg+CAiAtPyFQljWHhphgKr0dKcNVQhbwH1EIezVvaZ4VogeEqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8312603},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"1786d511d0f1bfa9cd26905547b211c8c7788080","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.2","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@hocuspocus/server":"^4.3.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.1_1782279927443_0.33760648627141654","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"termfleet","version":"0.1.2","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.2","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"65bf520037fe45f391cda92a1fe7c67a95725fa8","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.2.tgz","fileCount":189,"integrity":"sha512-JLLGEDFwKbpv+L4TisZlXNqmlYnY2lTZSRYqIu6zZlq0sDpsKAF7t5y6njRcVUuyr7nTMNm1Hzv7T8WYcWVD6A==","signatures":[{"sig":"MEQCIBmEmijqvUpvmy9v6r/4MiCbKLY2UThISz0V9WALcsYvAiBHBufTfOaX8fWbavDQnDHvLUe8OefObi44OK5L//G6qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8312954},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"1f4f8f02c1f37e9c6f6222485597a6513978e1ea","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.3","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.2_1782281673156_0.686882348549408","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"termfleet","version":"0.1.3","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.3","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"d1c2411ba5fc9b760b80bb5add844b8245ca7869","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.3.tgz","fileCount":189,"integrity":"sha512-bapT+HGAe7QFfCkas0g9/ao7kjO5T5mL0OuTr+RX+0EYxUqrF5aA6rYtONfLjqqBd13NAVHbJseBcD6+I2BV9w==","signatures":[{"sig":"MEYCIQC2C+qtpWqSdX4S6w+VH90oDW/7bjY37rtLs8DekQAH0gIhAN1Gzyit7tWl5c1zaYdHYKjXcKxGKqyse3c9dW4kHJou","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8313679},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"7f6167ea282cca5382582211b9ef456a81921748","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.3","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.3_1782282414854_0.9309657065534038","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"termfleet","version":"0.1.4","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.4","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"61e753d3c470a6c2134b535d22a4c2be124aa871","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.4.tgz","fileCount":180,"integrity":"sha512-jidapy3ZybPuK8SyP0jWdvjgQIByUfZ36AqODYxO2exEzjliTu83b43IuqE83Mconpb56l+4elTq4QXmYc9NHA==","signatures":[{"sig":"MEQCICG/wjBixl6zn5VwaSkb/dX4u/MDDr8KUjZ83Cgn1I48AiAcSnZZNFXKW0BQGLn76s+00cEAzVLrHD9vALHHWTel5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3067615},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"692075b818a0e3efb554e5ccb08959943644e994","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.3","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.4_1782283501014_0.19638423096609992","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"termfleet","version":"0.1.5","author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.1.5","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"896c61331c465835d84961541739698ed0a641d1","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.1.5.tgz","fileCount":180,"integrity":"sha512-ghfomCuIBHVuOHRgqLiZYYZQZKuadYEOGBsSA9q8kvSl4JBs0X6TQxoMUKpt6WQPZvd4gJ4PZC75UTKoaCjRAg==","signatures":[{"sig":"MEUCIQDGfhYGXlHFb9GHzHNHwCvc6FNdgfNDiAgD+ugpsTezFgIgE7luNfQpaDVYduy6BSXTxtmwIkuv9x6F60s6PES8a2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3068107},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"b3beee6e7b2267f98941586410673907f3472156","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"deprecated":"Withdrawn pre-release. Use 0.2.0 — the first public release. (0.1.x carried an internal tunnel-relay hostname in compiled local-tunnel.js; not a credential, but superseded.)","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.1.4","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.1.5_1782285308594_0.19150331546834276","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"termfleet","version":"0.2.0","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.0","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"2dd77a3356a7ee9f9f2fbcac0fb2933d462c9b22","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.0.tgz","fileCount":115,"integrity":"sha512-sjAl1UKapp5rgHlSaP8RVckIAl396q1gOrP9MyJcFiHHy//gi3KKrQrwIjAWHib70vghEhGXSfeb8VcgQLP/RA==","signatures":[{"sig":"MEYCIQDJ2v/HEuU06rtlCY/xMW0SsWIBo2uurwGVsLfJwO6CjgIhAJMKMGjeG6tpgTwAOlcBjg2lhyLLpz/9cwtjPSm3Bwaa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2752308},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"77f06574de9da22641118206533dbf7cab61e332","private":false,"scripts":{"lint":"eslint .","test":"tsx --test --test-concurrency=1 test/*.test.js","build":"npm run build:server && vite build","serve":"tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"tsx src/cli.ts doctor","pretest":"npm run build:core","test:e2e":"npm run build && playwright test","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"node scripts/fleet-e2e.mjs","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core","prepublishOnly":"npm run build","test:orchestrate":"node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","eslint":"^10.5.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^6.0.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","@vitejs/plugin-react":"^6.0.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.0_1782361810677_0.832506775155238","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"termfleet","version":"0.2.1","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.1","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-mcp":"dist/mcp/server.js"},"dist":{"shasum":"a618e258db5bd52b3b032c7679ab25d6b0eb7e58","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.1.tgz","fileCount":199,"integrity":"sha512-tIvipkpftC+VQMYY7a0QTFThNehDLp4M2isfnsYPigvB7UG8pB5coVPnQiP92j5eaWX1b/fx5Blcv4v0TNTEiA==","signatures":[{"sig":"MEUCIQDVUIL+WBCchqC+5DZNHgVubAh9fW0E3g9/V65N7CxMnwIgUpDyKUIw4wvAv8IHCHBeBKjUAqWfSnFRl7mf4LQfDcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3520399},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","test:rh2":"node scripts/run-rh2-suite.mjs","chmod:bin":"node -e \"for (const f of ['dist/cli.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","test:widget-node":"node scripts/run-widget-node-suite.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["apps/rh2","apps/rh2/sdk/typescript","apps/rh2-widget","packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"^1.5.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.2","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.1_1784863436195_0.2859266724878866","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"termfleet","version":"0.2.2","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.2","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"b59fddec8ad9697b41583cc12a629424f243e270","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.2.tgz","fileCount":214,"integrity":"sha512-0ftNWZct3a7/tC3C1HmUqSF9wN0Tb+c6ng5CmNp2B2clmPTMw/EwCx1F8K5Kn/rB0a5l283mORotTAmO+H6uRA==","signatures":[{"sig":"MEQCIDcWg+vcAeNUN2t2mCx6ft0mIoGNZC4mjfdvoti0W06bAiAp4TOIfrvZ8lJ4l14LSx307EF3pcR1NAxxrExuPJfglg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3683517},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"gitHead":"c8513054c6e3dfd5a58f4e18e5d8a2f3dce6478e","private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.3","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.2_1787074260477_0.29550504663000443","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"termfleet","version":"0.2.3","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.3","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"6f829dbffc590b0611a4bb2c7cc8f7c9a3df9d92","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.3.tgz","fileCount":214,"integrity":"sha512-AvDt26k7H7lLuGvS8ytq67ucVVfiNfsky6w1whdjtivxrG2XrgWMA7Q9C5bjrWftBdVPOgVGdHdsKWlG8GLG1Q==","signatures":[{"sig":"MEYCIQChHC2VYwb5RYC1Pz18cF3/szJft47Yp4m2q46Q1WrX1gIhAMgNZjfU7+xX8nyDDpHdN4AlqXwfG5EJox/YrHIlJKeI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3683834},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.4","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.3_1787323518843_0.2540708662173039","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"termfleet","version":"0.2.4","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.4","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"e4bda6637d98f016d1d0718ac93d132963d875ad","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.4.tgz","fileCount":214,"integrity":"sha512-sFklnm0SIFRuH6B2BCjsF/0GkGiqQ1HfORt910Z18P7oU1TYRwQ8XEm/Fc/OeWIHwAcSWcIQVnV1VUZgZ/IjRg==","signatures":[{"sig":"MEQCICqyooymzWYNwx0xtPPclagADs6UhPf8g7PcN4EzhHIQAiB4CwHwc83q6zuSAr94wvNc04i1yY84Z630y2IiBRI3tg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3699894},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.4","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.4_1787350075383_0.8009544794839671","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"termfleet","version":"0.2.5","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.5","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"26d5d6b845d4230bd8410554b8f373a9231a3f52","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.5.tgz","fileCount":214,"integrity":"sha512-ZlItRAi9371LzArg+G3MFvOYOJskIz9/tGZRAWEo07PalDlwM9o0pcYP2NuzuWxADs5fv8sXss6ieTePgtMXHw==","signatures":[{"sig":"MEYCIQDnicLDcm5I+wWyrfg++yAL7LIhv+ECZ38N6KagIYHpywIhANjZOuR3/m/X+1QN2S0GIXTXj9QDl2z0HEx0iB5v/Iqu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3700076},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.5","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.5_1787350396157_0.7136072735313665","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"termfleet","version":"0.2.6","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.6","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"a2ed02ff60ad4dee321ea0a8437d889bb7dc48ce","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.6.tgz","fileCount":214,"integrity":"sha512-hvoPHmbqXcGRmyEcvRhS+9lU46BenbLGaIXzaOwpQ5fqxAsbCc26fYE4t9ajw9OpfajdAi55/Gon8hGvlOlOgg==","signatures":[{"sig":"MEUCIErahU0EGMCFKukLpxtZQ8sVpQ+LqOGQOF319PUf9XRQAiEAvhNlaXWWpedMgCFrme/CCtDqSqfuUniI9s20D1Ly37A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3700329},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.6","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.6_1787358201939_0.2741116781963322","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"termfleet","version":"0.2.7","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.7","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"dfe1ce8fb0c813d26c69bc534c3f27bf812c9b6f","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.7.tgz","fileCount":214,"integrity":"sha512-MBhPagf+UB7iVlL1uJAm97GynaWcJjN4UJhD7P8tH6aXb7byx083O5o4LX+H2mAn3M6d8S69mTsp1t624M5AEg==","signatures":[{"sig":"MEYCIQCqUWBaLkZ1nRpCQUJ0cyJtzClV62buoXY1cOGpnPIFXgIhAOyDcrgC1izaAt6V1k9U97FFm3VQ9+MFLsKhoKxdKxrU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3653354},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json"},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.7","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.7_1787577262578_0.7606398467346671","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"termfleet","version":"0.2.8","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.8","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"726d11943102719617f2ae311f0ab546f845ff8c","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.8.tgz","fileCount":218,"integrity":"sha512-7/GiaadL/SPPXBsdPI4EwZ8dpRiLY6FHhvlNCH/2Quo/kXTKemMDoAVxs23RzMFZHeEPeS4Eil0F1LZdXpEV8A==","signatures":[{"sig":"MEUCIFiwAsCLtGX1z1DVIufE2mgmYBeKN0K/wfEjiuEFeXfzAiEAgSWpLmmIh/C20drTpYKzwNhvItqOAD7vj+BevUhVjNs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3677370},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"gitHead":"b79dfa50df48a3f2335ab1e74b201b21d4dc64f2","private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.8","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.0","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.8_1787593134872_0.34203990790391825","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"termfleet","version":"0.2.9","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.9","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"4fedb4deaec7d36fcd9ab8cb50746bde957fc51f","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.9.tgz","fileCount":218,"integrity":"sha512-WU4hjJc2t4wf22BrGCaH0BQKgU8TFXwL5zolTxa3AGrjPCG5wIsZgssBeh9ZSCcjGCjCZW4bnS64tCaocfdTyw==","signatures":[{"sig":"MEUCIAMWoalQpLFeI7RQckJgIUsgCDIDqSSZhqGm8Tl3/02gAiEAkgGvUEUuxcCxTB8vnoYsB0MUC5VOxvxDSsBN8nVpMMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3675112},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.9","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.10","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.9_1787634717964_0.9607679513129461","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"termfleet","version":"0.2.10","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.10","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"a6f4bb6285f76c99e5bde4f77dfff2bc07f8d906","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.10.tgz","fileCount":218,"integrity":"sha512-nXs0kY15XRXTf66BT0eaImivBdbjm62DvJdWhwm0Kwh8CPufD1Unr1LjBFM3dnAEIjo+YUTSFWMsQ6dmIOm0yg==","signatures":[{"sig":"MEUCIQDYPqqcjtxwXFo3fs/Se82YNtqKhMv7sAOd5s4JXR6/NgIgbAWeipUG5vSR4qDP9X8YZ2SXhPTiUaOtpaZrX+dYm04=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3675731},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.9","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.10","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.10_1787656662175_0.6304416223117217","host":"s3://npm-registry-packages-npm-production"}},"0.2.11":{"name":"termfleet","version":"0.2.11","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.11","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"5bc1a8659ef05a1aa2f6bd62b8f1605523886972","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.11.tgz","fileCount":218,"integrity":"sha512-8IECGaIH8nr8CH8kbHALxqUYmSwYCMZZoIJvU3AnLutvrMeyrdEAE49Cnn69ZxUhY3ne1T0PXiDohDl7ThghqA==","signatures":[{"sig":"MEUCIQCB3MlnWQQnfzTn0AnRRAArVZNTvsALtQOr7gl2dcQGuAIgScYwDzz5PqwZVKTvBeXW+whT/y9G82JAxwFFt/Fh54g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3675999},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.9","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.10","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.11_1787660180199_0.34208620433830816","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"termfleet","version":"0.2.12","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.12","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"03714287ebade36a6585e77e4e987bf39ec64a06","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.12.tgz","fileCount":218,"integrity":"sha512-cwmatDg93ShAgKQnkWxIQWWiNfGhmXpm4Cv/9aBW4JfqIxlRCSFbGax39tUeIFkb1D5QxjtPbdy3Vgq2AudFJA==","signatures":[{"sig":"MEYCIQDVNXYps571IhKnIHsHfcvCFs8L5gcDE12UzJmpq0qtlgIhAP8JrZMQump0xEqnC7B8MzVPT8kv2DzbojjSAQmcOeh0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEUUC3yrf6IvNeXpJsOYEZ7HXIQXZ4KW/SZb91N7ymhTAiBFmAFQfCrm/Byd2Mo4oMUKPnz0p01Z1aMQSIjch0FjJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3675600},"type":"module","_from":"file:/tmp/termfleet-patch-release.yqrVV4/termfleet-0.2.12.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","postinstall":"patch-package","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"_resolved":"/tmp/termfleet-patch-release.yqrVV4/termfleet-0.2.12.tgz","overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"_integrity":"sha512-cwmatDg93ShAgKQnkWxIQWWiNfGhmXpm4Cv/9aBW4JfqIxlRCSFbGax39tUeIFkb1D5QxjtPbdy3Vgq2AudFJA==","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.11","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.11","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.12_1788748662616_0.751667990031178","host":"s3://npm-registry-packages-npm-production"}},"0.2.13":{"name":"termfleet","version":"0.2.13","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"author":{"name":"Volter AI"},"license":"Apache-2.0","_id":"termfleet@0.2.13","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"homepage":"https://github.com/volter-ai/termfleet#readme","bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"dist":{"shasum":"fa079e6c733ae45f55ecefd1072eaa753ad087f5","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.13.tgz","fileCount":220,"integrity":"sha512-Lcpcj0S82atmqMGSHYtSRPJIDsGWiGHeCx83Ti07MFEGmM74XcYN6azd3WRXzUB3HR1/VrU4kInvSE77OGxt9Q==","signatures":[{"sig":"MEYCIQDfuzPRk0kPJMGwAU7djHMbVVOyuek/pq16D+8LuVYf4gIhAOJbfLTj5M/L4efdfkiG4xehPzd/suiIE2J2JvbFUA/2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHT6C1jsAOe1U6jU0u4Qorw2ZzhqGNwDoSlfYSZtYph2AiBc/beishe/RFInJnvQ7Jyz/h/m64FpOEkjIkrKY8tg9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3724805},"type":"module","_from":"file:/tmp/termfleet-terminal-compat.WkekiO/node_modules/termfleet-0.2.13.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","prepare":"patch-package","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"_resolved":"/tmp/termfleet-terminal-compat.WkekiO/node_modules/termfleet-0.2.13.tgz","overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"_integrity":"sha512-Lcpcj0S82atmqMGSHYtSRPJIDsGWiGHeCx83Ti07MFEGmM74XcYN6azd3WRXzUB3HR1/VrU4kInvSE77OGxt9Q==","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.12","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.12","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@volter-ai-dev/supercode-harness-sdk":"^0.3.21","@volter-ai-dev/supercode-remote-access":"^0.2.1","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"tmp":"tmp/termfleet_0.2.13_1788753421889_0.5916214497945815","host":"s3://npm-registry-packages-npm-production"}},"0.2.14":{"_id":"termfleet@0.2.14","bin":{"termfleet":"dist/cli.js","termfleet-acp":"dist/acp/server.js","termfleet-mcp":"dist/mcp/server.js","termfleet-execution-boundary-install":"dist/execution-boundary-install.js"},"bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"dist":{"shasum":"83474c0bd95c6fc5578726fda6a07e1233449b24","tarball":"https://registry.npmjs.org/termfleet/-/termfleet-0.2.14.tgz","fileCount":222,"integrity":"sha512-3CZaWrNgfyDn/62fjNJBlJlDURbMKLceALN92VsbXqBxgzvj2LuTUhR7DI8vhSwann/HZDeSZeWBgDMl/oXdkw==","signatures":[{"sig":"MEUCIQDhCcqb4A6K4e5R5VGXI4uZt5cYifN6k9ngYhaNnJbd8wIgQyBJLQf3wiIkbX/qQv+UVtLmT6Qouqd8m+8LCaqRNyA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFiPfq7TJaqh/mYczJbcb7YIpQa5VXvFamAhMXWQEYZlAiAb+HfjMB/Rx2SprGKeU7M3u0+rpnV+2JYiZGkj7aijNA=="}],"unpackedSize":3725248},"name":"termfleet","type":"module","_from":"file:/tmp/termfleet-hermes-candidate.qAfIy0/termfleet-0.2.14.tgz","types":"./dist/index.d.ts","author":{"name":"Volter AI"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./sessions":{"types":"./dist/sessions.d.ts","default":"./dist/sessions.js"},"./package.json":"./package.json","./native-terminal":{"types":"./dist/native-terminal.d.ts","default":"./dist/native-terminal.js"}},"license":"Apache-2.0","private":false,"scripts":{"dev":"NODE_OPTIONS=--conditions=development tsx watch src/cli.ts","lint":"eslint .","test":"npm run test:fast","build":"npm run build:server && vite build","serve":"NODE_OPTIONS=--conditions=development tsx src/cli.ts console serve --name termfleet-demo --port 7373","doctor":"NODE_OPTIONS=--conditions=development tsx src/cli.ts doctor","prepare":"patch-package","test:all":"npm run test:fast && npm run test:integration","test:e2e":"npm run build && NODE_OPTIONS=--conditions=development playwright test","chmod:bin":"node -e \"for (const f of ['dist/acp/server.js','dist/cli.js','dist/execution-boundary-helper.js','dist/execution-boundary-install.js','dist/mcp/server.js']) require('node:fs').chmodSync(f, 0o755)\"","test:fast":"node scripts/run-test-tier.mjs fast","test:host":"node scripts/run-test-tier.mjs host","test:unit":"npm run test:fast","typecheck":"tsc --noEmit","build:core":"npm run build:terminal && npm run --workspace @termfleet/core build","clean:dist":"node -e \"require('node:fs').rmSync('dist',{force:true,recursive:true})\"","docker:run":"docker run --rm -p 127.0.0.1:7374:7373 termfleet:local","test:fleet":"NODE_OPTIONS=--conditions=development node scripts/fleet-e2e.mjs","test:agents":"node scripts/run-test-tier.mjs agents","build:server":"npm run clean:dist && npm run build:core && tsc -p tsconfig.server.json && npm run chmod:bin","docker:build":"docker build -t termfleet:local .","pretypecheck":"npm run build:core && npm run build:media-web","test:manifest":"node scripts/run-test-tier.mjs validate","build:terminal":"npm run --workspace @termfleet/terminal build","prepublishOnly":"npm run build","build:media-web":"npm run --workspace @termfleet/media-web build","cleanup:scratch":"node scripts/cleanup-agent-scratch.mjs","test:integration":"node scripts/run-test-tier.mjs integration","test:orchestrate":"NODE_OPTIONS=--conditions=development node scripts/orchestrate-e2e.mjs","build:cloud-console":"VITE_TERMFLEET_CONSOLE_MODE=cloud VITE_TERMFLEET_PROVIDER_CONNECTION=direct vite build","deploy:cloud-console":"npm run build:cloud-console && npm --workspace @termfleet/registry-worker run deploy","test:driver-conformance":"NODE_OPTIONS=--conditions=development tsx --test --test-concurrency=1 test/provider-driver-conformance.test.js"},"version":"0.2.14","_npmUser":{"name":"aaronvolter","email":"aaron@volter.ai"},"homepage":"https://github.com/volter-ai/termfleet#readme","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"_resolved":"/tmp/termfleet-hermes-candidate.qAfIy0/termfleet-0.2.14.tgz","overrides":{"@redocly/openapi-core":{"js-yaml":"4.3.0"}},"_integrity":"sha512-3CZaWrNgfyDn/62fjNJBlJlDURbMKLceALN92VsbXqBxgzvj2LuTUhR7DI8vhSwann/HZDeSZeWBgDMl/oXdkw==","repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"workspaces":["packages/core","packages/media-web","packages/registry-worker","packages/terminal"],"_npmVersion":"11.12.1","description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","directories":{},"maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"_nodeVersion":"23.9.0","dependencies":{"ws":"^8.21.0","yjs":"^13.6.31","zod":"^4.3.6","react":"^19.2.7","lucarne":"1.6.1","engine.io":"^6.6.0","react-dom":"^19.2.7","socket.io":"^4.8.3","remark-gfm":"^4.0.1","y-protocols":"^1.0.7","@xterm/xterm":"^6.0.0","@xyflow/react":"^12.11.0","patch-package":"^8.0.1","remark-breaks":"^4.0.0","react-markdown":"^10.1.0","@termfleet/core":"^0.2.12","playwright-core":"^1.60.0","@xterm/addon-fit":"^0.11.0","qrcode-generator":"^2.0.4","socket.io-client":"^4.8.3","@hocuspocus/server":"^4.3.0","@termfleet/terminal":"^0.1.12","@hocuspocus/provider":"^4.3.0","@agentclientprotocol/sdk":"^1.3.0","@modelcontextprotocol/sdk":"^1.12.0","@fortawesome/react-fontawesome":"^3.3.1","@volter-ai-dev/supercode-client":"^0.3.45","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@volter-ai-dev/supercode-harness-sdk":"^0.3.21","@volter-ai-dev/supercode-remote-access":"^0.2.1","@homebridge/node-pty-prebuilt-multiarch":"^0.13.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^8.0.16","jsdom":"29.1.1","eslint":"^10.5.0","ztrack":"^1.1.0","wrangler":"^4.101.0","@types/ws":"^8.18.1","react-scan":"^0.5.7","typescript":"^5.9.3","@types/node":"^25.9.2","@types/react":"^19.2.17","@playwright/test":"^1.60.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.62.0","openapi-typescript":"^7.13.0","@testing-library/dom":"10.4.1","@vitejs/plugin-react":"^6.0.2","@testing-library/react":"16.3.2","eslint-plugin-perfectionist":"^5.9.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/termfleet_0.2.14_1788756935861_0.08244768673692282"}}},"time":{"created":"2026-06-24T03:30:20.227Z","modified":"2026-09-07T04:55:36.124Z","0.1.0":"2026-06-24T03:30:20.748Z","0.1.1":"2026-06-24T05:45:27.668Z","0.1.2":"2026-06-24T06:14:33.431Z","0.1.3":"2026-06-24T06:26:55.109Z","0.1.4":"2026-06-24T06:45:01.242Z","0.1.5":"2026-06-24T07:15:08.736Z","0.2.0":"2026-06-25T04:30:10.926Z","0.2.1":"2026-07-24T03:23:56.393Z","0.2.2":"2026-08-18T17:31:00.655Z","0.2.3":"2026-08-21T14:45:19.062Z","0.2.4":"2026-08-21T22:07:55.625Z","0.2.5":"2026-08-21T22:13:16.343Z","0.2.6":"2026-08-22T00:23:22.189Z","0.2.7":"2026-08-24T13:14:22.775Z","0.2.8":"2026-08-24T17:38:55.060Z","0.2.9":"2026-08-25T05:11:58.134Z","0.2.10":"2026-08-25T11:17:42.379Z","0.2.11":"2026-08-25T12:16:20.430Z","0.2.12":"2026-09-07T02:37:42.748Z","0.2.13":"2026-09-07T03:57:02.001Z","0.2.14":"2026-09-07T04:55:35.969Z"},"bugs":{"url":"https://github.com/volter-ai/termfleet/issues"},"author":{"name":"Volter AI"},"license":"Apache-2.0","homepage":"https://github.com/volter-ai/termfleet#readme","keywords":["ai-agents","claude-code","cli","codex","developer-tools","gemini","llm","mcp","orchestration","terminal","tmux"],"repository":{"url":"git+https://github.com/volter-ai/termfleet.git","type":"git"},"description":"An ergonomic control center for AI terminal sessions (Claude Code, Codex, Gemini, Grok Build) across tools, projects, and hosts.","maintainers":[{"name":"aaronvolter","email":"aaron@volter.ai"}],"readme":"# termfleet\n\n**An ergonomic control center for the AI coding sessions you run — Claude Code,\nCodex, and Gemini — across tools, projects, and machines.**\n\ntermfleet is an orchestration layer over the agents *already running in your\nterminals*: one place to see which sessions need you and act on any of them by\nname, with a visual fleet canvas when you want it. It attaches to the real\nterminals on your host(s) — iTerm2, WezTerm, or a managed virtual-tmux server —\nand gives every session a durable identity you can **list, triage, read, reply\nto, wait on, continue, and close**, from a CLI built for an agent to drive, an\nSDK, or a browser console. It is *not* another \"spawn N isolated agents\" runner;\nit controls the agents you already have.\n\nCurrent direction: retire Termfleet by migrating its consumers to existing\nSupercode owners while preserving these capabilities. New shared functionality\nbelongs in those owners; Termfleet remains compatible until its consumers migrate.\nSee the [retirement roadmap](docs/ROADMAP.md#retirement-toward-supercode).\n\n## Quickstart (local, no Docker/registry/account)\n\n**Before you start**, install Node.js 20+ (runs the CLI) — that's the only\nrequirement for step 1 below. `tmux` and a logged-in agent CLI (`claude`,\n`codex`, or `gemini`) are only needed once you get to step 2, acting on a\nsession (the quickstart fails fast without them there — see\n[Troubleshooting](#troubleshooting)).\n\nInstall termfleet:\n\n```sh\nnpm install -g termfleet\ntermfleet doctor   # checks node/tmux and which provider would be auto-targeted\n```\n\n### 1. Triage the sessions you already have — no daemon, nothing running\n\nIf you've used Claude Code, Codex, or Gemini CLI on this machine before,\ntermfleet can already see those conversations without you starting anything:\n\n```sh\ntermfleet sessions recent --live --sort attention   # which sessions need you?\n```\n\nThis reads your transcripts straight off disk (`~/.claude/projects`,\n`~/.codex/sessions`, …) — no console, no provider process, no daemon. With no\nprovider running, `--live` explains rather than errors: rows come back with\n`live: \"unknown\"` plus a notice (\"no provider running — liveness unavailable;\nshowing durable sessions\") instead of a hard failure. This is the whole\nzero-server layer — the part that's useful even if you never touch anything\nelse in this Quickstart.\n\n### 2. Act on a session — start a provider\n\nReading is free; *acting* (reply, launch, continue) needs a provider — the\nprocess that actually owns a terminal for the session to run in. This is\nalso where `tmux` and a logged-in agent CLI become required:\n\n```sh\ntermfleet provider serve --kind virtual-tmux --prefix dev --count 0 --port 7402 &\n\n# the CLI auto-discovers the local provider you just started — no --url needed:\ntermfleet claude new --prompt \"hello\"               # launch a Claude session\ntermfleet sessions recent --live --sort attention   # rows are live now, not \"unknown\"\ntermfleet send --agent-session-id claude:<uuid> --text \"go on\" --enter\ntermfleet interrupt --agent-session-id claude:<uuid>\n```\n\n### 3. See it, and reach it remotely — the console (layer-1 upgrade)\n\nEverything above is the whole local experience with no browser involved. The\nconsole is an *upgrade* on top of it: a visual canvas over the same\nproviders, plus remote access via tunnel — not a separate system, and not\nrequired to triage or act on a session.\n\n```sh\ntermfleet console serve --name dev --port 7373 &\n```\n\nOpen <http://127.0.0.1:7373>: the console auto-discovers the local provider,\nso it renders as a \"machine\" on the canvas with your `hello` session running\ninside it. **Start order doesn't matter** — the console pulls this discovery\nitself (it reads the same `~/.termfleet/providers/` advertisement the CLI\ntrusts, on a 5s sweep), so running the provider before the console or the\nconsole before the provider both converge to the same board within a couple of\nseconds. (`termfleet --help` lists every command; `termfleet --version`\nprints the version; `termfleet doctor` diagnoses a stuck setup.)\n\n> **Power-user shortcut.** `termfleet ctl` collapses steps 2–3 (plus launching\n> an orchestrator chat) into one idempotent command, and its console\n> **tunnels by default** (pass `--no-tunnel` for local-only) — see\n> [Console + providers, in depth](#console--providers-in-depth) below. That's\n> a convenient default, not the recommended first thing to learn: the\n> zero-server `sessions` moment in step 1 is what every user needs, whether or\n> not they ever open a browser.\n\n> **Working from a clone (contributing)?** You don't need a global install —\n> run the CLI straight from source with `npx tsx src/cli.ts …` in place of\n> `termfleet …`:\n>\n> ```sh\n> git clone https://github.com/volter-ai/termfleet.git\n> cd termfleet && npm install && npm run build   # build powers the browser console UI\n> npx tsx src/cli.ts console serve --name dev --port 7373 &\n> ```\n\n## Concepts\n\n- **Console** — the UI + aggregator: serves the board, proxies providers, merges\n  the fleet across hosts. One per user.\n- **Provider** — a process that owns terminal windows on a host (iTerm2 mirror,\n  WezTerm, or virtual-tmux). The console talks to many.\n- **Session** — *the unit you actually work with*: a Claude/Codex/Gemini\n  conversation, addressed by `agentSessionId` — top-level `sessions`, `send`, and\n  `close`, plus per-agent `claude|codex|gemini get|wait|continue` — never by\n  hunting for a terminal id.\n\nSee `docs/ARCHITECTURE.md` for the layer thesis, the derive-don't-persist\nprinciple, and the trust/scale/compatibility policies behind these concepts.\n\n## What it's good at — and what it isn't\n\nThe edge is the **combination**: cross-host + cross-tool (Claude/Codex/Gemini) +\na visual canvas + optional team/org sharing, all through one session-first model.\nSingle-host triage of Claude sessions *alone* is also free in Claude Code's Agent\nView; termfleet's value is spanning **hosts, tools, and people**.\n\nPer-tool capability today:\n\n| tool | discover / read | launch (`new`) | `wait` / `get` | `continue` |\n|---|---|---|---|---|\n| Claude | ✅ | ✅ | ✅ | ✅ |\n| Codex | ✅ | ✅ (no caller-bound session id on a fresh launch) | ✅ | ✅ (`codex resume <uuid>`) |\n| Gemini | ✅ | ✅ | ✅ | ✖ (resumes by index, not id) |\n\n**Project status:** pre-1.0, moves fast, primarily one maintainer, heavily\nAI-assisted. The macOS native path (iTerm2 via `osascript`) is most-tested; the\nportable path is virtual-tmux/Docker; WezTerm-on-WSL is unvalidated. Providers\nrun real processes and serve host files — treat \"provider reachable\" as \"full\nhost access granted.\" Default is loopback-only; read `SECURITY.md` before\nexposing anything.\n\n## Requirements\n\n- **Minimum (local):** Node.js 20+ and `tmux` (`brew install tmux`).\n- **To launch agents:** the agent CLI you'll use — `claude`, `codex`, or `gemini` —\n  installed on PATH and **logged in**. The Quickstart's first `claude new` fails\n  after ~45s against a missing or not-logged-in CLI, so install and sign in first\n  (e.g. run `claude`, then `/login`).\n- **Optional, per feature:** Docker (Docker workers) · macOS + iTerm2 (iTerm\n  provider) · a deployed registry (team/remote — see below).\n\n## Troubleshooting\n\nRun `termfleet doctor` first — it reports `node`/`tmux`/`osascript`/`iTerm2`,\ninstalled agent-CLI/terminal-host versions against the tested baselines in\n[`docs/COMPATIBILITY.md`](docs/COMPATIBILITY.md) (warning, never failing, on a\nmismatch), the live local providers it found, and which provider a flagless\ncommand would target (and why). Most \"it didn't work\" cases are one of these:\n\n- **`claude new` fails after ~45s / \"startup hang\".** The agent CLI is missing\n  or not logged in. Run the agent once interactively (`claude`, then `/login`;\n  `codex`; `gemini`) so it's authenticated, then retry. termfleet treats \"no\n  transcript written within ~45s\" as a hang (`TERMFLEET_AGENT_SESSION_FIRST_WRITE_MS`).\n- **`provider serve --kind virtual-tmux` errors / no terminals appear.** `tmux`\n  isn't installed or isn't on PATH. Install it (`brew install tmux` /\n  `apt install tmux`); `termfleet doctor` should print `ok tmux`.\n- **A flagless command prints `no_provider`.** No live local provider was found.\n  Start one (`termfleet provider serve --kind virtual-tmux --count 1 --port 7402`),\n  or pass `--url`/`--provider`, or set `TERMFLEET_PROVIDER_URL`. Resolution errors\n  are emitted as JSON on stderr with a `remedy` field.\n- **A flagless command prints `ambiguous_provider`.** More than one local\n  provider is live. Pick one with `termfleet use <url>`, pass `--url`/`--provider`,\n  or set `TERMFLEET_PROVIDER_URL`. Run `termfleet resolve` to see the candidates.\n- **The console at `127.0.0.1:7373` is blank / shows no machine.** Confirm the\n  provider process is still running and healthy\n  (`termfleet providers health --url http://127.0.0.1:7402`), then reload the\n  page (a hard reload — the console serves a built bundle). Auto-discovery only\n  sees providers on the same host.\n- **`EADDRINUSE` on startup.** The port is already taken (often a stale console\n  or provider). Pick another `--port`, or stop the old process.\n- **Installed from a clone and the UI is broken.** From source you must build the\n  browser bundle once: `npm install && npm run build`. The published npm package\n  already ships the built console.\n\n`termfleet --help` (and `<command> --help`) lists every command; the\n[CLI Commands](#cli-commands) section below is the full reference.\n\n---\n\n## Team & remote (opt-in): Docker Worker, Registry, Tunnel\n\nThis is the recommended path for a new user who wants terminals in Docker,\nshared team discovery, and a dry run before handing the setup back to a human.\n\n> **The registry is opt-in.** With `TERMFLEET_REGISTRY_URL` unset, termfleet is\n> local-only and makes no outbound requests — that is the default experience (see\n> the local Quickstart above). The steps in this section apply only if you have\n> deployed and configured your own registry.\n>\n> **Deploy + seed it first** (the worker has no sign-up flow — accounts come from\n> seeded users set at deploy time). From `packages/registry-worker`:\n>\n> ```sh\n> npx wrangler secret put TERMFLEET_SEEDED_PASSWORD --env=\"\"   # required; no default\n> npx wrangler secret put TERMFLEET_SEEDED_USERS    --env=\"\"   # JSON array of your team's accounts\n> npx wrangler deploy --env=\"\"\n> ```\n>\n> See `packages/registry-worker/README.md` for the `TERMFLEET_SEEDED_USERS` shape.\n> Then point `TERMFLEET_REGISTRY_URL` at the deployed worker's `/providers`\n> endpoint, and sign in (step 3) as one of those seeded emails:\n>\n> ```text\n> TERMFLEET_REGISTRY_URL=https://your-registry.example.com/providers\n> ```\n\nThe Docker worker is still your machine's responsibility. The registry stores\nauth, organization membership, shared provider records, canvas layout/comments,\nand short-lived provider access tokens. It does not run Docker or tmux.\n\n### 1. Install\n\n```sh\ngit clone https://github.com/volter-ai/termfleet.git\ncd termfleet\nnpm install\nnpm run build\n```\n\nMake sure Docker is running before starting a Docker worker. If you use Colima,\nstart it first and export the Docker socket if your shell needs it:\n\n```sh\ncolima start\nexport DOCKER_HOST=\"unix://$HOME/.colima/default/docker.sock\"\n```\n\n### 2. Start A Local Console\n\nPersist the registry URL once, then start the console. The registry URL must be\nthe worker's `/providers` endpoint. Termfleet does not automatically read repo\n`.env` files; the durable source of truth is `~/.termfleet/settings.json`.\n\n```sh\nexport TERMFLEET_REGISTRY_URL=\"https://your-registry.example.com/providers\"\nnpx tsx src/cli.ts chat --save --agent none --providers none --no-open-console\n```\n\nConfirm it was saved:\n\n```sh\nnode -e 'console.log(require(\"node:fs\").readFileSync(`${process.env.HOME}/.termfleet/settings.json`, \"utf8\"))' \\\n  | grep registryUrl\n```\n\nNow every later `console serve` or `ctl` recovers that registry URL, even from a\nnew shell:\n\n```sh\nnpx tsx src/cli.ts console serve \\\n  --name local-console \\\n  --host 127.0.0.1 \\\n  --port 7373 \\\n  --local-adapters none\n```\n\nOpen:\n\n```text\nhttp://127.0.0.1:7373/?session=local-console#view=providers\n```\n\n### 3. Sign In To The Registry\n\nUse the browser sign-in flow or the CLI. The CLI stores its session in\n`~/.termfleet/registry-auth.json` and uses the same registry as the console.\n\n```sh\nnpx tsx src/cli.ts registry login \\\n  --identifier you@example.com \\\n  --password-stdin\n```\n\nConfirm the active user and organization:\n\n```sh\nnpx tsx src/cli.ts registry session\nnpx tsx src/cli.ts registry list\n```\n\n### 4. Start Your Docker Worker\n\nFrom the console UI, click `Start or register provider`, then `Start Docker\nworker`.\n\nThe same action is available from the CLI:\n\n```sh\nnpx tsx src/cli.ts registry start-docker-worker \\\n  --label \"My Docker Worker\"\n```\n\nThis builds/starts the Compose worker and registers\n`http://127.0.0.1:7374` with your local console. The worker runs as the\nunprivileged `termfleet` user, and created sessions start in `/workspace`.\n\nThe raw Docker provider URL is an API endpoint for the console and CLI. Do not\nexpect `http://127.0.0.1:7374/` to be the full app. Use the console at\n`http://127.0.0.1:7373/` to see and control it.\n\n### 5. Dry Run Locally\n\nUse the browser first. In Playwright or a normal browser:\n\n1. Open `http://127.0.0.1:7373/?session=local-console#view=providers`.\n2. Confirm `My Docker Worker` appears as connected.\n3. Confirm the canvas shows a `Virtual tmux Space`.\n4. Create or open a terminal, then type:\n\n```sh\nwhoami && pwd && touch /workspace/termfleet-dryrun-ok && ls /workspace/termfleet-dryrun-ok\n```\n\nExpected output includes:\n\n```text\ntermfleet\n/workspace\n/workspace/termfleet-dryrun-ok\n```\n\nThen verify the CLI can reach the same worker:\n\n```sh\nnpx tsx src/cli.ts providers health --url http://127.0.0.1:7374\nnpx tsx src/cli.ts providers snapshot --url http://127.0.0.1:7374\nnpx tsx src/cli.ts list --url http://127.0.0.1:7374\n```\n\nFor raw shell repair-only diagnostics, create a temporary shell and capture it:\n\n```sh\nnpx tsx src/cli.ts new --repair \\\n  --url http://127.0.0.1:7374 \\\n  --break-glass \\\n  --cwd /workspace \\\n  --command \"whoami && pwd\"\n```\n\nUse `capture` on the returned `terminalId` value.\n\n### 6. Log In Inside The Docker Worker\n\nThe Docker worker has isolated volumes for `/home/termfleet` and `/workspace`.\nCredentials for Claude Code, Codex, GitHub CLI, SSH, and workspace files live\ninside those Docker volumes, not on the host unless you explicitly mount them.\n\nUse the console terminal for interactive logins:\n\n```sh\nclaude /login\ncodex\ngh auth login\n```\n\nOr open a repair shell from the CLI when the UI is not enough:\n\n```sh\nnpx tsx src/cli.ts new --repair \\\n  --url http://127.0.0.1:7374 \\\n  --break-glass \\\n  --cwd /workspace \\\n  --command \"gh auth status\"\n```\n\nAfter login, prefer agent windows for normal work:\n\n```sh\nnpx tsx src/cli.ts claude new \\\n  --url http://127.0.0.1:7374 \\\n  --name claude-worker \\\n  --cwd /workspace \\\n  --prompt \"Inspect the workspace and report setup status.\"\n\nnpx tsx src/cli.ts codex new \\\n  --url http://127.0.0.1:7374 \\\n  --name codex-worker \\\n  --cwd /workspace \\\n  --prompt \"Inspect the workspace and report setup status.\"\n```\n\n### 7. Make Your Docker Worker Available To The Team\n\nPublic/shared providers must be authenticated. Start a provider that requires a\nregistry-issued provider token, expose it with an HTTPS tunnel, then register\nthe tunnel URL as a shared provider.\n\n> **Critical:** set `TERMFLEET_PROVIDER_PUBLIC_URL` to the provider's public\n> tunnel origin (the same URL you register below). That is what switches the\n> provider into **shared mode** — accepting only org-scoped provider tokens\n> minted for the owning org. *Without it,* a public provider falls back to\n> bare-session auth and any signed-in registry user of **any org** can reach it.\n> You must therefore decide your tunnel origin first (reserve the subdomain).\n\nStart an auth-required Docker provider on a local port (replace the public URL\nwith your reserved tunnel origin):\n\n```sh\ndocker run --rm \\\n  --name termfleet-team-worker \\\n  -p 127.0.0.1:7374:7373 \\\n  -e TERMFLEET_AUTH_REGISTRY_URL=https://your-registry.example.com \\\n  -e TERMFLEET_ALLOWED_ORIGINS=https://your-registry.example.com \\\n  -e TERMFLEET_PROVIDER_PUBLIC_URL=https://YOUR-TUNNEL-SUBDOMAIN.your-tunnel-host.example.com \\\n  termfleet:local \\\n  node /app/dist/cli.js provider serve \\\n    --kind virtual-tmux \\\n    --host 0.0.0.0 \\\n    --port 7373 \\\n    --prefix termfleet-docker \\\n    --count 0 \\\n    --cwd /workspace \\\n    --tunnel\n```\n\nExpose `127.0.0.1:7374` through any HTTPS tunnel. For most users a standalone\ntunnel like `ngrok` or `cloudflared` is the simplest option:\n\n```sh\nngrok http 7374\n```\n\nIf you run your own tunnel relay instead, point `TERMFLEET_LOCAL_TUNNEL_BIN` at\nyour own tunnel client binary and set `TERMFLEET_TUNNEL_SERVER_URL` to the relay\nURL (the `--tunnel` flag then spawns that client for you). Whatever client you\nuse, it must forward to the provider port and not add its own auth gate here; the\nTermfleet provider\nis already enforcing registry-issued provider tokens because it was started\nwith `--tunnel`.\n\nRegister the HTTPS tunnel URL in the active registry organization:\n\n```sh\nnpx tsx src/cli.ts registry register-shared \\\n  --url https://YOUR-TUNNEL-SUBDOMAIN.your-tunnel-host.example.com \\\n  --label \"Your Name Docker Worker\" \\\n  --requires-auth\n```\n\nTeam members in the same active organization will see it under Shared\nProviders in the cloud console and any local console using the same\nregistry.\n\n### 8. Use It Remotely\n\nOpen the cloud console from another machine:\n\n```text\nhttps://your-registry.example.com#view=providers\n```\n\nSign in, confirm the shared provider is connected, then use the canvas normally.\n\nThe CLI can also use shared providers by name after login:\n\n```sh\nnpx tsx src/cli.ts registry login --identifier you@example.com --password-stdin\nnpx tsx src/cli.ts providers snapshot --provider \"Your Name Docker Worker\"\nnpx tsx src/cli.ts claude new \\\n  --provider \"Your Name Docker Worker\" \\\n  --cwd /workspace \\\n  --prompt \"Confirm this remote Docker worker is usable.\"\n```\n\nRemove a shared provider when the tunnel or worker is no longer meant to be\navailable:\n\n```sh\nnpx tsx src/cli.ts registry unregister-shared \\\n  --url https://YOUR-TUNNEL-SUBDOMAIN.your-tunnel-host.example.com\n```\n\n## Feature Guide\n\nTermfleet exposes the same provider features through the browser console, CLI,\nand SDK.\n\n- Providers: start local virtual tmux, Docker, iTerm, or WezTerm providers;\n  register local URLs; register shared team URLs; remove stale providers.\n- Canvas: pan, zoom, fit view, inspect provider groups, and arrange terminal\n  windows.\n- Terminal windows: create agent windows, move/resize windows, close windows,\n  capture output, and send input.\n- Agents: launch Claude Code, Codex, or Gemini in provider-owned terminals and\n  read structured session state with `claude get`, `codex get`, `gemini get`, and\n  `wait`.\n- Files: read, write, stat, and copy files through provider filesystems.\n- Folders/files: open folder and file views on the provider canvas.\n- Iframes: open an HTTP app or preview URL on the provider canvas.\n- Multiplayer: registry-backed canvas layout, comments, presence, cursors,\n  viewport, and selection sync are scoped to the active organization.\n- Security: shared public providers should use provider auth (`--tunnel` plus\n  shared registration with `--requires-auth`); raw terminal shells are\n  repair-only with `--break-glass`.\n\n### Assignment execution boundaries (macOS and Linux)\n\nPolicy clients can request a time-bounded, default-deny network boundary on an\nagent launch. Providers refuse that request unless a trusted adapter is\ninstalled; older or unconfigured providers never silently launch it without\nthe boundary.\n\n```sh\nnpm run build\nsudo ./dist/execution-boundary-install.js\nexport TERMFLEET_EXECUTION_BOUNDARY_BIN=/usr/local/libexec/termfleet-execution-boundary\ntermfleet provider serve --kind virtual-tmux --count 0 --port 7402\n```\n\nThe bundled adapter uses macOS Seatbelt or Linux Bubblewrap (`bubblewrap` must\nbe installed before running the installer). On Linux the installer creates a\nroot-owned private setuid Bubblewrap copy so the boundary works when the host\ndisables unprivileged user namespaces; that launcher is not mounted into the\nexecutor filesystem. Direct networking is denied and\napproved host/port pairs pass only through its filtering HTTP/CONNECT proxy;\nmacOS may reach an exact approved loopback port directly, while Linux crosses\nthe isolated network namespace through the filter's Unix-socket bridge. The\nsame policy denies declared filesystem roots, makes staged input roots\nread-only, and denies writes outside the exact declared workspace, output, and\nprivate runtime roots. The helper allows reads only from trusted system\nruntimes and the exact declared inputs, workspace, output, and private runtime;\ngives the executor a fresh `HOME` and `TMPDIR`; uses a trusted system `PATH`;\nand isolates host IPC. Trusted workspace preparation runs before the executor\nenters the boundary. The provider advertises\n`capabilities.executionBoundary: \"external-adapter-v1\"` only while this adapter\nis configured. The adapter file must be absolute, root-owned, executable, and\nnot group- or world-writable.\n\n## Cooperative Hook (Opt-In)\n\nTermfleet triages agent state by watching from the outside — screen content,\ntranscript files, process trees. That works well but is inherently a guess.\nIf you use Claude Code, you can optionally add a small hook so termfleet\nlearns turn boundaries directly from Claude Code itself instead of inferring\nthem — the highest-confidence signal in the evidence ladder\n(`source: \"cooperative\"`). See `docs/architecture/cooperative-hook.md` for the\nfull design rationale (why it's engineered to be perfectly safe to skip).\n\n**This is entirely optional.** Termfleet never installs it for you, never\nedits any of your Claude Code config files, and behaves identically whether\nyou install it or not.\n\n### Install\n\nAdd this to your Claude Code hooks config — per-project\n`.claude/settings.local.json` is recommended (personal, not checked into git);\n`~/.claude/settings.json` works too if you want it for every project:\n\n```json\n{\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"termfleet cooperative-signal\" }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"termfleet cooperative-signal\" }\n        ]\n      }\n    ]\n  }\n}\n```\n\nIf the file already has a `hooks` key (or a `UserPromptSubmit`/`Stop` key\nunder it), merge these entries in rather than replacing the file — don't\ndelete hooks you already have configured for something else.\n\nThat's it. The next Claude Code session started (or resumed) after you save\nthe file will pick up the hook. No termfleet restart is needed; no other\nconfig changes are required. If `termfleet` isn't on your `PATH`, use the\nabsolute path to it in `\"command\"` instead.\n\n### Verify It's Working\n\n```sh\ntermfleet sessions recent --live --sort attention | grep -A2 '\"attention\"'\n```\n\nA session termfleet is currently observing that hook for shows\n`\"source\": \"cooperative\"` inside its `attention` field (`{value, source,\nconfidence}`). If you don't see it, confirm a provider is running and\nreachable (`termfleet resolve`) — the hook posts to whichever provider\n`$TERMFLEET_PROVIDER_URL`/auto-discovery resolves to, same as any other\n`termfleet` command.\n\n### Uninstall\n\nRemove the `UserPromptSubmit`/`Stop` entries you added from your hooks config\n(or delete the whole file if `cooperative-signal` was the only thing in it) —\nthat's the entire uninstall. There is nothing else to clean up: termfleet\nstores cooperative signals in memory only (never on disk, never in your\nproject), so removing the hook is instantly and permanently as if it was never\ninstalled. The very next observe pass for any session that hook was covering\nfalls back to the next evidence rung (transcript/process-tree/screen\nheuristics) automatically — no restart, no flag to flip.\n\n## Provider Model\n\n```text\nConsole / CLI\n  -> ProviderClient SDK\n    -> Provider Instance URL\n      -> ProviderEngine\n        -> ItermDriver, VirtualTmuxDriver, or WeztermDriver\n          -> iTerm, tmux virtual display, or WezTerm terminals\n```\n\nThe console server owns the browser UI, registry/auth, and local provider\nmaterialization. Provider servers own terminal/window/display state only. The CLI\nuses the same `ProviderClient` SDK as the console for provider operations, so it\ndoes not need the console server for normal provider control.\n\n## Console + providers, in depth\n\nA deeper look at the local setup the [Quickstart](#quickstart-local-nodockerregistryaccount)\ncovers: run the console on your computer, start one or more provider servers, then\ndrive them from the console or CLI. No registry and no tunnel are required — leave\n`TERMFLEET_REGISTRY_URL` unset and termfleet makes no outbound requests. Locally the\nconsole **auto-discovers** running providers (and the CLI auto-resolves a target),\nso explicit registration is optional — the SDK/CLI registration shown below is for\nwhen you want to register a provider *explicitly* or by a remote URL.\n\n> The numbered walkthrough below runs from a clone (`npx tsx src/cli.ts …`); with\n> a global install, substitute `termfleet …` (no `npm install`/`npm run build`).\n\nFor the fastest path into a ready control session, use the idempotent `ctl`\ncommand (the front door):\n\n```sh\ntermfleet ctl\n```\n\n`ctl` ensures the local console is running (**tunneled by default** — pass\n`--no-tunnel` for a local-only console), ensures the configured local providers\nexist, then reuses or starts the orchestrator chat in your fleet-control folder\nand attaches you to it. Flags override saved settings for one run; add `--save`\nto make those choices the new default:\n\n```sh\ntermfleet ctl --cwd ~/fleet-control --save\ntermfleet ctl --no-tunnel\n```\n\n> **`termfleet chat` is deprecated** — use `ctl`. `chat` still works (and stays\n> the home of agentless boot `--agent none`, an arbitrary `--cwd`, and\n> JSON-report-by-default scripting), but every run prints a deprecation notice:\n>\n> ```sh\n> termfleet chat --agent none --providers virtual-tmux --no-open-console  # agentless fleet boot\n> ```\n\n1. Start the console:\n\n```sh\nnpm install\nnpm run build\nnpx tsx src/cli.ts console serve --name local-console --host 127.0.0.1 --port 7373\n```\n\n2. Start a provider server:\n\n```sh\nnpx tsx src/cli.ts provider serve --kind virtual-tmux --prefix termfleet-virtual --count 2 --host 127.0.0.1 --port 7376\n```\n\nOn a shared development host, cap admitted agents at both the provider and\nwhole-machine levels, reserve disk/memory headroom, and route regenerable build\nand scratch data to a roomier disk. Configured roots must already exist and be\nabsolute; a missing/unmounted disk fails before Termfleet acquires a window.\n\n```sh\nmkdir -p /Volumes/BuildSSD/termfleet-admission /Volumes/BuildSSD/termfleet-cargo /Volumes/BuildSSD/termfleet-tmp\nTERMFLEET_BUILD_JOBS=3 \\\nTERMFLEET_CARGO_TARGET_ROOT=/Volumes/BuildSSD/termfleet-cargo \\\nTERMFLEET_HOST_ADMISSION_ROOT=/Volumes/BuildSSD/termfleet-admission \\\nTERMFLEET_MAX_ACTIVE_AGENTS=2 \\\nTERMFLEET_MAX_HOST_ACTIVE_AGENTS=6 \\\nTERMFLEET_MIN_HOST_DISK_FREE_GB=25 \\\nTERMFLEET_MIN_HOST_MEMORY_FREE_PERCENT=20 \\\nTERMFLEET_SESSION_TMP_ROOT=/Volumes/BuildSSD/termfleet-tmp \\\nTERMFLEET_VGAI_TEST_WORKERS=4 \\\nTERMFLEET_VGAI_TYPECHECK_CONCURRENCY=2 \\\n  npx tsx src/cli.ts provider serve --kind virtual-tmux --prefix termfleet-virtual --count 2 --host 127.0.0.1 --port 7376\n```\n\nThe machine-wide lock serializes agent startup across local providers, then\ncounts recognized agent processes before admitting the next one. Managed\nscratch directories carry ownership metadata and are marked closed when their\nwindow closes. Closed directories and crash remnants can be reviewed and\nremoved conservatively; dry-run is the default and dirty Git worktrees are\nalways kept.\n\n```sh\nTERMFLEET_SESSION_TMP_ROOT=/Volumes/BuildSSD/termfleet-tmp npm run cleanup:scratch\nTERMFLEET_SESSION_TMP_ROOT=/Volumes/BuildSSD/termfleet-tmp npm run cleanup:scratch -- --apply\n```\n\n3. *(Optional — local providers are auto-discovered.)* To register a provider\n   with the console explicitly (e.g. a remote URL), use the SDK:\n\n```ts\nimport { ProviderClient, providerRefFromUrl } from \"termfleet\";\n\nconst consoleClient = new ProviderClient(providerRefFromUrl(\"http://127.0.0.1:7373\", \"Local console\"));\n\nconst provider = await consoleClient.registerLocalProvider({\n  baseUrl: \"http://127.0.0.1:7376\",\n  label: \"Virtual tmux\"\n});\n\nconsole.log({ provider });\nconsoleClient.disconnect();\n```\n\nThe console can also materialize local providers itself through\n`startLocalProvider`. Docker workers use the same provider protocol: the\ncontainer runs a virtual tmux provider and the console registers that provider\nURL.\n\n4. Expose a provider with a tunnel before registering a shared URL:\n\n```sh\nngrok http 7376\n```\n\nUse any tunnel or LAN URL that other users can reach. Keep both the provider and\ntunnel running while the provider is shared. Providers are unauthenticated by\ndefault; mark a provider as auth-required when its own `--tunnel` mode exposes\nit publicly.\n\n5. The CLI exposes the same SDK path as a convenience wrapper:\n\n```sh\nnpx tsx src/cli.ts registry login --identifier you@example.com --password-stdin\nnpx tsx src/cli.ts registry start-docker-worker\nnpx tsx src/cli.ts registry register-shared \\\n  --url https://your-provider-tunnel.example.com \\\n  --alias your-worker \\\n  --label \"Your Name Provider\" \\\n  --requires-auth\n```\n\nThe CLI stores its registry session token in `~/.termfleet/registry-auth.json`.\nThe console also uses this token for registry reads when the browser has not\nsupplied its own signed-in session.\n\n6. Open the console:\n\n```sh\nopen http://127.0.0.1:7373/\n```\n\nThe console starts local iTerm and WezTerm adapters by default, so they appear\nunder Console-Managed Providers when their backing terminal apps are available.\nVirtual tmux, Docker worker, and shared providers appear in their own sidebar\ngroups after they are started or registered.\n\n## WezTerm on WSL/Windows (experimental)\n\nOn WSL/Windows the WezTerm provider is the native-terminal candidate. It's\nimplemented and smoke-tested on macOS but **not yet validated on a real WSL\nmachine** — keep the virtual-tmux provider as the WSL fallback until it is.\n\nTo try it: install WezTerm on Windows, use a WSL distro with `node`/`npm`/`tmux`\nand the termfleet checkout, and confirm `wezterm.exe` and `powershell.exe` are\nvisible from WSL (it drives the terminal via `wezterm.exe` and Win32 window\npositioning via `powershell.exe`). Then:\n\n```sh\nnpx tsx src/cli.ts provider serve --kind wezterm --prefix wsl-wezterm --count 1 --host 0.0.0.0 --port 7377\n```\n\n`http://localhost:7377/healthz` should return `\"provider\":\"wezterm\"`. If\nenumeration or window positioning misbehaves from WSL, that's the unvalidated\npath — please file an issue (see CONTRIBUTING).\n\n## Start A Provider\n\nA provider owns terminal windows on a host. Run one on its own port (distinct\nfrom the console's):\n\n```sh\ntermfleet provider serve --kind virtual-tmux --prefix agent-a --count 2 --host 127.0.0.1 --port 7402\n```\n\nOpen the provider canvas, or control it entirely from the CLI:\n\n```sh\nopen http://127.0.0.1:7402/\ntermfleet providers health   --url http://127.0.0.1:7402\ntermfleet providers snapshot --url http://127.0.0.1:7402\n```\n\n## Run The Console\n\nRun a console when you want to see the Termfleet app in the browser and load\nproviders from the local pool and shared registry.\n\n```sh\ntermfleet console serve --name local-console --host 127.0.0.1 --port 7373\n```\n\nOpen the app:\n\n```sh\nopen http://127.0.0.1:7373/\n```\n\nThe console automatically loads providers from `.termfleet-registry.json` and,\nwhen `TERMFLEET_REGISTRY_URL` is set, from the shared registry (it is opt-in;\nwithout that env var the console stays local-only). The Providers sidebar can\nregister any reachable URL\nthat implements the provider API. Provider names shown in the sidebar come from\nthe registry's `label` field.\n\nThe sidebar can also start additional local providers for you. `Start virtual\ntmux` and `Start Docker worker` add those provider URLs to the console runtime\nprovider list. They do not need to be written to `.termfleet-registry.json`\nbecause the console process owns those materialized providers directly. The local\niTerm provider is on by default.\n\n## Start The Docker Worker\n\nUse the Docker worker when you want Termfleet terminals to run inside a Docker\ncontainer. The container exposes a normal virtual tmux provider endpoint to the\nconsole or CLI.\n\n1. Clone and install the project:\n\n```sh\ngit clone https://github.com/volter-ai/termfleet.git\ncd termfleet\nnpm install\n```\n\n2. Start the Docker worker with Compose:\n\n```sh\ndocker compose up --build\n```\n\nCompose publishes the provider at `http://127.0.0.1:7374`. The provider itself\nlistens on port `7373` inside the container.\n\n3. Open the provider canvas:\n\n```sh\nopen http://127.0.0.1:7374/\n```\n\nThe Docker worker's virtual tmux provider should render its terminal windows in\nthe browser.\n\nTo see the worker provider from a separate console, keep this Docker process\nrunning and register its reachable URL from the console's Providers sidebar.\n\nTo run without Compose:\n\n```sh\nnpm run docker:build\ndocker run --rm \\\n  -p 127.0.0.1:7374:7373 \\\n  termfleet:local\n```\n\nBy default the worker provider starts with no panels. Panels are created\nexplicitly with `claude new`, `codex new`, `folder open`, or repair commands.\nTo seed initial terminal panels for debugging or to change the prefix, run the\nprovider CLI directly in the built image:\n\n```sh\ndocker run --rm \\\n  -p 127.0.0.1:7374:7373 \\\n  termfleet:local \\\n  node dist/cli.js provider serve --kind virtual-tmux \\\n    --host 0.0.0.0 \\\n    --port 7373 \\\n    --prefix my-docker-worker \\\n    --count 2\n```\n\n### Bundled Agent CLIs\n\nThe Docker image ships with agent tooling so the terminals inside the worker are\nready to drive: the GitHub CLI (`gh`), Claude Code\n(`@anthropic-ai/claude-code`), and Codex (`@openai/codex`). The Gemini CLI is\n**not** bundled — install it in the worker (or a derived image) if you want\n`gemini new` there. The binaries are installed in the image; credentials live in\nthe container filesystem or mounted home directory supplied when the worker is\ncreated.\n\nThe `termfleet:local` image does not include or mount local machine agent credentials.\nEach Docker worker gets its own Compose-project-scoped Docker volumes for\n`/home/termfleet` and `/workspace`, so Claude, Codex, GitHub CLI, SSH config,\nand workspace files are isolated per worker. Run `claude /login`, `codex`, or\n`gh auth login` inside the worker that should own those credentials.\n\n## Create Another Docker Worker\n\nThe `Start Docker worker` button starts the default worker at\n`http://127.0.0.1:7374`. To run another worker provider at a different local\nport, build the image and run a second container:\n\n```sh\nnpm run docker:build\ndocker run --rm \\\n  -p 127.0.0.1:7405:7373 \\\n  termfleet:local \\\n  node dist/cli.js provider serve --kind virtual-tmux \\\n    --host 0.0.0.0 \\\n    --port 7373 \\\n    --prefix termfleet-docker-7405 \\\n    --count 2\n```\n\nThis creates another Docker worker provider at `http://127.0.0.1:7405`. To make it\navailable through the app, create a tunnel for port `7405` and register that\ntunnel URL.\n\n## Tunnel And Register A Provider\n\nTo share a provider with the team, expose its local port through a tunnel and\nregister the tunnel URL under Shared Providers.\n\nFor the default Docker worker provider:\n\n```sh\nngrok http 7374\n```\n\nFor an additional worker provider running on port `7405`:\n\n```sh\nngrok http 7405\n```\n\nCopy the HTTPS forwarding URL from the tunnel output, then open the console\nat `http://127.0.0.1:7373/` and register it in the Providers sidebar:\n\n- Section: Shared Providers\n- Name: a useful team-visible name, such as `Alice Worker`\n- URL: the tunnel HTTPS URL\n- Click `Register`\n\nRegistered tunnel URLs are written to the shared registry. The tunnel process\nand provider process both need to stay running while the team uses that\nprovider.\n\n## Add It To The Registered Pool\n\nA Termfleet console loads runtime local providers, console-local saved\nproviders, and shared remote providers. Runtime local providers are the iTerm\nand WezTerm adapters started by the console process; they appear in the provider\nlist while that console process is running and do not need to be saved to\n`.termfleet-registry.json`. Manually added local providers can still be stored\nin `.termfleet-registry.json`. Remote providers are read from and written to the\nshared registry URL you configure via `TERMFLEET_REGISTRY_URL`:\n\n```text\nhttps://your-registry.example.com/providers\n```\n\nThe registry is opt-in: with `TERMFLEET_REGISTRY_URL` unset, termfleet is\nlocal-only and never contacts a remote registry. Set it to point every user at\nthe same persistent remote pool — deploy your own registry worker from\n`packages/registry-worker`. The registry must return either an array of provider\nrecords or an object with a `providers` array. Each provider needs a reachable\n`baseUrl`; `label` is optional but recommended.\n\nA deployed registry worker is the normal team registry. Only run a local registry\nwhen developing the registry service itself:\n\n```sh\nnpx tsx src/cli.ts serve-registry \\\n  --host 127.0.0.1 \\\n  --port 7401 \\\n  --file .termfleet-remote-registry.json\n```\n\nIf you deliberately expose that local development registry, point any HTTPS\ntunnel at port `7401` with its own auth gate disabled so the registry service can\nhandle `/auth/*` and `/providers` authentication itself:\n\n```sh\nngrok http 7401\n```\n\n(`ngrok` and `cloudflared` are the simplest standalone tunnels. To use a\nself-hosted relay instead, set `TERMFLEET_LOCAL_TUNNEL_BIN` to your own tunnel\nclient binary and `TERMFLEET_TUNNEL_SERVER_URL` to the relay URL.)\n\nKeep both the registry server and the tunnel process running.\nThe remote registry file should contain only remote or tunnel URLs, not\nlocalhost providers.\n\nOpen the console at `http://127.0.0.1:7373/` and use the Providers sidebar.\nThe sidebar groups providers by role:\n\n- Console-Managed Providers: console-started iTerm and WezTerm adapters.\n- Virtual Servers: local virtual tmux providers.\n- Docker Workers: Docker-hosted virtual tmux providers.\n- Shared Providers: remote provider URLs from the shared registry.\n\nYou only need a reachable provider URL; the person running the provider does not\nhave to be the same person who registers it.\n\n- Name: `Worker Provider` or any display name you want.\n- URL: a tunnel URL for your provider or someone else's provider.\n- Requires auth: enable this only when the provider URL points at a\n  `termfleet provider serve --tunnel` instance.\n- Click `Register` in the Shared Providers form.\n\nThe local iTerm and WezTerm start buttons materialize default loopback URLs into\nthe console runtime provider list only. The register form writes tunnel URLs to\nthe shared registry. Refreshing the console will load persisted local virtual\ntmux, Docker worker, and shared provider URLs from `/api/registry/providers`.\n\nTermfleet uses one configured remote registry service with organization-scoped\nprovider records. Switching the active organization changes which shared\nproviders you see and manage. Removing a local provider deletes only this\nconsole's local registry entry. Unregistering a shared provider deletes that\nprovider from the active organization's shared registry so other org members\nstop seeing it.\n\nExample shared registry response:\n\n```json\n{\n  \"providers\": [\n    {\n      \"baseUrl\": \"http://127.0.0.1:7374\",\n      \"label\": \"Docker Worker\"\n    }\n  ]\n}\n```\n\nUse a URL that the intended console or CLI client can reach. A local console can register\n`http://127.0.0.1:7374` into its local pool. To share the same provider with\nother users, register a LAN hostname or tunnel URL so their machines can reach\nit.\n\nTo use a different registry, start the console with `TERMFLEET_REGISTRY_URL`\npointed at that registry endpoint:\n\n```sh\nTERMFLEET_REGISTRY_URL=\"https://registry.example.com/providers\" \\\n  npx tsx src/cli.ts console serve --name local-console --port 7373\n```\n\nOpen the console and it will automatically connect to every local provider\nplus every provider returned by the remote registry:\n\n```sh\nopen http://127.0.0.1:7373/\n```\n\nUse the Providers sidebar to verify what the console sees.\n\n## Small Public Deployment\n\nFor a small public deployment, expose the console through tunnel mode instead of\npublishing the raw Termfleet port:\n\n```sh\nTERMFLEET_CONSOLE_TOKEN=\"a-strong-random-secret\" \\\nTERMFLEET_ALLOWED_ORIGINS=\"https://your-console-tunnel.example.com\" \\\nTERMFLEET_CONSOLE_ALLOWED_ORGS=\"org_your_org\" \\\n  npx tsx src/cli.ts console serve --name public-console --port 7373 --tunnel --tunnel-id your-stable-console-id\n```\n\n> **A tunnel always has an auth backend — it never serves the fleet\n> unauthenticated.** The backend resolves by precedence: `TERMFLEET_CONSOLE_TOKEN`\n> (a strong operator secret) → a configured registry (user accounts) → else the\n> console auto-provisions a **6-digit access passcode** and prints it at startup\n> (`ctl`/`chat` print it too). The passcode is a rate-limited login factor exchanged at\n> `/console-login` — fine for personal use, but set `TERMFLEET_CONSOLE_TOKEN` (or\n> use a registry) for anything shared or long-lived, where a strong secret beats a\n> 6-digit code. Loopback access is always exempt; only remote/tunnel peers are\n> gated. If a passcode leaks, run `termfleet console rotate-passcode` and restart\n> the console.\n\n### Tunnel client setup\n\nThe ordinary workflow is in the console frontend. Open **Remote access** in the\nbottom status bar for the quick QR handoff, or **Settings → Remote Access** for\nthe full controls. Start, stop, and switch providers live:\n\n- **Automatic** prefers a configured stable relay, then a zero-account\n  Cloudflare Quick Tunnel, then an already-configured ngrok installation.\n- **Cloudflare** needs `cloudflared` on `PATH`; Quick Tunnels need no account and\n  return a temporary URL.\n- **ngrok** is offered only when `ngrok config check` succeeds. Termfleet never\n  starts an interactive sign-in flow for it.\n- **Stable relay** uses `TERMFLEET_TUNNEL_SERVER_URL` and preserves its URL across\n  restarts.\n\nOnce connected, scan the locally generated QR code and enter the displayed\n6-digit access code on the phone. The code is surfaced only to the local owner;\nthe public URL remains protected by the rate-limited passcode exchange. Runtime\nchoices persist in `~/.termfleet/settings.json`.\n\n`--tunnel` remains the automation/startup form and uses the persisted provider.\n`--no-tunnel` starts local-only; remote access can still be enabled later from\nthe local frontend without restarting the console.\n\nFor a custom stable relay client, point `TERMFLEET_LOCAL_TUNNEL_BIN` at your own\ncompatible binary and set `TERMFLEET_TUNNEL_SERVER_URL` to its relay URL.\n\nIf your client isn't a directly executable file — for example a script entry the\nshell can't run as-is — wrap it in a small launcher and point\n`TERMFLEET_LOCAL_TUNNEL_BIN` at the launcher:\n\n```sh\nmkdir -p ~/.termfleet/bin\ncat > ~/.termfleet/bin/my-tunnel <<'SH'\n#!/bin/sh\nexec /path/to/your/tunnel-client \"$@\"\nSH\nchmod +x ~/.termfleet/bin/my-tunnel\nexport TERMFLEET_LOCAL_TUNNEL_BIN=\"$HOME/.termfleet/bin/my-tunnel\"\nexport TERMFLEET_TUNNEL_SERVER_URL=\"https://your-relay.example.com\"\n```\n\nThese two values (plus `TERMFLEET_REGISTRY_URL`) are **persisted**: run\n`termfleet ctl --save` once from a shell that has them set, and every later\n`console serve`/`ctl` recovers them from `~/.termfleet/settings.json`. Registry\nconfiguration remains available for shared-provider discovery, but a personal\nQR handoff uses the local access code and does not require a registry account.\n\nKeep provider and Docker ports bound to `127.0.0.1`. If you run the registry on\na public interface, set `TERMFLEET_SEEDED_PASSWORD` and\n`TERMFLEET_REGISTRY_ALLOWED_ORIGINS` explicitly; the registry refuses public\nstartup with the default seeded password.\n\n## AI Agent Workflow\n\ntermfleet is built to be driven by an AI orchestrator, and the model is\n**session-first**: you discover, read, and act on sessions by `agentSessionId` —\nyou almost never name a terminal or window. (For browser-terminal validation,\nrun the agent CLIs in their interactive TUI mode; don't use non-interactive\nshortcuts like `claude -p` / `codex exec`, which prove a different execution path\nthan a user driving the terminal through termfleet.)\n\n**1. Triage — which sessions need you?**\n\n```sh\ntermfleet sessions recent --live --sort attention   # the attention / triage view\ntermfleet sessions search --query \"deploy\"           # find a session by content\n```\n\nOne list across every provider, sorted by which sessions are waiting on you.\n\n**2. Read a session — by id, with a since-cursor for deltas:**\n\n```sh\ntermfleet claude get --agent-session-id claude:<uuid> --cwd /workspace\ntermfleet claude get --agent-session-id claude:<uuid> --since 12   # only items after #12\n```\n\nOr block until the session finishes its current turn — the primitive you build\nloops on:\n\n```sh\ntermfleet claude wait --agent-session-id claude:<uuid> --after-count 5 --timeout-ms 600000\n```\n\n`--after-count N` waits for a turn *after* the Nth message, so a `wait` issued\nright after a `send` returns the new reply, not the one already there.\n\n**3. Act on a session — reply or close, keyed by id:**\n\n```sh\ntermfleet send         --agent-session-id claude:<uuid> --text \"run the tests\" --enter\ntermfleet sessions set --agent-session-id claude:<uuid> --name \"Auth refactor\"\ntermfleet close        --agent-session-id claude:<uuid>\n```\n\ntermfleet resolves session → window → terminal internally; you never supply a\n`terminalId`.\n\nSDK schedulers can call\n`ProviderClient.prepareSessionContext(agentSessionId, { cwd })` before starting\nanother turn. Termfleet chooses the installed agent's context-preparation\ncommand, proves the result through its normalized transcript, and waits for the\nprovider's semantic `session_waiting` state. If the session is active, the\noperation returns `status: \"deferred\"` without writing input. The lower-level\n`sendToSession(..., { ifIdleOnly: true })` exposes the same provider-side\ncompare-and-act boundary for the following instruction.\n\n`sessions set` sets a session's **display name** — the patch-shaped edit seam\nshared by the CLI, the SDK (`ProviderClient.updateSession`), MCP\n(`update_session`), and the HTTP API (`PATCH /api/agents/<agent>/sessions/<id>`).\nThe name is stored durably (session-keyed, so it outlives the session) and shows\nin the console as both the panel name and the durable session-list row,\noverriding the auto-derived title. Pass `--name \"\"` to clear it. `--id WINDOW_ID`\n/ `--terminal-id ID` are accepted as break-glass, resolved to their live session.\n\n**4. Launch or resume:**\n\n```sh\ntermfleet claude new --cwd /workspace --prompt \"Inspect this repo and report before editing.\"\ntermfleet codex  new --cwd /workspace --name todo-codex\ntermfleet claude continue --agent-session-id claude:<uuid>   # resume an ended Claude session\n```\n\n`claude new` starts Claude Code with an explicit `--session-id` and prints it as\nthe `agentSessionId` (pass `--agent-session-id ID` to choose it). Codex does not\naccept a launch-bound id, so `codex new` reconciles the UUID from the exact\nlaunched process's rollout and returns the durable `agentSessionId` on the same\nwindow. `codex continue --agent-session-id <uuid>` resumes that conversation via\n`codex resume <uuid>`, with the same already-live duplicate guard as Claude.\n`continue` remains unsupported only for Gemini (resumes by index, not uuid).\nThe CLI is biased toward reuse —\n`new` refuses to add a panel when a reusable one exists and prints its capture so\nyou can decide where to send next. `--cwd` is passed to the provider at creation\ntime and must exist in the new terminal environment (for Docker workers,\n`/workspace` is the container filesystem).\n\nFor multiple machines, target a provider with `--provider <alias>` / `--url <url>`\n(localhost, a remote host, or a tunnel URL); with no target the CLI auto-resolves\na local one. Auth stays off unless the provider record sets `requiresAuth`.\n\n### Break-glass: terminals and windows (plumbing)\n\nBelow the session layer is the raw transport — terminals and board windows. You\nshould rarely touch it; these verbs name a `terminalId` / window id directly and\nexist for diagnosis and repair:\n\n```sh\ntermfleet list --url <url>                                   # board windows\ntermfleet capture --url <url> --terminal-id <id> --lines 40  # raw pane capture\ntermfleet send --url <url> --terminal-id <id> --break-glass --text \"pwd\" --enter  # --break-glass required for a non-agent shell\ntermfleet terminals move --url <url> --id 1 --left 80 --top 80 --width 900 --height 520\ntermfleet close --url <url> --id 1                           # by window id\n\n# raw shell creation — repair-only, when Claude/Codex can't start or the provider needs diagnosis:\ntermfleet new --repair --url <url> --break-glass --cwd /workspace --command \"gh auth status\"\n```\n\n## MCP server\n\nThe same session-first control verbs the CLI exposes are also available over MCP,\nso any MCP-capable agent (Claude Code, Claude Desktop, or your own host) can drive\nthe fleet — list sessions, read a transcript, reply, launch, continue, and close —\nwithout shelling out. The `termfleet-mcp` bin is a stdio MCP server and a thin\nclient of the same provider resolution the CLI uses (`TERMFLEET_PROVIDER_URL` →\n`termfleet use` context → live local discovery), so it adds no new behavior, just a\nsecond front door.\n\nTools: `list_sessions`, `get_session` (supports `since` for catch-up and `cwd` to\nresolve some transcripts), `send_to_session`, `new_session` (accepts `cwd` / `name`\n/ `prompt`), `continue_session`, `close_session`. Sessions are addressed by their\nprefixed `agentSessionId` (e.g. `claude:<uuid>`); window/terminal resolution happens\ninternally.\n\nRegister it with an MCP host, e.g. in Claude Code's config:\n\n```json\n{\n  \"mcpServers\": {\n    \"termfleet\": { \"command\": \"termfleet-mcp\" }\n  }\n}\n```\n\n`termfleet-mcp` is on PATH after a global install (`npm install -g termfleet`);\notherwise use `{ \"command\": \"npx\", \"args\": [\"-y\", \"termfleet-mcp\"] }`, or from a\nclone `{ \"command\": \"npx\", \"args\": [\"tsx\", \"<repo>/src/mcp/server.ts\"] }`.\n\nPoint it at a specific provider by setting `TERMFLEET_PROVIDER_URL` in the server's\n`env`; otherwise it auto-discovers a local provider on first use.\n\n## Library: reading agent transcripts (`@termfleet/core`)\n\nThe transcript layer is usable on its own, beyond the console. Install it\nstandalone — a small **Node-only** library that reads and normalizes Claude Code /\nCodex / Gemini sessions off disk into one model:\n\n```sh\nnpm install @termfleet/core\n```\n\n```ts\nimport { readLocalAgentSession } from \"@termfleet/core/agent-session.js\";\nimport { parseAgentSessionId } from \"@termfleet/core/agent-session-id.js\"; // claude:/codex:/gemini: grammar\n\nconst session = readLocalAgentSession({ cwd: process.cwd(), sessionId: \"claude:<uuid>\" });\nconsole.log(session.messages.length, session.lastAssistantText);\n```\n\nSee [`packages/core/README.md`](./packages/core/README.md) for the full surface —\nper-agent readers, the id grammar, the streaming tail, and the provider SDK\n(`ProviderClient`, for *driving* a provider). If you already depend on\n`termfleet`, the same readers are re-exported from `termfleet/sessions` as a\nconvenience.\n\nThe terminal substrate is owned by Supercode and independently reusable:\n\n```sh\nnpm install @volter-ai-dev/supercode-terminal\n```\n\nIts explicit `substrate/*.js` subpaths separate the browser-safe WebSocket client, native CLI\nattachment, tmux session/capture/input primitives, and server-side PTY streaming.\nAn embedder can use only the layer it needs. Closing an attachment releases its\nPTY, listeners, and descriptors but never terminates the durable tmux session;\ntermination remains a separate host decision. `@termfleet/terminal` preserves\nthe seven legacy entrypoints and types as direct compatibility reexports. See\n[`packages/terminal/README.md`](./packages/terminal/README.md).\n\n## CLI Commands\n\n### Sessions (the primary surface — tier 1)\n\nWork by `agentSessionId`; termfleet resolves window→terminal internally. This is\nwhat an orchestrator should use — windows and terminals (below) are plumbing.\n\n- `sessions recent [--live] [--sort recent|attention] [--fleet] [--limit N] [--cursor C] [--console-url URL]`:\n  list sessions across providers. `--sort attention` is the triage view; `--live`\n  streams updates.\n- `sessions search --query TEXT [--limit N] [--console-url URL]`: find sessions by content.\n- `sessions watch [--interval-ms N] [--console-url URL]`: poll the session list on an interval.\n- `<claude|codex|gemini> get --agent-session-id ID [--cwd PATH] [--since N]`: read a\n  session's normalized transcript; `--since N` returns only items after #N.\n- `<claude|codex|gemini> wait --agent-session-id ID [--after-count N] [--timeout-ms N] [--poll-ms N]`:\n  block until the session's current turn ends. `--after-count N` waits for a turn\n  *after* the Nth message (use it right after `send`).\n- `claude continue --agent-session-id ID [--cwd PATH] [--prompt TEXT]`: resume an\n  ended Claude session (`claude --resume`). **Claude only.**\n- `<claude|codex> list`: list that agent's sessions on the provider.\n- `<claude|codex> kill (--id ID | --name NAME)`: stop a running agent session.\n- `send --agent-session-id ID --text TEXT [--enter]`: reply to a session.\n- `interrupt --agent-session-id ID`: cancel the current turn without closing the session.\n- `close --agent-session-id ID`: close a session.\n\n`send` / `close` also accept `--terminal-id` / `--id` as break-glass — see the\nwindow/terminal plumbing below.\n\n### Provider resolution\n\nEvery command that talks to a provider accepts `--url URL` or `--provider TARGET`,\nbut **both are optional**. When neither is given, termfleet resolves a provider in\nthis order (the same model Docker/kubectl/tmux use for local defaults):\n\n1. `--url` / `--provider` — explicit, wins over everything.\n2. `$TERMFLEET_PROVIDER_URL` — the env var agents and CI use to inject a target.\n3. **Current context** — a default you pin with `termfleet use <url|name>`.\n4. **Live local auto-discovery** — `provider serve` self-advertises to\n   `~/.termfleet/providers/`, and the CLI picks the single one that is *actually\n   serving* (verified via `/healthz`, so a stale record never wins). The console\n   reads the same directory on its own 5s sweep and registers what it finds as a\n   bare-pointer provider — this is what makes console/provider start order not\n   matter (`--no-local-discovery` opts a console out).\n5. Otherwise a **structured error** (`no_provider` or `ambiguous_provider`) with a\n   `remedy` field telling you how to start or pick one.\n\n`~/.termfleet` (the advertisement dir in step 4, plus the `termfleet use` context\nfile) is termfleet's own machine-global state — override its root with\n`TERMFLEET_HOME` to isolate it (throwaway stacks, tests, or running two unrelated\ntermfleet setups on one machine without them seeing each other's providers/context).\n\nThis means `termfleet claude list`, `termfleet claude new …`, etc. just work when\none provider is running locally — no URL required. Helpers:\n\n- `termfleet resolve [--url URL | --provider TARGET]` — print which provider would\n  be chosen and **why** (the `source` field), read-only. Use this instead of\n  guessing when a command can't find a provider.\n- `termfleet use <url|name>` — pin a default provider; `use --show` / `use --clear`\n  to inspect or unset it. Agents should prefer `$TERMFLEET_PROVIDER_URL` (which\n  outranks the pinned default) so they never depend on shared mutable state.\n- `termfleet doctor` — now also reports live local providers and what the default\n  would resolve to.\n\nResolution failures are emitted as JSON on stderr with a stable `error` code and a\n`remedy`, and always exit nonzero — so an agent can branch on the cause rather\nthan parse prose.\n\n- SDK: import `ProviderClient` and `providerRefFromUrl` from `termfleet`.\n  Console setup methods include `signInToRegistry`, `registrySession`,\n  `switchRegistryOrganization`, `registryProviders`, `startDockerWorker`,\n  `startLocalProvider`, `registerLocalProvider`, `unregisterLocalProvider`,\n  `registerSharedProvider`, `unregisterSharedProvider`, and\n  `signOutOfRegistry`.\n- `providers health --url URL`: prints provider health.\n- `providers snapshot --url URL`: prints display bounds and terminal windows.\n- `providers lifecycle --url URL`: prints observed process/session lifecycle.\n- Provider targets passed with `--provider` can be a saved alias, provider id,\n  exact label, or URL. Save aliases during registration with `--alias` or\n  `--aliases`, or update an existing provider with `providers alias set`.\n- `registry login [--console-url URL] --identifier EMAIL (--password PASSWORD | --password-stdin)`:\n  signs in to the shared registry through the console SDK.\n- `registry logout [--console-url URL]`: clears the saved CLI registry session.\n- `registry session [--console-url URL]`: prints the current registry account and\n  active organization.\n- `registry list [--console-url URL]`: lists providers visible to the local\n  console, including shared providers when signed in.\n- `registry start-docker-worker [--console-url URL] [--url URL] [--label LABEL] [--alias ALIAS] [--aliases A,B] [--terminal-theme-profile PROFILE]`: asks\n  the console to start the default Docker worker provider.\n- `registry register-local [--console-url URL] --url URL [--label LABEL] [--alias ALIAS] [--aliases A,B] [--requires-auth]`: stores\n  a local/loopback provider in the console-local registry.\n- `registry register-shared [--console-url URL] --url URL [--label LABEL] [--alias ALIAS] [--aliases A,B] [--requires-auth]`:\n  registers a reachable provider URL in the active organization. Use\n  `--requires-auth` for public or tunneled providers.\n- `registry service-clients create --registry-url URL --label LABEL --organization ID_OR_SLUG --provider-origins URL[,URL] --scopes SCOPE[,SCOPE] --credential-file ABSOLUTE_PATH`:\n  creates a Registry Worker provider-token client through the separately\n  configured infrastructure-operator credential. The generated client\n  credential is written once to a new `0600` file and is never printed.\n- `registry service-clients list --registry-url URL`: lists only public client\n  metadata; stored credential hashes and generated credentials are never\n  returned.\n- `registry service-clients revoke --registry-url URL --client-id ID`: revokes\n  one client without rotating or replacing any other client.\n- `registry unregister-shared [--console-url URL] (--provider TARGET | --url URL)`: unregisters a shared\n  provider URL from the active registry organization.\n- `providers alias list`: lists saved provider aliases.\n- `providers alias set (--provider TARGET | --url URL) --alias ALIAS`: saves an alias\n  for an existing provider.\n- `providers alias unset (--provider TARGET | --url URL) --alias ALIAS`: removes an\n  alias from an existing provider.\n- `list --url URL`: lists provider-owned terminals.\n- `capture --url URL --terminal-id TERMINAL_ID [--lines N]`: captures terminal output.\n- `send --url URL --terminal-id TERMINAL_ID --text TEXT [--enter]`: sends input to a\n  provider-owned agent terminal.\n- `close --url URL --id ID`: closes a provider-owned terminal window.\n- `claude new --url URL [--name NAME] [--cwd PATH] [--prompt TEXT]`: creates an agent terminal and starts\n  `claude --dangerously-skip-permissions`.\n- `codex new --url URL [--name NAME] [--cwd PATH] [--prompt TEXT]`: creates an agent terminal and starts\n  `codex --dangerously-bypass-approvals-and-sandbox --dangerously-bypass-hook-trust`.\n- `terminals move --url URL --id ID --left N --top N --width N --height N`: moves\n  a provider-owned terminal window.\n- `terminals resize-display --url URL --width N --height N`: resizes a virtual\n  provider display.\n- `new --repair --url URL --break-glass [--name NAME] [--cwd PATH] [--command COMMAND]`:\n  creates a raw provider-owned shell for repair use only. Prefer `claude` or\n  `codex` for normal work.\n- `console serve --name NAME [--port PORT] [--host HOST] [--local-adapters iterm[:PORT],wezterm[:PORT]|none] [--no-auto-local-adapters] [--no-local-discovery] [--tunnel] [--tunnel-id ID]`:\n  starts the browser console server. `--tunnel` publishes it at a stable public\n  URL (see \"Small Public Deployment\" and `SECURITY.md`); `--local-adapters` picks\n  the always-on iTerm/WezTerm mirrors; the console pulls local-provider discovery\n  on a 5s sweep by default (`--no-local-discovery` opts out).\n- `console rotate-passcode [--name NAME]`: rotates the 6-digit tunnel access\n  passcode (new code, same signing secret — existing sessions survive); takes\n  effect on the next console start.\n- `provider serve --kind iterm --name NAME [--port PORT] [--host HOST]`: starts\n  an iTerm-backed provider server.\n- `provider serve --kind virtual-tmux [--prefix PREFIX] [--count N] [--port PORT] [--host HOST]`:\n  starts a virtual tmux provider server. `--count` defaults to `0`.\n- `provider serve --kind wezterm [--prefix PREFIX] [--count N] [--port PORT] [--host HOST]`:\n  starts an experimental WezTerm provider server. `--count` defaults to `0`.\n- `provider serve --kind browser --name NAME [--port PORT] [--host HOST]`: starts a\n  browser provider — an embedded [lucarne](https://www.npmjs.com/package/lucarne)\n  engine (real Chrome over CDP). Each browser session is a **porthole** window you\n  can watch, drive, and take over, the browser-world peer of a terminal window.\n  Open / list / close them with `browser new|list|close` (needs Google Chrome).\n- `provider serve --kind cdp --name NAME [--port PORT] [--host HOST]`: starts a\n  CDP **mirror** provider — portholes for browsers termfleet did not launch. It\n  attaches to Chrome DevTools endpoints on loopback (mirrors, never owns: closing\n  the porthole never closes the browser). Paired with the virtual-tmux provider\n  it makes **agent-launched Playwright browsers appear automatically**: every\n  pane the tmux provider creates carries a Node preload hook (appended to\n  `NODE_OPTIONS`, fail-open, opt-out with `TERMFLEET_NO_CDP=1`) that spots a\n  Playwright Chromium launch, adds `--remote-debugging-port=0`, and announces the\n  browser — attributed to its fleet session — under `~/.termfleet/cdp-announced/`.\n  The mirror surfaces each announced browser as a `<session> · <page title>`\n  porthole and drops it when the browser exits. `TERMFLEET_CDP_ANNOUNCED_ONLY=1`\n  restricts the mirror to announced browsers only (no default-port probing, no\n  process scanning) — the board shows agents' browsers and nothing else. Note the\n  hook modifies agent pane environments and each mirrored browser serves an\n  unauthenticated CDP port on `127.0.0.1` — see `SECURITY.md`.\n- Any `provider serve --console-url URL` (or `$TERMFLEET_CONSOLE_URL`) makes the\n  provider push-announce itself to that console — **opt-in only**: a provider no\n  longer announces to `http://127.0.0.1:7373` implicitly (migration note: if you\n  relied on that implicit default, pass `--console-url` explicitly now). This is\n  rarely needed locally since the console already pull-discovers a same-`TERMFLEET_HOME`\n  provider on its own; it remains useful for a console on another machine or HOME.\n- `registry start-docker-worker [--console-url URL]`: asks the console to start\n  the Docker worker and register its provider URL.\n\n### Driving a session from your terminal\n\nThe console mirrors every session in the browser, but you don't have to leave the\nterminal to type into one. Two ideas, kept lexically separate so they never blur\ninto each other — **create** (boot a session) vs **connect** (attach to a live one):\n\n- `attach [SESSION | --agent-session-id ID]`: connect the calling terminal\n  directly to a live session — the raw PTY, the same stream the browser shows. With\n  no argument it attaches to the single live session; otherwise pass an\n  `agentSessionId` (or a prefix / window name). Detach with **Ctrl-b d** — the\n  session keeps running (it's durable on disk and reaped independently); only an\n  explicit exit ends it. `attach` never boots anything.\n- `control` (alias `ctl`): **the front door** — a fresh orchestrator chat in your\n  **fleet-control folder** (`~/fleet-control` by default; override with `--cwd`,\n  persist with `--save`) using the default agent, and because you ran it from a\n  terminal it **attaches by default**. `--no-attach` for a scriptable boot. It\n  **tunnels by default**; pass `--no-tunnel` for a local-only console. This is the\n  one-word front door to driving the fleet from your own shell.\n- `chat --attach` (**deprecated — use `ctl`**): the normal `chat` bring-up\n  (console + fleet + a launched agent), but instead of printing JSON it drops you\n  straight into the new session. Bare `chat` still reports JSON and exits, so\n  scripts are unaffected — `chat` remains for agentless boot, an arbitrary `--cwd`,\n  and JSON-report scripting, and prints a deprec","readmeFilename":"README.md"}