@vpxa/aikit 0.1.342 → 0.1.344

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/package.json +1 -1
  2. package/packages/blocks-core/dist/index.mjs +18 -16
  3. package/packages/browser/dist/index.js +4 -3
  4. package/packages/server/dist/bin.js +1 -1
  5. package/packages/server/dist/index.js +1 -1
  6. package/packages/server/dist/prelude-DOxnDMN4.js +2 -0
  7. package/packages/server/dist/prelude-Dzih_AGV.js +1 -0
  8. package/packages/server/dist/{server-CwYfCGQr.js → server-2ntNwLtr.js} +72 -90
  9. package/packages/server/dist/{server-http-2zHnHy1e.js → server-http-BXF275jD.js} +1 -1
  10. package/packages/server/dist/{server-http-BNm7jb2u.js → server-http-BwaQWT2R.js} +1 -1
  11. package/packages/server/dist/{server-DjMWDhDD.js → server-qVK37TfU.js} +72 -90
  12. package/packages/server/dist/{server-stdio-Bf_YCZLu.js → server-stdio-By2Kx_7Y.js} +1 -1
  13. package/packages/server/dist/{server-stdio-C9dH1M3E.js → server-stdio-DVjY0Ebj.js} +1 -1
  14. package/packages/server/viewers/architecture-static.html +802 -789
  15. package/packages/server/viewers/c4-viewer.html +27 -27
  16. package/packages/server/viewers/canvas.html +83 -83
  17. package/packages/server/viewers/process-flow-static.html +13 -2
  18. package/packages/server/viewers/task-plan-static.html +7 -7
  19. package/packages/server/viewers/tour-viewer.html +3 -3
  20. package/scaffold/dist/definitions/bodies.mjs +1 -2
  21. package/scaffold/dist/definitions/skills/browser-use.mjs +63 -33
  22. package/scaffold/dist/definitions/skills/c4-architecture.mjs +1 -1
  23. package/scaffold/dist/definitions/skills/docs.mjs +1 -1
  24. package/scaffold/dist/definitions/skills/present.mjs +14 -0
  25. package/packages/server/dist/prelude-BBzH1oUe.js +0 -1
  26. package/packages/server/dist/prelude-DMZvfysi.js +0 -2
@@ -1,4 +1,5 @@
1
- import{exec as e,execFile as t,execFileSync as n,execSync as r}from"node:child_process";import{existsSync as i,mkdirSync as a,readFileSync as o,unlinkSync as s,writeFileSync as c}from"node:fs";import{homedir as l,platform as u,tmpdir as d}from"node:os";import{join as f}from"node:path";import{z as p}from"zod";const m=`0.26.0`,h=`.agent-browser-version`;function g(e){return typeof e==`string`?e.trim():e instanceof Buffer?e.toString(`utf8`).trim():``}function _(){return f(l(),`.aikit`,`browsers`)}function v(e){return e.browsersPath??process.env.AIKIT_BROWSER_PATH??process.env.AIKIT_BROWSER_BROWSERS_PATH??_()}function y(){try{let e=r(`${u()===`win32`?`where`:`which`} agent-browser`,{encoding:`utf8`,stdio:`pipe`,timeout:3e3}).trim().split(/\r?\n/)[0];if(!e)return null;if(u()===`win32`){if(i(`${e}.cmd`))return`${e}.cmd`;if(i(`${e}.bat`))return`${e}.bat`;if(i(`${e}.exe`))return`${e}.exe`}return i(e)?e:null}catch{return null}}function ee(e){return f(e,`agent-browser`,te())}function te(){switch(u()){case`win32`:return`agent-browser.exe`;default:return`agent-browser`}}function ne(e,t){try{c(f(e,h),t,`utf8`)}catch{}}function re(e){try{return o(f(e,h),`utf8`).trim()}catch{return null}}function ie(e){let t=re(e);return t?ae(t,m)>=0:!1}function ae(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]||0,i=r[e]||0;if(t!==i)return t-i}return 0}function oe(e){return!!(i(f(e,`chrome`))||i(f(l(),`.cache`,`agent-browser`,`chrome`)))}async function b(e,t){let n=y();if(n)return t?.(`Using globally installed agent-browser`),n;let o=v(e);i(o)||a(o,{recursive:!0});let s=ee(o);if(i(s)&&ie(o))return t?.(`Using cached agent-browser at ${s}`),s;t?.(`Downloading agent-browser (first use)...`);try{r(`npx -y agent-browser@latest install --install-dir "${o}"`,{stdio:`pipe`,timeout:12e4,encoding:`utf8`,env:{...process.env,AGENT_BROWSER_CACHE_DIR:o}})}catch(e){let t=e,n=g(t.stderr)||g(t.stdout)||t.message||`Unknown agent-browser install failure`;throw Error(`Failed to install agent-browser: ${n}`)}let c=s;try{let e=r(`npx -y -p agent-browser which agent-browser 2>/dev/null || true`,{encoding:`utf8`,timeout:1e4,stdio:`pipe`}).trim();e&&i(e)&&(c=e,ne(o,m))}catch{try{let e=r(`npx -y agent-browser --version`,{encoding:`utf8`,timeout:1e4,stdio:`pipe`}).trim();e&&ne(o,e)}catch{}}return t?.(`agent-browser ready`),c}async function se(e){try{return n(e,[`--version`],{encoding:`utf8`,stdio:`pipe`,timeout:5e3}).trim()}catch{return null}}function ce(e){if(y())return!0;let t=v(e);return oe(t)||i(ee(t))}const le=[`ui`,`headless`];function x(e){return le.includes(e)?e:`headless`}function S(e){let t=[];return e===`headless`&&t.push(`--headless`),t}function ue(e){return{headless:e===`headless`,args:S(e)}}var C=class{tabs=new Map;labelToId=new Map;register(e,t,n,r){return this.tabs.set(e,{tabId:e,url:t,title:n??t,label:r,createdAt:new Date}),r&&this.labelToId.set(r,e),e}resolve(e){return this.tabs.has(e)?e:this.labelToId.get(e)||e}getTab(e){let t=this.tabs.get(e);if(!t)throw Error(`Tab not found: ${e}`);return t}updateTabInfo(e,t,n){let r=this.tabs.get(e);r&&this.tabs.set(e,{...r,url:t,title:n})}setSnapshot(e,t){let n=this.tabs.get(e);n&&this.tabs.set(e,{...n,snapshot:t})}getSnapshot(e){return this.tabs.get(e)?.snapshot}async removeTab(e){let t=this.tabs.get(e);t&&(t.label&&this.labelToId.delete(t.label),this.tabs.delete(e))}listTabs(){return[...this.tabs.values()]}listPages(){return this.listTabs().map(e=>({pageId:e.tabId,url:e.url,title:e.title,label:e.label,createdAt:e.createdAt}))}async closeAll(){this.tabs.clear(),this.labelToId.clear()}clear(){this.tabs.clear(),this.labelToId.clear()}get size(){return this.tabs.size}},de=class{tabs=new C;registerPage(e,t,n,r){return this.tabs.register(e,t,n,r)}getPage(e){throw Error(`Direct Playwright Page access no longer supported with agent-browser. Use engine.exec() or engine.tabExec() for browser operations.`)}getPageInfo(e){let t=this.tabs.getTab(e);return{pageId:t.tabId,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}}resolvePageId(e){return this.tabs.resolve(e)}setSnapshot(e,t){this.tabs.setSnapshot(e,t)}getSnapshot(e){return this.tabs.getSnapshot(e)}updatePageInfo(e,t,n){this.tabs.updateTabInfo(e,t,n)}async removePage(e){await this.tabs.removeTab(e)}listPages(){return this.tabs.listPages()}async closeAll(){await this.tabs.closeAll()}get size(){return this.tabs.size}};const w={defaultMode:`ui`,browsersPath:null,userDataDirRoot:null,idleShutdownMinutes:10,allowInternalSchemes:!1,allowLoopback:!1,evalTimeoutMs:3e4,evalMaxResultBytes:262144,redactPasswordFieldsInScreenshots:!0,engine:`chrome`};var T=class{binaryPath=null;_currentMode=null;_isLaunched=!1;idleTimer=null;tabs=new C;config;constructor(e={}){this.config={...w,...e}}get currentMode(){return this._currentMode}async launch(e,t){let n=x(e??this.config.defaultMode);if(!(this._isLaunched&&this._currentMode===n)){this._isLaunched&&this._currentMode!==n&&await this.close(),this._currentMode=n,this.binaryPath=await b(this.config,t);try{let e=await this.exec(`--version`);t?.(`agent-browser ${e.stdout.trim()}`)}catch(e){throw Error(`agent-browser binary failed: ${e instanceof Error?e.message:String(e)}`)}this._isLaunched=!0,this.resetIdleTimer()}}async exec(e,...t){if(!this.binaryPath)throw Error(`agent-browser not launched. Call launch() first, or use getEngine() singleton.`);let n=this.binaryPath;u()===`win32`&&!n.endsWith(`.cmd`)&&!n.endsWith(`.bat`)&&!n.endsWith(`.exe`)&&i(`${n}.cmd`)&&(n=`${n}.cmd`);let r=[e,...t];if(u()===`win32`&&(n.endsWith(`.cmd`)||n.endsWith(`.bat`))){let e=`"${n}" ${r.map(e=>/[^\w/:@.\-_{}()/\\]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e).join(` `)}`;return await this.execViaShell(e)}return await this.execViaExecFile(n,r)}execViaExecFile(e,n){return new Promise((r,i)=>{t(e,n,{timeout:this.config.evalTimeoutMs},(t,a,o)=>{if(t){let s=t;if(s.code===`ENOENT`){i(Error(`agent-browser binary not found at ${this.binaryPath}`));return}if(s.killed||s.signal){i(Error(`agent-browser command timed out after ${this.config.evalTimeoutMs}ms: ${e} ${n.join(` `)}`));return}r({stdout:a??``,stderr:o??``,exitCode:typeof s.code==`number`?s.code:1});return}r({stdout:a??``,stderr:o??``,exitCode:0})}).stdin?.end()})}execViaShell(t){return new Promise((n,r)=>{e(t,{timeout:this.config.evalTimeoutMs},(e,i,a)=>{if(e){let o=e;if(o.code===`ENOENT`){r(Error(`agent-browser binary not found at ${this.binaryPath}`));return}if(o.killed||o.signal){r(Error(`agent-browser command timed out after ${this.config.evalTimeoutMs}ms: ${t}`));return}n({stdout:i??``,stderr:a??``,exitCode:typeof o.code==`number`?o.code:1});return}n({stdout:i??``,stderr:a??``,exitCode:0})})})}async tabExec(e,t,...n){return this.exec(`tab`,e,t,...n)}async open(e,t,n){await this.launch(t);let r=this._currentMode===`ui`?[`open`,e,`--headed`]:[`open`,e],i=await this.exec(...r);if(i.exitCode!==0)throw Error(`agent-browser failed to open URL (exit ${i.exitCode}): ${i.stderr||i.stdout||`Unknown error`}`);return this.tabs.register(`t0`,e,i.stdout.trim(),n),this.resetIdleTimer(),`t0`}async screenshot(e,t){let n=t?.format??`png`,r=n===`jpeg`?`image/jpeg`:`image/png`,i=n===`jpeg`?`jpg`:`png`,a=f(t?.screenshotDir??d(),`aikit-screenshot-${Date.now()}.${i}`),c=[a];t?.fullPage&&c.push(`--full`),t?.screenshotDir&&c.push(`--screenshot-dir`,t.screenshotDir),t?.format===`jpeg`&&c.push(`--screenshot-format`,`jpeg`),t?.quality&&c.push(`--screenshot-quality`,String(t.quality)),t?.annotate&&c.push(`--annotate`),await this.exec(`screenshot`,...c);let l=o(a),u=l.toString(`base64`);try{s(a)}catch{}return this.resetIdleTimer(),{base64:u,mimeType:r,bytes:l.length}}async readSnapshot(e,t=!1){let n=t?[`-c`,`--json`]:[`-i`,`--json`],r=await this.tabExec(e,`snapshot`,...n);return this.resetIdleTimer(),r.stdout}async navigate(e,t){let n=await this.tabExec(e,`goto`,t);return this.resetIdleTimer(),n}async close(){if(this.stopIdleTimer(),this._isLaunched){try{await this.exec(`close`).catch(()=>{})}catch{}this.tabs.clear(),this._isLaunched=!1,this._currentMode=null}}isLaunched(){return this._isLaunched}getConfig(){return this.config}getBinaryPath(){return this.binaryPath}resolvePageId(e){return this.tabs.resolve(e)}resetIdleTimer(){this.stopIdleTimer();let e=setTimeout(()=>{this.close()},this.config.idleShutdownMinutes*6e4);e.unref?.(),this.idleTimer=e}stopIdleTimer(){this.idleTimer&&=(clearTimeout(this.idleTimer),null)}};let E=null;function D(e){return E||=new T(e),E}async function fe(){E&&=(await E.close(),null)}function O(e,t){try{let n=new URL(e),r=n.hostname.toLowerCase(),i=n.protocol.toLowerCase();return[`file:`,`chrome:`,`chrome-extension:`,`data:`,`javascript:`].includes(i)?t?.allowInternalSchemes?{allowed:!0}:{allowed:!1,reason:`Scheme '${i}' is blocked for security`}:[`169.254.169.254`,`metadata.google.internal`,`metadata.instance`].includes(r)?{allowed:!1,reason:`Cloud metadata endpoint '${r}' is blocked`}:n.hostname===`localhost`||r===`127.0.0.1`||r===`::1`||r.startsWith(`10.`)||r.startsWith(`172.`)||r.startsWith(`192.168.`)?t?.allowLoopback?{allowed:!0}:{allowed:!1,reason:`Internal host '${r}' requires allowLoopback=true`}:{allowed:!0}}catch{return{allowed:!1,reason:`Invalid URL`}}}function k(e,t){return Buffer.byteLength(e,`utf8`)<=t?{valid:!0,result:e,truncated:!1}:{valid:!0,result:`${Buffer.from(e).subarray(0,t).toString(`utf8`)}\n... [truncated]`,truncated:!0,reason:`Result exceeded ${t} bytes, truncated to ${t} bytes`}}const pe=[`ui`,`headless`];function me(e){return typeof e==`object`&&e?e:null}function A(e){return typeof e==`string`&&e.length>0?e:void 0}function j(e){return typeof e==`boolean`?e:void 0}function M(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function N(e){return typeof e==`string`&&pe.includes(e)?e:void 0}function P(e){let t=process.env[e];if(!t)return;let n=Number(t);return Number.isFinite(n)?n:void 0}function he(e){let t=me(e.browser)??{};return{...w,defaultMode:N(process.env.AIKIT_BROWSER_DEFAULT_MODE)??N(t.defaultMode)??w.defaultMode,browsersPath:A(process.env.AIKIT_BROWSER_PATH)??A(process.env.AIKIT_BROWSER_BROWSERS_PATH)??A(t.browsersPath)??w.browsersPath,userDataDirRoot:A(t.userDataDirRoot)??w.userDataDirRoot,idleShutdownMinutes:P(`AIKIT_BROWSER_IDLE_MINUTES`)??M(t.idleShutdownMinutes)??w.idleShutdownMinutes,allowInternalSchemes:j(t.allowInternalSchemes)??w.allowInternalSchemes,allowLoopback:j(t.allowLoopback)??w.allowLoopback,evalTimeoutMs:P(`AIKIT_BROWSER_EVAL_TIMEOUT_MS`)??M(t.evalTimeoutMs)??w.evalTimeoutMs,evalMaxResultBytes:M(t.evalMaxResultBytes)??w.evalMaxResultBytes,redactPasswordFieldsInScreenshots:j(t.redactPasswordFieldsInScreenshots)??w.redactPasswordFieldsInScreenshots,engine:A(t.engine)??w.engine,proxy:A(t.proxy),viewport:A(t.viewport)}}function F(e,t){return{content:[{type:`text`,text:e}],structuredContent:t}}function I(e,t){let n=e.selector??e.ref??(e.element?`text=${e.element}`:void 0);if(!n)throw Error(`${t} requires selector, ref, or element`);return n}function ge(e){return async({pageId:t,kind:n,ref:r,selector:i,element:a,text:o,key:s,value:c,fromRef:l,fromSelector:u,toRef:d,toSelector:f})=>{let p=D(e),m=p.resolvePageId(t);switch(n){case`click`:{let e=I({ref:r,selector:i,element:a},`browser_act(click)`);await p.tabExec(m,`click`,e);break}case`type`:{let e=I({ref:r,selector:i,element:a},`browser_act(type)`);await p.tabExec(m,`fill`,e,o??``);break}case`press`:{let e=I({ref:r,selector:i,element:a},`browser_act(press)`);if(!s)throw Error(`browser_act(press) requires key`);await p.tabExec(m,`press`,e,s);break}case`hover`:{let e=I({ref:r,selector:i,element:a},`browser_act(hover)`);await p.tabExec(m,`hover`,e);break}case`drag`:{let e=I({ref:l??r,selector:u??i,element:a},`browser_act(drag) source`),t=I({ref:d,selector:f??c,element:a},`browser_act(drag) target`);await p.tabExec(m,`drag`,e,t);break}case`select`:{let e=I({ref:r,selector:i,element:a},`browser_act(select)`);if(c===void 0)throw Error(`browser_act(select) requires value`);await p.tabExec(m,`select`,e,c);break}case`scroll`:{if(i||r||a){let e=I({ref:r,selector:i,element:a},`browser_act(scroll)`);await p.tabExec(m,`scrollintoview`,e);break}let e=c??`down 500`;await p.tabExec(m,`scroll`,e);break}case`upload`:{let e=I({ref:r,selector:i,element:a},`browser_act(upload)`);if(!c)throw Error(`value (file path) required for upload`);await p.tabExec(m,`upload`,e,c);break}}return p.resetIdleTimer(),F(`ok`,{ok:!0})}}function _e(e){return async({pageId:t,subAction:n,level:r,bufferSize:i})=>{let a=D(e),o=a.resolvePageId(t);switch(n){case`enable`:{let e=[`--enable`];return i&&e.push(`--buffer-size`,String(i)),r&&e.push(`--level`,r),await a.tabExec(o,`console`,...e),a.resetIdleTimer(),F(`Console capture enabled`,{enabled:!0})}case`get`:{let e=[`--json`];r&&e.push(`--level`,r);let t=await a.tabExec(o,`console`,...e);a.resetIdleTimer();let n=[];try{n=JSON.parse(t.stdout)}catch{n=[{raw:t.stdout}]}return F(`Console has ${n.length} entries`,{entries:n,count:n.length})}case`clear`:return await a.tabExec(o,`console`,`clear`),a.resetIdleTimer(),F(`Console cleared`,{cleared:!0});default:return F(`Unknown console sub-action`,{error:`Unknown console sub-action`})}}}function ve(e){return async({pageId:t,accept:n,promptText:r})=>{let i=D(e),a=i.resolvePageId(t);if(n){let e=r?[`accept`,`--text`,r]:[`accept`];await i.tabExec(a,`dialog`,...e)}else await i.tabExec(a,`dialog`,`dismiss`);return i.resetIdleTimer(),F(`Dialog ${n?`accepted`:`dismissed`}`,{accepted:n})}}function ye(e){return async({pageId:t})=>{let n=D(e),r=n.resolvePageId(t),i=await n.tabExec(r,`diff`,`snapshot`);return n.resetIdleTimer(),F(i.stdout,{pageId:r,diff:i.stdout})}}function be(e){return async({pageId:t,code:n,timeoutMs:r})=>{let i=D(e),a=i.resolvePageId(t),o=r??e.evalTimeoutMs,s=await i.tabExec(a,`evaluate`,`--timeout=${o}`,`--`,n);i.resetIdleTimer();let c=k(s.stdout,e.evalMaxResultBytes);return F(c.result,{pageId:a,result:c.result,truncated:c.truncated})}}function xe(e){return async({pageId:t,url:n,method:r,headers:i,body:a,timeoutMs:o,includeHeaders:s})=>{let c=D(e),l=c.resolvePageId(t),u=o??e.evalTimeoutMs,d=Se(n,r??`GET`,s??!0,i,a),f=await c.tabExec(l,`evaluate`,`--timeout=${u}`,`--`,d);return c.resetIdleTimer(),F(f.stdout,{pageId:l,response:f.stdout})}}function Se(e,t,n,r,i){let a={method:t,headers:r??{}};i&&[`POST`,`PUT`,`PATCH`].includes(t.toUpperCase())&&(a.body=i);let o=JSON.stringify(a);return n?`fetch(${JSON.stringify(e)}, ${o}).then(async r => {
1
+ import{exec as e,execFile as t,execFileSync as n,execSync as r}from"node:child_process";import{existsSync as i,mkdirSync as a,readFileSync as o,unlinkSync as s,writeFileSync as c}from"node:fs";import{homedir as l,platform as u,tmpdir as d}from"node:os";import{join as f}from"node:path";import{z as p}from"zod";const m=`0.26.0`,h=`.agent-browser-version`;function ee(e){return typeof e==`string`?e.trim():e instanceof Buffer?e.toString(`utf8`).trim():``}function g(){return f(l(),`.aikit`,`browsers`)}function _(e){return e.browsersPath??process.env.AIKIT_BROWSER_PATH??process.env.AIKIT_BROWSER_BROWSERS_PATH??g()}function v(){try{let e=r(`${u()===`win32`?`where`:`which`} agent-browser`,{encoding:`utf8`,stdio:`pipe`,timeout:3e3}).trim().split(/\r?\n/)[0];if(!e)return null;if(u()===`win32`){if(i(`${e}.cmd`))return`${e}.cmd`;if(i(`${e}.bat`))return`${e}.bat`;if(i(`${e}.exe`))return`${e}.exe`}return i(e)?e:null}catch{return null}}function y(e){return f(e,`agent-browser`,te())}function te(){switch(u()){case`win32`:return`agent-browser.exe`;default:return`agent-browser`}}function b(e,t){try{c(f(e,h),t,`utf8`)}catch{}}function ne(e){try{return o(f(e,h),`utf8`).trim()}catch{return null}}function re(e){let t=ne(e);return t?ie(t,m)>=0:!1}function ie(e,t){let n=e.split(`.`).map(Number),r=t.split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]||0,i=r[e]||0;if(t!==i)return t-i}return 0}function ae(e){return!!(i(f(e,`chrome`))||i(f(l(),`.cache`,`agent-browser`,`chrome`)))}async function oe(e,t){let n=v();if(n)return t?.(`Using globally installed agent-browser`),n;let o=_(e);i(o)||a(o,{recursive:!0});let s=y(o);if(i(s)&&re(o))return t?.(`Using cached agent-browser at ${s}`),s;t?.(`Downloading agent-browser (first use)...`);try{r(`npx -y agent-browser@latest install --install-dir "${o}"`,{stdio:`pipe`,timeout:12e4,encoding:`utf8`,env:{...process.env,AGENT_BROWSER_CACHE_DIR:o}})}catch(e){let t=e,n=ee(t.stderr)||ee(t.stdout)||t.message||`Unknown agent-browser install failure`;throw Error(`Failed to install agent-browser: ${n}`)}let c=s;try{let e=r(`npx -y -p agent-browser which agent-browser 2>/dev/null || true`,{encoding:`utf8`,timeout:1e4,stdio:`pipe`}).trim();e&&i(e)&&(c=e,b(o,m))}catch{try{let e=r(`npx -y agent-browser --version`,{encoding:`utf8`,timeout:1e4,stdio:`pipe`}).trim();e&&b(o,e)}catch{}}return t?.(`agent-browser ready`),c}async function se(e){try{return n(e,[`--version`],{encoding:`utf8`,stdio:`pipe`,timeout:5e3}).trim()}catch{return null}}function ce(e){if(v())return!0;let t=_(e);return ae(t)||i(y(t))}const le=[`ui`,`headless`];function ue(e){return le.includes(e)?e:`headless`}function de(e){let t=[];return e===`headless`&&t.push(`--headless`),t}function fe(e){return{headless:e===`headless`,args:de(e)}}var x=class{tabs=new Map;labelToId=new Map;register(e,t,n,r){return this.tabs.set(e,{tabId:e,url:t,title:n??t,label:r,createdAt:new Date}),r&&this.labelToId.set(r,e),e}resolve(e){return this.tabs.has(e)?e:this.labelToId.get(e)||e}getTab(e){let t=this.tabs.get(e);if(!t)throw Error(`Tab not found: ${e}`);return t}updateTabInfo(e,t,n){let r=this.tabs.get(e);r&&this.tabs.set(e,{...r,url:t,title:n})}setSnapshot(e,t){let n=this.tabs.get(e);n&&this.tabs.set(e,{...n,snapshot:t})}getSnapshot(e){return this.tabs.get(e)?.snapshot}async removeTab(e){let t=this.tabs.get(e);t&&(t.label&&this.labelToId.delete(t.label),this.tabs.delete(e))}listTabs(){return[...this.tabs.values()]}listPages(){return this.listTabs().map(e=>({pageId:e.tabId,url:e.url,title:e.title,label:e.label,createdAt:e.createdAt}))}async closeAll(){this.tabs.clear(),this.labelToId.clear()}clear(){this.tabs.clear(),this.labelToId.clear()}get size(){return this.tabs.size}},pe=class{tabs=new x;registerPage(e,t,n,r){return this.tabs.register(e,t,n,r)}getPage(e){throw Error(`Direct Playwright Page access no longer supported with agent-browser. Use engine.exec() or engine.tabExec() for browser operations.`)}getPageInfo(e){let t=this.tabs.getTab(e);return{pageId:t.tabId,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}}resolvePageId(e){return this.tabs.resolve(e)}setSnapshot(e,t){this.tabs.setSnapshot(e,t)}getSnapshot(e){return this.tabs.getSnapshot(e)}updatePageInfo(e,t,n){this.tabs.updateTabInfo(e,t,n)}async removePage(e){await this.tabs.removeTab(e)}listPages(){return this.tabs.listPages()}async closeAll(){await this.tabs.closeAll()}get size(){return this.tabs.size}};const S={defaultMode:`ui`,browsersPath:null,userDataDirRoot:null,idleShutdownMinutes:10,allowInternalSchemes:!1,allowLoopback:!1,evalTimeoutMs:3e4,evalMaxResultBytes:262144,redactPasswordFieldsInScreenshots:!0,engine:`chrome`};var C=class{binaryPath=null;_currentMode=null;_isLaunched=!1;idleTimer=null;tabs=new x;config;constructor(e={}){this.config={...S,...e}}get currentMode(){return this._currentMode}async launch(e,t){let n=ue(e??this.config.defaultMode);if(!(this._isLaunched&&this._currentMode===n)){this._isLaunched&&this._currentMode!==n&&await this.close(),this._currentMode=n,this.binaryPath=await oe(this.config,t);try{let e=await this.exec(`--version`);t?.(`agent-browser ${e.stdout.trim()}`)}catch(e){throw Error(`agent-browser binary failed: ${e instanceof Error?e.message:String(e)}`)}this._isLaunched=!0,this.resetIdleTimer()}}async exec(e,...t){if(!this.binaryPath)throw Error(`agent-browser not launched. Call launch() first, or use getEngine() singleton.`);let n=this.binaryPath;u()===`win32`&&!n.endsWith(`.cmd`)&&!n.endsWith(`.bat`)&&!n.endsWith(`.exe`)&&i(`${n}.cmd`)&&(n=`${n}.cmd`);let r=[e,...t];if(u()===`win32`&&(n.endsWith(`.cmd`)||n.endsWith(`.bat`))){let e=`"${n}" ${r.map(e=>/[^\w/:@.\-_{}()/\\]/.test(e)?`"${e.replace(/"/g,`""`)}"`:e).join(` `)}`;return await this.execViaShell(e)}return await this.execViaExecFile(n,r)}execViaExecFile(e,n){return new Promise((r,i)=>{t(e,n,{timeout:this.config.evalTimeoutMs},(t,a,o)=>{if(t){let s=t;if(s.code===`ENOENT`){i(Error(`agent-browser binary not found at ${this.binaryPath}`));return}if(s.killed||s.signal){i(Error(`agent-browser command timed out after ${this.config.evalTimeoutMs}ms: ${e} ${n.join(` `)}`));return}r({stdout:a??``,stderr:o??``,exitCode:typeof s.code==`number`?s.code:1});return}r({stdout:a??``,stderr:o??``,exitCode:0})}).stdin?.end()})}execViaShell(t){return new Promise((n,r)=>{e(t,{timeout:this.config.evalTimeoutMs},(e,i,a)=>{if(e){let o=e;if(o.code===`ENOENT`){r(Error(`agent-browser binary not found at ${this.binaryPath}`));return}if(o.killed||o.signal){r(Error(`agent-browser command timed out after ${this.config.evalTimeoutMs}ms: ${t}`));return}n({stdout:i??``,stderr:a??``,exitCode:typeof o.code==`number`?o.code:1});return}n({stdout:i??``,stderr:a??``,exitCode:0})})})}async tabExec(e,t,...n){return this.exec(`tab`,e,t,...n)}async open(e,t,n){await this.launch(t);let r=this._currentMode===`ui`?[`open`,e,`--headed`]:[`open`,e],i=await this.exec(...r);if(i.exitCode!==0)throw Error(`agent-browser failed to open URL (exit ${i.exitCode}): ${i.stderr||i.stdout||`Unknown error`}`);return this.tabs.register(`t0`,e,i.stdout.trim(),n),this.resetIdleTimer(),`t0`}async screenshot(e,t){let n=t?.format??`png`,r=n===`jpeg`?`image/jpeg`:`image/png`,i=n===`jpeg`?`jpg`:`png`,a=f(t?.screenshotDir??d(),`aikit-screenshot-${Date.now()}.${i}`),c=[a];t?.fullPage&&c.push(`--full`),t?.screenshotDir&&c.push(`--screenshot-dir`,t.screenshotDir),t?.format===`jpeg`&&c.push(`--screenshot-format`,`jpeg`),t?.quality&&c.push(`--screenshot-quality`,String(t.quality)),t?.annotate&&c.push(`--annotate`),await this.exec(`screenshot`,...c);let l=o(a),u=l.toString(`base64`);try{s(a)}catch{}return this.resetIdleTimer(),{base64:u,mimeType:r,bytes:l.length}}async readSnapshot(e,t=!1){let n=t?[`-c`,`--json`]:[`-i`,`--json`],r=await this.tabExec(e,`snapshot`,...n);return this.resetIdleTimer(),r.stdout}async navigate(e,t){let n=await this.tabExec(e,`goto`,t);return this.resetIdleTimer(),n}async close(){if(this.stopIdleTimer(),this._isLaunched){try{await this.exec(`close`).catch(()=>{})}catch{}this.tabs.clear(),this._isLaunched=!1,this._currentMode=null}}isLaunched(){return this._isLaunched}getConfig(){return this.config}getBinaryPath(){return this.binaryPath}resolvePageId(e){return this.tabs.resolve(e)}resetIdleTimer(){this.stopIdleTimer();let e=setTimeout(()=>{this.close()},this.config.idleShutdownMinutes*6e4);e.unref?.(),this.idleTimer=e}stopIdleTimer(){this.idleTimer&&=(clearTimeout(this.idleTimer),null)}};let w=null;function T(e){return w||=new C(e),w}async function me(){w&&=(await w.close(),null)}function E(e,t){try{let n=new URL(e),r=n.hostname.toLowerCase(),i=n.protocol.toLowerCase();return[`file:`,`chrome:`,`chrome-extension:`,`data:`,`javascript:`].includes(i)?t?.allowInternalSchemes?{allowed:!0}:{allowed:!1,reason:`Scheme '${i}' is blocked for security`}:[`169.254.169.254`,`metadata.google.internal`,`metadata.instance`].includes(r)?{allowed:!1,reason:`Cloud metadata endpoint '${r}' is blocked`}:n.hostname===`localhost`||r===`127.0.0.1`||r===`::1`||r.startsWith(`10.`)||r.startsWith(`172.`)||r.startsWith(`192.168.`)?t?.allowLoopback?{allowed:!0}:{allowed:!1,reason:`Internal host '${r}' requires allowLoopback=true`}:{allowed:!0}}catch{return{allowed:!1,reason:`Invalid URL`}}}function D(e,t){return Buffer.byteLength(e,`utf8`)<=t?{valid:!0,result:e,truncated:!1}:{valid:!0,result:`${Buffer.from(e).subarray(0,t).toString(`utf8`)}\n... [truncated]`,truncated:!0,reason:`Result exceeded ${t} bytes, truncated to ${t} bytes`}}const he=[`ui`,`headless`];function ge(e){return typeof e==`object`&&e?e:null}function O(e){return typeof e==`string`&&e.length>0?e:void 0}function k(e){return typeof e==`boolean`?e:void 0}function A(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function j(e){return typeof e==`string`&&he.includes(e)?e:void 0}function M(e){let t=process.env[e];if(!t)return;let n=Number(t);return Number.isFinite(n)?n:void 0}function _e(e){let t=ge(e.browser)??{};return{...S,defaultMode:j(process.env.AIKIT_BROWSER_DEFAULT_MODE)??j(t.defaultMode)??S.defaultMode,browsersPath:O(process.env.AIKIT_BROWSER_PATH)??O(process.env.AIKIT_BROWSER_BROWSERS_PATH)??O(t.browsersPath)??S.browsersPath,userDataDirRoot:O(t.userDataDirRoot)??S.userDataDirRoot,idleShutdownMinutes:M(`AIKIT_BROWSER_IDLE_MINUTES`)??A(t.idleShutdownMinutes)??S.idleShutdownMinutes,allowInternalSchemes:k(t.allowInternalSchemes)??S.allowInternalSchemes,allowLoopback:k(t.allowLoopback)??S.allowLoopback,evalTimeoutMs:M(`AIKIT_BROWSER_EVAL_TIMEOUT_MS`)??A(t.evalTimeoutMs)??S.evalTimeoutMs,evalMaxResultBytes:A(t.evalMaxResultBytes)??S.evalMaxResultBytes,redactPasswordFieldsInScreenshots:k(t.redactPasswordFieldsInScreenshots)??S.redactPasswordFieldsInScreenshots,engine:O(t.engine)??S.engine,proxy:O(t.proxy),viewport:O(t.viewport)}}function N(e,t){return{content:[{type:`text`,text:e}],structuredContent:t}}function P(e,t){let n=e.selector??e.ref??(e.element?`text=${e.element}`:void 0);if(!n)throw Error(`${t} requires selector, ref, or element`);return n}function F(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`){let e=I(t);if(e.length>0)return e.join(`
2
+ `)}return JSON.stringify(t,null,2)}catch{return e}}function I(e,t=0,n=[]){let r=` `.repeat(t),i=typeof e.role==`string`?e.role.toUpperCase():``,a=typeof e.ref==`string`?e.ref:``,o=typeof e.name==`string`?e.name:``,s=typeof e.value==`string`?`="${e.value}"`:``,c=Array.isArray(e.children)?e.children:[];if(i&&a){let e=ve(i),t=o||s||``;n.push(`${r}[${e}] [${a}] ${t}`.trimEnd())}else if(o||i){let e=i.toLowerCase();n.push(`${r}${e}: ${o}`.trimEnd())}for(let e of c)typeof e==`object`&&e&&I(e,t+1,n);return n}function ve(e){return{BUTTON:`BUTTON`,LINK:`LINK`,TEXT_FIELD:`TEXTFIELD`,TEXTBOX:`TEXTFIELD`,COMBOBOX:`SELECT`,CHECKBOX:`CHECKBOX`,RADIO:`RADIO`,SWITCH:`SWITCH`,SLIDER:`SLIDER`,TAB:`TAB`,MENU_ITEM:`MENUITEM`,LISTBOX:`LIST`,GRID:`GRID`,TABLE:`TABLE`,HEADING:`HEADING`,IMAGE:`IMAGE`,IMG:`IMAGE`,PROGRESSBAR:`PROGRESS`,DIALOG:`DIALOG`,TOOLTIP:`TOOLTIP`,ALERT:`ALERT`,MENU:`MENU`,NAVIGATION:`NAV`,SEARCH:`SEARCH`,MAIN:`MAIN`,COMPLEMENTARY:`COMPLEMENT`,CONTENTINFO:`INFO`,REGION:`REGION`}[e]??e.slice(0,8)}function ye(e){return async({pageId:t,kind:n,ref:r,selector:i,element:a,text:o,key:s,value:c,fromRef:l,fromSelector:u,toRef:d,toSelector:f})=>{let p=T(e),m=p.resolvePageId(t);switch(n){case`click`:{let e=P({ref:r,selector:i,element:a},`browser_act(click)`);await p.tabExec(m,`click`,e);break}case`type`:{let e=P({ref:r,selector:i,element:a},`browser_act(type)`);await p.tabExec(m,`fill`,e,o??``);break}case`press`:{let e=P({ref:r,selector:i,element:a},`browser_act(press)`);if(!s)throw Error(`browser_act(press) requires key`);await p.tabExec(m,`press`,e,s);break}case`hover`:{let e=P({ref:r,selector:i,element:a},`browser_act(hover)`);await p.tabExec(m,`hover`,e);break}case`drag`:{let e=P({ref:l??r,selector:u??i,element:a},`browser_act(drag) source`),t=P({ref:d,selector:f??c,element:a},`browser_act(drag) target`);await p.tabExec(m,`drag`,e,t);break}case`select`:{let e=P({ref:r,selector:i,element:a},`browser_act(select)`);if(c===void 0)throw Error(`browser_act(select) requires value`);await p.tabExec(m,`select`,e,c);break}case`scroll`:{if(i||r||a){let e=P({ref:r,selector:i,element:a},`browser_act(scroll)`);await p.tabExec(m,`scrollintoview`,e);break}let e=c??`down 500`;await p.tabExec(m,`scroll`,e);break}case`upload`:{let e=P({ref:r,selector:i,element:a},`browser_act(upload)`);if(!c)throw Error(`value (file path) required for upload`);await p.tabExec(m,`upload`,e,c);break}}return p.resetIdleTimer(),N(`ok`,{ok:!0})}}function be(e){return async({pageId:t,subAction:n,level:r,bufferSize:i,expression:a})=>{let o=T(e),s=o.resolvePageId(t);switch(n){case`enable`:{let e=[`--enable`];return i&&e.push(`--buffer-size`,String(i)),r&&e.push(`--level`,r),await o.tabExec(s,`console`,...e),o.resetIdleTimer(),N(`Console capture enabled`,{enabled:!0})}case`get`:{let t=[`--json`];r&&t.push(`--level`,r);let n=await o.tabExec(s,`console`,...t);o.resetIdleTimer();let i=[];try{i=JSON.parse(n.stdout)}catch{i=[{raw:n.stdout}]}let c,l;if(a)try{c=(await o.tabExec(s,`evaluate`,`--timeout=${e.evalTimeoutMs}`,`--`,a)).stdout}catch(e){l=e instanceof Error?e.message:String(e)}return N(c===void 0?`Console has ${i.length} entries`:`Console has ${i.length} entries\nEvaluation: ${c}`,{entries:i,count:i.length,expression:a,evalResult:c,evalError:l})}case`clear`:return await o.tabExec(s,`console`,`clear`),o.resetIdleTimer(),N(`Console cleared`,{cleared:!0});default:return N(`Unknown console sub-action`,{error:`Unknown console sub-action`})}}}function xe(e){return async({pageId:t,accept:n,promptText:r})=>{let i=T(e),a=i.resolvePageId(t);if(n){let e=r?[`accept`,`--text`,r]:[`accept`];await i.tabExec(a,`dialog`,...e)}else await i.tabExec(a,`dialog`,`dismiss`);return i.resetIdleTimer(),N(`Dialog ${n?`accepted`:`dismissed`}`,{accepted:n})}}function Se(e){return async({pageId:t})=>{let n=T(e),r=n.resolvePageId(t),i=await n.tabExec(r,`diff`,`snapshot`);return n.resetIdleTimer(),N(i.stdout,{pageId:r,diff:i.stdout})}}function Ce(e){return async({pageId:t,code:n,timeoutMs:r})=>{let i=T(e),a=i.resolvePageId(t),o=r??e.evalTimeoutMs,s=await i.tabExec(a,`evaluate`,`--timeout=${o}`,`--`,n);i.resetIdleTimer();let c=D(s.stdout,e.evalMaxResultBytes);return N(c.result,{pageId:a,result:c.result,truncated:c.truncated})}}function we(e){return async({pageId:t,url:n,method:r,headers:i,body:a,timeoutMs:o,includeHeaders:s})=>{let c=T(e),l=c.resolvePageId(t),u=o??e.evalTimeoutMs,d=Te(n,r??`GET`,s??!0,i,a),f=await c.tabExec(l,`evaluate`,`--timeout=${u}`,`--`,d);return c.resetIdleTimer(),N(f.stdout,{pageId:l,response:f.stdout})}}function Te(e,t,n,r,i){let a={method:t,headers:r??{}};i&&[`POST`,`PUT`,`PATCH`].includes(t.toUpperCase())&&(a.body=i);let o=JSON.stringify(a);return n?`fetch(${JSON.stringify(e)}, ${o}).then(async r => {
2
3
  const text = await r.text();
3
4
  const headers = {};
4
5
  r.headers.forEach((v, k) => { headers[k] = v; });
@@ -6,5 +7,5 @@ import{exec as e,execFile as t,execFileSync as n,execSync as r}from"node:child_p
6
7
  })`:`fetch(${JSON.stringify(e)}, ${o}).then(async r => {
7
8
  const text = await r.text();
8
9
  return JSON.stringify({ status: r.status, statusText: r.statusText, body: text.slice(0, 100000) });
9
- })`}function Ce(e){return async({pageId:t,url:n,type:r,selector:i,timeoutMs:a})=>{let o=D(e),s=o.resolvePageId(t);if(n){let t=O(n,e);if(!t.allowed)return F(`Navigation blocked: ${t.reason}`,{blocked:!0,pageId:s,reason:t.reason});await o.tabExec(s,`goto`,n)}else if(!r)return F(`Navigation requires url or type`,{error:`Navigation requires url or type`,pageId:s});else if(r===`back`)await o.tabExec(s,`back`);else if(r===`forward`)await o.tabExec(s,`forward`);else if(r===`reload`)await o.tabExec(s,`reload`);else if(r===`waitFor`){if(!i)throw Error(`browser_navigate(waitFor) requires selector`);let e=a?[i,String(a)]:[i];await o.tabExec(s,`wait`,...e)}let c=await o.tabExec(s,`get`,`text`).catch(()=>({stdout:n??``})),l=await o.tabExec(s,`get`,`attr`,`title`).catch(()=>({stdout:``})),u=c.stdout.trim()||n||``,d=l.stdout.trim()||u;return o.tabs.updateTabInfo(s,u,d),o.resetIdleTimer(),F(`${d||u}\n${u}`,{pageId:s,url:u,title:d})}}function we(e){return async({pageId:t,subAction:n,filter:r,includeBody:i,bufferSize:a})=>{let o=D(e),s=o.resolvePageId(t);switch(n){case`enable`:{let e=[`--enable`];return r?.resourceTypes&&e.push(`--filter`,r.resourceTypes.join(`,`)),i&&e.push(`--include-body`),a&&e.push(`--buffer-size`,String(a)),await o.tabExec(s,`network`,...e),o.resetIdleTimer(),F(`Network capture enabled`,{enabled:!0,filter:r})}case`get`:{let e=await o.tabExec(s,`network`,`requests`,`--json`);o.resetIdleTimer();let t=[];try{t=JSON.parse(e.stdout)}catch{t=[{raw:e.stdout}]}return F(`Captured ${t.length} network requests`,{entries:t,count:t.length})}case`clear`:return await o.tabExec(s,`network`,`clear`),o.resetIdleTimer(),F(`Network capture cleared`,{cleared:!0});case`export-har`:{let e=await o.tabExec(s,`network`,`har`);return o.resetIdleTimer(),F(e.stdout,{har:e.stdout})}default:return F(`Unknown network sub-action`,{error:`Unknown network sub-action`})}}}function Te(e){return async({url:t,mode:n,label:r,waitUntil:i,forceNew:a,autoDialog:o})=>{let s=O(t,e);if(!s.allowed)return F(`Navigation blocked: ${s.reason}`,{blocked:!0,reason:s.reason});let c=D(e);await c.launch(n);let l=await c.exec(`open`,t);c.tabs.register(`t0`,t,r??l.stdout.trim(),r),c.resetIdleTimer();let u=[];return i===`networkidle`&&u.push(`--wait-until`,`networkidle`),i===`domcontentloaded`&&u.push(`--wait-until`,`domcontentloaded`),u.length>0&&await c.tabExec(`t0`,`wait`,...u).catch(()=>{}),F(`Opened ${t}\nTab: t0`,{pageId:`t0`,url:t,tabId:`t0`,label:r})}}function Ee(e){return async({pageId:t,mode:n,selector:r})=>{let i=D(e),a=i.resolvePageId(t);switch(n??`snapshot`){case`snapshot`:{let e=[`-i`,`--json`];r&&e.push(`-s`,r);let t=await i.tabExec(a,`snapshot`,...e);return i.tabs.setSnapshot(a,t.stdout),i.resetIdleTimer(),F(t.stdout,{pageId:a,mode:`snapshot`,content:t.stdout})}case`dom`:{let e=await i.tabExec(a,`get`,`html`);return i.resetIdleTimer(),F(e.stdout,{pageId:a,mode:`dom`,content:e.stdout})}case`markdown`:{let e=await i.tabExec(a,`snapshot`,`-c`);return i.resetIdleTimer(),F(e.stdout,{pageId:a,mode:`markdown`,content:e.stdout})}case`text`:{let e=await i.tabExec(a,`get`,`text`);return i.resetIdleTimer(),F(e.stdout,{pageId:a,mode:`text`,content:e.stdout})}default:return F(`Unknown read mode`,{error:`Unknown read mode`,pageId:a})}}}function De(e){return async({pageId:t,ref:n,selector:r,fullPage:i,clip:a,format:o,quality:s})=>{let c=D(e),l=c.resolvePageId(t),u=r??n;if(u){let e=await c.tabExec(l,`screenshot`,`--element`,u);return c.resetIdleTimer(),F(`Screenshot captured for element ${u}`,{element:u,pageId:l,screenshot:e.stdout})}let d=await c.screenshot(l,{fullPage:i,format:o,quality:s});return c.resetIdleTimer(),F(`Screenshot captured (${d.bytes} bytes)`,{pageId:l,base64:d.base64,mimeType:d.mimeType,bytes:d.bytes})}}function Oe(e){return async({sessionAction:t,pageId:n,confirm:r,cookies:i,name:a,storageType:o,storageKey:s,storageValue:c})=>{let l=D(e),u=n?l.resolvePageId(n):void 0;switch(t){case`list`:{let e=l.tabs.listPages().map(e=>({pageId:e.pageId,url:e.url,title:e.title,label:e.label,createdAt:e.createdAt.toISOString()}));return F(`Open tabs: ${e.length}\n${e.map(e=>` ${e.pageId}: ${e.title||e.url}`).join(`
10
- `)}`,{pages:e})}case`close`:return u?(await l.tabExec(u,`close`).catch(()=>{}),await l.tabs.removeTab(u),l.resetIdleTimer(),F(`Closed tab ${u}`,{closed:u})):F(`close requires pageId`,{error:`pageId required`});case`cookies`:{if(!r)return F(`Cookie export requires explicit confirmation. Set confirm: true to proceed.`,{confirmRequired:!0});let e=await l.tabExec(u??`t0`,`cookies`),t=[];try{t=JSON.parse(e.stdout)}catch{t=[{raw:e.stdout}]}return F(`Exported ${t.length} cookies`,{cookies:t,count:t.length})}case`set-cookie`:{if(!i||i.length===0)return F(`set-cookie requires cookies array`,{error:`cookies array required`});let e=i.map(e=>`${e.name}=${e.value}${e.domain?`; domain=${e.domain}`:``}${e.path?`; path=${e.path}`:``}`).join(` `);return await l.tabExec(u??`t0`,`cookies`,`set`,e),l.resetIdleTimer(),F(`Set ${i.length} cookies`,{count:i.length})}case`delete-cookie`:return a?(await l.tabExec(u??`t0`,`cookies`,`clear`,a),l.resetIdleTimer(),F(`Deleted cookie ${a}`,{deleted:a})):F(`delete-cookie requires name`,{error:`name required`});case`clear-cookies`:return await l.tabExec(u??`t0`,`cookies`,`clear`),l.resetIdleTimer(),F(`Cookies cleared`,{cleared:!0});case`get-storage`:{if(!o||!s)return F(`get-storage requires storageType and storageKey`,{error:`storageType and storageKey required`});let e=await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`get`,s);return l.resetIdleTimer(),F(e.stdout,{value:e.stdout})}case`set-storage`:return!o||!s||c===void 0?F(`set-storage requires storageType, storageKey, and storageValue`,{error:`storageType, storageKey, storageValue required`}):(await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`set`,s,c),l.resetIdleTimer(),F(`Storage key ${s} set`,{key:s}));case`clear-storage`:return o?(await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`clear`),l.resetIdleTimer(),F(`Storage cleared`,{cleared:!0})):F(`clear-storage requires storageType`,{error:`storageType required`});default:return F(`Unknown session action`,{error:`Unknown session action`})}}}const L=[`open`,`batch`,`read`,`act`,`navigate`,`network`,`console`,`fetch`,`eval`,`diff`,`screenshot`,`dialog`,`session`],R=[`ui`,`headless`],z=[`load`,`domcontentloaded`,`networkidle`],B=[`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`],V=[`back`,`forward`,`reload`,`waitFor`],H=[`enable`,`get`,`clear`,`export-har`],U=[`enable`,`get`,`clear`],W=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`],G=[`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`],ke={action:p.enum(L).describe(`Browser action to perform`),pageId:p.string().optional().describe(`Tracked browser page identifier`),label:p.string().optional().describe(`Human-readable label for the page (used as alternative to pageId)`),url:p.string().url().optional().describe(`URL to open or navigate to`),mode:p.enum(R).optional().describe(`Browser launch mode (open only)`),forceNew:p.boolean().optional().describe(`Reserved for future tab reuse`),autoDialog:p.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true). Set false to handle all dialogs manually.`),waitUntil:p.enum(z).optional().describe(`Navigation readiness event`),kind:p.enum(B).optional().describe(`Interaction kind (act only)`),ref:p.string().optional().describe(`Target ref alias`),selector:p.string().optional().describe(`CSS selector for targeting`),element:p.string().optional().describe(`Human-readable element label. Prefer selector for precision.`),text:p.string().optional().describe(`Text to type`),key:p.string().optional().describe(`Key to press`),value:p.string().optional().describe(`Option value or drag target`),fromRef:p.string().optional().describe(`Drag source ref`),fromSelector:p.string().optional().describe(`Drag source selector`),toRef:p.string().optional().describe(`Drag target ref`),toSelector:p.string().optional().describe(`Drag target selector`),type:p.enum(V).optional().describe(`Navigation type`),subAction:p.enum(H).optional().describe(`Network sub-action: enable, get, clear, or export-har`),code:p.string().optional().describe(`JavaScript expression or IIFE evaluated in page context.`),timeoutMs:p.number().min(1).max(6e4).optional().describe(`Timeout in milliseconds`),filter:p.object({resourceTypes:p.array(p.string()).optional(),urlPattern:p.string().optional(),excludeUrls:p.array(p.string()).optional()}).optional().describe(`Network capture filter for resource types and URL patterns`),showSensitive:p.boolean().optional().describe(`Include sensitive headers instead of redacting them`),includeBody:p.boolean().optional().describe(`Include truncated request bodies in captured entries`),bufferSize:p.number().int().min(1).max(1e4).optional().describe(`Buffer capacity (1-10000, default varies by action)`),consoleSubAction:p.enum(U).optional().describe(`Console sub-action: enable, get, or clear`),level:p.string().optional().describe(`Filter console entries by level (log/info/warn/error/debug)`),fetchUrl:p.string().optional().describe(`URL for fetch action (http/https only). Uses page cookies/session.`),fetchMethod:p.enum(W).optional().describe(`HTTP method for fetch action (default: GET)`),fetchHeaders:p.record(p.string(),p.string()).optional().describe(`Custom headers for fetch action`),fetchBody:p.string().optional().describe(`Request body for fetch action (POST/PUT/PATCH)`),includeResponseHeaders:p.boolean().optional().describe(`Include response headers in fetch output (default: true)`),fullPage:p.boolean().optional().describe(`Capture full page`),redactPasswords:p.boolean().optional().describe(`Mask password fields`),readMode:p.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode for read action: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),clip:p.object({x:p.number(),y:p.number(),width:p.number(),height:p.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),format:p.enum([`png`,`jpeg`]).optional().describe(`Screenshot image format (default: png)`),quality:p.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`),cookies:p.array(p.object({name:p.string(),value:p.string(),url:p.string().optional(),domain:p.string().optional(),path:p.string().optional(),expires:p.number().optional(),httpOnly:p.boolean().optional(),secure:p.boolean().optional(),sameSite:p.enum([`Lax`,`None`,`Strict`]).optional()})).optional().describe(`Cookies to set (for session set-cookie action)`),name:p.string().optional().describe(`Cookie name for delete-cookie action`),storageType:p.enum([`localStorage`,`sessionStorage`]).optional().describe(`Storage type for get/set/clear-storage actions`),storageKey:p.string().optional().describe(`Storage key to get or set`),storageValue:p.string().optional().describe(`Value to set in storage`),accept:p.boolean().optional().describe(`Accept or dismiss dialog`),promptText:p.string().optional().describe(`Text for prompt dialog`),sessionAction:p.enum(G).optional().describe(`Session sub-action (session only)`),confirm:p.boolean().optional().describe(`Explicit confirmation for cookie export`),steps:p.array(p.record(p.string(),p.unknown())).optional().describe(`Array of action steps for batch execution. Each step is an object with action + action-specific params.`)};function Ae(e,t){return typeof e==`string`&&t.includes(e)}function K(e,t,n){let r=e[t];if(typeof r!=`string`)throw Error(`${n} requires ${t}`);return r}function je(e,t,n){let r=e[t];if(typeof r!=`boolean`)throw Error(`${n} requires ${t}`);return r}function q(e,t){let n=e[t];return typeof n==`string`?n:void 0}function J(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Y(e,t){let n=e[t];return typeof n==`number`?n:void 0}function X(e,t){let n=e[t];return typeof n==`object`&&n?n:void 0}function Me(e,t){let n=e.steps;if(!Array.isArray(n)||n.length===0)throw Error(`${t} requires non-empty steps`);return n.map((e,n)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} step ${n+1} must be an object`);return e})}function Z(e,t,n,r){let i=e[t];if(!Ae(i,n))throw Error(`${r} requires ${t}`);return i}function Q(e,t,n,r){let i=e[t];if(i!==void 0){if(!Ae(i,n))throw Error(`${r} received invalid ${t}`);return i}}function Ne(e,t){let n=q(e,`pageId`);if(n)return D(t).resolvePageId(n)}function $(e,t,n){let r=q(e,`pageId`);if(!r)throw Error(`${n} requires pageId`);return D(t).resolvePageId(r)}async function Pe(e,t,n){let r=Z(e,`action`,L,`browser`);switch(r){case`open`:return t.openHandler({url:K(e,`url`,`browser(open)`),mode:Q(e,`mode`,R,`browser(open)`),forceNew:J(e,`forceNew`),label:q(e,`label`),autoDialog:J(e,`autoDialog`),waitUntil:Q(e,`waitUntil`,z,`browser(open)`)});case`batch`:{let r=Me(e,`browser(batch)`),i=[],a=0;for(let e=0;e<r.length;e+=1){let o=r[e],s=q(o,`action`)??`unknown`;try{let r=await Pe(o,t,n);a+=1,i.push({index:e,action:s,ok:!0,result:r})}catch(t){i.push({index:e,action:s,ok:!1,error:t instanceof Error?t.message:String(t)})}}return F(`Batch completed: ${a}/${r.length} steps succeeded`,{total:r.length,succeeded:a,steps:i})}case`read`:return t.readHandler({pageId:$(e,n,`browser(read)`),mode:Q(e,`readMode`,[`snapshot`,`dom`,`markdown`,`text`],`browser(read)`),selector:q(e,`selector`)});case`act`:return t.actHandler({pageId:$(e,n,`browser(act)`),kind:Z(e,`kind`,B,`browser(act)`),ref:q(e,`ref`),selector:q(e,`selector`),element:q(e,`element`),text:q(e,`text`),key:q(e,`key`),value:q(e,`value`),fromRef:q(e,`fromRef`),fromSelector:q(e,`fromSelector`),toRef:q(e,`toRef`),toSelector:q(e,`toSelector`)});case`navigate`:return t.navigateHandler({pageId:$(e,n,`browser(navigate)`),url:q(e,`url`),type:Q(e,`type`,V,`browser(navigate)`),selector:q(e,`selector`),timeoutMs:Y(e,`timeoutMs`)});case`network`:return t.networkHandler({pageId:$(e,n,`browser(network)`),subAction:Z(e,`subAction`,H,`browser(network)`),filter:X(e,`filter`),showSensitive:J(e,`showSensitive`),includeBody:J(e,`includeBody`),bufferSize:Y(e,`bufferSize`)});case`console`:return t.consoleHandler({pageId:$(e,n,`browser(console)`),subAction:Z(e,`consoleSubAction`,U,`browser(console)`),level:q(e,`level`),bufferSize:Y(e,`bufferSize`)});case`fetch`:return t.fetchHandler({pageId:$(e,n,`browser(fetch)`),url:K(e,`fetchUrl`,`browser(fetch)`),method:Q(e,`fetchMethod`,W,`browser(fetch)`),headers:X(e,`fetchHeaders`),body:q(e,`fetchBody`),timeoutMs:Y(e,`timeoutMs`),includeHeaders:J(e,`includeResponseHeaders`)});case`eval`:return t.evalHandler({pageId:$(e,n,`browser(eval)`),code:K(e,`code`,`browser(eval)`),timeoutMs:Y(e,`timeoutMs`)});case`diff`:return t.diffHandler({pageId:$(e,n,`browser(diff)`)});case`screenshot`:{let r=X(e,`clip`);return t.screenshotHandler({pageId:$(e,n,`browser(screenshot)`),ref:q(e,`ref`),selector:q(e,`selector`),fullPage:J(e,`fullPage`),redactPasswords:J(e,`redactPasswords`),clip:r,format:Q(e,`format`,[`png`,`jpeg`],`browser(screenshot)`),quality:Y(e,`quality`)})}case`dialog`:return t.dialogHandler({pageId:$(e,n,`browser(dialog)`),accept:je(e,`accept`,`browser(dialog)`),promptText:q(e,`promptText`)});case`session`:return t.sessionHandler({sessionAction:Z(e,`sessionAction`,G,`browser(session)`),pageId:q(e,`pageId`)&&Ne(e,n),confirm:J(e,`confirm`),cookies:X(e,`cookies`),name:q(e,`name`),storageType:Q(e,`storageType`,[`localStorage`,`sessionStorage`],`browser(session)`),storageKey:q(e,`storageKey`),storageValue:q(e,`storageValue`)});default:return F(`Unknown action: ${r}`,{error:`Unknown action: ${r}`})}}function Fe(e,t){let n=he(t),r={openHandler:Te(n),readHandler:Ee(n),actHandler:ge(n),navigateHandler:Ce(n),networkHandler:we(n),consoleHandler:_e(n),fetchHandler:xe(n),evalHandler:be(n),diffHandler:ye(n),screenshotHandler:De(n),dialogHandler:ve(n),sessionHandler:Oe(n)};e.tool(`browser`,`Unified browser automation tool using agent-browser (Chrome DevTools Protocol). Provides open, read, act, navigate, screenshot, eval, dialog, network, console, fetch, diff, session actions.`,ke,async e=>{try{let t=await Pe(e,r,n);return{content:t.content,structuredContent:t.structuredContent}}catch(e){return{content:[{type:`text`,text:`Browser error: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{T as BrowserEngine,w as DEFAULT_BROWSER_CONFIG,de as SessionRegistry,C as TabRegistry,x as autoSelectMode,fe as closeEngine,b as ensureAgentBrowserInstalled,se as getAgentBrowserVersion,S as getDaemonArgs,_ as getDefaultBrowsersPath,D as getEngine,ue as getLaunchArgs,ce as isBrowserReady,O as isUrlAllowed,Fe as registerBrowserTools,v as resolveBrowsersPath,k as validateEvalResult};
10
+ })`}function Ee(e){return async({pageId:t,url:n,type:r,selector:i,timeoutMs:a,includeSnapshot:o})=>{let s=T(e),c=s.resolvePageId(t);if(n){let t=E(n,e);if(!t.allowed)return N(`Navigation blocked: ${t.reason}`,{blocked:!0,pageId:c,reason:t.reason});await s.tabExec(c,`goto`,n)}else if(!r)return N(`Navigation requires url or type`,{error:`Navigation requires url or type`,pageId:c});else if(r===`back`)await s.tabExec(c,`back`);else if(r===`forward`)await s.tabExec(c,`forward`);else if(r===`reload`)await s.tabExec(c,`reload`);else if(r===`waitFor`){if(!i)throw Error(`browser_navigate(waitFor) requires selector`);let e=a?[i,String(a)]:[i];await s.tabExec(c,`wait`,...e)}let l=await s.tabExec(c,`get`,`text`).catch(()=>({stdout:n??``})),u=await s.tabExec(c,`get`,`attr`,`title`).catch(()=>({stdout:``})),d=l.stdout.trim()||n||``,f=u.stdout.trim()||d;s.tabs.updateTabInfo(c,d,f),s.resetIdleTimer();let p;if(o!==!1)try{p=F(await s.readSnapshot(c))}catch{}return N(p?`${f||d}\n${d}\n\n${p}`:`${f||d}\n${d}`,{pageId:c,url:d,title:f,snapshot:p})}}function De(e){return async({pageId:t,subAction:n,filter:r,includeBody:i,bufferSize:a})=>{let o=T(e),s=o.resolvePageId(t);switch(n){case`enable`:{let e=[`--enable`];return r?.resourceTypes&&e.push(`--filter`,r.resourceTypes.join(`,`)),i&&e.push(`--include-body`),a&&e.push(`--buffer-size`,String(a)),await o.tabExec(s,`network`,...e),o.resetIdleTimer(),N(`Network capture enabled`,{enabled:!0,filter:r})}case`get`:{let e=await o.tabExec(s,`network`,`requests`,`--json`);o.resetIdleTimer();let t=[];try{t=JSON.parse(e.stdout)}catch{t=[{raw:e.stdout}]}return N(`Captured ${t.length} network requests`,{entries:t,count:t.length})}case`clear`:return await o.tabExec(s,`network`,`clear`),o.resetIdleTimer(),N(`Network capture cleared`,{cleared:!0});case`export-har`:{let e=await o.tabExec(s,`network`,`har`);return o.resetIdleTimer(),N(e.stdout,{har:e.stdout})}default:return N(`Unknown network sub-action`,{error:`Unknown network sub-action`})}}}function Oe(e){return async({url:t,mode:n,label:r,waitUntil:i,includeSnapshot:a,forceNew:o,autoDialog:s})=>{let c=E(t,e);if(!c.allowed)return N(`Navigation blocked: ${c.reason}`,{blocked:!0,reason:c.reason});let l=T(e);await l.launch(n);let u=await l.exec(`open`,t);l.tabs.register(`t0`,t,r??u.stdout.trim(),r),l.resetIdleTimer();let d=[];i===`networkidle`&&d.push(`--wait-until`,`networkidle`),i===`domcontentloaded`&&d.push(`--wait-until`,`domcontentloaded`),d.length>0&&await l.tabExec(`t0`,`wait`,...d).catch(()=>{});let f;if(a!==!1)try{f=F(await l.readSnapshot(`t0`))}catch{}return N(f?`Opened ${t}\n\n${f}`:`Opened ${t}\nTab: t0`,{pageId:`t0`,url:t,tabId:`t0`,label:r,snapshot:f})}}function ke(e){return async({pageId:t,mode:n,selector:r})=>{let i=T(e),a=i.resolvePageId(t);switch(n??`snapshot`){case`snapshot`:{let e=[`-i`,`--json`];r&&e.push(`-s`,r);let t=await i.tabExec(a,`snapshot`,...e);return i.tabs.setSnapshot(a,t.stdout),i.resetIdleTimer(),N(t.stdout,{pageId:a,mode:`snapshot`,content:t.stdout})}case`dom`:{let e=await i.tabExec(a,`get`,`html`);return i.resetIdleTimer(),N(e.stdout,{pageId:a,mode:`dom`,content:e.stdout})}case`markdown`:{let e=await i.tabExec(a,`snapshot`,`-c`);return i.resetIdleTimer(),N(e.stdout,{pageId:a,mode:`markdown`,content:e.stdout})}case`text`:{let e=await i.tabExec(a,`get`,`text`);return i.resetIdleTimer(),N(e.stdout,{pageId:a,mode:`text`,content:e.stdout})}default:return N(`Unknown read mode`,{error:`Unknown read mode`,pageId:a})}}}function Ae(e){return async({pageId:t,ref:n,selector:r,fullPage:i,annotate:a,clip:o,format:s,quality:c})=>{let l=T(e),u=l.resolvePageId(t),d=r??n;if(d){let e=await l.tabExec(u,`screenshot`,`--element`,d);return l.resetIdleTimer(),N(`Screenshot captured for element ${d}`,{element:d,pageId:u,screenshot:e.stdout})}let f=await l.screenshot(u,{fullPage:i,format:s,quality:c,annotate:a});return l.resetIdleTimer(),N(`Screenshot captured (${f.bytes} bytes)`,{pageId:u,base64:f.base64,mimeType:f.mimeType,bytes:f.bytes})}}function je(e){return async({sessionAction:t,pageId:n,confirm:r,cookies:i,name:a,storageType:o,storageKey:s,storageValue:c})=>{let l=T(e),u=n?l.resolvePageId(n):void 0;switch(t){case`list`:{let e=l.tabs.listPages().map(e=>({pageId:e.pageId,url:e.url,title:e.title,label:e.label,createdAt:e.createdAt.toISOString()}));return N(`Open tabs: ${e.length}\n${e.map(e=>` ${e.pageId}: ${e.title||e.url}`).join(`
11
+ `)}`,{pages:e})}case`close`:return u?(await l.tabExec(u,`close`).catch(()=>{}),await l.tabs.removeTab(u),l.resetIdleTimer(),N(`Closed tab ${u}`,{closed:u})):N(`close requires pageId`,{error:`pageId required`});case`cookies`:{if(!r)return N(`Cookie export requires explicit confirmation. Set confirm: true to proceed.`,{confirmRequired:!0});let e=await l.tabExec(u??`t0`,`cookies`),t=[];try{t=JSON.parse(e.stdout)}catch{t=[{raw:e.stdout}]}return N(`Exported ${t.length} cookies`,{cookies:t,count:t.length})}case`set-cookie`:{if(!i||i.length===0)return N(`set-cookie requires cookies array`,{error:`cookies array required`});let e=i.map(e=>`${e.name}=${e.value}${e.domain?`; domain=${e.domain}`:``}${e.path?`; path=${e.path}`:``}`).join(` `);return await l.tabExec(u??`t0`,`cookies`,`set`,e),l.resetIdleTimer(),N(`Set ${i.length} cookies`,{count:i.length})}case`delete-cookie`:return a?(await l.tabExec(u??`t0`,`cookies`,`clear`,a),l.resetIdleTimer(),N(`Deleted cookie ${a}`,{deleted:a})):N(`delete-cookie requires name`,{error:`name required`});case`clear-cookies`:return await l.tabExec(u??`t0`,`cookies`,`clear`),l.resetIdleTimer(),N(`Cookies cleared`,{cleared:!0});case`get-storage`:{if(!o||!s)return N(`get-storage requires storageType and storageKey`,{error:`storageType and storageKey required`});let e=await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`get`,s);return l.resetIdleTimer(),N(e.stdout,{value:e.stdout})}case`set-storage`:return!o||!s||c===void 0?N(`set-storage requires storageType, storageKey, and storageValue`,{error:`storageType, storageKey, storageValue required`}):(await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`set`,s,c),l.resetIdleTimer(),N(`Storage key ${s} set`,{key:s}));case`clear-storage`:return o?(await l.tabExec(u??`t0`,`storage`,o===`localStorage`?`local`:`session`,`clear`),l.resetIdleTimer(),N(`Storage cleared`,{cleared:!0})):N(`clear-storage requires storageType`,{error:`storageType required`});default:return N(`Unknown session action`,{error:`Unknown session action`})}}}const L=[`open`,`batch`,`read`,`act`,`navigate`,`network`,`console`,`fetch`,`eval`,`diff`,`screenshot`,`dialog`,`session`],R=[`ui`,`headless`],z=[`load`,`domcontentloaded`,`networkidle`],B=[`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`],V=[`back`,`forward`,`reload`,`waitFor`],H=[`enable`,`get`,`clear`,`export-har`],U=[`enable`,`get`,`clear`],W=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`],G=[`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`],Me={action:p.enum(L).describe(`Browser action to perform`),pageId:p.string().optional().describe(`Tracked browser page identifier`),label:p.string().optional().describe(`Human-readable label for the page (used as alternative to pageId)`),url:p.string().url().optional().describe(`URL to open or navigate to`),mode:p.enum(R).optional().describe(`Browser launch mode (open only)`),forceNew:p.boolean().optional().describe(`Reserved for future tab reuse`),autoDialog:p.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true). Set false to handle all dialogs manually.`),includeSnapshot:p.boolean().optional().describe(`Include ARIA snapshot in response (default: true for open/navigate). Set false to skip snapshot for speed.`),waitUntil:p.enum(z).optional().describe(`Navigation readiness event`),kind:p.enum(B).optional().describe(`Interaction kind (act only)`),ref:p.string().optional().describe(`Target ref alias`),selector:p.string().optional().describe(`CSS selector for targeting`),element:p.string().optional().describe(`Human-readable element label. Prefer selector for precision.`),text:p.string().optional().describe(`Text to type`),key:p.string().optional().describe(`Key to press`),value:p.string().optional().describe(`Option value or drag target`),fromRef:p.string().optional().describe(`Drag source ref`),fromSelector:p.string().optional().describe(`Drag source selector`),toRef:p.string().optional().describe(`Drag target ref`),toSelector:p.string().optional().describe(`Drag target selector`),type:p.enum(V).optional().describe(`Navigation type`),subAction:p.enum(H).optional().describe(`Network sub-action: enable, get, clear, or export-har`),code:p.string().optional().describe(`JavaScript expression or IIFE evaluated in page context.`),timeoutMs:p.number().min(1).max(6e4).optional().describe(`Timeout in milliseconds`),filter:p.object({resourceTypes:p.array(p.string()).optional(),urlPattern:p.string().optional(),excludeUrls:p.array(p.string()).optional()}).optional().describe(`Network capture filter for resource types and URL patterns`),showSensitive:p.boolean().optional().describe(`Include sensitive headers instead of redacting them`),includeBody:p.boolean().optional().describe(`Include truncated request bodies in captured entries`),bufferSize:p.number().int().min(1).max(1e4).optional().describe(`Buffer capacity (1-10000, default varies by action)`),consoleSubAction:p.enum(U).optional().describe(`Console sub-action: enable, get, or clear`),expression:p.string().optional().describe(`JavaScript expression to evaluate in page context (console get only). Like browser_console expression in Hermes.`),level:p.string().optional().describe(`Filter console entries by level (log/info/warn/error/debug)`),fetchUrl:p.string().optional().describe(`URL for fetch action (http/https only). Uses page cookies/session.`),fetchMethod:p.enum(W).optional().describe(`HTTP method for fetch action (default: GET)`),fetchHeaders:p.record(p.string(),p.string()).optional().describe(`Custom headers for fetch action`),fetchBody:p.string().optional().describe(`Request body for fetch action (POST/PUT/PATCH)`),includeResponseHeaders:p.boolean().optional().describe(`Include response headers in fetch output (default: true)`),fullPage:p.boolean().optional().describe(`Capture full page`),annotate:p.boolean().optional().describe(`Overlay numbered [N] labels on interactive elements matching snapshot ref IDs (screenshot only).`),redactPasswords:p.boolean().optional().describe(`Mask password fields`),readMode:p.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode for read action: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),clip:p.object({x:p.number(),y:p.number(),width:p.number(),height:p.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),format:p.enum([`png`,`jpeg`]).optional().describe(`Screenshot image format (default: png)`),quality:p.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`),cookies:p.array(p.object({name:p.string(),value:p.string(),url:p.string().optional(),domain:p.string().optional(),path:p.string().optional(),expires:p.number().optional(),httpOnly:p.boolean().optional(),secure:p.boolean().optional(),sameSite:p.enum([`Lax`,`None`,`Strict`]).optional()})).optional().describe(`Cookies to set (for session set-cookie action)`),name:p.string().optional().describe(`Cookie name for delete-cookie action`),storageType:p.enum([`localStorage`,`sessionStorage`]).optional().describe(`Storage type for get/set/clear-storage actions`),storageKey:p.string().optional().describe(`Storage key to get or set`),storageValue:p.string().optional().describe(`Value to set in storage`),accept:p.boolean().optional().describe(`Accept or dismiss dialog`),promptText:p.string().optional().describe(`Text for prompt dialog`),sessionAction:p.enum(G).optional().describe(`Session sub-action (session only)`),confirm:p.boolean().optional().describe(`Explicit confirmation for cookie export`),steps:p.array(p.record(p.string(),p.unknown())).optional().describe(`Array of action steps for batch execution. Each step is an object with action + action-specific params.`)};function Ne(e,t){return typeof e==`string`&&t.includes(e)}function K(e,t,n){let r=e[t];if(typeof r!=`string`)throw Error(`${n} requires ${t}`);return r}function Pe(e,t,n){let r=e[t];if(typeof r!=`boolean`)throw Error(`${n} requires ${t}`);return r}function q(e,t){let n=e[t];return typeof n==`string`?n:void 0}function J(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Y(e,t){let n=e[t];return typeof n==`number`?n:void 0}function X(e,t){let n=e[t];return typeof n==`object`&&n?n:void 0}function Fe(e,t){let n=e.steps;if(!Array.isArray(n)||n.length===0)throw Error(`${t} requires non-empty steps`);return n.map((e,n)=>{if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`${t} step ${n+1} must be an object`);return e})}function Z(e,t,n,r){let i=e[t];if(!Ne(i,n))throw Error(`${r} requires ${t}`);return i}function Q(e,t,n,r){let i=e[t];if(i!==void 0){if(!Ne(i,n))throw Error(`${r} received invalid ${t}`);return i}}function Ie(e,t){let n=q(e,`pageId`);if(n)return T(t).resolvePageId(n)}function $(e,t,n){let r=q(e,`pageId`);if(!r)throw Error(`${n} requires pageId`);return T(t).resolvePageId(r)}async function Le(e,t,n){let r=Z(e,`action`,L,`browser`);switch(r){case`open`:return t.openHandler({url:K(e,`url`,`browser(open)`),mode:Q(e,`mode`,R,`browser(open)`),forceNew:J(e,`forceNew`),label:q(e,`label`),autoDialog:J(e,`autoDialog`),waitUntil:Q(e,`waitUntil`,z,`browser(open)`),includeSnapshot:J(e,`includeSnapshot`)});case`batch`:{let r=Fe(e,`browser(batch)`),i=[],a=0;for(let e=0;e<r.length;e+=1){let o=r[e],s=q(o,`action`)??`unknown`;try{let r=await Le(o,t,n);a+=1,i.push({index:e,action:s,ok:!0,result:r})}catch(t){i.push({index:e,action:s,ok:!1,error:t instanceof Error?t.message:String(t)})}}return N(`Batch completed: ${a}/${r.length} steps succeeded`,{total:r.length,succeeded:a,steps:i})}case`read`:return t.readHandler({pageId:$(e,n,`browser(read)`),mode:Q(e,`readMode`,[`snapshot`,`dom`,`markdown`,`text`],`browser(read)`),selector:q(e,`selector`)});case`act`:return t.actHandler({pageId:$(e,n,`browser(act)`),kind:Z(e,`kind`,B,`browser(act)`),ref:q(e,`ref`),selector:q(e,`selector`),element:q(e,`element`),text:q(e,`text`),key:q(e,`key`),value:q(e,`value`),fromRef:q(e,`fromRef`),fromSelector:q(e,`fromSelector`),toRef:q(e,`toRef`),toSelector:q(e,`toSelector`)});case`navigate`:return t.navigateHandler({pageId:$(e,n,`browser(navigate)`),url:q(e,`url`),type:Q(e,`type`,V,`browser(navigate)`),selector:q(e,`selector`),timeoutMs:Y(e,`timeoutMs`),includeSnapshot:J(e,`includeSnapshot`)});case`network`:return t.networkHandler({pageId:$(e,n,`browser(network)`),subAction:Z(e,`subAction`,H,`browser(network)`),filter:X(e,`filter`),showSensitive:J(e,`showSensitive`),includeBody:J(e,`includeBody`),bufferSize:Y(e,`bufferSize`)});case`console`:return t.consoleHandler({pageId:$(e,n,`browser(console)`),subAction:Z(e,`consoleSubAction`,U,`browser(console)`),level:q(e,`level`),bufferSize:Y(e,`bufferSize`),expression:q(e,`expression`)});case`fetch`:return t.fetchHandler({pageId:$(e,n,`browser(fetch)`),url:K(e,`fetchUrl`,`browser(fetch)`),method:Q(e,`fetchMethod`,W,`browser(fetch)`),headers:X(e,`fetchHeaders`),body:q(e,`fetchBody`),timeoutMs:Y(e,`timeoutMs`),includeHeaders:J(e,`includeResponseHeaders`)});case`eval`:return t.evalHandler({pageId:$(e,n,`browser(eval)`),code:K(e,`code`,`browser(eval)`),timeoutMs:Y(e,`timeoutMs`)});case`diff`:return t.diffHandler({pageId:$(e,n,`browser(diff)`)});case`screenshot`:{let r=X(e,`clip`);return t.screenshotHandler({pageId:$(e,n,`browser(screenshot)`),ref:q(e,`ref`),selector:q(e,`selector`),fullPage:J(e,`fullPage`),annotate:J(e,`annotate`),redactPasswords:J(e,`redactPasswords`),clip:r,format:Q(e,`format`,[`png`,`jpeg`],`browser(screenshot)`),quality:Y(e,`quality`)})}case`dialog`:return t.dialogHandler({pageId:$(e,n,`browser(dialog)`),accept:Pe(e,`accept`,`browser(dialog)`),promptText:q(e,`promptText`)});case`session`:return t.sessionHandler({sessionAction:Z(e,`sessionAction`,G,`browser(session)`),pageId:q(e,`pageId`)&&Ie(e,n),confirm:J(e,`confirm`),cookies:X(e,`cookies`),name:q(e,`name`),storageType:Q(e,`storageType`,[`localStorage`,`sessionStorage`],`browser(session)`),storageKey:q(e,`storageKey`),storageValue:q(e,`storageValue`)});default:return N(`Unknown action: ${r}`,{error:`Unknown action: ${r}`})}}function Re(e,t){let n=_e(t),r={openHandler:Oe(n),readHandler:ke(n),actHandler:ye(n),navigateHandler:Ee(n),networkHandler:De(n),consoleHandler:be(n),fetchHandler:we(n),evalHandler:Ce(n),diffHandler:Se(n),screenshotHandler:Ae(n),dialogHandler:xe(n),sessionHandler:je(n)};e.tool(`browser`,`Unified browser automation tool using agent-browser (Chrome DevTools Protocol). Provides open, read, act, navigate, screenshot, eval, dialog, network, console, fetch, diff, session actions. New: includeSnapshot (open/navigate auto-returns ARIA tree), annotate (numbered labels on screenshots), expression (evaluate JS in console action).`,Me,async e=>{try{let t=await Le(e,r,n);return{content:t.content,structuredContent:t.structuredContent}}catch(e){return{content:[{type:`text`,text:`Browser error: ${e instanceof Error?e.message:String(e)}`}],isError:!0}}})}export{C as BrowserEngine,S as DEFAULT_BROWSER_CONFIG,pe as SessionRegistry,x as TabRegistry,ue as autoSelectMode,me as closeEngine,oe as ensureAgentBrowserInstalled,se as getAgentBrowserVersion,de as getDaemonArgs,g as getDefaultBrowsersPath,T as getEngine,fe as getLaunchArgs,ce as isBrowserReady,E as isUrlAllowed,Re as registerBrowserTools,_ as resolveBrowsersPath,D as validateEvalResult};
@@ -5,4 +5,4 @@ import{fileURLToPath as e,pathToFileURL as t}from"node:url";import{parseArgs as
5
5
  `).length,fileHash:this.hash(e.content),indexedAt:t,origin:`curated`,tags:e.frontmatter.tags,category:e.frontmatter.category,version:e.frontmatter.version}});try{return await this.store.upsert(i,r),e.length}catch(t){R.error(`Failed to upsert curated batch`,{batchSize:e.length,...a(t)});for(let t of e)n.push(`${t.relativePath}: upsert failed`);return 0}}catch(r){if(e.length===1)return R.error(`Failed to embed curated item`,{relativePath:e[0].relativePath,...a(r)}),n.push(`${e[0].relativePath}: reindex failed`),0;R.warn(`Curated embed batch failed, retrying with smaller chunks`,{batchSize:e.length,...a(r)});let i=Math.ceil(e.length/2),o=e.slice(0,i),s=e.slice(i);return await this.embedAndUpsertBatch(o,t,n)+await this.embedAndUpsertBatch(s,t,n)}}gitCommitKnowledge(e,t,n){try{if(!y(this.curatedDir))return;let r=this.knowledgeRefForPath(e);if(!r)return;b(r,`entry.md`,t,n,this.curatedDir)}catch{}}gitDeleteKnowledgeRef(e){try{if(!y(this.curatedDir))return;let t=this.knowledgeRefForPath(e);if(!t)return;x([`update-ref`,`-d`,t],this.curatedDir)}catch{}}knowledgeRefForPath(e){let t=e.replace(/\.md$/,``).split(`/`).map(e=>S(e)).join(`/`);return t.split(`/`).every(e=>v.test(e))?`${L}/${t}`:null}async indexCuratedFile(e,t,n){let r=await this.embedder.embed(t),i=`.ai/curated/${e}`,a=new Date().toISOString(),o={id:this.hashId(i,0),content:t,sourcePath:i,contentType:`curated-knowledge`,headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:t.split(`
6
6
  `).length,fileHash:this.hash(t),indexedAt:a,origin:`curated`,tags:n.tags,category:n.category,version:n.version};await this.store.upsert([o],[r])}async indexCuratedFileBestEffort(e,t,n,i){if(r.instance().isDegraded(`embedder`)){R.debug(`Skipping vector indexing — embedder degraded`,{relativePath:e,operation:i,subsystem:`embedder`});return}try{await this.indexCuratedFile(e,t,n)}catch(t){R.warn(`Curated file persisted but vector indexing deferred`,{relativePath:e,operation:i,...a(t)})}}async discoverCategories(){return this.adapter.listDirectories()}guardPath(e){let t=e.replace(/^\.ai\/curated\//,``);if(t.endsWith(`.md`)||(t+=`.md`),t.includes(`..`)||c(t))throw Error(`Invalid path: ${t}. Must be relative within .ai/curated/ directory.`);let n=t.split(`/`)[0];return this.validateCategoryName(n),t}validateCategoryName(e){if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid category name: "${e}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(e){if(Buffer.byteLength(e,`utf-8`)>I)throw Error(`Content exceeds maximum size of ${I/1024}KB`)}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)}normalizeTags(e){return[...new Set(e.map(e=>e.trim()).filter(Boolean))]}sameTags(e,t){if(e.length!==t.length)return!1;let n=new Set(e);return t.every(e=>n.has(e))}ensureCategoryPath(e,t){if(!e.startsWith(`${t}/`))throw Error(`Curated path "${e}" must stay within category "${t}"`)}async uniqueRelativePath(e,t){let n=`${e}/${t}.md`;if(!await this.adapter.exists(n))return n;for(let n=2;n<=100;n++){let r=`${e}/${t}-${n}.md`;if(!await this.adapter.exists(r))return r}throw Error(`Too many entries with slug "${t}" in category "${e}"`)}hash(e){return _(`sha256`).update(e).digest(`hex`).slice(0,16)}hashId(e,t){return this.hash(`${e}::${t}`)}serializeFile(e,t){return`${[`---`,`title: "${t.title.replace(/"/g,`\\"`)}"`,`category: ${t.category}`,`tags: [${t.tags.map(e=>`"${e}"`).join(`, `)}]`,`created: ${t.created}`,`updated: ${t.updated}`,`version: ${t.version}`,`origin: ${t.origin}`,`changelog:`,...t.changelog.map(e=>` - version: ${e.version}\n date: ${e.date}\n reason: "${e.reason.replace(/"/g,`\\"`)}"`),`---`].join(`
7
7
  `)}\n\n${e}\n`}parseFile(e){let t=e.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!t)return{frontmatter:{title:`Untitled`,category:`notes`,tags:[],created:``,updated:``,version:1,origin:`curated`,changelog:[]},content:e};let n=t[1],r=t[2].trim(),i={},a=[],o=n.split(`
8
- `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const B=i(`server`);function V(e,t){return t?{version:e,...a(t)}:{version:e}}function H(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function U(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function W(){return U()?n({allowPositionals:!0,options:{transport:{type:`string`,default:H()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:H(),port:process.env.AIKIT_PORT??`3210`}}async function G(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=C(),n=W();if(process.on(`unhandledRejection`,e=>{B.error(`Unhandled rejection`,V(t,e))}),process.on(`uncaughtException`,e=>{B.error(`Uncaught exception — exiting`,V(t,e)),process.exit(1)}),B.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-BNm7jb2u.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-Bf_YCZLu.js`);await e(t)}}G();export{w as a,O as i,F as n,T as o,P as r,D as s,z as t};
8
+ `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const B=i(`server`);function V(e,t){return t?{version:e,...a(t)}:{version:e}}function H(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function U(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function W(){return U()?n({allowPositionals:!0,options:{transport:{type:`string`,default:H()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:H(),port:process.env.AIKIT_PORT??`3210`}}async function G(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=C(),n=W();if(process.on(`unhandledRejection`,e=>{B.error(`Unhandled rejection`,V(t,e))}),process.on(`uncaughtException`,e=>{B.error(`Uncaught exception — exiting`,V(t,e)),process.exit(1)}),B.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-BwaQWT2R.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-By2Kx_7Y.js`);await e(t)}}G();export{w as a,O as i,F as n,T as o,P as r,D as s,z as t};
@@ -172,4 +172,4 @@ svg .edge-label{fill:var(--text-muted)}
172
172
  </div>
173
173
  </body>
174
174
  </html>`}const H=`<!-- DIAGRAM:SVG -->`;function U(e){let t=e.indexOf(H);if(t===-1)return null;let n=t+20,r=e.indexOf(H,n);if(r===-1)return null;let i=e.slice(n,r).trim();if(i.startsWith(`<svg`))return i;let a=e.slice(Math.max(0,t),r+20),o=a.match(/viewBox="([^"]+)"/),s=o?o[1]:`0 0 1200 800`,c=a.match(/width="(\d+)"/),l=c?c[1]:`1200`,u=a.match(/height="(\d+)"/);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${s}" width="${l}" height="${u?u[1]:`800`}">`,` <defs>`,` <style>`,` text { font-family: system-ui, -apple-system, sans-serif; }`,` .title { font-size: 20px; font-weight: 600; fill: #fff; }`,` .subtitle { font-size: 14px; fill: #94a3b8; }`,` </style>`,` </defs>`,i,`</svg>`].join(`
175
- `)}function ge(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function _e(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=ge(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=U(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const W=10*1024*1024,G=2e3;function ve(e){switch(e.diagram_type){case`architecture`:return oe(e);case`workflow`:return V(e);case`sequence`:return L(e);case`dataflow`:return le(e);case`lifecycle`:return N(e)}}function K(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s}=ve(e),c=(e.meta??{}).palette===`warm`?`warm`:`technical`;return{html:he().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,c===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s),markdown:a?_(e):void 0}}function q(e,t={}){return K(e,{...t,dualOutput:!1}).html}function ye(e){return _(e)}function be(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>W)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${W/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>G)throw Error(`Too many edges/connections: ${a.length} (max ${G})`)}function xe(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Se(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function Ce(){return Se()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function we(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=Ce();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-2zHnHy1e.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-C9dH1M3E.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,_e as exportDiagram,U as extractSvg,n as getSessionIdHeader,we as main,r as readPositiveIntEnv,t as readVersion,q as renderHtml,ye as renderMd,K as renderToResult,e as resolveCorsOrigin,xe as sanitizeTitle,o as selectWorkspaceRoot,be as validate};
175
+ `)}function ge(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function _e(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=ge(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=U(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const W=10*1024*1024,G=2e3;function ve(e){switch(e.diagram_type){case`architecture`:return oe(e);case`workflow`:return V(e);case`sequence`:return L(e);case`dataflow`:return le(e);case`lifecycle`:return N(e)}}function K(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s}=ve(e),c=(e.meta??{}).palette===`warm`?`warm`:`technical`;return{html:he().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,c===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s),markdown:a?_(e):void 0}}function q(e,t={}){return K(e,{...t,dualOutput:!1}).html}function ye(e){return _(e)}function be(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>W)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${W/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>G)throw Error(`Too many edges/connections: ${a.length} (max ${G})`)}function xe(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Se(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function Ce(){return Se()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function we(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=Ce();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-BXF275jD.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-DVjY0Ebj.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,_e as exportDiagram,U as extractSvg,n as getSessionIdHeader,we as main,r as readPositiveIntEnv,t as readVersion,q as renderHtml,ye as renderMd,K as renderToResult,e as resolveCorsOrigin,xe as sanitizeTitle,o as selectWorkspaceRoot,be as validate};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{n as e,t}from"./server-2ntNwLtr.js";export{t as buildPreludeInjection,e as generatePrelude};
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./server-qVK37TfU.js";export{t as buildPreludeInjection,e as generatePrelude};