{"_id":"@akshar5/relay","_rev":"8-ad83bbc67d4d19690c818bb4e0d8a2a1","name":"@akshar5/relay","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@akshar5/relay","version":"0.1.0","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.1.0","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"8e289a8d51060886ef593b1bab60a751dd641de5","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.1.0.tgz","fileCount":4,"integrity":"sha512-8Tg0Evf7zJ38ua+4ow+BklSabFutj+T+Nw25G7jkW7jeoOrrmYhh9LaM1C0vzFcQd9cl9/l1KuuSIT5s+8s8Kg==","signatures":[{"sig":"MEUCIER8ImCTTWtwx6uPIBbfrbkeCHpqhMGZhkMDD973E6ciAiEA7ZXv1z2pDIfqYFJR3X16OxncFFUjpH7TRc8UufGWZM0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20026},"_from":"file:dist/npm-tarballs/akshar5-relay-0.1.0.tgz","_npmUser":{"name":"akshar5","email":"aksharpatel1233@gmail.com"},"_resolved":"/Users/aksharpatel/Documents/Codex/2026-07-12/i-m-thinking-we-can-make/dist/npm-tarballs/akshar5-relay-0.1.0.tgz","_integrity":"sha512-8Tg0Evf7zJ38ua+4ow+BklSabFutj+T+Nw25G7jkW7jeoOrrmYhh9LaM1C0vzFcQd9cl9/l1KuuSIT5s+8s8Kg==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.17.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"26.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.1.0","@akshar5/relay-darwin-arm64":"0.1.0","@akshar5/relay-linux-x64-gnu":"0.1.0","@akshar5/relay-linux-arm64-gnu":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.1.0_1783983019730_0.23519725490912124","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@akshar5/relay","version":"0.1.1","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.1.1","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"5e0bbfb202bcd5cbdd7f14c2be922a2ed155714b","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.1.1.tgz","fileCount":4,"integrity":"sha512-QCJ71Np9cADhnHi8fdneG5YIDa+jFpVnpIqFTUH+ySxImCAnWQi5PowQOU8vSHZxfONNu9Xo1kF197ug8kxpDQ==","signatures":[{"sig":"MEQCIBqai5+tZDfR+GGVRTBEw4uon/VRKiaI6snVyUG+9LQTAiBSjII9cl12VDpsftRphVeIT7QKe/SWwrWIK/wGo9NBFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20551},"_from":"file:artifacts/akshar5-relay-0.1.1.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.1.1.tgz","_integrity":"sha512-QCJ71Np9cADhnHi8fdneG5YIDa+jFpVnpIqFTUH+ySxImCAnWQi5PowQOU8vSHZxfONNu9Xo1kF197ug8kxpDQ==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.17.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.1.1","@akshar5/relay-darwin-arm64":"0.1.1","@akshar5/relay-linux-x64-gnu":"0.1.1","@akshar5/relay-linux-arm64-gnu":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.1.1_1783984262020_0.249539564267111","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@akshar5/relay","version":"0.1.2","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.1.2","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"f97607656fe0549b9d71ba3504056ec39c761b8a","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.1.2.tgz","fileCount":4,"integrity":"sha512-sfHaEfF9PI+O8l/urp+rVF6jbXbyYBgyBm7ToYQVP0PqE77qxcUTWXfcymveEn7PFLWEiC+wqUU1VXtEKePzPw==","signatures":[{"sig":"MEUCIFH3KT1eZrd/lKtS4MCAxYPJoBQ24vUj4U46XfTdYeLhAiEA7v9NrFS/+FWLxMHR2OnRAj+Ihv4F2qpsY8E5kyctX9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20615},"_from":"file:artifacts/akshar5-relay-0.1.2.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.1.2.tgz","_integrity":"sha512-sfHaEfF9PI+O8l/urp+rVF6jbXbyYBgyBm7ToYQVP0PqE77qxcUTWXfcymveEn7PFLWEiC+wqUU1VXtEKePzPw==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.16.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.1.2","@akshar5/relay-darwin-arm64":"0.1.2","@akshar5/relay-linux-x64-gnu":"0.1.2","@akshar5/relay-linux-arm64-gnu":"0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.1.2_1783985655005_0.8086203467050548","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@akshar5/relay","version":"0.1.3","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.1.3","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"8a864066aa64b735485248f968d31e5aab2c4c68","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.1.3.tgz","fileCount":4,"integrity":"sha512-7JqxjVYgAlEUA8cBujZZSwq/HH88SfAUU+YHmPiwCJ4z9IW/9sbcWbuy6EVPThKiPBOM9h+U6ecvbOPH0tRtVA==","signatures":[{"sig":"MEYCIQDtuFuEx5+NBwhwY91HKVjahy8NLB+0LVC8RUA4zRGJmAIhAMTZrF7RIzHjAiocfv0HnF/YVmduv+y+IYS02uZ4RJe/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20615},"_from":"file:artifacts/akshar5-relay-0.1.3.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.1.3.tgz","_integrity":"sha512-7JqxjVYgAlEUA8cBujZZSwq/HH88SfAUU+YHmPiwCJ4z9IW/9sbcWbuy6EVPThKiPBOM9h+U6ecvbOPH0tRtVA==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.16.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.1.3","@akshar5/relay-darwin-arm64":"0.1.3","@akshar5/relay-linux-x64-gnu":"0.1.3","@akshar5/relay-linux-arm64-gnu":"0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.1.3_1783986174348_0.012069802607730828","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@akshar5/relay","version":"0.1.4","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.1.4","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"94a4d7a002009bf58f35b76937f682d6018482b6","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.1.4.tgz","fileCount":4,"integrity":"sha512-VmNnMsydC5CDjHebtjYQZrQjh5mBglnU0ICRDOhGiqib71XLJlY8MRiyfem9UvH8V8WtIGAPxTMY27GM7AwhPA==","signatures":[{"sig":"MEYCIQCSZ5KeLO3hZ5csKlA0f9eNvxh0SGSDJtyWOkrNV0xMKQIhAOX27HS0BffTlcvxLdw4XZZFyBFxpgkhsiovmwcXnLGF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20615},"_from":"file:artifacts/akshar5-relay-0.1.4.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.1.4.tgz","_integrity":"sha512-VmNnMsydC5CDjHebtjYQZrQjh5mBglnU0ICRDOhGiqib71XLJlY8MRiyfem9UvH8V8WtIGAPxTMY27GM7AwhPA==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.16.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.1.4","@akshar5/relay-darwin-arm64":"0.1.4","@akshar5/relay-linux-x64-gnu":"0.1.4","@akshar5/relay-linux-arm64-gnu":"0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.1.4_1783986773983_0.1304903413741556","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@akshar5/relay","version":"0.2.0","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.2.0","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"fcee5ff116a8dabae4401e1b00b57d5bdae38db7","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.2.0.tgz","fileCount":4,"integrity":"sha512-aOKur8RXBz4FBi69ecVnH9apnlQucpUq08btuYlHykVWv9BFy83u+YSf7sVB160Zakaq39Gz2gn0USgDsFDJ1A==","signatures":[{"sig":"MEUCIAkphSGUlh6MrZIpC4ftjrrnwzMk1qalSppueVvn69mXAiEA9a9p5FGbNfG5Zy4d1gBMdTe+R5pwWOufmdlv1f5UlK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":23091},"_from":"file:artifacts/akshar5-relay-0.2.0.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.2.0.tgz","_integrity":"sha512-aOKur8RXBz4FBi69ecVnH9apnlQucpUq08btuYlHykVWv9BFy83u+YSf7sVB160Zakaq39Gz2gn0USgDsFDJ1A==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.16.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.2.0","@akshar5/relay-darwin-arm64":"0.2.0","@akshar5/relay-linux-x64-gnu":"0.2.0","@akshar5/relay-linux-arm64-gnu":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.2.0_1784610645536_0.5045997018151884","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@akshar5/relay","version":"0.2.1","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","_id":"@akshar5/relay@0.2.1","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"os":["darwin","linux"],"bin":{"relay":"bin/relay"},"dist":{"shasum":"9f85594b773fa4b750ea42771259fb2a6592b9f1","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.2.1.tgz","fileCount":7,"integrity":"sha512-NzFBbAuBdzSdokvRUXIPtu4HBQbRvXFyHYB33WsFCskvmhTsh/W7BfFTwswkg8CHxhlugMun7njXlLAuZHRI3Q==","signatures":[{"sig":"MEQCIFEix008NEkuNekrddL5jgZp2PSY3WttpYs+k6wPgP4/AiB+1uZJX2E74uexBFXbgR8h634rL7uKNCCn+/HV/JjyeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":50274},"_from":"file:artifacts/akshar5-relay-0.2.1.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.2.1.tgz","_integrity":"sha512-NzFBbAuBdzSdokvRUXIPtu4HBQbRvXFyHYB33WsFCskvmhTsh/W7BfFTwswkg8CHxhlugMun7njXlLAuZHRI3Q==","repository":{"url":"git+https://github.com/AksharP5/relay.git","type":"git"},"_npmVersion":"11.16.0","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@akshar5/relay-darwin-x64":"0.2.1","@akshar5/relay-darwin-arm64":"0.2.1","@akshar5/relay-linux-x64-gnu":"0.2.1","@akshar5/relay-linux-arm64-gnu":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/relay_0.2.1_1784833301989_0.07789565824856037","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@akshar5/relay","version":"0.2.2","description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","keywords":["cli","codex","coding-agent","opencode","tui"],"author":{"name":"Akshar Patel"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AksharP5/relay.git"},"homepage":"https://github.com/AksharP5/relay#readme","bugs":{"url":"https://github.com/AksharP5/relay/issues"},"publishConfig":{"access":"public"},"bin":{"relay":"bin/relay"},"os":["darwin","linux"],"optionalDependencies":{"@akshar5/relay-darwin-arm64":"0.2.2","@akshar5/relay-darwin-x64":"0.2.2","@akshar5/relay-linux-x64-gnu":"0.2.2","@akshar5/relay-linux-arm64-gnu":"0.2.2"},"_id":"@akshar5/relay@0.2.2","_integrity":"sha512-VYZG4h5QLSbIFqYMiJrZHOkgV9RmVq58M0HmTwpcsAMW/8ItlQqfqCk9jeMNA+ohMXTORcn+jt6NLTcczSzpJQ==","_resolved":"/home/runner/work/relay/relay/artifacts/akshar5-relay-0.2.2.tgz","_from":"file:artifacts/akshar5-relay-0.2.2.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-VYZG4h5QLSbIFqYMiJrZHOkgV9RmVq58M0HmTwpcsAMW/8ItlQqfqCk9jeMNA+ohMXTORcn+jt6NLTcczSzpJQ==","shasum":"ea6f59b7d77196f352a4c1e967973ad46bc92c82","tarball":"https://registry.npmjs.org/@akshar5/relay/-/relay-0.2.2.tgz","fileCount":7,"unpackedSize":50335,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@akshar5%2frelay@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCsUY+aME/I7oR1O+4XPusF+XWeTWZOMpbi9+lQLyYLzQIga4zlVP5Gx/YclGSjGSryDRoVRg/IydbD5wilYHGthkE="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b7b610fd-9ec2-4b24-bc22-c28f2cd12ab9"}},"directories":{},"maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/relay_0.2.2_1788830364987_0.8386023351752001"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-13T22:50:19.540Z","modified":"2026-09-08T01:19:25.421Z","0.1.0":"2026-07-13T22:50:19.847Z","0.1.1":"2026-07-13T23:11:02.155Z","0.1.2":"2026-07-13T23:34:15.188Z","0.1.3":"2026-07-13T23:42:54.482Z","0.1.4":"2026-07-13T23:52:54.106Z","0.2.0":"2026-07-21T05:10:45.661Z","0.2.1":"2026-07-23T19:01:42.155Z","0.2.2":"2026-09-08T01:19:25.129Z"},"bugs":{"url":"https://github.com/AksharP5/relay/issues"},"author":{"name":"Akshar Patel"},"license":"MIT","homepage":"https://github.com/AksharP5/relay#readme","keywords":["cli","codex","coding-agent","opencode","tui"],"repository":{"type":"git","url":"git+https://github.com/AksharP5/relay.git"},"description":"Use the real Codex and OpenCode TUIs on one continuous coding task.","maintainers":[{"name":"akshar5","email":"aksharpatel1233@gmail.com"}],"readme":"# Relay\n\nUse the real Codex and OpenCode TUIs on one continuous coding task.\n\nhttps://github.com/user-attachments/assets/66e6697b-ea59-47c9-898e-a50353af2910\n\n```console\n$ cd my-project\n$ relay\n```\n\nOr launch the workspace directly from another directory with `relay ./my-project`.\n\nRelay opens the selected harness exactly as its own CLI renders it. Codex looks and behaves like Codex; OpenCode looks and behaves like OpenCode. Type `/` and the native command palette owns the input. `Escape` remains owned by that native TUI, including any version-specific behavior.\n\n> **Platform support:** Relay supports macOS 13 or newer and glibc 2.25+ Linux. Native Windows and WSL are outside the current support and test scope.\n\nTo switch harnesses while the current session is idle, press `Ctrl+Q` by default. Relay carries the completed conversation forward and opens the other real TUI. The binding is fully customizable, and `F6` remains available as a fallback (`Fn+F6` when macOS treats the function row as media keys). See [Terminal shortcuts](#terminal-shortcuts).\n\n## Why use Relay?\n\nCodex and OpenCode have different models, tools, permission systems, commands, and strengths. Moving between them normally means starting over or manually writing a handoff.\n\nRelay makes that transition part of the terminal workflow:\n\n- **Keep the native experience.** Relay does not redraw, imitate, or embed screenshots of either interface. It hosts the installed CLI in a real pseudo-terminal.\n- **Keep one task.** Completed user and assistant messages are carried to the other harness, while the shared working directory carries the code and tool results.\n- **Keep native commands.** `/resume`, `/model`, `/undo`, `/sessions`, approval prompts, keyboard shortcuts, and dialogs are handled by the selected application.\n- **Resume both sides.** Relay remembers the Codex thread and OpenCode session associated with the task.\n- **Move only the delta.** A harness receives conversation it has not already seen instead of a rebuilt prompt on every turn.\n- **Stay lightweight.** Only the selected TUI and its local backend are alive. Relay does not keep two renderers, a terminal framebuffer, an indexer, or a daemon in memory.\n- **Keep credentials where they belong.** Authentication, provider settings, MCP servers, agents, tools, and permissions remain owned by Codex and OpenCode.\n\n## What “native” means\n\nRelay is a transparent terminal layer around the upstream applications:\n\n```text\nyour terminal\n    └── Relay PTY host\n          ├── native Codex TUI ── Relay-owned Codex app-server\n          └── native OpenCode TUI ── Relay-owned OpenCode server\n```\n\nOnly one branch runs at a time. Relay forwards terminal bytes unchanged, including colors, alternate-screen behavior, mouse input, enhanced keyboard sequences, bracketed paste, and resize events. It reserves the configured switch binding and `F6` for direct switching.\n\nThe current release pairs each interface with its own engine: Codex TUI with Codex, and OpenCode TUI with OpenCode. Running the literal OpenCode TUI against the Codex engine would require a complete, bidirectional translation between their live protocols, approvals, tools, streaming events, session semantics, and commands. Relay does not claim that adapter exists yet.\n\nThere is no separate skin setting in this release: switching harnesses also switches to that harness's native interface. A Codex engine with the OpenCode interface—or the reverse—is the cross-pairing protocol work described above, not a theme toggle.\n\n## How context moves\n\nA Relay task stores a small canonical log and a binding for each harness.\n\n1. Relay reads the destination’s completed native transcript.\n2. It compares the persisted synchronization cursor with the canonical log.\n3. It injects only missing messages, then advances the cursor after confirmation.\n4. It imports newly discovered native turns and starts the destination’s real TUI.\n\nOpenCode receives a synthetic, hidden `noReply` message. Codex receives structured app-server context items. Neither handoff causes an inference request. After the handoff, the native session resumes normally, preserving the stable prefix that provider prompt caches prefer.\n\nThe handoff is shared model context, not a rewrite of vendor-owned chat storage. A relayed turn can therefore be known by the destination model without appearing as a normal message in that native TUI's timeline. `relay history` shows the current active visible canonical context; native timelines show messages created by that native harness. Relay does not edit private session databases to make them look identical.\n\nRelay transfers visible conversation—not hidden reasoning, raw tool payloads, approval state, provider cache entries, or another harness’s private database. The receiving harness should inspect the shared workspace because it is the source of truth for file changes.\n\nHandoffs are bounded to the newest 200 messages and 120,000 characters. This keeps memory and context usage predictable without paying for an automatic summarization call. Native context-window errors and native compaction remain visible and controllable in the selected TUI.\n\nRead [How Relay keeps context](docs/how-relay-works.md) for lifecycle details and edge cases.\n\n## Install\n\n### Supported platforms\n\n- macOS 13 or newer on Apple Silicon or Intel\n- glibc 2.25 or newer Linux on arm64 or x64\n\nNative Windows and WSL are intentionally deferred for now. Relay's terminal host currently depends on Unix pseudo-terminal and process semantics; native Windows support requires a dedicated ConPTY backend rather than another npm binary. Although a glibc-based WSL distribution resembles a supported Linux environment, Relay does not currently claim or test WSL compatibility.\n\n### Runtime prerequisites\n\n- the latest stable [Codex CLI](https://github.com/openai/codex)\n- the latest stable [OpenCode](https://opencode.ai/)\n- authentication completed in each harness you plan to use\n\nOne npm-based way to install or update both harnesses is:\n\n```bash\nnpm install --global @openai/codex@latest opencode-ai@latest\n```\n\n### Install Relay\n\n```bash\nnpm install --global @akshar5/relay@latest\nrelay doctor\n```\n\nThat one command installs a ready-to-run native executable for the current machine. Relay supports Apple Silicon and Intel macOS 13+, plus x64 and arm64 glibc 2.25+ Linux. npm selects only the matching platform package; it does not download the other executables. Bun is not required at runtime, and the tiny launcher replaces itself with Relay instead of leaving an extra process in memory.\n\nUpdate with the same command:\n\n```bash\nnpm install --global @akshar5/relay@latest\n```\n\n### Build from source\n\nSource installation additionally requires [Bun](https://bun.sh/) 1.3 or newer. Running the test suite also requires Node.js 22.12 or newer.\n\n```bash\ngit clone https://github.com/AksharP5/relay.git\ncd relay\nbun install\nbun run check\nbun run build\nbun link\nrelay --version\nrelay doctor\n```\n\nThe build creates a standalone Relay executable for the current platform. `bun link` exposes it as `relay` through Bun's global bin directory. Re-run `bun run build` after pulling changes. Source builds are for contributors; npm is the supported installation channel.\n\nRelay targets the latest stable releases rather than silently pinning old harnesses. On every relevant `main` change and once per day, [compatibility CI](https://github.com/AksharP5/relay/actions/workflows/compat-latest.yml) installs both `@latest` packages on Linux and macOS, records the exact resolved versions in the run summary, and exercises their schemas, authenticated local servers, event streams, session creation, hidden handoff injection, resume, deleted-session recovery, status, and cleanup without a model call. The PTY byte path also has automated terminal tests.\n\nRelay does not auto-update tools on startup. That would add latency, network traffic, and an unexpected global machine mutation. `relay doctor` reports the locally installed versions; Relay’s CI detects upstream changes, and releases should pass `bun run compat:latest` against the latest harnesses.\n\n## Use the native workspace\n\nRun Relay from the directory you want the agents to edit, or pass that directory explicitly:\n\n```bash\nrelay\nrelay .\nrelay ../another-project\nrelay /absolute/path/to/project\nrelay -- native\n```\n\nThese forms select the same directory-bound workspace behavior. Relative paths resolve from the current shell directory. Relay uses the most recent task bound to the selected directory or creates a new local task. It opens that task’s active harness—Codex by default for a new task.\n\nIf a directory name matches a Relay command, place `--` before exactly one directory operand. For example, `relay -- native` opens the `native` directory instead of running `relay native`. A path such as `relay ./native` continues to work without the delimiter.\n\n| Input                                    | Owner      | Action                                         |\n| ---------------------------------------- | ---------- | ---------------------------------------------- |\n| `/`, letters, `Enter`                    | Native TUI | Type and run native slash commands normally    |\n| `Escape`                                 | Native TUI | Handle according to that TUI's native behavior |\n| `Ctrl+C`                                 | Native TUI | Interrupt or exit according to native behavior |\n| Configured key (`Ctrl+Q` by default)     | Relay      | Switch directly to the other harness when idle |\n| `F6` (`Fn+F6` with macOS media-key mode) | Relay      | Fixed fallback switch key                      |\n\nRelay refuses to detach while a turn is active. The terminal bell sounds and the current TUI stays visible until its response, tool call, retry, approval, or question reaches a safe idle state. Wait for it to finish, then use the switch key again. The completed turn is imported before the other harness opens.\n\nThis is a current safety boundary, not a claim that background switching is impossible. A safe background mode would temporarily keep the source runtime alive, preserve its approvals and output, open the destination, and hold destination model requests until the source turn finishes and crosses over. Otherwise two agents could branch from different conversation states while editing the same worktree. Relay's first release keeps one harness stack alive at a time, so partial output remains in its source TUI and never appears live inside the other native interface.\n\nRelay cannot safely add `/harness` to both stock native command palettes today. OpenCode exposes a local TUI command plugin API, but Codex does not expose a corresponding host-command extension point. Relay could intercept raw text only by guessing whether bytes belong to a composer, dialog, Vim state, search field, history edit, or external editor. That would compromise the native behavior Relay exists to preserve, so every slash command remains native.\n\n### Terminal shortcuts\n\nRelay uses OpenCode-style key names and does not restrict the primary binding to a curated list. Change it with:\n\n```bash\nrelay config\nrelay config set switch-key ctrl+g\nrelay config set switch-key shift+return\nrelay config set switch-key super+k\nrelay config reset switch-key\n```\n\nBindings are case-insensitive single key chords. Combine any of `ctrl`, `alt`/`option`, `shift`, `super`/`cmd`, `hyper`, or `meta` with a printable Unicode key or a named key such as `return`, `escape`, `space`, `left`, `pageup`, `f1` through `f35`, keypad keys, or media keys. `KeyCode:<number>` covers any additional CSI-u/Kitty key code a terminal reports. Set the binding to `none` to disable the primary shortcut. Changes apply the next time bare `relay` launches.\n\nRelay accepts unusual bindings instead of rejecting them. A plain character or editing key is consumed by Relay while a native TUI is open. Modifier combinations such as `super+k`, some media keys, and raw key codes require a terminal that reports those keys through CSI-u/Kitty keyboard events. Your terminal emulator or multiplexer can still capture a shortcut before Relay receives it.\n\n`Ctrl+Q` works without configuration in a direct WezTerm session and in tmux. Relay runs its PTY in raw mode, so it receives the control byte instead of treating it as terminal flow control. Codex and OpenCode do not assign `Ctrl+Q` in their current default keymaps.\n\nZellij's default keymap reserves `Ctrl+Q` for quitting. Choose another Relay binding or use `F6` inside Zellij. Relay intentionally keeps `F6` as the recovery shortcut regardless of the configured primary binding.\n\n### Bring an existing session into Relay\n\nExisting sessions remain in their native harness. To adopt one, run Relay from the same workspace, open Codex's `/resume` or OpenCode's `/sessions`, and select it normally. Once that session is idle, use the configured switch binding or `F6` to import its completed visible turns and open the other harness with that context. On a cold launch, wait two seconds after the selection `Enter`; on a warm session, Relay conservatively treats a recent `Enter` as a model request until it observes a completed native turn. If a non-model command leaves the session unchanged and the switch rings the bell, wait briefly and retry. OpenCode can then be adopted without sending it a new prompt because Relay reads the exact native continuation ID from its graceful exit rather than guessing from screen content.\n\nThe other harness binding is lazy. If it does not exist yet, Relay creates and seeds it only when you first switch there. Returning later resumes the same two native bindings.\n\nSelecting an existing session is an intentional context reset for the current Relay task: Relay adopts that session's completed conversation and does not append an unrelated older task transcript behind it. Only sessions from the current workspace can be adopted. Relay supports sessions exposed by the native picker; it does not add a second history browser for session kinds that Codex or OpenCode omit from their own UI.\n\n## Headless commands\n\nThe native TUI is the primary interface. Relay also keeps a headless surface for scripts and diagnostics:\n\n```bash\nrelay help # aliases: --help, -h\nrelay version # aliases: --version, -v\nrelay doctor\nrelay config\nrelay config set switch-key ctrl+g\nrelay new \"Improve the parser\" --with codex\nrelay ask \"Find the edge case and add a focused test\"\nrelay ask --with opencode \"Review the implementation\"\nrelay ask -- --help\nrelay use codex\nrelay status\nrelay history\nrelay list\nrelay thread <id>\nrelay export [id] [--out relay-task.json]\nrelay delete [id] --force\n```\n\nFor `relay ask`, `--` ends option parsing so prompts can begin with option-like text. Every argument after the delimiter is treated as prompt content.\n\nSee the [command guide](docs/commands.md) for full examples.\n\n## Storage and performance\n\nRelay stores its versioned `config.json`, canonical visible message text, and task metadata under `~/.local/share/relay` by default. Metadata includes the task ID, directory, active harness, active-context boundary, native session IDs, synchronization cursors, native undo visibility, and timestamps.\n\nIt does not copy credential files, vendor session databases, raw terminal output, or tool traces. Canonical messages use append-only JSON Lines within the active conversation. When you adopt a different native conversation, Relay compacts the superseded canonical prefix; the vendor's own session remains the source of truth if you select it again. Switch handoffs scan only the active log with a bounded message and character window; OpenCode recovery reads vendor history in cursor pages and immediately discards non-visible tool payloads. Submission safety checks do not reread full conversations: Codex returns at most five turn summaries and OpenCode returns at most 20 recent message records. While a TUI is active, Relay otherwise keeps only small routing queues, the handoff delta needed for a switch, and—for OpenCode only—an in-memory exit tail capped at 8 KiB so it can recognize the selected continuation ID. That tail is discarded when the native process exits and is never written to Relay storage.\n\nEach active backend binds only to loopback and uses an ephemeral capability secret:\n\n- Codex: authenticated WebSocket app-server; the token lives in a private temporary file and environment variable.\n- OpenCode: password-protected HTTP server; the password lives in memory/environment and never appears in process arguments.\n\nBoth the backend and native frontend stop when Relay leaves that harness. Native session persistence remains in the harness’s own storage.\n\nSet `RELAY_DATA_DIR` to place Relay’s canonical log elsewhere. Protect it like any local agent transcript.\n\nUse `relay export` for a user-readable JSON archive of the current active visible canonical context. It intentionally excludes superseded contexts, internal native session IDs, locks, journals, hidden undo entries, secrets, and vendor databases. Superseded or adopted conversations remain available only through the native harness history that owns them. The export is an archive, not an importable backup.\n\nUse `relay delete [id] --force` to erase one task's Relay-owned records. Deletion is journaled so an interrupted delete finishes on the next launch. It does not delete files in the workspace or sessions retained by Codex and OpenCode.\n\n## Current boundaries\n\n- Relay supports Codex and OpenCode on macOS 13+ and glibc 2.25+ Linux. Native Windows and WSL are intentionally outside the current support and automated-test matrix; native Windows PTY hosting is not implemented.\n- Relay prevents two tasks from running agents in the same git checkout, including tasks started from nested or symlinked paths. Use separate git worktrees for intentional concurrency.\n- Cross-engine continuity includes completed visible text and the working tree, not hidden state.\n- A turn must finish in its source TUI before Relay switches; partial streaming output is not mirrored into the destination TUI.\n- Attachments and rich tool events stay in their native session; they are not translated into the other harness.\n- Native undo, compaction, sharing, and session commands still use native semantics. Relay reconciles explicit OpenCode undo/redo visibility for completed imported turns, but it will not rewrite vendor-owned storage to force two histories to become identical.\n- If a harness edits files and then fails, the workspace may be ahead of the canonical conversation. Inspect `git status` before retrying.\n- Literal cross-pairing—such as OpenCode’s TUI over Codex—is future protocol-adapter work, not a cosmetic skin toggle.\n\nThese boundaries favor native fidelity, supported interfaces, and recoverable local state over fragile emulation.\n\n## Development\n\nRelay is TypeScript on Bun, with [Effect](https://effect.website/) services around storage and harness operations. Native rendering is intentionally left to Codex and OpenCode; Relay’s terminal layer uses Bun’s PTY primitives.\n\n```bash\nbun install\nbun run check\nbun run compat:latest\nbun run build\n```\n\nThe implementation style is informed by [Effect Solutions](https://github.com/kitlangton/effect-solutions), [OpenCode](https://github.com/anomalyco/opencode), and [Executor](https://github.com/UsefulSoftwareCo/executor). Relay is not affiliated with OpenAI or the OpenCode project.\n\nRelease demos and native TUI checks can use [Terminal Control](https://github.com/anomalyco/terminal-control). It records general PTY applications, including Codex; OpenCode additionally needs its `--host opentui` handshake. Relay does not depend on it at runtime. Raw `.termctrl` timelines include terminal output and typed input, so keep them local and share only reviewed exports such as scrubbed MP4s.\n\nContributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\n[MIT](LICENSE) © 2026 Akshar Patel\n","readmeFilename":"README.md"}