@vpxa/aikit 0.1.334 → 0.1.335

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.334",
3
+ "version": "0.1.335",
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",
@@ -2130,8 +2130,8 @@ main > * {
2130
2130
  `)}function Ur(e,t){if(e.length===0)return``;let r=` nonce="${n(t)}"`;return e.map(e=>{let t=e.initScript?` <script${r}>\n${e.initScript}\n <\/script>\n`:``;if(e.inlineSource)return`${t} <script${r}>${e.inlineSource.replace(/<\/script/gi,`<\\/script`)}${e.onload?`\n;${e.onload}`:``}<\/script>`;if(!e.src)return t.trimEnd();let i=[];return i.push(`${t} <script src="${n(e.src)}"${r}><\/script>`),e.fallback?i.push(` <script${r}>`,`document.currentScript.previousElementSibling.addEventListener('error',function(){`,`var f=document.createElement('script');`,`f.src='${n(e.fallback)}';`,e.onload?`f.onload=function(){${e.onload}};`:``,`document.head.appendChild(f);`,`});`,`<\/script>`):e.onload&&i.push(` <script${r}>`,`document.currentScript.previousElementSibling.addEventListener('load',function(){${e.onload}});`,`<\/script>`),i.join(`
2131
2131
  `)}).join(`
2132
2132
  `)}function Wr(e,t){let r=JSON.stringify(e),i=Gr(),a=Kr(zr());return[` <script${` nonce="${n(t)}"`}>`,` (() => {`,` const preferredTheme = ${r};`,` const storageKey = "aikit-theme-mode";`,` const html = document.documentElement;`,` const toolbox = {`,` container: () => document.querySelector(".aikit-toolbox"),`,` button: () => document.querySelector(".aikit-toolbox-toggle"),`,` menu: () => document.querySelector(".aikit-toolbox-menu"),`,` firstItem: () => document.querySelector(".aikit-toolbox-item"),`,` };`,` const systemTheme = () =>`,` window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches`,` ? "dark"`,` : "light";`,` const readStoredTheme = () => {`,` try {`,` const stored = localStorage.getItem("aikit-theme-mode");`,` return stored === "light" || stored === "dark" ? stored : null;`,` } catch (_error) {`,` return null;`,` }`,` };`,` const resolvedTheme = () => html.getAttribute("data-theme") || readStoredTheme() || systemTheme();`,` const setToolboxOpen = (open, options = {}) => {`,` const button = toolbox.button();`,` const menu = toolbox.menu();`,` if (!button || !menu) return;`,` menu.hidden = !open;`,` button.setAttribute("aria-expanded", String(open));`,` if (open) {`,` if (options.focusItem) toolbox.firstItem()?.focus();`,` } else if (options.restoreFocus) {`,` button.focus();`,` }`,` };`,` const inlineComputedStyles = (source, clone) => {`,` if (!(source instanceof Element) || !(clone instanceof Element)) return;`,` const computed = window.getComputedStyle(source);`,` const cssText = Array.from(computed)`,` .map((name) => {`,` const value = computed.getPropertyValue(name);`,` const priority = computed.getPropertyPriority(name);`,' return `${name}:${value}${priority ? " !important" : ""};`;',` })`,` .join("");`,` clone.setAttribute("style", cssText);`,` for (let index = 0; index < source.children.length; index += 1) {`,` inlineComputedStyles(source.children[index], clone.children[index]);`,` }`,` };`,i,` const updateToggle = (theme) => {`,` const button = document.querySelector(".aikit-theme-toggle");`,` const nextTheme = theme === "dark" ? "light" : "dark";`,` if (button) {`,` button.setAttribute("aria-label", "Switch to " + nextTheme + " theme");`,` button.setAttribute("aria-pressed", String(theme === "dark"));`,` }`,` };`,` const applyTheme = (theme, persist = true) => {`,` html.setAttribute("data-theme", theme);`,` if (persist) {`,` try {`,` localStorage.setItem("aikit-theme-mode", theme);`,` } catch (_error) {`,` // Ignore storage failures.`,` }`,` }`,` updateToggle(theme);`,` };`,` if (preferredTheme === "light" || preferredTheme === "dark") {`,` applyTheme(preferredTheme, false);`,` } else {`,` applyTheme(readStoredTheme() || systemTheme(), false);`,` }`,` window.toggleTheme = () => {`,` applyTheme(resolvedTheme() === "dark" ? "light" : "dark");`,` };`,a,` document.addEventListener("click", (event) => {`,` const themeToggle = event.target?.closest?.(".aikit-theme-toggle");`,` if (themeToggle) { window.toggleTheme(); }`,` const toolboxToggle = event.target?.closest?.(".aikit-toolbox-toggle");`,` if (toolboxToggle) { window.toggleToolbox(); }`,` const chromeAction = event.target?.closest?.("[data-shared-chrome-action]");`,` if (chromeAction) {`,` const actionId = chromeAction.getAttribute("data-shared-chrome-action");`,` if (actionId === "copy-image") { window.screenshotPage(); }`,` if (actionId === "download-image") { window.downloadPng(); }`,` }`,` const container = toolbox.container();`,` if (!container) return;`,` const target = event.target;`,` if (target instanceof Node && container.contains(target)) return;`,` setToolboxOpen(false);`,` });`,` document.addEventListener("keydown", (event) => {`,` if (event.key === "Escape") {`,` setToolboxOpen(false, { restoreFocus: true });`,` return;`,` }`,` if ((event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") && event.target === toolbox.button()) {`,` event.preventDefault();`,` setToolboxOpen(true, { focusItem: true });`,` }`,` });`,` if (preferredTheme === "auto" && window.matchMedia) {`,` const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");`,` mediaQuery.addEventListener("change", () => {`,` if (readStoredTheme()) return;`,` applyTheme(systemTheme(), false);`,` });`,` }`,` })();`,` <\/script>`].join(`
2133
- `)}function Gr(){return[` const captureDocumentAsPng = async () => {`,` try {`,` return await captureDomViaSvg();`,` } catch (_err) {`,` // SVG foreignObject failed (tainted canvas or ForeignObject error).`,` // Fall back to server-side capture via agent-browser.`,` // We do NOT try html2canvas here -- Edge's Tracking Prevention`,` // blocks CDN script loading, and modern CSS color functions can`,` // cause parse errors. The server method (agent-browser isolated`,` // browser) is more reliable for this fallback path.`,` console.warn("SVG capture failed, falling back to server:", _err);`,` }`,` throw new Error("Client capture failed, use server fallback");`,` };`,` const captureDomViaSvg = async () => {`,` const width = Math.max(`,` document.documentElement.scrollWidth,`,` document.documentElement.clientWidth,`,` document.body ? document.body.scrollWidth : 0,`,` );`,` const height = Math.max(`,` document.documentElement.scrollHeight,`,` document.documentElement.clientHeight,`,` document.body ? document.body.scrollHeight : 0,`,` );`,` const scale = window.devicePixelRatio || 1;`,` const canvas = document.createElement("canvas");`,` canvas.width = Math.max(1, Math.ceil(width * scale));`,` canvas.height = Math.max(1, Math.ceil(height * scale));`,` const context = canvas.getContext("2d");`,` if (!context) throw new Error("Canvas context unavailable");`,` context.scale(scale, scale);`,` const clone = document.documentElement.cloneNode(true);`,` if (!(clone instanceof Element)) throw new Error("Document clone failed");`,` clone.setAttribute("xmlns", "http://www.w3.org/1999/xhtml");`,` clone.querySelectorAll("script").forEach((node) => node.remove());`,` inlineComputedStyles(document.documentElement, clone);`,' const svgMarkup = [`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`, `<foreignObject width="100%" height="100%">${new XMLSerializer().serializeToString(clone)}</foreignObject>`, "</svg>"].join("");',` const svgBlob = new Blob([svgMarkup], { type: "image/svg+xml;charset=utf-8" });`,` const objectUrl = URL.createObjectURL(svgBlob);`,` try {`,` await new Promise((resolve, reject) => {`,` const image = new Image();`,` image.onload = () => {`,` context.drawImage(image, 0, 0, width, height);`,` resolve(undefined);`,` };`,` image.onerror = () => reject(new Error("ForeignObject render failed"));`,` image.src = objectUrl;`,` });`,` } finally {`,` URL.revokeObjectURL(objectUrl);`,` }`,` const blob = await new Promise((resolve) => canvas.toBlob(resolve, "image/png"));`,` if (!blob || blob.type !== "image/png") throw new Error("PNG export failed");`,` return blob;`,` };`,` const ensureHtml2canvas = async () => {`,` if (typeof window.html2canvas === "function") return;`,` if (typeof window.html2canvas_pro === "function") return;`,` var loaded = false;`,` var urls = [`,` "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.5/dist/html2canvas.min.js",`,` "https://unpkg.com/html2canvas-pro@1.5.5/dist/html2canvas.min.js",`,` ];`,` for (var i = 0; i < urls.length; i++) {`,` try {`,` await new Promise(function(resolve, reject) {`,` var s = document.createElement("script");`,` s.src = urls[i];`,` s.onload = resolve;`,` s.onerror = reject;`,` document.head.appendChild(s);`,` });`,` loaded = true;`,` break;`,` } catch (_e) {`,` console.warn("html2canvas CDN fallback", i, _e);`,` }`,` }`,` if (!loaded) throw new Error("Failed to load html2canvas from any CDN");`,` };`,` const captureViaHtml2canvas = async () => {`,` var h2c = (typeof window.html2canvas_pro === "function") ? window.html2canvas_pro :`,` (typeof window.html2canvas === "function") ? window.html2canvas : null;`,` if (!h2c) throw new Error("html2canvas not available");`,` var bg = document.documentElement ? getComputedStyle(document.documentElement).backgroundColor : "";`,` var canvas = await h2c(document.documentElement, {`,` useCORS: true,`,` allowTaint: false,`,` scale: window.devicePixelRatio || 1,`,` logging: false,`,` backgroundColor: bg || "#ffffff",`,` });`,` var blob = await new Promise(function(resolve) { canvas.toBlob(resolve, "image/png"); });`,` if (!blob || blob.type !== "image/png") throw new Error("html2canvas PNG export failed");`,` return blob;`,` };`,` const captureClipboardPng = async () => {`,` console.warn("Server Copy as Image fallback request started", "/__aikit_clipboard.png");`,` const response = await fetch("/__aikit_clipboard.png", { method: "POST", cache: "no-store" });`,` if (!response.ok) {`,` const body = await response.text().catch(() => "");`,` throw new Error(`,` body`,` ? "Server clipboard capture unavailable (" + response.status + " " + response.statusText + "): " + body`,` : "Server clipboard capture unavailable (" + response.status + " " + response.statusText + ")",`,` );`,` }`,` const blob = await response.blob();`,` if (!blob || blob.type !== "image/png") {`,` throw new Error("Server clipboard capture failed (" + (blob?.type || "unknown content-type") + ")");`,` }`,` return blob;`,` };`,` const showCopyStatus = (message, tone = "info") => {`,` let status = document.querySelector(".aikit-copy-status");`,` if (!status) {`,` status = document.createElement("div");`,` status.className = "aikit-copy-status";`,` status.setAttribute("role", "status");`,` status.setAttribute("aria-live", "polite");`,` document.body.appendChild(status);`,` }`,` status.dataset.tone = tone;`,` status.textContent = message;`,` window.clearTimeout(status.__aikitCopyTimer);`,` status.__aikitCopyTimer = window.setTimeout(() => { status.remove(); }, 4000);`,` };`,` const blobToDataUrl = (blob) =>`,` new Promise((resolve, reject) => {`,` const reader = new FileReader();`,` reader.onload = () => resolve(String(reader.result));`,` reader.onerror = () => reject(reader.error || new Error("Image conversion failed"));`,` reader.readAsDataURL(blob);`,` });`,` const copyImageWithLegacyClipboard = async (blob) => {`,` const dataUrl = await blobToDataUrl(blob);`,` let copied = false;`,` const onCopy = (event) => {`,` const data = event.clipboardData;`,` if (!data) return;`,` event.preventDefault();`,` try {`,` if (data.items && typeof File !== "undefined") {`,` data.items.add(new File([blob], "aikit-present.png", { type: "image/png" }));`,` copied = true;`,` }`,` } catch (_error) {`,` // Some hosts reject binary clipboard items in copy events; keep the HTML fallback below.`,` }`,' data.setData("text/html", `<img alt="AI Kit Present" src="${dataUrl}">`);',` data.setData("text/plain", "AI Kit Present image");`,` copied = true;`,` };`,` document.addEventListener("copy", onCopy, { once: true });`,` try {`,` copied = document.execCommand("copy") || copied;`,` } finally {`,` document.removeEventListener("copy", onCopy);`,` }`,` if (!copied) throw new Error("Legacy clipboard copy unavailable");`,` };`,` const writeImageToClipboard = async (blob) => {`,` try {`,` if (!navigator.clipboard?.write || typeof ClipboardItem === "undefined") {`,` throw new Error("Async image clipboard is unavailable in this host.");`,` }`,` await navigator.clipboard.write([new ClipboardItem({ "image/png": blob })]);`,` } catch (clipboardError) {`,` console.warn("Async Clipboard image write failed", clipboardError);`,` await copyImageWithLegacyClipboard(blob);`,` }`,` };`,` const downloadImage = async (blob, filename = "aikit-present.png") => {`,` const url = URL.createObjectURL(blob);`,` const link = document.createElement("a");`,` link.href = url;`,` link.download = filename;`,` document.body.appendChild(link);`,` link.click();`,` link.remove();`,` setTimeout(() => URL.revokeObjectURL(url), 10000);`,` };`].join(`
2134
- `)}function Kr(e){return[` window.toggleToolbox = () => {`,` const menu = toolbox.menu();`,` setToolboxOpen(Boolean(menu?.hidden), { focusItem: Boolean(menu?.hidden) });`,` };`,` window.downloadPng = async () => {`,` const scrollX = window.scrollX;`,` const scrollY = window.scrollY;`,` setToolboxOpen(false);`,` window.scrollTo(0, 0);`,` await new Promise((resolve) => window.requestAnimationFrame(() => resolve(undefined)));`,` let blob;`,` try {`,` try {`,` blob = await captureDocumentAsPng();`,` } catch (captureError) {`,` console.warn("Server PNG capture unavailable", captureError);`,` blob = await captureClipboardPng();`,` }`,` if (!blob) throw new Error("Screenshot capture returned no image");`,` const timestamp = new Date().toISOString().replace(/[.:]/g, "-");`," await downloadImage(blob, `aikit-present-${timestamp}.png`);",` showCopyStatus("Downloaded image.");`,` } catch (_error) {`,` console.warn("Download Image failed", _error);`,` showCopyStatus("Screenshot capture failed. Try using your browser's screenshot tool.", "error");`,` } finally {`,` window.scrollTo(scrollX, scrollY);`,` }`,` };`,` window.screenshotPage = async () => {`,` const scrollX = window.scrollX;`,` const scrollY = window.scrollY;`,` setToolboxOpen(false);`,` window.scrollTo(0, 0);`,` await new Promise((resolve) => window.requestAnimationFrame(() => resolve(undefined)));`,` let blob;`,` try {`,` try {`,` blob = await captureDocumentAsPng();`,` } catch (captureError) {`,` console.warn(${JSON.stringify(e.fallbackToServerCaptureMessage)}, captureError);`,` blob = await captureClipboardPng();`,` }`,` await writeImageToClipboard(blob);`,` showCopyStatus(${JSON.stringify(e.clipboardSuccessMessage)});`,` } catch (_error) {`,` console.warn("Copy as Image failed", _error);`,` if (blob) {`,` try {`,` const timestamp = new Date().toISOString().replace(/[.:]/g, "-");`," await downloadImage(blob, `aikit-present-${timestamp}.png`);",` showCopyStatus(${JSON.stringify(`Clipboard blocked — image downloaded instead.`)});`,` } catch (_downloadError) {`,` showCopyStatus(${JSON.stringify(e.blockedClipboardMessage)}, "error");`,` }`,` } else {`,` showCopyStatus(${JSON.stringify(`Screenshot capture failed — both client and server capture methods returned no image.`)}, "error");`,` }`,` } finally {`,` window.scrollTo(scrollX, scrollY);`,` }`,` };`].join(`
2133
+ `)}function Gr(){return[` const captureDocumentAsPng = async () => {`,` try {`,` return await captureDomViaSvg();`,` } catch (_err) {`,` // SVG foreignObject failed (tainted canvas or ForeignObject error).`,` // Fall back to server-side capture via agent-browser.`,` // We do NOT try html2canvas here -- Edge's Tracking Prevention`,` // blocks CDN script loading, and modern CSS color functions can`,` // cause parse errors. The server method (agent-browser isolated`,` // browser) is more reliable for this fallback path.`,` console.warn("SVG capture failed, falling back to server:", _err);`,` }`,` throw new Error("Client capture failed, use server fallback");`,` };`,` const captureDomViaSvg = async () => {`,` const width = Math.max(`,` document.documentElement.scrollWidth,`,` document.documentElement.clientWidth,`,` document.body ? document.body.scrollWidth : 0,`,` );`,` const height = Math.max(`,` document.documentElement.scrollHeight,`,` document.documentElement.clientHeight,`,` document.body ? document.body.scrollHeight : 0,`,` );`,` const scale = window.devicePixelRatio || 1;`,` const canvas = document.createElement("canvas");`,` canvas.width = Math.max(1, Math.ceil(width * scale));`,` canvas.height = Math.max(1, Math.ceil(height * scale));`,` const context = canvas.getContext("2d");`,` if (!context) throw new Error("Canvas context unavailable");`,` context.scale(scale, scale);`,` const clone = document.documentElement.cloneNode(true);`,` if (!(clone instanceof Element)) throw new Error("Document clone failed");`,` clone.setAttribute("xmlns", "http://www.w3.org/1999/xhtml");`,` clone.querySelectorAll("script").forEach((node) => node.remove());`,` inlineComputedStyles(document.documentElement, clone);`,' const svgMarkup = [`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`, `<foreignObject width="100%" height="100%">${new XMLSerializer().serializeToString(clone)}</foreignObject>`, "</svg>"].join("");',` const svgBlob = new Blob([svgMarkup], { type: "image/svg+xml;charset=utf-8" });`,` const objectUrl = URL.createObjectURL(svgBlob);`,` try {`,` await new Promise((resolve, reject) => {`,` const image = new Image();`,` image.onload = () => {`,` context.drawImage(image, 0, 0, width, height);`,` resolve(undefined);`,` };`,` image.onerror = () => reject(new Error("ForeignObject render failed"));`,` image.src = objectUrl;`,` });`,` } finally {`,` URL.revokeObjectURL(objectUrl);`,` }`,` const blob = await new Promise((resolve) => canvas.toBlob(resolve, "image/png"));`,` if (!blob || blob.type !== "image/png") throw new Error("PNG export failed");`,` return blob;`,` };`,` const ensureHtml2canvas = async () => {`,` if (typeof window.html2canvas === "function") return;`,` if (typeof window.html2canvas_pro === "function") return;`,` var loaded = false;`,` var urls = [`,` "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.5/dist/html2canvas.min.js",`,` "https://unpkg.com/html2canvas-pro@1.5.5/dist/html2canvas.min.js",`,` ];`,` for (var i = 0; i < urls.length; i++) {`,` try {`,` await new Promise(function(resolve, reject) {`,` var s = document.createElement("script");`,` s.src = urls[i];`,` s.onload = resolve;`,` s.onerror = reject;`,` document.head.appendChild(s);`,` });`,` loaded = true;`,` break;`,` } catch (_e) {`,` console.warn("html2canvas CDN fallback", i, _e);`,` }`,` }`,` if (!loaded) throw new Error("Failed to load html2canvas from any CDN");`,` };`,` const captureViaHtml2canvas = async () => {`,` var h2c = (typeof window.html2canvas_pro === "function") ? window.html2canvas_pro :`,` (typeof window.html2canvas === "function") ? window.html2canvas : null;`,` if (!h2c) throw new Error("html2canvas not available");`,` var bg = document.documentElement ? getComputedStyle(document.documentElement).backgroundColor : "";`,` var canvas = await h2c(document.documentElement, {`,` useCORS: true,`,` allowTaint: false,`,` scale: window.devicePixelRatio || 1,`,` logging: false,`,` backgroundColor: bg || "#ffffff",`,` });`,` var blob = await new Promise(function(resolve) { canvas.toBlob(resolve, "image/png"); });`,` if (!blob || blob.type !== "image/png") throw new Error("html2canvas PNG export failed");`,` return blob;`,` };`,` const captureClipboardPng = async () => {`,` console.warn("Server Copy as Image fallback request started", "/__aikit_clipboard.png");`,` const response = await fetch("/__aikit_clipboard.png", { method: "POST", cache: "no-store" });`,` if (!response.ok) {`,` const body = await response.text().catch(() => "");`,` throw new Error(`,` body`,` ? "Server clipboard capture unavailable (" + response.status + " " + response.statusText + "): " + body`,` : "Server clipboard capture unavailable (" + response.status + " " + response.statusText + ")",`,` );`,` }`,` const blob = await response.blob();`,` if (!blob || blob.type !== "image/png") {`,` throw new Error("Server clipboard capture failed (" + (blob?.type || "unknown content-type") + ")");`,` }`,` return blob;`,` };`,` const showCopyStatus = (message, tone = "info") => {`,` let status = document.querySelector(".aikit-copy-status");`,` if (!status) {`,` status = document.createElement("div");`,` status.className = "aikit-copy-status";`,` status.setAttribute("role", "status");`,` status.setAttribute("aria-live", "polite");`,` document.body.appendChild(status);`,` }`,` status.dataset.tone = tone;`,` status.textContent = message;`,` window.clearTimeout(status.__aikitCopyTimer);`,` status.__aikitCopyTimer = window.setTimeout(() => { status.remove(); }, 4000);`,` };`,` const blobToDataUrl = (blob) =>`,` new Promise((resolve, reject) => {`,` const reader = new FileReader();`,` reader.onload = () => resolve(String(reader.result));`,` reader.onerror = () => reject(reader.error || new Error("Image conversion failed"));`,` reader.readAsDataURL(blob);`,` });`,` const copyImageWithLegacyClipboard = async (blob) => {`,` const dataUrl = await blobToDataUrl(blob);`,` let copied = false;`,` let imageSet = false;`,` const onCopy = (event) => {`,` const data = event.clipboardData;`,` if (!data) return;`,` event.preventDefault();`,` try {`,` if (data.items && typeof File !== "undefined") {`,` data.items.add(new File([blob], "aikit-present.png", { type: "image/png" }));`,` imageSet = true;`,` copied = true;`,` }`,` } catch (_error) {`,` // Some hosts reject binary clipboard items in copy events; keep the HTML fallback below.`,` }`,' data.setData("text/html", `<img alt="AI Kit Present" src="${dataUrl}">`);',` if (!imageSet) {`,` data.setData("text/plain", dataUrl);`,` }`,` copied = true;`,` };`,` document.addEventListener("copy", onCopy, { once: true });`,` try {`,` copied = document.execCommand("copy") || copied;`,` } finally {`,` document.removeEventListener("copy", onCopy);`,` }`,` if (!copied) throw new Error("Legacy clipboard copy unavailable");`,` };`,` const writeImageToClipboard = async (blob) => {`,` try {`,` if (!navigator.clipboard?.write || typeof ClipboardItem === "undefined") {`,` throw new Error("Async image clipboard is unavailable in this host.");`,` }`,` await navigator.clipboard.write([new ClipboardItem({ "image/png": blob })]);`,` } catch (clipboardError) {`,` console.warn("Async Clipboard image write failed", clipboardError);`,` await copyImageWithLegacyClipboard(blob);`,` }`,` };`,` const writeImageToClipboardViaServer = async (blob) => {`,` const response = await fetch("/__aikit_system_clipboard", {`,` method: "POST",`,` body: blob,`,` });`,` if (!response.ok) {`,` const text = await response.text().catch(() => "Unknown server error");`,` throw new Error("Server clipboard write failed: " + text);`,` }`,` };`,` const downloadImage = async (blob, filename = "aikit-present.png") => {`,` const url = URL.createObjectURL(blob);`,` const link = document.createElement("a");`,` link.href = url;`,` link.download = filename;`,` document.body.appendChild(link);`,` link.click();`,` link.remove();`,` setTimeout(() => URL.revokeObjectURL(url), 10000);`,` };`].join(`
2134
+ `)}function Kr(e){return[` window.toggleToolbox = () => {`,` const menu = toolbox.menu();`,` setToolboxOpen(Boolean(menu?.hidden), { focusItem: Boolean(menu?.hidden) });`,` };`,` window.downloadPng = async () => {`,` const scrollX = window.scrollX;`,` const scrollY = window.scrollY;`,` setToolboxOpen(false);`,` window.scrollTo(0, 0);`,` await new Promise((resolve) => window.requestAnimationFrame(() => resolve(undefined)));`,` let blob;`,` try {`,` try {`,` blob = await captureDocumentAsPng();`,` } catch (captureError) {`,` console.warn("Server PNG capture unavailable", captureError);`,` blob = await captureClipboardPng();`,` }`,` if (!blob) throw new Error("Screenshot capture returned no image");`,` const timestamp = new Date().toISOString().replace(/[.:]/g, "-");`," await downloadImage(blob, `aikit-present-${timestamp}.png`);",` showCopyStatus("Downloaded image.");`,` } catch (_error) {`,` console.warn("Download Image failed", _error);`,` showCopyStatus("Screenshot capture failed. Try using your browser's screenshot tool.", "error");`,` } finally {`,` window.scrollTo(scrollX, scrollY);`,` }`,` };`,` window.screenshotPage = async () => {`,` const scrollX = window.scrollX;`,` const scrollY = window.scrollY;`,` setToolboxOpen(false);`,` window.scrollTo(0, 0);`,` await new Promise((resolve) => window.requestAnimationFrame(() => resolve(undefined)));`,` let blob;`,` try {`,` try {`,` blob = await captureDocumentAsPng();`,` } catch (captureError) {`,` console.warn(${JSON.stringify(e.fallbackToServerCaptureMessage)}, captureError);`,` blob = await captureClipboardPng();`,` }`,` await writeImageToClipboard(blob);`,` showCopyStatus(${JSON.stringify(e.clipboardSuccessMessage)});`,` } catch (_error) {`,` console.warn("Copy as Image failed", _error);`,` if (blob) {`,` try {`,` await writeImageToClipboardViaServer(blob);`,` showCopyStatus(${JSON.stringify(`Copied image via server-side clipboard.`)});`,` } catch (_serverError) {`,` console.warn("Server clipboard write failed", _serverError);`,` try {`,` const timestamp = new Date().toISOString().replace(/[.:]/g, "-");`," await downloadImage(blob, `aikit-present-${timestamp}.png`);",` showCopyStatus(${JSON.stringify(`Clipboard blocked — image downloaded instead.`)});`,` } catch (_downloadError) {`,` showCopyStatus(${JSON.stringify(e.blockedClipboardMessage)}, "error");`,` }`,` }`,` } else {`,` showCopyStatus(${JSON.stringify(`Screenshot capture failed — both client and server capture methods returned no image.`)}, "error");`,` }`,` } finally {`,` window.scrollTo(scrollX, scrollY);`,` }`,` };`].join(`
2135
2135
  `)}function qr(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(`
2136
2136
  `)}function Jr(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=``;e.maxWidth?s+=` --aikit-max-width: ${e.maxWidth};\n`:e.layoutVariant===`wide`?(s+=` --aikit-max-width: 1400px;
2137
2137
  `,s+=` --aikit-max-width-wide: 1400px;
@@ -3102,7 +3102,7 @@ body {
3102
3102
  background: none;
3103
3103
  }
3104
3104
 
3105
- `);var wT=`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>`,TT=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>`,ET=Ti(),DT={kind:`shared-chrome-action`,id:`copy-image`,label:`Copy as Image`,icon:wT,onclick:`screenshotPage()`};function OT(){return typeof navigator<`u`&&typeof document<`u`&&!!navigator.clipboard?.write&&typeof window<`u`&&`ClipboardItem`in window}function kT(){return OT()?[DT]:[]}var AT=null,jT=!1;function MT(e,t={}){if(!AT)return;let{button:n,menu:r}=AT;r.hidden=!e,n.setAttribute(`aria-expanded`,String(e)),e&&t.focusItem?r.querySelector(`.${m.toolboxItem}`)?.focus():!e&&t.restoreFocus&&n.focus()}function NT(){jT||(jT=!0,document.addEventListener(`click`,e=>{if(!AT)return;let t=e.target;t instanceof Node&&AT.container.contains(t)||MT(!1)}),document.addEventListener(`keydown`,e=>{if(AT){if(e.key===`Escape`){MT(!1,{restoreFocus:!0});return}(e.key===`ArrowDown`||e.key===`Enter`||e.key===` `)&&e.target===AT.button&&(e.preventDefault(),MT(!0,{focusItem:!0}))}}))}function PT(e){if(NT(),e.length===0)return null;let t=Q(`div`,m.toolbox),n=Q(`button`,m.toolboxToggle),r=Q(`div`,m.toolboxMenu);n.type=`button`,n.setAttribute(`aria-label`,`Open tools menu`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.setAttribute(`aria-controls`,`aikit-toolbox-menu`),n.innerHTML=TT,n.addEventListener(`click`,()=>{MT(!!r.hidden,{focusItem:!!r.hidden})}),r.id=`aikit-toolbox-menu`,r.setAttribute(`role`,`menu`),r.hidden=!0;for(let t of e){if(t.id!==`copy-image`)continue;let e=Q(`button`,m.toolboxItem);e.type=`button`,e.setAttribute(`role`,`menuitem`),e.setAttribute(`aria-label`,t.label),e.dataset.sharedChromeAction=t.id,e.innerHTML=`<span aria-hidden="true">${t.icon}</span><span>${t.label}</span>`,e.addEventListener(`click`,()=>{MT(!1),HT()}),r.appendChild(e)}return r.childElementCount===0?null:(t.appendChild(n),t.appendChild(r),AT={button:n,container:t,menu:r},t)}function FT(e,t){let n=Q(`header`,m.header);n.appendChild(Q(`div`,m.brand,`AI KIT`));let r=Q(`div`,m.title);r.appendChild(Q(`span`,m.titleText,e)),t&&r.appendChild(Q(`span`,m.subtitle,t));let i=Q(`div`,m.actions),a=PT(kT());a&&i.appendChild(a),n.appendChild(r),n.appendChild(i),$.appendChild(n)}function IT(){if(CT){let e=CT.getStore().getState().annotations.length;e>0&&console.warn(`[Annotation] ${e} annotation(s) discarded on view reset. Submit feedback before the view refreshes to preserve your work.`),CT.destroy()}CT=null,bT?.(),bT=null,$T?.destroy&&$T.destroy(),$T=null}function LT(e,t){let n=new Map,r=e=>{n.set(o(e.id),e)};for(let e of t??[])r(e);for(let t of e)if(!(t.type!==`actions`||!Array.isArray(t.value)))for(let e of t.value)e&&typeof e==`object`&&`id`in e&&r(e);return n}function RT(e,t,n){let r=LT(t,n);bT=Dw(e,t,(e,t)=>{let n=r.get(e)??{type:t===void 0?`button`:`select`,id:e,label:e};if(CT){let e=CT.getExporter().exportJSON(),r=JSON.parse(e);if(r.length>0){hT(n,t===void 0?e:JSON.stringify({value:t,annotations:r}));return}}hT(n,t)})}function zT(e,t,n){let r=document.documentElement.dir,i=jw(e,t,{colorScheme:_T.getTheme(),lang:document.documentElement.lang||void 0,dir:r===`ltr`||r===`rtl`||r===`auto`?r:void 0});return i?{blocks:i.blocks,actions:n.actions}:null}var BT;function VT(e){IT(),$.innerHTML=``;let t=qw(e);e.title&&FT(e.title,`Streaming`);let n=Q(`div`,`content`);RT(n,t.blocks??[]),$.appendChild(n)}async function HT(){let e;try{e=await YT()}catch(t){console.warn(`Copy as Image capture failed`,t);try{e=await qT()}catch(e){console.warn(`Document capture also failed`,e),ZT(`Screenshot capture failed. Try using your browser's screenshot tool.`,`error`);return}}try{await GT(e),ZT(ET.clipboardSuccessMessage)}catch(t){console.warn(`Async Clipboard image write failed`,t);try{await WT(e),ZT(`Async clipboard write blocked. Copied via legacy clipboard path.`)}catch(t){console.warn(`Legacy clipboard image write failed`,t);try{await KT(e),ZT(`Clipboard blocked — downloading PNG instead.`)}catch(e){console.warn(`Copy as Image download fallback failed`,e),ZT(ET.blockedClipboardMessage,`error`)}}}}function UT(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error||Error(`Image conversion failed`)),r.readAsDataURL(e)})}async function WT(e){let t=await UT(e),n=!1,r=r=>{let i=r.clipboardData;if(i){r.preventDefault();try{i.items&&typeof File<`u`&&(i.items.add(new File([e],`aikit-present.png`,{type:`image/png`})),n=!0)}catch{}i.setData(`text/html`,`<img alt="AI Kit Present" src="${t}">`),i.setData(`text/plain`,`AI Kit Present image`),n=!0}};document.addEventListener(`copy`,r,{once:!0});try{n=document.execCommand(`copy`)||n}finally{document.removeEventListener(`copy`,r)}if(!n)throw Error(`Legacy clipboard copy unavailable`)}async function GT(e){if(!navigator.clipboard?.write||!(`ClipboardItem`in window))throw Error(`Async image clipboard is unavailable in this host.`);await navigator.clipboard.write([new ClipboardItem({"image/png":e})])}async function KT(e){let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`aikit-present.png`,n.rel=`noopener`,document.body.appendChild(n);try{n.click()}finally{n.remove(),URL.revokeObjectURL(t)}}async function qT(){let e=Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth,document.body?document.body.scrollWidth:0),t=Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight,document.body?document.body.scrollHeight:0),n=window.devicePixelRatio||1,r=document.createElement(`canvas`);r.width=Math.max(1,Math.ceil(e*n)),r.height=Math.max(1,Math.ceil(t*n));let i=r.getContext(`2d`);if(!i)throw Error(`Canvas context unavailable`);i.scale(n,n);let a=document.documentElement.cloneNode(!0);if(!(a instanceof Element))throw Error(`Document clone failed`);a.setAttribute(`xmlns`,`http://www.w3.org/1999/xhtml`),a.querySelectorAll(`script`).forEach(e=>{e.remove()}),XT(document.documentElement,a);let o=[`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${t}" viewBox="0 0 ${e} ${t}">`,`<foreignObject width="100%" height="100%">${new XMLSerializer().serializeToString(a)}</foreignObject>`,`</svg>`].join(``),s=new Blob([o],{type:`image/svg+xml;charset=utf-8`}),c=URL.createObjectURL(s);try{await new Promise((n,r)=>{let a=new Image;a.onload=()=>{i.drawImage(a,0,0,e,t),n(void 0)},a.onerror=()=>r(Error(`ForeignObject render failed`)),a.src=c})}finally{URL.revokeObjectURL(c)}let l=await new Promise(e=>r.toBlob(e,`image/png`));if(l?.type!==`image/png`)throw Error(`PNG export failed`);return l}async function JT(){let e=await fetch(`/__aikit_screenshot.png`,{cache:`no-store`});if(!e.ok)throw Error(`Server PNG capture unavailable`);let t=await e.blob();if(t?.type!==`image/png`)throw Error(`Server PNG capture failed`);return t}async function YT(){try{return await JT()}catch{return qT()}}function XT(e,t){let n=window.getComputedStyle(e),r=Array.from(n).map(e=>`${e}:${n.getPropertyValue(e)}${n.getPropertyPriority(e)?` !important`:``};`).join(``);t.setAttribute(`style`,r);for(let n=0;n<e.children.length;n+=1){let r=e.children[n],i=t.children[n];r&&i&&XT(r,i)}}function ZT(e,t=`info`){let n=$.querySelector(`.host-message`);n||(n=Q(`div`,`host-message`),$.prepend(n)),n.dataset.tone=t,n.replaceChildren(),n.appendChild(Q(`span`,``,e)),clearTimeout(ST),ST=setTimeout(()=>{n?.remove()},4e3)}function QT(){if(!xT)return;let e=window;e.toggleToolbox=()=>{if(AT){MT(!!AT.menu.hidden);return}let e=document.getElementById(`aikit-toolbox-menu`);e&&(e.hidden=!e.hidden)},e.screenshotPage||=HT}var $T=null;function eE(e,t){$.innerHTML=``;let n=Q(`div`,`error-panel`);n.appendChild(Q(`h3`,``,`⚠ ${e}`)),n.appendChild(Q(`pre`,``,t instanceof Error?t.message:String(t))),$.appendChild(n)}function tE(e){IT(),$.innerHTML=``;let t=qw(e),n=t.data;if(n==null){$.innerHTML=`<p class="no-data">No content data received.</p>`;return}e.title&&!xT&&FT(e.title);let r=t.template?mT.get(t.template):mT.detect(n),i=Q(`div`,`main-content`);if(r)$T=r,r.render(i,n,gT);else if(t.template){let r=zT(t.template,n,e);r?RT(i,r.blocks,r.actions):RT(i,t.blocks??[],e.actions)}else RT(i,t.blocks??[],e.actions);if(e.actions?.length&&!r&&!t.template){let t=i.querySelectorAll(`.bk-actions`),n=new Set;for(let e of t)for(let t of e.querySelectorAll(`[data-action-id]`))n.add(t.dataset.actionId??``);let r=e.actions.filter(e=>!n.has(o(e.id)));if(r.length>0){let t=Q(`div`,``),n=Dw(t,[{type:`actions`,value:r}],(t,n)=>{let r=e.actions?.find(e=>o(e.id)===t)??{type:n===void 0?`button`:`select`,id:t,label:t};if(CT){let e=CT.getExporter().exportJSON(),t=JSON.parse(e);if(t.length>0){hT(r,n===void 0?e:JSON.stringify({value:n,annotations:t}));return}}hT(r,n)}),a=bT;bT=()=>{a?.(),n()},i.appendChild(t)}}let a=Q(`div`,`main-layout`),s=Q(`div`,`content-column`);s.appendChild(i),a.appendChild(s),$.appendChild(a),CT=JC({container:i,mountTarget:a});{let e=CT.getStore();e.subscribe(e=>{e.type===`sidebar-toggled`&&(e.open?$.style.setProperty(`--aikit-content-max-width`,`none`):$.style.removeProperty(`--aikit-content-max-width`))}),e.getState().isSidebarOpen&&$.style.setProperty(`--aikit-content-max-width`,`none`)}{let e=i.querySelectorAll(`.bk-actions`);if(e.length>0){let t=Q(`div`,`action-bar`),n=!1;for(let r of e)if(!r.querySelector(`input[type="text"], input:not([type]), textarea`)){for(;r.firstChild;)t.appendChild(r.firstChild);r.remove(),n=!0}n&&(i.appendChild(t),i.style.paddingBottom=`0`)}}let c=document.createElement(`footer`);c.className=m.footer,c.innerHTML=`<div class="${m.footerMeta}"><span class="${m.footerText}">Generated by <span class="${m.footerBrand}">AI KIT</span></span></div>`,$.appendChild(c)}pT?(pT.connect().then(()=>{let e=pT.getHostContext();e&&(_T.apply(e),vT.apply(e),yT?.apply(e))}),pT.onhostcontextchanged=e=>{_T.apply(e),vT.apply(e),yT?.apply(e),$T?.onThemeChange&&$T.onThemeChange(_T.getTheme())},pT.ontoolinputpartial=e=>{let t=e.arguments;t&&($.dataset.streaming=`true`,clearTimeout(BT),BT=setTimeout(()=>{try{let e=t.content??t.data??t.blocks;if(e==null)return;VT({schemaVersion:t.schemaVersion===1?1:void 0,title:t.title,template:t.template,content:e,data:t.data,blocks:Array.isArray(t.blocks)?t.blocks:void 0})}catch{}},80))},pT.ontoolinput=()=>{clearTimeout(BT),delete $.dataset.streaming},pT.ontoolresult=e=>{if(clearTimeout(BT),delete $.dataset.streaming,e.structuredContent)try{tE(e.structuredContent);return}catch(e){eE(`Render error`,e);return}let t=e.content?.find(e=>e.type===`text`)?.text;if(!t){$.innerHTML=`<p>No data received.</p>`;return}try{tE(JSON.parse(t))}catch{tE({content:t})}}):fT&&(document.documentElement.dataset.theme=`dark`,QT(),tE(fT));</script>
3105
+ `);var wT=`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>`,TT=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>`,ET=Ti(),DT={kind:`shared-chrome-action`,id:`copy-image`,label:`Copy as Image`,icon:wT,onclick:`screenshotPage()`};function OT(){return typeof navigator<`u`&&typeof document<`u`&&!!navigator.clipboard?.write&&typeof window<`u`&&`ClipboardItem`in window}function kT(){return OT()?[DT]:[]}var AT=null,jT=!1;function MT(e,t={}){if(!AT)return;let{button:n,menu:r}=AT;r.hidden=!e,n.setAttribute(`aria-expanded`,String(e)),e&&t.focusItem?r.querySelector(`.${m.toolboxItem}`)?.focus():!e&&t.restoreFocus&&n.focus()}function NT(){jT||(jT=!0,document.addEventListener(`click`,e=>{if(!AT)return;let t=e.target;t instanceof Node&&AT.container.contains(t)||MT(!1)}),document.addEventListener(`keydown`,e=>{if(AT){if(e.key===`Escape`){MT(!1,{restoreFocus:!0});return}(e.key===`ArrowDown`||e.key===`Enter`||e.key===` `)&&e.target===AT.button&&(e.preventDefault(),MT(!0,{focusItem:!0}))}}))}function PT(e){if(NT(),e.length===0)return null;let t=Q(`div`,m.toolbox),n=Q(`button`,m.toolboxToggle),r=Q(`div`,m.toolboxMenu);n.type=`button`,n.setAttribute(`aria-label`,`Open tools menu`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.setAttribute(`aria-controls`,`aikit-toolbox-menu`),n.innerHTML=TT,n.addEventListener(`click`,()=>{MT(!!r.hidden,{focusItem:!!r.hidden})}),r.id=`aikit-toolbox-menu`,r.setAttribute(`role`,`menu`),r.hidden=!0;for(let t of e){if(t.id!==`copy-image`)continue;let e=Q(`button`,m.toolboxItem);e.type=`button`,e.setAttribute(`role`,`menuitem`),e.setAttribute(`aria-label`,t.label),e.dataset.sharedChromeAction=t.id,e.innerHTML=`<span aria-hidden="true">${t.icon}</span><span>${t.label}</span>`,e.addEventListener(`click`,()=>{MT(!1),HT()}),r.appendChild(e)}return r.childElementCount===0?null:(t.appendChild(n),t.appendChild(r),AT={button:n,container:t,menu:r},t)}function FT(e,t){let n=Q(`header`,m.header);n.appendChild(Q(`div`,m.brand,`AI KIT`));let r=Q(`div`,m.title);r.appendChild(Q(`span`,m.titleText,e)),t&&r.appendChild(Q(`span`,m.subtitle,t));let i=Q(`div`,m.actions),a=PT(kT());a&&i.appendChild(a),n.appendChild(r),n.appendChild(i),$.appendChild(n)}function IT(){if(CT){let e=CT.getStore().getState().annotations.length;e>0&&console.warn(`[Annotation] ${e} annotation(s) discarded on view reset. Submit feedback before the view refreshes to preserve your work.`),CT.destroy()}CT=null,bT?.(),bT=null,eE?.destroy&&eE.destroy(),eE=null}function LT(e,t){let n=new Map,r=e=>{n.set(o(e.id),e)};for(let e of t??[])r(e);for(let t of e)if(!(t.type!==`actions`||!Array.isArray(t.value)))for(let e of t.value)e&&typeof e==`object`&&`id`in e&&r(e);return n}function RT(e,t,n){let r=LT(t,n);bT=Dw(e,t,(e,t)=>{let n=r.get(e)??{type:t===void 0?`button`:`select`,id:e,label:e};if(CT){let e=CT.getExporter().exportJSON(),r=JSON.parse(e);if(r.length>0){hT(n,t===void 0?e:JSON.stringify({value:t,annotations:r}));return}}hT(n,t)})}function zT(e,t,n){let r=document.documentElement.dir,i=jw(e,t,{colorScheme:_T.getTheme(),lang:document.documentElement.lang||void 0,dir:r===`ltr`||r===`rtl`||r===`auto`?r:void 0});return i?{blocks:i.blocks,actions:n.actions}:null}var BT;function VT(e){IT(),$.innerHTML=``;let t=qw(e);e.title&&FT(e.title,`Streaming`);let n=Q(`div`,`content`);RT(n,t.blocks??[]),$.appendChild(n)}async function HT(){let e;try{e=await XT()}catch(t){console.warn(`Copy as Image capture failed`,t);try{e=await JT()}catch(e){console.warn(`Document capture also failed`,e),QT(`Screenshot capture failed. Try using your browser's screenshot tool.`,`error`);return}}try{await GT(e),QT(ET.clipboardSuccessMessage)}catch(t){console.warn(`Async Clipboard image write failed`,t);try{await WT(e),QT(`Async clipboard write blocked. Copied via legacy clipboard path.`)}catch(t){console.warn(`Legacy clipboard image write failed`,t);try{await KT(e),QT(`Copied image to clipboard via server-side clipboard.`)}catch(t){console.warn(`Server clipboard write failed`,t);try{await qT(e),QT(`Clipboard blocked — downloading PNG instead.`)}catch(e){console.warn(`Copy as Image download fallback failed`,e),QT(ET.blockedClipboardMessage,`error`)}}}}}function UT(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(r.error||Error(`Image conversion failed`)),r.readAsDataURL(e)})}async function WT(e){let t=await UT(e),n=!1,r=!1,i=i=>{let a=i.clipboardData;if(a){i.preventDefault();try{a.items&&typeof File<`u`&&(a.items.add(new File([e],`aikit-present.png`,{type:`image/png`})),r=!0,n=!0)}catch{}a.setData(`text/html`,`<img alt="AI Kit Present" src="${t}">`),r||a.setData(`text/plain`,t),n=!0}};document.addEventListener(`copy`,i,{once:!0});try{n=document.execCommand(`copy`)||n}finally{document.removeEventListener(`copy`,i)}if(!n)throw Error(`Legacy clipboard copy unavailable`)}async function GT(e){if(!navigator.clipboard?.write||!(`ClipboardItem`in window))throw Error(`Async image clipboard is unavailable in this host.`);await navigator.clipboard.write([new ClipboardItem({"image/png":e})])}async function KT(e){let t=await fetch(`/__aikit_system_clipboard`,{method:`POST`,body:e});if(!t.ok){let e=await t.text().catch(()=>`Unknown server error`);throw Error(`Server clipboard write failed: ${e}`)}}async function qT(e){let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`aikit-present.png`,n.rel=`noopener`,document.body.appendChild(n);try{n.click()}finally{n.remove(),URL.revokeObjectURL(t)}}async function JT(){let e=Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth,document.body?document.body.scrollWidth:0),t=Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight,document.body?document.body.scrollHeight:0),n=window.devicePixelRatio||1,r=document.createElement(`canvas`);r.width=Math.max(1,Math.ceil(e*n)),r.height=Math.max(1,Math.ceil(t*n));let i=r.getContext(`2d`);if(!i)throw Error(`Canvas context unavailable`);i.scale(n,n);let a=document.documentElement.cloneNode(!0);if(!(a instanceof Element))throw Error(`Document clone failed`);a.setAttribute(`xmlns`,`http://www.w3.org/1999/xhtml`),a.querySelectorAll(`script`).forEach(e=>{e.remove()}),ZT(document.documentElement,a);let o=[`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${t}" viewBox="0 0 ${e} ${t}">`,`<foreignObject width="100%" height="100%">${new XMLSerializer().serializeToString(a)}</foreignObject>`,`</svg>`].join(``),s=new Blob([o],{type:`image/svg+xml;charset=utf-8`}),c=URL.createObjectURL(s);try{await new Promise((n,r)=>{let a=new Image;a.onload=()=>{i.drawImage(a,0,0,e,t),n(void 0)},a.onerror=()=>r(Error(`ForeignObject render failed`)),a.src=c})}finally{URL.revokeObjectURL(c)}let l=await new Promise(e=>r.toBlob(e,`image/png`));if(l?.type!==`image/png`)throw Error(`PNG export failed`);return l}async function YT(){let e=await fetch(`/__aikit_screenshot.png`,{cache:`no-store`});if(!e.ok)throw Error(`Server PNG capture unavailable`);let t=await e.blob();if(t?.type!==`image/png`)throw Error(`Server PNG capture failed`);return t}async function XT(){try{return await YT()}catch{return JT()}}function ZT(e,t){let n=window.getComputedStyle(e),r=Array.from(n).map(e=>`${e}:${n.getPropertyValue(e)}${n.getPropertyPriority(e)?` !important`:``};`).join(``);t.setAttribute(`style`,r);for(let n=0;n<e.children.length;n+=1){let r=e.children[n],i=t.children[n];r&&i&&ZT(r,i)}}function QT(e,t=`info`){let n=$.querySelector(`.host-message`);n||(n=Q(`div`,`host-message`),$.prepend(n)),n.dataset.tone=t,n.replaceChildren(),n.appendChild(Q(`span`,``,e)),clearTimeout(ST),ST=setTimeout(()=>{n?.remove()},4e3)}function $T(){if(!xT)return;let e=window;e.toggleToolbox=()=>{if(AT){MT(!!AT.menu.hidden);return}let e=document.getElementById(`aikit-toolbox-menu`);e&&(e.hidden=!e.hidden)},e.screenshotPage||=HT}var eE=null;function tE(e,t){$.innerHTML=``;let n=Q(`div`,`error-panel`);n.appendChild(Q(`h3`,``,`⚠ ${e}`)),n.appendChild(Q(`pre`,``,t instanceof Error?t.message:String(t))),$.appendChild(n)}function nE(e){IT(),$.innerHTML=``;let t=qw(e),n=t.data;if(n==null){$.innerHTML=`<p class="no-data">No content data received.</p>`;return}e.title&&!xT&&FT(e.title);let r=t.template?mT.get(t.template):mT.detect(n),i=Q(`div`,`main-content`);if(r)eE=r,r.render(i,n,gT);else if(t.template){let r=zT(t.template,n,e);r?RT(i,r.blocks,r.actions):RT(i,t.blocks??[],e.actions)}else RT(i,t.blocks??[],e.actions);if(e.actions?.length&&!r&&!t.template){let t=i.querySelectorAll(`.bk-actions`),n=new Set;for(let e of t)for(let t of e.querySelectorAll(`[data-action-id]`))n.add(t.dataset.actionId??``);let r=e.actions.filter(e=>!n.has(o(e.id)));if(r.length>0){let t=Q(`div`,``),n=Dw(t,[{type:`actions`,value:r}],(t,n)=>{let r=e.actions?.find(e=>o(e.id)===t)??{type:n===void 0?`button`:`select`,id:t,label:t};if(CT){let e=CT.getExporter().exportJSON(),t=JSON.parse(e);if(t.length>0){hT(r,n===void 0?e:JSON.stringify({value:n,annotations:t}));return}}hT(r,n)}),a=bT;bT=()=>{a?.(),n()},i.appendChild(t)}}let a=Q(`div`,`main-layout`),s=Q(`div`,`content-column`);s.appendChild(i),a.appendChild(s),$.appendChild(a),CT=JC({container:i,mountTarget:a});{let e=CT.getStore();e.subscribe(e=>{e.type===`sidebar-toggled`&&(e.open?$.style.setProperty(`--aikit-content-max-width`,`none`):$.style.removeProperty(`--aikit-content-max-width`))}),e.getState().isSidebarOpen&&$.style.setProperty(`--aikit-content-max-width`,`none`)}{let e=i.querySelectorAll(`.bk-actions`);if(e.length>0){let t=Q(`div`,`action-bar`),n=!1;for(let r of e)if(!r.querySelector(`input[type="text"], input:not([type]), textarea`)){for(;r.firstChild;)t.appendChild(r.firstChild);r.remove(),n=!0}n&&(i.appendChild(t),i.style.paddingBottom=`0`)}}let c=document.createElement(`footer`);c.className=m.footer,c.innerHTML=`<div class="${m.footerMeta}"><span class="${m.footerText}">Generated by <span class="${m.footerBrand}">AI KIT</span></span></div>`,$.appendChild(c)}pT?(pT.connect().then(()=>{let e=pT.getHostContext();e&&(_T.apply(e),vT.apply(e),yT?.apply(e))}),pT.onhostcontextchanged=e=>{_T.apply(e),vT.apply(e),yT?.apply(e),eE?.onThemeChange&&eE.onThemeChange(_T.getTheme())},pT.ontoolinputpartial=e=>{let t=e.arguments;t&&($.dataset.streaming=`true`,clearTimeout(BT),BT=setTimeout(()=>{try{let e=t.content??t.data??t.blocks;if(e==null)return;VT({schemaVersion:t.schemaVersion===1?1:void 0,title:t.title,template:t.template,content:e,data:t.data,blocks:Array.isArray(t.blocks)?t.blocks:void 0})}catch{}},80))},pT.ontoolinput=()=>{clearTimeout(BT),delete $.dataset.streaming},pT.ontoolresult=e=>{if(clearTimeout(BT),delete $.dataset.streaming,e.structuredContent)try{nE(e.structuredContent);return}catch(e){tE(`Render error`,e);return}let t=e.content?.find(e=>e.type===`text`)?.text;if(!t){$.innerHTML=`<p>No data received.</p>`;return}try{nE(JSON.parse(t))}catch{nE({content:t})}}):fT&&(document.documentElement.dataset.theme=`dark`,$T(),nE(fT));</script>
3106
3106
  </head>
3107
3107
  <body>
3108
3108
  <div id="app">
@@ -5,4 +5,4 @@ import{fileURLToPath as e,pathToFileURL as t}from"node:url";import{parseArgs as
5
5
  `).length,fileHash:this.hash(e.content),indexedAt:t,origin:`curated`,tags:e.frontmatter.tags,category:e.frontmatter.category,version:e.frontmatter.version}});try{return await this.store.upsert(i,r),e.length}catch(t){R.error(`Failed to upsert curated batch`,{batchSize:e.length,...a(t)});for(let t of e)n.push(`${t.relativePath}: upsert failed`);return 0}}catch(r){if(e.length===1)return R.error(`Failed to embed curated item`,{relativePath:e[0].relativePath,...a(r)}),n.push(`${e[0].relativePath}: reindex failed`),0;R.warn(`Curated embed batch failed, retrying with smaller chunks`,{batchSize:e.length,...a(r)});let i=Math.ceil(e.length/2),o=e.slice(0,i),s=e.slice(i);return await this.embedAndUpsertBatch(o,t,n)+await this.embedAndUpsertBatch(s,t,n)}}gitCommitKnowledge(e,t,n){try{if(!p(this.curatedDir))return;let r=this.knowledgeRefForPath(e);if(!r)return;m(r,`entry.md`,t,n,this.curatedDir)}catch{}}gitDeleteKnowledgeRef(e){try{if(!p(this.curatedDir))return;let t=this.knowledgeRefForPath(e);if(!t)return;h([`update-ref`,`-d`,t],this.curatedDir)}catch{}}knowledgeRefForPath(e){let t=e.replace(/\.md$/,``).split(`/`).map(e=>g(e)).join(`/`);return t.split(`/`).every(e=>f.test(e))?`${L}/${t}`:null}async indexCuratedFile(e,t,n){let r=await this.embedder.embed(t),i=`.ai/curated/${e}`,a=new Date().toISOString(),o={id:this.hashId(i,0),content:t,sourcePath:i,contentType:`curated-knowledge`,headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:t.split(`
6
6
  `).length,fileHash:this.hash(t),indexedAt:a,origin:`curated`,tags:n.tags,category:n.category,version:n.version};await this.store.upsert([o],[r])}async indexCuratedFileBestEffort(e,t,n,i){if(r.instance().isDegraded(`embedder`)){R.debug(`Skipping vector indexing — embedder degraded`,{relativePath:e,operation:i,subsystem:`embedder`});return}try{await this.indexCuratedFile(e,t,n)}catch(t){R.warn(`Curated file persisted but vector indexing deferred`,{relativePath:e,operation:i,...a(t)})}}async discoverCategories(){return this.adapter.listDirectories()}guardPath(e){let t=e.replace(/^\.ai\/curated\//,``);if(t.endsWith(`.md`)||(t+=`.md`),t.includes(`..`)||c(t))throw Error(`Invalid path: ${t}. Must be relative within .ai/curated/ directory.`);let n=t.split(`/`)[0];return this.validateCategoryName(n),t}validateCategoryName(e){if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid category name: "${e}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(e){if(Buffer.byteLength(e,`utf-8`)>I)throw Error(`Content exceeds maximum size of ${I/1024}KB`)}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)}normalizeTags(e){return[...new Set(e.map(e=>e.trim()).filter(Boolean))]}sameTags(e,t){if(e.length!==t.length)return!1;let n=new Set(e);return t.every(e=>n.has(e))}ensureCategoryPath(e,t){if(!e.startsWith(`${t}/`))throw Error(`Curated path "${e}" must stay within category "${t}"`)}async uniqueRelativePath(e,t){let n=`${e}/${t}.md`;if(!await this.adapter.exists(n))return n;for(let n=2;n<=100;n++){let r=`${e}/${t}-${n}.md`;if(!await this.adapter.exists(r))return r}throw Error(`Too many entries with slug "${t}" in category "${e}"`)}hash(e){return d(`sha256`).update(e).digest(`hex`).slice(0,16)}hashId(e,t){return this.hash(`${e}::${t}`)}serializeFile(e,t){return`${[`---`,`title: "${t.title.replace(/"/g,`\\"`)}"`,`category: ${t.category}`,`tags: [${t.tags.map(e=>`"${e}"`).join(`, `)}]`,`created: ${t.created}`,`updated: ${t.updated}`,`version: ${t.version}`,`origin: ${t.origin}`,`changelog:`,...t.changelog.map(e=>` - version: ${e.version}\n date: ${e.date}\n reason: "${e.reason.replace(/"/g,`\\"`)}"`),`---`].join(`
7
7
  `)}\n\n${e}\n`}parseFile(e){let t=e.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!t)return{frontmatter:{title:`Untitled`,category:`notes`,tags:[],created:``,updated:``,version:1,origin:`curated`,changelog:[]},content:e};let n=t[1],r=t[2].trim(),i={},a=[],o=n.split(`
8
- `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const B=i(`server`);function V(e,t){return t?{version:e,...a(t)}:{version:e}}function H(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function U(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function W(){return U()?n({allowPositionals:!0,options:{transport:{type:`string`,default:H()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:H(),port:process.env.AIKIT_PORT??`3210`}}async function G(){let e=C(),t=W();if(process.on(`unhandledRejection`,t=>{B.error(`Unhandled rejection`,V(e,t))}),process.on(`uncaughtException`,t=>{B.error(`Uncaught exception — exiting`,V(e,t)),process.exit(1)}),B.info(`Starting MCP AI Kit server`,{version:e}),t.transport===`http`){let{startHttpMode:n}=await import(`./server-http-BiklDGRo.js`);await n(e,t.port)}else{let{startStdioMode:t}=await import(`./server-stdio-BoExYZAT.js`);await t(e)}}G();export{w as a,O as i,F as n,T as o,P as r,D as s,z as t};
8
+ `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const B=i(`server`);function V(e,t){return t?{version:e,...a(t)}:{version:e}}function H(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function U(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function W(){return U()?n({allowPositionals:!0,options:{transport:{type:`string`,default:H()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:H(),port:process.env.AIKIT_PORT??`3210`}}async function G(){let e=C(),t=W();if(process.on(`unhandledRejection`,t=>{B.error(`Unhandled rejection`,V(e,t))}),process.on(`uncaughtException`,t=>{B.error(`Uncaught exception — exiting`,V(e,t)),process.exit(1)}),B.info(`Starting MCP AI Kit server`,{version:e}),t.transport===`http`){let{startHttpMode:n}=await import(`./server-http-R9kbrEkl.js`);await n(e,t.port)}else{let{startStdioMode:t}=await import(`./server-stdio-A4JgLOMp.js`);await t(e)}}G();export{w as a,O as i,F as n,T as o,P as r,D as s,z as t};
@@ -1 +1 @@
1
- import{a as e,i as t,n,r,t as i}from"./server-utils-De-aZNQa.js";import{n as a,r as o,t as s}from"./workspace-bootstrap-BJloolzr.js";import{t as c}from"./curated-manager-BrgM_znO.js";import{pathToFileURL as l}from"node:url";import{parseArgs as u}from"node:util";import{createLogger as d,serializeError as f}from"../../core/dist/index.js";const p=d(`server`);function m(e,t){return t?{version:e,...f(t)}:{version:e}}function h(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function g(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function _(){return g()?u({allowPositionals:!0,options:{transport:{type:`string`,default:h()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:h(),port:process.env.AIKIT_PORT??`3210`}}async function v(){let e=t(),n=_();if(process.on(`unhandledRejection`,t=>{p.error(`Unhandled rejection`,m(e,t))}),process.on(`uncaughtException`,t=>{p.error(`Uncaught exception — exiting`,m(e,t)),process.exit(1)}),p.info(`Starting MCP AI Kit server`,{version:e}),n.transport===`http`){let{startHttpMode:t}=await import(`./server-http-DXD_Vzek.js`);await t(e,n.port)}else{let{startStdioMode:t}=await import(`./server-stdio-CkZ6eSpg.js`);await t(e)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,n as getSessionIdHeader,v as main,r as readPositiveIntEnv,t as readVersion,e as resolveCorsOrigin,o as selectWorkspaceRoot};
1
+ import{a as e,i as t,n,r,t as i}from"./server-utils-De-aZNQa.js";import{n as a,r as o,t as s}from"./workspace-bootstrap-BJloolzr.js";import{t as c}from"./curated-manager-BrgM_znO.js";import{pathToFileURL as l}from"node:url";import{parseArgs as u}from"node:util";import{createLogger as d,serializeError as f}from"../../core/dist/index.js";const p=d(`server`);function m(e,t){return t?{version:e,...f(t)}:{version:e}}function h(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function g(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function _(){return g()?u({allowPositionals:!0,options:{transport:{type:`string`,default:h()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:h(),port:process.env.AIKIT_PORT??`3210`}}async function v(){let e=t(),n=_();if(process.on(`unhandledRejection`,t=>{p.error(`Unhandled rejection`,m(e,t))}),process.on(`uncaughtException`,t=>{p.error(`Uncaught exception — exiting`,m(e,t)),process.exit(1)}),p.info(`Starting MCP AI Kit server`,{version:e}),n.transport===`http`){let{startHttpMode:t}=await import(`./server-http-B95NxidA.js`);await t(e,n.port)}else{let{startStdioMode:t}=await import(`./server-stdio-lEi-vS6i.js`);await t(e)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,n as getSessionIdHeader,v as main,r as readPositiveIntEnv,t as readVersion,e as resolveCorsOrigin,o as selectWorkspaceRoot};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{n as e,t}from"./server-DBuwjKwF.js";export{t as buildPreludeInjection,e as generatePrelude};
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./server-DTUS5uth.js";export{t as buildPreludeInjection,e as generatePrelude};