{"_id":"@alfe.ai/remote","_rev":"4-291cdb3680c977e022fd8a293a094e09","name":"@alfe.ai/remote","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"@alfe.ai/remote","version":"0.0.0","license":"UNLICENSED","_id":"@alfe.ai/remote@0.0.0","maintainers":[{"name":"kevupton","email":"kevin@upton.tech"},{"name":"sam-alfe","email":"sam@alfe.ai"}],"dist":{"shasum":"fcff22b4e7602ad47bc7a687e7bfb867af29fd53","tarball":"https://registry.npmjs.org/@alfe.ai/remote/-/remote-0.0.0.tgz","fileCount":5,"integrity":"sha512-jGGcdzXza3xIb8KXk4EQkTFB8YoZ/UJBpilUDxPeSsuN8xMdaIaltT1YeSUkLwa1qRRHExHwsgtKfKeQUAZdAQ==","signatures":[{"sig":"MEUCIAWZhzIsyxMWqds+/UF3p3QvjtYs/wOg8aAqvHUwfEmcAiEA/of1/gwWZ4GWc/NeVa+UeGqjgefUQBJjfKSv2g4XHSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40718},"main":"./dist/index.js","type":"module","_from":"file:alfe.ai-remote-0.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsdown --watch","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsdown","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kevupton","email":"kevin@upton.tech"},"_resolved":"/tmp/c4afd109d9c65a70a4845c24245ecce3/alfe.ai-remote-0.0.0.tgz","_integrity":"sha512-jGGcdzXza3xIb8KXk4EQkTFB8YoZ/UJBpilUDxPeSsuN8xMdaIaltT1YeSUkLwa1qRRHExHwsgtKfKeQUAZdAQ==","_npmVersion":"10.9.8","description":"Runtime-agnostic transport for the Alfe interactive remote-control relay — multiplexes browser screencast and terminal PTY surfaces over one outbound WebSocket","directories":{},"_nodeVersion":"22.23.0","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/remote_0.0.0_1782982505358_0.6337813362132234","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@alfe.ai/remote","version":"0.1.0","keywords":["alfe","ai-agents","agent","llm"],"author":{"url":"https://alfe.ai","name":"Alfe"},"license":"UNLICENSED","_id":"@alfe.ai/remote@0.1.0","maintainers":[{"name":"kevupton","email":"kevin@upton.tech"},{"name":"sam-alfe","email":"sam@alfe.ai"}],"homepage":"https://alfe.ai","dist":{"shasum":"9856e7240521ea4c4373cd37feaf1a1244ae514e","tarball":"https://registry.npmjs.org/@alfe.ai/remote/-/remote-0.1.0.tgz","fileCount":5,"integrity":"sha512-BwlNRmzPvt5kgbqp84e5pjuPGANUC7+5JDUzxozRWdK6F2R7l21TixVllbMre1mBH8Ot2BmlhLTTLRoUIFCt7w==","signatures":[{"sig":"MEUCIHZChaVW3kHkjphZk4LiEtIK7XBMe54CVgRu1lhuGxgBAiEAuEElxLKGUPkBIuF44o7f4QumfVs8cau4Cm5C92mRHIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40862},"main":"./dist/index.js","type":"module","_from":"file:alfe.ai-remote-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsdown --watch","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsdown","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kevupton","email":"kevin@upton.tech"},"_resolved":"/tmp/2bba165260e45ad45ea8a2061a8218aa/alfe.ai-remote-0.1.0.tgz","_integrity":"sha512-BwlNRmzPvt5kgbqp84e5pjuPGANUC7+5JDUzxozRWdK6F2R7l21TixVllbMre1mBH8Ot2BmlhLTTLRoUIFCt7w==","_npmVersion":"10.9.8","description":"Runtime-agnostic transport for the Alfe interactive remote-control relay — multiplexes browser screencast and terminal PTY surfaces over one outbound WebSocket","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/remote_0.1.0_1783007087218_0.22517783407703962","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alfe.ai/remote","version":"0.1.1","keywords":["alfe","ai-agents","agent","llm"],"author":{"url":"https://alfe.ai","name":"Alfe"},"license":"UNLICENSED","_id":"@alfe.ai/remote@0.1.1","maintainers":[{"name":"kevupton","email":"kevin@upton.tech"},{"name":"sam-alfe","email":"sam@alfe.ai"}],"homepage":"https://alfe.ai","dist":{"shasum":"b059d20909d8d307aa8db848bd30ec3f05b39aa0","tarball":"https://registry.npmjs.org/@alfe.ai/remote/-/remote-0.1.1.tgz","fileCount":6,"integrity":"sha512-VSD+kan1LRo8hBT1XK3NvHu9rWt1wcuTxCzIWUOjBX1GwFvayhy3Kki5cw2zXxex4d1fbnV5o9VT9pUXbKxFQA==","signatures":[{"sig":"MEUCIQDFi0q0YK1WrmWOcoDfYX3rbsbx27FJDnFz0e5j0DA7pQIgMLd3ITvs4aikrCZsLh/uHZyLKX9dF6V9OAcEaQBUGJc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70214},"main":"./dist/index.js","type":"module","_from":"file:alfe.ai-remote-0.1.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsdown --watch","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsdown","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kevupton","email":"kevin@upton.tech"},"_resolved":"/tmp/ecd6f5efd8090f66fec81da6966df860/alfe.ai-remote-0.1.1.tgz","_integrity":"sha512-VSD+kan1LRo8hBT1XK3NvHu9rWt1wcuTxCzIWUOjBX1GwFvayhy3Kki5cw2zXxex4d1fbnV5o9VT9pUXbKxFQA==","_npmVersion":"10.9.8","description":"Runtime-agnostic transport for the Alfe interactive remote-control relay — multiplexes browser screencast and terminal PTY surfaces over one outbound WebSocket","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ws":"^8.18.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/remote_0.1.1_1785753596588_0.27957255893275756","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alfe.ai/remote","version":"0.2.0","description":"Runtime-agnostic transport for the Alfe interactive remote-control relay — multiplexes browser screencast and terminal PTY surfaces over one outbound WebSocket","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.js"}},"dependencies":{"ws":"^8.18.0"},"license":"UNLICENSED","homepage":"https://alfe.ai","author":{"name":"Alfe","url":"https://alfe.ai"},"keywords":["alfe","ai-agents","agent","llm"],"scripts":{"build":"tsdown","dev":"tsdown --watch","test":"vitest run --passWithNoTests","typecheck":"tsc --noEmit","lint":"eslint ."},"_id":"@alfe.ai/remote@0.2.0","_integrity":"sha512-Ch1yHf+h5IQf/LAidhYkTxLzvOVbOITwz7lvmst8FELHjmr2WFOsNSv1QjN/32oKLHXk63JKpgB+gdhnj1QBNA==","_resolved":"/tmp/1a64c7dec3128c012f865a1d2ea01db8/alfe.ai-remote-0.2.0.tgz","_from":"file:alfe.ai-remote-0.2.0.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-Ch1yHf+h5IQf/LAidhYkTxLzvOVbOITwz7lvmst8FELHjmr2WFOsNSv1QjN/32oKLHXk63JKpgB+gdhnj1QBNA==","shasum":"e44f9fa756114e77b5160ba21c64f8088002e5c8","tarball":"https://registry.npmjs.org/@alfe.ai/remote/-/remote-0.2.0.tgz","fileCount":6,"unpackedSize":71782,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCuo4Mn6A/dg1BKJzg0Hhu9hfN87C0N2gxeeWyzKX/GjwIgFyDO9fxSEykT7aMxsiWhpHdOyKhHDVr4u+xgUJ9XDJo="}]},"_npmUser":{"name":"kevupton","email":"kevin@upton.tech"},"directories":{},"maintainers":[{"name":"kevupton","email":"kevin@upton.tech"},{"name":"sam-alfe","email":"sam@alfe.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/remote_0.2.0_1788928295022_0.20545349743978947"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-02T08:55:05.187Z","modified":"2026-09-09T04:31:35.322Z","0.0.0":"2026-07-02T08:55:05.527Z","0.1.0":"2026-07-02T15:44:47.376Z","0.1.1":"2026-08-03T10:39:56.717Z","0.2.0":"2026-09-09T04:31:35.170Z"},"author":{"name":"Alfe","url":"https://alfe.ai"},"license":"UNLICENSED","homepage":"https://alfe.ai","keywords":["alfe","ai-agents","agent","llm"],"description":"Runtime-agnostic transport for the Alfe interactive remote-control relay — multiplexes browser screencast and terminal PTY surfaces over one outbound WebSocket","maintainers":[{"name":"kevupton","email":"kevin@upton.tech"},{"name":"sam-alfe","email":"sam@alfe.ai"}],"readme":"# `@alfe.ai/remote`\n\nShared transport and frame codec for Alfe's interactive browser and terminal\nrelay. The package provides:\n\n- `RemoteServiceClient`, one outbound authenticated WebSocket per agent;\n- the five-byte multiplexed binary frame codec and direction helpers;\n- bounded runtime decoders for relay control payloads;\n- `SurfaceHandler` and `TurnController` contracts used by the browser and\n  terminal packages.\n\n## Client usage\n\n```ts\nimport { RemoteServiceClient } from \"@alfe.ai/remote\";\n\nconst client = new RemoteServiceClient({\n  wsUrl: \"wss://remote.dev.alfe.ai/ws\",\n  apiKey: process.env.ALFE_API_KEY!,\n  onFrame: (frame) => routeFrame(frame),\n});\n\nclient.start();\n```\n\nThe relay URL is an authentication boundary because the API key is sent in the\nWebSocket upgrade. Production callers must derive or authorize the exact relay\nhost from trusted Alfe configuration. The client requires WSS, permits plain WS\nonly for loopback development, rejects URL userinfo/fragments, and redacts query\nparameters from logs.\n\nInbound and outbound frames are capped at 10 MiB. Control JSON is capped at\n64 KiB. Use the exported shape-specific decoders instead of casting\n`decodeJson()` results at a surface boundary.\n\nSee [Alfe](https://alfe.ai) and the [documentation](https://docs.alfe.ai).\n","readmeFilename":"README.md"}