@vpxa/aikit 0.1.308 → 0.1.310

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 (52) hide show
  1. package/package.json +1 -1
  2. package/packages/blocks-core/dist/index.mjs +5 -5
  3. package/packages/blocks-interactive/dist/index.d.mts +1 -1
  4. package/packages/blocks-interactive/dist/index.mjs +2 -2
  5. package/packages/browser/dist/index.js +8 -7
  6. package/packages/cli/dist/index.js +3 -3
  7. package/packages/cli/dist/{init-CyjUXjQw.js → init-DokIBPoi.js} +1 -1
  8. package/packages/cli/dist/{templates-BQ1J4HzY.js → templates-WMcV7ag2.js} +8 -8
  9. package/packages/present/dist/index.html +137 -93
  10. package/packages/server/dist/bin.js +1 -1
  11. package/packages/server/dist/index.js +1 -1
  12. package/packages/server/dist/repair-json-B6Q_HRoP.js +3 -0
  13. package/packages/server/dist/repair-json-D4mft_HA.js +4 -0
  14. package/packages/server/dist/{server-D6sJEw0I.js → server-CUEJEod-.js} +162 -164
  15. package/packages/server/dist/{server-http-B1ixOw2x.js → server-http-C2Vv-0lq.js} +1 -1
  16. package/packages/server/dist/{server-http-BurquBLf.js → server-http-DLqbe1NN.js} +1 -1
  17. package/packages/server/dist/server-stdio-RjYFfC_c.js +1 -0
  18. package/packages/server/dist/server-stdio-h8m_nhNo.js +2 -0
  19. package/packages/server/dist/{server-BSvqfFcK.js → server-uxrUzJ0L.js} +162 -164
  20. package/packages/server/viewers/c4-viewer.html +1 -1
  21. package/packages/server/viewers/canvas.html +4 -4
  22. package/packages/server/viewers/report-template.html +52 -52
  23. package/packages/server/viewers/task-plan-static.html +1 -1
  24. package/packages/server/viewers/tour-viewer.html +4 -4
  25. package/packages/tools/dist/index.d.ts +7 -0
  26. package/packages/tools/dist/index.js +71 -71
  27. package/scaffold/INSTRUCTIONS.md +273 -0
  28. package/scaffold/dist/adapters/copilot.mjs +2 -9
  29. package/scaffold/dist/adapters/hermes-agent.mjs +2 -2
  30. package/scaffold/dist/adapters/hermes.mjs +8 -4
  31. package/scaffold/dist/adapters/intellij.mjs +7 -3
  32. package/scaffold/dist/adapters/skills.mjs +3 -1
  33. package/scaffold/dist/adapters/zed.mjs +6 -2
  34. package/scaffold/dist/definitions/agents.mjs +2 -2
  35. package/scaffold/dist/definitions/bodies.mjs +100 -362
  36. package/scaffold/dist/definitions/protocols.mjs +109 -549
  37. package/scaffold/dist/definitions/skills/adr-skill.mjs +41 -197
  38. package/scaffold/dist/definitions/skills/aikit.mjs +52 -205
  39. package/scaffold/dist/definitions/skills/brainstorming.mjs +74 -112
  40. package/scaffold/dist/definitions/skills/browser-use.mjs +128 -184
  41. package/scaffold/dist/definitions/skills/c4-architecture.mjs +46 -107
  42. package/scaffold/dist/definitions/skills/docs.mjs +70 -214
  43. package/scaffold/dist/definitions/skills/frontend-design.mjs +96 -193
  44. package/scaffold/dist/definitions/skills/lesson-learned.mjs +57 -184
  45. package/scaffold/dist/definitions/skills/multi-agents-development.mjs +98 -408
  46. package/scaffold/dist/definitions/skills/present.mjs +193 -1
  47. package/scaffold/dist/definitions/skills/react.mjs +68 -111
  48. package/scaffold/dist/definitions/skills/repo-access.mjs +24 -169
  49. package/scaffold/dist/definitions/skills/requirements-clarity.mjs +45 -94
  50. package/scaffold/dist/definitions/skills/typescript.mjs +162 -230
  51. package/packages/server/dist/server-stdio-CBmXDMpq.js +0 -1
  52. package/packages/server/dist/server-stdio-z3_zG1HF.js +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.308",
3
+ "version": "0.1.310",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -26,7 +26,7 @@ ${O}
26
26
  }
27
27
  `,dt=/^(#{1,6})\s+(.+)$/,ft=/^(?:(?:-\s*){3,}|(?:\*\s*){3,}|(?:_\s*){3,})$/;function pt(e){return e.length?`<p>${e.map(e=>s(e)).join(`<br>`)}</p>`:``}function mt(e,t){let r=String(e.value??``);if(r.trimStart().startsWith(`<`))return`<div class="bk-markdown">${r}</div>`;let i=[],a=[],o=!1,s=[],c=``,l=()=>{let e=pt(a);e&&(i.push(e),a.length=0)};for(let e of r.split(/\r?\n/)){let t=e.trim();if(t.startsWith("```")){if(!o)l(),o=!0,c=t.slice(3).trim(),s=[];else{let e=c?` class="${n(c)}"`:``;i.push(`<pre class="bk-code"><code${e}>${n(s.join(`
28
28
  `))}</code></pre>`),o=!1,s=[],c=``}continue}if(o){s.push(e);continue}if(!t){l();continue}let r=t.match(dt);if(r){l();let[,e,t]=r,a=e.length;i.push(`<h${a} class="bk-heading bk-heading--${a}">${n(t)}</h${a}>`);continue}if(ft.test(t)){l(),i.push(`<hr>`);continue}a.push(e)}if(l(),o&&s.length>0){let e=c?` class="${n(c)}"`:``;i.push(`<pre class="bk-code"><code${e}>${n(s.join(`
29
- `))}</code></pre>`)}return`<div class="bk-markdown">${i.join(``)}</div>`}function ht(e,t){return`<pre class="bk-mermaid mermaid">${n(String(e.value??``))}</pre>`}function gt(e){if(e==null||e===``)return``;let t=a(e),r=Number(String(e).replace(/[^0-9.-]/g,``));return`<span class="bk-metric-trend">${Number.isNaN(r)?``:r>0?`↑ `:r<0?`↓ `:`→ `}${n(t)}</span>`}function _t(e,t){return`<div class="bk-metrics">${f(e).map(e=>`<article class="bk-metric" data-tone="${u(e.status)}"><div class="bk-metric-label">${n(e.label)}</div><div class="bk-metric-value">${n(a(e.value))}</div>${gt(e.trend)}</article>`).join(``)}</div>`}function vt(e,t){return`<p class="bk-paragraph">${n(String(e.value??e.text??``))}</p>`}function yt(e){let t=o(e);if(Array.isArray(t))return t;if(t&&typeof t==`object`){if(Array.isArray(t.items))return t.items;if(`value`in t)return[t]}return[]}function bt(e,t){return`<div class="bk-progress">${yt(e.value).map(e=>{let t=Math.max(1,Number(e.max)||100),r=Math.max(0,Number(e.value)||0),i=Math.round(Math.min(r/t*100,100)),a=u(e.color);return`<div class="bk-progress-item"><div class="bk-progress-meta"><span>${n(e.label)}</span><span>${i}%</span></div><div class="bk-progress-track"><span class="bk-progress-bar" style="width:${i}%;background:var(--dt-${a}-emphasis);box-shadow:0 0 16px var(--dt-glow-${a});"></span></div></div>`}).join(``)}</div>`}function xt(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e??``)}}function St(e,t){return`<pre class="bk-prompt">${n(xt(e.value))}</pre>`}function Ct(e,t){return`<hr class="bk-separator">`}function wt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function Tt(e,t){return`<div class="bk-status-board">${wt(e.value).map(e=>{let t=e.items.map(e=>{let t=u(e.status),r=e.description?`<div class="bk-status-description">${n(e.description)}</div>`:``;return`<div class="bk-status-item"><span class="bk-status-pill" style="background:var(--dt-${t}-subtle);color:var(--dt-${t}-fg);">${n(e.status??`pending`)}</span><div class="bk-status-copy"><div class="bk-status-label">${n(e.label??e.name??``)}</div>${r}</div></div>`}).join(``);return`<section class="bk-status-category"><div class="bk-status-category-title">${n(e.category)}</div><div class="bk-status-items">${t}</div></section>`}).join(``)}</div>`}function Et(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e){let t=(e??[]).map(e=>{if(Et(e)){let t=typeof e.key==`string`?e.key:String(e.label??``);return{key:t,label:typeof e.label==`string`?e.label:t}}let t=String(e);return{key:t,label:t}});return{headers:t.map(e=>e.label),keys:t.map(e=>e.key)}}function Dt(e){if(Array.isArray(e.columns)){let{headers:t,keys:n}=A(e.columns),r=Array.isArray(e.rows)?e.rows:[];return r.length>0&&Array.isArray(r[0])?{headers:t,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]??``])))}:r.length>0&&typeof r[0]==`object`&&r[0]!==null?{headers:t,keys:n,rows:r}:{headers:t,keys:n,rows:[]}}let t=o(e.value);if(Array.isArray(t)){if(t.length>0&&typeof t[0]==`object`&&t[0]!==null&&!Array.isArray(t[0])){let n=t,r=Array.isArray(e.headers)?e.headers.map(String):Object.keys(n[0]??{});return{headers:r,keys:r,rows:n}}if(t.length>0&&Array.isArray(t[0])){let[n,...r]=t,i=Array.isArray(e.headers)?e.headers.map(String):n.map(String);return{headers:i,keys:i,rows:r.map(e=>Object.fromEntries(i.map((t,n)=>[t,e[n]])))}}}if(t&&typeof t==`object`){let n=Array.isArray(e.headers)?e.headers.map(String):Array.isArray(t.headers)?t.headers.map(String):[],r=Array.isArray(t.rows)?t.rows:[];if(r.length>0&&Array.isArray(r[0]))return{headers:n,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]])))};if(r.length>0&&typeof r[0]==`object`&&r[0]!==null)return{headers:n,keys:n,rows:r}}if(Array.isArray(e.headers)){let t=e.headers.map(String);return{headers:t,keys:t,rows:[]}}if(Array.isArray(e.columns)){let{headers:t,keys:n}=A(e.columns);return{headers:t,keys:n,rows:[]}}return{headers:[],keys:[],rows:[]}}function Ot(e,t){let{headers:r,keys:i,rows:o}=Dt(e);return r.length===0?`<div class="bk-table-wrap"><table class="bk-table"><tbody></tbody></table></div>`:`<div class="bk-table-wrap"><table class="bk-table">${`<thead><tr>${r.map(e=>`<th>${n(e)}</th>`).join(``)}</tr></thead>`}<tbody>${o.map(e=>`<tr>${i.map(t=>`<td>${n(a(e[t]))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div>`}function kt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function At(e,t){return`<div class="bk-tags">${kt(e.value).map(e=>{let t=typeof e==`string`?e:String(e.text??e.label??``),r=u(typeof e==`string`?void 0:e.status??e.tone??e.color);return`<span class="bk-tag" style="background:var(--dt-${r}-subtle);color:var(--dt-${r}-fg);">${n(t)}</span>`}).join(``)}</div>`}function jt(e,t){return`<div class="bk-text">${s(String(e.value??``)).replace(/\n/g,`<br>`)}</div>`}function Mt(e,t){return`<div class="bk-timeline">${f(e).map(e=>{let t=u(e.status),r=e.description?`<div class="bk-timeline-description">${n(e.description)}</div>`:``,i=e.timestamp?`<div class="bk-timeline-timestamp">${n(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${n(e.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function j(e,t){if(Array.isArray(e)){let r=e.map(e=>j(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(e&&typeof e==`object`){let r=e,i=typeof r.name==`string`?r.name:typeof r.label==`string`?r.label:typeof r.title==`string`?r.title:void 0;if(i!==void 0)return j(r.children??[],i);let a=Object.entries(r).map(([e,t])=>j(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${a}</div></details>`:`<div class="bk-tree-children">${a}</div>`}let r=n(a(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${n(t)}</span><span class="bk-tree-value">${r}</span></div>`:`<div class="bk-tree-leaf">${r}</div>`}function Nt(e,t){return`<div class="bk-tree">${j(o(e.value))}</div>`}const M={"--dt-bg-primary":`#ffffff`,"--dt-bg-secondary":`#f6f8fa`,"--dt-bg-tertiary":`#eaeef2`,"--dt-bg-canvas":`#f0f0f0`,"--dt-text-primary":`#1f2328`,"--dt-text-secondary":`#656d76`,"--dt-text-tertiary":`#8b949e`,"--dt-border-default":`#d0d7de`,"--dt-border-muted":`#d8dee4`,"--dt-border-subtle":`#eaeef2`,"--dt-accent-fg":`#0969da`,"--dt-accent-emphasis":`#0550ae`,"--dt-accent-muted":`rgba(9, 105, 218, 0.4)`,"--dt-accent-subtle":`rgba(9, 105, 218, 0.1)`,"--dt-success-fg":`#1a7f37`,"--dt-success-emphasis":`#116329`,"--dt-success-muted":`rgba(26, 127, 55, 0.4)`,"--dt-success-subtle":`rgba(26, 127, 55, 0.1)`,"--dt-danger-fg":`#cf222e`,"--dt-danger-emphasis":`#a40e26`,"--dt-danger-muted":`rgba(207, 34, 46, 0.4)`,"--dt-danger-subtle":`rgba(207, 34, 46, 0.1)`,"--dt-warning-fg":`#9a6700`,"--dt-warning-emphasis":`#7d4e00`,"--dt-warning-muted":`rgba(154, 103, 0, 0.4)`,"--dt-warning-subtle":`rgba(154, 103, 0, 0.1)`,"--dt-purple-fg":`#8250df`,"--dt-purple-emphasis":`#6639ba`,"--dt-purple-muted":`rgba(130, 80, 223, 0.4)`,"--dt-purple-subtle":`rgba(130, 80, 223, 0.1)`,"--dt-font-sans":`'Segoe UI', system-ui, -apple-system, sans-serif`,"--dt-font-mono":`'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace`,"--dt-font-size-xs":`0.75rem`,"--dt-font-size-sm":`0.8125rem`,"--dt-font-size-base":`0.875rem`,"--dt-font-size-lg":`1rem`,"--dt-font-size-xl":`1.25rem`,"--dt-font-size-2xl":`1.5rem`,"--dt-font-size-3xl":`2rem`,"--dt-space-1":`0.25rem`,"--dt-space-2":`0.5rem`,"--dt-space-3":`0.75rem`,"--dt-space-4":`1rem`,"--dt-space-5":`1.25rem`,"--dt-space-6":`1.5rem`,"--dt-space-8":`2rem`,"--dt-space-12":`3rem`,"--dt-space-16":`4rem`,"--dt-radius-sm":`6px`,"--dt-radius-md":`8px`,"--dt-radius-lg":`12px`,"--dt-radius-xl":`16px`,"--dt-shadow-sm":`0 1px 2px rgba(0, 0, 0, 0.07)`,"--dt-shadow-md":`0 3px 6px rgba(0, 0, 0, 0.1)`,"--dt-shadow-lg":`0 8px 24px rgba(0, 0, 0, 0.12)`,"--dt-glow-accent":`rgba(9, 105, 218, 0.08)`,"--dt-glow-success":`rgba(26, 127, 55, 0.08)`,"--dt-glow-danger":`rgba(207, 34, 46, 0.08)`,"--dt-glow-warning":`rgba(154, 103, 0, 0.08)`,"--dt-glow-purple":`rgba(130, 80, 223, 0.08)`,"--dt-transition-fast":`150ms ease`,"--dt-transition-normal":`200ms ease`},N={"--dt-bg-primary":`#0d1117`,"--dt-bg-secondary":`#161b22`,"--dt-bg-tertiary":`#21262d`,"--dt-bg-canvas":`#010409`,"--dt-text-primary":`#f0f6fc`,"--dt-text-secondary":`#9198a1`,"--dt-text-tertiary":`#656d76`,"--dt-border-default":`#30363d`,"--dt-border-muted":`#21262d`,"--dt-border-subtle":`#1f242d`,"--dt-accent-fg":`#58a6ff`,"--dt-accent-emphasis":`#1f6feb`,"--dt-accent-muted":`rgba(56, 139, 253, 0.4)`,"--dt-accent-subtle":`rgba(56, 139, 253, 0.15)`,"--dt-success-fg":`#3fb950`,"--dt-success-emphasis":`#238636`,"--dt-success-muted":`rgba(63, 185, 80, 0.4)`,"--dt-success-subtle":`rgba(63, 185, 80, 0.15)`,"--dt-danger-fg":`#f85149`,"--dt-danger-emphasis":`#da3633`,"--dt-danger-muted":`rgba(248, 81, 73, 0.4)`,"--dt-danger-subtle":`rgba(248, 81, 73, 0.15)`,"--dt-warning-fg":`#d29922`,"--dt-warning-emphasis":`#bb8009`,"--dt-warning-muted":`rgba(210, 153, 34, 0.4)`,"--dt-warning-subtle":`rgba(210, 153, 34, 0.15)`,"--dt-purple-fg":`#bc8cff`,"--dt-purple-emphasis":`#a371f7`,"--dt-purple-muted":`rgba(188, 140, 255, 0.4)`,"--dt-purple-subtle":`rgba(188, 140, 255, 0.15)`,"--dt-shadow-sm":`0 1px 2px rgba(1, 4, 9, 0.35)`,"--dt-shadow-md":`0 3px 6px rgba(1, 4, 9, 0.4)`,"--dt-shadow-lg":`0 8px 24px rgba(1, 4, 9, 0.45)`,"--dt-glow-accent":`rgba(56, 139, 253, 0.14)`,"--dt-glow-success":`rgba(63, 185, 80, 0.14)`,"--dt-glow-danger":`rgba(248, 81, 73, 0.14)`,"--dt-glow-warning":`rgba(210, 153, 34, 0.14)`,"--dt-glow-purple":`rgba(188, 140, 255, 0.14)`},Pt=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-font-sans.--dt-font-mono.--dt-font-size-xs.--dt-font-size-sm.--dt-font-size-base.--dt-font-size-lg.--dt-font-size-xl.--dt-font-size-2xl.--dt-font-size-3xl.--dt-space-1.--dt-space-2.--dt-space-3.--dt-space-4.--dt-space-5.--dt-space-6.--dt-space-8.--dt-space-12.--dt-space-16.--dt-radius-sm.--dt-radius-md.--dt-radius-lg.--dt-radius-xl.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple.--dt-transition-fast.--dt-transition-normal`.split(`.`),Ft=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple`.split(`.`),P={actions:`
29
+ `))}</code></pre>`)}return`<div class="bk-markdown">${i.join(``)}</div>`}function ht(e,t){return`<pre class="bk-mermaid mermaid">${n(String(e.value??``))}</pre>`}function gt(e){if(e==null||e===``)return``;let t=a(e),r=Number(String(e).replace(/[^0-9.-]/g,``));return`<span class="bk-metric-trend">${Number.isNaN(r)?``:r>0?`↑ `:r<0?`↓ `:`→ `}${n(t)}</span>`}function _t(e,t){return`<div class="bk-metrics">${f(e).map(e=>`<article class="bk-metric" data-tone="${u(e.status)}"><div class="bk-metric-label">${n(e.label)}</div><div class="bk-metric-value">${n(a(e.value))}</div>${gt(e.trend)}</article>`).join(``)}</div>`}function vt(e,t){return`<p class="bk-paragraph">${n(String(e.value??e.text??``))}</p>`}function yt(e){let t=o(e);if(Array.isArray(t))return t;if(t&&typeof t==`object`){if(Array.isArray(t.items))return t.items;if(`value`in t)return[t]}return[]}function bt(e,t){return`<div class="bk-progress">${yt(e.value).map(e=>{let t=Math.max(1,Number(e.max)||100),r=Math.max(0,Number(e.value)||0),i=Math.round(Math.min(r/t*100,100)),a=u(e.color);return`<div class="bk-progress-item"><div class="bk-progress-meta"><span>${n(e.label)}</span><span>${i}%</span></div><div class="bk-progress-track"><span class="bk-progress-bar" style="width:${i}%;background:var(--dt-${a}-emphasis);box-shadow:0 0 16px var(--dt-glow-${a});"></span></div></div>`}).join(``)}</div>`}function xt(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e??``)}}function St(e,t){return`<pre class="bk-prompt">${n(xt(e.value))}</pre>`}function Ct(e,t){return`<hr class="bk-separator">`}function wt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function Tt(e,t){return`<div class="bk-status-board">${wt(e.value).map(e=>{let t=e.items.map(e=>{let t=u(e.status),r=e.description?`<div class="bk-status-description">${n(e.description)}</div>`:``;return`<div class="bk-status-item"><span class="bk-status-pill" style="background:var(--dt-${t}-subtle);color:var(--dt-${t}-fg);">${n(e.status??`pending`)}</span><div class="bk-status-copy"><div class="bk-status-label">${n(e.label??e.name??``)}</div>${r}</div></div>`}).join(``);return`<section class="bk-status-category"><div class="bk-status-category-title">${n(e.category)}</div><div class="bk-status-items">${t}</div></section>`}).join(``)}</div>`}function Et(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e){let t=(e??[]).map(e=>{if(Et(e)){let t=typeof e.key==`string`?e.key:String(e.label??``);return{key:t,label:typeof e.label==`string`?e.label:t}}let t=String(e);return{key:t,label:t}});return{headers:t.map(e=>e.label),keys:t.map(e=>e.key)}}function Dt(e){if(Array.isArray(e.columns)){let{headers:t,keys:n}=A(e.columns),r=Array.isArray(e.rows)?e.rows:[];return r.length>0&&Array.isArray(r[0])?{headers:t,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]??``])))}:r.length>0&&typeof r[0]==`object`&&r[0]!==null?{headers:t,keys:n,rows:r}:{headers:t,keys:n,rows:[]}}let t=o(e.value);if(Array.isArray(t)){if(t.length>0&&typeof t[0]==`object`&&t[0]!==null&&!Array.isArray(t[0])){let n=t,r=Array.isArray(e.headers)?e.headers.map(String):Object.keys(n[0]??{});return{headers:r,keys:r,rows:n}}if(t.length>0&&Array.isArray(t[0])){let[n,...r]=t,i=Array.isArray(e.headers)?e.headers.map(String):n.map(String);return{headers:i,keys:i,rows:r.map(e=>Object.fromEntries(i.map((t,n)=>[t,e[n]])))}}}if(t&&typeof t==`object`){let n=Array.isArray(e.headers)?e.headers.map(String):Array.isArray(t.headers)?t.headers.map(String):[],r=Array.isArray(t.rows)?t.rows:[];if(r.length>0&&Array.isArray(r[0]))return{headers:n,keys:n,rows:r.map(e=>Object.fromEntries(n.map((t,n)=>[t,e[n]])))};if(r.length>0&&typeof r[0]==`object`&&r[0]!==null)return{headers:n,keys:n,rows:r}}if(Array.isArray(e.headers)){let t=e.headers.map(String);return{headers:t,keys:t,rows:[]}}if(Array.isArray(e.columns)){let{headers:t,keys:n}=A(e.columns);return{headers:t,keys:n,rows:[]}}return{headers:[],keys:[],rows:[]}}function Ot(e,t){let{headers:r,keys:i,rows:o}=Dt(e);return r.length===0?`<div class="bk-table-wrap"><table class="bk-table"><tbody></tbody></table></div>`:`<div class="bk-table-wrap"><table class="bk-table">${`<thead><tr>${r.map(e=>`<th>${n(e)}</th>`).join(``)}</tr></thead>`}<tbody>${o.map(e=>`<tr>${i.map(t=>`<td>${n(a(e[t]))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div>`}function kt(e){let t=o(e);return Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.items)?t.items:[]}function At(e,t){return`<div class="bk-tags">${kt(e.value).map(e=>{let t=typeof e==`string`?e:String(e.text??e.label??``),r=u(typeof e==`string`?void 0:e.status??e.tone??e.color);return`<span class="bk-tag" style="background:var(--dt-${r}-subtle);color:var(--dt-${r}-fg);">${n(t)}</span>`}).join(``)}</div>`}function jt(e,t){return`<div class="bk-text">${s(String(e.value??``)).replace(/\n/g,`<br>`)}</div>`}function Mt(e,t){return`<div class="bk-timeline">${f(e).map(e=>{let t=u(e.status),r=e.description?`<div class="bk-timeline-description">${n(e.description)}</div>`:``,i=e.timestamp?`<div class="bk-timeline-timestamp">${n(e.timestamp)}</div>`:``;return`<article class="bk-timeline-item" data-tone="${t}"><span class="bk-timeline-dot" style="background:${`var(--dt-${t}-emphasis)`};box-shadow:0 0 0 6px var(--dt-glow-${t});"></span><div class="bk-timeline-title">${n(e.title)}</div>${r}${i}</article>`}).join(``)}</div>`}function j(e,t){if(Array.isArray(e)){let r=e.map(e=>j(e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${r}</div></details>`:`<div class="bk-tree-children">${r}</div>`}if(e&&typeof e==`object`){let r=e,i=typeof r.name==`string`?r.name:typeof r.label==`string`?r.label:typeof r.title==`string`?r.title:void 0;if(i!==void 0)return j(r.children??[],i);let a=Object.entries(r).map(([e,t])=>j(t,e)).join(``);return t?`<details class="bk-tree-node" open><summary>${n(t)}</summary><div class="bk-tree-children">${a}</div></details>`:`<div class="bk-tree-children">${a}</div>`}let r=n(a(e));return t?`<div class="bk-tree-leaf"><span class="bk-tree-key">${n(t)}</span><span class="bk-tree-value">${r}</span></div>`:`<div class="bk-tree-leaf">${r}</div>`}function Nt(e,t){return`<div class="bk-tree">${j(o(e.value))}</div>`}const M={"--dt-bg-primary":`#f8f9fa`,"--dt-bg-secondary":`#f1f3f5`,"--dt-bg-tertiary":`#ffffff`,"--dt-bg-canvas":`#f8f9fa`,"--dt-text-primary":`#111111`,"--dt-text-secondary":`#4b5563`,"--dt-text-tertiary":`#9ca3af`,"--dt-border-default":`#e5e7eb`,"--dt-border-muted":`#d7dce2`,"--dt-border-subtle":`#eef2f5`,"--dt-accent-fg":`#147d74`,"--dt-accent-emphasis":`#147d74`,"--dt-accent-muted":`rgba(20, 125, 116, 0.3)`,"--dt-accent-subtle":`rgba(20, 125, 116, 0.1)`,"--dt-success-fg":`#10b981`,"--dt-success-emphasis":`#059669`,"--dt-success-muted":`rgba(16, 185, 129, 0.3)`,"--dt-success-subtle":`rgba(16, 185, 129, 0.1)`,"--dt-danger-fg":`#ef4444`,"--dt-danger-emphasis":`#dc2626`,"--dt-danger-muted":`rgba(239, 68, 68, 0.3)`,"--dt-danger-subtle":`rgba(239, 68, 68, 0.1)`,"--dt-warning-fg":`#f59e0b`,"--dt-warning-emphasis":`#d97706`,"--dt-warning-muted":`rgba(245, 158, 11, 0.3)`,"--dt-warning-subtle":`rgba(245, 158, 11, 0.1)`,"--dt-info-fg":`#3b82f6`,"--dt-info-emphasis":`#2563eb`,"--dt-info-muted":`rgba(59, 130, 246, 0.3)`,"--dt-info-subtle":`rgba(59, 130, 246, 0.1)`,"--dt-purple-fg":`#8250df`,"--dt-purple-emphasis":`#6639ba`,"--dt-purple-muted":`rgba(130, 80, 223, 0.3)`,"--dt-purple-subtle":`rgba(130, 80, 223, 0.1)`,"--dt-font-sans":`Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif`,"--dt-font-mono":`'JetBrains Mono', 'Geist Mono', 'Fira Code', 'SF Mono', Consolas, monospace`,"--dt-font-size-xs":`0.75rem`,"--dt-font-size-sm":`0.8125rem`,"--dt-font-size-base":`0.875rem`,"--dt-font-size-lg":`1rem`,"--dt-font-size-xl":`1.25rem`,"--dt-font-size-2xl":`1.5rem`,"--dt-font-size-3xl":`2rem`,"--dt-space-1":`0.25rem`,"--dt-space-2":`0.5rem`,"--dt-space-3":`0.75rem`,"--dt-space-4":`1rem`,"--dt-space-5":`1.25rem`,"--dt-space-6":`1.5rem`,"--dt-space-8":`2rem`,"--dt-space-12":`3rem`,"--dt-space-16":`4rem`,"--dt-radius-sm":`6px`,"--dt-radius-md":`8px`,"--dt-radius-lg":`12px`,"--dt-radius-xl":`16px`,"--dt-shadow-sm":`0 1px 2px rgba(0, 0, 0, 0.07)`,"--dt-shadow-md":`0 3px 6px rgba(0, 0, 0, 0.1)`,"--dt-shadow-lg":`0 8px 24px rgba(0, 0, 0, 0.12)`,"--dt-glow-accent":`rgba(20, 125, 116, 0.08)`,"--dt-glow-success":`rgba(16, 185, 129, 0.08)`,"--dt-glow-danger":`rgba(239, 68, 68, 0.08)`,"--dt-glow-warning":`rgba(245, 158, 11, 0.08)`,"--dt-glow-purple":`rgba(130, 80, 223, 0.08)`,"--dt-transition-fast":`150ms ease`,"--dt-transition-normal":`200ms ease`},N={"--dt-bg-primary":`#0c0c0c`,"--dt-bg-secondary":`#161616`,"--dt-bg-tertiary":`#232323`,"--dt-bg-canvas":`#0c0c0c`,"--dt-text-primary":`#ffffff`,"--dt-text-secondary":`#a0a4ab`,"--dt-text-tertiary":`#6b7280`,"--dt-border-default":`#24282d`,"--dt-border-muted":`#2a2f35`,"--dt-border-subtle":`#1a1d20`,"--dt-accent-fg":`#5db8a6`,"--dt-accent-emphasis":`#5db8a6`,"--dt-accent-muted":`rgba(93, 184, 166, 0.4)`,"--dt-accent-subtle":`rgba(93, 184, 166, 0.15)`,"--dt-success-emphasis":`#10b981`,"--dt-success-muted":`rgba(16, 185, 129, 0.4)`,"--dt-success-subtle":`rgba(16, 185, 129, 0.15)`,"--dt-danger-emphasis":`#ef4444`,"--dt-danger-muted":`rgba(239, 68, 68, 0.4)`,"--dt-danger-subtle":`rgba(239, 68, 68, 0.15)`,"--dt-warning-emphasis":`#f59e0b`,"--dt-warning-muted":`rgba(245, 158, 11, 0.4)`,"--dt-warning-subtle":`rgba(245, 158, 11, 0.15)`,"--dt-info-fg":`#60a5fa`,"--dt-info-emphasis":`#3b82f6`,"--dt-info-muted":`rgba(96, 165, 250, 0.4)`,"--dt-info-subtle":`rgba(96, 165, 250, 0.15)`,"--dt-purple-fg":`#bc8cff`,"--dt-purple-emphasis":`#a371f7`,"--dt-purple-muted":`rgba(188, 140, 255, 0.4)`,"--dt-purple-subtle":`rgba(188, 140, 255, 0.15)`,"--dt-shadow-sm":`0 1px 2px rgba(0, 0, 0, 0.35)`,"--dt-shadow-md":`0 3px 6px rgba(0, 0, 0, 0.4)`,"--dt-shadow-lg":`0 8px 24px rgba(0, 0, 0, 0.45)`,"--dt-glow-accent":`rgba(93, 184, 166, 0.14)`,"--dt-glow-success":`rgba(16, 185, 129, 0.14)`,"--dt-glow-danger":`rgba(239, 68, 68, 0.14)`,"--dt-glow-warning":`rgba(245, 158, 11, 0.14)`,"--dt-glow-purple":`rgba(188, 140, 255, 0.14)`},Pt=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-fg.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-fg.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-fg.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-info-fg.--dt-info-emphasis.--dt-info-muted.--dt-info-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-font-sans.--dt-font-mono.--dt-font-size-xs.--dt-font-size-sm.--dt-font-size-base.--dt-font-size-lg.--dt-font-size-xl.--dt-font-size-2xl.--dt-font-size-3xl.--dt-space-1.--dt-space-2.--dt-space-3.--dt-space-4.--dt-space-5.--dt-space-6.--dt-space-8.--dt-space-12.--dt-space-16.--dt-radius-sm.--dt-radius-md.--dt-radius-lg.--dt-radius-xl.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple.--dt-transition-fast.--dt-transition-normal`.split(`.`),Ft=`--dt-bg-primary.--dt-bg-secondary.--dt-bg-tertiary.--dt-bg-canvas.--dt-text-primary.--dt-text-secondary.--dt-text-tertiary.--dt-border-default.--dt-border-muted.--dt-border-subtle.--dt-accent-fg.--dt-accent-emphasis.--dt-accent-muted.--dt-accent-subtle.--dt-success-emphasis.--dt-success-muted.--dt-success-subtle.--dt-danger-emphasis.--dt-danger-muted.--dt-danger-subtle.--dt-warning-emphasis.--dt-warning-muted.--dt-warning-subtle.--dt-info-fg.--dt-info-emphasis.--dt-info-muted.--dt-info-subtle.--dt-purple-fg.--dt-purple-emphasis.--dt-purple-muted.--dt-purple-subtle.--dt-shadow-sm.--dt-shadow-md.--dt-shadow-lg.--dt-glow-accent.--dt-glow-success.--dt-glow-danger.--dt-glow-warning.--dt-glow-purple`.split(`.`),P={actions:`
30
30
  .bk-actions {
31
31
  display: flex;
32
32
  flex-wrap: wrap;
@@ -57,13 +57,13 @@ ${O}
57
57
  .bk-action--primary {
58
58
  background: var(--dt-accent-emphasis);
59
59
  border-color: var(--dt-accent-emphasis);
60
- color: var(--dt-bg-primary);
60
+ color: #ffffff;
61
61
  }
62
62
 
63
63
  .bk-action--danger {
64
64
  background: var(--dt-danger-emphasis);
65
65
  border-color: var(--dt-danger-emphasis);
66
- color: var(--dt-bg-primary);
66
+ color: #ffffff;
67
67
  }
68
68
 
69
69
  .bk-select {
@@ -1801,7 +1801,7 @@ ${e.description?`<span class="bk-approval-option-desc">${n(e.description)}</span
1801
1801
  ${o}
1802
1802
  <fieldset class="bk-approval-options">${s}</fieldset>
1803
1803
  ${c}
1804
- </div>`}const tn={actions:m,annotation:Qt,approval:en,cards:ee,chart:ne,checklist:we,code:Te,comparison:De,diff:He,"component-detail":Pe,"data-table-schema":ze,"docs-browser":We,"docs-hub":Je,finding:Xe,graph:Ze,heading:Qe,kv:et,"lifecycle-flow":ct,list:lt,markdown:mt,mermaid:ht,metrics:_t,paragraph:vt,progress:bt,prompt:St,separator:Ct,"status-board":Tt,table:Ot,tags:At,text:jt,timeline:Mt,tree:Nt};function nn(e,t){let r={...e,value:o(e.value)},i=tn[r.type],a=i?i(r,t):an(r);return r.title&&![`heading`,`finding`].includes(r.type)?`<section class="bk-section bk-section--${n(r.type)}"><h3 class="bk-section-title">${n(r.title)}</h3>${a}</section>`:a}function rn(e,t){return e.map(e=>nn(e,t)).join(`
1804
+ </div>`}const tn={actions:m,annotation:Qt,approval:en,cards:ee,chart:ne,checklist:we,code:Te,comparison:De,diff:He,"component-detail":Pe,"data-table-schema":ze,"docs-browser":We,"docs-hub":Je,finding:Xe,graph:Ze,heading:Qe,kv:et,"lifecycle-flow":ct,list:lt,markdown:mt,mermaid:ht,metrics:_t,paragraph:vt,progress:bt,prompt:St,separator:Ct,"status-board":Tt,table:Ot,tags:At,text:jt,timeline:Mt,tree:Nt};function nn(e,t,r){let a={...e,value:o(e.value)},s=tn[a.type],c=s?s(a,t):an(a);return a.title&&![`heading`,`finding`].includes(a.type)&&(c=`<section class="bk-section bk-section--${n(a.type)}"><h3 class="bk-section-title">${n(a.title)}</h3>${c}</section>`),`<div data-block-id="${i(a.blockId??`block-${r??0}`)}">${c}</div>`}function rn(e,t){return e.map((e,n)=>nn(e,t,n)).join(`
1805
1805
  `)}function an(e){if(e.value===void 0||e.value===null)return``;if(typeof e.value==`string`)return`<p class="bk-paragraph">${n(e.value)}</p>`;try{return`<pre class="bk-fallback">${n(JSON.stringify(e.value,null,2))}</pre>`}catch{return`<pre class="bk-fallback">${n(String(e.value))}</pre>`}}var on=class{templates=new Map;register(e){this.templates.set(e.id,e)}get(e){let t=this.templates.get(e);if(t)return t;let n=e.includes(`@`)?e:`${e}@`,r,i=-1;for(let[e,t]of this.templates){if(!e.startsWith(n))continue;let a=Number.parseInt(e.split(`@`)[1]??`0`,10);a>i&&(i=a,r=t)}return r}has(e){return this.get(e)!==void 0}list(){return[...this.templates.values()]}};const sn=[`mcp-app`,`browser`];function z(e){return typeof e==`object`&&!!e}function cn(e){return Array.isArray(e)?e.flatMap(e=>!z(e)||typeof e.label!=`string`?[]:[{label:e.label,checked:!!e.checked}]):[]}const ln={id:`checklist@1`,label:`Checklist`,description:`Checklist with optional title and checklist hydration metadata.`,inputSchema:{type:`object`,properties:{title:{type:`string`},items:{type:`array`,items:{type:`object`,required:[`label`,`checked`],properties:{label:{type:`string`},checked:{type:`boolean`}},additionalProperties:!1}}},required:[`items`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=[],n=z(e)&&typeof e.title==`string`?e.title:void 0,r=z(e)?cn(e.items):[];return n&&t.push({type:`heading`,value:n}),t.push({type:`checklist`,value:r}),t},hydration:[`checklist`],supportedTransports:sn},un=[`mcp-app`,`browser`,`export`];function B(e){return typeof e==`object`&&!!e}function dn(e){return B(e)&&typeof e.label==`string`&&(typeof e.value==`string`||typeof e.value==`number`)}function fn(e){return B(e)&&typeof e.key==`string`&&typeof e.label==`string`}function pn(e){return Array.isArray(e)?e.filter(B):[]}function mn(e,t){if(Array.isArray(e)){let t=e.filter(fn);if(t.length>0)return t}return Object.keys(t[0]??{}).map(e=>({key:e,label:e}))}const hn={id:`data-table@1`,label:`Data Table`,description:`Static data table with optional metrics and sortable table hydration.`,inputSchema:{type:`object`,properties:{columns:{type:`array`,items:{type:`object`,required:[`key`,`label`],properties:{key:{type:`string`},label:{type:`string`}},additionalProperties:!1}},rows:{type:`array`,items:{type:`object`}},stats:{type:`array`,items:{type:`object`,required:[`label`,`value`],properties:{label:{type:`string`},value:{type:[`string`,`number`]},trend:{type:[`string`,`number`]},status:{type:`string`}},additionalProperties:!1}}},required:[`rows`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=B(e)?pn(e.rows):[],n=B(e)?mn(e.columns,t):[],r=n.map(e=>e.label),i=t.map(e=>n.map(t=>e[t.key])),a=[];if(B(e)&&Array.isArray(e.stats)){let t=e.stats.filter(dn);t.length>0&&a.push({type:`metrics`,value:t})}return a.push({type:`table`,columns:n,headers:r,rows:i,value:{headers:r,rows:i}}),a},hydration:[`table`],supportedTransports:un},gn=[`mcp-app`,`browser`,`export`];function V(e){return typeof e==`object`&&!!e}function _n(e){return Array.isArray(e)?e.flatMap(e=>!V(e)||typeof e.type!=`string`||typeof e.content!=`string`?[]:[{type:e.type,content:e.content}]):[]}function vn(e){return Array.isArray(e)?e.flatMap(e=>!V(e)||typeof e.header!=`string`?[]:[{header:e.header,changes:_n(e.changes)}]):[]}function yn(e){return!V(e)||!Array.isArray(e.files)?[]:e.files.flatMap(e=>!V(e)||typeof e.path!=`string`||typeof e.status!=`string`?[]:[{path:e.path,status:e.status,additions:typeof e.additions==`number`?e.additions:0,deletions:typeof e.deletions==`number`?e.deletions:0,hunks:vn(e.hunks)}])}function bn(e){return e===`add`?`+`:e===`delete`?`-`:` `}function xn(e){let t=e.hunks.flatMap(e=>[e.header,...e.changes.map(e=>`${bn(e.type)}${e.content}`)]).join(`
1806
1806
  `);return[{type:`heading`,value:e.path},{type:`paragraph`,value:`${e.status} | +${e.additions} / -${e.deletions}`},{type:`code`,language:`diff`,value:t}]}const Sn={id:`diff-view@1`,label:`Diff View`,description:`Static diff summary rendered as per-file diff code blocks.`,inputSchema:{type:`object`,properties:{files:{type:`array`,items:{type:`object`,required:[`path`,`status`,`additions`,`deletions`,`hunks`],properties:{path:{type:`string`},status:{type:`string`},additions:{type:`number`},deletions:{type:`number`},hunks:{type:`array`,items:{type:`object`,required:[`header`,`changes`],properties:{header:{type:`string`},changes:{type:`array`,items:{type:`object`,required:[`type`,`content`],properties:{type:{type:`string`},content:{type:`string`}},additionalProperties:!1}}},additionalProperties:!1}}},additionalProperties:!1}}},required:[`files`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>yn(e).flatMap(xn),hydration:[],supportedTransports:gn},Cn=[`mcp-app`,`browser`,`export`];function H(e){return typeof e==`object`&&!!e}function wn(e){return H(e)&&typeof e.type==`string`}function Tn(e){return Array.isArray(e)&&e.every(wn)}function En(e){if(!H(e))return{sections:[]};let t=Array.isArray(e.sections)?e.sections.flatMap(e=>{if(!H(e)||typeof e.heading!=`string`)return[];let t=typeof e.content==`string`||Tn(e.content)?e.content:``;return[{heading:e.heading,content:t}]}):[];return{title:typeof e.title==`string`?e.title:void 0,sections:t}}function Dn(e){let t=[{type:`heading`,value:e.heading}];return typeof e.content==`string`?(t.push({type:`paragraph`,value:e.content}),t):(t.push(...e.content),t)}const On={id:`document@1`,label:`Document`,description:`Structured document with optional title and section content blocks.`,inputSchema:{type:`object`,properties:{title:{type:`string`},sections:{type:`array`,items:{type:`object`,additionalProperties:!1,required:[`heading`,`content`],properties:{heading:{type:`string`},content:{oneOf:[{type:`string`},{type:`array`,items:{type:`object`}}]}}}}},required:[`sections`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=En(e),n=[];t.title&&n.push({type:`heading`,value:t.title});for(let e of t.sections)n.push(...Dn(e));return n},hydration:[],supportedTransports:Cn},kn=[`mcp-app`,`browser`,`export`];function An(e){return typeof e==`object`&&!!e}function jn(e){return An(e)?{code:typeof e.code==`string`?e.code:`ERROR`,message:typeof e.message==`string`?e.message:`Unknown error`,details:typeof e.details==`string`?e.details:void 0,stack:typeof e.stack==`string`?e.stack:void 0}:{code:`ERROR`,message:`Unknown error`}}const U={id:`error@1`,label:`Error`,description:`Static error view with message and optional stack trace.`,inputSchema:{type:`object`,properties:{code:{type:`string`},message:{type:`string`},details:{type:`string`},stack:{type:`string`}},required:[`code`,`message`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=jn(e),n=[{type:`heading`,value:`Error`},{type:`code`,title:t.code,language:`text`,value:t.details?`${t.message}\n\n${t.details}`:t.message}];return t.stack&&n.push({type:`code`,title:`Stack Trace`,language:`text`,value:t.stack}),n},hydration:[],supportedTransports:kn};function W(e){return typeof e==`object`&&!!e}function Mn(e){return Array.isArray(e)?e.flatMap(e=>!W(e)||typeof e.name!=`string`||typeof e.label!=`string`?[]:[{name:e.name,label:e.label,type:typeof e.type==`string`?e.type:void 0,required:typeof e.required==`boolean`?e.required:void 0,placeholder:typeof e.placeholder==`string`?e.placeholder:void 0,default:typeof e.default==`string`?e.default:void 0,options:Array.isArray(e.options)?e.options.filter(e=>typeof e==`string`||W(e)&&typeof e.label==`string`&&typeof e.value==`string`):void 0,value:typeof e.value==`string`||typeof e.value==`boolean`?e.value:void 0}]):[]}const Nn={id:`form@1`,label:`Form`,description:`Browser-only form template rendered as a heading and table of field metadata.`,inputSchema:{type:`object`,properties:{title:{type:`string`},fields:{type:`array`,items:{type:`object`,required:[`name`,`label`],properties:{name:{type:`string`},label:{type:`string`},type:{type:`string`},required:{type:`boolean`},placeholder:{type:`string`},default:{type:`string`},options:{type:`array`,items:{anyOf:[{type:`string`},{type:`object`,required:[`label`,`value`],properties:{label:{type:`string`},value:{type:`string`}},additionalProperties:!1}]}},value:{type:[`string`,`boolean`]}},additionalProperties:!1}}},required:[`fields`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t={title:W(e)&&typeof e.title==`string`?e.title:`Form`,fields:W(e)?Mn(e.fields):[]};return[{type:`heading`,value:t.title},{type:`table`,value:{headers:[`Label`,`Name`,`Type`,`Required`,`Default/Placeholder`],rows:t.fields.map(e=>[e.label||e.name,e.name,e.type||`text`,e.required?`Yes`:`No`,e.placeholder||e.default||``])}}]},hydration:[`form`],supportedTransports:[`browser`]},Pn=[`mcp-app`,`browser`];function G(e){return typeof e==`object`&&!!e}function Fn(e){if(!Array.isArray(e))return;let t=e.flatMap(e=>!G(e)||typeof e.id!=`string`||typeof e.label!=`string`?[]:[{id:e.id,label:e.label}]);return t.length>0?t:void 0}function In(e){return Array.isArray(e)?e.flatMap(e=>!G(e)||typeof e.id!=`string`||typeof e.label!=`string`?[]:[{id:e.id,label:e.label,category:typeof e.category==`string`?e.category:void 0,tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):void 0}]):[]}function Ln(e){return G(e)?{categories:Fn(e.categories),items:In(e.items)}:{items:[]}}function Rn(e){return{title:e.label,body:e.id,description:e.tags&&e.tags.length>0?e.tags.join(`, `):void 0}}function zn(e,t){return t.length===0?[]:[{type:`heading`,value:e},{type:`cards`,value:t.map(Rn)}]}const Bn={id:`picker@1`,label:`Picker`,description:`Grouped item picker rendered as cards with picker hydration metadata.`,inputSchema:{type:`object`,properties:{categories:{type:`array`,items:{type:`object`,required:[`id`,`label`],properties:{id:{type:`string`},label:{type:`string`}},additionalProperties:!1}},items:{type:`array`,items:{type:`object`,required:[`id`,`label`],properties:{id:{type:`string`},label:{type:`string`},category:{type:`string`},tags:{type:`array`,items:{type:`string`}}},additionalProperties:!1}}},required:[`items`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=Ln(e),n=[];if(t.categories&&t.categories.length>0){let e=new Set(t.categories.map(e=>e.id)),r=[];for(let e of t.categories){let n=zn(e.label,t.items.filter(t=>t.category===e.id));n.length>0&&r.push(n)}let i=zn(`Other`,t.items.filter(t=>!t.category||!e.has(t.category)));return i.length>0&&r.push(i),n.push(...r.flatMap((e,t)=>t>0?[{type:`separator`},...e]:e)),n}return t.items.length>0&&n.push({type:`cards`,value:t.items.map(Rn)}),n},hydration:[`picker`],supportedTransports:Pn},Vn=[`mcp-app`,`browser`,`export`];function K(e){return typeof e==`object`&&!!e}function Hn(e){return K(e)&&typeof e.type==`string`}function Un(e){return Array.isArray(e)&&e.every(Hn)}function Wn(e){return K(e)&&typeof e.label==`string`&&(typeof e.value==`string`||typeof e.value==`number`)}function Gn(e){return Array.isArray(e)?e.flatMap(e=>{if(!K(e)||typeof e.heading!=`string`)return[];let t=typeof e.content==`string`||Un(e.content)?e.content:``;return[{heading:e.heading,content:t}]}):[]}function Kn(e){return Array.isArray(e)?e.flatMap(e=>K(e)?[{title:typeof e.title==`string`?e.title:void 0,value:e.value,headers:Array.isArray(e.headers)?e.headers.filter(e=>typeof e==`string`):void 0,rows:Array.isArray(e.rows)?e.rows.filter(e=>Array.isArray(e)):void 0}]:[]):[]}function qn(e){let t=[{type:`heading`,value:e.heading}];return typeof e.content==`string`?(t.push({type:`paragraph`,value:e.content}),t):(t.push(...e.content),t)}function Jn(e){let t={type:`table`};return e.title&&(t.title=e.title),e.value!==void 0&&(t.value=e.value),e.headers&&(t.headers=e.headers),e.rows&&(t.rows=e.rows),t}const Yn={id:`report@1`,label:`Report`,description:`Static report with title, optional metrics, narrative sections, and tables.`,inputSchema:{type:`object`,properties:{title:{type:`string`},metrics:{type:`array`,items:{type:`object`,required:[`label`,`value`],properties:{label:{type:`string`},value:{type:[`string`,`number`]},trend:{type:[`string`,`number`]},status:{type:`string`}},additionalProperties:!1}},sections:{type:`array`,items:{type:`object`,required:[`heading`,`content`],properties:{heading:{type:`string`},content:{oneOf:[{type:`string`},{type:`array`,items:{type:`object`}}]}},additionalProperties:!1}},tables:{type:`array`,items:{type:`object`,properties:{title:{type:`string`},value:{},headers:{type:`array`,items:{type:`string`}},rows:{type:`array`,items:{type:`array`,items:{}}}},additionalProperties:!1}}},required:[`title`,`sections`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t={title:K(e)&&typeof e.title==`string`?e.title:`Report`,metrics:K(e)&&Array.isArray(e.metrics)?e.metrics.filter(Wn):void 0,sections:K(e)?Gn(e.sections):[],tables:K(e)?Kn(e.tables):void 0},n=[{type:`heading`,value:t.title}];t.metrics&&t.metrics.length>0&&n.push({type:`metrics`,value:t.metrics});for(let e of t.sections)n.push(...qn(e));for(let e of t.tables??[])n.push(Jn(e));return n},hydration:[],supportedTransports:Vn},Xn=[`mcp-app`,`browser`];function q(e){return typeof e==`object`&&!!e}function Zn(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Qn(e){return Array.isArray(e)?e.flatMap(e=>{if(!q(e)||typeof e.id!=`string`||typeof e.body!=`string`)return[];let t=e.type;if(t!==`COMMENT`&&t!==`DELETION`&&t!==`GLOBAL_COMMENT`)return[];let n=q(e.anchor)?e.anchor:{};return[{id:e.id,type:t,body:e.body,anchor:{blockId:n.blockId},author:typeof e.author==`string`?e.author:void 0,createdAt:typeof e.createdAt==`string`?e.createdAt:void 0}]}):[]}function $n(e){return Array.isArray(e)?e.flatMap(e=>{if(!q(e)||typeof e.id!=`string`||typeof e.label!=`string`)return[];let t=e.outcome;return t!==`approved`&&t!==`rejected`&&t!==`changes-requested`&&t!==`deferred`?[]:[{id:e.id,label:e.label,outcome:t,description:typeof e.description==`string`?e.description:void 0}]}):[]}const er={id:`review@1`,label:`Review`,description:`Review surface with criteria checklist, annotation items, and approval controls.`,inputSchema:{type:`object`,properties:{title:{type:`string`},criteria:{type:`array`,items:{type:`string`}},annotations:{type:`array`,items:{type:`object`,required:[`id`,`body`,`type`,`anchor`],properties:{id:{type:`string`},type:{type:`string`,enum:[`COMMENT`,`DELETION`,`GLOBAL_COMMENT`]},body:{type:`string`},anchor:{type:`object`,properties:{blockId:{type:`string`},contextHash:{type:`string`}}},author:{type:`string`},createdAt:{type:`string`}},additionalProperties:!1}},approval:{type:`object`,properties:{prompt:{type:`string`},options:{type:`array`,items:{type:`object`,required:[`id`,`label`,`outcome`],properties:{id:{type:`string`},label:{type:`string`},outcome:{type:`string`,enum:[`approved`,`rejected`,`changes-requested`,`deferred`]},description:{type:`string`}},additionalProperties:!1}},requireComment:{type:`boolean`}},required:[`prompt`,`options`]},comment:{type:`string`}},required:[`title`,`criteria`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=[];if(!q(e))return t;let n=typeof e.title==`string`?e.title:`Review`;t.push({type:`heading`,value:n});let r=Zn(e.criteria);r.length>0&&t.push({type:`checklist`,value:r.map(e=>({label:e,checked:!1}))});let i=Qn(e.annotations);i.length>0&&t.push({type:`annotation`,value:i});let a=e.approval;if(q(a)){let e=$n(a.options);e.length>0&&t.push({type:`approval`,value:{prompt:typeof a.prompt==`string`?a.prompt:``,options:e,requireComment:typeof a.requireComment==`boolean`?a.requireComment:!1}})}let o=typeof e.comment==`string`?e.comment:void 0;return o&&t.push({type:`markdown`,value:o}),t},hydration:[`checklist`],supportedTransports:Xn},tr=[`mcp-app`,`browser`,`export`];function J(e){return typeof e==`object`&&!!e}function nr(e){return Array.isArray(e)?e.flatMap(e=>{if(!J(e)||typeof e.category!=`string`||!Array.isArray(e.items))return[];let t=e.items.flatMap(e=>!J(e)||typeof e.label!=`string`||typeof e.status!=`string`?[]:[{label:e.label,status:e.status,badge:typeof e.badge==`string`?e.badge:void 0}]);return[{category:e.category,items:t}]}):[]}function rr(e){return e.map(e=>({title:e.label,status:e.status,badge:e.badge}))}const ir={id:`status-board@1`,label:`Status Board`,description:`Static status board grouped into category headings and card collections.`,inputSchema:{type:`object`,properties:{categories:{type:`array`,items:{type:`object`,required:[`category`,`items`],properties:{category:{type:`string`},items:{type:`array`,items:{type:`object`,required:[`label`,`status`],properties:{label:{type:`string`},status:{type:`string`},badge:{type:`string`}},additionalProperties:!1}}},additionalProperties:!1}}},required:[`categories`],additionalProperties:!1},defaultLayout:{},blocksFromData:e=>{let t=J(e)?nr(e.categories):[],n=[];for(let e of t)n.push({type:`heading`,value:e.category}),n.push({type:`cards`,value:rr(e.items)});return n},hydration:[],supportedTransports:tr},ar=[`mcp-app`,`browser`,`export`];function or(e){return typeof e==`object`&&!!e}function sr(e){return Array.isArray(e)?e.flatMap(e=>!or(e)||typeof e.title!=`string`?[]:[{title:e.title,description:typeof e.description==`string`?e.description:void 0,timestamp:typeof e.timestamp==`string`?e.timestamp:void 0,status:typeof e.status==`string`?e.status:void 0}]):[]}function cr(e){return Array.isArray(e)?{entries:sr(e)}:or(e)?{entries:sr(e.entries??e.events??e.items),title:typeof e.title==`string`?e.title:void 0}:{entries:[]}}const Y={type:`array`,items:{type:`object`,required:[`title`],properties:{title:{type:`string`},description:{type:`string`},timestamp:{type:`string`},status:{type:`string`}},additionalProperties:!1}},lr={id:`timeline@1`,label:`Timeline`,description:`Static timeline events rendered as a timeline block.`,inputSchema:{oneOf:[Y,{type:`object`,properties:{title:{type:`string`},entries:Y,events:Y,items:Y},anyOf:[{required:[`entries`]},{required:[`events`]},{required:[`items`]}],additionalProperties:!1}]},defaultLayout:{},blocksFromData:e=>{let{entries:t,title:n}=cr(e),r=[];return n&&r.push({type:`heading`,value:n}),r.push({type:`timeline`,value:t}),r},hydration:[],supportedTransports:ar},ur=[`mcp-app`,`browser`,`export`];function X(e){return typeof e==`object`&&!!e}function dr(e){return X(e)&&typeof e.label==`string`}function fr(e){return{name:e.label,children:Array.isArray(e.children)?e.children.filter(dr).map(fr):[]}}function pr(e){if(!X(e))return{};let t=e.root;return dr(t)?fr(t):X(t)?t:e}const mr={id:`tree@1`,label:`Tree`,description:`Static tree view data with optional tree hydration metadata.`,inputSchema:{oneOf:[{type:`object`,properties:{root:{type:`object`}},required:[`root`],additionalProperties:!0},{type:`object`,additionalProperties:!0}]},defaultLayout:{},blocksFromData:e=>[{type:`tree`,value:pr(e)}],hydration:[`tree`],supportedTransports:ur},Z=new on;Z.register(er),Z.register(ln),Z.register(Sn),Z.register(On),Z.register(Bn),Z.register(Yn),Z.register(lr),Z.register(mr),Z.register(hn),Z.register(U),Z.register(Nn),Z.register(ir);let Q=0;function hr(){return Q=(Q+1)%(2**53-1),`${Date.now().toString(16).padStart(12,`0`).slice(-12)}${Q.toString(16).padStart(4,`0`).slice(-4)}${Array.from({length:8},()=>Math.floor(Math.random()*256).toString(16).padStart(2,`0`)).join(``)}`}function gr(e){return{id:e,version:1,entry:`@aikit/blocks-interactive/dist/islands/${e}.mjs`,selector:`[data-island="${e}"]`,needsData:!0}}function _r(e,t){let n=new TextEncoder;return n.encode(e).byteLength+t.reduce((e,t)=>e+n.encode(t).byteLength,0)}function vr(e,t){let n=[],r=t.registry??Z,i={colorScheme:e.colorScheme??t.colorScheme??`auto`,transport:t.transport,lang:e.lang,dir:e.dir},a=[...e.blocks??[]],o=[...a],s=[],c=[...e.actions??[]];if(e.template){let t=r.get(e.template);if(t)try{o=t.blocksFromData(e.data,i),o.length===0&&e.data!==void 0&&(n.push({level:`warn`,message:`Template "${e.template}" produced no blocks from provided data`}),o=[{type:`markdown`,value:`> ⚠️ Template \`${e.template}\` received data but produced no content. Verify the data structure matches the template schema.`}]),t.actionsFromData&&(c=[...c,...t.actionsFromData(e.data)]),s=t.hydration.map(e=>gr(e))}catch(t){let r=t instanceof Error?t.message:String(t);n.push({level:`error`,message:`Template ${e.template} failed: ${r}`}),o=a.length===0?U.blocksFromData({code:`TEMPLATE_RENDER_ERROR`,message:`Failed to render template ${e.template}`,details:r},i):[...a]}else n.push({level:`warn`,message:`Template not found: ${e.template}`})}let l=rn(o,i),u=[I(o.map(e=>e.type))],d=t.nonce??hr(),f=e.metadata?.surfaceId??`surface-${d}`,p=s.length>0?JSON.stringify({data:e.data,blocks:o}):void 0,m=t.blockVendorScripts?[...new Set(o.flatMap(e=>t.blockVendorScripts?.[e.type]??[]))]:void 0;return{surfaceId:f,nonce:d,html:l,css:u,vendorScripts:m&&m.length>0?m:void 0,islands:s,actions:c,payload:p,estimatedBytes:_r(l,u),exportPolicy:s.length>0?`local-interactive`:`static-only`,diagnostics:n.length>0?n:void 0}}function yr(e){return e===`up`||e===`down`||e===`neutral`}function $(e){return typeof e==`object`&&!!e}function br(e){return!$(e)||!Array.isArray(e.metrics)?{metrics:[]}:{metrics:e.metrics.flatMap(e=>{if(!$(e)||typeof e.label!=`string`||typeof e.value!=`string`&&typeof e.value!=`number`)return[];let t=$(e.trend)&&typeof e.trend.value==`string`&&yr(e.trend.direction)?{value:e.trend.value,direction:e.trend.direction}:void 0,n=Array.isArray(e.items)?e.items.flatMap(e=>!$(e)||typeof e.label!=`string`||typeof e.value!=`string`?[]:[{label:e.label,value:e.value}]):void 0;return[{id:typeof e.id==`string`?e.id:void 0,label:e.label,value:e.value,trend:t,status:e.status===`success`||e.status===`warning`||e.status===`error`||e.status===`info`?e.status:void 0,type:e.type===`progress`||e.type===`list`||e.type===`stat`?e.type:void 0,progress:typeof e.progress==`number`?Or(e.progress):void 0,items:n}]})}}function xr(e){let t=e.type===`progress`&&typeof e.progress==`number`?`${e.progress}%`:void 0;return{label:e.label,value:e.value,trend:e.trend?.value??t,status:e.status}}function Sr(e){return e.type!==`progress`||typeof e.progress!=`number`?null:{label:e.label,value:Or(e.progress),max:100}}function Cr(e){return $(e)?{columns:Array.isArray(e.columns)?e.columns.flatMap(e=>!$(e)||typeof e.id!=`string`||typeof e.label!=`string`?[]:[{id:e.id,label:e.label}]):[],cards:Array.isArray(e.cards)?e.cards.flatMap(e=>!$(e)||typeof e.id!=`string`||typeof e.title!=`string`||typeof e.column!=`string`?[]:[{id:e.id,title:e.title,description:typeof e.description==`string`?e.description:void 0,column:e.column,tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):void 0,priority:e.priority===`high`||e.priority===`medium`||e.priority===`low`?e.priority:void 0}]):[]}:{columns:[],cards:[]}}function wr(e){return{title:e.title,description:e.description,badge:e.priority,body:e.tags?.join(`, `),status:e.priority}}function Tr(e){return!$(e)||!Array.isArray(e.items)?[]:e.items.flatMap(e=>!$(e)||typeof e.id!=`string`||typeof e.label!=`string`?[]:[{id:e.id,label:e.label}])}function Er(e){return $(e)?{name:typeof e.name==`string`?e.name:``,total:typeof e.total==`number`?e.total:typeof e.value==`number`?e.value:0,self:typeof e.self==`number`?e.self:void 0,children:Array.isArray(e.children)?e.children.map(e=>Er(e)):[]}:{name:``,total:0,children:[]}}function Dr(e){return{name:e.self==null?`${e.name} (${e.total})`:`${e.name} (${e.total} total / ${e.self} self)`,children:(e.children??[]).map(Dr)}}function Or(e){return Math.max(0,Math.min(100,e))}function kr(e){let t=br(e),n=[];t.metrics.length>0&&n.push({type:`metrics`,value:t.metrics.map(xr)});let r=t.metrics.map(Sr).filter(e=>e!==null);r.length>0&&n.push({type:`progress`,value:r});for(let e of t.metrics)e.type===`list`&&e.items&&e.items.length>0&&(n.push({type:`heading`,value:e.label}),n.push({type:`table`,value:e.items}));return n}function Ar(e){let t=Cr(e),n=[];return t.columns.forEach((e,r)=>{r>0&&n.push({type:`separator`,value:``});let i=t.cards.filter(t=>t.column===e.id);n.push({type:`heading`,value:e.label}),n.push({type:`cards`,value:i.map(wr)})}),n}function jr(e){let t=Tr(e);return t.length===0?[]:[{type:`cards`,value:t.map((e,t)=>({title:e.label,body:e.id,badge:`#${t+1}`}))}]}function Mr(e){return!$(e)||!$(e.profile)?[]:[{type:`tree`,value:Dr(Er(e.profile))}]}const Nr={id:`dashboard@1`,label:`Dashboard`,description:`Metric cards grid with optional charts.`,inputSchema:{type:`object`,properties:{metrics:{type:`array`,items:{type:`object`,required:[`label`,`value`],properties:{id:{type:`string`},label:{type:`string`},value:{type:[`string`,`number`]},trend:{type:`object`,properties:{value:{type:`string`},direction:{enum:[`up`,`down`,`neutral`]}},required:[`value`,`direction`],additionalProperties:!1},status:{enum:[`success`,`warning`,`error`,`info`]},type:{enum:[`stat`,`progress`,`list`]},progress:{type:`number`},items:{type:`array`,items:{type:`object`,required:[`label`,`value`],properties:{label:{type:`string`},value:{type:`string`}},additionalProperties:!1}}},additionalProperties:!1}}},required:[`metrics`],additionalProperties:!1},defaultLayout:{maxWidth:`1200px`},blocksFromData:e=>kr(e),hydration:[],supportedTransports:[`mcp-app`,`browser`]},Pr={id:`kanban@1`,label:`Kanban`,description:`Drag-and-drop task board grouped by columns.`,inputSchema:{type:`object`,properties:{columns:{type:`array`,items:{type:`object`,required:[`id`,`label`],properties:{id:{type:`string`},label:{type:`string`},color:{type:`string`}},additionalProperties:!1}},cards:{type:`array`,items:{type:`object`,required:[`id`,`title`,`column`],properties:{id:{type:`string`},title:{type:`string`},description:{type:`string`},column:{type:`string`},tags:{type:`array`,items:{type:`string`}},priority:{enum:[`high`,`medium`,`low`]}},additionalProperties:!1}}},required:[`columns`,`cards`],additionalProperties:!1},defaultLayout:{maxWidth:`1400px`},blocksFromData:e=>Ar(e),hydration:[],supportedTransports:[`browser`]},Fr={id:`list-sort@1`,label:`Sortable List`,description:`Reorderable list of items with browser drag-and-drop interactions.`,inputSchema:{type:`object`,properties:{items:{type:`array`,items:{type:`object`,required:[`id`,`label`],properties:{id:{type:`string`},label:{type:`string`}},additionalProperties:!1}}},required:[`items`],additionalProperties:!1},defaultLayout:{maxWidth:`720px`},blocksFromData:e=>jr(e),hydration:[],supportedTransports:[`browser`]},Ir={id:`flame-graph@1`,label:`Flame Graph`,description:`Hierarchical performance profile with interactive zoom state.`,inputSchema:{type:`object`,properties:{profile:{type:`object`}},required:[`profile`],additionalProperties:!1},defaultLayout:{maxWidth:`1200px`},blocksFromData:e=>Mr(e),hydration:[`flame-graph`],supportedTransports:[`browser`]},Lr={blockedClipboardMessage:`Image clipboard is blocked by this host or browser. Open in a browser that allows clipboard-write, then try again.`,clipboardSuccessMessage:`Copied image to clipboard.`,fallbackToServerCaptureMessage:`Client Copy as Image capture failed`};function Rr(){return Lr}function zr(e){return e.replace(/</g,`\\u003c`).replace(/>/g,`\\u003e`).replace(/&/g,`\\u0026`).replace(/\u2028/g,`\\u2028`).replace(/\u2029/g,`\\u2029`)}function Br(e,t){let n=[`
1807
1807
  * {
@@ -1852,4 +1852,4 @@ main > * {
1852
1852
  `)}function Kr(e,t,r){if(t!==`local-interactive`)return``;let i=new Set,a=[],o=` nonce="${n(r)}"`;for(let t of e)i.has(t.entry)||(i.add(t.entry),a.push(` <script type="module" src="${n(t.entry)}"${o}><\/script>`));return a.length>0&&a.push(` <script type="module"${o}>`,` import { hydrateAsync } from "/@aikit/blocks-interactive/dist/index.mjs";`,` const boot = () => {`,` void hydrateAsync();`,` };`,` if (document.readyState === "loading") {`,` document.addEventListener("DOMContentLoaded", boot, { once: true });`,` } else {`,` boot();`,` }`,` <\/script>`),a.join(`
1853
1853
  `)}function qr(e){let t=n(e.lang??`en`),r=n(e.dir??`ltr`),i=e.colorScheme??`auto`,a=e.generatedAt??new Date().toISOString(),o=[`lang="${t}"`,`dir="${r}"`];i!==`auto`&&o.push(`data-theme="${i}"`);let s=Vr(e.tokenCss??Bt(`light`)),c=Hr(e.headScripts??[],e.nonce),l=e.islands.length>0&&e.payload?` <script type="application/json" id="surface-payload">${zr(e.payload)}<\/script>`:``,u=Kr(e.islands,e.exportPolicy,e.nonce),d=[Ur(i,e.nonce),l,u].filter(Boolean).join(`
1854
1854
  `);return[`<!DOCTYPE html>`,`<html ${o.join(` `)}>`,`<head>`,` <meta charset="utf-8">`,` <meta name="viewport" content="width=device-width, initial-scale=1">`,` <title>${n(e.title)}</title>`,Br(s,e.css),c,`</head>`,`<body>`,Kt({title:e.title,subtitle:e.subtitle,transport:e.transport,actionsHtml:e.headerActionsHtml}),` <main>${e.html}</main>`,qt({generatedAt:a,contentHtml:e.footerContentHtml}),d,`</body>`,`</html>`].filter(Boolean).join(`
1855
- `)}export{R as HEADER_CLASS_NAMES,Jt as HEADER_CSS,on as TemplateRegistry,It as allCss,F as baseCss,f as blockItems,Rr as buildCopyImageExportFallback,qt as buildFooter,Kt as buildHeader,qr as buildShell,ln as checklistTemplate,I as collectCss,Ft as darkTokenNames,N as darkTokens,Nr as dashboardTemplateDefinition,hn as dataTableTemplate,Z as defaultRegistry,Sn as diffViewTemplate,On as documentTemplate,U as errorTemplate,n as escapeHtml,Ir as flameGraphTemplateDefinition,Nn as formTemplate,a as formatValue,zt as generateDarkTokenCss,Bt as generateTokenCss,s as inlineMarkdown,t as isError,e as isResult,Pr as kanbanTemplateDefinition,Fr as listSortTemplateDefinition,Bn as pickerTemplate,nn as renderBlock,rn as renderBlocks,vr as renderSurface,Yn as reportTemplate,er as reviewTemplate,i as sanitizeId,r as sanitizeUrl,ir as statusBoardTemplate,lr as timelineTemplate,Pt as tokenNames,M as tokens,u as toneName,d as toneVar,mr as treeTemplate,o as tryParseJson};
1855
+ `)}export{R as HEADER_CLASS_NAMES,Jt as HEADER_CSS,on as TemplateRegistry,It as allCss,F as baseCss,f as blockItems,Rr as buildCopyImageExportFallback,qt as buildFooter,Kt as buildHeader,qr as buildShell,Ur as buildThemeScript,ln as checklistTemplate,I as collectCss,Ft as darkTokenNames,N as darkTokens,Nr as dashboardTemplateDefinition,hn as dataTableTemplate,Z as defaultRegistry,Sn as diffViewTemplate,On as documentTemplate,U as errorTemplate,n as escapeHtml,Ir as flameGraphTemplateDefinition,Nn as formTemplate,a as formatValue,zt as generateDarkTokenCss,Bt as generateTokenCss,s as inlineMarkdown,t as isError,e as isResult,Pr as kanbanTemplateDefinition,Fr as listSortTemplateDefinition,Bn as pickerTemplate,nn as renderBlock,rn as renderBlocks,vr as renderSurface,Yn as reportTemplate,er as reviewTemplate,i as sanitizeId,r as sanitizeUrl,ir as statusBoardTemplate,lr as timelineTemplate,Pt as tokenNames,M as tokens,u as toneName,d as toneVar,mr as treeTemplate,o as tryParseJson};
@@ -32,7 +32,7 @@ declare const ISLAND_REGISTRY: IslandDefinition[];
32
32
  //#endregion
33
33
  //#region packages/blocks-interactive/src/islands/actions.d.ts
34
34
  /**
35
- * Hydrate action buttons and selects inside an actions block.
35
+ * Hydrate action buttons, selects, text-submits, and form-submits inside an actions block.
36
36
  */
37
37
  declare function hydrateActions(container: Element, onAction: (id: string, value?: string) => void): Cleanup;
38
38
  //#endregion
@@ -1,4 +1,4 @@
1
- import{a as e,i as t,n,r}from"./payload-DyKkZIOX.mjs";function i(e,t){let n=[];for(let r of Array.from(e.querySelectorAll(`[data-action-id]`))){let e=r.getAttribute(`data-action-id`);if(!e)continue;if(r.tagName===`SELECT`){let i=r,a=()=>{t(e,i.value)};i.addEventListener(`change`,a),n.push(()=>{i.removeEventListener(`change`,a)});continue}let i=()=>{t(e)};r.addEventListener(`click`,i),n.push(()=>{r.removeEventListener(`click`,i)})}return()=>{for(let e of n)e()}}function a(e){let t=e.createElement(`style`);return t.textContent=`
1
+ import{a as e,i as t,n,r}from"./payload-DyKkZIOX.mjs";function i(e){let t=e.querySelector(`.bk-action-feedback`);t&&(t.style.display=`block`,t.setAttribute(`data-feedback-state`,`sent`),setTimeout(()=>{t.style.display=`none`},3e3));let n=e.querySelectorAll(`button.bk-action`);for(let e of n)e.disabled=!0;setTimeout(()=>{for(let e of n)e.disabled=!1},2e3)}function a(e,t){let n=[],r=new WeakSet;for(let a of Array.from(e.querySelectorAll(`.bk-text-submit`))){let o=a.getAttribute(`data-action-id`);if(!o)continue;r.add(a);let s=a.querySelector(`.bk-input`),c=a.querySelector(`.bk-action--primary`);if(!s||!c)continue;r.add(s),r.add(c);let l=()=>{t(o,s.value),i(e)};c.addEventListener(`click`,l),n.push(()=>c.removeEventListener(`click`,l))}for(let a of Array.from(e.querySelectorAll(`.bk-form`))){let o=a.getAttribute(`data-action-id`);if(!o)continue;r.add(a);for(let e of a.querySelectorAll(`[data-action-id]`))r.add(e);let s=n=>{n.preventDefault();let r=new FormData(a),s={};r.forEach((e,t)=>{s[t]=String(e)}),t(o,JSON.stringify(s)),i(e)};a.addEventListener(`submit`,s),n.push(()=>a.removeEventListener(`submit`,s))}for(let a of Array.from(e.querySelectorAll(`[data-action-id]`))){if(r.has(a))continue;let o=a.getAttribute(`data-action-id`);if(!o)continue;if(a.tagName===`SELECT`){let r=a,s=()=>{t(o,r.value),i(e)};r.addEventListener(`change`,s),n.push(()=>r.removeEventListener(`change`,s));continue}let s=()=>{t(o),i(e)};a.addEventListener(`click`,s),n.push(()=>a.removeEventListener(`click`,s))}return()=>{for(let e of n)e()}}function o(e){let t=e.createElement(`style`);return t.textContent=`
2
2
  .bk-checklist-progress {
3
3
  margin-bottom: var(--dt-space-3);
4
4
  color: var(--dt-text-secondary);
@@ -12,4 +12,4 @@ import{a as e,i as t,n,r}from"./payload-DyKkZIOX.mjs";function i(e,t){let n=[];f
12
12
  margin: 0;
13
13
  accent-color: var(--dt-accent-fg);
14
14
  }
15
- `,t}function o(e,t){let n=t.filter(e=>e.getAttribute(`data-checked`)===`true`).length,r=t.length;return e.textContent=`${n}/${r} complete`,{complete:n,total:r}}function s(e,t={}){let n=Array.from(e.querySelectorAll(`.bk-checklist-item`));if(n.length===0)return()=>{};let r=e.ownerDocument,i=a(r),s=r.createElement(`div`);s.className=`bk-checklist-progress`,e.parentElement?.insertBefore(s,e),r.head?.appendChild(i);let c=[];for(let[e,i]of n.entries()){let a=i.querySelector(`.bk-checklist-icon`),l=i.querySelector(`.bk-checklist-label`)?.textContent?.trim()??``,u=r.createElement(`input`);u.type=`checkbox`,u.className=`bk-checklist-box`,u.checked=i.getAttribute(`data-checked`)===`true`;let d=()=>{i.setAttribute(`data-checked`,String(u.checked));let r=o(s,n);t.onAction?.(`checklist`,JSON.stringify({index:e,label:l,checked:u.checked,complete:r.complete,total:r.total}))};u.addEventListener(`change`,d),c.push(()=>{u.removeEventListener(`change`,d)}),a?a.replaceWith(u):i.insertBefore(u,i.firstChild)}return o(s,n),()=>{for(let e of c)e();s.remove(),i.remove();for(let e of n){let t=e.querySelector(`.bk-checklist-box`);if(!t)continue;let n=r.createElement(`span`);n.className=`bk-checklist-icon`,n.textContent=e.getAttribute(`data-checked`)===`true`?`✓`:`×`,t.replaceWith(n)}}}const c=`data-sort-label`,l=`data-sort-dir`,u=new Intl.Collator(void 0,{numeric:!0,sensitivity:`base`});function d(e){let t=e.getAttribute(c);if(t!==null)return t;let n=e.textContent?.trim()??``;return e.setAttribute(c,n),n}function f(e,t,n){for(let[r,i]of e.entries())i.textContent=d(i),r===t?(i.setAttribute(l,n),i.append(` ${n===`asc`?`▲`:`▼`}`)):i.removeAttribute(l)}function p(e,t){return e.querySelectorAll(`td`)[t]?.textContent?.trim()??``}function m(e){let t=Array.from(e.querySelectorAll(`thead th`)),n=e.querySelector(`tbody`);if(!n||t.length===0)return()=>{};let r=Array.from(n.querySelectorAll(`tr`)),i=e.parentElement,a=null,o=`asc`,s=``,m=null,h=[],g=()=>{let e=[...r];if(a!==null){let t=a;e.sort((e,n)=>{let r=u.compare(p(e,t),p(n,t));return o===`asc`?r:-r})}for(let t of e){n.appendChild(t);let e=t.textContent?.toLowerCase()??``;t.hidden=s.length>0&&!e.includes(s)}f(t,a,o)};for(let[e,n]of t.entries()){d(n);let t=()=>{a===e?o=o===`asc`?`desc`:`asc`:(a=e,o=`asc`),g()};n.style.cursor=`pointer`,n.addEventListener(`click`,t),h.push(()=>{n.removeEventListener(`click`,t)})}if(r.length>5&&i){m=i.ownerDocument.createElement(`input`),m.className=`bk-table-filter`,m.placeholder=`Filter...`;let t=()=>{s=m?.value.toLowerCase().trim()??``,g()};i.insertBefore(m,e),m.addEventListener(`input`,t),h.push(()=>{m?.removeEventListener(`input`,t),m?.remove(),m=null})}return g(),()=>{for(let e of h)e();for(let e of t)e.textContent=d(e),e.removeAttribute(l),e.removeAttribute(c),e.style.removeProperty(`cursor`);for(let e of r)e.hidden=!1}}function h(e){for(let t of Array.from(e.children))if(t.tagName===`SUMMARY`)return t;return null}function g(e){let t=e.closest(`details`);if(!t)return null;let n=t.parentElement;for(;n;){if(n.tagName===`DETAILS`)return h(n);n=n.parentElement}return null}function _(e){return Array.from(e.querySelectorAll(`summary`))}function v(e){return e.open||e.hasAttribute(`open`)}function y(e,t){e.open=t,t?e.setAttribute(`open`,``):e.removeAttribute(`open`)}function b(e,t){e.textContent=t.every(e=>v(e))?`Collapse all`:`Expand all`}function x(e){let t=Array.from(e.querySelectorAll(`details`));if(t.length===0)return()=>{};let n=e.ownerDocument.createElement(`button`);n.type=`button`,n.className=`bk-tree-toggle-all`,e.insertBefore(n,e.firstChild);let r=()=>{let e=t.some(e=>!v(e));for(let n of t)y(n,e);b(n,t)},i=()=>{r()};n.addEventListener(`click`,i);let a=t.map(e=>{let r=()=>{b(n,t)};return e.addEventListener(`toggle`,r),()=>{e.removeEventListener(`toggle`,r)}}),o=_(e).map(t=>{t.tabIndex=0;let n=n=>{let r=_(e),i=r.indexOf(t);if(i===-1)return;let a=t.closest(`details`);if(n.key===`ArrowDown`){r[i+1]?.focus(),n.preventDefault();return}if(n.key===`ArrowUp`){r[i-1]?.focus(),n.preventDefault();return}if(n.key===`ArrowRight`){if(a&&!v(a))y(a,!0);else{let e=r[i+1];e&&a?.contains(e)&&e.focus()}n.preventDefault();return}n.key===`ArrowLeft`&&(a&&v(a)?y(a,!1):g(t)?.focus(),n.preventDefault())};return t.addEventListener(`keydown`,n),()=>{t.removeEventListener(`keydown`,n)}});return b(n,t),()=>{n.removeEventListener(`click`,i);for(let e of a)e();for(let e of o)e();n.remove()}}const S=[{selector:`.bk-table`,matches:e=>!r(e.ownerDocument),load:async()=>({hydrate:e=>m(e)})},{selector:`.bk-table`,matches:(t,n)=>r(t.ownerDocument)&&e(t,`.bk-table`,n),load:()=>import(`./form-SyIoFeT1.mjs`).then(e=>({hydrate:(t,n)=>e.hydrateForm(t,n)}))},{selector:`.bk-tree`,matches:e=>!n(e.ownerDocument),load:async()=>({hydrate:e=>x(e)})},{selector:`.bk-tree`,matches:e=>n(e.ownerDocument),load:()=>import(`./flame-graph-CV8KCLKu.mjs`).then(e=>({hydrate:(t,n)=>e.hydrateFlameGraph(t,n)}))},{selector:`.bk-actions`,load:async()=>({hydrate:(e,t)=>t?.onAction?i(e,t.onAction):()=>{}})},{selector:`.bk-checklist`,load:async()=>({hydrate:(e,t)=>s(e,t)})},{selector:`.bk-cards`,matches:(n,r)=>t(n.ownerDocument)&&e(n,`.bk-cards`,r),load:()=>import(`./picker-CZJricO9.mjs`).then(e=>({hydrate:(t,n)=>e.hydratePicker(t,n)}))}],C=`data-hydrated`;function w(e,t){let n=[];return e.matches(t)&&n.push(e),n.push(...Array.from(e.querySelectorAll(t))),n}function T(e,t,n){e.push(()=>{n(),t.removeAttribute(C)})}function E(e={}){let t=e.container??document.body,n=[];for(let e of w(t,`.bk-table`))e.hasAttribute(C)||(e.setAttribute(C,``),T(n,e,m(e)));for(let e of w(t,`.bk-tree`))e.hasAttribute(C)||(e.setAttribute(C,``),T(n,e,x(e)));for(let r of w(t,`.bk-checklist`))r.hasAttribute(C)||(r.setAttribute(C,``),T(n,r,s(r,e)));for(let r of w(t,`.bk-actions`))if(!r.hasAttribute(C)){if(r.setAttribute(C,``),e.onAction){T(n,r,i(r,e.onAction));continue}n.push(()=>{r.removeAttribute(C)})}return()=>{for(let e of n)e();n.length=0}}async function D(e={}){let t=e.container??document.body,n={...e,container:t},r=[],i=S.map(e=>({definition:e,elements:w(t,e.selector).filter(t=>!t.hasAttribute(C)&&(e.matches?.(t,n)??!0))})).filter(({elements:e})=>e.length>0);if(i.length===0)return()=>{};let a=await Promise.all(i.map(async({definition:e,elements:t})=>({island:await e.load(),elements:t})));for(let{island:e,elements:t}of a)for(let i of t)i.hasAttribute(C)||(i.setAttribute(C,``),T(r,i,e.hydrate(i,n)));return()=>{for(let e of r)e();r.length=0}}export{S as ISLAND_REGISTRY,E as hydrate,i as hydrateActions,D as hydrateAsync,m as hydrateTable,x as hydrateTree};
15
+ `,t}function s(e,t){let n=t.filter(e=>e.getAttribute(`data-checked`)===`true`).length,r=t.length;return e.textContent=`${n}/${r} complete`,{complete:n,total:r}}function c(e,t={}){let n=Array.from(e.querySelectorAll(`.bk-checklist-item`));if(n.length===0)return()=>{};let r=e.ownerDocument,i=o(r),a=r.createElement(`div`);a.className=`bk-checklist-progress`,e.parentElement?.insertBefore(a,e),r.head?.appendChild(i);let c=[];for(let[e,i]of n.entries()){let o=i.querySelector(`.bk-checklist-icon`),l=i.querySelector(`.bk-checklist-label`)?.textContent?.trim()??``,u=r.createElement(`input`);u.type=`checkbox`,u.className=`bk-checklist-box`,u.checked=i.getAttribute(`data-checked`)===`true`;let d=()=>{i.setAttribute(`data-checked`,String(u.checked));let r=s(a,n);t.onAction?.(`checklist`,JSON.stringify({index:e,label:l,checked:u.checked,complete:r.complete,total:r.total}))};u.addEventListener(`change`,d),c.push(()=>{u.removeEventListener(`change`,d)}),o?o.replaceWith(u):i.insertBefore(u,i.firstChild)}return s(a,n),()=>{for(let e of c)e();a.remove(),i.remove();for(let e of n){let t=e.querySelector(`.bk-checklist-box`);if(!t)continue;let n=r.createElement(`span`);n.className=`bk-checklist-icon`,n.textContent=e.getAttribute(`data-checked`)===`true`?`✓`:`×`,t.replaceWith(n)}}}const l=`data-sort-label`,u=`data-sort-dir`,d=new Intl.Collator(void 0,{numeric:!0,sensitivity:`base`});function f(e){let t=e.getAttribute(l);if(t!==null)return t;let n=e.textContent?.trim()??``;return e.setAttribute(l,n),n}function p(e,t,n){for(let[r,i]of e.entries())i.textContent=f(i),r===t?(i.setAttribute(u,n),i.append(` ${n===`asc`?`▲`:`▼`}`)):i.removeAttribute(u)}function m(e,t){return e.querySelectorAll(`td`)[t]?.textContent?.trim()??``}function h(e){let t=Array.from(e.querySelectorAll(`thead th`)),n=e.querySelector(`tbody`);if(!n||t.length===0)return()=>{};let r=Array.from(n.querySelectorAll(`tr`)),i=e.parentElement,a=null,o=`asc`,s=``,c=null,h=[],g=()=>{let e=[...r];if(a!==null){let t=a;e.sort((e,n)=>{let r=d.compare(m(e,t),m(n,t));return o===`asc`?r:-r})}for(let t of e){n.appendChild(t);let e=t.textContent?.toLowerCase()??``;t.hidden=s.length>0&&!e.includes(s)}p(t,a,o)};for(let[e,n]of t.entries()){f(n);let t=()=>{a===e?o=o===`asc`?`desc`:`asc`:(a=e,o=`asc`),g()};n.style.cursor=`pointer`,n.addEventListener(`click`,t),h.push(()=>{n.removeEventListener(`click`,t)})}if(r.length>5&&i){c=i.ownerDocument.createElement(`input`),c.className=`bk-table-filter`,c.placeholder=`Filter...`;let t=()=>{s=c?.value.toLowerCase().trim()??``,g()};i.insertBefore(c,e),c.addEventListener(`input`,t),h.push(()=>{c?.removeEventListener(`input`,t),c?.remove(),c=null})}return g(),()=>{for(let e of h)e();for(let e of t)e.textContent=f(e),e.removeAttribute(u),e.removeAttribute(l),e.style.removeProperty(`cursor`);for(let e of r)e.hidden=!1}}function g(e){for(let t of Array.from(e.children))if(t.tagName===`SUMMARY`)return t;return null}function _(e){let t=e.closest(`details`);if(!t)return null;let n=t.parentElement;for(;n;){if(n.tagName===`DETAILS`)return g(n);n=n.parentElement}return null}function v(e){return Array.from(e.querySelectorAll(`summary`))}function y(e){return e.open||e.hasAttribute(`open`)}function b(e,t){e.open=t,t?e.setAttribute(`open`,``):e.removeAttribute(`open`)}function x(e,t){e.textContent=t.every(e=>y(e))?`Collapse all`:`Expand all`}function S(e){let t=Array.from(e.querySelectorAll(`details`));if(t.length===0)return()=>{};let n=e.ownerDocument.createElement(`button`);n.type=`button`,n.className=`bk-tree-toggle-all`,e.insertBefore(n,e.firstChild);let r=()=>{let e=t.some(e=>!y(e));for(let n of t)b(n,e);x(n,t)},i=()=>{r()};n.addEventListener(`click`,i);let a=t.map(e=>{let r=()=>{x(n,t)};return e.addEventListener(`toggle`,r),()=>{e.removeEventListener(`toggle`,r)}}),o=v(e).map(t=>{t.tabIndex=0;let n=n=>{let r=v(e),i=r.indexOf(t);if(i===-1)return;let a=t.closest(`details`);if(n.key===`ArrowDown`){r[i+1]?.focus(),n.preventDefault();return}if(n.key===`ArrowUp`){r[i-1]?.focus(),n.preventDefault();return}if(n.key===`ArrowRight`){if(a&&!y(a))b(a,!0);else{let e=r[i+1];e&&a?.contains(e)&&e.focus()}n.preventDefault();return}n.key===`ArrowLeft`&&(a&&y(a)?b(a,!1):_(t)?.focus(),n.preventDefault())};return t.addEventListener(`keydown`,n),()=>{t.removeEventListener(`keydown`,n)}});return x(n,t),()=>{n.removeEventListener(`click`,i);for(let e of a)e();for(let e of o)e();n.remove()}}const C=[{selector:`.bk-table`,matches:e=>!r(e.ownerDocument),load:async()=>({hydrate:e=>h(e)})},{selector:`.bk-table`,matches:(t,n)=>r(t.ownerDocument)&&e(t,`.bk-table`,n),load:()=>import(`./form-SyIoFeT1.mjs`).then(e=>({hydrate:(t,n)=>e.hydrateForm(t,n)}))},{selector:`.bk-tree`,matches:e=>!n(e.ownerDocument),load:async()=>({hydrate:e=>S(e)})},{selector:`.bk-tree`,matches:e=>n(e.ownerDocument),load:()=>import(`./flame-graph-CV8KCLKu.mjs`).then(e=>({hydrate:(t,n)=>e.hydrateFlameGraph(t,n)}))},{selector:`.bk-actions`,load:async()=>({hydrate:(e,t)=>t?.onAction?a(e,t.onAction):()=>{}})},{selector:`.bk-checklist`,load:async()=>({hydrate:(e,t)=>c(e,t)})},{selector:`.bk-cards`,matches:(n,r)=>t(n.ownerDocument)&&e(n,`.bk-cards`,r),load:()=>import(`./picker-CZJricO9.mjs`).then(e=>({hydrate:(t,n)=>e.hydratePicker(t,n)}))}],w=`data-hydrated`;function T(e,t){let n=[];return e.matches(t)&&n.push(e),n.push(...Array.from(e.querySelectorAll(t))),n}function E(e,t,n){e.push(()=>{n(),t.removeAttribute(w)})}function D(e={}){let t=e.container??document.body,n=[];for(let e of T(t,`.bk-table`))e.hasAttribute(w)||(e.setAttribute(w,``),E(n,e,h(e)));for(let e of T(t,`.bk-tree`))e.hasAttribute(w)||(e.setAttribute(w,``),E(n,e,S(e)));for(let r of T(t,`.bk-checklist`))r.hasAttribute(w)||(r.setAttribute(w,``),E(n,r,c(r,e)));for(let r of T(t,`.bk-actions`))if(!r.hasAttribute(w)){if(r.setAttribute(w,``),e.onAction){E(n,r,a(r,e.onAction));continue}n.push(()=>{r.removeAttribute(w)})}return()=>{for(let e of n)e();n.length=0}}async function O(e={}){let t=e.container??document.body,n={...e,container:t},r=[],i=C.map(e=>({definition:e,elements:T(t,e.selector).filter(t=>!t.hasAttribute(w)&&(e.matches?.(t,n)??!0))})).filter(({elements:e})=>e.length>0);if(i.length===0)return()=>{};let a=await Promise.all(i.map(async({definition:e,elements:t})=>({island:await e.load(),elements:t})));for(let{island:e,elements:t}of a)for(let i of t)i.hasAttribute(w)||(i.setAttribute(w,``),E(r,i,e.hydrate(i,n)));return()=>{for(let e of r)e();r.length=0}}export{C as ISLAND_REGISTRY,D as hydrate,a as hydrateActions,O as hydrateAsync,h as hydrateTable,S as hydrateTree};
@@ -1,13 +1,14 @@
1
- import{createRequire as e}from"node:module";import{createHash as t,randomUUID as n}from"node:crypto";import{homedir as r}from"node:os";import{join as i}from"node:path";import{execFileSync as a}from"node:child_process";import{existsSync as o,readdirSync as s}from"node:fs";import{Buffer as c}from"node:buffer";import{z as l}from"zod";import u from"node:dns/promises";var d=class{#e;#t;#n=0;#r=0;constructor(e=200){if(!Number.isInteger(e)||e<1)throw RangeError(`CircularBuffer capacity must be a positive integer.`);this.#e=e,this.#t=Array(e)}push(e){this.#t[this.#n]=e,this.#n=(this.#n+1)%this.#e,this.#r<this.#e&&(this.#r+=1)}toArray(){if(this.#r===0)return[];let e=(this.#n-this.#r+this.#e)%this.#e,t=[];for(let n=0;n<this.#r;n+=1)t.push(this.#t[(e+n)%this.#e]);return t}clear(){this.#t=Array(this.#e),this.#n=0,this.#r=0}get size(){return this.#r}get capacity(){return this.#e}isEmpty(){return this.#r===0}};const f=[`xhr`,`fetch`,`websocket`,`document`],p=[/^authorization$/i,/^cookie$/i,/^set-cookie$/i,/^x-api-key$/i,/^x-access-token$/i,/^x-auth-token$/i,/^x-session$/i,/^x-secret$/i,/^x-password$/i,/^proxy-authorization$/i,/^www-authenticate$/i,/^x-csrf-token$/i,/^x-xsrf-token$/i];function m(e,t){if(t?.showSensitive)return{...e};let n=[...p,...t?.additionalPatterns??[]],r={};for(let[t,i]of Object.entries(e))r[t]=n.some(e=>e.test(t))?`[REDACTED]`:i;return r}function h(e,t=512){if(e)return e.length<=t?e:`${e.slice(0,t)}...[truncated]`}function ee(){return{networkBuffer:new d(200),consoleBuffer:new d(1e3),networkEnabled:!1,consoleEnabled:!1,networkFilter:{},nextRequestSequence:0,pendingRequests:new Map}}function g(e,t){if(e.capacity===t)return e;let n=new d(t),r=e.toArray(),i=Math.max(0,r.length-t);for(let e of r.slice(i))n.push(e);return n}function te(e){switch(e){case`error`:case`info`:case`log`:case`debug`:return e;case`warning`:return`warn`;default:return`log`}}function ne(e){if(e)return Buffer.byteLength(e)<=5242880?h(e):void 0}function re(e){if(!e)return{};let t=Buffer.byteLength(e);return{bodySize:t,bodyPreview:t<=5242880?h(e):void 0}}function ie(e,t){return!t.resourceTypes.has(e.resourceType)||t.urlPattern&&!t.urlPattern.test(e.url)?!1:!t.excludeUrls.some(t=>t.test(e.url))}function ae(e){if(e.length>200)throw Error(`Network filter regex patterns must be 200 characters or fewer`);try{let t=new RegExp(e);return t.test(`a`.repeat(100)),t}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Invalid network filter regex pattern: ${t}`)}}function oe(e={}){return{resourceTypes:new Set(e.resourceTypes??f),urlPattern:e.urlPattern?ae(e.urlPattern):void 0,excludeUrls:(e.excludeUrls??[]).map(e=>ae(e))}}function se(e){return e.nextRequestSequence+=1,`req-${e.nextRequestSequence}`}function ce(e,t,n){let r={request:t,previous:e.pendingRequestTail};e.pendingRequestTail?e.pendingRequestTail.next=r:e.pendingRequestHead=r,e.pendingRequestTail=r,e.pendingRequests.set(t,{entry:n,node:r})}function le(e,t){t.previous?t.previous.next=t.next:e.pendingRequestHead=t.next,t.next?t.next.previous=t.previous:e.pendingRequestTail=t.previous,delete t.previous,delete t.next}function ue(e){for(;e.pendingRequests.size>e.networkBuffer.capacity;){let t=e.pendingRequestHead;if(!t)return;le(e,t),e.pendingRequests.delete(t.request)}}function _(e){e.pendingRequests.clear(),e.pendingRequestHead=void 0,e.pendingRequestTail=void 0}var de=class{states=new Map;getOrCreate(e){let t=this.states.get(e);if(t)return t;let n=ee();return this.states.set(e,n),n}get(e){return this.states.get(e)}remove(e){let t=this.states.get(e);t&&(t.networkEnabled=!1,t.consoleEnabled=!1,this.detachNetworkListeners(t),this.detachConsoleListeners(t),_(t),this.states.delete(e))}clear(){for(let e of this.states.values())e.networkEnabled=!1,e.consoleEnabled=!1,this.detachNetworkListeners(e),this.detachConsoleListeners(e),_(e);this.states.clear()}enableNetwork(e,t,n,r){let i=this.getOrCreate(e);i.networkEnabled&&this.disableNetwork(e,t),i.page=t,i.networkEnabled=!0,i.networkFilter=n?{...n}:{},i.compiledNetworkFilter=oe(i.networkFilter),r?.bufferSize&&(i.networkBuffer=g(i.networkBuffer,r.bufferSize));let a=e=>{let t=i.compiledNetworkFilter??oe(i.networkFilter),n={resourceType:e.resourceType(),url:e.url()};if(!ie(n,t))return;let a={...e.headers()},o=Date.now(),s={id:se(i),url:n.url,method:e.method(),resourceType:n.resourceType,headers:r?.showSensitive?a:m(a),postData:r?.includeBody?ne(e.postData()??void 0):void 0,timestamp:o};i.networkBuffer.push(s),ce(i,e,s),ue(i)},o=async e=>{let t=e.request(),n=i.pendingRequests.get(t);if(!n)return;i.pendingRequests.delete(t),le(i,n.node);let a;if(r?.includeBody)try{a=re(await e.text())}catch{a=void 0}let o={...e.headers()};n.entry.response={status:e.status(),statusText:e.statusText(),headers:r?.showSensitive?o:m(o),bodySize:a?.bodySize,bodyPreview:a?.bodyPreview,timing:Date.now()-n.entry.timestamp}};i.listenerRefs={...i.listenerRefs,requestHandler:a,responseHandler:o},this.ensurePageCloseHandler(e,i,t),t.on(`request`,a),t.on(`response`,o)}disableNetwork(e,t){let n=this.states.get(e);n&&(n.page=n.page??t,n.networkEnabled=!1,this.detachNetworkListeners(n),_(n))}enableConsole(e,t,n){let r=this.getOrCreate(e);r.consoleEnabled&&this.disableConsole(e,t),r.page=t,r.consoleEnabled=!0,n?.bufferSize&&(r.consoleBuffer=g(r.consoleBuffer,n.bufferSize));let i=e=>{let t=e.location();r.consoleBuffer.push({level:te(e.type()),text:e.text(),timestamp:Date.now(),location:t.url?{url:t.url,line:t.lineNumber,column:t.columnNumber}:void 0,args:e.args().map(e=>e.toString())})};r.listenerRefs={...r.listenerRefs,consoleHandler:i},this.ensurePageCloseHandler(e,r,t),t.on(`console`,i)}disableConsole(e,t){let n=this.states.get(e);n&&(n.page=n.page??t,n.consoleEnabled=!1,this.detachConsoleListeners(n))}detachNetworkListeners(e){let t=e.page,n=e.listenerRefs?.requestHandler,r=e.listenerRefs?.responseHandler;t&&n&&t.off(`request`,n),t&&r&&t.off(`response`,r),e.listenerRefs&&(delete e.listenerRefs.requestHandler,delete e.listenerRefs.responseHandler),this.detachPageCloseHandlerIfUnused(e)}detachConsoleListeners(e){let t=e.page,n=e.listenerRefs?.consoleHandler;t&&n&&t.off(`console`,n),e.listenerRefs&&delete e.listenerRefs.consoleHandler,this.detachPageCloseHandlerIfUnused(e)}ensurePageCloseHandler(e,t,n){if(t.listenerRefs?.pageCloseHandler)return;let r=()=>{this.remove(e)};t.listenerRefs={...t.listenerRefs,pageCloseHandler:r},n.on(`close`,r)}detachPageCloseHandlerIfUnused(e){if(e.networkEnabled||e.consoleEnabled)return;let t=e.page,n=e.listenerRefs?.pageCloseHandler;t&&n&&t.off(`close`,n),e.listenerRefs&&delete e.listenerRefs.pageCloseHandler,e.listenerRefs&&!e.listenerRefs.requestHandler&&!e.listenerRefs.responseHandler&&!e.listenerRefs.consoleHandler&&!e.listenerRefs.pageCloseHandler&&delete e.listenerRefs}};let v=null;function y(){return v||=new de,v}const fe=e(import.meta.url);function b(e){return typeof e==`string`?e.trim():e instanceof Buffer?e.toString(`utf8`).trim():``}function x(e){process.env.PLAYWRIGHT_BROWSERS_PATH=e}async function S(e){x(e);let{chromium:t}=await import(`playwright-core`),n=t.executablePath();if(!n)throw Error(`Chromium executable not found in ${e}`);return n}function C(){return i(r(),`.aikit`,`browsers`)}function w(e){return e.browsersPath??process.env.PLAYWRIGHT_BROWSERS_PATH??C()}function pe(e){return o(e)?s(e,{withFileTypes:!0}).some(e=>e.isDirectory()&&e.name.toLowerCase().startsWith(`chromium-`)):!1}async function me(e,t){let n=w(e);if(x(n),t?.(`Using Chromium cache at ${n}`),pe(n))return t?.(`Chromium already installed`),S(n);let r=i(fe.resolve(`playwright-core`),`..`,`cli.js`);t?.(`Installing Chromium via playwright-core`);try{a(process.execPath,[r,`install`,`chromium`],{env:{...process.env,PLAYWRIGHT_BROWSERS_PATH:n},encoding:`utf8`,stdio:`pipe`})}catch(e){let t=e,n=b(t.stderr),r=b(t.stdout),i=n||r||t.message||`Unknown playwright install failure`;throw Error(`Failed to install Chromium: ${i}`)}return t?.(`Chromium install complete`),S(n)}function he(){return process.platform===`win32`||process.platform===`darwin`?!0:!!(process.env.DISPLAY||process.env.WAYLAND_DISPLAY)}function ge(e){return e===`headless`||!he()?`headless`:e}function T(e){switch(e){case`headless`:return{headless:!0,args:[]};default:return{headless:!1,args:[]}}}var E=class{pages=new Map;registerPage(e,t,r,i){let a=n();return this.pages.set(a,{page:e,url:t,title:r,label:i,createdAt:new Date}),a}getPageByLabel(e){for(let t of this.pages.values())if(t.label===e)return t.page;throw Error(`Page not found: ${e}`)}resolvePageId(e){if(this.pages.has(e))return e;for(let[t,n]of this.pages.entries())if(n.label===e)return t;throw Error(`Page not found: ${e}`)}getPage(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return t.page}getPageInfo(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return{pageId:e,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}}setSnapshot(e,t){let n=this.pages.get(e);if(!n)throw Error(`Page not found: ${e}`);this.pages.set(e,{...n,lastSnapshot:t})}getSnapshot(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return t.lastSnapshot}updatePageInfo(e,t,n){let r=this.pages.get(e);if(!r)throw Error(`Page not found: ${e}`);this.pages.set(e,{...r,url:t,title:n})}async removePage(e){let t=this.pages.get(e);t&&(await t.page.close(),this.pages.delete(e))}listPages(){return[...this.pages.entries()].map(([e,t])=>({pageId:e,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}))}async closeAll(){await Promise.allSettled([...this.pages.keys()].map(async e=>this.removePage(e)))}get size(){return this.pages.size}};const D={defaultMode:`ui`,browsersPath:null,userDataDirRoot:null,idleShutdownMinutes:10,allowInternalSchemes:!1,evalTimeoutMs:1e4,evalMaxResultBytes:262144,redactPasswordFieldsInScreenshots:!0};var O=class{browser=null;context=null;idleTimer=null;launchPromise=null;currentMode=null;session=new E;config;constructor(e={}){this.config={...D,...e}}async launch(e,t){let n=ge(e??this.config.defaultMode);if(this.context&&this.currentMode!==n)if(this.currentMode===`headless`&&n===`ui`)await this.close();else return;if(!this.context){if(this.launchPromise)return this.launchPromise;this.launchPromise=this.doLaunch(n,t);try{await this.launchPromise}finally{this.launchPromise=null}}}async doLaunch(e,n){if(this.browser&&this.context)return;let a=w(this.config);process.env.PLAYWRIGHT_BROWSERS_PATH=a;let{chromium:o}=await import(`playwright-core`),s=await me(this.config,n),c=T(e),l=t(`sha256`).update(process.cwd()).digest(`hex`).slice(0,12),u=i(this.config.userDataDirRoot??i(r(),`.aikit`,`profiles`),l);if(n?.(`Launching Chromium in ${e} mode`),this.context=await o.launchPersistentContext(u,{headless:c.headless,args:c.args,executablePath:s,viewport:null}),this.browser=this.context.browser(),!this.browser)throw await this.context.close(),this.context=null,Error(`Failed to acquire Chromium browser instance`);this.currentMode=e,this.browser.on(`disconnected`,()=>{this.browser=null,this.context=null,this.currentMode=null,y().clear(),this.session.closeAll().catch(()=>{}),this.stopIdleTimer()}),this.resetIdleTimer()}stopIdleTimer(){this.idleTimer&&=(clearTimeout(this.idleTimer),null)}resetIdleTimer(){this.stopIdleTimer();let e=setTimeout(()=>{this.close()},this.config.idleShutdownMinutes*6e4);e.unref?.(),this.idleTimer=e}async close(){this.stopIdleTimer(),this.launchPromise=null;let e=this.context,t=this.browser;this.context=null,this.browser=null,this.currentMode=null;let n;try{y().clear()}catch(e){n=e}try{await this.session.closeAll()}catch(e){n??=e}try{e&&await e.close()}catch(e){n??=e}finally{try{t&&await t.close()}catch(e){n??=e}}if(n)throw n}getContext(){if(!this.context)throw Error(`Browser not launched. Call launch() first.`);return this.context}getConfig(){return this.config}isLaunched(){return this.browser!==null}};let k=null;function A(e){return k||=new O(e),k}async function _e(){k&&=(await k.close(),null)}const ve=[`file:`,`chrome:`,`chrome-extension:`,`data:`,`javascript:`],ye=[`169.254.169.254`,`metadata.google.internal`,`metadata.google.com`],j=[`localhost`,`127.0.0.1`,`::1`,`[::1]`];function be(e){return e.replace(/^\[(.*)\]$/,`$1`).toLowerCase()}function xe(e){let t=new WeakSet,n=JSON.stringify(e,(e,n)=>{if(typeof n==`bigint`)return n.toString();if(typeof n==`function`)return`[Function ${n.name||`anonymous`}]`;if(typeof n==`symbol`)return n.toString();if(n instanceof Error)return{name:n.name,message:n.message,stack:n.stack};if(typeof n==`object`&&n){if(t.has(n))return`[Circular]`;t.add(n)}return n});return n===void 0?e===void 0?`undefined`:String(e):n}function Se(e,t){let n=c.from(e,`utf8`);return n.byteLength<=t?e:n.subarray(0,t).toString(`utf8`)}function M(e,t){let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`Invalid URL: ${e}`}}let r=n.protocol.toLowerCase();if(ve.includes(r)&&!t.allowInternalSchemes)return{allowed:!1,reason:`Blocked URL scheme: ${r}`};let i=be(n.hostname);return ye.includes(i)?{allowed:!1,reason:`Blocked host: ${n.hostname}`}:j.includes(i)||j.includes(n.hostname)?t.allowLoopback?{allowed:!0}:{allowed:!1,reason:`Loopback addresses are blocked by default. Set allowLoopback: true to enable.`}:{allowed:!0}}function N(e){return e?{allowed:!0}:{allowed:!1,reason:`Cookie access requires explicit confirmation (confirm: true)`}}function P(e,t){if(t<=0)return{valid:!1,reason:`maxBytes must be greater than 0`};try{let n=xe(e);return c.byteLength(n,`utf8`)<=t?{valid:!0,result:n,truncated:!1}:{valid:!0,result:`${Se(n,Math.max(t-3,0))}...`,truncated:!0,reason:`Result exceeded ${t} bytes and was truncated`}}catch(e){return{valid:!1,reason:`Unable to serialize eval result: ${e instanceof Error?e.message:String(e)}`}}}function Ce(e){return e.replace(/<input\b[^>]*>/gi,e=>/\btype\s*=\s*(["'])password\1/i.test(e)?/\bvalue\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/i.test(e)?e.replace(/\bvalue\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/i,`value="***"`):e.replace(/\s*\/?>$/,e=>` value="***"${e}`):e)}const we=[`ui`,`headless`];function Te(e){return typeof e==`object`&&e?e:null}function F(e){return typeof e==`string`&&e.length>0?e:void 0}function I(e){return typeof e==`boolean`?e:void 0}function L(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function R(e){return typeof e==`string`&&we.includes(e)?e:void 0}function z(e){let t=process.env[e];if(!t)return;let n=Number(t);return Number.isFinite(n)?n:void 0}function Ee(e){let t=Te(e.browser)??{};return{...D,defaultMode:R(process.env.AIKIT_BROWSER_DEFAULT_MODE)??R(t.defaultMode)??D.defaultMode,browsersPath:F(process.env.AIKIT_BROWSER_PATH)??F(process.env.AIKIT_BROWSER_BROWSERS_PATH)??F(t.browsersPath)??D.browsersPath,userDataDirRoot:F(t.userDataDirRoot)??D.userDataDirRoot,idleShutdownMinutes:z(`AIKIT_BROWSER_IDLE_MINUTES`)??L(t.idleShutdownMinutes)??D.idleShutdownMinutes,allowInternalSchemes:I(t.allowInternalSchemes)??D.allowInternalSchemes,allowLoopback:I(t.allowLoopback)??D.allowLoopback,evalTimeoutMs:z(`AIKIT_BROWSER_EVAL_TIMEOUT_MS`)??L(t.evalTimeoutMs)??D.evalTimeoutMs,evalMaxResultBytes:L(t.evalMaxResultBytes)??D.evalMaxResultBytes,redactPasswordFieldsInScreenshots:I(t.redactPasswordFieldsInScreenshots)??D.redactPasswordFieldsInScreenshots}}function B(e,t){return{content:[{type:`text`,text:e}],structuredContent:t}}function V(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}async function De(e,t,n){let r=null;try{return await Promise.race([e,new Promise((e,i)=>{r=setTimeout(()=>{i(Error(`${n} timed out after ${t}ms`))},t)})])}finally{r&&clearTimeout(r)}}l.string().describe(`Tracked browser page identifier`),l.enum([`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`]).describe(`Interaction kind: click, type, press, hover, drag, select, scroll, upload`),l.string().optional().describe(`Target ref alias`),l.string().optional().describe(`Playwright selector`),l.string().optional().describe(`Human-readable element label`),l.string().optional().describe(`Text to type`),l.string().optional().describe(`Key to press`),l.string().optional().describe(`Option value, drag target, scroll spec, or file path(s)`),l.string().optional().describe(`Drag source ref`),l.string().optional().describe(`Drag source selector`),l.string().optional().describe(`Drag target ref`),l.string().optional().describe(`Drag target selector`);function Oe(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=A(e),m=p.session.getPage(t);switch(n){case`click`:{let e=V({ref:r,selector:i,element:a},`browser_act(click)`);await m.click(e);break}case`type`:{let e=V({ref:r,selector:i,element:a},`browser_act(type)`);await m.fill(e,o??``);break}case`press`:{let e=V({ref:r,selector:i,element:a},`browser_act(press)`);if(!s)throw Error(`browser_act(press) requires key`);await m.press(e,s);break}case`hover`:{let e=V({ref:r,selector:i,element:a},`browser_act(hover)`);await m.hover(e);break}case`drag`:{let e=V({ref:l??r,selector:u??i,element:a},`browser_act(drag) source`),t=V({ref:d,selector:f??c,element:a},`browser_act(drag) target`);await m.dragAndDrop(e,t);break}case`select`:{let e=V({ref:r,selector:i,element:a},`browser_act(select)`);if(c===void 0)throw Error(`browser_act(select) requires value`);await m.selectOption(e,c);break}case`scroll`:{if(i||r||a){let e=V({ref:r,selector:i,element:a},`browser_act(scroll)`);await m.locator(e).scrollIntoViewIfNeeded();break}let e=c??`down 500`;await m.evaluate(e=>{if(e===`bottom`){window.scrollTo(0,document.body.scrollHeight);return}if(e===`top`){window.scrollTo(0,0);return}let t=e.split(` `),n=t[0]||`down`,r=Number.parseInt(t[1]||`500`,10),i=n===`left`?-r:n===`right`?r:0,a=n===`up`?-r:n===`down`?r:0;window.scrollBy(i,a)},e);break}case`upload`:{let e=V({ref:r,selector:i,element:a},`browser_act(upload)`);if(!c)throw Error(`value (file path or JSON array of paths) required for upload`);let t;try{let e=JSON.parse(c);t=Array.isArray(e)?e:[c]}catch{t=[c]}await m.locator(e).setInputFiles(t);break}}return p.resetIdleTimer(),B(`ok`,{ok:!0})}}function ke(e,t){return t?e.filter(e=>e.level===t):e}function Ae(e){return e.map(e=>{let t=e.location?` (${e.location.url}:${e.location.line})`:``;return`[${e.level.toUpperCase()}] ${e.text}${t}`}).join(`
2
- `)}async function je(e,t){let n=y();switch(t.subAction){case`enable`:return n.enableConsole(t.pageId,e,{bufferSize:t.bufferSize}),B(`Console capture enabled for page ${t.pageId}`,{enabled:!0,bufferSize:t.bufferSize??1e3});case`get`:{let e=n.get(t.pageId);if(!e?.consoleEnabled)return B(`Console capture not enabled. Call with subAction: "enable" first.`,{enabled:!1,entries:[]});let r=ke(e.consoleBuffer.toArray(),t.level);return B(Ae(r)||`No console messages captured yet.`,{enabled:!0,count:r.length,entries:r})}case`clear`:{let e=n.get(t.pageId);return e&&e.consoleBuffer.clear(),B(`Console buffer cleared.`,{cleared:!0})}}}function Me(e){return async t=>{let n=A(e),r=await je(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}l.string().describe(`Tracked browser page identifier`),l.boolean().describe(`Whether to accept the next dialog`),l.string().optional().describe(`Text to provide when accepting a prompt dialog`);function Ne(e){return async({pageId:t,accept:n,promptText:r})=>{let i=A(e);return i.session.getPage(t).once(`dialog`,async e=>{n?await e.accept(r):await e.dismiss()}),i.resetIdleTimer(),B(`ok`,{ok:!0})}}function Pe(e){return async({pageId:t})=>{let n=A(e),r=await n.session.getPage(t).accessibility.snapshot()??{},i=JSON.stringify(r,null,2),a=n.session.getSnapshot(t);if(n.session.setSnapshot(t,i),n.resetIdleTimer(),!a)return B(`First snapshot captured (no previous to diff against).\n${i}`,{pageId:t,hasChanges:!1,isFirst:!0,snapshot:r});if(a===i)return B(`No changes detected.`,{pageId:t,hasChanges:!1});let o=a.split(`
1
+ import{createRequire as e}from"node:module";import{createHash as t,randomUUID as n}from"node:crypto";import{homedir as r,platform as i}from"node:os";import{join as a}from"node:path";import{execFileSync as o}from"node:child_process";import{existsSync as s,readdirSync as c}from"node:fs";import{Buffer as l}from"node:buffer";import{z as u}from"zod";import d from"node:dns/promises";var f=class{#e;#t;#n=0;#r=0;constructor(e=200){if(!Number.isInteger(e)||e<1)throw RangeError(`CircularBuffer capacity must be a positive integer.`);this.#e=e,this.#t=Array(e)}push(e){this.#t[this.#n]=e,this.#n=(this.#n+1)%this.#e,this.#r<this.#e&&(this.#r+=1)}toArray(){if(this.#r===0)return[];let e=(this.#n-this.#r+this.#e)%this.#e,t=[];for(let n=0;n<this.#r;n+=1)t.push(this.#t[(e+n)%this.#e]);return t}clear(){this.#t=Array(this.#e),this.#n=0,this.#r=0}get size(){return this.#r}get capacity(){return this.#e}isEmpty(){return this.#r===0}};const p=[`xhr`,`fetch`,`websocket`,`document`],m=[/^authorization$/i,/^cookie$/i,/^set-cookie$/i,/^x-api-key$/i,/^x-access-token$/i,/^x-auth-token$/i,/^x-session$/i,/^x-secret$/i,/^x-password$/i,/^proxy-authorization$/i,/^www-authenticate$/i,/^x-csrf-token$/i,/^x-xsrf-token$/i];function h(e,t){if(t?.showSensitive)return{...e};let n=[...m,...t?.additionalPatterns??[]],r={};for(let[t,i]of Object.entries(e))r[t]=n.some(e=>e.test(t))?`[REDACTED]`:i;return r}function g(e,t=512){if(e)return e.length<=t?e:`${e.slice(0,t)}...[truncated]`}function ee(){return{networkBuffer:new f(200),consoleBuffer:new f(1e3),networkEnabled:!1,consoleEnabled:!1,networkFilter:{},nextRequestSequence:0,pendingRequests:new Map}}function _(e,t){if(e.capacity===t)return e;let n=new f(t),r=e.toArray(),i=Math.max(0,r.length-t);for(let e of r.slice(i))n.push(e);return n}function te(e){switch(e){case`error`:case`info`:case`log`:case`debug`:return e;case`warning`:return`warn`;default:return`log`}}function ne(e){if(e)return Buffer.byteLength(e)<=5242880?g(e):void 0}function re(e){if(!e)return{};let t=Buffer.byteLength(e);return{bodySize:t,bodyPreview:t<=5242880?g(e):void 0}}function ie(e,t){return!t.resourceTypes.has(e.resourceType)||t.urlPattern&&!t.urlPattern.test(e.url)?!1:!t.excludeUrls.some(t=>t.test(e.url))}function ae(e){if(e.length>200)throw Error(`Network filter regex patterns must be 200 characters or fewer`);try{let t=new RegExp(e);return t.test(`a`.repeat(100)),t}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Invalid network filter regex pattern: ${t}`)}}function oe(e={}){return{resourceTypes:new Set(e.resourceTypes??p),urlPattern:e.urlPattern?ae(e.urlPattern):void 0,excludeUrls:(e.excludeUrls??[]).map(e=>ae(e))}}function se(e){return e.nextRequestSequence+=1,`req-${e.nextRequestSequence}`}function ce(e,t,n){let r={request:t,previous:e.pendingRequestTail};e.pendingRequestTail?e.pendingRequestTail.next=r:e.pendingRequestHead=r,e.pendingRequestTail=r,e.pendingRequests.set(t,{entry:n,node:r})}function le(e,t){t.previous?t.previous.next=t.next:e.pendingRequestHead=t.next,t.next?t.next.previous=t.previous:e.pendingRequestTail=t.previous,delete t.previous,delete t.next}function ue(e){for(;e.pendingRequests.size>e.networkBuffer.capacity;){let t=e.pendingRequestHead;if(!t)return;le(e,t),e.pendingRequests.delete(t.request)}}function v(e){e.pendingRequests.clear(),e.pendingRequestHead=void 0,e.pendingRequestTail=void 0}var de=class{states=new Map;getOrCreate(e){let t=this.states.get(e);if(t)return t;let n=ee();return this.states.set(e,n),n}get(e){return this.states.get(e)}remove(e){let t=this.states.get(e);t&&(t.networkEnabled=!1,t.consoleEnabled=!1,this.detachNetworkListeners(t),this.detachConsoleListeners(t),v(t),this.states.delete(e))}clear(){for(let e of this.states.values())e.networkEnabled=!1,e.consoleEnabled=!1,this.detachNetworkListeners(e),this.detachConsoleListeners(e),v(e);this.states.clear()}enableNetwork(e,t,n,r){let i=this.getOrCreate(e);i.networkEnabled&&this.disableNetwork(e,t),i.page=t,i.networkEnabled=!0,i.networkFilter=n?{...n}:{},i.compiledNetworkFilter=oe(i.networkFilter),r?.bufferSize&&(i.networkBuffer=_(i.networkBuffer,r.bufferSize));let a=e=>{let t=i.compiledNetworkFilter??oe(i.networkFilter),n={resourceType:e.resourceType(),url:e.url()};if(!ie(n,t))return;let a={...e.headers()},o=Date.now(),s={id:se(i),url:n.url,method:e.method(),resourceType:n.resourceType,headers:r?.showSensitive?a:h(a),postData:r?.includeBody?ne(e.postData()??void 0):void 0,timestamp:o};i.networkBuffer.push(s),ce(i,e,s),ue(i)},o=async e=>{let t=e.request(),n=i.pendingRequests.get(t);if(!n)return;i.pendingRequests.delete(t),le(i,n.node);let a;if(r?.includeBody)try{a=re(await e.text())}catch{a=void 0}let o={...e.headers()};n.entry.response={status:e.status(),statusText:e.statusText(),headers:r?.showSensitive?o:h(o),bodySize:a?.bodySize,bodyPreview:a?.bodyPreview,timing:Date.now()-n.entry.timestamp}};i.listenerRefs={...i.listenerRefs,requestHandler:a,responseHandler:o},this.ensurePageCloseHandler(e,i,t),t.on(`request`,a),t.on(`response`,o)}disableNetwork(e,t){let n=this.states.get(e);n&&(n.page=n.page??t,n.networkEnabled=!1,this.detachNetworkListeners(n),v(n))}enableConsole(e,t,n){let r=this.getOrCreate(e);r.consoleEnabled&&this.disableConsole(e,t),r.page=t,r.consoleEnabled=!0,n?.bufferSize&&(r.consoleBuffer=_(r.consoleBuffer,n.bufferSize));let i=e=>{let t=e.location();r.consoleBuffer.push({level:te(e.type()),text:e.text(),timestamp:Date.now(),location:t.url?{url:t.url,line:t.lineNumber,column:t.columnNumber}:void 0,args:e.args().map(e=>e.toString())})};r.listenerRefs={...r.listenerRefs,consoleHandler:i},this.ensurePageCloseHandler(e,r,t),t.on(`console`,i)}disableConsole(e,t){let n=this.states.get(e);n&&(n.page=n.page??t,n.consoleEnabled=!1,this.detachConsoleListeners(n))}detachNetworkListeners(e){let t=e.page,n=e.listenerRefs?.requestHandler,r=e.listenerRefs?.responseHandler;t&&n&&t.off(`request`,n),t&&r&&t.off(`response`,r),e.listenerRefs&&(delete e.listenerRefs.requestHandler,delete e.listenerRefs.responseHandler),this.detachPageCloseHandlerIfUnused(e)}detachConsoleListeners(e){let t=e.page,n=e.listenerRefs?.consoleHandler;t&&n&&t.off(`console`,n),e.listenerRefs&&delete e.listenerRefs.consoleHandler,this.detachPageCloseHandlerIfUnused(e)}ensurePageCloseHandler(e,t,n){if(t.listenerRefs?.pageCloseHandler)return;let r=()=>{this.remove(e)};t.listenerRefs={...t.listenerRefs,pageCloseHandler:r},n.on(`close`,r)}detachPageCloseHandlerIfUnused(e){if(e.networkEnabled||e.consoleEnabled)return;let t=e.page,n=e.listenerRefs?.pageCloseHandler;t&&n&&t.off(`close`,n),e.listenerRefs&&delete e.listenerRefs.pageCloseHandler,e.listenerRefs&&!e.listenerRefs.requestHandler&&!e.listenerRefs.responseHandler&&!e.listenerRefs.consoleHandler&&!e.listenerRefs.pageCloseHandler&&delete e.listenerRefs}};let y=null;function b(){return y||=new de,y}const fe=e(import.meta.url);function pe(e){return typeof e==`string`?e.trim():e instanceof Buffer?e.toString(`utf8`).trim():``}function x(e){process.env.PLAYWRIGHT_BROWSERS_PATH=e}async function S(e){x(e);let{chromium:t}=await import(`playwright-core`),n=t.executablePath();if(!n)throw Error(`Chromium executable not found in ${e}`);return n}function C(){return a(r(),`.aikit`,`browsers`)}function w(e){return e.browsersPath??process.env.PLAYWRIGHT_BROWSERS_PATH??C()}function T(e){return s(e)?c(e,{withFileTypes:!0}).some(e=>e.isDirectory()&&e.name.toLowerCase().startsWith(`chromium-`)):!1}async function E(e,t){let n=w(e);if(x(n),t?.(`Using Chromium cache at ${n}`),T(n))return t?.(`Chromium already installed`),S(n);let r=a(fe.resolve(`playwright-core`),`..`,`cli.js`);t?.(`Installing Chromium via playwright-core`);try{o(process.execPath,[r,`install`,`chromium`],{env:{...process.env,PLAYWRIGHT_BROWSERS_PATH:n},encoding:`utf8`,stdio:`pipe`})}catch(e){let t=e,n=pe(t.stderr),r=pe(t.stdout),i=n||r||t.message||`Unknown playwright install failure`;throw Error(`Failed to install Chromium: ${i}`)}return t?.(`Chromium install complete`),S(n)}function me(){return process.platform===`win32`||process.platform===`darwin`?!0:!!(process.env.DISPLAY||process.env.WAYLAND_DISPLAY)}function he(e){return e===`headless`||!me()?`headless`:e}function ge(e){switch(e){case`headless`:return{headless:!0,args:[]};default:return{headless:!1,args:[]}}}var _e=class{pages=new Map;registerPage(e,t,r,i){let a=n();return this.pages.set(a,{page:e,url:t,title:r,label:i,createdAt:new Date}),a}getPageByLabel(e){for(let t of this.pages.values())if(t.label===e)return t.page;throw Error(`Page not found: ${e}`)}resolvePageId(e){if(this.pages.has(e))return e;for(let[t,n]of this.pages.entries())if(n.label===e)return t;throw Error(`Page not found: ${e}`)}getPage(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return t.page}getPageInfo(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return{pageId:e,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}}setSnapshot(e,t){let n=this.pages.get(e);if(!n)throw Error(`Page not found: ${e}`);this.pages.set(e,{...n,lastSnapshot:t})}getSnapshot(e){let t=this.pages.get(e);if(!t)throw Error(`Page not found: ${e}`);return t.lastSnapshot}updatePageInfo(e,t,n){let r=this.pages.get(e);if(!r)throw Error(`Page not found: ${e}`);this.pages.set(e,{...r,url:t,title:n})}async removePage(e){let t=this.pages.get(e);t&&(await t.page.close(),this.pages.delete(e))}listPages(){return[...this.pages.entries()].map(([e,t])=>({pageId:e,url:t.url,title:t.title,label:t.label,createdAt:t.createdAt}))}async closeAll(){await Promise.allSettled([...this.pages.keys()].map(async e=>this.removePage(e)))}get size(){return this.pages.size}};const D={defaultMode:`ui`,browsersPath:null,userDataDirRoot:null,idleShutdownMinutes:10,allowInternalSchemes:!1,allowLoopback:!1,evalTimeoutMs:1e4,evalMaxResultBytes:262144,redactPasswordFieldsInScreenshots:!0};var O=class{browser=null;context=null;idleTimer=null;launchPromise=null;currentMode=null;session=new _e;config;constructor(e={}){this.config={...D,...e}}async launch(e,t){let n=he(e??this.config.defaultMode);if(this.context&&this.currentMode!==n)if(this.currentMode===`headless`&&n===`ui`)await this.close();else return;if(!this.context){if(this.launchPromise)return this.launchPromise;this.launchPromise=this.doLaunch(n,t);try{await this.launchPromise}finally{this.launchPromise=null}}}async doLaunch(e,n){if(this.browser&&this.context)return;let o=w(this.config);process.env.PLAYWRIGHT_BROWSERS_PATH=o;let{chromium:s}=await import(`playwright-core`),c=await E(this.config,n);if(!c)throw Error(`Chromium executable not found. Install with: npx playwright install chromium
2
+ Or set AIKIT_BROWSER_PATH to an existing Chromium installation.`);let l=ge(e);i()===`win32`&&!l.args.includes(`--no-sandbox`)&&l.args.push(`--no-sandbox`),i()===`win32`&&!l.args.includes(`--disable-gpu`)&&l.args.push(`--disable-gpu`);let u=t(`sha256`).update(process.cwd()).digest(`hex`).slice(0,12),d=a(this.config.userDataDirRoot??a(r(),`.aikit`,`profiles`),u);if(n?.(`Launching Chromium in ${e} mode`),this.context=await s.launchPersistentContext(d,{headless:l.headless,args:l.args,executablePath:c,viewport:null}),this.browser=this.context.browser(),!this.browser)throw await this.context.close(),this.context=null,Error(`Failed to acquire Chromium browser instance`);this.currentMode=e,this.browser.on(`disconnected`,()=>{this.browser=null,this.context=null,this.currentMode=null,b().clear(),this.session.closeAll().catch(()=>{}),this.stopIdleTimer()}),this.resetIdleTimer()}stopIdleTimer(){this.idleTimer&&=(clearTimeout(this.idleTimer),null)}resetIdleTimer(){this.stopIdleTimer();let e=setTimeout(()=>{this.close()},this.config.idleShutdownMinutes*6e4);e.unref?.(),this.idleTimer=e}async close(){this.stopIdleTimer(),this.launchPromise=null;let e=this.context,t=this.browser;this.context=null,this.browser=null,this.currentMode=null;let n;try{b().clear()}catch(e){n=e}try{await this.session.closeAll()}catch(e){n??=e}try{e&&await e.close()}catch(e){n??=e}finally{try{t&&await t.close()}catch(e){n??=e}}if(n)throw n}getContext(){if(!this.context)throw Error(`Browser not launched. Call launch() first.`);return this.context}getConfig(){return this.config}isLaunched(){return this.browser!==null}};let k=null;function A(e){return k||=new O(e),k}async function ve(){k&&=(await k.close(),null)}const ye=[`file:`,`chrome:`,`chrome-extension:`,`data:`,`javascript:`],be=[`169.254.169.254`,`metadata.google.internal`,`metadata.google.com`],j=[`localhost`,`127.0.0.1`,`::1`,`[::1]`];function xe(e){return e.replace(/^\[(.*)\]$/,`$1`).toLowerCase()}function Se(e){let t=new WeakSet,n=JSON.stringify(e,(e,n)=>{if(typeof n==`bigint`)return n.toString();if(typeof n==`function`)return`[Function ${n.name||`anonymous`}]`;if(typeof n==`symbol`)return n.toString();if(n instanceof Error)return{name:n.name,message:n.message,stack:n.stack};if(typeof n==`object`&&n){if(t.has(n))return`[Circular]`;t.add(n)}return n});return n===void 0?e===void 0?`undefined`:String(e):n}function Ce(e,t){let n=l.from(e,`utf8`);return n.byteLength<=t?e:n.subarray(0,t).toString(`utf8`)}function M(e,t){let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`Invalid URL: ${e}`}}let r=n.protocol.toLowerCase();if(ye.includes(r)&&!t.allowInternalSchemes)return{allowed:!1,reason:`Blocked URL scheme: ${r}`};let i=xe(n.hostname);return be.includes(i)?{allowed:!1,reason:`Blocked host: ${n.hostname}`}:j.includes(i)||j.includes(n.hostname)?t.allowLoopback?{allowed:!0}:{allowed:!1,reason:`Loopback addresses are blocked by default. Set allowLoopback: true to enable.`}:{allowed:!0}}function N(e){return e?{allowed:!0}:{allowed:!1,reason:`Cookie access requires explicit confirmation (confirm: true)`}}function P(e,t){if(t<=0)return{valid:!1,reason:`maxBytes must be greater than 0`};try{let n=Se(e);return l.byteLength(n,`utf8`)<=t?{valid:!0,result:n,truncated:!1}:{valid:!0,result:`${Ce(n,Math.max(t-3,0))}...`,truncated:!0,reason:`Result exceeded ${t} bytes and was truncated`}}catch(e){return{valid:!1,reason:`Unable to serialize eval result: ${e instanceof Error?e.message:String(e)}`}}}function we(e){return e.replace(/<input\b[^>]*>/gi,e=>/\btype\s*=\s*(["'])password\1/i.test(e)?/\bvalue\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/i.test(e)?e.replace(/\bvalue\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/i,`value="***"`):e.replace(/\s*\/?>$/,e=>` value="***"${e}`):e)}const Te=[`ui`,`headless`];function Ee(e){return typeof e==`object`&&e?e:null}function F(e){return typeof e==`string`&&e.length>0?e:void 0}function I(e){return typeof e==`boolean`?e:void 0}function L(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function R(e){return typeof e==`string`&&Te.includes(e)?e:void 0}function z(e){let t=process.env[e];if(!t)return;let n=Number(t);return Number.isFinite(n)?n:void 0}function De(e){let t=Ee(e.browser)??{};return{...D,defaultMode:R(process.env.AIKIT_BROWSER_DEFAULT_MODE)??R(t.defaultMode)??D.defaultMode,browsersPath:F(process.env.AIKIT_BROWSER_PATH)??F(process.env.AIKIT_BROWSER_BROWSERS_PATH)??F(t.browsersPath)??D.browsersPath,userDataDirRoot:F(t.userDataDirRoot)??D.userDataDirRoot,idleShutdownMinutes:z(`AIKIT_BROWSER_IDLE_MINUTES`)??L(t.idleShutdownMinutes)??D.idleShutdownMinutes,allowInternalSchemes:I(t.allowInternalSchemes)??D.allowInternalSchemes,allowLoopback:I(t.allowLoopback)??D.allowLoopback,evalTimeoutMs:z(`AIKIT_BROWSER_EVAL_TIMEOUT_MS`)??L(t.evalTimeoutMs)??D.evalTimeoutMs,evalMaxResultBytes:L(t.evalMaxResultBytes)??D.evalMaxResultBytes,redactPasswordFieldsInScreenshots:I(t.redactPasswordFieldsInScreenshots)??D.redactPasswordFieldsInScreenshots}}function B(e,t){return{content:[{type:`text`,text:e}],structuredContent:t}}function V(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}async function Oe(e,t,n){let r=null;try{return await Promise.race([e,new Promise((e,i)=>{r=setTimeout(()=>{i(Error(`${n} timed out after ${t}ms`))},t)})])}finally{r&&clearTimeout(r)}}u.string().describe(`Tracked browser page identifier`),u.enum([`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`]).describe(`Interaction kind: click, type, press, hover, drag, select, scroll, upload`),u.string().optional().describe(`Target ref alias`),u.string().optional().describe(`Playwright selector`),u.string().optional().describe(`Human-readable element label`),u.string().optional().describe(`Text to type`),u.string().optional().describe(`Key to press`),u.string().optional().describe(`Option value, drag target, scroll spec, or file path(s)`),u.string().optional().describe(`Drag source ref`),u.string().optional().describe(`Drag source selector`),u.string().optional().describe(`Drag target ref`),u.string().optional().describe(`Drag target selector`);function ke(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=A(e),m=p.session.getPage(t);switch(n){case`click`:{let e=V({ref:r,selector:i,element:a},`browser_act(click)`);await m.click(e);break}case`type`:{let e=V({ref:r,selector:i,element:a},`browser_act(type)`);await m.fill(e,o??``);break}case`press`:{let e=V({ref:r,selector:i,element:a},`browser_act(press)`);if(!s)throw Error(`browser_act(press) requires key`);await m.press(e,s);break}case`hover`:{let e=V({ref:r,selector:i,element:a},`browser_act(hover)`);await m.hover(e);break}case`drag`:{let e=V({ref:l??r,selector:u??i,element:a},`browser_act(drag) source`),t=V({ref:d,selector:f??c,element:a},`browser_act(drag) target`);await m.dragAndDrop(e,t);break}case`select`:{let e=V({ref:r,selector:i,element:a},`browser_act(select)`);if(c===void 0)throw Error(`browser_act(select) requires value`);await m.selectOption(e,c);break}case`scroll`:{if(i||r||a){let e=V({ref:r,selector:i,element:a},`browser_act(scroll)`);await m.locator(e).scrollIntoViewIfNeeded();break}let e=c??`down 500`;await m.evaluate(e=>{if(e===`bottom`){window.scrollTo(0,document.body.scrollHeight);return}if(e===`top`){window.scrollTo(0,0);return}let t=e.split(` `),n=t[0]||`down`,r=Number.parseInt(t[1]||`500`,10),i=n===`left`?-r:n===`right`?r:0,a=n===`up`?-r:n===`down`?r:0;window.scrollBy(i,a)},e);break}case`upload`:{let e=V({ref:r,selector:i,element:a},`browser_act(upload)`);if(!c)throw Error(`value (file path or JSON array of paths) required for upload`);let t;try{let e=JSON.parse(c);t=Array.isArray(e)?e:[c]}catch{t=[c]}await m.locator(e).setInputFiles(t);break}}return p.resetIdleTimer(),B(`ok`,{ok:!0})}}function Ae(e,t){return t?e.filter(e=>e.level===t):e}function je(e){return e.map(e=>{let t=e.location?` (${e.location.url}:${e.location.line})`:``;return`[${e.level.toUpperCase()}] ${e.text}${t}`}).join(`
3
+ `)}async function Me(e,t){let n=b();switch(t.subAction){case`enable`:return n.enableConsole(t.pageId,e,{bufferSize:t.bufferSize}),B(`Console capture enabled for page ${t.pageId}`,{enabled:!0,bufferSize:t.bufferSize??1e3});case`get`:{let e=n.get(t.pageId);if(!e?.consoleEnabled)return B(`Console capture not enabled. Call with subAction: "enable" first.`,{enabled:!1,entries:[]});let r=Ae(e.consoleBuffer.toArray(),t.level);return B(je(r)||`No console messages captured yet.`,{enabled:!0,count:r.length,entries:r})}case`clear`:{let e=n.get(t.pageId);return e&&e.consoleBuffer.clear(),B(`Console buffer cleared.`,{cleared:!0})}}}function Ne(e){return async t=>{let n=A(e),r=await Me(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}u.string().describe(`Tracked browser page identifier`),u.boolean().describe(`Whether to accept the next dialog`),u.string().optional().describe(`Text to provide when accepting a prompt dialog`);function Pe(e){return async({pageId:t,accept:n,promptText:r})=>{let i=A(e);return i.session.getPage(t).once(`dialog`,async e=>{n?await e.accept(r):await e.dismiss()}),i.resetIdleTimer(),B(`ok`,{ok:!0})}}function Fe(e){return async({pageId:t})=>{let n=A(e),r=await n.session.getPage(t).accessibility.snapshot()??{},i=JSON.stringify(r,null,2),a=n.session.getSnapshot(t);if(n.session.setSnapshot(t,i),n.resetIdleTimer(),!a)return B(`First snapshot captured (no previous to diff against).\n${i}`,{pageId:t,hasChanges:!1,isFirst:!0,snapshot:r});if(a===i)return B(`No changes detected.`,{pageId:t,hasChanges:!1});let o=a.split(`
3
4
  `),s=i.split(`
4
5
  `),c=new Set(o),l=new Set(s),u=s.filter(e=>!c.has(e)),d=o.filter(e=>!l.has(e)),f=u.length>0||d.length>0;return B([u.length>0?`Added:\n${u.join(`
5
6
  `)}`:``,d.length>0?`Removed:\n${d.join(`
6
7
  `)}`:``].filter(Boolean).join(`
7
8
 
8
- `)||`No meaningful changes.`,{pageId:t,hasChanges:f,added:u,removed:d})}}l.string().describe(`Tracked browser page identifier`),l.string().describe(`JavaScript expression or IIFE evaluated in page context. Code is wrapped in Function("return (<code>)"). For multi-statement code, use an IIFE: (() => { stmt1; return result; })(). Do NOT use bare return or semicolons at the top level.`),l.number().min(1).max(6e4).optional().describe(`Optional evaluation timeout`);function Fe(e){return async({pageId:t,code:n,timeoutMs:r})=>{let i=A(e),a=i.session.getPage(t),o=Math.min(r??e.evalTimeoutMs,6e4),s=P(await De(a.evaluate(e=>{let t=Function(`return (${e});`)();return typeof t==`function`?t():t},n),o,`browser_eval`),e.evalMaxResultBytes);if(!s.valid||s.result===void 0)throw Error(s.reason??`browser_eval result validation failed`);return i.resetIdleTimer(),B(s.result,{pageId:t,result:s.result,truncated:s.truncated??!1,reason:s.reason})}}const H=2e3,Ie=new Set([`localhost`,`metadata.google.internal`]),Le=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`];function U(e){return e.replace(/^\[(.*)\]$/,`$1`).toLowerCase()}function W(e){if(!/^(?:\d{1,3}\.){3}\d{1,3}$/.test(e))return;let t=e.split(`.`).map(e=>Number(e));if(!t.some(e=>!Number.isInteger(e)||e<0||e>255))return t}function G(e){let t=U(e).split(`::`);if(t.length>2)return;let n=e=>{if(e.length===0)return e;let t=e[e.length-1];if(!t?.includes(`.`))return e;let n=W(t);if(n)return[...e.slice(0,-1),(n[0]<<8|n[1]).toString(16),(n[2]<<8|n[3]).toString(16)]},r=n(t[0]?t[0].split(`:`):[]),i=n(t[1]?t[1].split(`:`):[]);if(!r||!i)return;let a=t.length===2,o=r.length+i.length;if(!a&&o!==8||o>8)return;let s=a?Array(8-o).fill(`0`):[],c=[...r,...s,...i];if(c.length!==8)return;let l=0n;for(let e of c){if(!/^[0-9a-f]{1,4}$/i.test(e))return;l=(l<<16n)+BigInt(`0x${e}`)}return l}function Re(e){let[t,n,r,i]=e;return t===127||t===10||t===172&&n>=16&&n<=31||t===192&&n===168||t===169&&n===254||t===0&&n===0&&r===0&&i===0}function ze(e){return e===1n||(e&339950059921992234495148655666698125312n)==338288524927261089654018896841347694592n||(e&337623910929368631717566993311207522304n)==334965454937798799971759379190646833152n}function Be(e){let t;try{t=new URL(e)}catch{return!1}let n=U(t.hostname);if(Ie.has(n))return!0;let r=W(n);if(r)return Re(r);let i=G(n);return i===void 0?!1:ze(i)}function Ve(e){let t;try{t=new URL(e)}catch{throw Error(`Invalid fetch URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`Fetch URL must use http:// or https://`);return t}function He(e){let t=U(e),n=W(t);if(n)return Re(n);let r=G(t);return r===void 0?!1:ze(r)}async function Ue(e){let t=Ve(e);if(Be(e))throw Error(`Fetch URL must not target private or local hosts`);let n=U(t.hostname);if(!(W(n)||G(n)!==void 0))try{let e=u.lookup(n,{family:0,verbatim:!0}),t=new Promise((e,t)=>setTimeout(()=>t(Error(`DNS lookup timed out after ${H}ms for hostname: ${n}`)),H)),{address:r}=await Promise.race([e,t]);if(He(r))throw Error(`Fetch URL must not target private or local hosts`)}catch(e){if(e instanceof Error&&e.message===`Fetch URL must not target private or local hosts`)throw e;let t=e instanceof Error?e.message:String(e);throw Error(`Failed to resolve hostname ${n}: ${t}`,{cause:e})}}async function We(e){await Ue(e)}function Ge(e,t=262144){return e.length<=t?{body:e,truncated:!1}:{body:`${e.slice(0,t)}\n\n[truncated after ${t} chars]`,truncated:!0}}function Ke(e){let t=[`HTTP ${e.status} ${e.statusText}`,`URL: ${e.url}`,`Redirected: ${e.redirected?`yes`:`no`}`,`JSON: ${e.isJson?`yes`:`no`}`],n=Object.entries(e.headers);if(n.length>0){t.push(``,`Headers:`);for(let[e,r]of n)t.push(`${e}: ${r}`)}return t.push(``,`Body:`,e.body||`<empty>`),t.join(`
9
- `)}function qe(e){let t=(e??`GET`).toUpperCase();if(!Le.includes(t))throw Error(`Unsupported fetch method: ${t}`);return t}function Je(e){if(e===void 0)return 3e4;if(!Number.isFinite(e)||e<=0)throw Error(`Fetch timeoutMs must be a positive number`);return e}function Ye(e){return Object.entries(e).find(([e])=>e.toLowerCase()===`content-type`)?.[1]}function Xe(e,t){if(!t||e.length===0)return e;try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}async function Ze(e,t){await We(t.url);let n=qe(t.method),r=Je(t.timeoutMs),i=t.headers??{},a=n===`GET`||n===`HEAD`?void 0:t.body,o;try{o=await e.evaluate(async e=>{let t=new AbortController,n=setTimeout(()=>t.abort(),e.timeoutMs);try{let n=await fetch(e.url,{method:e.method,headers:e.headers,body:e.body,signal:t.signal,redirect:`follow`});return{status:n.status,statusText:n.statusText,headers:Object.fromEntries(n.headers.entries()),body:await n.text(),url:n.url,redirected:n.redirected}}catch(t){if(t instanceof Error&&t.name===`AbortError`)throw Error(`Fetch timed out after ${e.timeoutMs}ms`);let n=t instanceof Error?t.message:String(t);throw Error(`Fetch failed: ${n}`,{cause:t})}finally{clearTimeout(n)}},{url:t.url,method:n,headers:i,body:a,timeoutMs:r})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(t,{cause:e})}await We(o.url);let s=Ye(o.headers)?.toLowerCase().includes(`json`)??!1,c=Ge(Xe(o.body,s)),l=t.includeHeaders===!1?{}:o.headers,u={status:o.status,statusText:o.statusText,headers:l,body:c.body,isJson:s,url:o.url,redirected:o.redirected};return B(Ke(u),{...u,truncated:c.truncated})}function Qe(e){return async t=>{let n=A(e),r=await Ze(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}l.string().describe(`Tracked browser page identifier`),l.string().url().optional().describe(`Optional URL to navigate to`),l.enum([`back`,`forward`,`reload`,`waitFor`]).optional().describe(`Navigation helper action`),l.string().optional().describe(`Selector to wait for when type="waitFor"`),l.number().min(1).max(6e4).optional().describe(`Optional wait timeout`);function $e(e){return async({pageId:t,url:n,type:r,selector:i,timeoutMs:a})=>{let o=A(e),s=o.session.getPage(t);if(n){let r=M(n,e);if(!r.allowed)return B(`Navigation blocked: ${r.reason}`,{blocked:!0,pageId:t,reason:r.reason});await s.goto(n)}else if(!r)return B(`Navigation requires url or type`,{error:`Navigation requires url or type`,pageId:t});else if(r===`back`)await s.goBack();else if(r===`forward`)await s.goForward();else if(r===`reload`)await s.reload();else if(r===`waitFor`){if(!i)throw Error(`browser_navigate(waitFor) requires selector`);await s.waitForSelector(i,a?{timeout:a}:void 0)}let c=s.url(),l=await s.title();return o.session.updatePageInfo(t,c,l),o.resetIdleTimer(),B(`${l||c}\n${c}`,{pageId:t,url:c,title:l})}}function et(e){return Object.entries(e).map(([e,t])=>({name:e,value:t}))}function tt(e){try{return Array.from(new URL(e).searchParams.entries()).map(([e,t])=>({name:e,value:t}))}catch{return[]}}function nt(e,t){let n=t.toLowerCase();for(let[t,r]of Object.entries(e))if(t.toLowerCase()===n)return r}function rt(e){let t=nt(e,`content-type`);return t&&t.split(`;`,1)[0]?.trim()||`application/octet-stream`}function it(e){return e===void 0?0:Buffer.byteLength(e,`utf8`)}function at(e,t=!1){return t?{...e}:m(e)}function ot(e,t){return{...e,headers:at(e.headers,t.showSensitive),postData:t.includeBody?e.postData:void 0,response:e.response?{...e.response,headers:at(e.response.headers,t.showSensitive),bodyPreview:t.includeBody?e.response.bodyPreview:void 0}:void 0}}function st(e){return B(`Network capture not enabled. Call with subAction: "enable" first.`,{pageId:e,enabled:!1,count:0,entries:[]})}async function ct(e,t){let n=y();switch(t.subAction){case`enable`:return n.enableNetwork(t.pageId,e,t.filter,{bufferSize:t.bufferSize,showSensitive:t.showSensitive,includeBody:t.includeBody}),B(`Network capture enabled for page ${t.pageId}`,{pageId:t.pageId,enabled:!0,filter:t.filter??{resourceTypes:[...f]}});case`get`:{let e=n.get(t.pageId);if(!e?.networkEnabled)return st(t.pageId);let r=e.networkBuffer.toArray().map(e=>ot(e,t));return B(r.map(e=>`${e.method} ${e.url} -> ${e.response?.status??`pending`} (${e.response?.timing?`${e.response.timing}ms`:`no response`})`).join(`
10
- `)||`No requests captured yet.`,{pageId:t.pageId,enabled:!0,count:r.length,entries:r})}case`clear`:{let e=n.get(t.pageId);return e?.networkEnabled?(e.networkBuffer.clear(),e.pendingRequests.clear(),e.pendingRequestHead=void 0,e.pendingRequestTail=void 0,B(`Network capture buffer cleared.`,{pageId:t.pageId,cleared:!0})):B(`Network capture not enabled. Call with subAction: "enable" first.`,{pageId:t.pageId,enabled:!1,cleared:!1})}case`export-har`:{let e=n.get(t.pageId);if(!e?.networkEnabled)return st(t.pageId);let r=e.networkBuffer.toArray().map(e=>{let n=ot(e,t);return{startedDateTime:new Date(n.timestamp).toISOString(),time:n.response?.timing??-1,request:{method:n.method,url:n.url,httpVersion:`HTTP/1.1`,cookies:[],headers:et(n.headers),queryString:tt(n.url),headersSize:-1,bodySize:it(e.postData),postData:n.postData?{text:n.postData}:void 0},response:n.response?{status:n.response.status,statusText:n.response.statusText,httpVersion:`HTTP/1.1`,cookies:[],headers:et(n.response.headers),content:{size:n.response.bodySize??0,mimeType:rt(n.response.headers),text:n.response.bodyPreview},redirectURL:``,headersSize:-1,bodySize:n.response.bodySize??-1}:{status:0,statusText:`pending`,httpVersion:`HTTP/1.1`,cookies:[],headers:[],content:{size:0,mimeType:`application/octet-stream`},redirectURL:``,headersSize:-1,bodySize:-1},cache:{},timings:{send:-1,wait:-1,receive:-1}}});return B(`Exported ${r.length} entries in HAR 1.2 format.`,{pageId:t.pageId,har:{log:{version:`1.2`,creator:{name:`aikit-browser`,version:`1.0.0`},entries:r}}})}default:{let e=`Unknown network subAction: ${String(t.subAction)}`;return B(e,{pageId:t.pageId,error:e})}}}function lt(e){return async t=>{let n=A(e),r=await ct(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}l.string().url().describe(`Absolute URL to open`),l.enum([`ui`,`headless`]).optional().describe(`Browser launch mode`),l.boolean().optional().describe(`Reserved for future tab reuse control`),l.string().optional().describe(`Human-readable label for the page`),l.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true)`),l.enum([`load`,`domcontentloaded`,`networkidle`]).optional().describe(`Navigation readiness event`);function ut(e){return async({url:t,mode:n,label:r,autoDialog:i,waitUntil:a})=>{let o=M(t,e);if(!o.allowed)throw Error(o.reason??`Blocked URL: ${t}`);let s=A(e);s.isLaunched()||await s.launch(n??e.defaultMode);let c=await s.getContext().newPage();a?await c.goto(t,{waitUntil:a}):await c.goto(t);let l=await c.title(),u=s.session.registerPage(c,t,l,r);return i!==!1&&c.on(`dialog`,async e=>{let t=e.type();(t===`alert`||t===`beforeunload`)&&await e.accept()}),s.resetIdleTimer(),B(`Opened ${l||t}\npageId: ${u}`,{pageId:u,url:t,title:l,label:r})}}l.string().describe(`Tracked browser page identifier`),l.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),l.string().optional().describe(`CSS selector to scope extraction to a specific element`);function dt(e){return async({pageId:t,mode:n,selector:r})=>{let i=A(e).session.getPage(t),a=r??`body`,o=n??`snapshot`;switch(o){case`dom`:{let e=r?await i.locator(r).innerHTML():await i.content();return B(e||`empty page`,{pageId:t,mode:o,selector:r,dom:e})}case`markdown`:{let e=await i.evaluate(e=>{let t=globalThis,n=e?t.document?.querySelector(e):t.document?.body;if(!n)return``;function r(e){if(e.nodeType===t.Node?.TEXT_NODE)return e.textContent?.replace(/\s+/g,` `)||``;if(e.nodeType!==t.Node?.ELEMENT_NODE)return``;let n=e,a=n.tagName.toLowerCase(),o=t.window?.getComputedStyle(n);if(o?.display===`none`||o?.visibility===`hidden`)return``;let s=Array.from(n.childNodes).map(r).filter(Boolean).join(``);switch(a){case`h1`:return`# ${s.trim()}\n\n`;case`h2`:return`## ${s.trim()}\n\n`;case`h3`:return`### ${s.trim()}\n\n`;case`h4`:return`#### ${s.trim()}\n\n`;case`h5`:return`##### ${s.trim()}\n\n`;case`h6`:return`###### ${s.trim()}\n\n`;case`p`:return`${s.trim()}\n\n`;case`br`:return`
9
+ `)||`No meaningful changes.`,{pageId:t,hasChanges:f,added:u,removed:d})}}u.string().describe(`Tracked browser page identifier`),u.string().describe(`JavaScript expression or IIFE evaluated in page context. Code is wrapped in Function("return (<code>)"). For multi-statement code, use an IIFE: (() => { stmt1; return result; })(). Do NOT use bare return or semicolons at the top level.`),u.number().min(1).max(6e4).optional().describe(`Optional evaluation timeout`);function Ie(e){return async({pageId:t,code:n,timeoutMs:r})=>{let i=A(e),a=i.session.getPage(t),o=Math.min(r??e.evalTimeoutMs,6e4),s=P(await Oe(a.evaluate(e=>{let t=Function(`return (${e});`)();return typeof t==`function`?t():t},n),o,`browser_eval`),e.evalMaxResultBytes);if(!s.valid||s.result===void 0)throw Error(s.reason??`browser_eval result validation failed`);return i.resetIdleTimer(),B(s.result,{pageId:t,result:s.result,truncated:s.truncated??!1,reason:s.reason})}}const Le=2e3,Re=new Set([`localhost`,`metadata.google.internal`]),ze=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`];function H(e){return e.replace(/^\[(.*)\]$/,`$1`).toLowerCase()}function U(e){if(!/^(?:\d{1,3}\.){3}\d{1,3}$/.test(e))return;let t=e.split(`.`).map(e=>Number(e));if(!t.some(e=>!Number.isInteger(e)||e<0||e>255))return t}function W(e){let t=H(e).split(`::`);if(t.length>2)return;let n=e=>{if(e.length===0)return e;let t=e[e.length-1];if(!t?.includes(`.`))return e;let n=U(t);if(n)return[...e.slice(0,-1),(n[0]<<8|n[1]).toString(16),(n[2]<<8|n[3]).toString(16)]},r=n(t[0]?t[0].split(`:`):[]),i=n(t[1]?t[1].split(`:`):[]);if(!r||!i)return;let a=t.length===2,o=r.length+i.length;if(!a&&o!==8||o>8)return;let s=a?Array(8-o).fill(`0`):[],c=[...r,...s,...i];if(c.length!==8)return;let l=0n;for(let e of c){if(!/^[0-9a-f]{1,4}$/i.test(e))return;l=(l<<16n)+BigInt(`0x${e}`)}return l}function Be(e){let[t,n,r,i]=e;return t===127||t===10||t===172&&n>=16&&n<=31||t===192&&n===168||t===169&&n===254||t===0&&n===0&&r===0&&i===0}function Ve(e){return e===1n||(e&339950059921992234495148655666698125312n)==338288524927261089654018896841347694592n||(e&337623910929368631717566993311207522304n)==334965454937798799971759379190646833152n}function He(e){let t;try{t=new URL(e)}catch{return!1}let n=H(t.hostname);if(Re.has(n))return!0;let r=U(n);if(r)return Be(r);let i=W(n);return i===void 0?!1:Ve(i)}function Ue(e){let t;try{t=new URL(e)}catch{throw Error(`Invalid fetch URL: ${e}`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`Fetch URL must use http:// or https://`);return t}function We(e){let t=H(e),n=U(t);if(n)return Be(n);let r=W(t);return r===void 0?!1:Ve(r)}async function Ge(e){let t=Ue(e);if(He(e))throw Error(`Fetch URL must not target private or local hosts`);let n=H(t.hostname);if(!(U(n)||W(n)!==void 0))try{let e=d.lookup(n,{family:0,verbatim:!0}),t=new Promise((e,t)=>setTimeout(()=>t(Error(`DNS lookup timed out after ${Le}ms for hostname: ${n}`)),Le)),{address:r}=await Promise.race([e,t]);if(We(r))throw Error(`Fetch URL must not target private or local hosts`)}catch(e){if(e instanceof Error&&e.message===`Fetch URL must not target private or local hosts`)throw e;let t=e instanceof Error?e.message:String(e);throw Error(`Failed to resolve hostname ${n}: ${t}`,{cause:e})}}async function Ke(e){await Ge(e)}function qe(e,t=262144){return e.length<=t?{body:e,truncated:!1}:{body:`${e.slice(0,t)}\n\n[truncated after ${t} chars]`,truncated:!0}}function Je(e){let t=[`HTTP ${e.status} ${e.statusText}`,`URL: ${e.url}`,`Redirected: ${e.redirected?`yes`:`no`}`,`JSON: ${e.isJson?`yes`:`no`}`],n=Object.entries(e.headers);if(n.length>0){t.push(``,`Headers:`);for(let[e,r]of n)t.push(`${e}: ${r}`)}return t.push(``,`Body:`,e.body||`<empty>`),t.join(`
10
+ `)}function Ye(e){let t=(e??`GET`).toUpperCase();if(!ze.includes(t))throw Error(`Unsupported fetch method: ${t}`);return t}function Xe(e){if(e===void 0)return 3e4;if(!Number.isFinite(e)||e<=0)throw Error(`Fetch timeoutMs must be a positive number`);return e}function Ze(e){return Object.entries(e).find(([e])=>e.toLowerCase()===`content-type`)?.[1]}function Qe(e,t){if(!t||e.length===0)return e;try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}async function $e(e,t){await Ke(t.url);let n=Ye(t.method),r=Xe(t.timeoutMs),i=t.headers??{},a=n===`GET`||n===`HEAD`?void 0:t.body,o;try{o=await e.evaluate(async e=>{let t=new AbortController,n=setTimeout(()=>t.abort(),e.timeoutMs);try{let n=await fetch(e.url,{method:e.method,headers:e.headers,body:e.body,signal:t.signal,redirect:`follow`});return{status:n.status,statusText:n.statusText,headers:Object.fromEntries(n.headers.entries()),body:await n.text(),url:n.url,redirected:n.redirected}}catch(t){if(t instanceof Error&&t.name===`AbortError`)throw Error(`Fetch timed out after ${e.timeoutMs}ms`);let n=t instanceof Error?t.message:String(t);throw Error(`Fetch failed: ${n}`,{cause:t})}finally{clearTimeout(n)}},{url:t.url,method:n,headers:i,body:a,timeoutMs:r})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(t,{cause:e})}await Ke(o.url);let s=Ze(o.headers)?.toLowerCase().includes(`json`)??!1,c=qe(Qe(o.body,s)),l=t.includeHeaders===!1?{}:o.headers,u={status:o.status,statusText:o.statusText,headers:l,body:c.body,isJson:s,url:o.url,redirected:o.redirected};return B(Je(u),{...u,truncated:c.truncated})}function et(e){return async t=>{let n=A(e),r=await $e(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}u.string().describe(`Tracked browser page identifier`),u.string().url().optional().describe(`Optional URL to navigate to`),u.enum([`back`,`forward`,`reload`,`waitFor`]).optional().describe(`Navigation helper action`),u.string().optional().describe(`Selector to wait for when type="waitFor"`),u.number().min(1).max(6e4).optional().describe(`Optional wait timeout`);function tt(e){return async({pageId:t,url:n,type:r,selector:i,timeoutMs:a})=>{let o=A(e),s=o.session.getPage(t);if(n){let r=M(n,e);if(!r.allowed)return B(`Navigation blocked: ${r.reason}`,{blocked:!0,pageId:t,reason:r.reason});await s.goto(n)}else if(!r)return B(`Navigation requires url or type`,{error:`Navigation requires url or type`,pageId:t});else if(r===`back`)await s.goBack();else if(r===`forward`)await s.goForward();else if(r===`reload`)await s.reload();else if(r===`waitFor`){if(!i)throw Error(`browser_navigate(waitFor) requires selector`);await s.waitForSelector(i,a?{timeout:a}:void 0)}let c=s.url(),l=await s.title();return o.session.updatePageInfo(t,c,l),o.resetIdleTimer(),B(`${l||c}\n${c}`,{pageId:t,url:c,title:l})}}function nt(e){return Object.entries(e).map(([e,t])=>({name:e,value:t}))}function rt(e){try{return Array.from(new URL(e).searchParams.entries()).map(([e,t])=>({name:e,value:t}))}catch{return[]}}function it(e,t){let n=t.toLowerCase();for(let[t,r]of Object.entries(e))if(t.toLowerCase()===n)return r}function at(e){let t=it(e,`content-type`);return t&&t.split(`;`,1)[0]?.trim()||`application/octet-stream`}function ot(e){return e===void 0?0:Buffer.byteLength(e,`utf8`)}function st(e,t=!1){return t?{...e}:h(e)}function ct(e,t){return{...e,headers:st(e.headers,t.showSensitive),postData:t.includeBody?e.postData:void 0,response:e.response?{...e.response,headers:st(e.response.headers,t.showSensitive),bodyPreview:t.includeBody?e.response.bodyPreview:void 0}:void 0}}function lt(e){return B(`Network capture not enabled. Call with subAction: "enable" first.`,{pageId:e,enabled:!1,count:0,entries:[]})}async function ut(e,t){let n=b();switch(t.subAction){case`enable`:return n.enableNetwork(t.pageId,e,t.filter,{bufferSize:t.bufferSize,showSensitive:t.showSensitive,includeBody:t.includeBody}),B(`Network capture enabled for page ${t.pageId}`,{pageId:t.pageId,enabled:!0,filter:t.filter??{resourceTypes:[...p]}});case`get`:{let e=n.get(t.pageId);if(!e?.networkEnabled)return lt(t.pageId);let r=e.networkBuffer.toArray().map(e=>ct(e,t));return B(r.map(e=>`${e.method} ${e.url} -> ${e.response?.status??`pending`} (${e.response?.timing?`${e.response.timing}ms`:`no response`})`).join(`
11
+ `)||`No requests captured yet.`,{pageId:t.pageId,enabled:!0,count:r.length,entries:r})}case`clear`:{let e=n.get(t.pageId);return e?.networkEnabled?(e.networkBuffer.clear(),e.pendingRequests.clear(),e.pendingRequestHead=void 0,e.pendingRequestTail=void 0,B(`Network capture buffer cleared.`,{pageId:t.pageId,cleared:!0})):B(`Network capture not enabled. Call with subAction: "enable" first.`,{pageId:t.pageId,enabled:!1,cleared:!1})}case`export-har`:{let e=n.get(t.pageId);if(!e?.networkEnabled)return lt(t.pageId);let r=e.networkBuffer.toArray().map(e=>{let n=ct(e,t);return{startedDateTime:new Date(n.timestamp).toISOString(),time:n.response?.timing??-1,request:{method:n.method,url:n.url,httpVersion:`HTTP/1.1`,cookies:[],headers:nt(n.headers),queryString:rt(n.url),headersSize:-1,bodySize:ot(e.postData),postData:n.postData?{text:n.postData}:void 0},response:n.response?{status:n.response.status,statusText:n.response.statusText,httpVersion:`HTTP/1.1`,cookies:[],headers:nt(n.response.headers),content:{size:n.response.bodySize??0,mimeType:at(n.response.headers),text:n.response.bodyPreview},redirectURL:``,headersSize:-1,bodySize:n.response.bodySize??-1}:{status:0,statusText:`pending`,httpVersion:`HTTP/1.1`,cookies:[],headers:[],content:{size:0,mimeType:`application/octet-stream`},redirectURL:``,headersSize:-1,bodySize:-1},cache:{},timings:{send:-1,wait:-1,receive:-1}}});return B(`Exported ${r.length} entries in HAR 1.2 format.`,{pageId:t.pageId,har:{log:{version:`1.2`,creator:{name:`aikit-browser`,version:`1.0.0`},entries:r}}})}default:{let e=`Unknown network subAction: ${String(t.subAction)}`;return B(e,{pageId:t.pageId,error:e})}}}function dt(e){return async t=>{let n=A(e),r=await ut(n.session.getPage(t.pageId),t);return n.resetIdleTimer(),r}}u.string().url().describe(`Absolute URL to open`),u.enum([`ui`,`headless`]).optional().describe(`Browser launch mode`),u.boolean().optional().describe(`Reserved for future tab reuse control`),u.string().optional().describe(`Human-readable label for the page`),u.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true)`),u.enum([`load`,`domcontentloaded`,`networkidle`]).optional().describe(`Navigation readiness event`);function ft(e){return async({url:t,mode:n,label:r,autoDialog:i,waitUntil:a})=>{let o=M(t,e);if(!o.allowed)throw Error(o.reason??`Blocked URL: ${t}`);let s=A(e);s.isLaunched()||await s.launch(n??e.defaultMode);let c=await s.getContext().newPage();a?await c.goto(t,{waitUntil:a}):await c.goto(t);let l=await c.title(),u=s.session.registerPage(c,t,l,r);return i!==!1&&c.on(`dialog`,async e=>{let t=e.type();(t===`alert`||t===`beforeunload`)&&await e.accept()}),s.resetIdleTimer(),B(`Opened ${l||t}\npageId: ${u}`,{pageId:u,url:t,title:l,label:r})}}u.string().describe(`Tracked browser page identifier`),u.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),u.string().optional().describe(`CSS selector to scope extraction to a specific element`);function pt(e){return async({pageId:t,mode:n,selector:r})=>{let i=A(e).session.getPage(t),a=r??`body`,o=n??`snapshot`;switch(o){case`dom`:{let e=r?await i.locator(r).innerHTML():await i.content();return B(e||`empty page`,{pageId:t,mode:o,selector:r,dom:e})}case`markdown`:{let e=await i.evaluate(e=>{let t=globalThis,n=e?t.document?.querySelector(e):t.document?.body;if(!n)return``;function r(e){if(e.nodeType===t.Node?.TEXT_NODE)return e.textContent?.replace(/\s+/g,` `)||``;if(e.nodeType!==t.Node?.ELEMENT_NODE)return``;let n=e,a=n.tagName.toLowerCase(),o=t.window?.getComputedStyle(n);if(o?.display===`none`||o?.visibility===`hidden`)return``;let s=Array.from(n.childNodes).map(r).filter(Boolean).join(``);switch(a){case`h1`:return`# ${s.trim()}\n\n`;case`h2`:return`## ${s.trim()}\n\n`;case`h3`:return`### ${s.trim()}\n\n`;case`h4`:return`#### ${s.trim()}\n\n`;case`h5`:return`##### ${s.trim()}\n\n`;case`h6`:return`###### ${s.trim()}\n\n`;case`p`:return`${s.trim()}\n\n`;case`br`:return`
11
12
  `;case`hr`:return`
12
13
  ---
13
14
 
@@ -15,7 +16,7 @@ import{createRequire as e}from"node:module";import{createHash as t,randomUUID as
15
16
  > `)}\n\n`;case`a`:return`[${s.trim()}](${n.getAttribute(`href`)||``})`;case`img`:return`![${n.getAttribute(`alt`)||``}](${n.getAttribute(`src`)||``})`;case`ul`:case`ol`:return`${s}\n`;case`li`:return`${n.parentElement?.tagName===`OL`?`${Array.from(n.parentElement.children).indexOf(n)+1}. `:`- `}${s.trim()}\n`;case`table`:return`${i(n)}\n\n`;case`script`:case`style`:case`noscript`:case`nav`:case`footer`:case`header`:return``;case`div`:case`section`:case`article`:case`main`:case`span`:return s;default:return s}}function i(e){let t=Array.from(e.querySelectorAll(`tr`));if(!t.length)return``;let n=[];return t.forEach((e,t)=>{let r=Array.from(e.querySelectorAll(`th, td`)).map(e=>e.textContent?.trim()||``);n.push(`| ${r.join(` | `)} |`),t===0&&n.push(`| ${r.map(()=>`---`).join(` | `)} |`)}),n.join(`
16
17
  `)}return r(n).replace(/\n{3,}/g,`
17
18
 
18
- `).trim()},r);return B(e||`empty page`,{pageId:t,mode:o,selector:r,markdown:e})}case`text`:{let e=await i.locator(a).innerText();return B(e||`empty page`,{pageId:t,mode:o,selector:r,text:e})}default:{let e=await i.locator(a).ariaSnapshot();return B(e||`empty page`,{pageId:t,mode:o,selector:r,snapshot:e})}}}}l.string().describe(`Tracked browser page identifier`),l.string().optional().describe(`Optional target ref alias`),l.string().optional().describe(`Optional target selector`),l.boolean().optional().describe(`Capture the full page when no selector is provided`),l.boolean().optional().describe(`Mask password fields before capture`),l.object({x:l.number(),y:l.number(),width:l.number(),height:l.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),l.enum([`png`,`jpeg`]).optional().describe(`Image format (default: png)`),l.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`);function ft(e){return async({pageId:t,ref:n,selector:r,fullPage:i,redactPasswords:a,clip:o,format:s,quality:c})=>{let l=A(e),u=l.session.getPage(t),d=a??e.redactPasswordFieldsInScreenshots,f=[];d&&(f=await u.evaluate(()=>{let e=globalThis.document;return Array.from(e.querySelectorAll(`input[type="password"]`)).map((e,t)=>{let n=e,r=`data-aikit-password-mask-${t}`;return n.setAttribute(r,n.value),n.value=`***`,r})}));try{let e={};s&&(e.type=s),s===`jpeg`&&c!==void 0&&(e.quality=c);let a=r??n?await u.locator(V({ref:n,selector:r},`browser_screenshot`)).screenshot(e):await u.screenshot({...e,...o?{clip:o}:{fullPage:i??!1}});return l.resetIdleTimer(),B(`Screenshot captured`,{pageId:t,base64:a.toString(`base64`)})}finally{d&&f.length>0&&await u.evaluate(e=>{let t=globalThis.document;for(let n of e){let e=t.querySelector(`input[${n}]`);e&&(e.value=e.getAttribute(n)??``,e.removeAttribute(n))}},f)}}}const pt=l.enum([`Lax`,`None`,`Strict`]),mt=l.enum([`localStorage`,`sessionStorage`]);l.enum([`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`]).describe(`Session sub-action`),l.string().optional().describe(`Page ID (required for close, storage actions)`),l.boolean().optional().describe(`Explicit confirmation for cookie operations`),l.array(l.object({name:l.string(),value:l.string(),url:l.string().optional(),domain:l.string().optional(),path:l.string().optional(),expires:l.number().optional(),httpOnly:l.boolean().optional(),secure:l.boolean().optional(),sameSite:pt.optional()})).optional().describe(`Cookies to set (for set-cookie action)`),l.string().optional().describe(`Cookie name (for delete-cookie action)`),mt.optional().describe(`Storage type for storage actions`),l.string().optional().describe(`Storage key to get/set`),l.string().optional().describe(`Storage value to set`);function ht(e){return async({action:t,pageId:n,confirm:r,cookies:i,name:a,storageType:o,storageKey:s,storageValue:c})=>{let l=A(e);if(t===`list`){let e=l.session.listPages();return B(JSON.stringify(e,null,2),{pages:e})}if(t===`close`){if(!n)throw Error(`browser_session(close) requires pageId`);return await l.session.removePage(n),l.resetIdleTimer(),B(`ok`,{ok:!0,pageId:n})}if(t===`set-cookie`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);if(!i?.length)throw Error(`cookies array required for set-cookie`);return await l.getContext().addCookies(i),l.resetIdleTimer(),B(`Set ${i.length} cookie(s)`,{ok:!0,count:i.length})}if(t===`delete-cookie`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);if(!a)throw Error(`name required for delete-cookie`);return await l.getContext().clearCookies({name:a}),l.resetIdleTimer(),B(`Deleted cookie: ${a}`,{ok:!0,name:a})}if(t===`clear-cookies`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);return await l.getContext().clearCookies(),l.resetIdleTimer(),B(`All cookies cleared`,{ok:!0})}if(t===`get-storage`){if(!n)throw Error(`pageId required for get-storage`);if(!o)throw Error(`storageType required for get-storage`);let e=await l.session.getPage(n).evaluate(({type:e,key:t})=>{let n=e===`localStorage`?localStorage:sessionStorage;if(t)return n.getItem(t);let r={};for(let e=0;e<n.length;e+=1){let t=n.key(e);t&&(r[t]=n.getItem(t)||``)}return r},{type:o,key:s});return l.resetIdleTimer(),B(s?`${o}.${s} = ${String(e)}`:`${o}: ${JSON.stringify(e)}`,{storageType:o,key:s,data:e})}if(t===`set-storage`){if(!n)throw Error(`pageId required for set-storage`);if(!o)throw Error(`storageType required for set-storage`);if(!s)throw Error(`storageKey required for set-storage`);if(c===void 0)throw Error(`storageValue required for set-storage`);return await l.session.getPage(n).evaluate(({type:e,key:t,value:n})=>{(e===`localStorage`?localStorage:sessionStorage).setItem(t,n)},{type:o,key:s,value:c}),l.resetIdleTimer(),B(`Set ${o}.${s}`,{ok:!0,storageType:o,key:s})}if(t===`clear-storage`){if(!n)throw Error(`pageId required for clear-storage`);if(!o)throw Error(`storageType required for clear-storage`);return await l.session.getPage(n).evaluate(e=>{(e===`localStorage`?localStorage:sessionStorage).clear()},o),l.resetIdleTimer(),B(`Cleared ${o}`,{ok:!0,storageType:o})}let u=N(!!r);if(!u.allowed)throw Error(u.reason??`Cookie access denied`);let d=await l.getContext().cookies();return l.resetIdleTimer(),B(JSON.stringify(d,null,2),{cookies:d})}}const gt=[`open`,`batch`,`read`,`act`,`navigate`,`network`,`console`,`fetch`,`eval`,`diff`,`screenshot`,`dialog`,`session`],_t=[`ui`,`headless`],vt=[`load`,`domcontentloaded`,`networkidle`],yt=[`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`],bt=[`back`,`forward`,`reload`,`waitFor`],xt=[`enable`,`get`,`clear`,`export-har`],St=[`enable`,`get`,`clear`],Ct=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`],wt=[`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`],Tt={action:l.enum(gt).describe(`Browser action to perform`),pageId:l.string().optional().describe(`Tracked browser page identifier`),label:l.string().optional().describe(`Human-readable label for the page (used as alternative to pageId)`),url:l.string().url().optional().describe(`URL to open or navigate to`),mode:l.enum(_t).optional().describe(`Browser launch mode (open only)`),forceNew:l.boolean().optional().describe(`Reserved for future tab reuse`),autoDialog:l.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true). Set false to handle all dialogs manually.`),waitUntil:l.enum(vt).optional().describe(`Navigation readiness event`),kind:l.enum(yt).optional().describe(`Interaction kind (act only)`),ref:l.string().optional().describe(`Target ref alias`),selector:l.string().optional().describe(`Playwright selector`),element:l.string().optional().describe(`Human-readable element label (resolved via Playwright text selector). Prefer selector for precision.`),text:l.string().optional().describe(`Text to type`),key:l.string().optional().describe(`Key to press`),value:l.string().optional().describe(`Option value or drag target`),fromRef:l.string().optional().describe(`Drag source ref`),fromSelector:l.string().optional().describe(`Drag source selector`),toRef:l.string().optional().describe(`Drag target ref`),toSelector:l.string().optional().describe(`Drag target selector`),type:l.enum(bt).optional().describe(`Navigation type`),subAction:l.enum(xt).optional().describe(`Network sub-action: enable, get, clear, or export-har`),code:l.string().optional().describe(`JavaScript expression or IIFE evaluated in page context. Wrapped in Function("return (<code>)"). Multi-statement: use (() => { ...; return result; })(). No bare return or top-level semicolons.`),timeoutMs:l.number().min(1).max(6e4).optional().describe(`Timeout in milliseconds`),filter:l.object({resourceTypes:l.array(l.string()).optional(),urlPattern:l.string().optional(),excludeUrls:l.array(l.string()).optional()}).optional().describe(`Network capture filter for resource types and URL patterns`),showSensitive:l.boolean().optional().describe(`Include sensitive headers instead of redacting them`),includeBody:l.boolean().optional().describe(`Include truncated request bodies in captured entries`),bufferSize:l.number().int().min(1).max(1e4).optional().describe(`Buffer capacity (1-10000, default varies by action)`),consoleSubAction:l.enum(St).optional().describe(`Console sub-action: enable, get, or clear`),level:l.string().optional().describe(`Filter console entries by level (log/info/warn/error/debug)`),fetchUrl:l.string().optional().describe(`URL for fetch action (http/https only). Uses page cookies/session.`),fetchMethod:l.enum(Ct).optional().describe(`HTTP method for fetch action (default: GET)`),fetchHeaders:l.record(l.string(),l.string()).optional().describe(`Custom headers for fetch action`),fetchBody:l.string().optional().describe(`Request body for fetch action (POST/PUT/PATCH)`),includeResponseHeaders:l.boolean().optional().describe(`Include response headers in fetch output (default: true)`),fullPage:l.boolean().optional().describe(`Capture full page`),redactPasswords:l.boolean().optional().describe(`Mask password fields`),readMode:l.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode for read action: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),clip:l.object({x:l.number(),y:l.number(),width:l.number(),height:l.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),format:l.enum([`png`,`jpeg`]).optional().describe(`Screenshot image format (default: png)`),quality:l.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`),cookies:l.array(l.object({name:l.string(),value:l.string(),url:l.string().optional(),domain:l.string().optional(),path:l.string().optional(),expires:l.number().optional(),httpOnly:l.boolean().optional(),secure:l.boolean().optional(),sameSite:l.enum([`Lax`,`None`,`Strict`]).optional()})).optional().describe(`Cookies to set (for session set-cookie action)`),name:l.string().optional().describe(`Cookie name for delete-cookie action`),storageType:l.enum([`localStorage`,`sessionStorage`]).optional().describe(`Storage type for get/set/clear-storage actions`),storageKey:l.string().optional().describe(`Storage key to get or set`),storageValue:l.string().optional().describe(`Value to set in storage`),accept:l.boolean().optional().describe(`Accept or dismiss dialog`),promptText:l.string().optional().describe(`Text for prompt dialog`),sessionAction:l.enum(wt).optional().describe(`Session sub-action (session only)`),confirm:l.boolean().optional().describe(`Explicit confirmation for cookie export`),steps:l.array(l.record(l.string(),l.unknown())).optional().describe(`Array of action steps for batch execution. Each step is an object with action + action-specific params.`)};function Et(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 Dt(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 Ot(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(!Et(i,n))throw Error(`${r} requires ${t}`);return i}function Q(e,t,n,r){let i=e[t];if(i!==void 0){if(!Et(i,n))throw Error(`${r} received invalid ${t}`);return i}}function kt(e,t){let n=q(e,`pageId`);if(n)return A(t).session.resolvePageId(n)}function $(e,t,n){let r=q(e,`pageId`);if(!r)throw Error(`${n} requires pageId`);return A(t).session.resolvePageId(r)}async function At(e,t,n){switch(Z(e,`action`,gt,`browser`)){case`open`:return t.openHandler({url:K(e,`url`,`browser(open)`),mode:Q(e,`mode`,_t,`browser(open)`),forceNew:J(e,`forceNew`),label:q(e,`label`),autoDialog:J(e,`autoDialog`),waitUntil:Q(e,`waitUntil`,vt,`browser(open)`)});case`batch`:{let r=Ot(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 At(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 B(`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`,yt,`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`,bt,`browser(navigate)`),selector:q(e,`selector`),timeoutMs:Y(e,`timeoutMs`)});case`network`:return t.networkHandler({pageId:$(e,n,`browser(network)`),subAction:Z(e,`subAction`,xt,`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`,St,`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`,Ct,`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:Dt(e,`accept`,`browser(dialog)`),promptText:q(e,`promptText`)});case`session`:{let r=e.cookies;return t.sessionHandler({action:Z(e,`sessionAction`,wt,`browser(session)`),pageId:kt(e,n),confirm:J(e,`confirm`),cookies:r,name:q(e,`name`),storageType:Q(e,`storageType`,[`localStorage`,`sessionStorage`],`browser(session)`),storageKey:q(e,`storageKey`),storageValue:q(e,`storageValue`)})}}}function jt(e,t){let n=Ee(t),r={openHandler:ut(n),readHandler:dt(n),actHandler:Oe(n),navigateHandler:$e(n),networkHandler:lt(n),consoleHandler:Me(n),fetchHandler:Qe(n),evalHandler:Fe(n),diffHandler:Pe(n),screenshotHandler:ft(n),dialogHandler:Ne(n),sessionHandler:ht(n)};e.registerTool(`browser`,{title:`Browser Automation`,description:`Unified browser automation tool. Actions:
19
+ `).trim()},r);return B(e||`empty page`,{pageId:t,mode:o,selector:r,markdown:e})}case`text`:{let e=await i.locator(a).innerText();return B(e||`empty page`,{pageId:t,mode:o,selector:r,text:e})}default:{let e=await i.locator(a).ariaSnapshot();return B(e||`empty page`,{pageId:t,mode:o,selector:r,snapshot:e})}}}}u.string().describe(`Tracked browser page identifier`),u.string().optional().describe(`Optional target ref alias`),u.string().optional().describe(`Optional target selector`),u.boolean().optional().describe(`Capture the full page when no selector is provided`),u.boolean().optional().describe(`Mask password fields before capture`),u.object({x:u.number(),y:u.number(),width:u.number(),height:u.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),u.enum([`png`,`jpeg`]).optional().describe(`Image format (default: png)`),u.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`);function mt(e){return async({pageId:t,ref:n,selector:r,fullPage:i,redactPasswords:a,clip:o,format:s,quality:c})=>{let l=A(e),u=l.session.getPage(t),d=a??e.redactPasswordFieldsInScreenshots,f=[];d&&(f=await u.evaluate(()=>{let e=globalThis.document;return Array.from(e.querySelectorAll(`input[type="password"]`)).map((e,t)=>{let n=e,r=`data-aikit-password-mask-${t}`;return n.setAttribute(r,n.value),n.value=`***`,r})}));try{let e={};s&&(e.type=s),s===`jpeg`&&c!==void 0&&(e.quality=c);let a=r??n?await u.locator(V({ref:n,selector:r},`browser_screenshot`)).screenshot(e):await u.screenshot({...e,...o?{clip:o}:{fullPage:i??!1}});return l.resetIdleTimer(),B(`Screenshot captured`,{pageId:t,base64:a.toString(`base64`)})}finally{d&&f.length>0&&await u.evaluate(e=>{let t=globalThis.document;for(let n of e){let e=t.querySelector(`input[${n}]`);e&&(e.value=e.getAttribute(n)??``,e.removeAttribute(n))}},f)}}}const ht=u.enum([`Lax`,`None`,`Strict`]),gt=u.enum([`localStorage`,`sessionStorage`]);u.enum([`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`]).describe(`Session sub-action`),u.string().optional().describe(`Page ID (required for close, storage actions)`),u.boolean().optional().describe(`Explicit confirmation for cookie operations`),u.array(u.object({name:u.string(),value:u.string(),url:u.string().optional(),domain:u.string().optional(),path:u.string().optional(),expires:u.number().optional(),httpOnly:u.boolean().optional(),secure:u.boolean().optional(),sameSite:ht.optional()})).optional().describe(`Cookies to set (for set-cookie action)`),u.string().optional().describe(`Cookie name (for delete-cookie action)`),gt.optional().describe(`Storage type for storage actions`),u.string().optional().describe(`Storage key to get/set`),u.string().optional().describe(`Storage value to set`);function _t(e){return async({action:t,pageId:n,confirm:r,cookies:i,name:a,storageType:o,storageKey:s,storageValue:c})=>{let l=A(e);if(t===`list`){let e=l.session.listPages();return B(JSON.stringify(e,null,2),{pages:e})}if(t===`close`){if(!n)throw Error(`browser_session(close) requires pageId`);return await l.session.removePage(n),l.resetIdleTimer(),B(`ok`,{ok:!0,pageId:n})}if(t===`set-cookie`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);if(!i?.length)throw Error(`cookies array required for set-cookie`);return await l.getContext().addCookies(i),l.resetIdleTimer(),B(`Set ${i.length} cookie(s)`,{ok:!0,count:i.length})}if(t===`delete-cookie`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);if(!a)throw Error(`name required for delete-cookie`);return await l.getContext().clearCookies({name:a}),l.resetIdleTimer(),B(`Deleted cookie: ${a}`,{ok:!0,name:a})}if(t===`clear-cookies`){let e=N(!!r);if(!e.allowed)throw Error(e.reason??`Cookie access denied`);return await l.getContext().clearCookies(),l.resetIdleTimer(),B(`All cookies cleared`,{ok:!0})}if(t===`get-storage`){if(!n)throw Error(`pageId required for get-storage`);if(!o)throw Error(`storageType required for get-storage`);let e=await l.session.getPage(n).evaluate(({type:e,key:t})=>{let n=e===`localStorage`?localStorage:sessionStorage;if(t)return n.getItem(t);let r={};for(let e=0;e<n.length;e+=1){let t=n.key(e);t&&(r[t]=n.getItem(t)||``)}return r},{type:o,key:s});return l.resetIdleTimer(),B(s?`${o}.${s} = ${String(e)}`:`${o}: ${JSON.stringify(e)}`,{storageType:o,key:s,data:e})}if(t===`set-storage`){if(!n)throw Error(`pageId required for set-storage`);if(!o)throw Error(`storageType required for set-storage`);if(!s)throw Error(`storageKey required for set-storage`);if(c===void 0)throw Error(`storageValue required for set-storage`);return await l.session.getPage(n).evaluate(({type:e,key:t,value:n})=>{(e===`localStorage`?localStorage:sessionStorage).setItem(t,n)},{type:o,key:s,value:c}),l.resetIdleTimer(),B(`Set ${o}.${s}`,{ok:!0,storageType:o,key:s})}if(t===`clear-storage`){if(!n)throw Error(`pageId required for clear-storage`);if(!o)throw Error(`storageType required for clear-storage`);return await l.session.getPage(n).evaluate(e=>{(e===`localStorage`?localStorage:sessionStorage).clear()},o),l.resetIdleTimer(),B(`Cleared ${o}`,{ok:!0,storageType:o})}let u=N(!!r);if(!u.allowed)throw Error(u.reason??`Cookie access denied`);let d=await l.getContext().cookies();return l.resetIdleTimer(),B(JSON.stringify(d,null,2),{cookies:d})}}const vt=[`open`,`batch`,`read`,`act`,`navigate`,`network`,`console`,`fetch`,`eval`,`diff`,`screenshot`,`dialog`,`session`],yt=[`ui`,`headless`],bt=[`load`,`domcontentloaded`,`networkidle`],G=[`click`,`type`,`press`,`hover`,`drag`,`select`,`scroll`,`upload`],xt=[`back`,`forward`,`reload`,`waitFor`],St=[`enable`,`get`,`clear`,`export-har`],Ct=[`enable`,`get`,`clear`],wt=[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`],Tt=[`list`,`close`,`cookies`,`set-cookie`,`delete-cookie`,`clear-cookies`,`get-storage`,`set-storage`,`clear-storage`],Et={action:u.enum(vt).describe(`Browser action to perform`),pageId:u.string().optional().describe(`Tracked browser page identifier`),label:u.string().optional().describe(`Human-readable label for the page (used as alternative to pageId)`),url:u.string().url().optional().describe(`URL to open or navigate to`),mode:u.enum(yt).optional().describe(`Browser launch mode (open only)`),forceNew:u.boolean().optional().describe(`Reserved for future tab reuse`),autoDialog:u.boolean().optional().describe(`Auto-accept alert/beforeunload dialogs (default: true). Set false to handle all dialogs manually.`),waitUntil:u.enum(bt).optional().describe(`Navigation readiness event`),kind:u.enum(G).optional().describe(`Interaction kind (act only)`),ref:u.string().optional().describe(`Target ref alias`),selector:u.string().optional().describe(`Playwright selector`),element:u.string().optional().describe(`Human-readable element label (resolved via Playwright text selector). Prefer selector for precision.`),text:u.string().optional().describe(`Text to type`),key:u.string().optional().describe(`Key to press`),value:u.string().optional().describe(`Option value or drag target`),fromRef:u.string().optional().describe(`Drag source ref`),fromSelector:u.string().optional().describe(`Drag source selector`),toRef:u.string().optional().describe(`Drag target ref`),toSelector:u.string().optional().describe(`Drag target selector`),type:u.enum(xt).optional().describe(`Navigation type`),subAction:u.enum(St).optional().describe(`Network sub-action: enable, get, clear, or export-har`),code:u.string().optional().describe(`JavaScript expression or IIFE evaluated in page context. Wrapped in Function("return (<code>)"). Multi-statement: use (() => { ...; return result; })(). No bare return or top-level semicolons.`),timeoutMs:u.number().min(1).max(6e4).optional().describe(`Timeout in milliseconds`),filter:u.object({resourceTypes:u.array(u.string()).optional(),urlPattern:u.string().optional(),excludeUrls:u.array(u.string()).optional()}).optional().describe(`Network capture filter for resource types and URL patterns`),showSensitive:u.boolean().optional().describe(`Include sensitive headers instead of redacting them`),includeBody:u.boolean().optional().describe(`Include truncated request bodies in captured entries`),bufferSize:u.number().int().min(1).max(1e4).optional().describe(`Buffer capacity (1-10000, default varies by action)`),consoleSubAction:u.enum(Ct).optional().describe(`Console sub-action: enable, get, or clear`),level:u.string().optional().describe(`Filter console entries by level (log/info/warn/error/debug)`),fetchUrl:u.string().optional().describe(`URL for fetch action (http/https only). Uses page cookies/session.`),fetchMethod:u.enum(wt).optional().describe(`HTTP method for fetch action (default: GET)`),fetchHeaders:u.record(u.string(),u.string()).optional().describe(`Custom headers for fetch action`),fetchBody:u.string().optional().describe(`Request body for fetch action (POST/PUT/PATCH)`),includeResponseHeaders:u.boolean().optional().describe(`Include response headers in fetch output (default: true)`),fullPage:u.boolean().optional().describe(`Capture full page`),redactPasswords:u.boolean().optional().describe(`Mask password fields`),readMode:u.enum([`snapshot`,`dom`,`markdown`,`text`]).optional().describe(`Extraction mode for read action: snapshot (ARIA tree), dom (HTML), markdown (clean MD), text (plain text)`),clip:u.object({x:u.number(),y:u.number(),width:u.number(),height:u.number()}).optional().describe(`Capture a specific page region { x, y, width, height }`),format:u.enum([`png`,`jpeg`]).optional().describe(`Screenshot image format (default: png)`),quality:u.number().min(0).max(100).optional().describe(`JPEG quality 0-100 (only for jpeg format)`),cookies:u.array(u.object({name:u.string(),value:u.string(),url:u.string().optional(),domain:u.string().optional(),path:u.string().optional(),expires:u.number().optional(),httpOnly:u.boolean().optional(),secure:u.boolean().optional(),sameSite:u.enum([`Lax`,`None`,`Strict`]).optional()})).optional().describe(`Cookies to set (for session set-cookie action)`),name:u.string().optional().describe(`Cookie name for delete-cookie action`),storageType:u.enum([`localStorage`,`sessionStorage`]).optional().describe(`Storage type for get/set/clear-storage actions`),storageKey:u.string().optional().describe(`Storage key to get or set`),storageValue:u.string().optional().describe(`Value to set in storage`),accept:u.boolean().optional().describe(`Accept or dismiss dialog`),promptText:u.string().optional().describe(`Text for prompt dialog`),sessionAction:u.enum(Tt).optional().describe(`Session sub-action (session only)`),confirm:u.boolean().optional().describe(`Explicit confirmation for cookie export`),steps:u.array(u.record(u.string(),u.unknown())).optional().describe(`Array of action steps for batch execution. Each step is an object with action + action-specific params.`)};function Dt(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 Ot(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 kt(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(!Dt(i,n))throw Error(`${r} requires ${t}`);return i}function Q(e,t,n,r){let i=e[t];if(i!==void 0){if(!Dt(i,n))throw Error(`${r} received invalid ${t}`);return i}}function At(e,t){let n=q(e,`pageId`);if(n)return A(t).session.resolvePageId(n)}function $(e,t,n){let r=q(e,`pageId`);if(!r)throw Error(`${n} requires pageId`);return A(t).session.resolvePageId(r)}async function jt(e,t,n){switch(Z(e,`action`,vt,`browser`)){case`open`:return t.openHandler({url:K(e,`url`,`browser(open)`),mode:Q(e,`mode`,yt,`browser(open)`),forceNew:J(e,`forceNew`),label:q(e,`label`),autoDialog:J(e,`autoDialog`),waitUntil:Q(e,`waitUntil`,bt,`browser(open)`)});case`batch`:{let r=kt(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 jt(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 B(`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`,G,`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`,xt,`browser(navigate)`),selector:q(e,`selector`),timeoutMs:Y(e,`timeoutMs`)});case`network`:return t.networkHandler({pageId:$(e,n,`browser(network)`),subAction:Z(e,`subAction`,St,`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`,Ct,`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`,wt,`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:Ot(e,`accept`,`browser(dialog)`),promptText:q(e,`promptText`)});case`session`:{let r=e.cookies;return t.sessionHandler({action:Z(e,`sessionAction`,Tt,`browser(session)`),pageId:At(e,n),confirm:J(e,`confirm`),cookies:r,name:q(e,`name`),storageType:Q(e,`storageType`,[`localStorage`,`sessionStorage`],`browser(session)`),storageKey:q(e,`storageKey`),storageValue:q(e,`storageValue`)})}}}function Mt(e,t){let n=De(t),r={openHandler:ft(n),readHandler:pt(n),actHandler:ke(n),navigateHandler:tt(n),networkHandler:dt(n),consoleHandler:Ne(n),fetchHandler:et(n),evalHandler:Ie(n),diffHandler:Fe(n),screenshotHandler:mt(n),dialogHandler:Pe(n),sessionHandler:_t(n)};e.registerTool(`browser`,{title:`Browser Automation`,description:`Unified browser automation tool. Actions:
19
20
  - open: Launch a browser page (url required, mode/waitUntil optional)
20
21
  - batch: Execute multiple browser actions sequentially (steps required)
21
22
  - read: Get accessibility snapshot of a page (pageId required)
@@ -28,4 +29,4 @@ import{createRequire as e}from"node:module";import{createHash as t,randomUUID as
28
29
  - diff: Compare the current accessibility snapshot to the previous one (pageId required)
29
30
  - screenshot: Capture page or element screenshot (pageId required)
30
31
  - dialog: Accept or dismiss next browser dialog (pageId + accept required)
31
- - session: List pages, close a page, or export cookies (sessionAction required)`,inputSchema:Tt,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},async e=>At(e,r,n))}export{O as BrowserEngine,D as DEFAULT_BROWSER_CONFIG,E as SessionRegistry,ge as autoSelectMode,_e as closeEngine,he as detectDisplayAvailable,me as ensureBrowserInstalled,C as getDefaultBrowsersPath,A as getEngine,T as getLaunchArgs,pe as isBrowserInstalled,N as isCookieAccessAllowed,M as isUrlAllowed,Ce as redactPasswordFields,jt as registerBrowserTools,w as resolveBrowsersPath,P as validateEvalResult};
32
+ - session: List pages, close a page, or export cookies (sessionAction required)`,inputSchema:Et,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},async e=>jt(e,r,n))}export{O as BrowserEngine,D as DEFAULT_BROWSER_CONFIG,_e as SessionRegistry,he as autoSelectMode,ve as closeEngine,me as detectDisplayAvailable,E as ensureBrowserInstalled,C as getDefaultBrowsersPath,A as getEngine,ge as getLaunchArgs,T as isBrowserInstalled,N as isCookieAccessAllowed,M as isUrlAllowed,we as redactPasswordFields,Mt as registerBrowserTools,w as resolveBrowsersPath,P as validateEvalResult};