@maxhealth.tech/prefab 0.2.18 → 0.2.19
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/CHANGELOG.md +30 -0
- package/dist/app.d.ts +1 -1
- package/dist/app.js +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/types.d.ts +37 -11
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js +4 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/prefab.css +113 -100
- package/dist/renderer/bridge.d.ts +2 -0
- package/dist/renderer/bridge.d.ts.map +1 -1
- package/dist/renderer/bridge.js +17 -0
- package/dist/renderer/bridge.js.map +1 -1
- package/dist/renderer.auto.min.js +3 -3
- package/dist/renderer.min.js +2 -2
- package/package.json +1 -1
package/dist/renderer.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(()=>{var{defineProperty:f0,getOwnPropertyNames:p1,getOwnPropertyDescriptor:c1}=Object,l1=Object.prototype.hasOwnProperty;function s1($){return this[$]}var d1=($)=>{var J=(l0??=new WeakMap).get($),Z;if(J)return J;if(J=f0({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var q of p1($))if(!l1.call(J,q))f0(J,q,{get:s1.bind($,q),enumerable:!(Z=c1($,q))||Z.enumerable})}return l0.set($,J),J},l0;var i1=($)=>$;function r1($,J){this[$]=i1.bind(null,J)}var n1=($,J)=>{for(var Z in J)f0($,Z,{get:J[Z],enumerable:!0,configurable:!0,set:r1.bind(J,Z)})};var B2={};n1(B2,{unregisterPipe:()=>Q0,registerPipe:()=>U0,registerComponent:()=>M,listPipes:()=>N0,isIframe:()=>Z0,createThemeToggle:()=>M0,applyHostTheme:()=>_0,app:()=>k0,PrefabRenderer:()=>p,Bridge:()=>t});class q0{data={};subscribers=new Map;globalSubscribers=new Set;generation=0;constructor($){if($)this.data=structuredClone($)}get($){return a1(this.data,$)}getAll(){return this.data}set($,J){s0(this.data,$,J),this.notify($)}toggle($){let J=this.get($),Z=J==null||J===!1||J===0||J==="";this.set($,Z)}append($,J,Z){let q=this.get($);if(!Array.isArray(q)){this.set($,[J]);return}if(Z!==void 0)q.splice(Z,0,J);else q.push(J);this.notify($)}pop($,J){let Z=this.get($);if(!Array.isArray(Z))return;if(typeof J==="number")Z.splice(J,1);else{let q=Z.indexOf(J);if(q>=0)Z.splice(q,1)}this.notify($)}merge($){for(let[J,Z]of Object.entries($))s0(this.data,J,Z);for(let J of Object.keys($))this.notify(J)}subscribe($,J){if(!this.subscribers.has($))this.subscribers.set($,new Set);return this.subscribers.get($)?.add(J),()=>this.subscribers.get($)?.delete(J)}subscribeAll($){return this.globalSubscribers.add($),()=>this.globalSubscribers.delete($)}notify($){this.generation++;let J=$.split(".");for(let Z=1;Z<=J.length;Z++){let q=J.slice(0,Z).join("."),U=this.subscribers.get(q);if(U)U.forEach((Q)=>Q())}this.globalSubscribers.forEach((Z)=>Z())}}function a1($,J){let Z=J.split("."),q=$;for(let U of Z){if(q==null||typeof q!=="object")return;q=q[U]}return q}var o1=new Set(["__proto__","constructor","prototype"]);function s0($,J,Z){let q=J.split(".");if(q.some((Q)=>o1.has(Q))){console.warn(`[prefab] Blocked prototype pollution attempt: ${J}`);return}let U=$;for(let Q=0;Q<q.length-1;Q++){let Y=q[Q];if(U[Y]==null||typeof U[Y]!=="object")U[Y]={};U=U[Y]}U[q[q.length-1]]=Z}var e=new Map;function U0($,J){if(e.has($)&&e.get($)!==J)console.warn(`[prefab] pipe "${$}" re-registered`);e.set($,J)}function Q0($){return e.delete($)}function N0(){return[...e.keys()]}function d0($){return e.get($)}var i0=-1,S0=new Map,t1=/\{\{\s*(.+?)\s*\}\}/g;function g($){return typeof $==="string"&&$.includes("{{")&&$.includes("}}")}function u($,J,Z){let q=$.trim();if(q.startsWith("{{")&&q.endsWith("}}")&&Q4(q,"{{")===1){let U=q.slice(2,-2).trim();return r0(U,J,Z)}return $.replace(t1,(U,Q)=>{let Y=r0(Q.trim(),J,Z);return Y==null?"":String(Y)})}function r0($,J,Z){let[q,...U]=U4($),Q=h(q.trim(),J,Z);for(let Y of U)Q=e1(Y.trim(),Q,J,Z);return Q}function h($,J,Z){let q=Z4($);if(q>=0){let Y=$.slice(0,q).trim(),W=$.slice(q+1),H=q4(W);if(H>=0){let N=W.slice(0,H).trim(),X=W.slice(H+1).trim(),_=h(Y,J,Z);return _!==null&&_!==void 0&&_!==!1&&_!==0&&_!==""?h(N,J,Z):h(X,J,Z)}}let U=X0($,"||");if(U>=0){let Y=h($.slice(0,U).trim(),J,Z);return Y!==null&&Y!==void 0&&Y!==!1&&Y!==0&&Y!==""?Y:h($.slice(U+2).trim(),J,Z)}let Q=X0($,"&&");if(Q>=0){let Y=h($.slice(0,Q).trim(),J,Z);if(Y===null||Y===void 0||Y===!1||Y===0||Y==="")return Y;return h($.slice(Q+2).trim(),J,Z)}for(let[Y,W]of $4){let H=X0($,Y);if(H>=0){let N=h($.slice(0,H).trim(),J,Z),X=h($.slice(H+Y.length).trim(),J,Z);return W(N,X)}}if($.startsWith("!")){let Y=h($.slice(1).trim(),J,Z);return Y===null||Y===void 0||Y===!1||Y===0||Y===""}for(let[Y,W]of J4){let H=X0($,Y);if(H>=0){let N=h($.slice(0,H).trim(),J,Z),X=h($.slice(H+Y.length).trim(),J,Z);return W(Number(N),Number(X))}}if($==="true")return!0;if($==="false")return!1;if($==="null"||$==="undefined")return null;if(/^-?\d+(\.\d+)?$/.test($))return Number($);if($.startsWith("'")&&$.endsWith("'")||$.startsWith('"')&&$.endsWith('"'))return $.slice(1,-1);if(Z&&$.startsWith("$")){let Y=$.indexOf(".");if(Y>=0){let W=$.slice(0,Y),H=$.slice(Y+1),N=Z[W];return G0(N,H)}return Z[$]}if(Z){let Y=$.split(".")[0];if(Y in Z)return G0(Z[Y],$.includes(".")?$.slice(Y.length+1):"")}return J.get($)}function e1($,J,Z,q){let U=$.indexOf(":"),Q=U>=0?$.slice(0,U).trim():$,Y=U>=0?$.slice(U+1).trim():void 0,W=Y?w0(Y):void 0;switch(Q){case"find":{if(!Array.isArray(J)||!Y)return;let H=n0(Y);if(H.length<2)return;let N=w0(H[0]),X=H[1].trim(),_;if(X.startsWith("'")&&X.endsWith("'")||X.startsWith('"')&&X.endsWith('"'))_=X.slice(1,-1);else if(Z){if(q&&X.startsWith("$")){let z=X.indexOf(".");if(z>=0){let j=X.slice(0,z);if(j in q)_=G0(q[j],X.slice(z+1))}else if(X in q)_=q[X]}if(_===void 0&&!(q&&X.startsWith("$")))if(q){let z=X.split(".")[0];_=z in q?G0(q[z],X.includes(".")?X.slice(z.length+1):""):Z.get(X)}else _=Z.get(X)}else _=X;if(_==null)return;let E=Z?.generation??0;if(E!==i0)S0=new Map,i0=E;let D=S0.get(J);if(!D)D=new Map,S0.set(J,D);let G=D.get(N);if(!G){G=new Map;for(let z of J)if(z!=null&&typeof z==="object"){let j=z[N];if(j!=null)G.set(String(j),z)}D.set(N,G)}return G.get(String(_))}case"dot":{if(J==null||typeof J!=="object"||typeof W!=="string")return;return J[W]}case"length":return Array.isArray(J)?J.length:typeof J==="string"?J.length:0;case"upper":return typeof J==="string"?J.toUpperCase():J;case"lower":return typeof J==="string"?J.toLowerCase():J;case"truncate":if(typeof J==="string"&&typeof W==="number")return J.slice(0,W);return J;case"join":return Array.isArray(J)?J.join(typeof W==="string"?W:", "):J;case"first":return Array.isArray(J)?J[0]:J;case"last":return Array.isArray(J)?J[J.length-1]:J;case"abs":return Math.abs(Number(J));case"round":return typeof W==="number"?Number(Number(J).toFixed(W)):Math.round(Number(J));case"number":return typeof W==="number"?Number(Number(J).toFixed(W)):Number(J);case"currency":{let H=typeof W==="string"?W:"USD";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:H}).format(Number(J))}catch{return J}}case"percent":return typeof W==="number"?`${(Number(J)*100).toFixed(W)}%`:`${Math.round(Number(J)*100)}%`;case"compact":{let H=typeof W==="number"?W:1;try{return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:H}).format(Number(J))}catch{return J}}case"date":try{return new Date(J).toLocaleDateString()}catch{return J}case"time":try{return new Date(J).toLocaleTimeString()}catch{return J}case"datetime":try{return new Date(J).toLocaleString()}catch{return J}case"pluralize":{let H=Number(J),N=typeof W==="string"?W:"";return H===1?N:`${N}s`}case"default":return J==null||J===""?W:J;case"selectattr":return Array.isArray(J)&&typeof W==="string"?J.filter((H)=>H!=null&&typeof H==="object"&&Boolean(H[W])):J;case"rejectattr":return Array.isArray(J)&&typeof W==="string"?J.filter((H)=>{if(H==null||typeof H!=="object")return!1;let N=H[W];return N==null||N===!1||N===0||N===""}):J;default:{let H=d0(Q);if(H){let N=Y?n0(Y).map(w0):[];return H(J,...N)}return J}}}var $4=[["!==",($,J)=>$!==J],["===",($,J)=>$===J],["!=",($,J)=>$!=J],["==",($,J)=>$==J],[">=",($,J)=>Number($)>=Number(J)],["<=",($,J)=>Number($)<=Number(J)],[">",($,J)=>Number($)>Number(J)],["<",($,J)=>Number($)<Number(J)]],J4=[[" + ",($,J)=>$+J],[" - ",($,J)=>$-J],[" * ",($,J)=>$*J],[" / ",($,J)=>J!==0?$/J:0],[" % ",($,J)=>J!==0?$%J:0]];function X0($,J){let Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z&&$.slice(q,q+J.length)===J)return q}return-1}function Z4($){let J=0,Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z){if(U==="(")J++;else if(U===")")J--;else if(U==="?"&&J===0)return q}}return-1}function q4($){let J=0,Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z){if(U==="?"||U==="(")J++;else if(U===")")J--;else if(U===":"&&J===0)return q}}return-1}function U4($){let J=[],Z="",q=null;for(let U=0;U<$.length;U++){let Q=$[U];if(Q==="'"||Q==='"')q=q===Q?null:q??Q;if(Q==="|"&&!q)if($[U+1]==="|")Z+="||",U++;else J.push(Z),Z="";else Z+=Q}return J.push(Z),J}function w0($){let J=$.replace(/^['"]|['"]$/g,"");if(J==="true")return!0;if(J==="false")return!1;let Z=Number(J);return isNaN(Z)?J:Z}function n0($){let J=[],Z="",q=null;for(let U of $){if(U==="'"||U==='"')q=q===U?null:q??U;if(U===","&&!q)J.push(Z),Z="";else Z+=U}return J.push(Z),J}function G0($,J){if(!J)return $;let Z=J.split("."),q=$;for(let U of Z){if(q==null||typeof q!=="object")return;q=q[U]}return q}function Q4($,J){let Z=0,q=0;while((q=$.indexOf(J,q))!==-1)Z++,q+=J.length;return Z}async function k($,J){let Z=Array.isArray($)?$:[$];for(let q of Z)await Y4(q,J)}async function Y4($,J){let Z=$.action;switch(Z){case"setState":{W4($,J);return}case"toggleState":{H4($,J);return}case"appendState":{M4($,J);return}case"popState":{_4($,J);return}case"showToast":{B4($,J);return}case"closeOverlay":{N4($,J);return}case"openLink":{X4($);return}case"setInterval":{z4($,J);return}case"toolCall":case"callTool":return K4($,J);case"sendMessage":return D4($,J);case"updateContext":{F4($,J);return}case"fetch":return j4($,J);case"openFilePicker":{L4($,J);return}case"callHandler":return P4($,J);case"requestDisplayMode":{T4($,J);return}default:console.warn(`[prefab] Unknown action: ${Z}`)}}function W4($,J){let{key:Z,value:q}=$;if(g(q))q=u(q,J.store,J.scope);J.store.set(Z,q),J.rerender(),r($.onSuccess,J)}function H4($,J){J.store.toggle($.key),J.rerender()}function M4($,J){let Z=$.value??$.item;if(g(Z))Z=u(Z,J.store,J.scope);J.store.append($.key,Z,$.index),J.rerender()}function _4($,J){J.store.pop($.key,$.index),J.rerender()}function B4($,J){J.onToast?.({message:z0($.message,J),description:$.description!=null?z0($.description,J):void 0,variant:$.variant,duration:$.duration})}function N4($,J){if(typeof document<"u")document.dispatchEvent(new CustomEvent("prefab:close-overlay"))}function X4($){if(typeof window<"u"){let J=$.url;if(!J){console.warn("[prefab] openLink: missing url");return}if(!o0(J)){console.warn(`[prefab] Blocked unsafe URL scheme: ${J}`);return}window.open(J,$.target??"_blank")}}var E0=new Set,G4=20,E4=100;function z4($,J){let Z=Math.max($.intervalMs,E4),q=$.onTick;if(typeof globalThis.setInterval!=="function")return;if(E0.size>=G4){console.warn("[prefab] Max intervals reached, ignoring new setInterval");return}let U=globalThis.setInterval(()=>void k(q,J),Z);E0.add(U)}function a0(){for(let $ of E0)globalThis.clearInterval($);E0.clear()}async function K4($,J){if(!J.transport){console.warn("[prefab] No MCP transport configured for toolCall");return}let Z=$.tool,q=t0($.arguments,J);try{let U=await J.transport.callTool(Z,q);if($.resultKey!=null)J.store.set($.resultKey,U);J.rerender(),await r($.onSuccess,J,{$result:U})}catch(U){await r($.onError,J,{$error:U})}}async function D4($,J){if(!J.transport){console.warn("[prefab] No MCP transport configured for sendMessage");return}await J.transport.sendMessage(z0($.message,J))}function F4($,J){let Z=$.context;if(Z!=null)J.store.merge(Z),J.rerender()}async function j4($,J){let Z=z0($.url,J);if(!o0(Z)){console.warn(`[prefab] Blocked unsafe URL in fetch: ${Z}`);return}let q=$.method??"GET",U=$.headers,Q=$.body!==void 0?JSON.stringify($.body):void 0;try{let Y=await globalThis.fetch(Z,{method:q,headers:{"Content-Type":"application/json",...U},...Q&&{body:Q}}),W=await Y.json().catch(()=>Y.text());if($.resultKey!=null)J.store.set($.resultKey,W);J.rerender(),await r($.onSuccess,J,{$result:W})}catch(Y){await r($.onError,J,{$error:Y})}}function L4($,J){if(typeof document>"u")return;let Z=document.createElement("input");if(Z.type="file",$.accept!=null)Z.accept=$.accept;if($.multiple===!0)Z.multiple=!0;Z.addEventListener("change",()=>{let q=Array.from(Z.files??[]);if($.resultKey!=null)J.store.set($.resultKey,q);J.rerender(),r($.onSuccess,J,{$result:q})}),Z.click()}async function P4($,J){let Z=$.handler,q=t0($.arguments,J);if(!J.transport){console.warn(`[prefab] No transport configured for callHandler: ${Z}`);return}try{let U=await J.transport.callTool(Z,q);if($.resultKey!=null)J.store.set($.resultKey,U);J.rerender(),await r($.onSuccess,J,{$result:U})}catch(U){await r($.onError,J,{$error:U})}}function T4($,J){if(typeof document<"u")document.dispatchEvent(new CustomEvent("prefab:request-display-mode",{detail:{mode:$.mode}}))}var O4=/^\s*(javascript|vbscript|data):/i;function o0($){return!O4.test($)}function z0($,J){if(g($)){let Z=u($,J.store,J.scope);return Z==null?"":String(Z)}return $==null?"":String($)}function t0($,J){if(!$)return{};let Z={};for(let[q,U]of Object.entries($))Z[q]=g(U)?u(U,J.store,J.scope):U;return Z}async function r($,J,Z){if($==null)return;let q={...J.scope,...Z};await k($,{...J,scope:q})}var y0=new Map;function M($,J){if(y0.has($))console.warn(`[prefab] overriding existing renderer for "${$}"`);y0.set($,J)}function w($,J){if(J.defs?.[$.type]){let U={...J.defs[$.type],...$,type:J.defs[$.type].type};return w(U,J)}let Z=y0.get($.type),q;if(Z)q=Z($,J);else if(q=document.createElement("div"),q.setAttribute("data-prefab-type",$.type),$.children)for(let U of $.children)q.appendChild(w(U,J));if(q instanceof HTMLElement){if($.id)q.id=$.id;if($.cssClass){let U=K($.cssClass,J);if(U)q.className=(q.className?q.className+" ":"")+U}}if($.onMount){let U=$.onMount,Q=y(J);queueMicrotask(()=>void k(U,Q))}return q}function L($,J,Z){if(!$.children)return;n($.children,J,Z)}function n($,J,Z){let q=0;while(q<$.length){let U=$[q];if(U.type==="If")q=V4($,q,J,Z);else if(U.type==="Elif"||U.type==="Else")q++;else J.appendChild(w(U,Z)),q++}}function V4($,J,Z,q){let U=!1,Q=J,Y=$[Q];if(e0(Y.condition,q))C0(Y,Z,q),U=!0;Q++;while(Q<$.length){let W=$[Q];if(W.type==="Elif"){if(!U&&e0(W.condition,q))C0(W,Z,q),U=!0;Q++}else if(W.type==="Else"){if(!U)C0(W,Z,q);Q++;break}else break}return Q}function e0($,J){if(!$)return!1;if(g($))return Boolean(u($,J.store,J.scope));return Boolean(J.store.get($))}function C0($,J,Z){if(!$.children)return;n($.children,J,Z)}function K($,J){if(g($)){let Z=u($,J.store,J.scope);return Z==null?"":String(Z)}return $==null?"":String($)}function b($,J){if(g($))return u($,J.store,J.scope);return $}function y($){return{store:$.store,transport:$.transport,scope:$.scope,rerender:$.rerender,onToast:$.onToast}}function B($,J){let Z=document.createElement($);if(J)Z.className=J;return Z}function b0($,J){return $.textContent=J,$}function q1(){M("Column",I4),M("Row",R4),M("Grid",$1),M("GridItem",J1),M("Container",A4),M("Div",Z1),M("Span",k4),M("Dashboard",$1),M("DashboardItem",J1),M("Pages",f4),M("Page",Z1),M("Detail",S4),M("MasterDetail",w4)}function I4($,J){let Z=B("div","pf-column");Z.style.display="flex",Z.style.flexDirection="column";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;if($.align!=null)Z.style.alignItems=U1($.align);if($.justify!=null)Z.style.justifyContent=Q1($.justify);return L($,Z,J),Z}function R4($,J){let Z=B("div","pf-row");Z.style.display="flex",Z.style.flexDirection="row";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;if($.align!=null)Z.style.alignItems=U1($.align);if($.justify!=null)Z.style.justifyContent=Q1($.justify);if($.wrap===!0)Z.style.flexWrap="wrap";return L($,Z,J),Z}function $1($,J){let Z=B("div","pf-grid");Z.style.display="grid";let q=$.columns??3;Z.style.gridTemplateColumns=`repeat(${q}, 1fr)`;let U=K0($);if(U!=null)Z.style.gap=`${U*4}px`;return L($,Z,J),Z}function J1($,J){let Z=B("div","pf-grid-item");if($.colSpan!=null)Z.style.gridColumn=`span ${$.colSpan}`;if($.rowSpan!=null)Z.style.gridRow=`span ${$.rowSpan}`;return L($,Z,J),Z}function A4($,J){let Z=B("div","pf-container");if(Z.style.maxWidth=$.maxWidth??"1200px",Z.style.margin="0 auto",$.padding!=null)Z.style.padding=`${$.padding*4}px`;return L($,Z,J),Z}function Z1($,J){let Z=B("div","pf-div");return L($,Z,J),Z}function k4($,J){let Z=B("span","pf-span");return L($,Z,J),Z}function f4($,J){let Z=B("div","pf-pages");return L($,Z,J),Z}function S4($,J){let Z=B("div","pf-detail"),q=$.of!=null?b($.of,J):void 0;if(q!=null&&q!==""&&q!==!1&&q!==0)L($,Z,J);else if($.empty!=null){let U=$.empty;Z.appendChild(w(U,J))}return Z}function w4($,J){let Z=B("div","pf-master-detail");Z.style.display="flex",Z.style.flexDirection="row";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;let U=$.masterWidth??"33%",Q=$.children??[];if(Q.length>0){let Y=B("div","pf-master-detail-master");Y.style.width=U,Y.style.flexShrink="0",Y.style.overflow="auto",Y.appendChild(w(Q[0],J)),Z.appendChild(Y)}if(Q.length>1){let Y=B("div","pf-master-detail-detail");Y.style.flex="1",Y.style.overflow="auto",Y.appendChild(w(Q[1],J)),Z.appendChild(Y)}return Z}var C4=/\bgap-(\d+)\b/;function K0($){if($.gap!=null)return $.gap;if(typeof $.cssClass==="string"){let J=C4.exec($.cssClass);if(J)return Number(J[1])}return null}function U1($){return{start:"flex-start",end:"flex-end",center:"center",stretch:"stretch",baseline:"baseline"}[$]??$}function Q1($){return{start:"flex-start",end:"flex-end",center:"center",between:"space-between",around:"space-around",evenly:"space-evenly"}[$]??$}function W1(){M("Heading",y4),M("H1",($,J)=>D0($,J,"h1")),M("H2",($,J)=>D0($,J,"h2")),M("H3",($,J)=>D0($,J,"h3")),M("H4",($,J)=>D0($,J,"h4")),M("Text",b4),M("P",m4),M("Lead",($,J)=>$0($,J,"p","pf-lead")),M("Large",($,J)=>$0($,J,"span","pf-large")),M("Small",($,J)=>$0($,J,"small","pf-small")),M("Muted",($,J)=>$0($,J,"p","pf-muted")),M("BlockQuote",($,J)=>$0($,J,"blockquote","pf-blockquote")),M("Label",($,J)=>$0($,J,"label","pf-label")),M("Link",h4),M("Code",g4),M("Markdown",u4),M("Kbd",x4)}function y4($,J){let Z=$.level??2,q=`h${Math.min(Math.max(Z,1),6)}`,U=document.createElement(q);return U.className=`pf-heading pf-${q}`,U.textContent=K($.content,J),U}function D0($,J,Z){let q=document.createElement(Z);return q.className=`pf-heading pf-${Z}`,q.textContent=K($.content,J),q}function b4($,J){return b0(B("span","pf-text"),K($.content,J))}function m4($,J){return b0(B("p","pf-p"),K($.content,J))}function $0($,J,Z,q){let U=document.createElement(Z);return U.className=q,U.textContent=K($.content,J),U}var v4=/^\s*(javascript|vbscript|data):/i;function h4($,J){let Z=document.createElement("a");if(Z.className="pf-link",Z.textContent=K($.content,J),$.href!=null){let q=K($.href,J);if(!v4.test(q))Z.href=q}if($.target!=null)Z.target=K($.target,J);return Z}function g4($,J){let Z=B("pre","pf-code"),q=B("code");if(q.textContent=K($.content,J),$.language!=null)q.setAttribute("data-language",$.language);return Z.appendChild(q),Z}function u4($,J){let Z=B("div","pf-markdown"),q=K($.content,J);return Z.innerHTML=H1(q),Z.setAttribute("data-markdown","true"),Z}var Y1=/^\s*(javascript|vbscript|data):/i;function j0($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function F0($){let J=j0($),Z=[];return J=J.replace(/`([^`]+)`/g,(q,U)=>{return Z.push(`<code>${U}</code>`),`CODE${Z.length-1}`}),J=J.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(q,U,Q)=>{if(Y1.test(Q))return j0(U);return`<img src="${Q}" alt="${U}" />`}),J=J.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(q,U,Q)=>{if(Y1.test(Q))return U;return`<a href="${Q}">${U}</a>`}),J=J.replace(/\*{3}(.+?)\*{3}/g,"<strong><em>$1</em></strong>"),J=J.replace(/_{3}(.+?)_{3}/g,"<strong><em>$1</em></strong>"),J=J.replace(/\*{2}(.+?)\*{2}/g,"<strong>$1</strong>"),J=J.replace(/_{2}(.+?)_{2}/g,"<strong>$1</strong>"),J=J.replace(/\*(.+?)\*/g,"<em>$1</em>"),J=J.replace(/(?<!\w)_(.+?)_(?!\w)/g,"<em>$1</em>"),J=J.replace(/~~(.+?)~~/g,"<del>$1</del>"),J=J.replace(/\uFDD0CODE(\d+)\uFDD0/g,(q,U)=>Z[parseInt(U)]),J}function H1($){let J=$.replace(/\r\n?/g,`
|
|
1
|
+
(()=>{var{defineProperty:f0,getOwnPropertyNames:p1,getOwnPropertyDescriptor:c1}=Object,l1=Object.prototype.hasOwnProperty;function s1($){return this[$]}var d1=($)=>{var J=(l0??=new WeakMap).get($),Z;if(J)return J;if(J=f0({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var q of p1($))if(!l1.call(J,q))f0(J,q,{get:s1.bind($,q),enumerable:!(Z=c1($,q))||Z.enumerable})}return l0.set($,J),J},l0;var i1=($)=>$;function r1($,J){this[$]=i1.bind(null,J)}var n1=($,J)=>{for(var Z in J)f0($,Z,{get:J[Z],enumerable:!0,configurable:!0,set:r1.bind(J,Z)})};var N2={};n1(N2,{unregisterPipe:()=>Q0,registerPipe:()=>U0,registerComponent:()=>M,listPipes:()=>N0,isIframe:()=>Z0,createThemeToggle:()=>M0,applyHostTheme:()=>_0,app:()=>k0,PrefabRenderer:()=>p,Bridge:()=>t});class q0{data={};subscribers=new Map;globalSubscribers=new Set;generation=0;constructor($){if($)this.data=structuredClone($)}get($){return a1(this.data,$)}getAll(){return this.data}set($,J){s0(this.data,$,J),this.notify($)}toggle($){let J=this.get($),Z=J==null||J===!1||J===0||J==="";this.set($,Z)}append($,J,Z){let q=this.get($);if(!Array.isArray(q)){this.set($,[J]);return}if(Z!==void 0)q.splice(Z,0,J);else q.push(J);this.notify($)}pop($,J){let Z=this.get($);if(!Array.isArray(Z))return;if(typeof J==="number")Z.splice(J,1);else{let q=Z.indexOf(J);if(q>=0)Z.splice(q,1)}this.notify($)}merge($){for(let[J,Z]of Object.entries($))s0(this.data,J,Z);for(let J of Object.keys($))this.notify(J)}subscribe($,J){if(!this.subscribers.has($))this.subscribers.set($,new Set);return this.subscribers.get($)?.add(J),()=>this.subscribers.get($)?.delete(J)}subscribeAll($){return this.globalSubscribers.add($),()=>this.globalSubscribers.delete($)}notify($){this.generation++;let J=$.split(".");for(let Z=1;Z<=J.length;Z++){let q=J.slice(0,Z).join("."),U=this.subscribers.get(q);if(U)U.forEach((Q)=>Q())}this.globalSubscribers.forEach((Z)=>Z())}}function a1($,J){let Z=J.split("."),q=$;for(let U of Z){if(q==null||typeof q!=="object")return;q=q[U]}return q}var o1=new Set(["__proto__","constructor","prototype"]);function s0($,J,Z){let q=J.split(".");if(q.some((Q)=>o1.has(Q))){console.warn(`[prefab] Blocked prototype pollution attempt: ${J}`);return}let U=$;for(let Q=0;Q<q.length-1;Q++){let Y=q[Q];if(U[Y]==null||typeof U[Y]!=="object")U[Y]={};U=U[Y]}U[q[q.length-1]]=Z}var e=new Map;function U0($,J){if(e.has($)&&e.get($)!==J)console.warn(`[prefab] pipe "${$}" re-registered`);e.set($,J)}function Q0($){return e.delete($)}function N0(){return[...e.keys()]}function d0($){return e.get($)}var i0=-1,S0=new Map,t1=/\{\{\s*(.+?)\s*\}\}/g;function g($){return typeof $==="string"&&$.includes("{{")&&$.includes("}}")}function u($,J,Z){let q=$.trim();if(q.startsWith("{{")&&q.endsWith("}}")&&Q4(q,"{{")===1){let U=q.slice(2,-2).trim();return r0(U,J,Z)}return $.replace(t1,(U,Q)=>{let Y=r0(Q.trim(),J,Z);return Y==null?"":String(Y)})}function r0($,J,Z){let[q,...U]=U4($),Q=h(q.trim(),J,Z);for(let Y of U)Q=e1(Y.trim(),Q,J,Z);return Q}function h($,J,Z){let q=Z4($);if(q>=0){let Y=$.slice(0,q).trim(),W=$.slice(q+1),H=q4(W);if(H>=0){let N=W.slice(0,H).trim(),X=W.slice(H+1).trim(),_=h(Y,J,Z);return _!==null&&_!==void 0&&_!==!1&&_!==0&&_!==""?h(N,J,Z):h(X,J,Z)}}let U=X0($,"||");if(U>=0){let Y=h($.slice(0,U).trim(),J,Z);return Y!==null&&Y!==void 0&&Y!==!1&&Y!==0&&Y!==""?Y:h($.slice(U+2).trim(),J,Z)}let Q=X0($,"&&");if(Q>=0){let Y=h($.slice(0,Q).trim(),J,Z);if(Y===null||Y===void 0||Y===!1||Y===0||Y==="")return Y;return h($.slice(Q+2).trim(),J,Z)}for(let[Y,W]of $4){let H=X0($,Y);if(H>=0){let N=h($.slice(0,H).trim(),J,Z),X=h($.slice(H+Y.length).trim(),J,Z);return W(N,X)}}if($.startsWith("!")){let Y=h($.slice(1).trim(),J,Z);return Y===null||Y===void 0||Y===!1||Y===0||Y===""}for(let[Y,W]of J4){let H=X0($,Y);if(H>=0){let N=h($.slice(0,H).trim(),J,Z),X=h($.slice(H+Y.length).trim(),J,Z);return W(Number(N),Number(X))}}if($==="true")return!0;if($==="false")return!1;if($==="null"||$==="undefined")return null;if(/^-?\d+(\.\d+)?$/.test($))return Number($);if($.startsWith("'")&&$.endsWith("'")||$.startsWith('"')&&$.endsWith('"'))return $.slice(1,-1);if(Z&&$.startsWith("$")){let Y=$.indexOf(".");if(Y>=0){let W=$.slice(0,Y),H=$.slice(Y+1),N=Z[W];return G0(N,H)}return Z[$]}if(Z){let Y=$.split(".")[0];if(Y in Z)return G0(Z[Y],$.includes(".")?$.slice(Y.length+1):"")}return J.get($)}function e1($,J,Z,q){let U=$.indexOf(":"),Q=U>=0?$.slice(0,U).trim():$,Y=U>=0?$.slice(U+1).trim():void 0,W=Y?w0(Y):void 0;switch(Q){case"find":{if(!Array.isArray(J)||!Y)return;let H=n0(Y);if(H.length<2)return;let N=w0(H[0]),X=H[1].trim(),_;if(X.startsWith("'")&&X.endsWith("'")||X.startsWith('"')&&X.endsWith('"'))_=X.slice(1,-1);else if(Z){if(q&&X.startsWith("$")){let z=X.indexOf(".");if(z>=0){let j=X.slice(0,z);if(j in q)_=G0(q[j],X.slice(z+1))}else if(X in q)_=q[X]}if(_===void 0&&!(q&&X.startsWith("$")))if(q){let z=X.split(".")[0];_=z in q?G0(q[z],X.includes(".")?X.slice(z.length+1):""):Z.get(X)}else _=Z.get(X)}else _=X;if(_==null)return;let E=Z?.generation??0;if(E!==i0)S0=new Map,i0=E;let D=S0.get(J);if(!D)D=new Map,S0.set(J,D);let G=D.get(N);if(!G){G=new Map;for(let z of J)if(z!=null&&typeof z==="object"){let j=z[N];if(j!=null)G.set(String(j),z)}D.set(N,G)}return G.get(String(_))}case"dot":{if(J==null||typeof J!=="object"||typeof W!=="string")return;return J[W]}case"length":return Array.isArray(J)?J.length:typeof J==="string"?J.length:0;case"upper":return typeof J==="string"?J.toUpperCase():J;case"lower":return typeof J==="string"?J.toLowerCase():J;case"truncate":if(typeof J==="string"&&typeof W==="number")return J.slice(0,W);return J;case"join":return Array.isArray(J)?J.join(typeof W==="string"?W:", "):J;case"first":return Array.isArray(J)?J[0]:J;case"last":return Array.isArray(J)?J[J.length-1]:J;case"abs":return Math.abs(Number(J));case"round":return typeof W==="number"?Number(Number(J).toFixed(W)):Math.round(Number(J));case"number":return typeof W==="number"?Number(Number(J).toFixed(W)):Number(J);case"currency":{let H=typeof W==="string"?W:"USD";try{return new Intl.NumberFormat("en-US",{style:"currency",currency:H}).format(Number(J))}catch{return J}}case"percent":return typeof W==="number"?`${(Number(J)*100).toFixed(W)}%`:`${Math.round(Number(J)*100)}%`;case"compact":{let H=typeof W==="number"?W:1;try{return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:H}).format(Number(J))}catch{return J}}case"date":try{return new Date(J).toLocaleDateString()}catch{return J}case"time":try{return new Date(J).toLocaleTimeString()}catch{return J}case"datetime":try{return new Date(J).toLocaleString()}catch{return J}case"pluralize":{let H=Number(J),N=typeof W==="string"?W:"";return H===1?N:`${N}s`}case"default":return J==null||J===""?W:J;case"selectattr":return Array.isArray(J)&&typeof W==="string"?J.filter((H)=>H!=null&&typeof H==="object"&&Boolean(H[W])):J;case"rejectattr":return Array.isArray(J)&&typeof W==="string"?J.filter((H)=>{if(H==null||typeof H!=="object")return!1;let N=H[W];return N==null||N===!1||N===0||N===""}):J;default:{let H=d0(Q);if(H){let N=Y?n0(Y).map(w0):[];return H(J,...N)}return J}}}var $4=[["!==",($,J)=>$!==J],["===",($,J)=>$===J],["!=",($,J)=>$!=J],["==",($,J)=>$==J],[">=",($,J)=>Number($)>=Number(J)],["<=",($,J)=>Number($)<=Number(J)],[">",($,J)=>Number($)>Number(J)],["<",($,J)=>Number($)<Number(J)]],J4=[[" + ",($,J)=>$+J],[" - ",($,J)=>$-J],[" * ",($,J)=>$*J],[" / ",($,J)=>J!==0?$/J:0],[" % ",($,J)=>J!==0?$%J:0]];function X0($,J){let Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z&&$.slice(q,q+J.length)===J)return q}return-1}function Z4($){let J=0,Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z){if(U==="(")J++;else if(U===")")J--;else if(U==="?"&&J===0)return q}}return-1}function q4($){let J=0,Z=null;for(let q=0;q<$.length;q++){let U=$[q];if(U==="'"||U==='"')Z=Z===U?null:Z??U;if(!Z){if(U==="?"||U==="(")J++;else if(U===")")J--;else if(U===":"&&J===0)return q}}return-1}function U4($){let J=[],Z="",q=null;for(let U=0;U<$.length;U++){let Q=$[U];if(Q==="'"||Q==='"')q=q===Q?null:q??Q;if(Q==="|"&&!q)if($[U+1]==="|")Z+="||",U++;else J.push(Z),Z="";else Z+=Q}return J.push(Z),J}function w0($){let J=$.replace(/^['"]|['"]$/g,"");if(J==="true")return!0;if(J==="false")return!1;let Z=Number(J);return isNaN(Z)?J:Z}function n0($){let J=[],Z="",q=null;for(let U of $){if(U==="'"||U==='"')q=q===U?null:q??U;if(U===","&&!q)J.push(Z),Z="";else Z+=U}return J.push(Z),J}function G0($,J){if(!J)return $;let Z=J.split("."),q=$;for(let U of Z){if(q==null||typeof q!=="object")return;q=q[U]}return q}function Q4($,J){let Z=0,q=0;while((q=$.indexOf(J,q))!==-1)Z++,q+=J.length;return Z}async function k($,J){let Z=Array.isArray($)?$:[$];for(let q of Z)await Y4(q,J)}async function Y4($,J){let Z=$.action;switch(Z){case"setState":{W4($,J);return}case"toggleState":{H4($,J);return}case"appendState":{M4($,J);return}case"popState":{_4($,J);return}case"showToast":{B4($,J);return}case"closeOverlay":{N4($,J);return}case"openLink":{X4($);return}case"setInterval":{z4($,J);return}case"toolCall":case"callTool":return K4($,J);case"sendMessage":return D4($,J);case"updateContext":{F4($,J);return}case"fetch":return j4($,J);case"openFilePicker":{L4($,J);return}case"callHandler":return P4($,J);case"requestDisplayMode":{T4($,J);return}default:console.warn(`[prefab] Unknown action: ${Z}`)}}function W4($,J){let{key:Z,value:q}=$;if(g(q))q=u(q,J.store,J.scope);J.store.set(Z,q),J.rerender(),r($.onSuccess,J)}function H4($,J){J.store.toggle($.key),J.rerender()}function M4($,J){let Z=$.value??$.item;if(g(Z))Z=u(Z,J.store,J.scope);J.store.append($.key,Z,$.index),J.rerender()}function _4($,J){J.store.pop($.key,$.index),J.rerender()}function B4($,J){J.onToast?.({message:z0($.message,J),description:$.description!=null?z0($.description,J):void 0,variant:$.variant,duration:$.duration})}function N4($,J){if(typeof document<"u")document.dispatchEvent(new CustomEvent("prefab:close-overlay"))}function X4($){if(typeof window<"u"){let J=$.url;if(!J){console.warn("[prefab] openLink: missing url");return}if(!o0(J)){console.warn(`[prefab] Blocked unsafe URL scheme: ${J}`);return}window.open(J,$.target??"_blank")}}var E0=new Set,G4=20,E4=100;function z4($,J){let Z=Math.max($.intervalMs,E4),q=$.onTick;if(typeof globalThis.setInterval!=="function")return;if(E0.size>=G4){console.warn("[prefab] Max intervals reached, ignoring new setInterval");return}let U=globalThis.setInterval(()=>void k(q,J),Z);E0.add(U)}function a0(){for(let $ of E0)globalThis.clearInterval($);E0.clear()}async function K4($,J){if(!J.transport){console.warn("[prefab] No MCP transport configured for toolCall");return}let Z=$.tool,q=t0($.arguments,J);try{let U=await J.transport.callTool(Z,q);if($.resultKey!=null)J.store.set($.resultKey,U);J.rerender(),await r($.onSuccess,J,{$result:U})}catch(U){await r($.onError,J,{$error:U})}}async function D4($,J){if(!J.transport){console.warn("[prefab] No MCP transport configured for sendMessage");return}await J.transport.sendMessage(z0($.message,J))}function F4($,J){let Z=$.context;if(Z!=null)J.store.merge(Z),J.rerender()}async function j4($,J){let Z=z0($.url,J);if(!o0(Z)){console.warn(`[prefab] Blocked unsafe URL in fetch: ${Z}`);return}let q=$.method??"GET",U=$.headers,Q=$.body!==void 0?JSON.stringify($.body):void 0;try{let Y=await globalThis.fetch(Z,{method:q,headers:{"Content-Type":"application/json",...U},...Q&&{body:Q}}),W=await Y.json().catch(()=>Y.text());if($.resultKey!=null)J.store.set($.resultKey,W);J.rerender(),await r($.onSuccess,J,{$result:W})}catch(Y){await r($.onError,J,{$error:Y})}}function L4($,J){if(typeof document>"u")return;let Z=document.createElement("input");if(Z.type="file",$.accept!=null)Z.accept=$.accept;if($.multiple===!0)Z.multiple=!0;Z.addEventListener("change",()=>{let q=Array.from(Z.files??[]);if($.resultKey!=null)J.store.set($.resultKey,q);J.rerender(),r($.onSuccess,J,{$result:q})}),Z.click()}async function P4($,J){let Z=$.handler,q=t0($.arguments,J);if(!J.transport){console.warn(`[prefab] No transport configured for callHandler: ${Z}`);return}try{let U=await J.transport.callTool(Z,q);if($.resultKey!=null)J.store.set($.resultKey,U);J.rerender(),await r($.onSuccess,J,{$result:U})}catch(U){await r($.onError,J,{$error:U})}}function T4($,J){if(typeof document<"u")document.dispatchEvent(new CustomEvent("prefab:request-display-mode",{detail:{mode:$.mode}}))}var O4=/^\s*(javascript|vbscript|data):/i;function o0($){return!O4.test($)}function z0($,J){if(g($)){let Z=u($,J.store,J.scope);return Z==null?"":String(Z)}return $==null?"":String($)}function t0($,J){if(!$)return{};let Z={};for(let[q,U]of Object.entries($))Z[q]=g(U)?u(U,J.store,J.scope):U;return Z}async function r($,J,Z){if($==null)return;let q={...J.scope,...Z};await k($,{...J,scope:q})}var y0=new Map;function M($,J){if(y0.has($))console.warn(`[prefab] overriding existing renderer for "${$}"`);y0.set($,J)}function w($,J){if(J.defs?.[$.type]){let U={...J.defs[$.type],...$,type:J.defs[$.type].type};return w(U,J)}let Z=y0.get($.type),q;if(Z)q=Z($,J);else if(q=document.createElement("div"),q.setAttribute("data-prefab-type",$.type),$.children)for(let U of $.children)q.appendChild(w(U,J));if(q instanceof HTMLElement){if($.id)q.id=$.id;if($.cssClass){let U=K($.cssClass,J);if(U)q.className=(q.className?q.className+" ":"")+U}}if($.onMount){let U=$.onMount,Q=y(J);queueMicrotask(()=>void k(U,Q))}return q}function L($,J,Z){if(!$.children)return;n($.children,J,Z)}function n($,J,Z){let q=0;while(q<$.length){let U=$[q];if(U.type==="If")q=V4($,q,J,Z);else if(U.type==="Elif"||U.type==="Else")q++;else J.appendChild(w(U,Z)),q++}}function V4($,J,Z,q){let U=!1,Q=J,Y=$[Q];if(e0(Y.condition,q))C0(Y,Z,q),U=!0;Q++;while(Q<$.length){let W=$[Q];if(W.type==="Elif"){if(!U&&e0(W.condition,q))C0(W,Z,q),U=!0;Q++}else if(W.type==="Else"){if(!U)C0(W,Z,q);Q++;break}else break}return Q}function e0($,J){if(!$)return!1;if(g($))return Boolean(u($,J.store,J.scope));return Boolean(J.store.get($))}function C0($,J,Z){if(!$.children)return;n($.children,J,Z)}function K($,J){if(g($)){let Z=u($,J.store,J.scope);return Z==null?"":String(Z)}return $==null?"":String($)}function b($,J){if(g($))return u($,J.store,J.scope);return $}function y($){return{store:$.store,transport:$.transport,scope:$.scope,rerender:$.rerender,onToast:$.onToast}}function B($,J){let Z=document.createElement($);if(J)Z.className=J;return Z}function b0($,J){return $.textContent=J,$}function q1(){M("Column",I4),M("Row",R4),M("Grid",$1),M("GridItem",J1),M("Container",A4),M("Div",Z1),M("Span",k4),M("Dashboard",$1),M("DashboardItem",J1),M("Pages",f4),M("Page",Z1),M("Detail",S4),M("MasterDetail",w4)}function I4($,J){let Z=B("div","pf-column");Z.style.display="flex",Z.style.flexDirection="column";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;if($.align!=null)Z.style.alignItems=U1($.align);if($.justify!=null)Z.style.justifyContent=Q1($.justify);return L($,Z,J),Z}function R4($,J){let Z=B("div","pf-row");Z.style.display="flex",Z.style.flexDirection="row";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;if($.align!=null)Z.style.alignItems=U1($.align);if($.justify!=null)Z.style.justifyContent=Q1($.justify);if($.wrap===!0)Z.style.flexWrap="wrap";return L($,Z,J),Z}function $1($,J){let Z=B("div","pf-grid");Z.style.display="grid";let q=$.columns??3;Z.style.gridTemplateColumns=`repeat(${q}, 1fr)`;let U=K0($);if(U!=null)Z.style.gap=`${U*4}px`;return L($,Z,J),Z}function J1($,J){let Z=B("div","pf-grid-item");if($.colSpan!=null)Z.style.gridColumn=`span ${$.colSpan}`;if($.rowSpan!=null)Z.style.gridRow=`span ${$.rowSpan}`;return L($,Z,J),Z}function A4($,J){let Z=B("div","pf-container");if(Z.style.maxWidth=$.maxWidth??"1200px",Z.style.margin="0 auto",$.padding!=null)Z.style.padding=`${$.padding*4}px`;return L($,Z,J),Z}function Z1($,J){let Z=B("div","pf-div");return L($,Z,J),Z}function k4($,J){let Z=B("span","pf-span");return L($,Z,J),Z}function f4($,J){let Z=B("div","pf-pages");return L($,Z,J),Z}function S4($,J){let Z=B("div","pf-detail"),q=$.of!=null?b($.of,J):void 0;if(q!=null&&q!==""&&q!==!1&&q!==0)L($,Z,J);else if($.empty!=null){let U=$.empty;Z.appendChild(w(U,J))}return Z}function w4($,J){let Z=B("div","pf-master-detail");Z.style.display="flex",Z.style.flexDirection="row";let q=K0($);if(q!=null)Z.style.gap=`${q*4}px`;let U=$.masterWidth??"33%",Q=$.children??[];if(Q.length>0){let Y=B("div","pf-master-detail-master");Y.style.width=U,Y.style.flexShrink="0",Y.style.overflow="auto",Y.appendChild(w(Q[0],J)),Z.appendChild(Y)}if(Q.length>1){let Y=B("div","pf-master-detail-detail");Y.style.flex="1",Y.style.overflow="auto",Y.appendChild(w(Q[1],J)),Z.appendChild(Y)}return Z}var C4=/\bgap-(\d+)\b/;function K0($){if($.gap!=null)return $.gap;if(typeof $.cssClass==="string"){let J=C4.exec($.cssClass);if(J)return Number(J[1])}return null}function U1($){return{start:"flex-start",end:"flex-end",center:"center",stretch:"stretch",baseline:"baseline"}[$]??$}function Q1($){return{start:"flex-start",end:"flex-end",center:"center",between:"space-between",around:"space-around",evenly:"space-evenly"}[$]??$}function W1(){M("Heading",y4),M("H1",($,J)=>D0($,J,"h1")),M("H2",($,J)=>D0($,J,"h2")),M("H3",($,J)=>D0($,J,"h3")),M("H4",($,J)=>D0($,J,"h4")),M("Text",b4),M("P",m4),M("Lead",($,J)=>$0($,J,"p","pf-lead")),M("Large",($,J)=>$0($,J,"span","pf-large")),M("Small",($,J)=>$0($,J,"small","pf-small")),M("Muted",($,J)=>$0($,J,"p","pf-muted")),M("BlockQuote",($,J)=>$0($,J,"blockquote","pf-blockquote")),M("Label",($,J)=>$0($,J,"label","pf-label")),M("Link",h4),M("Code",g4),M("Markdown",u4),M("Kbd",x4)}function y4($,J){let Z=$.level??2,q=`h${Math.min(Math.max(Z,1),6)}`,U=document.createElement(q);return U.className=`pf-heading pf-${q}`,U.textContent=K($.content,J),U}function D0($,J,Z){let q=document.createElement(Z);return q.className=`pf-heading pf-${Z}`,q.textContent=K($.content,J),q}function b4($,J){return b0(B("span","pf-text"),K($.content,J))}function m4($,J){return b0(B("p","pf-p"),K($.content,J))}function $0($,J,Z,q){let U=document.createElement(Z);return U.className=q,U.textContent=K($.content,J),U}var v4=/^\s*(javascript|vbscript|data):/i;function h4($,J){let Z=document.createElement("a");if(Z.className="pf-link",Z.textContent=K($.content,J),$.href!=null){let q=K($.href,J);if(!v4.test(q))Z.href=q}if($.target!=null)Z.target=K($.target,J);return Z}function g4($,J){let Z=B("pre","pf-code"),q=B("code");if(q.textContent=K($.content,J),$.language!=null)q.setAttribute("data-language",$.language);return Z.appendChild(q),Z}function u4($,J){let Z=B("div","pf-markdown"),q=K($.content,J);return Z.innerHTML=H1(q),Z.setAttribute("data-markdown","true"),Z}var Y1=/^\s*(javascript|vbscript|data):/i;function j0($){return $.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function F0($){let J=j0($),Z=[];return J=J.replace(/`([^`]+)`/g,(q,U)=>{return Z.push(`<code>${U}</code>`),`CODE${Z.length-1}`}),J=J.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(q,U,Q)=>{if(Y1.test(Q))return j0(U);return`<img src="${Q}" alt="${U}" />`}),J=J.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(q,U,Q)=>{if(Y1.test(Q))return U;return`<a href="${Q}">${U}</a>`}),J=J.replace(/\*{3}(.+?)\*{3}/g,"<strong><em>$1</em></strong>"),J=J.replace(/_{3}(.+?)_{3}/g,"<strong><em>$1</em></strong>"),J=J.replace(/\*{2}(.+?)\*{2}/g,"<strong>$1</strong>"),J=J.replace(/_{2}(.+?)_{2}/g,"<strong>$1</strong>"),J=J.replace(/\*(.+?)\*/g,"<em>$1</em>"),J=J.replace(/(?<!\w)_(.+?)_(?!\w)/g,"<em>$1</em>"),J=J.replace(/~~(.+?)~~/g,"<del>$1</del>"),J=J.replace(/\uFDD0CODE(\d+)\uFDD0/g,(q,U)=>Z[parseInt(U)]),J}function H1($){let J=$.replace(/\r\n?/g,`
|
|
2
2
|
`).split(`
|
|
3
3
|
`),Z=[],q=0;while(q<J.length){let U=J[q];if(U.trimStart().startsWith("```")){let W=U.trimStart().slice(3).trim(),H=[];q++;while(q<J.length&&!J[q].trimStart().startsWith("```"))H.push(j0(J[q])),q++;q++;let N=W?` data-language="${j0(W)}"`:"";Z.push(`<pre class="pf-code"><code${N}>${H.join(`
|
|
4
4
|
`)}</code></pre>`);continue}if(/^(\s*[-*_]\s*){3,}$/.test(U)){Z.push("<hr />"),q++;continue}let Q=/^(#{1,6})\s+(.+)$/.exec(U);if(Q){let W=Q[1].length;Z.push(`<h${W}>${F0(Q[2])}</h${W}>`),q++;continue}if(U.startsWith("> ")||U===">"){let W=[];while(q<J.length&&(J[q].startsWith("> ")||J[q]===">"))W.push(J[q].replace(/^>\s?/,"")),q++;Z.push(`<blockquote>${H1(W.join(`
|
|
@@ -11,4 +11,4 @@ ${U}
|
|
|
11
11
|
:root:not([data-theme="light"]) {
|
|
12
12
|
${U}
|
|
13
13
|
}
|
|
14
|
-
}`}}function u1($,J){if(!$||typeof document>"u")return;let Z=(q)=>{for(let[U,Q]of Object.entries($))if(J2(U,q))q.preventDefault(),J(Q)};return document.addEventListener("keydown",Z),()=>document.removeEventListener("keydown",Z)}function J2($,J){let Z=$.toLowerCase().split("+").map((Q)=>Q.trim()),q=Z[Z.length-1],U=new Set(Z.slice(0,-1));if(U.has("ctrl")!==(J.ctrlKey||J.metaKey))return!1;if(U.has("shift")!==J.shiftKey)return!1;if(U.has("alt")!==J.altKey)return!1;return J.key.toLowerCase()===q}var m1='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"/></svg>',v1='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"/></svg>',h1={"top-right":"top: 8px; right: 8px;","top-left":"top: 8px; left: 8px;","bottom-right":"bottom: 8px; right: 8px;","bottom-left":"bottom: 8px; left: 8px;"};function Z2($,J){try{let q=localStorage.getItem(J);if(q==="light"||q==="dark")return q}catch{}let Z=$.getAttribute("data-theme")??document.documentElement.getAttribute("data-theme");if(Z==="light"||Z==="dark")return Z;if(typeof window<"u"&&window.matchMedia("(prefers-color-scheme: light)").matches)return"light";return"dark"}function M0($,J){if(typeof document>"u")return()=>{};let Z=J?.position??"top-right",q=J?.storageKey??"prefab-theme",U=J?.syncDocument??!0,Q=getComputedStyle($).position;if(Q==="static"||Q==="")$.style.position="relative";let Y=document.createElement("button");Y.className="pf-theme-toggle",Y.setAttribute("aria-label","Toggle theme"),Y.setAttribute("title","Toggle light/dark"),Object.assign(Y.style,{position:"absolute",zIndex:"100",width:"28px",height:"28px",border:"1px solid var(--border, #e5e7eb)",borderRadius:"6px",background:"var(--card, rgba(255,255,255,0.8))",color:"var(--foreground, #333)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",padding:"0",opacity:"0.7",transition:"opacity 0.15s, border-color 0.15s"});let W=h1[Z]??h1["top-right"];for(let _ of W.split(";")){let[E,D]=_.split(":").map((G)=>G.trim());if(E&&D)Y.style.setProperty(E,D)}Y.addEventListener("mouseenter",()=>{Y.style.opacity="1"}),Y.addEventListener("mouseleave",()=>{Y.style.opacity="0.7"});function H(_){if($.setAttribute("data-theme",_),U)document.documentElement.setAttribute("data-theme",_);Y.innerHTML=_==="dark"?v1:m1;try{localStorage.setItem(q,_)}catch{}}let N=Z2($,q);H(N),Y.addEventListener("click",()=>{let _=$.getAttribute("data-theme")??"dark";H(_==="dark"?"light":"dark")}),$.appendChild(Y);let X;if(U)X=new MutationObserver((_)=>{for(let E of _)if(E.type==="attributes"&&E.attributeName==="data-theme"){let D=document.documentElement.getAttribute("data-theme");if((D==="light"||D==="dark")&&D!==$.getAttribute("data-theme")){$.setAttribute("data-theme",D),Y.innerHTML=D==="dark"?v1:m1;try{localStorage.setItem(q,D)}catch{}}}}),X.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});return()=>{X?.disconnect(),Y.remove()}}function R0($){let J=$?.baseUrl??(typeof window<"u"?window.location.origin:""),Z={"Content-Type":"application/json",...$?.headers},q=$?.fetch??globalThis.fetch.bind(globalThis);return{async callTool(U,Q){let Y=await q(`${J}/mcp/tools/call`,{method:"POST",headers:Z,body:JSON.stringify({jsonrpc:"2.0",method:"tools/call",params:{name:U,arguments:Q}})});if(!Y.ok)throw Error(`MCP tool call failed: ${Y.status} ${Y.statusText}`);let W=await Y.json();if(W.error)throw Error(W.error.message??"MCP tool call returned error");let H=W.result?.content??W.content??[];for(let N of H)if(N.type==="text"&&N.text!==void 0){try{let X=JSON.parse(N.text);if(typeof X==="object"&&X!==null&&"$prefab"in X)return X;return X}catch{}return N.text}return W.result??W},async sendMessage(U){await q(`${J}/mcp/messages`,{method:"POST",headers:Z,body:JSON.stringify({message:U})})}}}function A0(){return{callTool($){return console.warn(`[prefab] No MCP transport: callTool('${$}') ignored`),Promise.resolve(null)},sendMessage($){return console.warn("[prefab] No MCP transport: sendMessage ignored",$),Promise.resolve()}}}function q2($){return $!==null&&typeof $==="object"&&$.jsonrpc==="2.0"}class t{hostOrigin;listeners=new Map;protocol="prefab";cleanup;pending=new Map;callIdCounter=0;rpcPending=new Map;rpcIdCounter=0;sentRpcIds=new Set;postFn;constructor($="*"){this.hostOrigin=$}connect(){if(typeof window>"u")return;let $=Q2();if($)this.postFn=(Z)=>$.postMessage(Z);let J=(Z)=>{if(this.hostOrigin!=="*"&&Z.origin!==this.hostOrigin)return;let q=Z.data;if(q2(q)){this.handleJsonRpc(q);return}let U=q;if(!U?.type.startsWith("prefab:"))return;if(U.type==="prefab:tool-call-response"&&U.id){let Y=this.pending.get(U.id);if(Y){if(this.pending.delete(U.id),U.payload?.error!=null)Y.reject(Error(U.payload.error));else Y.resolve(U.payload?.result);return}}let Q=this.listeners.get(U.type);if(Q)for(let Y of Q)Y(U.payload??{})};window.addEventListener("message",J),this.cleanup=()=>window.removeEventListener("message",J)}async initialize($){try{return await Promise.any([this.initPrefab($),this.initJsonRpc($)])}catch(J){let Z=J instanceof AggregateError?J.errors.map((q)=>q.message).join("; "):String(J);throw Error(`Bridge init failed — no host responded. Tried: ${Z}`,{cause:J})}}createTransport(){if(this.protocol==="jsonrpc")return this.createJsonRpcTransport();return this.createPrefabTransport()}requestMode($){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/request-display-mode",{mode:$});else this.sendPrefab("prefab:request-mode",{mode:$})}openLink($,J){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/open-link",{url:$,target:J});else this.sendPrefab("prefab:open-link",{url:$,target:J})}updateContext($){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/update-model-context",{structuredContent:$});else this.sendPrefab("prefab:update-context",{context:$})}setupAutoResize($){if(typeof ResizeObserver>"u")return U2;let J=-1,Z=-1,q=(Y,W)=>{if(Y===J&&W===Z)return;if(J=Y,Z=W,this.protocol==="jsonrpc")this.sendRpcNotification("ui/notifications/size-changed",{width:Y,height:W});else this.sendPrefab("prefab:size-changed",{width:Y,height:W})},U=new ResizeObserver((Y)=>{for(let W of Y)if(W.borderBoxSize.length){let H=W.borderBoxSize[0];q(Math.ceil(H.inlineSize),Math.ceil(H.blockSize))}else{let H=W.target.getBoundingClientRect();q(Math.ceil(H.width),Math.ceil(H.height))}});U.observe($);let Q=$.getBoundingClientRect();return q(Math.ceil(Q.width),Math.ceil(Q.height)),()=>U.disconnect()}on($,J){if(!this.listeners.has($))this.listeners.set($,new Set);let Z=this.listeners.get($);if(Z)Z.add(J)}off($,J){this.listeners.get($)?.delete(J)}disconnect(){this.cleanup?.(),this.listeners.clear();for(let[,$]of this.pending)$.reject(Error("Bridge disconnected"));this.pending.clear();for(let[,$]of this.rpcPending)$.reject(Error("Bridge disconnected"));this.rpcPending.clear(),this.sentRpcIds.clear()}get activeProtocol(){return this.protocol}initPrefab($){return new Promise((J,Z)=>{let q=!1,U=(Q)=>{if(q)return;q=!0,this.off("prefab:init-response",U),this.protocol="prefab",J(Q)};this.on("prefab:init-response",U),this.sendPrefab("prefab:init",{capabilities:$}),setTimeout(()=>{if(!q)q=!0,this.off("prefab:init-response",U),Z(Error("prefab:init timeout"))},2000)})}createPrefabTransport(){return{callTool:($,J)=>{let Z=`tc-${++this.callIdCounter}`;return new Promise((q,U)=>{this.pending.set(Z,{resolve:q,reject:U}),this.sendPrefab("prefab:tool-call",{tool:$,arguments:J},Z),setTimeout(()=>{if(this.pending.has(Z))this.pending.delete(Z),U(Error(`Tool call '${$}' timed out`))},30000)})},sendMessage:($)=>{return this.sendPrefab("prefab:send-message",{message:$}),Promise.resolve()}}}sendPrefab($,J,Z){if(typeof window>"u")return;let q=window.parent!==window?window.parent:window,U={type:$,payload:J,id:Z};q.postMessage(U,this.hostOrigin)}handleJsonRpc($){if(!("method"in $)){let q=this.rpcPending.get($.id);if(q)if(this.rpcPending.delete($.id),$.error)q.reject(Error($.error.message));else q.resolve($.result);return}let J=$.method,Z=$.params??{};if($.id!=null&&this.sentRpcIds.delete($.id))return;if($.id!=null)this.postJsonRpc({jsonrpc:"2.0",id:$.id,result:{}});switch(J){case"ui/notifications/tool-input":this.dispatch("prefab:tool-input",{args:Z.arguments??Z});break;case"ui/notifications/tool-input-partial":this.dispatch("prefab:tool-input-partial",{args:Z.arguments??Z});break;case"ui/notifications/tool-result":this.dispatch("prefab:tool-result",{result:Z});break;case"ui/notifications/tool-cancelled":this.dispatch("prefab:tool-cancelled",Z);break;case"ui/notifications/host-context-changed":{let q={};if(typeof Z.theme==="string")q.colorScheme=Z.theme;if(typeof Z.styles==="object"&&Z.styles!==null){let U=Z.styles;if(U.variables)q.variables=U.variables}this.dispatch("prefab:theme-update",q);break}case"ui/resource-teardown":this.dispatch("prefab:teardown",Z);break}}initJsonRpc($){return new Promise((J,Z)=>{let q=++this.rpcIdCounter,U=!1;this.rpcPending.set(q,{resolve:(Q)=>{if(U)return;U=!0,this.protocol="jsonrpc";let Y=Q??{},W=Y.hostInfo??{},H=Y.hostContext??{},N=Y.hostCapabilities??{},X;if(typeof H.theme==="string"||typeof H.styles==="object"){if(X={},typeof H.theme==="string")X.colorScheme=H.theme;if(typeof H.styles==="object"&&H.styles!==null){let _=H.styles;if(_.variables)X.variables=_.variables}}this.postJsonRpc({jsonrpc:"2.0",method:"ui/notifications/initialized",params:{}}),J({hostName:W.name,hostVersion:W.version,capabilities:{toast:!0,navigation:N.openLinks!=null,messaging:!0,displayModes:H.availableDisplayModes??[]},theme:X,toolInput:void 0,meta:H})},reject:(Q)=>{if(U)return;U=!0,Z(Q)}}),this.postJsonRpc({jsonrpc:"2.0",id:q,method:"ui/initialize",params:{protocolVersion:"2026-01-26",appInfo:{name:"prefab",version:"0.2"},appCapabilities:{...$.displayModes&&{availableDisplayModes:$.displayModes}}}}),setTimeout(()=>{if(!U)U=!0,this.rpcPending.delete(q),Z(Error("ui/initialize timeout"))},2000)})}createJsonRpcTransport(){return{callTool:($,J)=>{return this.sendRpcRequest("tools/call",{name:$,arguments:J})},sendMessage:($)=>{return this.sendRpcRequest("ui/message",{role:"user",content:{type:"text",text:$}})}}}sendRpcRequest($,J){let Z=++this.rpcIdCounter;return new Promise((q,U)=>{this.rpcPending.set(Z,{resolve:q,reject:U}),this.postJsonRpc({jsonrpc:"2.0",id:Z,method:$,params:J}),setTimeout(()=>{if(this.rpcPending.has(Z))this.rpcPending.delete(Z),U(Error(`JSON-RPC '${$}' timed out`))},30000)})}sendRpcNotification($,J){this.postJsonRpc({jsonrpc:"2.0",method:$,params:J})}postJsonRpc($){if(typeof window>"u")return;if($.id!=null&&typeof $.method==="string")this.sentRpcIds.add($.id);if(this.postFn)this.postFn($);else(window.parent!==window?window.parent:window).postMessage($,this.hostOrigin)}dispatch($,J){let Z=this.listeners.get($);if(Z)for(let q of Z)q(J)}}var U2=()=>{};function _0($,J){if(J.variables)for(let[Z,q]of Object.entries(J.variables))$.style.setProperty(Z.startsWith("--")?Z:`--${Z}`,q);if(J.colorScheme&&J.colorScheme!=="auto")$.setAttribute("data-theme",J.colorScheme)}function Z0(){if(typeof window>"u")return!1;try{return window.self!==window.top}catch{return!0}}function Q2(){if(typeof window>"u")return;let $=window;if(typeof $.acquireVsCodeApi==="function")try{let J=$.acquireVsCodeApi();if(J!==null&&typeof J==="object"&&"postMessage"in J)return J}catch{return}return}async function k0($){I0();let J=$?.mode??"auto",Z=J==="bridge"||J==="auto"&&Z0(),q,U,Q={capabilities:{}};if(Z)U=new t($?.hostOrigin),U.connect(),Q=await U.initialize($?.capabilities??{toolInput:!0}),q=U.createTransport();else if($?.transport)q=R0($.transport);else q=A0();if(Q.theme&&typeof document<"u")_0(document.documentElement,Q.theme);let Y,W,H,N,X=Q.toolInput,_;if(U)U.on("prefab:tool-input",(G)=>{let z=G.args??G;if(Y)Y(z);else X=z}),U.on("prefab:tool-result",(G)=>{let z=G.result??G;if(W)W(z);else _=z}),U.on("prefab:tool-cancelled",()=>{H?.()}),U.on("prefab:tool-input-partial",(G)=>{N?.(G.args??G)}),U.on("prefab:theme-update",(G)=>{if(typeof document<"u")_0(document.documentElement,G)});function E(G,...z){let j=c0(G),O=new q0,A={store:O,scope:{},transport:q,rerender:()=>R(),onToast:void 0};function R(){j.innerHTML="";for(let F of z)j.appendChild(w(F,A))}return R(),{rerender:R,store:O,destroy:()=>{j.innerHTML=""}}}return{callTool:(G,z={})=>q.callTool(G,z),sendMessage:(G)=>q.sendMessage(G),onToolInput:(G)=>{if(Y=G,X){let z=X;X=void 0,queueMicrotask(()=>G(z))}},onToolResult:(G)=>{if(W=G,_!==void 0){let z=_;_=void 0,queueMicrotask(()=>G(z))}},onToolCancelled:(G)=>{H=G},onToolInputPartial:(G)=>{N=G},render:E,mount:(G,z,j)=>{let O=c0(G);return p.mount(O,z,{transport:q,...j})},requestMode:(G)=>U?.requestMode(G),openLink:(G,z)=>{if(U)U.openLink(G,z);else if(typeof window<"u")window.open(G,z??"_blank")},updateContext:(G)=>{if(U)U.updateContext(G)},setupAutoResize:(G)=>{if(!U)return Y2;let z=typeof G==="string"?c0(G):G;return U.setupAutoResize(z)},host:Q,capabilities:Q.capabilities,theme:Q.theme,transport:q,destroy:()=>U?.disconnect()}}var Y2=()=>{};function c0($){if(typeof $==="string"){if(typeof document>"u")throw Error("Cannot resolve selector outside browser");let J=document.querySelector($);if(!J)throw Error(`Element not found: ${$}`);return J}return $}var p={mount($,J,Z){I0();let q=[];if(J.pipes)for(let[D,G]of Object.entries(J.pipes))H2(D,G,q);let U=new q0(J.state),Q;if(Z?.transport&&"callTool"in Z.transport)Q=Z.transport;else if(Z?.transport)Q=R0(Z.transport);else Q=A0();let Y=Z?.onToast??M2,W={store:U,scope:{},transport:Q,rerender:()=>E(),onToast:Y,defs:J.defs};g1($,J.theme);let H=[];if(J.stylesheets)for(let D of J.stylesheets){let G=document.createElement("style");G.textContent=D,G.dataset.prefab="injected",document.head.appendChild(G),H.push(G)}let N;if(J.keyBindings)N=u1(J.keyBindings,async(D)=>{await k(D,{store:U,transport:Q,scope:{},rerender:()=>E(),onToast:Y})});let X,_=Z?.themeToggle??!0;if(_!==!1)X=M0($,typeof _==="object"?_:void 0);function E(){let D=$.querySelector(".pf-theme-toggle");$.innerHTML="";let G=w(J.view,W);if($.appendChild(G),D)$.appendChild(D)}return E(),{rerender:()=>E(),update(D){U.merge(D.update.state),E()},store:U,destroy(){X?.(),N?.(),a0();for(let D of H)D.remove();for(let D of q)Q0(D);$.innerHTML=""}}},isPrefabData($){return $!=null&&typeof $==="object"&&"$prefab"in $},isPrefabUpdate($){return $!=null&&typeof $==="object"&&"$prefab"in $&&"update"in $}},W2=new Set(["find","dot","length","upper","lower","truncate","join","first","last","abs","round","number","currency","percent","compact","date","time","datetime","pluralize","default","selectattr","rejectattr"]);function H2($,J,Z){if(W2.has($)){console.warn(`[prefab] wire pipe "${$}" ignored — shadows built-in`);return}try{let q=Function("return ("+J+")")();if(typeof q!=="function"){console.warn(`[prefab] wire pipe "${$}" — source did not evaluate to a function`);return}U0($,q),Z.push($)}catch(q){console.warn(`[prefab] wire pipe "${$}" — failed to hydrate:`,q)}}function M2($){if(typeof document>"u")return;let J=_2(),Z=document.createElement("div"),q=$.variant??"default";Z.className=`pf-toast${q!=="default"?` pf-toast--${q}`:""}`,Z.setAttribute("data-variant",q),Z.style.marginBottom="8px",Z.style.transition="opacity 0.3s ease";let U=document.createElement("div");if(U.textContent=$.message,U.style.fontWeight="500",Z.appendChild(U),$.description){let Y=document.createElement("div");Y.textContent=$.description,Y.style.fontSize="14px",Y.style.color="var(--muted-foreground, #6b7280)",Z.appendChild(Y)}J.appendChild(Z);let Q=$.duration??4000;setTimeout(()=>{Z.style.opacity="0",setTimeout(()=>Z.remove(),300)},Q)}function _2(){let J=document.getElementById("prefab-toast-container");if(!J)J=document.createElement("div"),J.id="prefab-toast-container",J.style.position="fixed",J.style.bottom="16px",J.style.right="16px",J.style.zIndex="9999",J.style.maxWidth="400px",document.body.appendChild(J);return J}if(typeof window<"u"){let $=window;$.PrefabRenderer=p,$.prefab={app:k0,mount:p.mount.bind(p),isPrefabData:p.isPrefabData.bind(p),isPrefabUpdate:p.isPrefabUpdate.bind(p),Bridge:t,isIframe:Z0,registerPipe:U0,unregisterPipe:Q0,listPipes:N0,registerComponent:M,createThemeToggle:M0};let J=$.__PREFAB_DATA__;if(J!=null){let Z=document.getElementById("prefab-root");if(Z)p.mount(Z,J)}}})();
|
|
14
|
+
}`}}function u1($,J){if(!$||typeof document>"u")return;let Z=(q)=>{for(let[U,Q]of Object.entries($))if(J2(U,q))q.preventDefault(),J(Q)};return document.addEventListener("keydown",Z),()=>document.removeEventListener("keydown",Z)}function J2($,J){let Z=$.toLowerCase().split("+").map((Q)=>Q.trim()),q=Z[Z.length-1],U=new Set(Z.slice(0,-1));if(U.has("ctrl")!==(J.ctrlKey||J.metaKey))return!1;if(U.has("shift")!==J.shiftKey)return!1;if(U.has("alt")!==J.altKey)return!1;return J.key.toLowerCase()===q}var m1='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"/></svg>',v1='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"/></svg>',h1={"top-right":"top: 8px; right: 8px;","top-left":"top: 8px; left: 8px;","bottom-right":"bottom: 8px; right: 8px;","bottom-left":"bottom: 8px; left: 8px;"};function Z2($,J){try{let q=localStorage.getItem(J);if(q==="light"||q==="dark")return q}catch{}let Z=$.getAttribute("data-theme")??document.documentElement.getAttribute("data-theme");if(Z==="light"||Z==="dark")return Z;if(typeof window<"u"&&window.matchMedia("(prefers-color-scheme: light)").matches)return"light";return"dark"}function M0($,J){if(typeof document>"u")return()=>{};let Z=J?.position??"top-right",q=J?.storageKey??"prefab-theme",U=J?.syncDocument??!0,Q=getComputedStyle($).position;if(Q==="static"||Q==="")$.style.position="relative";let Y=document.createElement("button");Y.className="pf-theme-toggle",Y.setAttribute("aria-label","Toggle theme"),Y.setAttribute("title","Toggle light/dark"),Object.assign(Y.style,{position:"absolute",zIndex:"100",width:"28px",height:"28px",border:"1px solid var(--border, #e5e7eb)",borderRadius:"6px",background:"var(--card, rgba(255,255,255,0.8))",color:"var(--foreground, #333)",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",padding:"0",opacity:"0.7",transition:"opacity 0.15s, border-color 0.15s"});let W=h1[Z]??h1["top-right"];for(let _ of W.split(";")){let[E,D]=_.split(":").map((G)=>G.trim());if(E&&D)Y.style.setProperty(E,D)}Y.addEventListener("mouseenter",()=>{Y.style.opacity="1"}),Y.addEventListener("mouseleave",()=>{Y.style.opacity="0.7"});function H(_){if($.setAttribute("data-theme",_),U)document.documentElement.setAttribute("data-theme",_);Y.innerHTML=_==="dark"?v1:m1;try{localStorage.setItem(q,_)}catch{}}let N=Z2($,q);H(N),Y.addEventListener("click",()=>{let _=$.getAttribute("data-theme")??"dark";H(_==="dark"?"light":"dark")}),$.appendChild(Y);let X;if(U)X=new MutationObserver((_)=>{for(let E of _)if(E.type==="attributes"&&E.attributeName==="data-theme"){let D=document.documentElement.getAttribute("data-theme");if((D==="light"||D==="dark")&&D!==$.getAttribute("data-theme")){$.setAttribute("data-theme",D),Y.innerHTML=D==="dark"?v1:m1;try{localStorage.setItem(q,D)}catch{}}}}),X.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});return()=>{X?.disconnect(),Y.remove()}}function R0($){let J=$?.baseUrl??(typeof window<"u"?window.location.origin:""),Z={"Content-Type":"application/json",...$?.headers},q=$?.fetch??globalThis.fetch.bind(globalThis);return{async callTool(U,Q){let Y=await q(`${J}/mcp/tools/call`,{method:"POST",headers:Z,body:JSON.stringify({jsonrpc:"2.0",method:"tools/call",params:{name:U,arguments:Q}})});if(!Y.ok)throw Error(`MCP tool call failed: ${Y.status} ${Y.statusText}`);let W=await Y.json();if(W.error)throw Error(W.error.message??"MCP tool call returned error");let H=W.result?.content??W.content??[];for(let N of H)if(N.type==="text"&&N.text!==void 0){try{let X=JSON.parse(N.text);if(typeof X==="object"&&X!==null&&"$prefab"in X)return X;return X}catch{}return N.text}return W.result??W},async sendMessage(U){await q(`${J}/mcp/messages`,{method:"POST",headers:Z,body:JSON.stringify({message:U})})}}}function A0(){return{callTool($){return console.warn(`[prefab] No MCP transport: callTool('${$}') ignored`),Promise.resolve(null)},sendMessage($){return console.warn("[prefab] No MCP transport: sendMessage ignored",$),Promise.resolve()}}}function q2($){return $!==null&&typeof $==="object"&&$.jsonrpc==="2.0"}class t{hostOrigin;listeners=new Map;protocol="prefab";cleanup;pending=new Map;callIdCounter=0;rpcPending=new Map;rpcIdCounter=0;sentRpcIds=new Set;postFn;constructor($="*"){this.hostOrigin=$}connect(){if(typeof window>"u")return;let $=Y2();if($)this.postFn=(Z)=>$.postMessage(Z);let J=(Z)=>{if(this.hostOrigin!=="*"&&Z.origin!==this.hostOrigin)return;let q=Z.data;if(q2(q)){this.handleJsonRpc(q);return}let U=q;if(!U?.type.startsWith("prefab:"))return;if(U.type==="prefab:tool-call-response"&&U.id){let Y=this.pending.get(U.id);if(Y){if(this.pending.delete(U.id),U.payload?.error!=null)Y.reject(Error(U.payload.error));else Y.resolve(U.payload?.result);return}}let Q=this.listeners.get(U.type);if(Q)for(let Y of Q)Y(U.payload??{})};window.addEventListener("message",J),this.cleanup=()=>window.removeEventListener("message",J)}async initialize($){try{return await Promise.any([this.initPrefab($),this.initJsonRpc($)])}catch(J){let Z=J instanceof AggregateError?J.errors.map((q)=>q.message).join("; "):String(J);throw Error(`Bridge init failed — no host responded. Tried: ${Z}`,{cause:J})}}createTransport(){if(this.protocol==="jsonrpc")return this.createJsonRpcTransport();return this.createPrefabTransport()}requestMode($){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/request-display-mode",{mode:$});else this.sendPrefab("prefab:request-mode",{mode:$})}openLink($,J){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/open-link",{url:$,target:J});else this.sendPrefab("prefab:open-link",{url:$,target:J})}updateContext($){if(this.protocol==="jsonrpc")this.sendRpcRequest("ui/update-model-context",{structuredContent:$});else this.sendPrefab("prefab:update-context",{context:$})}setupAutoResize($){if(typeof ResizeObserver>"u")return U2;let J=-1,Z=-1,q=(Y,W)=>{if(Y===J&&W===Z)return;if(J=Y,Z=W,this.protocol==="jsonrpc")this.sendRpcNotification("ui/notifications/size-changed",{width:Y,height:W});else this.sendPrefab("prefab:size-changed",{width:Y,height:W})},U=new ResizeObserver((Y)=>{for(let W of Y)if(W.borderBoxSize.length){let H=W.borderBoxSize[0];q(Math.ceil(H.inlineSize),Math.ceil(H.blockSize))}else{let H=W.target.getBoundingClientRect();q(Math.ceil(H.width),Math.ceil(H.height))}});U.observe($);let Q=$.getBoundingClientRect();return q(Math.ceil(Q.width),Math.ceil(Q.height)),()=>U.disconnect()}on($,J){if(!this.listeners.has($))this.listeners.set($,new Set);let Z=this.listeners.get($);if(Z)Z.add(J)}off($,J){this.listeners.get($)?.delete(J)}disconnect(){this.cleanup?.(),this.listeners.clear();for(let[,$]of this.pending)$.reject(Error("Bridge disconnected"));this.pending.clear();for(let[,$]of this.rpcPending)$.reject(Error("Bridge disconnected"));this.rpcPending.clear(),this.sentRpcIds.clear()}get activeProtocol(){return this.protocol}initPrefab($){return new Promise((J,Z)=>{let q=!1,U=(Q)=>{if(q)return;q=!0,this.off("prefab:init-response",U),this.protocol="prefab",J(Q)};this.on("prefab:init-response",U),this.sendPrefab("prefab:init",{capabilities:$}),setTimeout(()=>{if(!q)q=!0,this.off("prefab:init-response",U),Z(Error("prefab:init timeout"))},2000)})}createPrefabTransport(){return{callTool:($,J)=>{let Z=`tc-${++this.callIdCounter}`;return new Promise((q,U)=>{this.pending.set(Z,{resolve:q,reject:U}),this.sendPrefab("prefab:tool-call",{tool:$,arguments:J},Z),setTimeout(()=>{if(this.pending.has(Z))this.pending.delete(Z),U(Error(`Tool call '${$}' timed out`))},30000)})},sendMessage:($)=>{return this.sendPrefab("prefab:send-message",{message:$}),Promise.resolve()}}}sendPrefab($,J,Z){if(typeof window>"u")return;let q=window.parent!==window?window.parent:window,U={type:$,payload:J,id:Z};q.postMessage(U,this.hostOrigin)}handleJsonRpc($){if(!("method"in $)){let q=this.rpcPending.get($.id);if(q)if(this.rpcPending.delete($.id),$.error)q.reject(Error($.error.message));else q.resolve($.result);return}let J=$.method,Z=$.params??{};if($.id!=null&&this.sentRpcIds.delete($.id))return;if($.id!=null)this.postJsonRpc({jsonrpc:"2.0",id:$.id,result:{}});switch(J){case"ui/notifications/tool-input":this.dispatch("prefab:tool-input",{args:Z.arguments??Z});break;case"ui/notifications/tool-input-partial":this.dispatch("prefab:tool-input-partial",{args:Z.arguments??Z});break;case"ui/notifications/tool-result":this.dispatch("prefab:tool-result",{result:Z});break;case"ui/notifications/tool-cancelled":this.dispatch("prefab:tool-cancelled",Z);break;case"ui/notifications/host-context-changed":{let q={};if(typeof Z.theme==="string")q.colorScheme=Z.theme;if(typeof Z.styles==="object"&&Z.styles!==null){let U=Z.styles;if(U.variables)q.variables=U.variables;if(typeof U.css?.fonts==="string")q.fontCss=U.css.fonts}this.dispatch("prefab:theme-update",q);break}case"ui/resource-teardown":this.dispatch("prefab:teardown",Z);break}}initJsonRpc($){return new Promise((J,Z)=>{let q=++this.rpcIdCounter,U=!1;this.rpcPending.set(q,{resolve:(Q)=>{if(U)return;U=!0,this.protocol="jsonrpc";let Y=Q??{},W=Y.hostInfo??{},H=Y.hostContext??{},N=Y.hostCapabilities??{},X;if(typeof H.theme==="string"||typeof H.styles==="object"){if(X={},typeof H.theme==="string")X.colorScheme=H.theme;if(typeof H.styles==="object"&&H.styles!==null){let _=H.styles;if(_.variables)X.variables=_.variables;if(typeof _.css?.fonts==="string")X.fontCss=_.css.fonts}}this.postJsonRpc({jsonrpc:"2.0",method:"ui/notifications/initialized",params:{}}),J({hostName:W.name,hostVersion:W.version,capabilities:{toast:!0,navigation:N.openLinks!=null,messaging:!0,displayModes:H.availableDisplayModes??[]},theme:X,toolInput:void 0,meta:H})},reject:(Q)=>{if(U)return;U=!0,Z(Q)}}),this.postJsonRpc({jsonrpc:"2.0",id:q,method:"ui/initialize",params:{protocolVersion:"2026-01-26",appInfo:{name:"prefab",version:"0.2"},appCapabilities:{...$.displayModes&&{availableDisplayModes:$.displayModes}}}}),setTimeout(()=>{if(!U)U=!0,this.rpcPending.delete(q),Z(Error("ui/initialize timeout"))},2000)})}createJsonRpcTransport(){return{callTool:($,J)=>{return this.sendRpcRequest("tools/call",{name:$,arguments:J})},sendMessage:($)=>{return this.sendRpcRequest("ui/message",{role:"user",content:{type:"text",text:$}})}}}sendRpcRequest($,J){let Z=++this.rpcIdCounter;return new Promise((q,U)=>{this.rpcPending.set(Z,{resolve:q,reject:U}),this.postJsonRpc({jsonrpc:"2.0",id:Z,method:$,params:J}),setTimeout(()=>{if(this.rpcPending.has(Z))this.rpcPending.delete(Z),U(Error(`JSON-RPC '${$}' timed out`))},30000)})}sendRpcNotification($,J){this.postJsonRpc({jsonrpc:"2.0",method:$,params:J})}postJsonRpc($){if(typeof window>"u")return;if($.id!=null&&typeof $.method==="string")this.sentRpcIds.add($.id);if(this.postFn)this.postFn($);else(window.parent!==window?window.parent:window).postMessage($,this.hostOrigin)}dispatch($,J){let Z=this.listeners.get($);if(Z)for(let q of Z)q(J)}}var U2=()=>{};function _0($,J){if(J.variables)for(let[Z,q]of Object.entries(J.variables))$.style.setProperty(Z.startsWith("--")?Z:`--${Z}`,q);if(J.colorScheme&&J.colorScheme!=="auto")$.setAttribute("data-theme",J.colorScheme);if(J.fontCss)Q2(J.fontCss)}function Q2($){if(document.getElementById("__prefab-host-fonts"))return;let Z=document.createElement("style");Z.id="__prefab-host-fonts",Z.textContent=$,document.head.appendChild(Z)}function Z0(){if(typeof window>"u")return!1;try{return window.self!==window.top}catch{return!0}}function Y2(){if(typeof window>"u")return;let $=window;if(typeof $.acquireVsCodeApi==="function")try{let J=$.acquireVsCodeApi();if(J!==null&&typeof J==="object"&&"postMessage"in J)return J}catch{return}return}async function k0($){I0();let J=$?.mode??"auto",Z=J==="bridge"||J==="auto"&&Z0(),q,U,Q={capabilities:{}};if(Z)U=new t($?.hostOrigin),U.connect(),Q=await U.initialize($?.capabilities??{toolInput:!0}),q=U.createTransport();else if($?.transport)q=R0($.transport);else q=A0();if(Q.theme&&typeof document<"u")_0(document.documentElement,Q.theme);let Y,W,H,N,X=Q.toolInput,_;if(U)U.on("prefab:tool-input",(G)=>{let z=G.args??G;if(Y)Y(z);else X=z}),U.on("prefab:tool-result",(G)=>{let z=G.result??G;if(W)W(z);else _=z}),U.on("prefab:tool-cancelled",()=>{H?.()}),U.on("prefab:tool-input-partial",(G)=>{N?.(G.args??G)}),U.on("prefab:theme-update",(G)=>{if(typeof document<"u")_0(document.documentElement,G)});function E(G,...z){let j=c0(G),O=new q0,A={store:O,scope:{},transport:q,rerender:()=>R(),onToast:void 0};function R(){j.innerHTML="";for(let F of z)j.appendChild(w(F,A))}return R(),{rerender:R,store:O,destroy:()=>{j.innerHTML=""}}}return{callTool:(G,z={})=>q.callTool(G,z),sendMessage:(G)=>q.sendMessage(G),onToolInput:(G)=>{if(Y=G,X){let z=X;X=void 0,queueMicrotask(()=>G(z))}},onToolResult:(G)=>{if(W=G,_!==void 0){let z=_;_=void 0,queueMicrotask(()=>G(z))}},onToolCancelled:(G)=>{H=G},onToolInputPartial:(G)=>{N=G},render:E,mount:(G,z,j)=>{let O=c0(G);return p.mount(O,z,{transport:q,...j})},requestMode:(G)=>U?.requestMode(G),openLink:(G,z)=>{if(U)U.openLink(G,z);else if(typeof window<"u")window.open(G,z??"_blank")},updateContext:(G)=>{if(U)U.updateContext(G)},setupAutoResize:(G)=>{if(!U)return W2;let z=typeof G==="string"?c0(G):G;return U.setupAutoResize(z)},host:Q,capabilities:Q.capabilities,theme:Q.theme,transport:q,destroy:()=>U?.disconnect()}}var W2=()=>{};function c0($){if(typeof $==="string"){if(typeof document>"u")throw Error("Cannot resolve selector outside browser");let J=document.querySelector($);if(!J)throw Error(`Element not found: ${$}`);return J}return $}var p={mount($,J,Z){I0();let q=[];if(J.pipes)for(let[D,G]of Object.entries(J.pipes))M2(D,G,q);let U=new q0(J.state),Q;if(Z?.transport&&"callTool"in Z.transport)Q=Z.transport;else if(Z?.transport)Q=R0(Z.transport);else Q=A0();let Y=Z?.onToast??_2,W={store:U,scope:{},transport:Q,rerender:()=>E(),onToast:Y,defs:J.defs};g1($,J.theme);let H=[];if(J.stylesheets)for(let D of J.stylesheets){let G=document.createElement("style");G.textContent=D,G.dataset.prefab="injected",document.head.appendChild(G),H.push(G)}let N;if(J.keyBindings)N=u1(J.keyBindings,async(D)=>{await k(D,{store:U,transport:Q,scope:{},rerender:()=>E(),onToast:Y})});let X,_=Z?.themeToggle??!0;if(_!==!1)X=M0($,typeof _==="object"?_:void 0);function E(){let D=$.querySelector(".pf-theme-toggle");$.innerHTML="";let G=w(J.view,W);if($.appendChild(G),D)$.appendChild(D)}return E(),{rerender:()=>E(),update(D){U.merge(D.update.state),E()},store:U,destroy(){X?.(),N?.(),a0();for(let D of H)D.remove();for(let D of q)Q0(D);$.innerHTML=""}}},isPrefabData($){return $!=null&&typeof $==="object"&&"$prefab"in $},isPrefabUpdate($){return $!=null&&typeof $==="object"&&"$prefab"in $&&"update"in $}},H2=new Set(["find","dot","length","upper","lower","truncate","join","first","last","abs","round","number","currency","percent","compact","date","time","datetime","pluralize","default","selectattr","rejectattr"]);function M2($,J,Z){if(H2.has($)){console.warn(`[prefab] wire pipe "${$}" ignored — shadows built-in`);return}try{let q=Function("return ("+J+")")();if(typeof q!=="function"){console.warn(`[prefab] wire pipe "${$}" — source did not evaluate to a function`);return}U0($,q),Z.push($)}catch(q){console.warn(`[prefab] wire pipe "${$}" — failed to hydrate:`,q)}}function _2($){if(typeof document>"u")return;let J=B2(),Z=document.createElement("div"),q=$.variant??"default";Z.className=`pf-toast${q!=="default"?` pf-toast--${q}`:""}`,Z.setAttribute("data-variant",q),Z.style.marginBottom="8px",Z.style.transition="opacity 0.3s ease";let U=document.createElement("div");if(U.textContent=$.message,U.style.fontWeight="500",Z.appendChild(U),$.description){let Y=document.createElement("div");Y.textContent=$.description,Y.style.fontSize="14px",Y.style.color="var(--muted-foreground, #6b7280)",Z.appendChild(Y)}J.appendChild(Z);let Q=$.duration??4000;setTimeout(()=>{Z.style.opacity="0",setTimeout(()=>Z.remove(),300)},Q)}function B2(){let J=document.getElementById("prefab-toast-container");if(!J)J=document.createElement("div"),J.id="prefab-toast-container",J.style.position="fixed",J.style.bottom="16px",J.style.right="16px",J.style.zIndex="9999",J.style.maxWidth="400px",document.body.appendChild(J);return J}if(typeof window<"u"){let $=window;$.PrefabRenderer=p,$.prefab={app:k0,mount:p.mount.bind(p),isPrefabData:p.isPrefabData.bind(p),isPrefabUpdate:p.isPrefabUpdate.bind(p),Bridge:t,isIframe:Z0,registerPipe:U0,unregisterPipe:Q0,listPipes:N0,registerComponent:M,createThemeToggle:M0};let J=$.__PREFAB_DATA__;if(J!=null){let Z=document.getElementById("prefab-root");if(Z)p.mount(Z,J)}}})();
|
package/package.json
CHANGED