{"versions":{"1.0.13":{"name":"@askjo/camofox-browser","version":"1.0.13","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","dotenv":"^17.2.3","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"f357e5dd23b5e1230e73d6b849160dbc30de82bb","_id":"@askjo/camofox-browser@1.0.13","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-/CZQVHPJPPMJWPC3NgIcF1DZXZQECWXm9hx65+LjMO/mOLCGumzEbotq7jXfL66GKhSCTMW4z/x9ZiAWKNAfBg==","shasum":"8e1163dc02aec7f2392b025d2e00ba214ff941a4","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.0.13.tgz","fileCount":9,"unpackedSize":77720,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDme1BAhFtklzd5mFhLyz1Ip8gcwmm5cuZrEf/iEgsaigIgTfpJfisVg2OzRoASKbS0lhBpuSPhR4nXVhFPvtIh3Us="}],"size":18896},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.0.13_1770755137710_0.2634528709967796"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-10T20:25:37.860Z","publish_time":1770755137860,"_source_registry_name":"default","contributors":[]},"1.0.12":{"name":"@askjo/camofox-browser","version":"1.0.12","keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"author":{"name":"Jo Inc","email":"oss@askjo.ai"},"license":"MIT","_id":"@askjo/camofox-browser@1.0.12","maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"homepage":"https://github.com/jo-inc/camofox-browser#readme","bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"dist":{"shasum":"7d8f1e3b00f43b5a6fb633b12c67e568f6211e9a","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.0.12.tgz","fileCount":9,"integrity":"sha512-E6423YURNEA6216SUV5YKaJ1J/zEcav01umwN1wPiAwcIJ08DbTZtAUw/XyaHCy1bqyxreyV8Q/zT2XtbxsJeQ==","signatures":[{"sig":"MEUCIQCu7Gy3mg4J4Uxy+30KHIGgziZR/JhjYy4p+fP3GQpKWQIgJ9DvR7CRQnpOxqIdoY0pHROiLtKem+AG+o/z/a4/K3A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76085,"size":18408},"main":"server-camoufox.js","engines":{"node":">=18"},"gitHead":"bfd34b8f05d8eac8bec1655347bd23db30c0b59c","scripts":{"test":"jest --runInBand --forceExit","start":"node server-camoufox.js","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true","start:chrome":"node server.js"},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/jo-inc/camofox-browser.git","type":"git"},"_npmVersion":"11.9.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","directories":{},"_nodeVersion":"24.10.0","dependencies":{"dotenv":"^17.2.3","express":"^4.18.2","playwright":"^1.50.0","camoufox-js":"^0.8.5","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.0.12_1770742621288_0.6079947020272474","host":"s3://npm-registry-packages-npm-production"},"_cnpmcore_publish_time":"2026-02-10T16:57:01.451Z","publish_time":1770742621451,"_source_registry_name":"default","contributors":[]},"1.0.14":{"name":"@askjo/camofox-browser","version":"1.0.14","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"29d80b5b58928218a20d809a49988b92795a3f33","_id":"@askjo/camofox-browser@1.0.14","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-uVpexqRJ4F0MLi5GD4v3Jdxkx+sVcNK2QjAKqYTKlpKRo1o9yh7AHwmKDHiDiyGuExp/HmbkXiFNLNhSYMB/nw==","shasum":"8dc1baef7b8f1e9951e9c5f220d442db8d693bb4","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.0.14.tgz","fileCount":9,"unpackedSize":78545,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGG+Lv5YYTYh5wqTt+hxZpU/MsIUjqTaZhoin39DUOHWAiEA6bryvoo79+aOTCQa3HPotL+1i5xknApOLfTpPydAkDg="}],"size":19202},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.0.14_1770852809361_0.607208693984711"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-11T23:33:29.502Z","publish_time":1770852809502,"_source_registry_name":"default","contributors":[]},"1.1.0":{"name":"@askjo/camofox-browser","version":"1.1.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"9cbc54161226aa0491a9e0091356e6b78299f75b","_id":"@askjo/camofox-browser@1.1.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-lszuvm9Dmj42Qnoo6gNgbk3vWkT9Y52lPPYz7TUjRZTCHerHb53iqBwXtdhykST1gjBvOmf9irg5A4OmpA/VvQ==","shasum":"58bfe648f4dd3822b533d4d48cd85dcef614323f","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.1.0.tgz","fileCount":9,"unpackedSize":94936,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDFKA9cPUZpVVs6qTF4XvvLRA9WZ4p6M5Qzqjwt3R+G1AIhANselKVB3chrKguyPJ+JAKRa425nMsFdYc6IauHCmF7a"}],"size":23745},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.1.0_1770884921281_0.3547641087882545"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-12T08:28:41.447Z","publish_time":1770884921447,"_source_registry_name":"default","contributors":[]},"1.1.1":{"name":"@askjo/camofox-browser","version":"1.1.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"dca6ab8ad8c1e11c2fb8aed1f05a3a75dada0d90","_id":"@askjo/camofox-browser@1.1.1","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-emVktao5KvfxCA6pKgTYc2zV0nWsN3bFZMyj6XewpOaGuoD3aCNZ53Wi92wqHR363YkFcBUkSu5yPIePaRPFgA==","shasum":"f3fb39c6ed95240312490c51e27166669dcf6766","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.1.1.tgz","fileCount":9,"unpackedSize":97030,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHuSv590HCNS/kT8V9NgqdVzQJHuhAqNh+qZRIFlFr0LAiEAy4BDfd95N2jnhRuB/8hPiQIqjKRtw5DYSKpR1fh1LQ0="}],"size":24505},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.1.1_1770885880968_0.8912621339048961"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-12T08:44:41.119Z","publish_time":1770885881119,"_source_registry_name":"default","contributors":[]},"1.1.2":{"name":"@askjo/camofox-browser","version":"1.1.2","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"e730735f8136862587646fb90b5cb3587ce93afa","_id":"@askjo/camofox-browser@1.1.2","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-yXw9exddcWBbtRUDITsvKOJG6jPbNpiwdgUATtpDm36SOmv0ax+ZlKjoEeuDn1In8JW576roExcyXSMKMN65KA==","shasum":"aa46a15d4cd2b9faf9ebd9e9d911df9e65e70967","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.1.2.tgz","fileCount":12,"unpackedSize":99569,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCyQMua9vM8xKFuXdCbjdPkYUhQGZPq2JjBwgAtubwaSwIhAJcaaZlEyBHAAwKvDXQUATqjaUqs3Y+46oMm7jCkNvev"}],"size":25378},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.1.2_1770888426025_0.6468938194050584"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-12T09:27:06.160Z","publish_time":1770888426160,"_source_registry_name":"default","contributors":[]},"1.2.0":{"name":"@askjo/camofox-browser","version":"1.2.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0"},"gitHead":"7895afad1e5f352c2e1516e1061aef4a33a13f2f","_id":"@askjo/camofox-browser@1.2.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-kLDsxk/uaj1gKT7iyhHMRc6qNp0CGYfir4pVBYd29Q2Yy0Bk1503Jxnl9cwEpr9qAIUzNUjJqYxH3/wGPCfguw==","shasum":"ac28bbbbe71d64f0cb0090e4df1e0d1d5ec92fff","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.2.0.tgz","fileCount":12,"unpackedSize":106217,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDR0JjMdZV5u/THj7n5z5odO+I9GS/ihWWdGIvHjBRe5wIhAJQ7tO/ROaNvfiOujs/E5yS4Q30Ku2xdNoHWrUsi6Tef"}],"size":27079},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.2.0_1771312513712_0.9397923239257167"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-17T07:15:13.836Z","publish_time":1771312513836,"_source_registry_name":"default","contributors":[]},"1.3.0":{"name":"@askjo/camofox-browser","version":"1.3.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"af618d3d9a1a5da1a8e81f2134e9133d5fb12bc5","_id":"@askjo/camofox-browser@1.3.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-px/PdUCXLy1ViGQj/DLpADMVcGsVCQgoeY+uBWgKk4sGGLS7PHpXx5wwSeVbNlYrgh0P9+7AN6I9iy17pWdcRg==","shasum":"706dd3be36268598efc74803a67658b91a10b695","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.3.0.tgz","fileCount":13,"unpackedSize":129895,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH6AVkp0Enomlib5ogpGYm3yheg3+AZ3xH/Xddx4F1m/AiEAzHCwqvWbn64W67OAOhBqeuo9M/OAGynelqEbh0hjFww="}],"size":33422},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.3.0_1771719935486_0.8569786686749716"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-22T00:25:35.637Z","publish_time":1771719935637,"_source_registry_name":"default","contributors":[]},"1.3.1":{"name":"@askjo/camofox-browser","version":"1.3.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"jest --runInBand --forceExit","test:e2e":"jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --forceExit","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"908482561f8dab6915844ad1f4926fc0bd8c9c37","_id":"@askjo/camofox-browser@1.3.1","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-IGDMXhI/DrCvXNSCrUKJ42fwXN/uv+/THW9mIQbdUlXxyGJ0WsAvxdu8R4h1thH47g3qQh7zqttRFy73zhwk0A==","shasum":"ae8ab1f82c152000e8d94619e25e165574851c4b","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.3.1.tgz","fileCount":14,"unpackedSize":129917,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHurGeo6XBhhj7671m42bPA1OKvnNPIjVg5yPZZ1ZEOXAiEAlKDzcCgRD4V3WJJHPnhK8ZHvm5jHAovD8wJqshdJdBY="}],"size":33540},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.3.1_1771823633006_0.1413787267638993"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-02-23T05:13:53.154Z","publish_time":1771823633154,"_source_registry_name":"default","contributors":[]},"1.4.0":{"name":"@askjo/camofox-browser","version":"1.4.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"174904f3c9382cebc4cc8ace8e8cfdcfc71d88e8","_id":"@askjo/camofox-browser@1.4.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-cB2IbS6Sgc2k2reL16fCyvaX1SUfqNKwbEnY63KIFdUba6+Xabxnue8RKk/GCoxQvvBqxaazVlISLQxLQuKByA==","shasum":"976f019f1b25f65b1374170dae892fd28aab2bd0","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.4.0.tgz","fileCount":16,"unpackedSize":171251,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICIIqyZi8/CWNXcTrydAhPn3QfiVweuHTnBpAxz4qlRWAiEA4KFckKnPJXPEYDQly7KJFppkCDQN8QZ+4zQfWi9Ynvc="}],"size":43352},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.4.0_1773032252056_0.2605418512917448"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-03-09T04:57:32.251Z","publish_time":1773032252251,"_source_registry_name":"default","contributors":[]},"1.4.1":{"name":"@askjo/camofox-browser","version":"1.4.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"91fc2ec45331846fa278677e60416353900e29a9","_id":"@askjo/camofox-browser@1.4.1","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-RcYoaRxstDddnKIksri25bwgI7zwMKSXhtlXrV7f08vkx+pGuX4Gk6LLqTE+Vsbhey9PcuRbrNpSL9ZwGqXUJQ==","shasum":"868bc6307f2056769cb0488b8743993baba29f8a","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.4.1.tgz","fileCount":18,"unpackedSize":178691,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDapbA7E3b+1OLAdr6BlGvozfpcU03Pme+Q6XvJrL2m6AiBnp22heivgHY3Vs4rHuCVsO72Y0OTE8qmTUOIbRAK32w=="}],"size":45527},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.4.1_1774208236630_0.1218100156537969"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-03-22T19:37:16.780Z","publish_time":1774208236780,"_source_registry_name":"default","contributors":[]},"1.5.0":{"name":"@askjo/camofox-browser","version":"1.5.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"0ca91b0fd9846e573ccceb728e81515f387b1c89","_id":"@askjo/camofox-browser@1.5.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-ioTuO8K9mWkibbZbG+43OBOphSmPs0fyKO70LJPk6cH4bDV/Iwp8DHY35Zq+reFRVVhuiD6Z5pXRSAUHwyrZig==","shasum":"1a3d923b7166dea2b47b15fce7af6b61bcc95f42","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.5.0.tgz","fileCount":19,"unpackedSize":216088,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBfH+EfJT/KakI7R5Ag3xSCmTmK5MF9Z/6ccY7H3QOyKAiEA9J5U+/BiVtwywr09yj+gOQCC9puiPc1Edba/yznad7w="}],"size":55160},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.5.0_1775447107333_0.6234920309577325"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-06T03:45:07.524Z","publish_time":1775447107524,"_source_registry_name":"default","contributors":[]},"1.5.1":{"name":"@askjo/camofox-browser","version":"1.5.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"7e0a7cf2170d8fd4a9629520679fabc5fa618395","_id":"@askjo/camofox-browser@1.5.1","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-sUdgSrspNwFWp+wNma6dI+kYm4qIOr9SpCOiuhJoRIFIZBRRh1eLr8ffTHAlqwAPWKm6IrZEyhQlBL96Fey4mw==","shasum":"6cd4363716e2d0574ddd44551ba30fadc5ccf41c","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.5.1.tgz","fileCount":21,"unpackedSize":218806,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCAJmzmNIqkCLsc0DwRM4b37wpJbOvc5z+nCWXIQTThVwIgAN4nFYg86Dqr/IzstLWXWsVa2mfJkaegoiRd/wmN/js="}],"size":55993},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.5.1_1775505158633_0.5837119312256067"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-06T19:52:38.782Z","publish_time":1775505158782,"_source_registry_name":"default","contributors":[]},"1.5.2":{"name":"@askjo/camofox-browser","version":"1.5.2","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"0b077358e082e19f8c53295208c74f3410c359b4","_id":"@askjo/camofox-browser@1.5.2","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-SvRCzhWnJaplxHkRVF9l1OWako6pp2eUw2mZKHOERUfLWDO2Xe/IKI+5bB+UT1TNvO45P6XdhgfAtihcTEARCg==","shasum":"3130215b0100c7d77e541398909bb53f76a9f9d7","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.5.2.tgz","fileCount":21,"unpackedSize":219685,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICHEW4g8XiSWCKmPqkBDv5Gn+xMBXjhUDzGHZ1SrxPUYAiBBL04DKyoMe7EAZhksbkfvY4L/iA0b/6fENsZexJ/2aQ=="}],"size":56211},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.5.2_1775512818135_0.009544913966867297"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-06T22:00:18.304Z","publish_time":1775512818304,"_source_registry_name":"default","contributors":[]},"1.6.0":{"name":"@askjo/camofox-browser","version":"1.6.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"6e5926e2ff2a060bc51dc78c788a76291ef9e232","_id":"@askjo/camofox-browser@1.6.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-A12Zti1fWwqoQU54RBljLDry37hNhoxb7IUz7n8j1laI4cUJRxlMyXOLbOmbbNJaKZVbrWFWOh64pWixUImf6A==","shasum":"385a863f5d1d1fdd3779c953687238a6c07b83ba","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.6.0.tgz","fileCount":47,"unpackedSize":305276,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDfOz6ChYHHWRFpNstiiDzKEgscJczOBVW9v9NGsfzBUwIhAPuLBrqCL/oDMQdY7tClwS/JT4AwP4ch3FfOWedsMS35"}],"size":80273},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.6.0_1776569161356_0.2312963798824339"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-19T03:26:01.490Z","publish_time":1776569161490,"_source_registry_name":"default","contributors":[]},"1.7.0":{"name":"@askjo/camofox-browser","version":"1.7.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"c633f2b8148570b421bb43e07a734820d7c4d6b5","_id":"@askjo/camofox-browser@1.7.0","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-sptzagF8cVYY7WcTBaeO2XhJeaT9+qFt2CglTlqf8hzg+6VX3zQ6vurMUGgkXCypd+Q4VX5M+wnE60gwVYT8Yg==","shasum":"2f548b88479fa0926af4b82cc19a3cd2fb232b37","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.7.0.tgz","fileCount":54,"unpackedSize":406278,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCNjYyU+9TJwKDpbBuvzurYbqeWPDcs0EGyQPs+Sr3HKwIhAO49aVtDYzYWntf+ORi/Fb80lCvFa95hRdn62zvkTwBG"}],"size":104476},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.7.0_1777173157310_0.882890002300551"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-26T03:12:37.458Z","publish_time":1777173157458,"_source_registry_name":"default","contributors":[]},"1.7.1":{"name":"@askjo/camofox-browser","version":"1.7.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"d9b95afaba8a768bcd9fbdef4707a26ef488e7cd","_id":"@askjo/camofox-browser@1.7.1","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-vtWunz1UCu9yvkQ/f7bMJPrCVTuNsJlF9MOpBQrWgXa41r7L0R2yV1LEuHkvcP+wYq8Z1GlcTpVAnv/qn5l1vg==","shasum":"1993f84f687ef9df1d30fef5be01e9575406789a","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.7.1.tgz","fileCount":54,"unpackedSize":405968,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDDX+s6rIqG7UKmlCk+/UXU0BYBCU0TGm5ZIi/8nooMyQIgZ1m2rD3dI5ovqnnuJlip6DTVGdmaetCCahLCGnTKXb4="}],"size":104401},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.7.1_1777174469021_0.44360488098206274"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-26T03:34:29.163Z","publish_time":1777174469163,"_source_registry_name":"default","contributors":[]},"1.7.2":{"name":"@askjo/camofox-browser","version":"1.7.2","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && git add openclaw.plugin.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"99c8fbb0a419069a3ce4aaaa50233f781b15733e","_id":"@askjo/camofox-browser@1.7.2","_nodeVersion":"24.10.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-NUPisT4keQE45wUYb/mmz8+0CjhhxXNIk2rO/I39MSbZSaVNPHjLnYHcydA+HsvfqXW02Ae8t+6yvMc049Tfkg==","shasum":"bd93370dd89de758ae7613e6786668235014f39d","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.7.2.tgz","fileCount":54,"unpackedSize":419790,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCymhZrEScQXfYpqIKUNFLri53VxGEaTK6g21PMAcF5LwIgEcvX/N20S8zhaoSZNlo7Pi6YViWEpRRy7+WTgTX3dh0="}],"size":108052},"_npmUser":{"name":"anonymous","email":"oss+jo@askjo.ai"},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.7.2_1777177060940_0.2783246591967907"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-26T04:17:41.095Z","publish_time":1777177061095,"_source_registry_name":"default","contributors":[]},"1.7.3":{"name":"@askjo/camofox-browser","version":"1.7.3","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"1ff8a1d865db495545abf6f0696c894afd067642","_id":"@askjo/camofox-browser@1.7.3","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-QJtuBAwtqyKz3tlptyoeSP3FHOVtQE0KdWymttbZghrSXlJHybvKJ0zglODl7ZmafaKlVqyzY4nWtfBKFpKeDg==","shasum":"18315a66bba9181b3798871167ade91881eb6c47","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.7.3.tgz","fileCount":54,"unpackedSize":435608,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.7.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBrTJtGLYZ5mSNoCsfLoAQnkftUN+BukksuvQ109jOQIAiEAwWTobYy+zC+nVmFJPdDz3QL5UYvZZuqOeMIfLdqmsVU="}],"size":112673},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.7.3_1777222789957_0.7705534246402419"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-26T16:59:50.093Z","publish_time":1777222790093,"_source_registry_name":"default","contributors":[]},"1.7.4":{"name":"@askjo/camofox-browser","version":"1.7.4","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"923b7be81786d8af8f395797f794b268f05de3b7","_id":"@askjo/camofox-browser@1.7.4","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-bE3TPBttchIO5dvkmYvG6+yOJuIstB2+55w+xXcrdYcmHdvbAxW1O3AsFlAsKab+Q1zK9v8aGcEBnKkvEHPrxg==","shasum":"689cfc0d3368c1a1a082e8e139fe85d49673b744","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.7.4.tgz","fileCount":54,"unpackedSize":436418,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.7.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD/KDQ+bmr0IB+Krc+xQ0gYKUKFo3kEEmjzv4oQ8QZsiAIgOKwbhSnPfbzkLkXqmeZw9Uu6GMLdsiqUZhOHPVmxtFs="}],"size":112941},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.7.4_1777247913205_0.931457806544246"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-26T23:58:33.337Z","publish_time":1777247913337,"_source_registry_name":"default","contributors":[]},"1.8.0":{"name":"@askjo/camofox-browser","version":"1.8.0","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"405b52b2fa01eb18911e1a06d7b07f01f29160cf","_id":"@askjo/camofox-browser@1.8.0","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-W4SmpxZdfz2qGw+Rpa2fzpH0oCCpuYGI9LvSP2g31gX8sKGTwSYIlTThPWtZWHvEHjwS+9COQ0M4LYcMMgUzxg==","shasum":"de1d7a4df3c7a51ba7352ef34115ac1d8824567b","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.0.tgz","fileCount":54,"unpackedSize":440350,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDD7mC0YDxd/a2LY838YPsCWt0iBwcpg6ltX0d8b8wxMAIgAgBg/paOD0AsHdJ0NrxJFJuLblHiCP22D/Ps5qxtm5U="}],"size":114083},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.0_1777320423080_0.8789364326128268"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-27T20:07:03.238Z","publish_time":1777320423238,"_source_registry_name":"default","contributors":[]},"1.8.1":{"name":"@askjo/camofox-browser","version":"1.8.1","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"2cd35b957ede48a2ad601f84a3602eecce6761ea","_id":"@askjo/camofox-browser@1.8.1","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-zJQS8U/y+yIXBu0RVwGe5cwUXWiTlZDps0qqjuqgtNDD0EPhXrFgyH/8TI9w1a6EqSgJI1iqDuZdLYM2iMM1jQ==","shasum":"3198f0bbacb3db495feeb97e21caf5a03613186a","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.1.tgz","fileCount":54,"unpackedSize":440694,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAwZuF09VXRrvOFzJYPBSB44pxuox9aNJncUbh4QqnB0AiAg5tmYRjjK6DUb6KqLdCA9pJ3kLCT1giNhoPyMz8MhkA=="}],"size":114164},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.1_1777396983372_0.6030421536171675"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-28T17:23:03.519Z","publish_time":1777396983519,"_source_registry_name":"default","contributors":[]},"1.8.4":{"name":"@askjo/camofox-browser","version":"1.8.4","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"}},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"05abe9e964686ac6eeea4755bab5baffdf3da9a2","_id":"@askjo/camofox-browser@1.8.4","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-kG3EOoSrsLj9tCtPzQxpzOfk2TFy4EZo3xlwQIMJ0XvUsc+YZ6vHC4yXBc+YwCCaHTMXOT5YIQVrEOSDC20q3A==","shasum":"900b2e65891550e8e6660964882fcc5405e8525a","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.4.tgz","fileCount":55,"unpackedSize":440041,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBfbH2E7XoLDW3jhSCfXJUIr0m2YzHkLl6A1AKAXUsDUAiB9Uk6CU6E650VkBDcYRXP+CBkVAUNASk1bGS0bXoj0jg=="}],"size":112692},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.4_1777415500207_0.4803363204668656"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-28T22:31:40.342Z","publish_time":1777415500342,"_source_registry_name":"default","contributors":[]},"1.8.7":{"name":"@askjo/camofox-browser","version":"1.8.7","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"}},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"6f4d99c9de7fad34b8e26d3afac1fcd37ff1d8c9","_id":"@askjo/camofox-browser@1.8.7","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-4T3k+MHFngEqgzIDes8Qi96ONLp5D8OGdIjPT/dQdSw1BwXFzSce5rkBgKTIJ5TNdj3lWopq4FO/joknAAdg5w==","shasum":"fce11bf56a81337a2a2e437885fcbead4c18befc","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.7.tgz","fileCount":55,"unpackedSize":440498,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCtdOoRDT9eyupTgPDFPwVLbHKNwkhwLVwa/JafGPJ7AgIgapm4ad+ptAe7LoN8bs+BUPK3e7nYDoTY/XmaKTWUF/Q="}],"size":112595},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.7_1777417061639_0.616418253079881"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-28T22:57:41.803Z","publish_time":1777417061803,"_source_registry_name":"default","contributors":[]},"1.8.8":{"name":"@askjo/camofox-browser","version":"1.8.8","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"}},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"39eb981a4707e1be7743c0be4a6bd7b3f2143f60","_id":"@askjo/camofox-browser@1.8.8","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-p4O9S5cirxGNbRfr2GYjhfpwnAGNrxmn9JIHHIskOxWK986sq4sZOZz7m9LvwV3NUA+KvtEFWOdquEwv+BED9g==","shasum":"d3d3f4e5e7fecc410032fb1d060e93f80f9c9ad7","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.8.tgz","fileCount":55,"unpackedSize":441583,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCR681mYTDjJyNw48GJLyCf1G7lg6mefIqRsxEQqxdIqAIhAJNX1XqRgVm0GPOSbf83HCTFbMzAOGsXmUzB6k5YmJp1"}],"size":112818},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.8_1777417731595_0.9119042868561886"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-28T23:08:51.748Z","publish_time":1777417731748,"_source_registry_name":"default","contributors":[]},"1.8.9":{"name":"@askjo/camofox-browser","version":"1.8.9","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"}},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"795c2c65e1a41acde2fbee5ece556ebd71e80dba","_id":"@askjo/camofox-browser@1.8.9","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-9LsktfBrJCnboYRwZuluhYLA/JQgEC8AbDCSVjrSkiuJ9EMO5cfg134MSOjXMuUThQNMCTYRudtWxyJB8oTbag==","shasum":"86e6cec349cda44e50f9e730ef94394fe7edc174","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.9.tgz","fileCount":55,"unpackedSize":441313,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCsFxhEzepH/+7PNE8KQZZDrX0Jyacr0SnE3TKs9DkiZAIgfl8aHJ4f7dxiB8e8h6DwCt94On+fBdlBCslC7S08kw8="}],"size":112743},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.9_1777418149699_0.3892507674708794"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-28T23:15:49.852Z","publish_time":1777418149852,"_source_registry_name":"default","contributors":[]},"1.8.11":{"name":"@askjo/camofox-browser","version":"1.8.11","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"},"tools":[{"name":"camofox_create_tab","description":"Open a new browser tab at a URL"},{"name":"camofox_snapshot","description":"Get accessibility snapshot with element refs"},{"name":"camofox_click","description":"Click an element by ref or CSS selector"},{"name":"camofox_type","description":"Type text into an element"},{"name":"camofox_navigate","description":"Navigate to URL or search macro"},{"name":"camofox_scroll","description":"Scroll page up/down/left/right"},{"name":"camofox_screenshot","description":"Capture page screenshot"},{"name":"camofox_close_tab","description":"Close a browser tab"},{"name":"camofox_list_tabs","description":"List open tabs for a user"},{"name":"camofox_import_cookies","description":"Import Netscape cookie file (requires CAMOFOX_API_KEY)"}]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"e1777118164a5b91599172f24da9f2cdd3613903","_id":"@askjo/camofox-browser@1.8.11","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-Temjuop+XhEy9xKcOrbfmR7jZ9rgX5aB2vuDDGRAxfOEpe1EaJ17BtP3AjXthENXURJxBw4nsJcfKCsp2wO7DQ==","shasum":"52200f72b13bdd2f00bcf06cca88ebeec7512720","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.11.tgz","fileCount":56,"unpackedSize":472868,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDyfoKNKS5O4dgF3cMY6RsWt2xASbQit1R2fjWbvgIWNAIhALAlZAXG5Yy1g++Q1ARlrKZTDTWpMJrkIebX68B0s470"}],"size":122793},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.11_1777420984007_0.02688091405508719"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-29T00:03:04.216Z","publish_time":1777420984216,"_source_registry_name":"default","contributors":[]},"1.8.12":{"name":"@askjo/camofox-browser","version":"1.8.12","description":"Headless browser automation server and OpenClaw plugin for AI agents - anti-detection, element refs, and session isolation","type":"module","main":"server.js","license":"MIT","author":{"name":"Jo Inc","email":"oss@askjo.ai"},"homepage":"https://github.com/jo-inc/camofox-browser#readme","repository":{"type":"git","url":"git+https://github.com/jo-inc/camofox-browser.git"},"bugs":{"url":"https://github.com/jo-inc/camofox-browser/issues"},"keywords":["browser","automation","headless","scraping","camofox","camoufox","anti-detection","ai-agent","openclaw","clawdbot","moltbot","playwright","firefox","youtube","transcript"],"engines":{"node":">=18"},"openclaw":{"extensions":["plugin.ts"],"compat":{"pluginApi":">=2026.3.24-beta.2"},"build":{"openclawVersion":"2026.4.26"},"tools":[{"name":"camofox_create_tab","description":"Open a new browser tab at a URL"},{"name":"camofox_snapshot","description":"Get accessibility snapshot with element refs"},{"name":"camofox_click","description":"Click an element by ref or CSS selector"},{"name":"camofox_type","description":"Type text into an element"},{"name":"camofox_navigate","description":"Navigate to URL or search macro"},{"name":"camofox_scroll","description":"Scroll page up/down/left/right"},{"name":"camofox_screenshot","description":"Capture page screenshot"},{"name":"camofox_close_tab","description":"Close a browser tab"},{"name":"camofox_list_tabs","description":"List open tabs for a user"},{"name":"camofox_import_cookies","description":"Import Netscape cookie file (requires CAMOFOX_API_KEY)"}]},"scripts":{"start":"node server.js","test":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","test:e2e":"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/e2e","test:plugins":"NODE_OPTIONS='--experimental-vm-modules' jest --forceExit plugins/","test:live":"RUN_LIVE_TESTS=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit tests/live","test:debug":"DEBUG_SERVER=1 NODE_OPTIONS='--experimental-vm-modules' jest --runInBand --forceExit","plugin":"node scripts/plugin.js","generate-openapi":"node scripts/generate-openapi.js","version:sync":"node scripts/sync-version.js","version":"node scripts/sync-version.js && node scripts/generate-openapi.js && git add openclaw.plugin.json openapi.json","postinstall":"npx camoufox-js fetch || true"},"dependencies":{"camoufox-js":"^0.8.5","express":"^4.18.2","playwright":"^1.50.0","playwright-core":"^1.58.0","playwright-extra":"^4.3.6","prom-client":"^15.1.3","puppeteer-extra-plugin-stealth":"^2.11.2","swagger-jsdoc":"^6.2.8"},"devDependencies":{"jest":"^29.7.0","pngjs":"^7.0.0"},"gitHead":"4dafd1048ebde7210fafa5566cd967bf493006ac","_id":"@askjo/camofox-browser@1.8.12","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-L4UWfitVjogesHJYXhEuY04MyW3tlfNvCDLxBEQFGJNlT7W/AvlOeqE4c7NzOXb8SBuNOg6Hr4k9LZOW0VyUng==","shasum":"627d666c60911c8d51634274edcc4a9ba45de4ff","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@askjo/camofox-browser/-/camofox-browser-1.8.12.tgz","fileCount":56,"unpackedSize":472868,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@askjo%2fcamofox-browser@1.8.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICnzSABTwOsaAbWsSUnVDQ5LRhYBKcx5epSAttztVGC6AiAWJ8PIpgoDUubBOkUnT0DYB4NVuhqXvwQM0hSzaWJHUA=="}],"size":122793},"_npmUser":{"name":"anonymous","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:02015b82-92e3-49c4-85ca-5fb5295d6a7e"}},"directories":{},"maintainers":[{"name":"anonymous","email":"oss+jo@askjo.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_1.8.12_1777421390821_0.14177849910158558"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2026-04-29T00:09:50.980Z","publish_time":1777421390980,"_source_registry_name":"default","contributors":[]}},"dist-tags":{"latest":"1.8.12"},"name":"@askjo/camofox-browser","time":{"created":"2026-02-10T20:25:54.593Z","modified":"2026-04-29T00:10:12.266Z","1.0.13":"2026-02-10T20:25:37.860Z","1.0.12":"2026-02-10T16:57:01.451Z","1.0.14":"2026-02-11T23:33:29.502Z","1.1.0":"2026-02-12T08:28:41.447Z","1.1.1":"2026-02-12T08:44:41.119Z","1.1.2":"2026-02-12T09:27:06.160Z","1.2.0":"2026-02-17T07:15:13.836Z","1.3.0":"2026-02-22T00:25:35.637Z","1.3.1":"2026-02-23T05:13:53.154Z","1.4.0":"2026-03-09T04:57:32.251Z","1.4.1":"2026-03-22T19:37:16.780Z","1.5.0":"2026-04-06T03:45:07.524Z","1.5.1":"2026-04-06T19:52:38.782Z","1.5.2":"2026-04-06T22:00:18.304Z","1.6.0":"2026-04-19T03:26:01.490Z","1.7.0":"2026-04-26T03:12:37.458Z","1.7.1":"2026-04-26T03:34:29.163Z","1.7.2":"2026-04-26T04:17:41.095Z","1.7.3":"2026-04-26T16:59:50.093Z","1.7.4":"2026-04-26T23:58:33.337Z","1.8.0":"2026-04-27T20:07:03.238Z","1.8.1":"2026-04-28T17:23:03.519Z","1.8.4":"2026-04-28T22:31:40.342Z","1.8.7":"2026-04-28T22:57:41.803Z","1.8.8":"2026-04-28T23:08:51.748Z","1.8.9":"2026-04-28T23:15:49.852Z","1.8.11":"2026-04-29T00:03:04.216Z","1.8.12":"2026-04-29T00:09:50.980Z"},"readme":"<div align=\"center\">\n  <img src=\"fox.png\" alt=\"camofox-browser\" width=\"200\" />\n  <h1>camofox-browser</h1>\n  <p><strong>Anti-detection browser server for AI agents, powered by Camoufox</strong></p>\n  <p>\n    <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\" /></a>\n    <a href=\"https://github.com/jo-inc/camofox-browser/stargazers\"><img src=\"https://img.shields.io/github/stars/jo-inc/camofox-browser\" alt=\"GitHub stars\" /></a>\n    <a href=\"https://www.npmjs.com/package/camofox-browser\"><img src=\"https://img.shields.io/npm/v/camofox-browser\" alt=\"npm version\" /></a>\n    <a href=\"https://github.com/jo-inc/camofox-browser/commits\"><img src=\"https://img.shields.io/github/last-commit/jo-inc/camofox-browser\" alt=\"GitHub last commit\" /></a>\n  </p>\n  <p>\n    Standing on the mighty shoulders of <a href=\"https://camoufox.com\">Camoufox</a> - a Firefox fork with fingerprint spoofing at the C++ level.\n  </p>\n</div>\n\n<br/>\n\n> <a href=\"https://askjo.ai?ref=camofox\"><img src=\"jo-logo.png\" alt=\"Jo\" width=\"80\" height=\"80\" align=\"left\" /></a>\n>\n> Built by the team behind <a href=\"https://askjo.ai?ref=camofox\"><strong>jo -- a personal AI agent</strong></a> that runs half on your Mac, half on a dedicated cloud machine just for you -- with zero maintenance needed. Available on macOS, Telegram, WhatsApp, and email. <a href=\"https://askjo.ai?ref=camofox\">Try the beta free -></a>\n\n<br/>\n\n```bash\ngit clone https://github.com/jo-inc/camofox-browser && cd camofox-browser\nnpm install && npm start\n# -> http://localhost:9377\n```\n\n---\n\n## Why\n\nAI agents need to browse the real web. Playwright gets blocked. Headless Chrome gets fingerprinted. Stealth plugins become the fingerprint.\n\nCamoufox patches Firefox at the **C++ implementation level** - `navigator.hardwareConcurrency`, WebGL renderers, AudioContext, screen geometry, WebRTC - all spoofed before JavaScript ever sees them. No shims, no wrappers, no tells.\n\nThis project wraps that engine in a REST API built for agents: accessibility snapshots instead of bloated HTML, stable element refs for clicking, and search macros for common sites.\n\n## Features\n\n- **C++ Anti-Detection** - bypasses Google, Cloudflare, and most bot detection\n- **Element Refs** - stable `e1`, `e2`, `e3` identifiers for reliable interaction\n- **Token-Efficient** - accessibility snapshots are ~90% smaller than raw HTML\n- **Runs on Anything** - lazy browser launch + idle shutdown keeps memory at ~40MB when idle. Designed to share a box with the rest of your stack -- Raspberry Pi, $5 VPS, shared infra.\n- **Session Isolation** - separate cookies/storage per user\n- **Cookie Import** - inject Netscape-format cookie files for authenticated browsing\n- **Proxy + GeoIP** - route traffic through residential proxies with automatic locale/timezone\n- **Structured Logging** - JSON log lines with request IDs for production observability\n- **YouTube Transcripts** - extract captions from any YouTube video via yt-dlp, no API key needed\n- **Search Macros** - `@google_search`, `@youtube_search`, `@amazon_search`, `@reddit_subreddit`, and 10 more\n- **Snapshot Screenshots** - include a base64 PNG screenshot alongside the accessibility snapshot\n- **Large Page Handling** - automatic snapshot truncation with offset-based pagination\n- **Download Capture** - capture browser downloads and fetch them via API (optional inline base64)\n- **DOM Image Extraction** - list `<img>` src/alt and optionally return inline data URLs\n- **Deploy Anywhere** - Docker, Fly.io, Railway\n- **VNC Interactive Login** - log into sites visually via noVNC, export storage state for agent reuse\n- **OpenAPI Docs** - auto-generated spec at [`/openapi.json`](http://localhost:9377/openapi.json) and interactive docs at [`/docs`](http://localhost:9377/docs)\n- **Structured Extract** - `POST /tabs/:tabId/extract` with a JSON Schema that maps properties to snapshot refs via `x-ref`\n- **Session Tracing** - opt-in per-session Playwright trace capture (screenshots + DOM snapshots + network) with API endpoints to list, fetch, and delete trace zips\n- **Crash Reporter** - automatic [anonymized crash/hang reporting](lib/reporter.js#L28-L290) via GitHub Issues. Identifies which sites cause failures and common failure patterns. Private domains are HMAC-hashed, paths/params stripped, tokens/IPs redacted. Opt-out with `CAMOFOX_CRASH_REPORT_ENABLED=false`.\n\n## Optional Dependencies\n\n| Dependency | Purpose | Install |\n|-----------|---------|---------|\n| [yt-dlp](https://github.com/yt-dlp/yt-dlp) | YouTube transcript extraction (fast path) | `pip install yt-dlp` or `brew install yt-dlp` |\n\nThe Docker image includes yt-dlp. For local dev, install it for the `/youtube/transcript` endpoint. Without it, the endpoint falls back to a slower browser-based method.\n\n## Quick Start\n\n### OpenClaw Plugin\n\n```bash\nopenclaw plugins install @askjo/camofox-browser\n```\n\n**Tools:** `camofox_create_tab`  |  `camofox_snapshot`  |  `camofox_click`  |  `camofox_type`  |  `camofox_navigate`  |  `camofox_scroll`  |  `camofox_screenshot`  |  `camofox_close_tab`  |  `camofox_list_tabs`  |  `camofox_import_cookies`\n\n### Standalone\n\n```bash\ngit clone https://github.com/jo-inc/camofox-browser\ncd camofox-browser\nnpm install\nnpm start  # downloads Camoufox on first run (~300MB)\n```\n\nDefault port is `9377`. See [Environment Variables](#environment-variables) for all options.\n\n### Docker\n\nThe included `Makefile` auto-detects your CPU architecture and pre-downloads Camoufox + yt-dlp binaries outside the Docker build, so rebuilds are fast (~30s vs ~3min).\n\n```bash\n# Build and start (auto-detects arch: aarch64 on M1/M2, x86_64 on Intel)\nmake up\n\n# Stop and remove the container\nmake down\n\n# Force a clean rebuild (e.g. after upgrading VERSION/RELEASE)\nmake reset\n\n# Just download binaries (without building)\nmake fetch\n\n# Override arch or version explicitly\nmake up ARCH=x86_64\nmake up VERSION=135.0.1 RELEASE=beta.24\n```\n\n> **WARNING: Do not run `docker build` directly.** The Dockerfile uses bind mounts to pull pre-downloaded binaries from `dist/`. Always use `make up` (or `make fetch` then `make build`) -- it downloads the binaries first.\n\n### Fly.io\n\nFor Fly.io or other remote CI, you'll need a Dockerfile that downloads binaries at build time instead of using bind mounts.\n\n### Railway\n\nA `railway.toml` is included. It uses `Dockerfile.ci` (which downloads binaries at build time) and maps Railway's `PORT` env var to `CAMOFOX_PORT` automatically.\n\n```bash\n# Install Railway CLI, then:\nrailway link\nrailway up\n```\n\nSet secrets via the Railway dashboard or CLI:\n```bash\nrailway variables set CAMOFOX_API_KEY=\"your-generated-key\"\n```\n\n## Usage\n\n### Cookie Import\n\nImport cookies from your browser into Camoufox to skip interactive login on sites like LinkedIn, Amazon, etc.\n\n#### Setup\n\n**1. Generate a secret key:**\n\n```bash\n# macOS / Linux\nopenssl rand -hex 32\n```\n\n**2. Set the environment variable before starting OpenClaw:**\n\n```bash\nexport CAMOFOX_API_KEY=\"your-generated-key\"\nopenclaw start\n```\n\nThe same key is used by both the plugin (to authenticate requests) and the server (to verify them). Both run from the same environment -- set it once.\n\n> **Why an env var?** The key is a secret. Plugin config in `openclaw.json` is stored in plaintext, so secrets don't belong there. Set `CAMOFOX_API_KEY` in your shell profile, systemd unit, Docker env, or Fly.io secrets.\n\n> **Cookie import is disabled by default.** If `CAMOFOX_API_KEY` is not set, the server rejects all cookie requests with 403.\n\n**3. Export cookies from your browser:**\n\nInstall a browser extension that exports Netscape-format cookie files (e.g., \"cookies.txt\" for Chrome/Firefox). Export the cookies for the site you want to authenticate.\n\n**4. Place the cookie file:**\n\n```bash\nmkdir -p ~/.camofox/cookies\ncp ~/Downloads/linkedin_cookies.txt ~/.camofox/cookies/linkedin.txt\n```\n\nThe default directory is `~/.camofox/cookies/`. Override with `CAMOFOX_COOKIES_DIR`.\n\n**5. Ask your agent to import them:**\n\n> Import my LinkedIn cookies from linkedin.txt\n\nThe agent calls `camofox_import_cookies` -> reads the file -> POSTs to the server with the Bearer token -> cookies are injected into the browser session. Subsequent `camofox_create_tab` calls to linkedin.com will be authenticated.\n\n#### How it works\n\n```\n~/.camofox/cookies/linkedin.txt          (Netscape format, on disk)\n        |\n        v\ncamofox_import_cookies tool              (parses file, filters by domain)\n        |\n        v  POST /sessions/:userId/cookies\n        |  Authorization: Bearer <CAMOFOX_API_KEY>\n        |  Body: { cookies: [Playwright cookie objects] }\n        v\ncamofox server                           (validates, sanitizes, injects)\n        |\n        v  context.addCookies(...)\n        |\nCamoufox browser session                 (authenticated browsing)\n```\n\n- `cookiesPath` is resolved relative to the cookies directory -- path traversal outside it is blocked\n- Max 500 cookies per request, 5MB file size limit\n- Cookie objects are sanitized to an allowlist of Playwright fields\n\n### Session Persistence\n\nBy default, camofox persists each user's cookies and localStorage to `~/.camofox/profiles/`. Sessions survive browser restarts -- log in once (via cookies or VNC), and subsequent sessions restore the authenticated state automatically.\n\n```\n~/.camofox/\n|-- cookies/          # Bootstrap cookie files (Netscape format)\n\\-- profiles/         # Persisted session state (auto-managed)\n    \\-- <hashed-userId>/\n        \\-- storage_state.json\n```\n\nOverride the directory with `CAMOFOX_PROFILE_DIR` or set `\"profileDir\"` in the persistence plugin config. To disable persistence, set `\"persistence\": { \"enabled\": false }` in `camofox.config.json`.\n\n### Session Tracing\n\nCapture a Playwright trace of every action in a session: page screenshots, DOM snapshots, network requests, and console output. Output is a single `.zip` file you can open in Playwright's built-in Trace Viewer.\n\nOpt-in per session by passing `trace: true` when opening the first tab:\n\n```bash\ncurl -X POST http://localhost:9377/tabs \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\":\"agent1\",\"sessionKey\":\"task1\",\"url\":\"https://example.com\",\"trace\":true}'\n```\n\nThe trace is written when the session closes. Close the session to flush it, then list, fetch, and view:\n\n```bash\n# Close the session to flush the trace\ncurl -X DELETE http://localhost:9377/sessions/agent1\n\n# List trace files\ncurl http://localhost:9377/sessions/agent1/traces\n# {\"traces\":[{\"filename\":\"trace-2026-04-18T04-05-00-...zip\",\"sizeBytes\":42810,\"createdAt\":...}]}\n\n# Download (Content-Type: application/zip)\ncurl http://localhost:9377/sessions/agent1/traces/trace-2026-04-18T04-05-00-abc.zip > session.zip\n\n# View it in Playwright's Trace Viewer\nnpx playwright show-trace session.zip\n\n# Delete\ncurl -X DELETE http://localhost:9377/sessions/agent1/traces/trace-2026-04-18T04-05-00-abc.zip\n```\n\nWhy traces instead of video: Camoufox is Firefox-based, and Playwright's `recordVideo` is Chromium-only. Traces work on Firefox and give you more than video (network + DOM + console + screenshots).\n\nTracing cannot be toggled on an existing session. `DELETE /sessions/:userId` first if you need to change the flag.\n\nStorage defaults to `~/.camofox/traces/<hashed-userId>/` and is swept on server startup:\n\n- `CAMOFOX_TRACES_DIR` - base directory (default: `~/.camofox/traces`)\n- `CAMOFOX_TRACES_MAX_BYTES` - max size per trace, removed at next startup if exceeded (default: 50MB)\n- `CAMOFOX_TRACES_TTL_HOURS` - traces older than this are removed at next startup (default: 24)\n\n#### Standalone server usage\n\n```bash\ncurl -X POST http://localhost:9377/sessions/agent1/cookies \\\n  -H 'Content-Type: application/json' \\\n  -H 'Authorization: Bearer YOUR_CAMOFOX_API_KEY' \\\n  -d '{\"cookies\":[{\"name\":\"foo\",\"value\":\"bar\",\"domain\":\"example.com\",\"path\":\"/\",\"expires\":-1,\"httpOnly\":false,\"secure\":false}]}'\n```\n\n#### Docker / Fly.io / Railway\n\n```bash\ndocker run -p 9377:9377 \\\n  -e CAMOFOX_API_KEY=\"your-generated-key\" \\\n  -v ~/.camofox/cookies:/home/node/.camofox/cookies:ro \\\n  camofox-browser\n```\n\nFor Fly.io:\n```bash\nfly secrets set CAMOFOX_API_KEY=\"your-generated-key\"\n```\n\nFor Railway:\n```bash\nrailway variables set CAMOFOX_API_KEY=\"your-generated-key\"\n```\n\n### Proxy + GeoIP\n\nRoute all browser traffic through a proxy with automatic locale, timezone, and geolocation derived from the proxy's IP address via Camoufox's built-in GeoIP.\n\n**Simple proxy (single endpoint):**\n\n```bash\nexport PROXY_HOST=166.88.179.132\nexport PROXY_PORT=46040\nexport PROXY_USERNAME=myuser\nexport PROXY_PASSWORD=mypass\nnpm start\n```\n\n**Backconnect proxy (rotating sticky sessions):**\n\nFor providers like Decodo, Bright Data, or Oxylabs that offer a single gateway endpoint with session-based sticky IPs:\n\n```bash\nexport PROXY_STRATEGY=backconnect\nexport PROXY_BACKCONNECT_HOST=gate.provider.com\nexport PROXY_BACKCONNECT_PORT=7000\nexport PROXY_USERNAME=myuser\nexport PROXY_PASSWORD=mypass\nnpm start\n```\n\nEach browser context gets a unique sticky session, so different users get different IP addresses. Sessions rotate automatically on proxy errors or Google blocks.\n\nOr in Docker:\n\n```bash\ndocker run -p 9377:9377 \\\n  -e PROXY_HOST=166.88.179.132 \\\n  -e PROXY_PORT=46040 \\\n  -e PROXY_USERNAME=myuser \\\n  -e PROXY_PASSWORD=mypass \\\n  camofox-browser\n```\n\nWhen a proxy is configured:\n- All traffic routes through the proxy\n- Camoufox's GeoIP automatically sets `locale`, `timezone`, and `geolocation` to match the proxy's exit IP\n- Browser fingerprint (language, timezone, coordinates) is consistent with the proxy location\n- Without a proxy, defaults to `en-US`, `America/Los_Angeles`, San Francisco coordinates\n\n### Crash Reporter\n\nBrowser automation fails in ways that are hard to predict -- Cloudflare challenges, site redesigns breaking selectors, redirect loops, dialog storms, renderer crashes. The scope is wide and the failure modes are diverse. Without telemetry, the only signal is \"it didn't work.\"\n\nThe crash reporter gives us structured data on *which sites fail*, *how they fail*, and *how often*, so we can prioritize fixes for the patterns that actually affect users. It files GitHub Issues automatically when:\n\n- **Uncaught exceptions** crash the process\n- **Event loop stalls** exceed 5 seconds (watchdog detection)\n- **Frustration patterns** -- 3+ consecutive failures (timeout, dead context, navigation abort) on the same tab\n\nEach report includes the failure type, stack trace, tab health counters (HTTP status histogram, console errors, request failures, redirect depth), and the target URL -- all anonymized.\n\n#### How it works\n\nReports are sent to a lightweight Cloudflare Worker relay at [`https://camofox-crash-relay.askjo.workers.dev`](https://camofox-crash-relay.askjo.workers.dev/health). The relay holds the GitHub App credentials as environment secrets -- **no secrets are shipped in this package**.\n\n```\nlib/reporter.js (client, no secrets)\n    |  anonymize -> POST https://camofox-crash-relay.askjo.workers.dev/report\n    v\nCloudflare Worker (holds GitHub App key)\n    |  validate -> rate-limit -> dedup -> create GitHub Issue\n    v\nGitHub Issue created\n```\n\nThe relay source code is in this repo at [`workers/crash-reporter/index.ts`](workers/crash-reporter/index.ts).\n\n#### Verification\n\nYou don't have to trust us -- verify what the live relay is running:\n\n```bash\n# 1. Ask the relay what code it's running\ncurl https://camofox-crash-relay.askjo.workers.dev/source\n# -> { \"commit\": \"abc1234\", \"sha256\": \"e3b0c44...\", \"source\": \"https://github.com/...\" }\n\n# 2. Compare the sha256 against the source in this repo\nsha256sum workers/crash-reporter/index.ts\n\n# 3. Check the commit matches what CI deployed\n#    https://github.com/jo-inc/camofox-browser/actions/workflows/crash-relay-deploy.yml\ngit log --oneline workers/crash-reporter/index.ts | head -1\n```\n\nIf the hashes don't match, the relay is running different code than what's in the repo. The deploy workflow ([`.github/workflows/crash-relay-deploy.yml`](.github/workflows/crash-relay-deploy.yml)) injects the commit and source hash at deploy time -- every deploy is auditable in [GitHub Actions](https://github.com/jo-inc/camofox-browser/actions/workflows/crash-relay-deploy.yml).\n\nOr skip verification entirely: `CAMOFOX_CRASH_REPORT_ENABLED=false` disables all reporting, or point to [your own relay](#self-hosted-relay) with `CAMOFOX_CRASH_REPORT_URL`.\n\n#### Privacy\n\nAll reported data goes through paranoid anonymization ([`lib/reporter.js` L28-290](lib/reporter.js#L28-L290)) before leaving the process:\n\n- **URLs** -- well-known public domains (Google, Amazon, Reddit, Cloudflare, etc.) are shown verbatim so we can identify which sites cause problems. Private/unknown domains are replaced with a stable HMAC hash (`site-a1b2c3d4`) -- same hash across reports for correlation, but not reversible to the original domain. Path segments become `*/*/*` (depth only). Query params become `?[3]` (count only). No keys, values, or path content is ever included.\n- **File paths** -> stripped to filename only (`<path>/server.js`)\n- **Tokens, secrets, API keys** -> `<token>`\n- **IPs, emails, env vars** -> redacted\n- **Docker/Fly machine IDs** -> `<id>`\n- **Tab health** -- pure counters (crash count, error count, status code histogram). No page content, no URLs, no user data.\n\nDuplicate issues are detected by stack signature and get a `+1` comment instead of a new issue.\n\n```bash\n# Disable crash reporting\nexport CAMOFOX_CRASH_REPORT_ENABLED=false\n\n# Point to your own relay (see below)\nexport CAMOFOX_CRASH_REPORT_URL=https://your-relay.example.com/report\n\n# Adjust rate limit (default: 10 per hour)\nexport CAMOFOX_CRASH_REPORT_RATE_LIMIT=5\n```\n\n#### Self-hosted relay\n\nTo file crash reports in your own GitHub repo instead of `jo-inc/camofox-browser`:\n\n1. **Create a GitHub App** -- [Settings -> Developer settings -> GitHub Apps -> New](https://github.com/settings/apps/new)\n   - Permissions: **Repository -> Issues -> Read & Write**\n   - Uncheck **Webhook -> Active** (not needed)\n   - Click **Generate a key** -- downloads a `.pem` file\n   - Install the app on your target repo (Install App -> select repo)\n   - Note your **App ID** (number on the app's General page) and **Installation ID** (from the URL after installing: `github.com/settings/installations/{id}`)\n\n2. **Deploy the relay** -- clone this repo and deploy the worker:\n   ```bash\n   cd workers/crash-reporter\n   # Edit wrangler.toml: set account_id to your Cloudflare account ID\n   npx wrangler deploy\n   ```\n   The worker is a single TypeScript file with zero npm dependencies. It also runs on Deno, Bun, or any runtime with the Web Crypto API.\n\n3. **Set worker secrets:**\n   ```bash\n   cd workers/crash-reporter\n   echo \"YOUR_APP_ID\" | npx wrangler secret put GH_APP_ID\n   echo \"YOUR_INSTALL_ID\" | npx wrangler secret put GH_INSTALL_ID\n   # Key must be PKCS#8 DER base64 (not raw PEM)\n   openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in your-app.pem | \\\n     base64 | tr -d '\\n' | npx wrangler secret put GH_PRIVATE_KEY\n   # File issues in your repo\n   echo \"your-org/your-repo\" | npx wrangler secret put GH_REPO\n   ```\n\n4. **Point camofox-browser to your relay:**\n   ```bash\n   export CAMOFOX_CRASH_REPORT_URL=https://your-worker.your-subdomain.workers.dev/report\n   ```\n\n5. **Verify:**\n   ```bash\n   curl https://your-worker.your-subdomain.workers.dev/health\n   # -> {\"status\":\"ok\"}\n   ```\n\n### Structured Logging\n\nAll log output is JSON (one object per line) for easy parsing by log aggregators:\n\n```json\n{\"ts\":\"2026-02-11T23:45:01.234Z\",\"level\":\"info\",\"msg\":\"req\",\"reqId\":\"a1b2c3d4\",\"method\":\"POST\",\"path\":\"/tabs\",\"userId\":\"agent1\"}\n{\"ts\":\"2026-02-11T23:45:01.567Z\",\"level\":\"info\",\"msg\":\"res\",\"reqId\":\"a1b2c3d4\",\"status\":200,\"ms\":333}\n```\n\nHealth check requests (`/health`) are excluded from request logging to reduce noise.\n\n### Basic Browsing\n\n```bash\n# Create a tab\ncurl -X POST http://localhost:9377/tabs \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\": \"agent1\", \"sessionKey\": \"task1\", \"url\": \"https://example.com\"}'\n\n# Get accessibility snapshot with element refs\ncurl \"http://localhost:9377/tabs/TAB_ID/snapshot?userId=agent1\"\n# -> { \"snapshot\": \"[button e1] Submit  [link e2] Learn more\", ... }\n\n# Click by ref\ncurl -X POST http://localhost:9377/tabs/TAB_ID/click \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\": \"agent1\", \"ref\": \"e1\"}'\n\n# Type into an element\ncurl -X POST http://localhost:9377/tabs/TAB_ID/type \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\": \"agent1\", \"ref\": \"e2\", \"text\": \"hello\", \"pressEnter\": true}'\n\n# Navigate with a search macro\ncurl -X POST http://localhost:9377/tabs/TAB_ID/navigate \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\": \"agent1\", \"macro\": \"@google_search\", \"query\": \"best coffee beans\"}'\n```\n\n## API\n\n### Tab Lifecycle\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/tabs` | Create tab with initial URL |\n| `GET` | `/tabs?userId=X` | List open tabs |\n| `GET` | `/tabs/:id/stats` | Tab stats (tool calls, visited URLs) |\n| `DELETE` | `/tabs/:id` | Close tab |\n| `DELETE` | `/tabs/group/:groupId` | Close all tabs in a group |\n| `DELETE` | `/sessions/:userId` | Close all tabs for a user |\n\n### Page Interaction\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/tabs/:id/snapshot` | Accessibility snapshot with element refs. Query params: `includeScreenshot=true` (add base64 PNG), `offset=N` (paginate large snapshots) |\n| `POST` | `/tabs/:id/click` | Click element by ref or CSS selector |\n| `POST` | `/tabs/:id/type` | Type text into element |\n| `POST` | `/tabs/:id/press` | Press a keyboard key |\n| `POST` | `/tabs/:id/scroll` | Scroll page (up/down/left/right) |\n| `POST` | `/tabs/:id/navigate` | Navigate to URL or search macro |\n| `POST` | `/tabs/:id/wait` | Wait for selector or timeout |\n| `GET` | `/tabs/:id/links` | Extract all links on page |\n| `GET` | `/tabs/:id/images` | List `<img>` elements. Query params: `includeData=true` (return inline data URLs), `maxBytes=N`, `limit=N` |\n| `GET` | `/tabs/:id/downloads` | List captured downloads. Query params: `includeData=true` (base64 file data), `consume=true` (clear after read), `maxBytes=N` |\n| `GET` | `/tabs/:id/screenshot` | Take screenshot |\n| `POST` | `/tabs/:id/back` | Go back |\n| `POST` | `/tabs/:id/forward` | Go forward |\n| `POST` | `/tabs/:id/refresh` | Refresh page |\n\n### YouTube Transcript\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/youtube/transcript` | Extract captions from a YouTube video |\n\n```bash\ncurl -X POST http://localhost:9377/youtube/transcript \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\", \"languages\": [\"en\"]}'\n# -> { \"status\": \"ok\", \"transcript\": \"[00:18] [music] We're no strangers to love [music]\\n...\", \"video_title\": \"...\", \"total_words\": 548 }\n```\n\nUses [yt-dlp](https://github.com/yt-dlp/yt-dlp) when available (fast, no browser needed). Falls back to a browser-based intercept method if yt-dlp is not installed -- this is slower and less reliable due to YouTube ad pre-rolls.\n\n### Server\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/health` | Health check |\n| `POST` | `/start` | Start browser engine |\n| `POST` | `/stop` | Stop browser engine |\n\n### Sessions\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/sessions/:userId/cookies` | Add cookies to a user session (Playwright cookie objects) |\n| `GET` | `/sessions/:userId/storage_state` | Export cookies + localStorage ([VNC plugin](plugins/vnc/)) |\n\n## Search Macros\n\n`@google_search`  |  `@youtube_search`  |  `@amazon_search`  |  `@reddit_search`  |  `@reddit_subreddit`  |  `@wikipedia_search`  |  `@twitter_search`  |  `@yelp_search`  |  `@spotify_search`  |  `@netflix_search`  |  `@linkedin_search`  |  `@instagram_search`  |  `@tiktok_search`  |  `@twitch_search`\n\nReddit macros return JSON directly (no HTML parsing needed):\n- `@reddit_search` - search all of Reddit, returns JSON with 25 results\n- `@reddit_subreddit` - browse a subreddit (e.g., query `\"programming\"` -> `/r/programming.json`)\n\n## Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `CAMOFOX_PORT` | Server port | `9377` |\n| `PORT` | Server port (fallback, for platforms like Fly.io, Railway) | `9377` |\n| `CAMOFOX_API_KEY` | Enable cookie import endpoint (disabled if unset) | - |\n| `CAMOFOX_ADMIN_KEY` | Required for `POST /stop` | - |\n| `CAMOFOX_ACCESS_KEY` | If set, all routes (except `/health`, cookie import, and `/stop`) require `Authorization: Bearer <key>`. Lets you safely expose the server beyond loopback. | - |\n| `CAMOFOX_COOKIES_DIR` | Directory for cookie files | `~/.camofox/cookies` |\n| `CAMOFOX_PROFILE_DIR` | Directory for persisted session profiles | `~/.camofox/profiles` |\n| `CAMOFOX_TRACES_DIR` | Directory for session trace zips | `~/.camofox/traces` |\n| `CAMOFOX_TRACES_MAX_BYTES` | Max size per trace, removed on next startup if exceeded | `52428800` (50MB) |\n| `CAMOFOX_TRACES_TTL_HOURS` | Traces older than this are swept on startup | `24` |\n| `MAX_SESSIONS` | Max concurrent browser sessions | `50` |\n| `MAX_TABS_PER_SESSION` | Max tabs per session | `10` |\n| `SESSION_TIMEOUT_MS` | Session inactivity timeout | `1800000` (30min) |\n| `BROWSER_IDLE_TIMEOUT_MS` | Kill browser when idle (0 = never) | `300000` (5min) |\n| `HANDLER_TIMEOUT_MS` | Max time for any handler | `30000` (30s) |\n| `MAX_CONCURRENT_PER_USER` | Concurrent request cap per user | `3` |\n| `MAX_OLD_SPACE_SIZE` | Node.js V8 heap limit (MB) | `128` |\n| `PROXY_STRATEGY` | Proxy mode: `backconnect` (rotating sticky sessions) or blank (single endpoint) | - |\n| `PROXY_PROVIDER` | Provider name for session format (e.g. `decodo`) | `decodo` |\n| `PROXY_HOST` | Proxy hostname or IP (simple mode) | - |\n| `PROXY_PORT` | Proxy port (simple mode) | - |\n| `PROXY_USERNAME` | Proxy auth username | - |\n| `PROXY_PASSWORD` | Proxy auth password | - |\n| `PROXY_BACKCONNECT_HOST` | Backconnect gateway hostname | - |\n| `PROXY_BACKCONNECT_PORT` | Backconnect gateway port | `7000` |\n| `PROXY_COUNTRY` | Target country for proxy geo-targeting | - |\n| `PROXY_STATE` | Target state/region for proxy geo-targeting | - |\n| `TAB_INACTIVITY_MS` | Close tabs idle longer than this | `300000` (5min) |\n| `CAMOFOX_CRASH_REPORT_ENABLED` | Enable anonymized crash/hang reporter (`false` to disable) | `true` |\n| `CAMOFOX_CRASH_REPORT_URL` | Crash report relay endpoint ([self-hosted relay](#self-hosted-relay)) | `https://camofox-crash-relay.askjo.workers.dev/report` |\n| `CAMOFOX_CRASH_REPORT_REPO` | GitHub repo for issue reports | `jo-inc/camofox-browser` |\n| `CAMOFOX_CRASH_REPORT_RATE_LIMIT` | Max reports per hour | `10` |\n| `ENABLE_VNC` | Enable VNC plugin for interactive browser access (`1`) | - |\n| `VNC_PASSWORD` | Password for VNC access (recommended in production) | - |\n| `NOVNC_PORT` | noVNC web UI port | `6080` |\n\n## Architecture\n\n```\nBrowser Instance (Camoufox)\n\\-- User Session (BrowserContext) - isolated cookies/storage\n    |-- Tab Group (sessionKey: \"conv1\")\n    |   |-- Tab (google.com)\n    |   \\-- Tab (github.com)\n    \\-- Tab Group (sessionKey: \"conv2\")\n        \\-- Tab (amazon.com)\n```\n\nSessions auto-expire after 30 minutes of inactivity. The browser itself shuts down after 5 minutes with no active sessions, and relaunches on the next request.\n\nWhen a session's tab limit is reached, the oldest/least-used tab is automatically recycled instead of returning an error -- so long-running agent sessions don't hit dead ends.\n\n## Security Model\n\nThis section documents the security boundaries of camofox-browser for users and automated security reviewers.\n\n### Code isolation\n\nAll `process.env` reads are centralized in `lib/config.js`. All `child_process` usage is in `lib/launcher.js` (server subprocess) and `plugins/youtube/youtube.js` (yt-dlp). The main `server.js` has route handlers but zero `process.env` reads and zero `child_process` imports. No single file combines environment/credential access with network sends.\n\n### No embedded secrets\n\nZero credentials, private keys, API tokens, or signing keys ship in this package. All secrets are provided at runtime via environment variables (`CAMOFOX_API_KEY`, `CAMOFOX_ACCESS_KEY`) or are Cloudflare Worker environment secrets (crash relay GitHub App key).\n\n### Cookie import is disabled by default\n\nThe cookie import endpoint (`POST /sessions/:userId/cookies`) is gated behind `CAMOFOX_API_KEY`. If this env var is not set, the server rejects all cookie import requests with HTTP 403. Cookie files are read from a sandboxed directory (`~/.camofox/cookies/`) with path traversal protection -- attempts to escape the directory are blocked. Max 500 cookies per request, 5MB file size limit.\n\n### Access control\n\n`CAMOFOX_ACCESS_KEY` provides global bearer token authentication for all routes (except `/health`). When set, every request must include `Authorization: Bearer <key>`. Recommended for any deployment beyond localhost.\n\n### Binary download\n\nThe Camoufox browser engine (~300MB) is downloaded at `npm install` time by [`camoufox-js`](https://www.npmjs.com/package/camoufox-js), an npm package maintained by the [Camoufox project](https://camoufox.com). It downloads from [official GitHub releases](https://github.com/nicedayzhu/camoufox/releases) with integrity verification handled by `camoufox-js`. No custom download URLs, no URL shorteners, no raw IP addresses.\n\n### Crash reporting\n\nAnonymized crash/hang reports are sent to a Cloudflare Worker relay. The relay source is [in this repo](workers/crash-reporter/index.ts) and auditable. Verification: `GET /source` on the relay returns the deployed commit hash and sha256 so you can compare against the repo. The reporter ([`lib/reporter.js` L28-290](lib/reporter.js#L28-L290)) applies paranoid anonymization: private domains are HMAC-hashed (not reversible), paths are stripped, tokens/IPs/emails are redacted. No page content, cookies, or user data is ever sent. Disable with `CAMOFOX_CRASH_REPORT_ENABLED=false` or point to your own relay with `CAMOFOX_CRASH_REPORT_URL`.\n\n### Session persistence\n\nThe persistence plugin saves cookies and localStorage to `~/.camofox/profiles/<hashed-userId>/` so authenticated sessions survive browser restarts. UserIds are hashed for directory names. Disable via `camofox.config.json` by removing `persistence` from the plugins array.\n\n### Network access\n\nOutbound connections are made to: (1) URLs the agent navigates to (core functionality), (2) the crash report relay (anonymized, opt-out available). Inbound: the REST API on localhost:9377 (default), optionally protected by `CAMOFOX_ACCESS_KEY`.\n\n### Subprocess usage\n\nTwo subprocesses may be spawned: (1) the Camoufox browser engine (core functionality, `lib/launcher.js`), (2) yt-dlp for YouTube transcript extraction (optional, `plugins/youtube/youtube.js`). Both are isolated in dedicated files separate from route handlers.\n\n## Testing\n\n```bash\nnpm test              # all tests\nnpm run test:e2e      # e2e tests only\nnpm run test:live     # live site tests (Google, macros)\nnpm run test:debug    # with server output\n```\n\n## npm\n\n```bash\nnpm install @askjo/camofox-browser\n```\n\n## Credits\n\n- [Camoufox](https://camoufox.com) - Firefox-based browser with C++ anti-detection\n- [Donate to Camoufox's original creator daijro](https://camoufox.com/about/)\n- [OpenClaw](https://openclaw.ai) - Open-source AI agent framework\n\n## Crypto Scam Warning\n\nSketchy people are doing sketchy things with crypto tokens named \"Camofox\" now that this project is getting attention. **Camofox is not a crypto project and will never be one.** Any token, coin, or NFT using the Camofox name has nothing to do with us.\n\n## License\n\nMIT","users":{}}