{"_id":"@cnwanghao/openchamber","_rev":"5-72af25dda46dbe85e948bc801fb3087a","name":"@cnwanghao/openchamber","dist-tags":{"latest":"1.10.0"},"versions":{"1.9.6":{"name":"@cnwanghao/openchamber","version":"1.9.6","_id":"@cnwanghao/openchamber@1.9.6","maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"bin":{"openchamber":"bin/cli.js"},"dist":{"shasum":"94ec7cf0352554128813174efb2309aa3bb05520","tarball":"https://registry.npmjs.org/@cnwanghao/openchamber/-/openchamber-1.9.6.tgz","fileCount":282,"integrity":"sha512-EIGkiU4w9OPu5SC6S2eF/TDRciRPA5OcmrAtvt/v9s4J4b3kppGxVqNcgLDzHkneHA9Wm8zelgi66FfhUaY2Yw==","signatures":[{"sig":"MEQCIB56j3f6bbEloMiq4wlv2vHC+PMMwEE7WbLjGWSgKEo9AiBtmoREBKTptXhxAYsPElGWSvw4jhAMZirxXzFkvbM0SQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25017793},"main":"./server/index.js","type":"module","_from":"file:packages/web/cnwanghao-openchamber-1.9.6.tgz","types":"./server/index.d.ts","private":false,"scripts":{"dev":"bun run build:watch","lint":"eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js","build":"vite build","start":"node bin/cli.js serve","dev:server":"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}","type-check":"tsc --noEmit","build:watch":"vite build --watch","dev:server:watch":"nodemon --watch server --ext js --exec \"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}\""},"_npmUser":{"name":"cnwanghao","email":"wanghaody@gmail.com"},"_resolved":"/opt/work/workspace/TypeScript/openchamber/packages/web/cnwanghao-openchamber-1.9.6.tgz","_integrity":"sha512-EIGkiU4w9OPu5SC6S2eF/TDRciRPA5OcmrAtvt/v9s4J4b3kppGxVqNcgLDzHkneHA9Wm8zelgi66FfhUaY2Yw==","_npmVersion":"11.12.1","description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ws":"^8.18.3","clsx":"^2.1.1","cmdk":"^1.1.1","jose":"^6.1.3","yaml":"^2.8.1","luxon":"^3.5.0","react":"^19.1.1","openai":"^4.79.0","sonner":"^2.0.7","adm-zip":"^0.5.16","bun-pty":"^0.4.5","express":"^5.1.0","zustand":"^5.0.8","node-pty":"1.2.0-beta.12","web-push":"^3.6.7","@ibm/plex":"^6.4.1","react-dom":"^19.1.1","remark-gfm":"^4.0.1","simple-git":"^3.28.0","compression":"^1.8.1","cron-parser":"^4.9.0","ghostty-web":"0.3.0","next-themes":"^0.4.6","jsonc-parser":"^3.3.1","@octokit/rest":"^22.0.1","@clack/prompts":"^1.1.0","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","qrcode-terminal":"^0.12.0","@opencode-ai/sdk":"^1.4.6","@remixicon/react":"^4.7.0","reflect-metadata":"^0.2.2","@codemirror/lang-go":"^6.0.1","strip-json-comments":"^5.0.3","@codemirror/lang-cpp":"^6.0.3","@radix-ui/react-slot":"^1.2.3","http-proxy-middleware":"^3.0.5","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-select":"^2.2.6","@radix-ui/react-toggle":"^1.1.10","@simplewebauthn/server":"13.3.0","@radix-ui/react-tooltip":"^1.2.8","@simplewebauthn/browser":"13.3.0","class-variance-authority":"^0.7.1","react-syntax-highlighter":"^15.6.6","@fontsource/ibm-plex-mono":"^5.2.7","@fontsource/ibm-plex-sans":"^5.1.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-collapsible":"^1.1.12","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-dropdown-menu":"^2.1.16","@types/react-syntax-highlighter":"^15.5.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","cors":"^2.8.5","vite":"^7.1.2","eslint":"^9.33.0","globals":"^16.3.0","nodemon":"^3.1.7","cross-env":"^7.0.3","@eslint/js":"^9.33.0","typescript":"~5.8.3","@types/node":"^24.3.1","tailwindcss":"^4.0.0","@types/react":"^19.1.10","autoprefixer":"^10.4.21","concurrently":"^9.2.1","@types/adm-zip":"^0.5.7","tw-animate-css":"^1.3.8","workbox-window":"^7.4.0","vite-plugin-pwa":"^1.0.3","@types/react-dom":"^19.1.7","typescript-eslint":"^8.39.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^5.0.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/openchamber_1.9.6_1776502958182_0.4931349828021281","host":"s3://npm-registry-packages-npm-production"}},"1.9.7":{"name":"@cnwanghao/openchamber","version":"1.9.7","_id":"@cnwanghao/openchamber@1.9.7","maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"bin":{"openchamber":"bin/cli.js"},"dist":{"shasum":"bf4c71d19cca9425c608152cf7405a0f8bb15785","tarball":"https://registry.npmjs.org/@cnwanghao/openchamber/-/openchamber-1.9.7.tgz","fileCount":282,"integrity":"sha512-yjwcfGqFMEwyeEAKgTFNm0N761QEoAUM6ZeChcx1TRzS+QmiM46u9wdwrQpUV+vv8sZPnp+YkIvJr4NNuv4FFg==","signatures":[{"sig":"MEUCIQCkJAc6SzRYicwwHHy9JenC3laih2dOPIvgkbvreK06jwIgN80ZtzYuOQX8xwsZAR4yQvvtQyZfSm2IDis8XsjvWJk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25017793},"main":"./server/index.js","type":"module","types":"./server/index.d.ts","gitHead":"a09cc7f2de295914942abafbbaaf8e094bb7267d","private":false,"scripts":{"dev":"bun run build:watch","lint":"eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js","build":"vite build","start":"node bin/cli.js serve","dev:server":"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}","type-check":"tsc --noEmit","build:watch":"vite build --watch","dev:server:watch":"nodemon --watch server --ext js --exec \"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}\""},"_npmUser":{"name":"cnwanghao","email":"wanghaody@gmail.com"},"_npmVersion":"11.12.1","description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ws":"^8.18.3","clsx":"^2.1.1","cmdk":"^1.1.1","jose":"^6.1.3","yaml":"^2.8.1","luxon":"^3.5.0","react":"^19.1.1","openai":"^4.79.0","sonner":"^2.0.7","adm-zip":"^0.5.16","bun-pty":"^0.4.5","express":"^5.1.0","zustand":"^5.0.8","node-pty":"1.2.0-beta.12","web-push":"^3.6.7","@ibm/plex":"^6.4.1","react-dom":"^19.1.1","remark-gfm":"^4.0.1","simple-git":"^3.28.0","compression":"^1.8.1","cron-parser":"^4.9.0","ghostty-web":"0.3.0","next-themes":"^0.4.6","jsonc-parser":"^3.3.1","@octokit/rest":"^22.0.1","@clack/prompts":"^1.1.0","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","qrcode-terminal":"^0.12.0","@opencode-ai/sdk":"^1.4.6","@remixicon/react":"^4.7.0","reflect-metadata":"^0.2.2","@codemirror/lang-go":"^6.0.1","strip-json-comments":"^5.0.3","@codemirror/lang-cpp":"^6.0.3","@radix-ui/react-slot":"^1.2.3","http-proxy-middleware":"^3.0.5","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-select":"^2.2.6","@radix-ui/react-toggle":"^1.1.10","@simplewebauthn/server":"13.3.0","@radix-ui/react-tooltip":"^1.2.8","@simplewebauthn/browser":"13.3.0","class-variance-authority":"^0.7.1","react-syntax-highlighter":"^15.6.6","@fontsource/ibm-plex-mono":"^5.2.7","@fontsource/ibm-plex-sans":"^5.1.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-collapsible":"^1.1.12","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-dropdown-menu":"^2.1.16","@types/react-syntax-highlighter":"^15.5.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","cors":"^2.8.5","vite":"^7.1.2","eslint":"^9.33.0","globals":"^16.3.0","nodemon":"^3.1.7","cross-env":"^7.0.3","@eslint/js":"^9.33.0","typescript":"~5.8.3","@types/node":"^24.3.1","tailwindcss":"^4.0.0","@types/react":"^19.1.10","autoprefixer":"^10.4.21","concurrently":"^9.2.1","@types/adm-zip":"^0.5.7","tw-animate-css":"^1.3.8","workbox-window":"^7.4.0","vite-plugin-pwa":"^1.0.3","@types/react-dom":"^19.1.7","typescript-eslint":"^8.39.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^5.0.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/openchamber_1.9.7_1776581313913_0.4051604675588345","host":"s3://npm-registry-packages-npm-production"}},"1.9.8":{"name":"@cnwanghao/openchamber","version":"1.9.8","_id":"@cnwanghao/openchamber@1.9.8","maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"bin":{"openchamber":"bin/cli.js"},"dist":{"shasum":"753547a1b063c179f67f14da02e92b85a3f34cc6","tarball":"https://registry.npmjs.org/@cnwanghao/openchamber/-/openchamber-1.9.8.tgz","fileCount":282,"integrity":"sha512-nF76cBoZzc9wZENA99SoX00iMPAG+Xv5ziBvRf45atOtztv5pcGnaFlkn4HFWkO5ZiD1O0/oSdCxiIyqpUjb1g==","signatures":[{"sig":"MEUCIEelpuKV+DZqgXFgSbiqk7uaazvKK4KBUnCxo3Qz7rt8AiEA1a9c3w5+I/FyGNy6/Ojtcgyk2Zjri29LrwF8jnP8zDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25076989},"main":"./server/index.js","type":"module","types":"./server/index.d.ts","gitHead":"a09cc7f2de295914942abafbbaaf8e094bb7267d","private":false,"scripts":{"dev":"bun run build:watch","lint":"eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js","build":"vite build","start":"node bin/cli.js serve","dev:server":"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}","type-check":"tsc --noEmit","build:watch":"vite build --watch","dev:server:watch":"nodemon --watch server --ext js --exec \"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}\""},"_npmUser":{"name":"cnwanghao","email":"wanghaody@gmail.com"},"_npmVersion":"11.12.1","description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ws":"^8.18.3","clsx":"^2.1.1","cmdk":"^1.1.1","jose":"^6.1.3","yaml":"^2.8.1","luxon":"^3.5.0","react":"^19.1.1","openai":"^4.79.0","sonner":"^2.0.7","adm-zip":"^0.5.16","bun-pty":"^0.4.5","express":"^5.1.0","zustand":"^5.0.8","node-pty":"1.2.0-beta.12","web-push":"^3.6.7","@ibm/plex":"^6.4.1","react-dom":"^19.1.1","remark-gfm":"^4.0.1","simple-git":"^3.28.0","compression":"^1.8.1","cron-parser":"^4.9.0","ghostty-web":"0.3.0","next-themes":"^0.4.6","jsonc-parser":"^3.3.1","@octokit/rest":"^22.0.1","@clack/prompts":"^1.1.0","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","qrcode-terminal":"^0.12.0","@opencode-ai/sdk":"^1.4.6","@remixicon/react":"^4.7.0","reflect-metadata":"^0.2.2","@codemirror/lang-go":"^6.0.1","strip-json-comments":"^5.0.3","@codemirror/lang-cpp":"^6.0.3","@radix-ui/react-slot":"^1.2.3","http-proxy-middleware":"^3.0.5","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-select":"^2.2.6","@radix-ui/react-toggle":"^1.1.10","@simplewebauthn/server":"13.3.0","@radix-ui/react-tooltip":"^1.2.8","@simplewebauthn/browser":"13.3.0","class-variance-authority":"^0.7.1","react-syntax-highlighter":"^15.6.6","@fontsource/ibm-plex-mono":"^5.2.7","@fontsource/ibm-plex-sans":"^5.1.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-collapsible":"^1.1.12","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-dropdown-menu":"^2.1.16","@types/react-syntax-highlighter":"^15.5.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","cors":"^2.8.5","vite":"^7.1.2","eslint":"^9.33.0","globals":"^16.3.0","nodemon":"^3.1.7","cross-env":"^7.0.3","@eslint/js":"^9.33.0","typescript":"~5.8.3","@types/node":"^24.3.1","tailwindcss":"^4.0.0","@types/react":"^19.1.10","autoprefixer":"^10.4.21","concurrently":"^9.2.1","@types/adm-zip":"^0.5.7","tw-animate-css":"^1.3.8","workbox-window":"^7.4.0","vite-plugin-pwa":"^1.0.3","@types/react-dom":"^19.1.7","typescript-eslint":"^8.39.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^5.0.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/openchamber_1.9.8_1776585493113_0.862920492179498","host":"s3://npm-registry-packages-npm-production"}},"1.9.9":{"name":"@cnwanghao/openchamber","version":"1.9.9","_id":"@cnwanghao/openchamber@1.9.9","maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"bin":{"openchamber":"bin/cli.js"},"dist":{"shasum":"31b8b8474d6978afb85b66de9c9d3fd643189058","tarball":"https://registry.npmjs.org/@cnwanghao/openchamber/-/openchamber-1.9.9.tgz","fileCount":282,"integrity":"sha512-vPowMe2Fvx98fnvwgM/H98PUwN1U3VKbwJnAtK6S5AvSAMRZESU8Wadiw+zjR4a5kCBHHCYz7wq9kBTBkpA8gA==","signatures":[{"sig":"MEUCIDfqT1HIrK6+Aa38EFL6+0m3aWkuLXZVPfeM5tvWKr8tAiEA0CqxH599qIMD9YkPBUvpPYC3oGbBSn7UD7WkDCW0tDU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25077754},"main":"./server/index.js","type":"module","types":"./server/index.d.ts","gitHead":"a09cc7f2de295914942abafbbaaf8e094bb7267d","private":false,"scripts":{"dev":"bun run build:watch","lint":"eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js","build":"vite build","start":"node bin/cli.js serve","dev:server":"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}","type-check":"tsc --noEmit","build:watch":"vite build --watch","dev:server:watch":"nodemon --watch server --ext js --exec \"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}\""},"_npmUser":{"name":"cnwanghao","email":"wanghaody@gmail.com"},"_npmVersion":"11.12.1","description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ws":"^8.18.3","clsx":"^2.1.1","cmdk":"^1.1.1","jose":"^6.1.3","yaml":"^2.8.1","luxon":"^3.5.0","react":"^19.1.1","openai":"^4.79.0","sonner":"^2.0.7","adm-zip":"^0.5.16","bun-pty":"^0.4.5","express":"^5.1.0","zustand":"^5.0.8","node-pty":"1.2.0-beta.12","web-push":"^3.6.7","@ibm/plex":"^6.4.1","react-dom":"^19.1.1","remark-gfm":"^4.0.1","simple-git":"^3.28.0","compression":"^1.8.1","cron-parser":"^4.9.0","ghostty-web":"0.3.0","next-themes":"^0.4.6","jsonc-parser":"^3.3.1","@octokit/rest":"^22.0.1","@clack/prompts":"^1.1.0","react-markdown":"^10.1.0","tailwind-merge":"^3.3.1","qrcode-terminal":"^0.12.0","@opencode-ai/sdk":"^1.4.6","@remixicon/react":"^4.7.0","reflect-metadata":"^0.2.2","@codemirror/lang-go":"^6.0.1","strip-json-comments":"^5.0.3","@codemirror/lang-cpp":"^6.0.3","@radix-ui/react-slot":"^1.2.3","http-proxy-middleware":"^3.0.5","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-select":"^2.2.6","@radix-ui/react-toggle":"^1.1.10","@simplewebauthn/server":"13.3.0","@radix-ui/react-tooltip":"^1.2.8","@simplewebauthn/browser":"13.3.0","class-variance-authority":"^0.7.1","react-syntax-highlighter":"^15.6.6","@fontsource/ibm-plex-mono":"^5.2.7","@fontsource/ibm-plex-sans":"^5.1.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-collapsible":"^1.1.12","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-dropdown-menu":"^2.1.16","@types/react-syntax-highlighter":"^15.5.13"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","cors":"^2.8.5","vite":"^7.1.2","eslint":"^9.33.0","globals":"^16.3.0","nodemon":"^3.1.7","cross-env":"^7.0.3","@eslint/js":"^9.33.0","typescript":"~5.8.3","@types/node":"^24.3.1","tailwindcss":"^4.0.0","@types/react":"^19.1.10","autoprefixer":"^10.4.21","concurrently":"^9.2.1","@types/adm-zip":"^0.5.7","tw-animate-css":"^1.3.8","workbox-window":"^7.4.0","vite-plugin-pwa":"^1.0.3","@types/react-dom":"^19.1.7","typescript-eslint":"^8.39.1","@tailwindcss/postcss":"^4.0.0","@vitejs/plugin-react":"^5.0.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/openchamber_1.9.9_1776588411179_0.6688162646891493","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@cnwanghao/openchamber","version":"1.10.0","private":false,"type":"module","main":"./server/index.js","types":"./server/index.d.ts","bin":{"openchamber":"bin/cli.js"},"publishConfig":{"access":"public"},"scripts":{"dev":"bun run build:watch","dev:server":"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}","dev:server:watch":"nodemon --watch server --ext js --exec \"bun server/index.js --port ${OPENCHAMBER_PORT:-3001}\"","build":"vite build","build:watch":"vite build --watch","type-check":"tsc --noEmit","lint":"eslint \"./src/**/*.{ts,tsx}\" --config ../../eslint.config.js","start":"node bin/cli.js serve"},"dependencies":{"@clack/prompts":"^1.1.0","@codemirror/lang-cpp":"^6.0.3","@codemirror/lang-go":"^6.0.1","@fontsource/ibm-plex-mono":"^5.2.7","@fontsource/ibm-plex-sans":"^5.1.1","@ibm/plex":"^6.4.1","@octokit/rest":"^22.0.1","@opencode-ai/sdk":"^1.4.6","@radix-ui/react-collapsible":"^1.1.12","@radix-ui/react-dialog":"^1.1.15","@radix-ui/react-dropdown-menu":"^2.1.16","@radix-ui/react-scroll-area":"^1.2.10","@radix-ui/react-select":"^2.2.6","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-toggle":"^1.1.10","@radix-ui/react-tooltip":"^1.2.8","@remixicon/react":"^4.7.0","@simplewebauthn/browser":"13.3.0","@simplewebauthn/server":"13.3.0","@types/react-syntax-highlighter":"^15.5.13","adm-zip":"^0.5.16","bun-pty":"^0.4.5","class-variance-authority":"^0.7.1","clsx":"^2.1.1","cmdk":"^1.1.1","compression":"^1.8.1","cron-parser":"^4.9.0","express":"^5.1.0","ghostty-web":"0.3.0","http-proxy-middleware":"^3.0.5","jose":"^6.1.3","jsonc-parser":"^3.3.1","luxon":"^3.5.0","next-themes":"^0.4.6","node-pty":"1.2.0-beta.12","openai":"^4.79.0","qrcode-terminal":"^0.12.0","react":"^19.1.1","react-dom":"^19.1.1","react-markdown":"^10.1.0","react-syntax-highlighter":"^15.6.6","reflect-metadata":"^0.2.2","remark-gfm":"^4.0.1","simple-git":"^3.28.0","sonner":"^2.0.7","strip-json-comments":"^5.0.3","tailwind-merge":"^3.3.1","web-push":"^3.6.7","ws":"^8.18.3","yaml":"^2.8.1","zustand":"^5.0.8"},"devDependencies":{"@eslint/js":"^9.33.0","@tailwindcss/postcss":"^4.0.0","@types/adm-zip":"^0.5.7","@types/node":"^24.3.1","@types/react":"^19.1.10","@types/react-dom":"^19.1.7","@vitejs/plugin-react":"^5.0.0","autoprefixer":"^10.4.21","concurrently":"^9.2.1","cors":"^2.8.5","cross-env":"^7.0.3","eslint":"^9.33.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20","globals":"^16.3.0","nodemon":"^3.1.7","tailwindcss":"^4.0.0","tsx":"^4.20.6","tw-animate-css":"^1.3.8","typescript":"~5.8.3","typescript-eslint":"^8.39.1","vite":"^7.1.2","vite-plugin-pwa":"^1.0.3","workbox-window":"^7.4.0"},"gitHead":"9e05f337a1d238e8a098df342b3bebfe6a8044ce","_id":"@cnwanghao/openchamber@1.10.0","description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-dMmmDadYYBHRe/UvTQk6e/haQgzy+eELnCveXQovRRzRYhcO5ChjBzeAOPcjyv4nMDdSkFBFr05dzvz1BGpzdQ==","shasum":"5095e6cfe646e72559ada75cd4673971b935d138","tarball":"https://registry.npmjs.org/@cnwanghao/openchamber/-/openchamber-1.10.0.tgz","fileCount":282,"unpackedSize":25017762,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHo1WwnP0godsT5tnjbAFvx9A1PUr2NEmx3ZF/6G4FHOAiBA6uAjHEBBYGlppdFHpMNH2Q9IrGvxfpFTwKonNuxtYg=="}]},"_npmUser":{"name":"cnwanghao","email":"wanghaody@gmail.com"},"directories":{},"maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openchamber_1.10.0_1776913528205_0.852810798373715"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-18T09:02:38.078Z","modified":"2026-04-23T03:05:28.682Z","1.9.6":"2026-04-18T09:02:38.550Z","1.9.7":"2026-04-19T06:48:34.228Z","1.9.8":"2026-04-19T07:58:13.442Z","1.9.9":"2026-04-19T08:46:51.494Z","1.10.0":"2026-04-23T03:05:28.579Z"},"description":"[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1Ni","maintainers":[{"name":"cnwanghao","email":"wanghaody@gmail.com"}],"readme":"# <picture><source media=\"(prefers-color-scheme: dark)\" srcset=\"https://github.com/btriapitsyn/openchamber/raw/HEAD/docs/references/badges/openchamber-logo-dark.svg\"><img src=\"https://github.com/btriapitsyn/openchamber/raw/HEAD/docs/references/badges/openchamber-logo-light.svg\" width=\"32\" height=\"32\" align=\"absmiddle\" /></picture> @openchamber/web\n\n[![GitHub stars](https://img.shields.io/github/stars/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1NiAyNTYiPjxwYXRoIGQ9Ik0yMjkuMDYsMTA4Ljc5bC00OC43LDQyLDE0Ljg4LDYyLjc5YTguNCw4LjQsMCwwLDEtMTIuNTIsOS4xN0wxMjgsMTg5LjA5LDczLjI4LDIyMi43NGE4LjQsOC40LDAsMCwxLTEyLjUyLTkuMTdsMTQuODgtNjIuNzktNDguNy00MkE4LjQ2LDguNDYsMCwwLDEsMzEuNzMsOTRMOTUuNjQsODguOGwyNC42Mi01OS42YTguMzYsOC4zNiwwLDAsMSwxNS40OCwwbDI0LjYyLDU5LjZMMjI0LjI3LDk0QTguNDYsOC40NiwwLDAsMSwyMjkuMDYsMTA4Ljc5WiIgb3BhY2l0eT0iMC4yIj48L3BhdGg%2BPHBhdGggZD0iTTIzOS4xOCw5Ny4yNkExNi4zOCwxNi4zOCwwLDAsMCwyMjQuOTIsODZsLTU5LTQuNzZMMTQzLjE0LDI2LjE1YTE2LjM2LDE2LjM2LDAsMCwwLTMwLjI3LDBMOTAuMTEsODEuMjMsMzEuMDgsODZhMTYuNDYsMTYuNDYsMCwwLDAtOS4zNywyOC44Nmw0NSwzOC44M0w1MywyMTEuNzVhMTYuMzgsMTYuMzgsMCwwLDAsMjQuNSwxNy44MkwxMjgsMTk4LjQ5bDUwLjUzLDMxLjA4QTE2LjQsMTYuNCwwLDAsMCwyMDMsMjExLjc1bC0xMy43Ni01OC4wNyw0NS0zOC44M0ExNi40MywxNi40MywwLDAsMCwyMzkuMTgsOTcuMjZabS0xNS4zNCw1LjQ3LTQ4LjcsNDJhOCw4LDAsMCwwLTIuNTYsNy45MWwxNC44OCw2Mi44YS4zNy4zNywwLDAsMS0uMTcuNDhjLS4xOC4xNC0uMjMuMTEtLjM4LDBsLTU0LjcyLTMzLjY1YTgsOCwwLDAsMC04LjM4LDBMNjkuMDksMjE1Ljk0Yy0uMTUuMDktLjE5LjEyLS4zOCwwYS4zNy4zNywwLDAsMS0uMTctLjQ4bDE0Ljg4LTYyLjhhOCw4LDAsMCwwLTIuNTYtNy45MWwtNDguNy00MmMtLjEyLS4xLS4yMy0uMTktLjEzLS41cy4xOC0uMjcuMzMtLjI5bDYzLjkyLTUuMTZBOCw4LDAsMCwwLDEwMyw5MS44NmwyNC42Mi01OS42MWMuMDgtLjE3LjExLS4yNS4zNS0uMjVzLjI3LjA4LjM1LjI1TDE1Myw5MS44NmE4LDgsMCwwLDAsNi43NSw0LjkybDYzLjkyLDUuMTZjLjE1LDAsLjI0LDAsLjMzLjI5UzIyNCwxMDIuNjMsMjIzLjg0LDEwMi43M1oiPjwvcGF0aD48L3N2Zz4%3D&logoColor=FFFCF0&labelColor=100F0F&color=66800B)](https://github.com/btriapitsyn/openchamber/stargazers)\n[![GitHub release](https://img.shields.io/github/v/release/btriapitsyn/openchamber?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YxZWNlYyIgdmlld0JveD0iMCAwIDI1NiAyNTYiPjxwYXRoIGQ9Ik0xMjgsMTI5LjA5VjIzMmE4LDgsMCwwLDEtMy44NC0xbC04OC00OC4xOGE4LDgsMCwwLDEtNC4xNi03VjgwLjE4YTgsOCwwLDAsMSwuNy0zLjI1WiIgb3BhY2l0eT0iMC4yIj48L3BhdGg%2BPHBhdGggZD0iTTIyMy42OCw2Ni4xNSwxMzUuNjgsMThhMTUuODgsMTUuODgsMCwwLDAtMTUuMzYsMGwtODgsNDguMTdhMTYsMTYsMCwwLDAtOC4zMiwxNHY5NS42NGExNiwxNiwwLDAsMCw4LjMyLDE0bDg4LDQ4LjE3YTE1Ljg4LDE1Ljg4LDAsMCwwLDE1LjM2LDBsODgtNDguMTdhMTYsMTYsMCwwLDAsOC4zMi0xNFY4MC4xOEExNiwxNiwwLDAsMCwyMjMuNjgsNjYuMTVaTTEyOCwzMmw4MC4zNCw0NC0yOS43NywxNi4zLTgwLjM1LTQ0Wk0xMjgsMTIwLDQ3LjY2LDc2bDMzLjktMTguNTYsODAuMzQsNDRaTTQwLDkwbDgwLDQzLjc4djg1Ljc5TDQwLDE3NS44MlptMTc2LDg1Ljc4aDBsLTgwLDQzLjc5VjEzMy44MmwzMi0xNy41MVYxNTJhOCw4LDAsMCwwLDE2LDBWMTA3LjU1TDIxNiw5MHY4NS43N1oiPjwvcGF0aD48L3N2Zz4%3D&logoColor=FFFCF0&labelColor=100F0F&color=205EA6)](https://github.com/btriapitsyn/openchamber/releases/latest)\n[![Discord](https://img.shields.io/badge/Discord-join.svg?style=flat&labelColor=100F0F&color=8B7EC8&logo=discord&logoColor=FFFCF0)](https://discord.gg/ZYRSdnwwKA)\n\nRun [OpenCode](https://opencode.ai) in your browser. Install the CLI, open `localhost:3000`, done. Works on desktop browsers, tablets, and phones as a PWA.\n\nFull project overview, screenshots, and all features: [github.com/btriapitsyn/openchamber](https://github.com/btriapitsyn/openchamber)\n\n## Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/btriapitsyn/openchamber/main/scripts/install.sh | bash\n```\n\nOr install manually: `bun add -g @openchamber/web` (or npm, pnpm, yarn).\n\n> **Prerequisites:** [OpenCode CLI](https://opencode.ai) installed, Node.js 20+.\n\n## Usage\n\n```bash\nopenchamber                          # Start on port 3000\nopenchamber --port 8080              # Custom port\nopenchamber --ui-password secret     # Password-protect UI\nopenchamber tunnel help              # Tunnel lifecycle commands\nopenchamber tunnel providers         # Show provider capabilities\nopenchamber tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token <token>\nopenchamber tunnel start --profile prod-main\nopenchamber tunnel start --provider cloudflare --mode quick --qr\nopenchamber tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml\nopenchamber tunnel status --all      # Show tunnel state across instances\nopenchamber tunnel stop --port 3000  # Stop tunnel only (server stays running)\nopenchamber logs                     # Follow latest instance logs\nOPENCODE_PORT=4096 OPENCODE_SKIP_START=true openchamber                    # Connect to external OpenCode server\nOPENCODE_HOST=https://myhost:4096 OPENCODE_SKIP_START=true openchamber  # Connect via custom host/HTTPS\nopenchamber stop                     # Stop server\nopenchamber update                   # Update to latest version\n```\n\n### Tunnel behavior notes\n\n- One active tunnel per running OpenChamber instance (port).\n- Starting a different tunnel mode/provider on the same instance replaces the active tunnel.\n- Replacing or stopping a tunnel revokes existing connect links and invalidates remote tunnel sessions.\n- Connect links are one-time tokens; generating a new link revokes the previous unused link.\n\n<details>\n<summary>Connect to external OpenCode server</summary>\n\n```bash\nOPENCODE_PORT=4096 OPENCODE_SKIP_START=true openchamber\nOPENCODE_HOST=https://myhost:4096 OPENCODE_SKIP_START=true openchamber\n```\n\n| Variable | Description |\n|----------|-------------|\n| `OPENCODE_HOST` | Full base URL of external server (overrides `OPENCODE_PORT`) |\n| `OPENCODE_PORT` | Port of external server |\n| `OPENCODE_SKIP_START` | Skip starting embedded OpenCode server |\n| `OPENCHAMBER_OPENCODE_HOSTNAME` | Bind hostname for managed OpenCode server (default: `127.0.0.1`, use `0.0.0.0` for LAN/remote access — trusted networks only) |\n\n</details>\n\n<details>\n<summary>Bind managed OpenCode to LAN / Tailscale</summary>\n\n```bash\nOPENCHAMBER_OPENCODE_HOSTNAME=0.0.0.0 openchamber --port 3000\n```\n\n**Security note:** binding to `0.0.0.0` exposes the server on all network interfaces — use only on trusted networks and protect with firewall rules or `--ui-password`.\n\n</details>\n\n**Optional env vars:**\n```yaml\nenvironment:\n  UI_PASSWORD: your_secure_password\n  OPENCHAMBER_TUNNEL_MODE: quick # quick | managed-remote | managed-local\n  OPENCHAMBER_TUNNEL_PROVIDER: cloudflare\n```\n\nFor `managed-remote` mode, also set:\n\n```yaml\nenvironment:\n  OPENCHAMBER_TUNNEL_MODE: managed-remote\n  OPENCHAMBER_TUNNEL_HOSTNAME: app.example.com\n  OPENCHAMBER_TUNNEL_TOKEN: <token>\n```\n\nFor `managed-local` mode, you can set:\n\n```yaml\nenvironment:\n  OPENCHAMBER_TUNNEL_MODE: managed-local\n  OPENCHAMBER_TUNNEL_CONFIG: /home/openchamber/.cloudflared/config.yml\n```\n\nManaged-local path note: `OPENCHAMBER_TUNNEL_CONFIG` must use a container path under `/home/openchamber/...`. If the config file references `credentials-file`, ensure that JSON path is also mounted and reachable inside the container.\n\n**Data directory:** mount `data/` for persistent storage. Ensure permissions:\n```bash\nmkdir -p data/openchamber data/opencode/share data/opencode/config data/ssh\nchown -R 1000:1000 data/\n```\n\n</details>\n\n<details>\n<summary>Background & daemon mode</summary>\n\n```bash\nopenchamber             # Runs in background by default\nopenchamber stop        # Stop background server\n```\n\n</details>\n\n<details>\n<summary>systemd service (VPN / LAN access)</summary>\n\nUse `--foreground` to keep the CLI process alive so systemd (or any other process manager) can track and restart it. Combine with `OPENCODE_HOST` to connect to an OpenCode instance running as a separate service.\n\n**`~/.config/systemd/user/opencode.service`**\n```ini\n[Unit]\nDescription=OpenCode Server\n\n[Service]\nType=simple\nExecStart=opencode serve --port 4095\nEnvironment=\"PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/home/YOU/.local/bin:/home/YOU/.npm-global/bin:/usr/local/bin:/usr/bin:/bin\"\nEnvironment=SSH_AUTH_SOCK=%t/ssh-agent.socket\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n```\n\n> **Why set `PATH` and `SSH_AUTH_SOCK`?**\n> systemd user services start with a minimal environment — no shell profile is sourced.\n> Without an explicit `PATH`, OpenCode won't find tools installed via Homebrew, npm, or `~/.local/bin`.\n> Without `SSH_AUTH_SOCK`, git operations over SSH (push, pull, clone) will fail.\n> `%t` expands to `$XDG_RUNTIME_DIR` (e.g. `/run/user/1000`), where most SSH agents write their socket.\n\n**`~/.config/systemd/user/openchamber.service`**\n```ini\n[Unit]\nDescription=OpenChamber Web Server\nAfter=opencode.service\n\n[Service]\nType=simple\nExecStart=openchamber serve --port 3000 --host 0.0.0.0 --ui-password your-password --foreground\nEnvironment=\"OPENCODE_HOST=http://localhost:4095\"\nEnvironment=\"OPENCODE_SKIP_START=true\"\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n```\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now opencode openchamber\n```\n\n`--host 0.0.0.0` is required to listen on all interfaces (the default is `127.0.0.1`). Use `--host <ip>` or `OPENCHAMBER_HOST=<ip>` to bind to a specific interface instead.\n\n</details>\n\n## What makes the web version special\n\n- **Remote access** - Cloudflare tunnel with QR onboarding. Scan from your phone, start coding.\n- **Mobile-first PWA** - optimized chat controls, keyboard-safe layouts, drag-to-reorder projects\n- **Background notifications** - know when your agent finishes, even from another tab\n- **Self-update** - update and restart from the UI, server settings stay intact\n- **Cross-tab tracking** - session activity stays in sync across browser tabs\n\n- Cloudflare tunnel access with quick, managed-remote, and managed-local modes\n- One-scan onboarding with tunnel QR + password URL helpers\n- Mobile-first experience: optimized chat controls, keyboard-safe layouts, and attachment-friendly UI\n- Background notifications plus reliable cross-tab session activity tracking\n- Built-in self-update + restart flow that keeps your server settings intact\n\n## License\n\nMIT\n","readmeFilename":"README.md"}