{"_id":"@aralroca/gui-agent","_rev":"12-62a98015decbac243476488cf701e2fc","name":"@aralroca/gui-agent","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@aralroca/gui-agent","version":"0.1.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.1.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"c40ca994be4cd6c05fee8175a387d8034ae662e0","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.1.0.tgz","fileCount":20,"integrity":"sha512-EZFePxV7gshxdR9aZMDzXreG4kqJsE5KPmOdNh1NO/bGfUG7BJAVrvwPacEVzOIWOJ1TuKK6trjmaoV3iKH3zw==","signatures":[{"sig":"MEUCIQCV6kriXEDvad3+d5dAKoq4eHB8En4ZEUu+JIr48damKgIgWVAnBhmY1eviEQ0KAC/JJ9r6dmGvGph453Ler1pcdsg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127261},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js"}},"gitHead":"c672184579cbc5fa795c9ba967da26ba72975439","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.2.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/react":"^19.0.0"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.1.0_1782416166456_0.8586894749201692","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aralroca/gui-agent","version":"0.2.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.2.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"d0d373c0e26229c6955421df0ba58d5b3f639536","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.2.0.tgz","fileCount":25,"integrity":"sha512-1m02ZgSvmtHqPXrsVmKVUgI0fQ1G6dhvIFenA5e0jL+/BjrQLBXy9Q6HO+ZoXn9xSQzwtadcfPmlaISDNWAqEQ==","signatures":[{"sig":"MEYCIQDdXhrLpFp4C55ctuTSM6kRln7g5Y78sXv57s113dez7QIhAPv1IPain2Oo4eqh8GyuDX1ShUGWVuPIZKpqr/W9OSMN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206881},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js"}},"gitHead":"729aadd970e59bc0250ab7779e27b0381c3bf9e5","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/react":"^19.0.0"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.2.0_1783112982203_0.4276597227586927","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aralroca/gui-agent","version":"0.3.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.3.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"53863698c12c1f1a4da6a896fa19af02be6beaf0","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.3.0.tgz","fileCount":25,"integrity":"sha512-LWP4E+54C4dDgDthcDvYmHYpb+61yTO9RuwmOYDaY5PtZrAIye4WPy4wUaTrpcMdZK2tcgtjdzDaACOG50dVuw==","signatures":[{"sig":"MEYCIQCE7xNBM7o0oGb2rz2po7uK7MXD+tPgwwbk8AZWM+0+AQIhALiqxE+6kEnuzsYtmRIp6jAAioiU8DRhpzoxEbfTogk9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230910},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"cb81ed1d89f262716f715ad28994f031da844d34","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/react":"^19.0.0"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.3.0_1783189674137_0.3072325241932945","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aralroca/gui-agent","version":"0.3.1","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.3.1","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"5e0ab41feb4b055fdb6581eefe02687ecc34d754","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.3.1.tgz","fileCount":25,"integrity":"sha512-ma+SP6mFJ6NN4lWFkyfDnUFBPJSElko9/YzUs2MSPVTOB/KJyc2hHgcvJsBTGQoBxi5px6zICtxan3TIRHWyVw==","signatures":[{"sig":"MEQCIDl8q18jTTKACdqp4E1Sx6AfAT64iH2vazZBIl6XAP0qAiBU9+IzhDA5eSstMIA+fr78syA4+MXrF0VO2nEsNXBYYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236591},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"788f505a33b501b8c6421c364e7999a997a1bde0","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","typescript":"^5.6.0","@types/react":"^19.0.0"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.3.1_1783268381186_0.16313491776360345","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aralroca/gui-agent","version":"0.4.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.4.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"c17766d400c649cd061693ea104fb697d3e0dc8a","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.4.0.tgz","fileCount":25,"integrity":"sha512-sDuakdt7PDeqIfywX1CB6wzND3m4n9txzasIjXgJWUGJQOuQYmgjPGIOlEKq+jWqJsEzrr50LMK96LhkYItI5Q==","signatures":[{"sig":"MEUCIHIaMRPPUmct8X7TSwhwj5nkqnaACNukXdlCcT16m5waAiEA+4mgsoiZA0uMjsQfxVXroOF2r1etoIJNJ57e5RE3Ev0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":240710},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"bfe54da7fe61891eb1a4806c518b81c326ec1ae3","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.4.0_1783288055622_0.5046751782411012","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aralroca/gui-agent","version":"0.4.1","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.4.1","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"b39b0524cad82d81ab50540b85c062b0f5d5ffb1","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.4.1.tgz","fileCount":25,"integrity":"sha512-D5/hQDIASG8WBKaOF6hJXmTF432m2Qto2GFSVkLpJ4KTI0cPVVU3aKDHbl0KuEZ54uHWmSV3mh3Pj3OvVf3X6w==","signatures":[{"sig":"MEQCIED80QWiPuIXA6jMsOFxSdmjdByTn+newxf/2nSXWeF7AiAsvsn56RC/oc9BoOviaWn5Ds8GwxW6F+b3REjaV6lQnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243967},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"210598aab4350ea808b7a529fe803956600a9608","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.4.1_1783546896923_0.34099417139013344","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aralroca/gui-agent","version":"0.5.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.5.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"348743d6d8e77bcfaa078e745fd2421fbded899c","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.5.0.tgz","fileCount":25,"integrity":"sha512-xjspcKK9EBYsoXThjlgjlBkkru2ytCkQozNOzCdplNz7nf6km+EHiw61nAZT1p4eAzrIyhsU2FCs3eyNjYqIyw==","signatures":[{"sig":"MEQCIBCYegz24SmE4gu4Y/KaoFyt2PtJtKsBXcOmSb+RZeGmAiAfaodfWB5evIelNfAmsTcbB1+2ffFC+OBQHEey39+yyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247505},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"cf1ec0c3e22db88af52feb15fabc24b870d6f947","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.5.0_1783585395467_0.4555351710117297","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@aralroca/gui-agent","version":"0.6.0","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.6.0","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"24390ed0568a618f7561c9400681b19f8b328b70","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.6.0.tgz","fileCount":25,"integrity":"sha512-c4GEbKGB2jxT2iFvvGWfU+i7Frxo8vDy5Xg7GC26ZcmNyllrBl6yoxKrkl2NlZaKhAHmsunE30CRVYuQp4NX2g==","signatures":[{"sig":"MEQCID4arilh0IKPVZ+yJ+RFqdHyPxaRQ9u25D/bITS93A4lAiALlvka4dAg57+Yp6CkscFK7x6+7hzCdH1rqR8YjZxymg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265581},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"18dad509e79412fda1888e05d14edb1903cf0640","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.6.0_1786956206061_0.243214932443087","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@aralroca/gui-agent","version":"0.6.1","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.6.1","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"2cbd464b33d8cecd01b4df3be8aa2887a761b6a0","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.6.1.tgz","fileCount":25,"integrity":"sha512-lOIRWTxoPqrBn1oGRe1w23iyLgQwFITFDVzgRZlAiiR4bCsLDQo8nS4ZGCHF3O8PsFf0fB6wUOQ04LEaJ1SwSg==","signatures":[{"sig":"MEUCIQCJbgZujELEazI83v1BPlqDA9vGAEWwi2N7VtjsDlbaIgIgVb59D+v1ujFZFuDqbEiBx7+PIvN9yFX3CRrNVCDfX5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267342},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"4c52e245136502505f8d53eaa753df81f21df8e2","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.6.1_1786961050950_0.8386722768694104","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@aralroca/gui-agent","version":"0.6.2","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.6.2","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"cdf1f8e31d19d51e108fc62927676363e52be8ab","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.6.2.tgz","fileCount":25,"integrity":"sha512-sSFlNxUAbob4it+VPmMwUUV//okkrzg7EBKO8zPrgU8sdgIswG6so8CZt9pEgg0BYE25MGy3ghQRL+sqlngsbA==","signatures":[{"sig":"MEQCIHgNDZuXuc/5lFIMIYveWt6SDOPUNgeyOGNqtoXRsVgKAiBSPbrF/HfqfNOzW+WgnNCP0dYXLY9aBstxJwRqptMtkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267759},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"c1e0c8ff140727035486284846089001020a3b12","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.6.2_1787422772217_0.03161388197422288","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@aralroca/gui-agent","version":"0.6.3","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"author":{"name":"Aral Roca"},"license":"MIT","_id":"@aralroca/gui-agent@0.6.3","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"homepage":"https://github.com/aralroca/gui-agent#readme","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"ba9faf300bb89077972dfbbbe2144ee0193af972","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.6.3.tgz","fileCount":25,"integrity":"sha512-gNkgKJZzgs5YAkmWxYE21vq/t3ATAv4bXgge3l27hi9+ilSm9Mk3zerN5IOiJVJ91/RBFZrKFdyy0SHZLggp1w==","signatures":[{"sig":"MEYCIQCjnUpoE8+XXl2IStQNqBvThAroMwBzmKlEXqlymdFvEQIhAIaN80rSS7H/ec0oKD/g8kLkSj4VuRRPHJ3pX38BAdgU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270838},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"9695cab9d2bd05736411eef36517e27bfb044e4f","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/gui-agent_0.6.3_1787816473536_0.3370150419035256","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@aralroca/gui-agent@0.7.0","bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"dist":{"shasum":"764727ba90074a27ec36c503a492c3a22232ca8f","tarball":"https://registry.npmjs.org/@aralroca/gui-agent/-/gui-agent-0.7.0.tgz","fileCount":27,"integrity":"sha512-zazyQo5mjd6Y5mwVgbqEHluEj51JkgylKqtCGVS0VNWNeRRXjhs/hqK7B8mPaTqU2amLwjMX+iFpVP9svguscQ==","signatures":[{"sig":"MEQCIEPb8B9peW71fO8mQwUJgPg9FamWQKDLRfyZnIyPlaC9AiAtFJ4r9Uzg4tskV2rn02Z6Dxx9yBEyjV1zwtuLvkDxLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCD8igEm+93tmXXZjm/Op90iHTiRdylyURyUp7VEABrMgIhAPIKpPq/evTNDSB706VH+XRqLhtPP9WjNI0YIPFLcRkS"}],"unpackedSize":318793},"main":"./dist/index.js","name":"@aralroca/gui-agent","type":"module","types":"./dist/index.d.ts","author":{"name":"Aral Roca"},"module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","default":"./dist/ui/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","default":"./dist/react/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk/index.d.ts","import":"./dist/ai-sdk/index.js","default":"./dist/ai-sdk/index.js"},"./polyfill":{"types":"./dist/polyfill.d.ts","import":"./dist/polyfill.js","default":"./dist/polyfill.js"}},"gitHead":"049dc06e92f245c5bced684489415521a1a4cf44","license":"MIT","scripts":{"dev":"tsup --watch","demo":"vite","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"version":"0.7.0","_npmUser":{"name":"aralroca","email":"aral-rg@hotmail.com"},"homepage":"https://github.com/aralroca/gui-agent#readme","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"_npmVersion":"11.17.0","description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","directories":{},"maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"sideEffects":false,"_nodeVersion":"26.4.0","dependencies":{"@mcp-b/webmcp-polyfill":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.0","zod":"^4.0.0","tsup":"^8.3.0","vite":"^6.0.0","jsdom":"^25.0.0","react":"^19.0.0","vitest":"^2.1.0","react-dom":"^19.2.7","typescript":"^5.6.0","@types/react":"^19.0.0","@xyflow/react":"^12.11.1","@types/react-dom":"^19.2.3"},"peerDependencies":{"ai":">=5","zod":">=3.23","react":">=18"},"peerDependenciesMeta":{"ai":{"optional":true},"zod":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gui-agent_0.7.0_1790848718952_0.08062256842591098"}}},"time":{"created":"2026-06-25T19:36:06.293Z","modified":"2026-10-01T09:58:39.250Z","0.1.0":"2026-06-25T19:36:06.630Z","0.2.0":"2026-07-03T21:09:42.354Z","0.3.0":"2026-07-04T18:27:54.301Z","0.3.1":"2026-07-05T16:19:41.332Z","0.4.0":"2026-07-05T21:47:35.774Z","0.4.1":"2026-07-08T21:41:37.077Z","0.5.0":"2026-07-09T08:23:15.618Z","0.6.0":"2026-08-17T08:43:26.215Z","0.6.1":"2026-08-17T10:04:11.103Z","0.6.2":"2026-08-22T18:19:32.385Z","0.6.3":"2026-08-27T07:41:13.663Z","0.7.0":"2026-10-01T09:58:39.096Z"},"bugs":{"url":"https://github.com/aralroca/gui-agent/issues"},"author":{"name":"Aral Roca"},"license":"MIT","homepage":"https://github.com/aralroca/gui-agent#readme","keywords":["webmcp","mcp","agent","gui-agent","ai","llm","browser","automation","model-context","page-agent"],"repository":{"url":"git+https://github.com/aralroca/gui-agent.git","type":"git"},"description":"An open-source WebMCP-powered in-page GUI agent. Let a natural-language agent live inside your web app and drive its UI — no script injection, no browser extension, no headless browser.","maintainers":[{"name":"aralroca","email":"aral-rg@hotmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"docs/logo.svg\" width=\"150\" alt=\"gui-agent — a glowing ring around a button inside an app window\" />\n</p>\n\n<h1 align=\"center\">gui-agent</h1>\n\n<p align=\"center\">\n  <strong>An open-source, WebMCP-powered GUI agent that lives inside your web app.</strong><br/>\n  Let a natural-language agent operate your UI — click, fill, navigate, call your app's own actions — driven by any LLM you bring.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@aralroca/gui-agent\"><img src=\"https://img.shields.io/npm/v/%40aralroca%2Fgui-agent\" alt=\"npm version\" /></a>\n  <a href=\"https://www.npmjs.com/package/@aralroca/gui-agent\"><img src=\"https://img.shields.io/npm/dm/%40aralroca%2Fgui-agent\" alt=\"npm downloads\" /></a>\n  <a href=\"https://webmachinelearning.github.io/webmcp/\"><img src=\"https://img.shields.io/badge/WebMCP-standard-6d28d9\" alt=\"WebMCP\" /></a>\n  <img src=\"https://img.shields.io/badge/TypeScript-first-3178c6?logo=typescript&logoColor=white\" alt=\"TypeScript\" />\n  <a href=\"./LICENSE\"><img src=\"https://img.shields.io/npm/l/%40aralroca%2Fgui-agent\" alt=\"MIT license\" /></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"docs/demo.gif\" width=\"1000\" alt=\"Demo: the agent invites a teammate, searches users, and builds a node-based flow on a React Flow canvas while the built-in visualizer shows status chips and a gradient glow over each element it touches — including nodes that mount asynchronously\" />\n</p>\n\n<p align=\"center\"><sub>The optional <a href=\"#-visualizing-the-agent-aralrocagui-agentui\">visualizer</a> in action: status chips per tool call, an animated gradient glow that tours every element the agent touches, and a backdrop veil that keeps the user's focus on the action.</sub></p>\n\n---\n\nInspired by [page-agent](https://github.com/alibaba/page-agent), but built on the emerging [**WebMCP**](https://webmachinelearning.github.io/webmcp/) standard via a polyfill.\n\n- 📦 **Just an npm package.** `npm i @aralroca/gui-agent` and `import`. No script injection, no browser extension, no headless browser.\n- 🧩 **Standards-based.** Tools are registered on `document.modelContext` (WebMCP). The polyfill (`@mcp-b/webmcp-polyfill`) installs it where browsers don't natively support it yet.\n- 🎯 **Producer + consumer in one.** Expose your app's actions as precise tools *and* fall back to text-based DOM driving for everything else.\n- 🧠 **Bring your own LLM.** A tiny provider-agnostic interface, plus a ready-made Vercel AI SDK adapter.\n- 🪶 **Headless core.** No UI imposed — wire it to your own chat, command bar, or voice.\n- ✨ **Opt-in visualizer.** Status chips per action, an animated gradient glow around the element being acted on, and a backdrop blur that spotlights it (`@aralroca/gui-agent/ui`).\n\n> ⚠️ Early/experimental. WebMCP is a moving [W3C draft](https://webmachinelearning.github.io/webmcp/); APIs may change.\n\n_Thinking is cheap. But what if your agents didn't have to think so much—and instead had **TOTAL CONTROL** of your app (**AUTOMATICALLY**)? Take a look **[Janux Framework](https://github.com/aralroca/Janux)** for more than gui-agent lib_\n\n\n## Table of Contents\n\n- [Install](#install)\n- [Quick start](#quick-start)\n- [How it works](#how-it-works)\n  - [How the agent picks a tool](#how-the-agent-picks-a-tool)\n- [Compared to page-agent](#compared-to-page-agent)\n- [API](#api)\n  - [Core](#core-aralrocagui-agent)\n  - [Visualizing the agent](#-visualizing-the-agent-aralrocagui-agentui)\n  - [Bring your own LLM](#bring-your-own-llm)\n  - [AI SDK adapter](#ai-sdk-adapter-aralrocagui-agentai-sdk)\n  - [React](#react-aralrocagui-agentreact)\n- [Safety](#safety)\n- [Demo](#demo)\n- [Develop](#develop)\n- [License](#license)\n\n## Install\n\n```bash\nnpm i @aralroca/gui-agent\n# optional peers, depending on what you use:\nnpm i ai zod        # for the AI SDK adapter / Zod schemas\n```\n\n## Quick start\n\n```ts\nimport { defineTool, GuiAgent } from \"@aralroca/gui-agent\";\nimport { createAiSdkLlm } from \"@aralroca/gui-agent/ai-sdk\";\n\n// 1. Expose your app's actions as tools (producer side, optional).\ndefineTool({\n  name: \"go_to_tab\",\n  description: \"Switch the console to a tab.\",\n  inputSchema: { type: \"object\", properties: { tab: { type: \"string\" } }, required: [\"tab\"] },\n  annotations: { readOnlyHint: true },\n  execute: ({ tab }) => router.push(`/${tab}`),\n});\n\n// 2. Run the agent. It discovers your tools + synthesizes DOM tools (click/fill/read).\nconst agent = new GuiAgent({\n  llm: createAiSdkLlm({ model: \"anthropic/claude-opus-4-8\" }),\n  confirm: async (call) => window.confirm(`Allow \"${call.name}\"?`), // HITL gate\n});\n\nawait agent.run(\"Invite jane@acme.com to the team as admin\");\n```\n\nImporting the package installs the WebMCP polyfill automatically — **no `<script>` tag**.\n\n## How it works\n\n`gui-agent` unifies two approaches:\n\n1. **Producer (WebMCP).** Your app calls `defineTool(...)` to register reliable, structured actions on `document.modelContext`. Any WebMCP agent — including a browser's native one — can use them.\n2. **DOM fallback (page-agent style).** For anything not exposed, the agent builds a compact **text snapshot** of the page (roles, labels, values, stable refs like `e7`) and gets synthesized `read_page` / `click` / `fill` / `select_option` / `drag` / `wait_for_text` tools. No screenshots, no multimodal model needed.\n\nThe built-in loop discovers all available tools, asks your LLM what to do, runs the calls (gated by your optional `confirm`), feeds results back, and repeats until done.\n\n### How the agent picks a tool\n\nFor each step the agent prefers a **purpose-built WebMCP tool** if one fits, and only **infers the DOM** when nothing is exposed for the job:\n\n```mermaid\nflowchart TD\n    Goal[\"🗣️  Goal in natural language\"] --> Loop[\"🧠  Agent loop · bring your own LLM<br/>(AI SDK adapter · remote LLM · React bindings)\"]\n    Loop --> Discover[\"🔍  Discover the available tools\"]\n    Discover --> Decide{\"Is there a purpose-built<br/>WebMCP tool for this step?\"}\n    Decide -- \"Yes · preferred\" --> WebMCP[\"⚙️  Call the WebMCP tool<br/>structured &amp; reliable\"]\n    Decide -- \"No · fallback\" --> DOM[\"🖱️  Infer from the DOM<br/>read_page → click / fill / select_option / drag / wait_for_text\"]\n    WebMCP --> Gate{\"Does the tool have<br/>readOnlyHint?\"}\n    DOM --> Gate\n    Gate -- \"No · write action\" --> Confirm[\"🙋  Human-in-the-loop confirm()\"]\n    Gate -- \"Yes · read-only\" --> Run[\"Execute\"]\n    Confirm -- \"approved\" --> Run\n    Confirm -- \"denied\" --> Feed\n    Run --> Feed[\"Feed the result back to the LLM\"]\n    Feed --> Loop\n    Loop -. \"no more tool calls · maxSteps\" .-> Done[\"🏁  Done\"]\n\n    subgraph MC[\"document.modelContext · WebMCP (polyfilled — no server, no browser extension)\"]\n      direction LR\n      App[\"Your app's own actions<br/>defineTool() / useTool()\"]\n      Ext[\"Tools registered by other code<br/>discoverExternalTools() · opt-in\"]\n    end\n    Discover -. reads .-> App\n    Discover -. reads .-> Ext\n```\n\n> The agent is handed a **single merged tool list** and is instructed to prefer your app's WebMCP tools; the synthesized DOM tools are the always-on fallback (a same-named app tool wins). WebMCP tools live on `document.modelContext` — your app registers them (so any WebMCP agent, including the browser's native one, can call them) and `discoverExternalTools()` can pull in tools other code registered there. `upload_file` and `navigate` DOM tools are opt-in.\n\n## Compared to page-agent\n\ngui-agent is inspired by **[page-agent](https://github.com/alibaba/page-agent)** and shares its core idea — a natural-language agent that drives a real web page from a **text-based DOM** snapshot (no screenshots, no multimodal model) with a bring-your-own-LLM design. The difference is what gui-agent adds by building on the emerging **WebMCP** standard instead of DOM-driving alone:\n\n| Capability | gui-agent | page-agent |\n| --- | --- | --- |\n| **WebMCP standard** (`document.modelContext`) | ✅ Built on the [W3C WebMCP draft](https://webmachinelearning.github.io/webmcp/) + polyfill | ❌ Not WebMCP — its \"MCP\" is a separate Node server that lets *external* agents drive the browser |\n| **App actions as standard tools** | ✅ `defineTool` registers structured actions on `document.modelContext`, callable by *any* WebMCP agent — including the browser's native one | ⚠️ Custom tools are client-side config, marked `@experimental`, and not exposed via a page standard |\n| **Interop with other in-page tools** | ✅ `discoverExternalTools()` picks up tools other code registered on `document.modelContext` | ❌ Not available |\n| **Human-in-the-loop safety gate** | ✅ Built-in `confirm()` gate — every non-`readOnlyHint` tool is routed through approval before it runs | ⚠️ No mandatory approval gate and no read-only/write distinction (runs autonomously up to `maxSteps`); offers `ask_user`, lifecycle hooks and data-masking instead |\n| **First-class React bindings** | ✅ `GuiAgentProvider`, `useGuiAgent`, `useTool`, `<AgentSteps />` | ❌ None (vanilla panel UI) |\n| **Provider-agnostic LLM** | ✅ Any shape via a one-function `Llm` interface, plus a Vercel AI SDK adapter and a remote-LLM helper | ⚠️ Bring-your-own, but the endpoint must be **OpenAI-compatible** |\n| **Producer + consumer in one** | ✅ Precise structured producer tools *and* a DOM fallback in a single loop | ➖ Primarily a DOM driver (custom tools experimental) |\n\n**When page-agent is the better fit.** page-agent is excellent and has real strengths gui-agent doesn't: it drives **any existing site's DOM without the app opting in**, so it works on legacy or third-party apps (ERP, CRM, admin panels) you don't control — whereas gui-agent's producer tools need the app to register them (its DOM fallback still works anywhere, but the WebMCP value comes from instrumentation). page-agent also ships an optional **Chrome extension** for cross-tab tasks and a **Node MCP server** so external agents (Claude Desktop, Cursor) can drive a real browser. Both projects are MIT-licensed, TypeScript, text-based, and ship an activity visualizer.\n\nIn short: reach for **page-agent** to automate sites you *don't* own; reach for **gui-agent** when you *do* own the app and want standards-based, structured, human-gated tools — with a DOM fallback for everything else.\n\n## API\n\n### Core (`@aralroca/gui-agent`)\n\n| Export | Purpose |\n| --- | --- |\n| `defineTool(def, opts?)` → `dispose` | Register a WebMCP tool. `def`: `{ name, description, inputSchema?, annotations?, execute }`. `inputSchema` accepts plain JSON Schema or a Zod schema. Unregister via the returned function or `opts.signal`. |\n| `new GuiAgent(options)` / `agent.run(goal, signal?)` | The agent loop. Options: `{ llm, systemPrompt?, maxSteps?, domFallback?, confirm?, onStep?, domTools? }`. |\n| `runAgent(goal, options)` | One-shot convenience. |\n| `registry` / `ToolRegistry` | The tool registry (source of truth, mirrored to `document.modelContext`). |\n| `discoverExternalTools()` | Read tools registered on `document.modelContext` by other code. |\n| `ensureModelContext()` / `hasModelContext()` | Polyfill bootstrap helpers. |\n| `DomSnapshotter` / `createDomTools()` | The DOM-fallback primitives, if you want them standalone. |\n| `dragAndDrop(source, target, timing?)` → `{ dropped, refused }` | Drag one element onto another by firing the page's HTML5 drag and drop events (`dragstart` → `dragenter` → `dragover` → `drop` → `dragend`, one shared `DataTransfer`). The page's own rules decide: a target that doesn't cancel `dragover` gets no `drop`. Pass `VISIBLE_DRAG` to pace it like the visualizer's pointer. |\n\n`GuiAgentOptions.domTools` forwards `DomToolsOptions` (`root`, `maxNodes`, `allowNavigation`, `onTarget`) to the per-run DOM tools. Just before each click/fill/select, the resolved live element is re-emitted on `onStep` as a `tool-target` step (carrying the originating `ToolCall`) — it's what powers the visualizer's glow.\n\n### ✨ Visualizing the agent (`@aralroca/gui-agent/ui`)\n\nShow users what the agent is doing while it does it: a status chip per tool call (\"Clicking\" with a spinner → ✓, ✗ on error, blocked when denied), a \"Thinking…\" indicator between turns, and an **animated gradient glow ring** around the DOM element being acted on — while the rest of the page **blurs behind a backdrop veil** so the target stands out. Zero dependencies, rendered in shadow DOM so styles never leak.\n\n```ts\nimport { GuiAgent } from \"@aralroca/gui-agent\";\nimport { createAgentVisualizer } from \"@aralroca/gui-agent/ui\";\n\nconst viz = createAgentVisualizer({\n  container: document.querySelector(\"#agent-steps\")!, // where the chips go\n});\n\n// `bind` composes the visualizer into your agent options (it never replaces\n// your own `onStep` — it chains it).\nconst agent = new GuiAgent(viz.bind({ llm }));\nawait agent.run(\"Invite jane@acme.com as admin\");\n```\n\nEverything is configurable:\n\n```ts\ncreateAgentVisualizer({\n  chips: true,               // action chip list\n  highlight: true,           // glow ring on the target element\n  cursor: false,             // simulated mouse pointer travelling to each target\n  showThinking: true,        // \"Thinking…\" indicator between LLM turns\n  locateButton: true,        // ◎ button on chips to re-flash the target\n  glowDuration: 1200,        // ms the ring holds on the last target before fading\n  glowDwell: 500,            // min ms per target when several highlights queue up\n  backdrop: {                // blur/dim the page around the target (or false)\n    blur: 3,                 // px\n    exclude: [\"chat-panel\"], // element ids (or Elements) to keep sharp\n  },\n  labels: {                  // per-tool chip labels (string or fn)\n    click: \"Clicking\",\n    invite_member: (call) => `Inviting ${call.arguments.email}`,\n  },\n  theme: {                   // maps to --gua-* CSS custom properties\n    accent: \"#2563eb\",\n    chipBg: \"#f4f4f5\",\n    chipBorder: \"#e4e4e7\",\n    chipText: \"#3f3f46\",\n    font: \"system-ui, sans-serif\",\n    glowColors: [\"#7c8cf8\", \"#f0a6c8\", \"#7ee0c3\"],\n  },\n});\n```\n\nThe glow follows automatically for the DOM-fallback tools (`click`, `fill`, `select_option`). Producer tools act through your own code, so they opt in by calling `viz.highlight(target)` from their `execute` — call it once per element you touch and the ring tours them in order (agent actions run faster than human perception, so highlights are queued with a minimum dwell per target).\n\n`target` can be an element **or a CSS selector**. Pass a selector when your tool creates its target asynchronously — a React Flow (`@xyflow/react`) node, a portal, a lazily-rendered row — and the ring waits (up to ~2s) for it to mount instead of no-op'ing on a missing element:\n\n```ts\nconst id = graph.addNode({ label });        // returns synchronously…\nviz.highlight(`.react-flow__node[data-id=\"${id}\"]`); // …DOM node mounts a tick later; the ring waits for it\n```\n\nSet `cursor: true` to add a **simulated mouse pointer** on top of that tour: an arrow that travels to each target the ring visits and ripples where it lands, so the user sees *where* an action happened and not just that it did. It rides the same queue as the ring — including `viz.highlight()` calls from your own tools — follows the target if the page scrolls under it, and teleports without the ripple under `prefers-reduced-motion`. It is a drawn overlay, not the OS pointer: it does not fire `:hover` or real pointer events, and it never delays the action it illustrates.\n\n**Drag and drop.** The DOM fallback's `drag` tool (`{ ref, to }`) drags a `draggable=\"true\"` element onto a drop target; the page outline flags draggable elements and drop targets (`droptarget`, next to their own role) — elements with `aria-dropeffect` (e.g. `aria-dropeffect=\"move\"` on a board column) or an `ondrop` handler. With `cursor: true` the pointer lands on what is dragged and carries an inert copy of it (no ids, handlers, frames or live custom elements) to the target, where it lets go — on the part of the target that is on screen, as the drop events are, so a tall column never takes a drop below the fold. Your own tools show the same with `viz.drag(from, to)` and perform it with `dragAndDrop(from, to, VISIBLE_DRAG)`:\n\n```ts\ndefineTool({\n  name: \"move_card\",\n  description: \"Move a card to another column.\",\n  inputSchema: { type: \"object\", properties: { card: { type: \"string\" }, column: { type: \"string\" } }, required: [\"card\", \"column\"] },\n  execute: async ({ card, column }) => {\n    const from = document.getElementById(String(card))!;\n    const to = document.querySelector(`[aria-label=\"${column}\"]`)!;\n    viz.drag(from, to);\n    const { dropped } = await dragAndDrop(from, to, VISIBLE_DRAG);\n    return dropped ? `Moved to ${column}.` : `${column} doesn't take that card.`;\n  },\n});\n```\n\nKnown limitation: elements in the top layer (`<dialog showModal>`, fullscreen) paint above the overlay.\n\n### Bring your own LLM\n\nImplement the `Llm` interface — one async function, one turn:\n\n```ts\nimport type { Llm } from \"@aralroca/gui-agent\";\n\nconst llm: Llm = async ({ messages, tools, signal }) => {\n  // call your model with `messages` + `tools`; return one turn\n  return { text: \"...\", toolCalls: [{ id, name, arguments }] };\n};\n```\n\n### AI SDK adapter (`@aralroca/gui-agent/ai-sdk`)\n\n```ts\nimport { createAiSdkLlm, createRemoteLlm } from \"@aralroca/gui-agent/ai-sdk\";\n\n// Run the model in-process (client key, demo, or server agent):\nconst llm = createAiSdkLlm({ model: \"anthropic/claude-opus-4-8\" });\n\n// …or keep the model server-side and execute tools in the browser:\nconst llm = createRemoteLlm({ api: \"/api/chat\" });\n// endpoint receives { messages, tools } and returns { text?, toolCalls? }\n```\n\n### React (`@aralroca/gui-agent/react`)\n\n```tsx\nimport { useTool, GuiAgentProvider, useGuiAgent, AgentSteps } from \"@aralroca/gui-agent/react\";\n\nfunction UsersPage() {\n  // Registered while mounted; auto-unregistered (AbortSignal) on unmount.\n  useTool({\n    name: \"search_users\",\n    description: \"Search users by name or id\",\n    inputSchema: { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"] },\n    annotations: { readOnlyHint: true },\n    execute: ({ query }) => store.search(query),\n  });\n  return /* … */;\n}\n\nfunction Chat() {\n  const { run, running, steps, visualizer } = useGuiAgent();\n  // wire to your own chat UI; <AgentSteps /> renders the visualizer's chips\n}\n\n// Enable the visualizer on the provider (true, or AgentVisualizerOptions):\n<GuiAgentProvider llm={llm} visualizer>\n  <Chat />\n  <AgentSteps />\n</GuiAgentProvider>\n```\n\n## Safety\n\nWebMCP tools run with the user's existing session/cookies, so a tool can do real, privileged things. `gui-agent` gives you a **`confirm` gate**: any tool *without* `annotations.readOnlyHint` is routed through your `confirm(call, tool)` callback before it runs — the natural place to plug in a human-in-the-loop approval UI. Mark genuinely read-only tools with `readOnlyHint: true` so they don't prompt. See the WebMCP spec's [security considerations](https://webmachinelearning.github.io/webmcp/#security-privacy).\n\n## Demo\n\n```bash\nnpm run demo   # opens a mini \"console\" you can drive in natural language\n```\n\nTry: *\"invite jane@acme.com as admin\"*, *\"search Kenji\"*, *\"change my display name to Neo\"* (the last one uses the DOM fallback — nothing is exposed for it), *\"move Fix login redirect to Done\"* on the **Board** tab (a plain HTML5 drag and drop kanban: the agent drags the card with the DOM fallback's `drag` tool and the pointer carries it to its column), or *\"build a workflow\"* on the **Workflows** tab — a React Flow canvas where the glow follows each node as the agent adds it (selector highlighting, since the nodes mount asynchronously). The demo ships with the visualizer enabled by default, so you'll see the chips, the glow tour, and the backdrop veil exactly as in the GIF above.\n\n## Develop\n\n```bash\nnpm install\nnpm test          # vitest + jsdom\nnpm run build     # tsup → ESM + .d.ts for all entry points\nnpm run typecheck\n```\n\n## License\n\n[MIT](./LICENSE) © Aral Roca\n","readmeFilename":"README.md"}