weifuwu 0.63.0 → 0.64.0
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/README.md +124 -2956
- package/dist/ai/client.d.ts +1 -1
- package/dist/ai/sse.d.ts +1 -1
- package/dist/ai/types.d.ts +2 -2
- package/dist/client/ai.d.ts +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client/types.d.ts +108 -0
- package/dist/client/use-chat.d.ts +1 -1
- package/dist/components/AiChat/AiChat.d.ts +2 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +1 -1
- package/dist/components/Dropdown/Dropdown.d.ts +4 -1
- package/dist/components/HoverCard/HoverCard.d.ts +7 -1
- package/dist/components/Popover/Popover.d.ts +3 -0
- package/dist/components/Tooltip/Tooltip.d.ts +3 -0
- package/dist/components/index.js +13 -13
- package/dist/components/style.css +164 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/layout/weifuwu-layout.css +22 -0
- package/docs/components.md +314 -0
- package/docs/data.md +240 -0
- package/docs/environment.md +27 -0
- package/docs/examples.md +127 -0
- package/docs/frontend-middleware.md +435 -0
- package/docs/frontend.md +697 -0
- package/docs/layout.md +203 -0
- package/docs/mobile.md +109 -0
- package/docs/realtime.md +291 -0
- package/docs/saas.md +246 -0
- package/docs/server.md +356 -0
- package/docs/styling.md +130 -0
- package/package.json +4 -3
package/dist/ai/client.d.ts
CHANGED
package/dist/ai/sse.d.ts
CHANGED
package/dist/ai/types.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* weifuwu AI 协议共享类型 —— 与
|
|
2
|
+
* weifuwu AI 协议共享类型 —— 与 design/ai-contract.md 规范一一对应
|
|
3
3
|
*
|
|
4
4
|
* 纯类型,零运行时成本。两端同源:
|
|
5
5
|
* - 后端:从 weifuwu 主包导入(src/index.ts re-export)
|
|
6
6
|
* - 前端:从 weifuwu/client 导入(src/client/index.ts re-export)
|
|
7
7
|
*
|
|
8
|
-
* 修改本文件 = 修改协议,需同步更新
|
|
8
|
+
* 修改本文件 = 修改协议,需同步更新 design/ai-contract.md。
|
|
9
9
|
*/
|
|
10
10
|
export interface WfMessageStart {
|
|
11
11
|
id: string;
|
package/dist/client/ai.d.ts
CHANGED
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var xe="__wfAsyncComponent";function Be(e){let t=e;return t[xe]=!0,t}function H(e){return typeof e=="function"&&e?.[xe]===!0}var M=Symbol("Fragment"),W=Symbol("Portal");function te(e,t,n){return{type:e,props:we(t),key:n??void 0}}var Ke=te;function ze(e,t,n){return te(e,t,n)}function Ge(e,t,...n){let o=we(t??{});return n.length>0&&(o.children=n.length===1?n[0]:n),{type:e,props:o,key:t?.key??void 0}}function we(e){if(!e)return{};let t={};for(let n of Object.keys(e))n!=="key"&&(t[n]=e[n]);return t}function Je(e,t){return{type:W,props:{children:e,portalKey:t},key:t??void 0,_placement:"remote"}}var Qe=0,N=new Map,K=[];function be(e){K.push(e)}var z=new WeakMap;function j(){z=new WeakMap}function ne(e,t){let n=z.get(e);if(n)return n;let o={promise:null};return o.promise=Promise.resolve().then(()=>e(t)).then(r=>{if(typeof r!="function")throw new Error(`asyncComponent factory <${e.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return o.resolved=r,r}),z.set(e,o),o}async function ve(e,t){return ne(e,t).promise}function Te(e){return z.get(e)?.resolved}function Ye(e){let t=e._child;if(t!=null)if(Array.isArray(t))for(let n of t)n&&typeof n=="object"&&E(n);else typeof t=="object"&&E(t)}function E(e){if(e==null||typeof e!="object")return;let t=e;if(t._id){if(t._customId&&N.delete(t._customId),N.delete(t._id),K.length>0){for(let n of K)n(t._id);if(t._customId)for(let n of K)n(t._customId)}t._id=void 0,t._customId=void 0,t._render=void 0,t._parentNode=void 0,t._refNode=void 0}if(t._child!=null){if(Array.isArray(t._child))for(let n of t._child)n&&typeof n=="object"&&E(n);else E(t._child);t._child=void 0}if(t.props?.children&&typeof t.type=="string"){let n=Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let o of n)o&&typeof o=="object"&&E(o)}typeof t.props?.ref=="function"&&t.props.ref(null),t._remoteEl&&(Ye(t),t._remoteEl.remove(),t._remoteEl=void 0)}function D(){return`_wf_${Qe++}`}var _e=new WeakMap;function Xe(e){let t=_e.get(e)??{count:0,warned:!1};t.count++,t.count>=3&&!t.warned&&(t.warned=!0,console.warn("[weifuwu] ref \u51FD\u6570\u6BCF\u6B21\u6E32\u67D3\u90FD\u53D8\u5316\uFF08\u5185\u8054 ref\uFF09\u2014\u2014ref \u56DE\u8C03\u5728\u6BCF\u6B21\u6E32\u67D3\u540E\u91CD\u65B0\u6267\u884C\uFF08\u6027\u80FD\u635F\u8017\uFF09\u3002\u628A ref \u5B9A\u4E49\u5230 mount \u4F5C\u7528\u57DF\uFF08\u7A33\u5B9A\u5F15\u7528\uFF09\uFF1Aconst listRef = (el) => {...}; return h('div', { ref: listRef })")),_e.set(e,t)}function I(e,t,n,o,r){if(n==null){if(o==null)return null;let u=R(o,r);return u==null?null:(t&&t.parentNode?t.parentNode.insertBefore(u,t):e.appendChild(u),u)}if(o==null)return t?(E(n),t.remove()):E(n),null;let s=Se(n),i=Se(o);if(s!==i){E(n);let u=R(o,r);return u==null?null:(t?.parentNode&&t.parentNode.replaceChild(u,t),u)}if(i==="text")return t&&t.textContent!==String(o)&&(t.textContent=String(o)),t;let l=o,a=n;if(typeof l.type=="function"){let u=l.type;a._render&&(l._render=a._render,l._id=a._id,l._id&&N.set(l._id,l)),l._parentNode=e,l._refNode=t;let p=Object.create(r);if(p.ui=Object.create(r.ui),p.ui._selfId=l._id,p.ui._selfVNode=l,l._ctxVersion=a._ctxVersion??p.ui._ctxVersion??0,a._render&&tt(a.props,l.props)&&!p.ui._dirtySet?.has(a._id)&&l._ctxVersion===p.ui._ctxVersion)return l._child=a._child,t;p.ui._dirtySet?.delete(a._id);let m;try{typeof l._render=="function"?m=l._render(l.props):m=se(u,l.props,l,p)}catch(c){let f=r.ui?._errorHandler;f?(f(c),m=null):(console.error(`[weifuwu] Component render error in <${u?.name||"anonymous"}> (id: ${a._id??"?"}, phase: update)`,c),m=null)}let w=a._child;l._child=m;let d=I(e,t,w,m,p);return d||(l._refNode=null),d}if(l.type===M){let u=a._childNodes,p=Ne(e,a,l,r,u);return l._childNodes=p,t}if(typeof l.type=="string"){if(t&&t.nodeType===1){let u=a.props?.ref,p=l.props?.ref;u!==p&&(typeof p=="function"&&p(t),typeof u=="function"&&typeof p=="function"&&Xe(t)),re(t,a.props,l.props),Ne(t,a,l,r)}else if(t){E(n);let u=R(o,r);return u==null?null:(t.parentNode?.replaceChild(u,t),u)}return t}if(l.type===W)return $(a,l,r),null;if(Array.isArray(o)){let u=Array.isArray(n)?n:[];G(u,o);let p=Array.from(e.childNodes),m=t?p.indexOf(t):-1,w=m>=0?q(p.slice(m),u):q(p,u);return J(e,u,o,r,w,t),t}return t}var Ae=new Map;function Ze(e){let t=Ae.get(e);return t||(t=`fn:${e.name||"anon"}`,Ae.set(e,t)),t}function Se(e){if(e==null||typeof e=="boolean")return"null";if(typeof e=="string"||typeof e=="number")return"text";if(Array.isArray(e))return"array";let t=e;return typeof t.type=="function"?Ze(t.type):t.type===M?"fragment":t.type===W?"portal":typeof t.type=="string"?"tag:"+t.type:"unknown"}function re(e,t,n){let o=t?Object.keys(t).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],r=n?Object.keys(n).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],s=new Set(r);for(let i of o)if(!s.has(i)){if(i==="ref")continue;i.startsWith("on")&&typeof t[i]=="function"?e.removeEventListener(i.slice(2).toLowerCase(),t[i]):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i==="className"?"class":i)}for(let i of r){if(i==="ref")continue;let l=t?.[i],a=n?.[i];if(i==="innerHTML")a!==l&&(e.innerHTML=String(a??""));else if(a!==l)if(i==="class"||i==="className")e instanceof SVGElement?e.setAttribute("class",Ee(a)):e.className=Ee(a);else if(i==="style"&&typeof a=="object"){let u=e.style;for(let p of Object.keys(a)){let m=a[p];m!=null&&(u[p]=typeof m=="number"?m+"px":String(m))}}else if(i.startsWith("on")&&typeof a=="function"){let u=i.slice(2).toLowerCase();typeof l=="function"&&e.removeEventListener(u,l),e.addEventListener(u,a)}else i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(a??""):a===!0?e.setAttribute(i,""):a!=null&&a!==!1?e.setAttribute(i,String(a)):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i)}}function Ee(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(Boolean).join(" "):e&&typeof e=="object"?Object.entries(e).filter(([,t])=>t).map(([t])=>t).join(" "):""}function oe(e){if(!(e==null||typeof e!="object"))return e.key}function G(e,t){if(!t.some(o=>o&&typeof o=="object"&&o.key!==void 0)){for(let o=0;o<t.length;o++){let r=t[o];r&&typeof r=="object"&&(r.key=o)}for(let o=0;o<e.length;o++){let r=e[o];r&&typeof r=="object"&&(r.key=o)}}}function q(e,t){let n=[],o=0;for(let r of t){if(r==null||typeof r=="boolean"){n.push(null);continue}let s=r;if(s.type===W){n.push(null);continue}if(s.type===M){let i=s._childNodes;Array.isArray(i)&&i.length>0?(n.push(i.slice()),o+=i.length):(n.push(e[o]?[e[o]]:null),o+=1)}else typeof process<"u"&&process.env.DBG&&console.error("[map] idx=",o,"type=",s.type,"sourceLen=",e.length,"hit=",!!e[o]),n.push(e[o]?[e[o]]:null),o+=1}return n}function Ne(e,t,n,o,r){let s=F(t.props?.children),i=F(n.props?.children);G(s,i);let l=r??Array.from(e.childNodes),a=q(l,s),u=J(e,s,i,o,a,r?.[0]??null),p=[];for(let m of u)m&&m.length>0&&p.push(...m);return p}function F(e){if(e==null)return[];if(!Array.isArray(e))return[e];let t=[];for(let n of e)Array.isArray(n)?t.push(...n):t.push(n);return t}function ke(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function J(e,t,n,o,r=[],s=null){if(!n.some(c=>c&&typeof c=="object"&&c.key!==void 0)){let c=Math.max(t.length,n.length);for(let f=0;f<c;f++){let y=f<t.length?t[f]:null,g=f<n.length?n[f]:null;if(g==null){if(y!=null){E(y);for(let h of r[f]??[])h.remove()}}else if(y==null){let h=R(g,o);h!=null&&e.appendChild(h)}else{let h=r[f]?.[0]??null;I(e,h,y,g,o)}}return[]}for(let c=0;c<t.length;c++){let f=t[c];if(!(f==null||typeof f=="boolean")&&oe(f)===void 0)for(let y of r[c]??[])y.remove()}let l=new Map,a=0;for(let c=0;c<t.length;c++){let f=oe(t[c]);f!==void 0&&l.set(f,{vnode:t[c],nodes:r[c]??[],index:a++})}let u=n.map(c=>oe(c)),p=new Set(u);for(let c of[...l.keys()])if(!p.has(c)){let f=l.get(c);E(f.vnode);for(let y of f.nodes)y?.remove();l.delete(c)}let m=new Array(n.length).fill(null),w=-1,d=s&&s.parentNode===e?s:e.firstChild;for(let c=0;c<n.length;c++){let f=u[c],y=n[c],g=f!==void 0?l.get(f):void 0,h=y&&typeof y=="object"&&y._placement==="remote";if(g)if(g.nodes.length>0){if(g.index<w)for(let A of g.nodes)e.insertBefore(A,d);w=Math.max(w,g.index),I(e,g.nodes[0],g.vnode,y,o),m[c]=y._childNodes??g.nodes.filter(A=>A.parentNode===e),d=m[c][m[c].length-1]?.nextSibling??null}else if(h)$(g.vnode,y,o),m[c]=[];else{let b=I(e,null,g.vnode,y,o);m[c]=ke(b);for(let x of m[c])e.insertBefore(x,d);d=m[c][m[c].length-1]?.nextSibling??null}else if(h)O(y,o),m[c]=[];else{let b=R(y,o);m[c]=ke(b);for(let x of m[c])e.insertBefore(x,d);d=m[c][m[c].length-1]?.nextSibling??null}}return m}function et(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}return e===t}function tt(e,t){if(e===t)return!0;if(!e||!t)return!1;let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let o of n)if(o!=="key"){if(o==="children"){if(!et(e[o],t[o]))return!1}else if(e[o]!==t[o])return!1}return!0}var ie="http://www.w3.org/2000/svg",ae=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function Pe(e,t){return R(e,t)}function R(e,t){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(Array.isArray(e))return rt(e,t);let n=e;if(n.type===W)return O(n,t),null;if(n.type===M){let i=document.createDocumentFragment(),l=n.props?.children==null?[]:Array.isArray(n.props.children)?n.props.children:[n.props.children];for(let a of l){let u=R(a,t);u!=null&&i.appendChild(u)}return n._childNodes=Array.from(i.childNodes),i}if(typeof n.type=="function")return ot(n.type,n.props,n,t);let o=n.type,r=ae.has(o)?document.createElementNS(ie,o):document.createElement(o);n.el=r;let s;for(let[i,l]of Object.entries(n.props??{}))i==="children"||i==="key"||i==="value"||i==="innerHTML"||Re(r,i,l);if("value"in(n.props??{})&&r instanceof HTMLSelectElement?s=n.props.value:"value"in(n.props??{})&&Re(r,"value",n.props.value),"innerHTML"in(n.props??{}))r.innerHTML=String(n.props.innerHTML??"");else{let i=le(n.props?.children);for(let l of i){let a=R(l,t);if(a!=null&&(r.appendChild(a),l&&typeof l=="object"&&typeof l.type=="function")){let u=l;u._parentNode||(u._parentNode=r,u._refNode=a)}}}return s!==void 0&&(r.value=String(s)),typeof n.props?.ref=="function"&&n.props.ref(r),r}function nt(e){let t=e.ui;t&&typeof t.render=="function"&&t.render(["_wf_root"])}function se(e,t,n,o){let r;if(H(e)){if(r=Te(e),!r)return ne(e,o).promise.then(()=>nt(o),()=>{}),null}else r=e;let s=r(t,o);if(typeof s!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return n._render=s,s(t)}function ot(e,t,n,o){o.ui=o.ui??{},n._id||(n._id=D(),N.set(n._id,n));let r=Object.create(o);r.ui=Object.create(o.ui),r.ui._selfId=n._id,r.ui._selfVNode=n,n._ctxVersion=r.ui._ctxVersion??0;let s;try{s=se(e,t,n,r)}catch(l){let a=o.ui?._errorHandler;a?(a(l),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${n._id??"?"}, phase: mount)`,l),s=null)}if(s==null)return n._child=null,null;n._child=s;let i=R(s,r);return n._refNode||(n._refNode=i),i}function rt(e,t){let n=document.createDocumentFragment();for(let o of e){let r=R(o,t);r!=null&&n.appendChild(r)}return n}function st(){let e=document.getElementById("__wf_portal");return e||(e=document.createElement("div"),e.id="__wf_portal",e.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:9999",document.body.appendChild(e)),e}function O(e,t){let n=st(),o=document.createElement("div");o.style.pointerEvents="auto",n.appendChild(o),e._remoteEl=o;let r=F(e.props?.children);e._child=r;for(let s of r){let i=R(s,t);i!=null&&o.appendChild(i)}}function $(e,t,n){let o=e?._remoteEl;if(t._remoteEl=o,!o){O(t,n);return}let r=F(t.props?.children),s=e._child||[];t._child=r,G(s,r);let i=q(Array.from(o.childNodes),s);J(o,s,r,n,i,i[0]?.[0]??null)}function le(e){if(e==null)return[];if(!Array.isArray(e))return[e];let t=[];for(let n of e)Array.isArray(n)?t.push(...n):t.push(n);return t}function Re(e,t,n){if(t==="class"||t==="className")e instanceof SVGElement?e.setAttribute("class",String(n??"")):e.className=String(n??"");else if(t==="style"&&typeof n=="object"&&n!==null){let o=e.style;for(let r of Object.keys(n)){let s=n[r];s!=null&&(o[r]=typeof s=="number"?s+"px":String(s))}}else t.startsWith("on")&&typeof n=="function"?e.addEventListener(t.slice(2).toLowerCase(),n):t==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(n??""):n===!0?e.setAttribute(t,""):n!=null&&n!==!1&&e.setAttribute(t,String(n))}function it(e,t,n){e.innerHTML="";let o=R(t,n);o instanceof Node?e.appendChild(o):Array.isArray(o)&&o.forEach(r=>e.appendChild(r))}function ue(e){e.node=e.node?e.node.nextSibling:null}function at(e,t){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(t,e.node):e.parent.appendChild(t)}function lt(e,t){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(t,e.node),ue(e)):e.parent.appendChild(t)}async function B(e,t,n){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let l=String(e);if(n.node&&n.node.nodeType===3)return n.node.textContent!==l&&(n.node.textContent=l),ue(n),n.node;let a=document.createTextNode(l);return at(n,a),a}if(Array.isArray(e)){let l=null;for(let a of e){let u=await B(a,t,n);u!=null&&!l&&(l=u)}return l}let o=e;if(o.type===W||o.type===M){let l=o.props?.children,a=l==null?[]:Array.isArray(l)?l:[l],u=null;for(let p of a){let m=await B(p,t,n);m!=null&&!u&&(u=m)}return u}if(typeof o.type=="function")return ut(o,t,n);let r=o.type,s=o.props??{},i;if(n.node&&n.node.nodeType===1&&n.node.tagName.toLowerCase()===r.toLowerCase()?(i=n.node,ue(n)):(i=ae.has(r)?document.createElementNS(ie,r):document.createElement(r),lt(n,i)),o.el=i,re(i,null,s),!("innerHTML"in s)){let l={parent:i,node:i.firstChild},a=le(s.children);for(let u of a){let p=await B(u,t,l);if(p!=null&&p.parentNode!==i&&i.appendChild(p),u&&typeof u=="object"&&typeof u.type=="function"){let m=u;m._parentNode||(m._parentNode=i,m._refNode=p)}}for(;l.node;){let u=l.node;l.node=u.nextSibling,u.parentNode?.removeChild(u)}}return"value"in s&&i instanceof HTMLSelectElement&&(i.value=String(s.value??"")),typeof s.ref=="function"&&s.ref(i),i}async function ut(e,t,n){t.ui=t.ui??{},e._id||(e._id=D(),N.set(e._id,e));let o=Object.create(t);o.ui=Object.create(t.ui),o.ui._selfId=e._id,o.ui._selfVNode=e,e._ctxVersion=o.ui._ctxVersion??0;let r=e.type,s;try{let l;H(r)?l=await ve(r,o):l=r;let a=l(e.props??{},o);if(typeof a!="function")throw new Error(`Component ${r.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=a,s=a(e.props??{})}catch(l){let a=t.ui?._errorHandler;a?(a(l),s=null):(console.error(`[weifuwu] Component hydration error in <${r.name||"anonymous"}> (id: ${e._id??"?"})`,l),s=null)}if(s==null)return e._child=null,null;e._child=s;let i=await B(s,o,n);return e._refNode||(e._refNode=i),i}async function ce(e,t,n){let o={parent:e,node:e.firstChild};for(await B(t,n,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function fe(e){let t=new WeakMap,n=new Set,o=s=>{if(s===null||typeof s!="object")return s;if(t.has(s))return t.get(s);let i=new Proxy(s,{set(l,a,u){if(Reflect.get(l,a)===u)return!0;Reflect.set(l,a,u),e();for(let m of n)m();return!0},get(l,a){let u=Reflect.get(l,a);return typeof u=="object"&&u!==null?o(u):u},deleteProperty(l,a){if(Reflect.has(l,a)){Reflect.deleteProperty(l,a),e();for(let u of n)u()}return!0}});return t.set(s,i),i},r=o({});return Object.defineProperty(r,"__watch",{value:s=>(n.add(s),()=>{n.delete(s)}),writable:!1,enumerable:!1}),r}function de(e,t,n){let o=new AbortController,r=n?.signal;r&&(r.aborted?o.abort():r.addEventListener("abort",()=>o.abort(),{once:!0}));let s=n?.traceId??mt(),i=n?.record!==!1,l=[],a=(async()=>{let u;try{u=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":s,Accept:"text/event-stream",...n?.headers},body:JSON.stringify(t),signal:o.signal})}catch(p){if(o.signal.aborted)return;n?.onError?.({code:"provider_error",message:p instanceof Error?p.message:String(p)});return}if(!u.ok){n?.onError?.({code:pt(u.status),message:`HTTP ${u.status} ${u.statusText}`});return}try{for await(let{name:p,data:m}of ft(u.body)){if(o.signal.aborted)return;dt(l,{name:p,data:m},i),ct(p,m,n??{})}}catch(p){if(o.signal.aborted)return;n?.onError?.({code:"provider_error",message:p instanceof Error?p.message:String(p)})}})();return{abort:()=>o.abort(),done:a,traceId:s,events:l}}function ct(e,t,n){switch(e){case"wf:token":return n.onToken?.(t.text);case"wf:tool_call":return n.onToolCall?.(t);case"wf:tool_result":return n.onToolResult?.(t);case"wf:tool_progress":return n.onToolProgress?.(t);case"wf:step":return n.onStep?.(t);case"wf:approval_request":return n.onApproval?.(t);case"wf:usage":return n.onUsage?.(t);case"wf:done":return n.onDone?.(t);case"wf:error":return n.onError?.(t);default:return n.onEvent?.(e,t)}}async function*ft(e){let t=e.getReader(),n=new TextDecoder,o="";try{for(;;){let{done:r,value:s}=await t.read();if(r)break;o+=n.decode(s,{stream:!0});let i=o.split(`
|
|
1
|
+
var Se="__wfAsyncComponent";function rn(e){let n=e;return n[Se]=!0,n}function z(e){return typeof e=="function"&&e?.[Se]===!0}var j=Symbol("Fragment"),H=Symbol("Portal");function de(e,n,t){return{type:e,props:Re(n),key:t??void 0}}var sn=de;function an(e,n,t){return de(e,n,t)}function ln(e,n,...t){let o=Re(n??{});return t.length>0&&(o.children=t.length===1?t[0]:t),{type:e,props:o,key:n?.key??void 0}}function Re(e){if(!e)return{};let n={};for(let t of Object.keys(e))t!=="key"&&(n[t]=e[t]);return n}function pe(e,n){return{type:H,props:{children:e,portalKey:n},key:n??void 0,_placement:"remote"}}var un=0,R=new Map,ee=[];function B(e){ee.push(e)}var ne=new WeakMap;function G(){ne=new WeakMap}function me(e,n){let t=ne.get(e);if(t)return t;let o={promise:null};return o.promise=Promise.resolve().then(()=>e(n)).then(r=>{if(typeof r!="function")throw new Error(`asyncComponent factory <${e.name||"anonymous"}> must return a Component (initProps, ctx) => (props) => VNode.`);return o.resolved=r,r}),ne.set(e,o),o}async function Le(e,n){return me(e,n).promise}function Me(e){return ne.get(e)?.resolved}function cn(e){let n=e._child;if(n!=null)if(Array.isArray(n))for(let t of n)t&&typeof t=="object"&&S(t);else typeof n=="object"&&S(n)}function S(e){if(e==null||typeof e!="object")return;let n=e;if(n._id){if(n._customId&&R.delete(n._customId),R.delete(n._id),ee.length>0){for(let t of ee)t(n._id);if(n._customId)for(let t of ee)t(n._customId)}n._id=void 0,n._customId=void 0,n._render=void 0,n._parentNode=void 0,n._refNode=void 0}if(n._child!=null){if(Array.isArray(n._child))for(let t of n._child)t&&typeof t=="object"&&S(t);else S(n._child);n._child=void 0}if(n.props?.children&&typeof n.type=="string"){let t=Array.isArray(n.props.children)?n.props.children:[n.props.children];for(let o of t)o&&typeof o=="object"&&S(o)}typeof n.props?.ref=="function"&&n.props.ref(null),n._remoteEl&&(cn(n),n._remoteEl.remove(),n._remoteEl=void 0)}function J(){return`_wf_${un++}`}var We=new WeakMap;function fn(e){let n=We.get(e)??{count:0,warned:!1};n.count++,n.count>=3&&!n.warned&&(n.warned=!0,console.warn("[weifuwu] ref \u51FD\u6570\u6BCF\u6B21\u6E32\u67D3\u90FD\u53D8\u5316\uFF08\u5185\u8054 ref\uFF09\u2014\u2014ref \u56DE\u8C03\u5728\u6BCF\u6B21\u6E32\u67D3\u540E\u91CD\u65B0\u6267\u884C\uFF08\u6027\u80FD\u635F\u8017\uFF09\u3002\u628A ref \u5B9A\u4E49\u5230 mount \u4F5C\u7528\u57DF\uFF08\u7A33\u5B9A\u5F15\u7528\uFF09\uFF1Aconst listRef = (el) => {...}; return h('div', { ref: listRef })")),We.set(e,n)}function q(e,n,t,o,r){if(t==null){if(o==null)return null;let f=O(o,r);return f==null?null:(n&&n.parentNode?n.parentNode.insertBefore(f,n):e.appendChild(f),f)}if(o==null)return n?(S(t),n.remove()):S(t),null;let s=Ve(t),i=Ve(o);if(s!==i){S(t);let f=O(o,r);return f==null?null:(n?.parentNode&&n.parentNode.replaceChild(f,n),f)}if(i==="text")return n&&n.textContent!==String(o)&&(n.textContent=String(o)),n;let c=o,a=t;if(typeof c.type=="function"){let f=c.type;a._render&&(c._render=a._render,c._id=a._id,c._id&&R.set(c._id,c)),c._parentNode=e,c._refNode=n;let m=Object.create(r);if(m.ui=Object.create(r.ui),m.ui._selfId=c._id,m.ui._selfVNode=c,c._ctxVersion=a._ctxVersion??m.ui._ctxVersion??0,a._render&&mn(a.props,c.props)&&!m.ui._dirtySet?.has(a._id)&&c._ctxVersion===m.ui._ctxVersion)return c._child=a._child,n;m.ui._dirtySet?.delete(a._id);let y;try{typeof c._render=="function"?y=c._render(c.props):y=he(f,c.props,c,m)}catch(u){let d=r.ui?._errorHandler;d?(d(u),y=null):(console.error(`[weifuwu] Component render error in <${f?.name||"anonymous"}> (id: ${a._id??"?"}, phase: update)`,u),y=null)}let v=a._child;c._child=y;let l=q(e,n,v,y,m);return l||(c._refNode=null),l}if(c.type===j){let f=a._childNodes,m=He(e,a,c,r,f);return c._childNodes=m,n}if(typeof c.type=="string"){if(n&&n.nodeType===1){let f=a.props?.ref,m=c.props?.ref;f!==m&&(typeof m=="function"&&m(n),typeof f=="function"&&typeof m=="function"&&fn(n)),ge(n,a.props,c.props),He(n,a,c,r)}else if(n){S(t);let f=O(o,r);return f==null?null:(n.parentNode?.replaceChild(f,n),f)}return n}if(c.type===H)return X(a,c,r),null;if(Array.isArray(o)){let f=Array.isArray(t)?t:[];te(f,o);let m=Array.from(e.childNodes),y=n?m.indexOf(n):-1,v=y>=0?Y(m.slice(y),f):Y(m,f);return oe(e,f,o,r,v,n),n}return n}var Oe=new Map;function dn(e){let n=Oe.get(e);return n||(n=`fn:${e.name||"anon"}`,Oe.set(e,n)),n}function Ve(e){if(e==null||typeof e=="boolean")return"null";if(typeof e=="string"||typeof e=="number")return"text";if(Array.isArray(e))return"array";let n=e;return typeof n.type=="function"?dn(n.type):n.type===j?"fragment":n.type===H?"portal":typeof n.type=="string"?"tag:"+n.type:"unknown"}function ge(e,n,t){let o=n?Object.keys(n).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],r=t?Object.keys(t).filter(i=>i!=="children"&&i!=="key"&&i!=="innerHTML"):[],s=new Set(r);for(let i of o)if(!s.has(i)){if(i==="ref")continue;i.startsWith("on")&&typeof n[i]=="function"?e.removeEventListener(i.slice(2).toLowerCase(),n[i]):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i==="className"?"class":i)}for(let i of r){if(i==="ref")continue;let c=n?.[i],a=t?.[i];if(i==="innerHTML")a!==c&&(e.innerHTML=String(a??""));else if(a!==c)if(i==="class"||i==="className")e instanceof SVGElement?e.setAttribute("class",Ie(a)):e.className=Ie(a);else if(i==="style"&&typeof a=="object"){let f=e.style;for(let m of Object.keys(a)){let y=a[m];y!=null&&(f[m]=typeof y=="number"?y+"px":String(y))}}else if(i.startsWith("on")&&typeof a=="function"){let f=i.slice(2).toLowerCase();typeof c=="function"&&e.removeEventListener(f,c),e.addEventListener(f,a)}else i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(a??""):a===!0?e.setAttribute(i,""):a!=null&&a!==!1?e.setAttribute(i,String(a)):i==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value="":e.removeAttribute(i)}}function Ie(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(Boolean).join(" "):e&&typeof e=="object"?Object.entries(e).filter(([,n])=>n).map(([n])=>n).join(" "):""}function ye(e){if(!(e==null||typeof e!="object"))return e.key}function te(e,n){if(!n.some(o=>o&&typeof o=="object"&&o.key!==void 0)){for(let o=0;o<n.length;o++){let r=n[o];r&&typeof r=="object"&&(r.key=o)}for(let o=0;o<e.length;o++){let r=e[o];r&&typeof r=="object"&&(r.key=o)}}}function Y(e,n){let t=[],o=0;for(let r of n){if(r==null||typeof r=="boolean"){t.push(null);continue}let s=r;if(s.type===H){t.push(null);continue}if(s.type===j){let i=s._childNodes;Array.isArray(i)&&i.length>0?(t.push(i.slice()),o+=i.length):(t.push(e[o]?[e[o]]:null),o+=1)}else typeof process<"u"&&process.env.DBG&&console.error("[map] idx=",o,"type=",s.type,"sourceLen=",e.length,"hit=",!!e[o]),t.push(e[o]?[e[o]]:null),o+=1}return t}function He(e,n,t,o,r){let s=Q(n.props?.children),i=Q(t.props?.children);te(s,i);let c=r??Array.from(e.childNodes),a=Y(c,s),f=oe(e,s,i,o,a,r?.[0]??null),m=[];for(let y of f)y&&y.length>0&&m.push(...y);return m}function Q(e){if(e==null)return[];if(!Array.isArray(e))return[e];let n=[];for(let t of e)Array.isArray(t)?n.push(...t):n.push(t);return n}function Ue(e){return e==null?[]:e instanceof DocumentFragment?Array.from(e.childNodes):[e]}function oe(e,n,t,o,r=[],s=null){if(!t.some(u=>u&&typeof u=="object"&&u.key!==void 0)){let u=Math.max(n.length,t.length);for(let d=0;d<u;d++){let p=d<n.length?n[d]:null,g=d<t.length?t[d]:null;if(g==null){if(p!=null){S(p);for(let h of r[d]??[])h.remove()}}else if(p==null){let h=O(g,o);h!=null&&e.appendChild(h)}else{let h=r[d]?.[0]??null;q(e,h,p,g,o)}}return[]}for(let u=0;u<n.length;u++){let d=n[u];if(!(d==null||typeof d=="boolean")&&ye(d)===void 0)for(let p of r[u]??[])p.remove()}let c=new Map,a=0;for(let u=0;u<n.length;u++){let d=ye(n[u]);d!==void 0&&c.set(d,{vnode:n[u],nodes:r[u]??[],index:a++})}let f=t.map(u=>ye(u)),m=new Set(f);for(let u of[...c.keys()])if(!m.has(u)){let d=c.get(u);S(d.vnode);for(let p of d.nodes)p?.remove();c.delete(u)}let y=new Array(t.length).fill(null),v=-1,l=s&&s.parentNode===e?s:e.firstChild;for(let u=0;u<t.length;u++){let d=f[u],p=t[u],g=d!==void 0?c.get(d):void 0,h=p&&typeof p=="object"&&p._placement==="remote";if(g)if(g.nodes.length>0){if(g.index<v)for(let x of g.nodes)e.insertBefore(x,l);v=Math.max(v,g.index),q(e,g.nodes[0],g.vnode,p,o),y[u]=p._childNodes??g.nodes.filter(x=>x.parentNode===e),l=y[u][y[u].length-1]?.nextSibling??null}else if(h)X(g.vnode,p,o),y[u]=[];else{let b=q(e,null,g.vnode,p,o);y[u]=Ue(b);for(let C of y[u])e.insertBefore(C,l);l=y[u][y[u].length-1]?.nextSibling??null}else if(h)K(p,o),y[u]=[];else{let b=O(p,o);y[u]=Ue(b);for(let C of y[u])e.insertBefore(C,l);l=y[u][y[u].length-1]?.nextSibling??null}}return y}function pn(e,n){if(e===n)return!0;if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++)if(e[t]!==n[t])return!1;return!0}return e===n}function mn(e,n){if(e===n)return!0;if(!e||!n)return!1;let t=new Set([...Object.keys(e),...Object.keys(n)]);for(let o of t)if(o!=="key"){if(o==="children"){if(!pn(e[o],n[o]))return!1}else if(e[o]!==n[o])return!1}return!0}var Ce="http://www.w3.org/2000/svg",we=new Set(["svg","path","circle","line","rect","text","g","polyline","polygon","ellipse","defs","use","clipPath","mask","linearGradient","radialGradient","stop","tspan"]);function De(e,n){return O(e,n)}function O(e,n){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(Array.isArray(e))return hn(e,n);let t=e;if(t.type===H)return K(t,n),null;if(t.type===j){let i=document.createDocumentFragment(),c=t.props?.children==null?[]:Array.isArray(t.props.children)?t.props.children:[t.props.children];for(let a of c){let f=O(a,n);f!=null&&i.appendChild(f)}return t._childNodes=Array.from(i.childNodes),i}if(typeof t.type=="function")return gn(t.type,t.props,t,n);let o=t.type,r=we.has(o)?document.createElementNS(Ce,o):document.createElement(o);t.el=r;let s;for(let[i,c]of Object.entries(t.props??{}))i==="children"||i==="key"||i==="value"||i==="innerHTML"||je(r,i,c);if("value"in(t.props??{})&&r instanceof HTMLSelectElement?s=t.props.value:"value"in(t.props??{})&&je(r,"value",t.props.value),"innerHTML"in(t.props??{}))r.innerHTML=String(t.props.innerHTML??"");else{let i=be(t.props?.children);for(let c of i){let a=O(c,n);if(a!=null&&(r.appendChild(a),c&&typeof c=="object"&&typeof c.type=="function")){let f=c;f._parentNode||(f._parentNode=r,f._refNode=a)}}}return s!==void 0&&(r.value=String(s)),typeof t.props?.ref=="function"&&t.props.ref(r),r}function yn(e){let n=e.ui;n&&typeof n.render=="function"&&n.render(["_wf_root"])}function he(e,n,t,o){let r;if(z(e)){if(r=Me(e),!r)return me(e,o).promise.then(()=>yn(o),()=>{}),null}else r=e;let s=r(n,o);if(typeof s!="function")throw new Error(`Component ${e.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);return t._render=s,s(n)}function gn(e,n,t,o){o.ui=o.ui??{},t._id||(t._id=J(),R.set(t._id,t));let r=Object.create(o);r.ui=Object.create(o.ui),r.ui._selfId=t._id,r.ui._selfVNode=t,t._ctxVersion=r.ui._ctxVersion??0;let s;try{s=he(e,n,t,r)}catch(c){let a=o.ui?._errorHandler;a?(a(c),s=null):(console.error(`[weifuwu] Component render error in <${e.name||"anonymous"}> (id: ${t._id??"?"}, phase: mount)`,c),s=null)}if(s==null)return t._child=null,null;t._child=s;let i=O(s,r);return t._refNode||(t._refNode=i),i}function hn(e,n){let t=document.createDocumentFragment();for(let o of e){let r=O(o,n);r!=null&&t.appendChild(r)}return t}function Cn(){let e=document.getElementById("__wf_portal");return e||(e=document.createElement("div"),e.id="__wf_portal",e.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:9999",document.body.appendChild(e)),e}function K(e,n){let t=Cn(),o=document.createElement("div");o.style.pointerEvents="auto",t.appendChild(o),e._remoteEl=o;let r=Q(e.props?.children);e._child=r;for(let s of r){let i=O(s,n);i!=null&&o.appendChild(i)}}function X(e,n,t){let o=e?._remoteEl;if(n._remoteEl=o,!o){K(n,t);return}let r=Q(n.props?.children),s=e._child||[];n._child=r,te(s,r);let i=Y(Array.from(o.childNodes),s);oe(o,s,r,t,i,i[0]?.[0]??null)}function be(e){if(e==null)return[];if(!Array.isArray(e))return[e];let n=[];for(let t of e)Array.isArray(t)?n.push(...t):n.push(t);return n}function je(e,n,t){if(n==="class"||n==="className")e instanceof SVGElement?e.setAttribute("class",String(t??"")):e.className=String(t??"");else if(n==="style"&&typeof t=="object"&&t!==null){let o=e.style;for(let r of Object.keys(t)){let s=t[r];s!=null&&(o[r]=typeof s=="number"?s+"px":String(s))}}else n.startsWith("on")&&typeof t=="function"?e.addEventListener(n.slice(2).toLowerCase(),t):n==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=String(t??""):t===!0?e.setAttribute(n,""):t!=null&&t!==!1&&e.setAttribute(n,String(t))}function wn(e,n,t){e.innerHTML="";let o=O(n,t);o instanceof Node?e.appendChild(o):Array.isArray(o)&&o.forEach(r=>e.appendChild(r))}function xe(e){e.node=e.node?e.node.nextSibling:null}function bn(e,n){e.node&&e.node.parentNode?e.node.parentNode.insertBefore(n,e.node):e.parent.appendChild(n)}function xn(e,n){e.node&&e.node.parentNode?(e.node.parentNode.replaceChild(n,e.node),xe(e)):e.parent.appendChild(n)}async function Z(e,n,t){if(e==null||typeof e=="boolean")return null;if(typeof e=="string"||typeof e=="number"){let c=String(e);if(t.node&&t.node.nodeType===3)return t.node.textContent!==c&&(t.node.textContent=c),xe(t),t.node;let a=document.createTextNode(c);return bn(t,a),a}if(Array.isArray(e)){let c=null;for(let a of e){let f=await Z(a,n,t);f!=null&&!c&&(c=f)}return c}let o=e;if(o.type===H||o.type===j){let c=o.props?.children,a=c==null?[]:Array.isArray(c)?c:[c],f=null;for(let m of a){let y=await Z(m,n,t);y!=null&&!f&&(f=y)}return f}if(typeof o.type=="function")return vn(o,n,t);let r=o.type,s=o.props??{},i;if(t.node&&t.node.nodeType===1&&t.node.tagName.toLowerCase()===r.toLowerCase()?(i=t.node,xe(t)):(i=we.has(r)?document.createElementNS(Ce,r):document.createElement(r),xn(t,i)),o.el=i,ge(i,null,s),!("innerHTML"in s)){let c={parent:i,node:i.firstChild},a=be(s.children);for(let f of a){let m=await Z(f,n,c);if(m!=null&&m.parentNode!==i&&i.appendChild(m),f&&typeof f=="object"&&typeof f.type=="function"){let y=f;y._parentNode||(y._parentNode=i,y._refNode=m)}}for(;c.node;){let f=c.node;c.node=f.nextSibling,f.parentNode?.removeChild(f)}}return"value"in s&&i instanceof HTMLSelectElement&&(i.value=String(s.value??"")),typeof s.ref=="function"&&s.ref(i),i}async function vn(e,n,t){n.ui=n.ui??{},e._id||(e._id=J(),R.set(e._id,e));let o=Object.create(n);o.ui=Object.create(n.ui),o.ui._selfId=e._id,o.ui._selfVNode=e,e._ctxVersion=o.ui._ctxVersion??0;let r=e.type,s;try{let c;z(r)?c=await Le(r,o):c=r;let a=c(e.props??{},o);if(typeof a!="function")throw new Error(`Component ${r.name||"anonymous"} must return a render function. Use (init_props, ctx) => (props) => VNode pattern.`);e._render=a,s=a(e.props??{})}catch(c){let a=n.ui?._errorHandler;a?(a(c),s=null):(console.error(`[weifuwu] Component hydration error in <${r.name||"anonymous"}> (id: ${e._id??"?"})`,c),s=null)}if(s==null)return e._child=null,null;e._child=s;let i=await Z(s,o,t);return e._refNode||(e._refNode=i),i}async function ve(e,n,t){let o={parent:e,node:e.firstChild};for(await Z(n,t,o);o.node;){let r=o.node;o.node=r.nextSibling,r.parentNode?.removeChild(r)}}function Te(e){let n=new WeakMap,t=new Set,o=s=>{if(s===null||typeof s!="object")return s;if(n.has(s))return n.get(s);let i=new Proxy(s,{set(c,a,f){if(Reflect.get(c,a)===f)return!0;Reflect.set(c,a,f),e();for(let y of t)y();return!0},get(c,a){let f=Reflect.get(c,a);return typeof f=="object"&&f!==null?o(f):f},deleteProperty(c,a){if(Reflect.has(c,a)){Reflect.deleteProperty(c,a),e();for(let f of t)f()}return!0}});return n.set(s,i),i},r=o({});return Object.defineProperty(r,"__watch",{value:s=>(t.add(s),()=>{t.delete(s)}),writable:!1,enumerable:!1}),r}function Pe(e,n,t){let o=new AbortController,r=t?.signal;r&&(r.aborted?o.abort():r.addEventListener("abort",()=>o.abort(),{once:!0}));let s=t?.traceId??An(),i=t?.record!==!1,c=[],a=(async()=>{let f;try{f=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Trace-Id":s,Accept:"text/event-stream",...t?.headers},body:JSON.stringify(n),signal:o.signal})}catch(m){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:m instanceof Error?m.message:String(m)});return}if(!f.ok){t?.onError?.({code:En(f.status),message:`HTTP ${f.status} ${f.statusText}`});return}try{for await(let{name:m,data:y}of Pn(f.body)){if(o.signal.aborted)return;_n(c,{name:m,data:y},i),Tn(m,y,t??{})}}catch(m){if(o.signal.aborted)return;t?.onError?.({code:"provider_error",message:m instanceof Error?m.message:String(m)})}})();return{abort:()=>o.abort(),done:a,traceId:s,events:c}}function Tn(e,n,t){switch(e){case"wf:token":return t.onToken?.(n.text);case"wf:tool_call":return t.onToolCall?.(n);case"wf:tool_result":return t.onToolResult?.(n);case"wf:tool_progress":return t.onToolProgress?.(n);case"wf:step":return t.onStep?.(n);case"wf:approval_request":return t.onApproval?.(n);case"wf:usage":return t.onUsage?.(n);case"wf:done":return t.onDone?.(n);case"wf:error":return t.onError?.(n);default:return t.onEvent?.(e,n)}}async function*Pn(e){let n=e.getReader(),t=new TextDecoder,o="";try{for(;;){let{done:r,value:s}=await n.read();if(r)break;o+=t.decode(s,{stream:!0});let i=o.split(`
|
|
2
2
|
|
|
3
|
-
`);o=i.pop()??"";for(let
|
|
4
|
-
`))p.startsWith("event: ")?a=p.slice(7):p.startsWith("data: ")&&(u+=p.slice(6));if(u)try{yield{name:a,data:JSON.parse(u)}}catch{}}}}finally{t.releaseLock()}}function dt(e,t,n){n&&(e.length>=1e3&&e.shift(),e.push(t))}function pt(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function mt(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function We(e){return e.map(t=>({role:t.role,content:t.content}))}function pe(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Me(e,t,n){n.initialMessages?e.messages=structuredClone(n.initialMessages):e.messages===void 0&&(e.messages=[]),e.input===void 0&&(e.input=""),e.streaming===void 0&&(e.streaming=!1),e.error===void 0&&(e.error=null),e.usage===void 0&&(e.usage=null),e.step===void 0&&(e.step=null);let o=null;function r(){if(!e.streaming)return;let d=e.messages[e.messages.length-1];return d&&d.role==="assistant"&&d.status==="streaming"?d:void 0}function s(d,c,f){let y=r();switch(d){case"wf:token":y&&(y.content+=c.text);break;case"wf:tool_call":{y&&(y.toolCalls||(y.toolCalls=[]),y.toolCalls.push({call:c,status:"running"}));break}case"wf:tool_progress":{let g=c,h=y?.toolCalls?.find(b=>b.call.id===g.toolCallId);h&&(h.progress=g);break}case"wf:tool_result":{let g=c,h=y?.toolCalls?.find(b=>b.call.id===g.id);h&&(h.result=g,h.status=g.ok?"ok":"error");break}case"wf:approval_request":y&&(y.approval=c);break;case"wf:usage":y&&(y.usage=c);break;case"wf:step":e.step=c;break;case"wf:done":y&&(y.status="done",y.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":y&&(y.status="error",y.error=c,y.approval=void 0),e.error=c,e.streaming=!1,e.step=null;break;default:f?.(d,c);break}}function i(){let d=n.body?n.body(e.messages):{messages:We(e.messages)};o=t(n.url,d,{onToken:f=>s("wf:token",{text:f}),onToolCall:f=>s("wf:tool_call",f),onToolProgress:f=>s("wf:tool_progress",f),onToolResult:f=>s("wf:tool_result",f),onApproval:f=>s("wf:approval_request",f),onUsage:f=>s("wf:usage",f),onStep:f=>s("wf:step",f),onDone:f=>s("wf:done",f),onError:f=>s("wf:error",f),onEvent:(f,y)=>s(f,y,n.onEvent)},{signal:n.signal,headers:n.headers}),e.streaming=!0;let c=r();c&&o?.traceId&&(c.id=o.traceId)}function l(){if(e.streaming)return;let d=String(e.input??"").trim();d&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:pe(),role:"user",content:d,status:"done"},{id:pe(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function a(){o?.abort(),e.streaming=!1,e.step=null;let d=e.messages[e.messages.length-1];d&&d.role==="assistant"&&d.status==="streaming"&&(!d.content&&(!d.toolCalls||d.toolCalls.length===0)?e.messages.pop():d.status="done")}function u(){if(e.streaming)return;let d=-1;for(let c=e.messages.length-1;c>=0;c--)if(e.messages[c].role==="user"){d=c;break}d!==-1&&(e.messages.splice(d+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:pe(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function p(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null}async function m(d,c){let f=e.messages[e.messages.length-1],y=f?.role==="assistant"?f.approval:void 0;if(y&&(f.approval=void 0,!!n.approveUrl))try{await fetch(n.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...n.headers},body:JSON.stringify({id:y.id,decision:d,note:c}),signal:n.signal})}catch(g){if(n.signal?.aborted)return;e.error={code:"provider_error",message:g instanceof Error?g.message:String(g)}}}function w(){o?.abort(),o=null}return{send:l,stop:a,retry:u,clear:p,approve:m,dispose:w}}function Le(e,t="bottom",n=6,o=!0){switch(t){case"bottom":return{top:e.bottom+n,left:o?e.left+e.width/2:e.left};case"top":return{top:e.top-n,left:o?e.left+e.width/2:e.left};case"left":return{top:o?e.top+e.height/2:e.top,left:e.left-n};case"right":return{top:o?e.top+e.height/2:e.top,left:e.right+n}}}function yt(e,t="bottom",n=6,o=!0){return Le(e.getBoundingClientRect(),t,n,o)}function Q(e,t,n=8){if(!t)return e;let o=t.getBoundingClientRect();if(o.width===0&&o.height===0)return e;let r=Number.parseFloat(t.style.top)||o.top,s=Number.parseFloat(t.style.left)||o.left,i=e.top-r,l=e.left-s,a={top:o.top+i,bottom:o.bottom+i,left:o.left+l,right:o.right+l},u=window.innerWidth,p=window.innerHeight,m=e.top,w=e.left;return a.bottom>p-n&&(m=Math.max(n,m-(a.bottom-(p-n)))),a.top<n&&(m=Math.max(n,m+(n-a.top))),a.right>u-n&&(w=Math.max(n,w-(a.right-(u-n)))),a.left<n&&(w=Math.max(n,w+(n-a.left))),{top:m,left:w,width:e.width}}function Ie(e){let{ctx:t,renderByIds:n,getSelfId:o,dirtyBatch:r,dirtySet:s,mediaRegistry:i,popupTrackers:l,scrollTrackers:a,schedulePopupRecompute:u,ensurePopupListeners:p,isRendering:m}=e;return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:s,bumpCtxVersion:function(){this._ctxVersion++},render:function(d){if(!d||d.length===0){let c=o(this);if(c)d=[c];else return}n(d)},dirty:function(d){if(!m()){if(!d||d.length===0){let c=o(this);if(c)d=[c];else return}for(let c of d)c&&(r.add(c),s.add(c));this._dirtyScheduled||(this._dirtyScheduled=!0,queueMicrotask(()=>{this._dirtyScheduled=!1;let c=[...r];r.clear(),c.length>0&&n(c)}))}},$:function(){let d=this;if(!d._$cache){let c=o(this);d._$cache=fe(()=>t.ui.dirty(c?[c]:void 0))}return d._$cache},useChat:function(d){let c=this.$(),f=Me(c,de,d);return Object.assign(c,{send:f.send,stop:f.stop,retry:f.retry,clear:f.clear,approve:f.approve,dispose:f.dispose}),c},useMedia:function(d,c){let y=`media:${o(this)}:${d}`;if(!i.has(y)){let g=window.matchMedia(d);c(g.matches);let h=b=>c(b.matches);g.addEventListener("change",h),i.set(y,{mql:g,handler:h})}},useBreakpoint:function(d,c){let f=typeof d=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:d,y=typeof d=="function"?d:c,h=`bp:${o(this)}`;function b(){for(let[A,x]of Object.entries(f))if(window.matchMedia(x).matches)return A;return Object.keys(f)[0]??""}if(!i.has(h)){y(b());let A=[];for(let x of Object.values(f)){let v=window.matchMedia(x),C=()=>y(b());v.addEventListener("change",C),A.push({mql:v,handler:C})}i.set(h,{mqls:A})}},usePopupPosition:function(d){let c=o(this),f={top:0,left:0,refresh:()=>{}};if(!c)return f;let y={pos:f,getEl:d.el,isOpen:d.isOpen,compute:d.compute,panel:d.panel,margin:d.margin??8};return l.set(c,y),p(),f.refresh=()=>{let g=y.getEl();if(!g)return;let h=y.compute(g.getBoundingClientRect());Object.assign(f,Q(h,y.panel?.(),y.margin))},f},useInView:function(d){let c=o(this),f={isIn:!1,ready:!1,observe:A,refresh:x,disconnect:v},y=null,g=null,h=()=>{t.ui&&t.ui.dirty(c?[c]:void 0)};function b(){if(g?.disconnect(),g=null,!y)return;let C=typeof d.rootMargin=="function"?d.rootMargin():d.rootMargin,T=typeof d.threshold=="function"?d.threshold():d.threshold;g=new IntersectionObserver(S=>{let k=S[S.length-1];if(!k)return;let L=k.isIntersecting,_=L!==f.isIn,P=!f.ready;f.isIn=L,f.ready=!0,d.onChange?.(k,L),(_||P)&&h()},{root:d.root?d.root():null,rootMargin:C??"0px",threshold:T??0}),g.observe(y)}function A(C){y=C,C?b():(g?.disconnect(),g=null,f.isIn=!1)}function x(){b()}function v(){g?.disconnect(),g=null}return f},useScrollPosition:function(d){let c=o(this),f={y:0,refresh(){let g=y.getScroller();f.y=g instanceof Window?document.scrollingElement?.scrollTop??g.scrollY??0:g.scrollTop??0}},y={handle:f,getScroller:d.getScroller??(()=>window)};return c?(a.set(c,y),p(),f.refresh(),f):(f.refresh(),f)},useAsync:function(d){let c=o(this),f=fe(()=>{t.ui&&t.ui.dirty(c?[c]:void 0)});f.loading=!0;let y=()=>{f.loading=!0,f.error=null,Promise.resolve().then(()=>d()).then(g=>{f.data=g,f.loading=!1}).catch(g=>{f.error=g,f.loading=!1})};return y(),f.reload=y,f},selfId:function(d){if(typeof d!="string"||!d)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof d}`);if(N.has(d))throw new Error(`[weifuwu] Duplicate component ID: "${d}". Each component must have a unique custom ID.`);let c=this._selfVNode;c&&(c._customId=d,N.set(d,c))}}}function gt(){let e=[],t={},n=null,o=null,r=null,s=!1,i=new Set,l=!1,a=new Map;function u(x){let v=a.get(x);v&&(v.mql&&v.handler&&v.mql.removeEventListener("change",v.handler),v.mqls?.forEach(({mql:C,handler:T})=>C.removeEventListener("change",T)),a.delete(x))}let p=new Map,m=!1,w=0;function d(){m||(m=!0,window.addEventListener("scroll",y,{capture:!0,passive:!0}),window.addEventListener("resize",y))}function c(){m&&(window.removeEventListener("scroll",y,{capture:!0}),window.removeEventListener("resize",y),m=!1)}let f=new Map;function y(){w||(w=requestAnimationFrame(()=>{w=0;let x=[];for(let[v,C]of p){if(!C.isOpen())continue;let T=C.getEl();if(!T)continue;let S=C.compute(T.getBoundingClientRect());Object.assign(C.pos,Q(S,C.panel?.(),C.margin)),x.push(v)}for(let[v,C]of f){let T=C.getScroller(),S=T instanceof Window?document.scrollingElement?.scrollTop??T.scrollY??0:T.scrollTop??0;S!==C.handle.y&&(C.handle.y=S,x.push(v))}x.length>0&&t.ui.render(x)}))}function g(x){if(!s){s=!0;for(let v of x){let C=N.get(v);if(!C||!C._render)continue;t.ui._dirtySet?.delete(v);let T=C._child,S=C._render(C.props);if(C._child=S,T&&T._placement==="remote"||S&&S._placement==="remote"){T&&S?$(T,S,t):S?O(S,t):T&&E(T);continue}if(!C._parentNode&&C._refNode&&(C._parentNode=C._refNode.parentNode),C._parentNode){let k=I(C._parentNode,C._refNode??null,T,S,t);k&&k!==C._refNode?C._refNode=k:k||(C._refNode=null)}}s=!1,h()}}function h(){let x=t.ui;i.size>0&&!x._dirtyScheduled&&(x._dirtyScheduled=!0,queueMicrotask(()=>{x._dirtyScheduled=!1;let v=[...i];i.clear(),v.length>0&&g(v)}))}function b(x){return x?._selfId??t.ui?._selfId}let A={get ctx(){return t},use(x){return e.push(x),A},async mount(x,v,C){o=v;for(let _ of e)t=await _(t);let T=typeof x=="string"?document.querySelector(x):x;if(!T)throw new Error(`mount target not found: ${x}`);n=T;let S=!!C?.hydrate;S||(n.innerHTML="");let k=new Map,L=globalThis.__DATA__;if(L&&typeof L=="object")for(let[_,P]of Object.entries(L))k.set(_,{value:P});if(t.data={async get(_,P){let U=k.get(_);if(U&&"value"in U)return U.value;if(U?.promise)return U.promise;if(!P)return;let he=Promise.resolve().then(()=>P()).then(Ce=>(k.set(_,{value:Ce}),Ce));return k.set(_,{promise:he}),he},set(_,P){k.set(_,{value:P})},has(_){return k.has(_)}},be(_=>{for(let P of[...a.keys()])(P.startsWith(`media:${_}:`)||P===`bp:${_}`)&&u(P);p.delete(_),f.delete(_)}),t.ui=Ie({ctx:t,renderByIds:g,getSelfId:b,dirtyBatch:i,dirtySet:new Set,mediaRegistry:a,popupTrackers:p,scrollTrackers:f,schedulePopupRecompute:y,ensurePopupListeners:d,destroyPopupListeners:c,isRendering:()=>s}),s=!0,r=ht(v,t),r._id="_wf_root",r._parentNode=n,r._refNode=S?n.firstChild:null,N.set("_wf_root",r),S)await ce(n,r,t);else{let _=Pe(r,t);_ instanceof Node&&n.appendChild(_)}r._refNode=n.firstChild,s=!1,h()},destroy(){c(),p.clear(),f.clear();for(let x of[...a.keys()])u(x);N.clear(),n&&(n.innerHTML=""),n=null,t={}}};return A}function ht(e,t){return{type:e,props:{},key:void 0}}function Ct(e,t){if(!t||t==="/")return e||"/";let n=e.endsWith("/")?e.slice(0,-1):e,o=t.startsWith("/")?t:"/"+t;return n+o}function xt(e){let t=[],n=e.replace(/:(\w+)/g,(o,r)=>(t.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${n}$`),keys:t}}function me(e,t="",n=[]){let o=[];for(let r of e){let s=Ct(t,r.path),{re:i,keys:l}=xt(s),a=[...n,r];o.push({re:i,keys:l,def:r,chain:a}),r.children&&o.push(...me(r.children,s,a))}return o}function Ve(e,t){let n=null;for(let o of t)e.match(o.re)&&(!n||o.chain.length>n.chain.length)&&(n=o);return n}function Oe(e,t){let n={},o=e.match(t.re);if(o)for(let r=0;r<t.keys.length;r++)n[t.keys[r]]=decodeURIComponent(o[r+1]);return n}function wt(e){let t=me(e.routes),n=e.mode||"history";function o(){return n==="hash"?window.location.hash.replace(/^#/,"")||"/":window.location.pathname}function r(s){let i=Ve(s,t);if(i){let l=i.chain[i.chain.length-1];return{path:i.def.path,params:Oe(s,i),query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:i.chain,title:l?.title??""}}return{path:s,params:{},query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:e.notFound?[{component:e.notFound,title:"Not Found"}]:[],title:""}}return s=>{let i=r(o());s.route=i,i.title&&(document.title=i.title),s.app||(s.app={}),s.app.navigate=a=>{if(j(),n==="hash"){window.location.hash="#"+a;let u=r(a);s.route=u}else{window.history.pushState({},"",a);let u=r(a);s.route=u}s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};let l=()=>{j();let a=r(o());s.route=a,s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};return window.addEventListener("popstate",l),n==="hash"&&window.addEventListener("hashchange",l),s}}function bt(e,t){let n=t.route?._rvDepth??0;return()=>{let o=t.route;if(!o?.chain?.length||n>=o.chain.length)return null;let r=o.chain[n],s=r.layout??r.component;return s?(r.layout&&(o._rvDepth=n+1),{type:s,props:{},key:void 0}):null}}function V(e,t){return Object.assign(Object.create(e),t)}function vt(e={}){let t=e.url??"/ws",n=e.reconnectInterval??3e3,o=e.maxReconnect??10,r=e.pingInterval??3e4,s=e.pingTimeout??1e4;return i=>{let l=new Set,a=null,u=0,p=null,m=null,w=null,d=!1,c={isConnected:!1,onMessage:b=>(l.add(b),()=>{l.delete(b)}),send:b=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify(b))},_connect:f,close:()=>{d=!0,h(),a?.close(),a=null,c.isConnected=!1}};async function f(){if(!d)try{a=new WebSocket(t),a.onopen=()=>{c.isConnected=!0,u=0,y()},a.onmessage=b=>{try{let A=JSON.parse(b.data);for(let x of l)x(A)}catch{}g()},a.onclose=()=>{c.isConnected=!1,h(),!d&&u<o&&(u++,p=setTimeout(f,n*Math.min(u,5)))},a.onerror=()=>{a?.close()}}catch{d||(p=setTimeout(f,n))}}function y(){r<=0||(m=setInterval(()=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({type:"ping"})),w=setTimeout(()=>{a?.close()},s)},r))}function g(){clearTimeout(w)}function h(){clearInterval(m),clearTimeout(w),clearTimeout(p)}return f(),V(i,{ws:c})}}function Tt(e){let t={baseURL:e?.baseURL??"",headers:{"Content-Type":"application/json",...e?.headers}},n=e?.onRequest,o=e?.onResponse,r=e?.timeout??0;async function s(i,l,a,u){let p=t.baseURL+l,m={method:i,headers:{...t.headers,...u?.headers}},w=e?.token?.();w&&!m.headers.Authorization&&(m.headers.Authorization=`Bearer ${w}`);let d=r>0,c=!!u?.signal,f=null,y=null;(d||c)&&(f=new AbortController,m.signal=f.signal,d&&(y=setTimeout(()=>f.abort(new Error("Request timed out")),r)),c&&u.signal.addEventListener("abort",()=>f.abort())),a!==void 0&&i!=="GET"&&i!=="HEAD"&&(m.body=JSON.stringify(a));let g={url:p,init:m};n&&(g=n(g));try{let h=await fetch(g.url,g.init);if(o)return o(h);if(!h.ok){let x=await h.text().catch(()=>"");throw new Y(h.status,x||h.statusText)}let b=h.headers.get("content-length");if(h.status===204||b==="0")return;let A=(h.headers.get("content-type")||"").toLowerCase();return A.includes("application/json")||A.includes("json")?h.json():h.text()}finally{y&&clearTimeout(y)}}return i=>V(i,{api:{get:(a,u)=>s("GET",a,void 0,u),post:(a,u,p)=>s("POST",a,u,p),put:(a,u,p)=>s("PUT",a,u,p),patch:(a,u,p)=>s("PATCH",a,u,p),delete:(a,u)=>s("DELETE",a,void 0,u)}})}var Y=class extends Error{status;body;constructor(t,n){super(`API Error ${t}: ${n}`),this.name="ApiError",this.status=t,this.body=n}};function _t(e){try{let t=e.split(".");if(t.length!==3)return null;let n=t[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(n))}catch{return null}}function At(e){let t=_t(e);return t?.exp?t.exp*1e3-3e4<Date.now():!0}function St(e){let t=e?.storage??localStorage,n=e?.tokenKey??"weifuwu_token",o=e?.userKey??"weifuwu_user",r=e?.refreshTokenKey??"weifuwu_refresh",s=e?.refreshEndpoint??"/api/auth/refresh";return i=>{let l=t.getItem(n),a=t.getItem(o),u={token:l,user:a?JSON.parse(a):null,get isLoggedIn(){return this.token!==null},login(p,m,w){u.token=p,u.user=m,t.setItem(n,p),t.setItem(o,JSON.stringify(m)),w&&t.setItem(r,w)},logout(){u.token=null,u.user=null,t.removeItem(n),t.removeItem(o),t.removeItem(r)},setUser(p){u.user=p,t.setItem(o,JSON.stringify(p))},async refresh(){let p=t.getItem(r);if(!p)return!1;try{let m=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:p})});if(!m.ok)return u.logout(),!1;let w=await m.json();return u.token=w.token,t.setItem(n,w.token),w.refreshToken&&t.setItem(r,w.refreshToken),!0}catch{return!1}}};return l&&At(l)&&u.refresh().catch(()=>{}),V(i,{auth:u})}}function Et(e,t){let n=null;return o=>{if(n){let s=o.fallback;return typeof s=="function"?s({error:n}):s??null}t.ui._errorHandler=s=>{n=s,t.ui.render()};let r=o.children;try{return r??null}catch(s){n=s;let i=o.fallback;return typeof i=="function"?i({error:s}):i??null}}}var ye={components:{Button:{loading:"\u52A0\u8F7D\u4E2D..."},FileUpload:{placeholder:"\u70B9\u51FB\u6216\u62D6\u62FD\u4E0A\u4F20\u6587\u4EF6",supportedFormats:"\u652F\u6301\u683C\u5F0F: ",maxSize:"\u6700\u5927 ",remove:"\u5220\u9664"},Pagination:{ariaLabel:"\u5206\u9875"},ProgressBar:{ariaLabel:"\u8FDB\u5EA6"},Switch:{ariaLabel:"\u5207\u6362"},Breadcrumb:{ariaLabel:"\u9762\u5305\u5C51"},Modal:{ariaLabel:"\u5F39\u7A97"},Confirm:{confirmText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},Drawer:{ariaLabel:"\u4FA7\u8FB9\u9762\u677F"},DatePicker:{w0:"\u65E5",w1:"\u4E00",w2:"\u4E8C",w3:"\u4E09",w4:"\u56DB",w5:"\u4E94",w6:"\u516D",hour:"\u65F6",minute:"\u5206",time:"\u65F6\u95F4",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",placeholder:"\u9009\u62E9\u65E5\u671F"}}};var ge={components:{Button:{loading:"Loading..."},FileUpload:{placeholder:"Click or drag to upload",supportedFormats:"Supported formats: ",maxSize:"Max size: ",remove:"Remove"},Pagination:{ariaLabel:"Pagination"},ProgressBar:{ariaLabel:"Progress"},Switch:{ariaLabel:"Toggle"},Breadcrumb:{ariaLabel:"Breadcrumb"},Modal:{ariaLabel:"Dialog"},Confirm:{confirmText:"OK",cancelText:"Cancel"},Drawer:{ariaLabel:"Panel"},DatePicker:{w0:"Su",w1:"Mo",w2:"Tu",w3:"We",w4:"Th",w5:"Fr",w6:"Sa",hour:"Hour",minute:"Min",time:"Time",confirm:"OK",cancel:"Cancel",placeholder:"Pick a date"}}};var X={"zh-CN":ye,"en-US":ge};function Ue(e){if(X[e])return e;let t=e.split("-")[0];return Object.keys(X).find(o=>o.startsWith(t))??"zh-CN"}function Nt(e={}){let{locale:t="zh-CN",messages:n={},components:o={}}=e,r=Ue(t),s=X[r],i=He(s,n,o),l={locale:r,t:(a,u)=>i.messages?.[a]??u??a,setLocale:()=>{},components:i.components};return a=>(a.i18n=l,l.setLocale=u=>{let p=Ue(u),m=X[p];m&&(i=He(m,n,o),l.locale=p,l.components=i.components,a?.ui?.bumpCtxVersion?.(),a?.ui?.render())},a)}function He(e,t,n){return{messages:{...e?.messages,...t},components:kt(e?.components??{},n)}}function kt(e,t){let n={...e};for(let o of Object.keys(t))typeof t[o]=="object"&&t[o]!==null&&typeof n[o]=="object"?n[o]={...n[o],...t[o]}:n[o]=t[o];return n}var Z=0,je="",De="",qe="",Fe="",ee=0;function $e(){return typeof window<"u"&&typeof document<"u"}function Rt(){if(Z++,Z>1||!$e())return;ee=window.scrollY;let e=document.body;je=e.style.overflow,De=e.style.position,qe=e.style.top,Fe=e.style.width,e.style.overflow="hidden",(/iPhone|iPad|iPod/.test(navigator.platform)||/Mac/.test(navigator.platform)&&"ontouchend"in document)&&(e.style.position="fixed",e.style.top=`-${ee}px`,e.style.width="100%")}function Pt(){if(Z--,Z>0||!$e())return;let e=document.body;e.style.overflow=je,e.style.position=De,e.style.top=qe,e.style.width=Fe,ee>0&&window.scrollTo(0,ee)}var Wt='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Mt(e){let t=e.querySelectorAll(Wt);if(t.length===0)return()=>{};let n=t[0],o=t[t.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&document.activeElement===n?(i.preventDefault(),o.focus()):!i.shiftKey&&document.activeElement===o&&(i.preventDefault(),n.focus()))},s=document.activeElement;return queueMicrotask(()=>{n.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),s?.focus()}}function Lt(e,t,n=400){let o=!1,r=()=>{o||(o=!0,e.removeEventListener("animationend",r),clearTimeout(s),t())};e.addEventListener("animationend",r);let s=setTimeout(r,n)}export{Y as ApiError,Et as ErrorBoundary,M as Fragment,W as Portal,bt as RouteView,de as aiStream,Lt as animateOut,Tt as api,Be as asyncComponent,St as auth,E as callRefCleanup,j as clearAsyncComponentCache,yt as computeFixedPos,Le as computeFixedPosRect,gt as createApp,Je as createPortal,ge as enUS,V as extendCtx,Ge as h,ce as hydrateVNode,Nt as i18n,H as isAsyncComponent,te as jsx,ze as jsxDEV,Ke as jsxs,Rt as lockScroll,it as mountVNode,I as patchValue,wt as router,We as toChatMessages,Mt as trapFocus,Pt as unlockScroll,vt as ws,ye as zhCN};
|
|
3
|
+
`);o=i.pop()??"";for(let c of i){let a="message",f="";for(let m of c.split(`
|
|
4
|
+
`))m.startsWith("event: ")?a=m.slice(7):m.startsWith("data: ")&&(f+=m.slice(6));if(f)try{yield{name:a,data:JSON.parse(f)}}catch{}}}}finally{n.releaseLock()}}function _n(e,n,t){t&&(e.length>=1e3&&e.shift(),e.push(n))}function En(e){return e===401||e===403?"auth_failed":e===429?"rate_limited":e>=500?"provider_error":"invalid_request"}function An(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`trace-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function qe(e){return e.map(n=>({role:n.role,content:n.content}))}function _e(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Fe(e,n,t){t.initialMessages?e.messages=structuredClone(t.initialMessages):e.messages===void 0&&(e.messages=[]),e.input===void 0&&(e.input=""),e.streaming===void 0&&(e.streaming=!1),e.error===void 0&&(e.error=null),e.usage===void 0&&(e.usage=null),e.step===void 0&&(e.step=null);let o=null;function r(){if(!e.streaming)return;let l=e.messages[e.messages.length-1];return l&&l.role==="assistant"&&l.status==="streaming"?l:void 0}function s(l,u,d){let p=r();switch(l){case"wf:token":p&&(p.content+=u.text);break;case"wf:tool_call":{p&&(p.toolCalls||(p.toolCalls=[]),p.toolCalls.push({call:u,status:"running"}));break}case"wf:tool_progress":{let g=u,h=p?.toolCalls?.find(b=>b.call.id===g.toolCallId);h&&(h.progress=g);break}case"wf:tool_result":{let g=u,h=p?.toolCalls?.find(b=>b.call.id===g.id);h&&(h.result=g,h.status=g.ok?"ok":"error");break}case"wf:approval_request":p&&(p.approval=u);break;case"wf:usage":p&&(p.usage=u);break;case"wf:step":e.step=u;break;case"wf:done":p&&(p.status="done",p.approval=void 0),e.streaming=!1,e.step=null;break;case"wf:error":p&&(p.status="error",p.error=u,p.approval=void 0),e.error=u,e.streaming=!1,e.step=null;break;default:d?.(l,u);break}}function i(){let l=t.body?t.body(e.messages):{messages:qe(e.messages)};o=n(t.url,l,{onToken:d=>s("wf:token",{text:d}),onToolCall:d=>s("wf:tool_call",d),onToolProgress:d=>s("wf:tool_progress",d),onToolResult:d=>s("wf:tool_result",d),onApproval:d=>s("wf:approval_request",d),onUsage:d=>s("wf:usage",d),onStep:d=>s("wf:step",d),onDone:d=>s("wf:done",d),onError:d=>s("wf:error",d),onEvent:(d,p)=>s(d,p,t.onEvent)},{signal:t.signal,headers:t.headers}),e.streaming=!0;let u=r();u&&o?.traceId&&(u.id=o.traceId)}function c(){if(e.streaming)return;let l=String(e.input??"").trim();l&&(e.input="",e.error=null,e.usage=null,e.step=null,e.messages.push({id:_e(),role:"user",content:l,status:"done"},{id:_e(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function a(){o?.abort(),e.streaming=!1,e.step=null;let l=e.messages[e.messages.length-1];l&&l.role==="assistant"&&l.status==="streaming"&&(!l.content&&(!l.toolCalls||l.toolCalls.length===0)?e.messages.pop():l.status="done")}function f(){if(e.streaming)return;let l=-1;for(let u=e.messages.length-1;u>=0;u--)if(e.messages[u].role==="user"){l=u;break}l!==-1&&(e.messages.splice(l+1),e.error=null,e.usage=null,e.step=null,e.messages.push({id:_e(),role:"assistant",content:"",status:"streaming",toolCalls:[]}),i())}function m(){o?.abort(),e.messages=[],e.input="",e.streaming=!1,e.error=null,e.usage=null,e.step=null}async function y(l,u){let d=e.messages[e.messages.length-1],p=d?.role==="assistant"?d.approval:void 0;if(p&&(d.approval=void 0,!!t.approveUrl))try{await fetch(t.approveUrl,{method:"POST",headers:{"Content-Type":"application/json",...t.headers},body:JSON.stringify({id:p.id,decision:l,note:u}),signal:t.signal})}catch(g){if(t.signal?.aborted)return;e.error={code:"provider_error",message:g instanceof Error?g.message:String(g)}}}function v(){o?.abort(),o=null}return{send:c,stop:a,retry:f,clear:m,approve:y,dispose:v}}function re(e,n="bottom",t=6,o=!0){switch(n){case"bottom":return{top:e.bottom+t,left:o?e.left+e.width/2:e.left};case"top":return{top:e.top-t,left:o?e.left+e.width/2:e.left};case"left":return{top:o?e.top+e.height/2:e.top,left:e.left-t};case"right":return{top:o?e.top+e.height/2:e.top,left:e.right+t}}}function kn(e,n="bottom",t=6,o=!0){return re(e.getBoundingClientRect(),n,t,o)}function se(e,n,t=8){if(!n)return e;let o=n.getBoundingClientRect();if(o.width===0&&o.height===0)return e;let r=Number.parseFloat(n.style.top)||o.top,s=Number.parseFloat(n.style.left)||o.left,i=e.top-r,c=e.left-s,a={top:o.top+i,bottom:o.bottom+i,left:o.left+c,right:o.right+c},f=window.innerWidth,m=window.innerHeight,y=e.top,v=e.left;return a.bottom>m-t&&(y=Math.max(t,y-(a.bottom-(m-t)))),a.top<t&&(y=Math.max(t,y+(t-a.top))),a.right>f-t&&(v=Math.max(t,v-(a.right-(f-t)))),a.left<t&&(v=Math.max(t,v+(t-a.left))),{top:y,left:v,width:e.width}}function $e(e){let{ctx:n,renderByIds:t,getSelfId:o,dirtyBatch:r,dirtySet:s,mediaRegistry:i,popupTrackers:c,scrollTrackers:a,schedulePopupRecompute:f,ensurePopupListeners:m,isRendering:y}=e;return{_selfId:"_wf_root",_ctxVersion:0,_dirtySet:s,bumpCtxVersion:function(){this._ctxVersion++},render:function(l){if(!l||l.length===0){let u=o(this);if(u)l=[u];else return}t(l)},dirty:function(l){if(!y()){if(!l||l.length===0){let u=o(this);if(u)l=[u];else return}for(let u of l)u&&(r.add(u),s.add(u));this._dirtyScheduled||(this._dirtyScheduled=!0,queueMicrotask(()=>{this._dirtyScheduled=!1;let u=[...r];r.clear(),u.length>0&&t(u)}))}},$:function(){let l=this;if(!l._$cache){let u=o(this);l._$cache=Te(()=>n.ui.dirty(u?[u]:void 0))}return l._$cache},useChat:function(l){let u=this.$(),d=Fe(u,Pe,l);return Object.assign(u,{send:d.send,stop:d.stop,retry:d.retry,clear:d.clear,approve:d.approve,dispose:d.dispose}),u},useMedia:function(l,u){let p=`media:${o(this)}:${l}`;if(!i.has(p)){let g=window.matchMedia(l);u(g.matches);let h=b=>u(b.matches);g.addEventListener("change",h),i.set(p,{mql:g,handler:h})}},useBreakpoint:function(l,u){let d=typeof l=="function"?{mobile:"(max-width: 639px)",tablet:"(min-width: 640px) and (max-width: 1023px)",desktop:"(min-width: 1024px)"}:l,p=typeof l=="function"?l:u,h=`bp:${o(this)}`;function b(){for(let[x,C]of Object.entries(d))if(window.matchMedia(C).matches)return x;return Object.keys(d)[0]??""}if(!i.has(h)){p(b());let x=[];for(let C of Object.values(d)){let P=window.matchMedia(C),w=()=>p(b());P.addEventListener("change",w),x.push({mql:P,handler:w})}i.set(h,{mqls:x})}},usePopupPosition:function(l){let u=o(this),d={top:0,left:0,refresh:()=>{}};if(!u)return d;let p={pos:d,getEl:l.el,isOpen:l.isOpen,compute:l.compute,panel:l.panel,margin:l.margin??8};return c.set(u,p),m(),d.refresh=()=>{let g=p.getEl();if(!g)return;let h=p.compute(g.getBoundingClientRect());Object.assign(d,se(h,p.panel?.(),p.margin))},d},useHoverCapable:function(){return typeof window<"u"&&!!window.matchMedia?.("(hover: hover)").matches},useVisualViewport:function(){let l=o(this),u={height:window.innerHeight,offsetTop:0,keyboardOpen:!1},d=()=>{n.ui&&n.ui.dirty(l?[l]:void 0)},p=()=>{let h=window.visualViewport;u.height=h?.height??window.innerHeight,u.offsetTop=h?.offsetTop??0,u.keyboardOpen=u.height<window.innerHeight*.9,d()},g=window.visualViewport;return g?.addEventListener?(g.addEventListener("resize",p),g.addEventListener("scroll",p)):window.addEventListener("resize",p),l&&B(h=>{h===l&&(g?.removeEventListener?(g.removeEventListener("resize",p),g.removeEventListener("scroll",p)):window.removeEventListener("resize",p))}),u},usePopup:function(l){let u=o(this),d=this.useHoverCapable(),p=()=>typeof l.trigger=="function"?l.trigger():l.trigger,g=l.open!==void 0,h=()=>!!l.disabled?.(),b=()=>g?typeof l.open=="function"?!!l.open():!!l.open:l.isOpen(),x=T=>{h()||(g?l.onOpenChange?.(T):l.setOpen(T))},C=()=>{let T=l.placement;return typeof T=="function"?T():T??"bottom"},P=null,w=!1,_=n.ui.usePopupPosition({el:l.el,isOpen:()=>b(),compute:T=>re(T,C(),l.gap??6,l.center!==!1),panel:()=>P,margin:l.margin??8}),A=T=>{if(l.closeOnOutside===!1||!b())return;let V=T.target;if(!(V instanceof Node))return;let $=l.el();$&&$.contains(V)||P&&P.contains(V)||x(!1)},N=T=>{l.closeOnEscape!==!1&&(T.key!=="Escape"||!b()||x(!1))};document.addEventListener("mousedown",A),document.addEventListener("keydown",N),u&&B(T=>{T===u&&(document.removeEventListener("mousedown",A),document.removeEventListener("keydown",N))});let k={},E=T=>typeof T=="function"?T():T??0,L=()=>E(l.openDelay),D=()=>E(l.closeDelay),M,W,en=()=>{clearTimeout(M),clearTimeout(W),M=void 0,W=void 0};if(p()==="hover")d?(k.onMouseEnter=()=>{h()||(clearTimeout(W),W=void 0,M=setTimeout(()=>{M=void 0,x(!0)},L()))},k.onMouseLeave=()=>{h()||(clearTimeout(M),M=void 0,W=setTimeout(()=>{W=void 0,x(!1)},D()))}):k.onClick=()=>x(!b()),k.onFocus=()=>{h()||(clearTimeout(W),W=void 0,M=setTimeout(()=>{M=void 0,x(!0)},L()))},k.onBlur=()=>{h()||(clearTimeout(M),M=void 0,W=setTimeout(()=>{W=void 0,x(!1)},D()))};else if(p()==="click")k.onClick=()=>x(!b());else if(p()==="longpress"){let T,V=0,$=0,U=()=>{clearTimeout(T),T=void 0};k.onPointerDown=I=>{h()||(V=I.clientX??0,$=I.clientY??0,U(),T=setTimeout(()=>{T=void 0,x(!0)},l.longPressDuration??500))},k.onPointerUp=U,k.onPointerLeave=U,k.onPointerMove=I=>{let ce=Math.abs((I.clientX??0)-V),fe=Math.abs((I.clientY??0)-$);(ce>10||fe>10)&&U()},k.onContextMenu=I=>{I.preventDefault(),x(!0)}}k.onKeyDown=T=>{T.key==="Escape"&&l.closeOnEscape!==!1&&x(!1)},u&&B(T=>{T===u&&en()});let nn=T=>{if(T){P=T;let V=()=>_.refresh();T.addEventListener("animationend",V,{once:!0})}else P=null},tn=(T,V="popover")=>{if(h())return null;if(!b())return w=!1,null;w||(_.refresh(),w=!0);let U=T.props??{},I=U.ref,ce=["wf-popup",U.class].filter(Boolean).join(" "),fe={...U.style??{},position:"fixed",top:`${_.top}px`,left:`${_.left}px`,maxWidth:l.width!==void 0?`min(${l.width}px, calc(100vw - 32px))`:"calc(100vw - 32px)"},on={...T,props:{...U,class:ce,style:fe,ref:Ne=>{nn(Ne),I&&I(Ne)}}};return pe(on,V)};return{open:b(),setOpen:x,wrapProps:k,portal:tn,refresh:()=>_.refresh()}},useLongPress:function(l){let{onLongPress:u,duration:d=500}=l,p,g=0,h=0,b=null,x=()=>{clearTimeout(p),p=void 0};return{onPointerDown:C=>{g=C.clientX??0,h=C.clientY??0,b=C,x(),p=setTimeout(()=>{p=void 0,u(b)},d)},onPointerUp:x,onPointerLeave:x,onPointerMove:C=>{let P=Math.abs((C.clientX??0)-g),w=Math.abs((C.clientY??0)-h);(P>10||w>10)&&x()},onContextMenu:C=>{C.preventDefault(),u(C)}}},useInView:function(l){let u=o(this),d={isIn:!1,ready:!1,observe:x,refresh:C,disconnect:P},p=null,g=null,h=()=>{n.ui&&n.ui.dirty(u?[u]:void 0)};function b(){if(g?.disconnect(),g=null,!p)return;let w=typeof l.rootMargin=="function"?l.rootMargin():l.rootMargin,_=typeof l.threshold=="function"?l.threshold():l.threshold;g=new IntersectionObserver(A=>{let N=A[A.length-1];if(!N)return;let k=N.isIntersecting,E=k!==d.isIn,L=!d.ready;d.isIn=k,d.ready=!0,l.onChange?.(N,k),(E||L)&&h()},{root:l.root?l.root():null,rootMargin:w??"0px",threshold:_??0}),g.observe(p)}function x(w){p=w,w?b():(g?.disconnect(),g=null,d.isIn=!1)}function C(){b()}function P(){g?.disconnect(),g=null}return d},useScrollPosition:function(l){let u=o(this),d={y:0,refresh(){let g=p.getScroller();d.y=g instanceof Window?document.scrollingElement?.scrollTop??g.scrollY??0:g.scrollTop??0}},p={handle:d,getScroller:l.getScroller??(()=>window)};return u?(a.set(u,p),m(),d.refresh(),d):(d.refresh(),d)},useAsync:function(l){let u=o(this),d=Te(()=>{n.ui&&n.ui.dirty(u?[u]:void 0)});d.loading=!0;let p=()=>{d.loading=!0,d.error=null,Promise.resolve().then(()=>l()).then(g=>{d.data=g,d.loading=!1}).catch(g=>{d.error=g,d.loading=!1})};return p(),d.reload=p,d},selfId:function(l){if(typeof l!="string"||!l)throw new Error(`[weifuwu] selfId requires a non-empty string, got ${typeof l}`);if(R.has(l))throw new Error(`[weifuwu] Duplicate component ID: "${l}". Each component must have a unique custom ID.`);let u=this._selfVNode;u&&(u._customId=l,R.set(l,u))}}}function Nn(){let e=[],n={},t=null,o=null,r=null,s=!1,i=new Set,c=!1,a=new Map;function f(C){let P=a.get(C);P&&(P.mql&&P.handler&&P.mql.removeEventListener("change",P.handler),P.mqls?.forEach(({mql:w,handler:_})=>w.removeEventListener("change",_)),a.delete(C))}let m=new Map,y=!1,v=0;function l(){y||(y=!0,window.addEventListener("scroll",p,{capture:!0,passive:!0}),window.addEventListener("resize",p))}function u(){y&&(window.removeEventListener("scroll",p,{capture:!0}),window.removeEventListener("resize",p),y=!1)}let d=new Map;function p(){v||(v=requestAnimationFrame(()=>{v=0;let C=[];for(let[P,w]of m){if(!w.isOpen())continue;let _=w.getEl();if(!_)continue;let A=w.compute(_.getBoundingClientRect());Object.assign(w.pos,se(A,w.panel?.(),w.margin)),C.push(P)}for(let[P,w]of d){let _=w.getScroller(),A=_ instanceof Window?document.scrollingElement?.scrollTop??_.scrollY??0:_.scrollTop??0;A!==w.handle.y&&(w.handle.y=A,C.push(P))}C.length>0&&n.ui.render(C)}))}function g(C){if(!s){s=!0;for(let P of C){let w=R.get(P);if(!w||!w._render)continue;n.ui._dirtySet?.delete(P);let _=w._child,A=w._render(w.props);if(w._child=A,_&&_._placement==="remote"||A&&A._placement==="remote"){_&&A?X(_,A,n):A?K(A,n):_&&S(_);continue}if(!w._parentNode&&w._refNode&&(w._parentNode=w._refNode.parentNode),w._parentNode){let N=q(w._parentNode,w._refNode??null,_,A,n);N&&N!==w._refNode?w._refNode=N:N||(w._refNode=null)}}s=!1,h()}}function h(){let C=n.ui;i.size>0&&!C._dirtyScheduled&&(C._dirtyScheduled=!0,queueMicrotask(()=>{C._dirtyScheduled=!1;let P=[...i];i.clear(),P.length>0&&g(P)}))}function b(C){return C?._selfId??n.ui?._selfId}let x={get ctx(){return n},use(C){return e.push(C),x},async mount(C,P,w){o=P;for(let E of e)n=await E(n);let _=typeof C=="string"?document.querySelector(C):C;if(!_)throw new Error(`mount target not found: ${C}`);t=_;let A=!!w?.hydrate;A||(t.innerHTML="");let N=new Map,k=globalThis.__DATA__;if(k&&typeof k=="object")for(let[E,L]of Object.entries(k))N.set(E,{value:L});if(n.data={async get(E,L){let D=N.get(E);if(D&&"value"in D)return D.value;if(D?.promise)return D.promise;if(!L)return;let M=Promise.resolve().then(()=>L()).then(W=>(N.set(E,{value:W}),W));return N.set(E,{promise:M}),M},set(E,L){N.set(E,{value:L})},has(E){return N.has(E)}},B(E=>{for(let L of[...a.keys()])(L.startsWith(`media:${E}:`)||L===`bp:${E}`)&&f(L);m.delete(E),d.delete(E)}),n.ui=$e({ctx:n,renderByIds:g,getSelfId:b,dirtyBatch:i,dirtySet:new Set,mediaRegistry:a,popupTrackers:m,scrollTrackers:d,schedulePopupRecompute:p,ensurePopupListeners:l,destroyPopupListeners:u,isRendering:()=>s}),s=!0,r=Sn(P,n),r._id="_wf_root",r._parentNode=t,r._refNode=A?t.firstChild:null,R.set("_wf_root",r),A)await ve(t,r,n);else{let E=De(r,n);E instanceof Node&&t.appendChild(E)}r._refNode=t.firstChild,s=!1,h()},destroy(){u(),m.clear(),d.clear();for(let C of[...a.keys()])f(C);R.clear(),t&&(t.innerHTML=""),t=null,n={}}};return x}function Sn(e,n){return{type:e,props:{},key:void 0}}function Rn(e,n){if(!n||n==="/")return e||"/";let t=e.endsWith("/")?e.slice(0,-1):e,o=n.startsWith("/")?n:"/"+n;return t+o}function Ln(e){let n=[],t=e.replace(/:(\w+)/g,(o,r)=>(n.push(r),"([^/]+)")).replace(/\*/g,".*");return{re:new RegExp(`^${t}$`),keys:n}}function Ee(e,n="",t=[]){let o=[];for(let r of e){let s=Rn(n,r.path),{re:i,keys:c}=Ln(s),a=[...t,r];o.push({re:i,keys:c,def:r,chain:a}),r.children&&o.push(...Ee(r.children,s,a))}return o}function Be(e,n){let t=null;for(let o of n)e.match(o.re)&&(!t||o.chain.length>t.chain.length)&&(t=o);return t}function Ke(e,n){let t={},o=e.match(n.re);if(o)for(let r=0;r<n.keys.length;r++)t[n.keys[r]]=decodeURIComponent(o[r+1]);return t}function Mn(e){let n=Ee(e.routes),t=e.mode||"history";function o(){return t==="hash"?window.location.hash.replace(/^#/,"")||"/":window.location.pathname}function r(s){let i=Be(s,n);if(i){let c=i.chain[i.chain.length-1];return{path:i.def.path,params:Ke(s,i),query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:i.chain,title:c?.title??""}}return{path:s,params:{},query:Object.fromEntries(new URLSearchParams(window.location.search)),chain:e.notFound?[{component:e.notFound,title:"Not Found"}]:[],title:""}}return s=>{let i=r(o());s.route=i,i.title&&(document.title=i.title),s.app||(s.app={}),s.app.navigate=a=>{if(G(),t==="hash"){window.location.hash="#"+a;let f=r(a);s.route=f}else{window.history.pushState({},"",a);let f=r(a);s.route=f}s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};let c=()=>{G();let a=r(o());s.route=a,s.route?.title&&(document.title=s.route.title),s.ui?.bumpCtxVersion?.(),s.ui?.render()};return window.addEventListener("popstate",c),t==="hash"&&window.addEventListener("hashchange",c),s}}function Wn(e,n){let t=n.route?._rvDepth??0;return()=>{let o=n.route;if(!o?.chain?.length||t>=o.chain.length)return null;let r=o.chain[t],s=r.layout??r.component;return s?(r.layout&&(o._rvDepth=t+1),{type:s,props:{},key:void 0}):null}}function F(e,n){return Object.assign(Object.create(e),n)}function On(e={}){let n=e.url??"/ws",t=e.reconnectInterval??3e3,o=e.maxReconnect??10,r=e.pingInterval??3e4,s=e.pingTimeout??1e4;return i=>{let c=new Set,a=null,f=0,m=null,y=null,v=null,l=!1,u={isConnected:!1,onMessage:b=>(c.add(b),()=>{c.delete(b)}),send:b=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify(b))},_connect:d,close:()=>{l=!0,h(),a?.close(),a=null,u.isConnected=!1}};async function d(){if(!l)try{a=new WebSocket(n),a.onopen=()=>{u.isConnected=!0,f=0,p()},a.onmessage=b=>{try{let x=JSON.parse(b.data);for(let C of c)C(x)}catch{}g()},a.onclose=()=>{u.isConnected=!1,h(),!l&&f<o&&(f++,m=setTimeout(d,t*Math.min(f,5)))},a.onerror=()=>{a?.close()}}catch{l||(m=setTimeout(d,t))}}function p(){r<=0||(y=setInterval(()=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({type:"ping"})),v=setTimeout(()=>{a?.close()},s)},r))}function g(){clearTimeout(v)}function h(){clearInterval(y),clearTimeout(v),clearTimeout(m)}return d(),F(i,{ws:u})}}function Vn(e){let n={baseURL:e?.baseURL??"",headers:{"Content-Type":"application/json",...e?.headers}},t=e?.onRequest,o=e?.onResponse,r=e?.timeout??0;async function s(i,c,a,f){let m=n.baseURL+c,y={method:i,headers:{...n.headers,...f?.headers}},v=e?.token?.();v&&!y.headers.Authorization&&(y.headers.Authorization=`Bearer ${v}`);let l=r>0,u=!!f?.signal,d=null,p=null;(l||u)&&(d=new AbortController,y.signal=d.signal,l&&(p=setTimeout(()=>d.abort(new Error("Request timed out")),r)),u&&f.signal.addEventListener("abort",()=>d.abort())),a!==void 0&&i!=="GET"&&i!=="HEAD"&&(y.body=JSON.stringify(a));let g={url:m,init:y};t&&(g=t(g));try{let h=await fetch(g.url,g.init);if(o)return o(h);if(!h.ok){let C=await h.text().catch(()=>"");throw new ie(h.status,C||h.statusText)}let b=h.headers.get("content-length");if(h.status===204||b==="0")return;let x=(h.headers.get("content-type")||"").toLowerCase();return x.includes("application/json")||x.includes("json")?h.json():h.text()}finally{p&&clearTimeout(p)}}return i=>F(i,{api:{get:(a,f)=>s("GET",a,void 0,f),post:(a,f,m)=>s("POST",a,f,m),put:(a,f,m)=>s("PUT",a,f,m),patch:(a,f,m)=>s("PATCH",a,f,m),delete:(a,f)=>s("DELETE",a,void 0,f)}})}var ie=class extends Error{status;body;constructor(n,t){super(`API Error ${n}: ${t}`),this.name="ApiError",this.status=n,this.body=t}};function In(e){try{let n=e.split(".");if(n.length!==3)return null;let t=n[1].replace(/-/g,"+").replace(/_/g,"/");return JSON.parse(atob(t))}catch{return null}}function Hn(e){let n=In(e);return n?.exp?n.exp*1e3-3e4<Date.now():!0}function Un(e){let n=e?.storage??localStorage,t=e?.tokenKey??"weifuwu_token",o=e?.userKey??"weifuwu_user",r=e?.refreshTokenKey??"weifuwu_refresh",s=e?.refreshEndpoint??"/api/auth/refresh";return i=>{let c=n.getItem(t),a=n.getItem(o),f={token:c,user:a?JSON.parse(a):null,get isLoggedIn(){return this.token!==null},login(m,y,v){f.token=m,f.user=y,n.setItem(t,m),n.setItem(o,JSON.stringify(y)),v&&n.setItem(r,v)},logout(){f.token=null,f.user=null,n.removeItem(t),n.removeItem(o),n.removeItem(r)},setUser(m){f.user=m,n.setItem(o,JSON.stringify(m))},async refresh(){let m=n.getItem(r);if(!m)return!1;try{let y=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:m})});if(!y.ok)return f.logout(),!1;let v=await y.json();return f.token=v.token,n.setItem(t,v.token),v.refreshToken&&n.setItem(r,v.refreshToken),!0}catch{return!1}}};return c&&Hn(c)&&f.refresh().catch(()=>{}),F(i,{auth:f})}}function jn(e,n){let t=null;return o=>{if(t){let s=o.fallback;return typeof s=="function"?s({error:t}):s??null}n.ui._errorHandler=s=>{t=s,n.ui.render()};let r=o.children;try{return r??null}catch(s){t=s;let i=o.fallback;return typeof i=="function"?i({error:s}):i??null}}}var Ae={components:{Button:{loading:"\u52A0\u8F7D\u4E2D..."},FileUpload:{placeholder:"\u70B9\u51FB\u6216\u62D6\u62FD\u4E0A\u4F20\u6587\u4EF6",supportedFormats:"\u652F\u6301\u683C\u5F0F: ",maxSize:"\u6700\u5927 ",remove:"\u5220\u9664"},Pagination:{ariaLabel:"\u5206\u9875"},ProgressBar:{ariaLabel:"\u8FDB\u5EA6"},Switch:{ariaLabel:"\u5207\u6362"},Breadcrumb:{ariaLabel:"\u9762\u5305\u5C51"},Modal:{ariaLabel:"\u5F39\u7A97"},Confirm:{confirmText:"\u786E\u5B9A",cancelText:"\u53D6\u6D88"},Drawer:{ariaLabel:"\u4FA7\u8FB9\u9762\u677F"},DatePicker:{w0:"\u65E5",w1:"\u4E00",w2:"\u4E8C",w3:"\u4E09",w4:"\u56DB",w5:"\u4E94",w6:"\u516D",hour:"\u65F6",minute:"\u5206",time:"\u65F6\u95F4",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",placeholder:"\u9009\u62E9\u65E5\u671F"}}};var ke={components:{Button:{loading:"Loading..."},FileUpload:{placeholder:"Click or drag to upload",supportedFormats:"Supported formats: ",maxSize:"Max size: ",remove:"Remove"},Pagination:{ariaLabel:"Pagination"},ProgressBar:{ariaLabel:"Progress"},Switch:{ariaLabel:"Toggle"},Breadcrumb:{ariaLabel:"Breadcrumb"},Modal:{ariaLabel:"Dialog"},Confirm:{confirmText:"OK",cancelText:"Cancel"},Drawer:{ariaLabel:"Panel"},DatePicker:{w0:"Su",w1:"Mo",w2:"Tu",w3:"We",w4:"Th",w5:"Fr",w6:"Sa",hour:"Hour",minute:"Min",time:"Time",confirm:"OK",cancel:"Cancel",placeholder:"Pick a date"}}};var ae={"zh-CN":Ae,"en-US":ke};function ze(e){if(ae[e])return e;let n=e.split("-")[0];return Object.keys(ae).find(o=>o.startsWith(n))??"zh-CN"}function Dn(e={}){let{locale:n="zh-CN",messages:t={},components:o={}}=e,r=ze(n),s=ae[r],i=Ge(s,t,o),c={locale:r,t:(a,f)=>i.messages?.[a]??f??a,setLocale:()=>{},components:i.components};return a=>(a.i18n=c,c.setLocale=f=>{let m=ze(f),y=ae[m];y&&(i=Ge(y,t,o),c.locale=m,c.components=i.components,a?.ui?.bumpCtxVersion?.(),a?.ui?.render())},a)}function Ge(e,n,t){return{messages:{...e?.messages,...n},components:qn(e?.components??{},t)}}function qn(e,n){let t={...e};for(let o of Object.keys(n))typeof n[o]=="object"&&n[o]!==null&&typeof t[o]=="object"?t[o]={...t[o],...n[o]}:t[o]=n[o];return t}var le=0,Je="",Ye="",Qe="",Xe="",ue=0;function Ze(){return typeof window<"u"&&typeof document<"u"}function Fn(){if(le++,le>1||!Ze())return;ue=window.scrollY;let e=document.body;Je=e.style.overflow,Ye=e.style.position,Qe=e.style.top,Xe=e.style.width,e.style.overflow="hidden",(/iPhone|iPad|iPod/.test(navigator.platform)||/Mac/.test(navigator.platform)&&"ontouchend"in document)&&(e.style.position="fixed",e.style.top=`-${ue}px`,e.style.width="100%")}function $n(){if(le--,le>0||!Ze())return;let e=document.body;e.style.overflow=Je,e.style.position=Ye,e.style.top=Qe,e.style.width=Xe,ue>0&&window.scrollTo(0,ue)}var Bn='a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';function Kn(e){let n=e.querySelectorAll(Bn);if(n.length===0)return()=>{};let t=n[0],o=n[n.length-1],r=i=>{i.key==="Tab"&&(i.shiftKey&&document.activeElement===t?(i.preventDefault(),o.focus()):!i.shiftKey&&document.activeElement===o&&(i.preventDefault(),t.focus()))},s=document.activeElement;return queueMicrotask(()=>{t.focus()}),e.addEventListener("keydown",r),()=>{e.removeEventListener("keydown",r),s?.focus()}}function zn(e,n,t=400){let o=!1,r=()=>{o||(o=!0,e.removeEventListener("animationend",r),clearTimeout(s),n())};e.addEventListener("animationend",r);let s=setTimeout(r,t)}export{ie as ApiError,jn as ErrorBoundary,j as Fragment,H as Portal,Wn as RouteView,Pe as aiStream,zn as animateOut,Vn as api,rn as asyncComponent,Un as auth,S as callRefCleanup,G as clearAsyncComponentCache,kn as computeFixedPos,re as computeFixedPosRect,Nn as createApp,pe as createPortal,ke as enUS,F as extendCtx,ln as h,ve as hydrateVNode,Dn as i18n,z as isAsyncComponent,de as jsx,an as jsxDEV,sn as jsxs,Fn as lockScroll,wn as mountVNode,q as patchValue,Mn as router,qe as toChatMessages,Kn as trapFocus,$n as unlockScroll,On as ws,Ae as zhCN};
|
package/dist/client/types.d.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* weifuwu/client 类型定义
|
|
3
3
|
*/
|
|
4
4
|
import type { UseChatHandle, UseChatOptions } from './use-chat.ts';
|
|
5
|
+
import type { VNode } from './vnode.ts';
|
|
6
|
+
import type { Placement } from './popup.ts';
|
|
5
7
|
/** 弹层位置跟踪配置 — 供 ctx.ui.usePopupPosition 使用 */
|
|
6
8
|
export interface PopupPositionOptions {
|
|
7
9
|
/** 锚定元素 getter(通常是 ref 保存的触发元素) */
|
|
@@ -34,6 +36,82 @@ export interface PopupPosition {
|
|
|
34
36
|
/** 立即重算一次坐标(不触发渲染,调用方负责 render) */
|
|
35
37
|
refresh: () => void;
|
|
36
38
|
}
|
|
39
|
+
/** 弹层触发方式 — usePopup 的 trigger */
|
|
40
|
+
export type PopupTrigger = 'hover' | 'click' | 'longpress';
|
|
41
|
+
/** 弹层组合器配置 — 供 ctx.ui.usePopup 使用 */
|
|
42
|
+
export interface UsePopupOptions {
|
|
43
|
+
/** 触发方式(支持 getter——动态读最新 props;hover 在触屏环境自动降级为 tap) */
|
|
44
|
+
trigger: PopupTrigger | (() => PopupTrigger);
|
|
45
|
+
/** 弹出方向(支持 getter——动态读最新 props),默认 'bottom' */
|
|
46
|
+
placement?: Placement | (() => Placement);
|
|
47
|
+
/** 水平对齐:center=居中于触发元素(默认),start=左对齐(Menubar 面板用) */
|
|
48
|
+
center?: boolean;
|
|
49
|
+
/** 与触发元素间距(px,默认 6) */
|
|
50
|
+
gap?: number;
|
|
51
|
+
/** 视口安全边距(px,默认 8) */
|
|
52
|
+
margin?: number;
|
|
53
|
+
/** 锚定元素 getter(ref 保存的触发元素) */
|
|
54
|
+
el: () => HTMLElement | null;
|
|
55
|
+
/** 是否打开(getter) */
|
|
56
|
+
isOpen: () => boolean;
|
|
57
|
+
/** 非受控:设置打开状态(调用方负责 render/dirty) */
|
|
58
|
+
setOpen: (open: boolean) => void;
|
|
59
|
+
/** 受控(可选,boolean 或 getter——动态读最新 props):传了则组件内不直接改状态,只回调 onOpenChange */
|
|
60
|
+
open?: boolean | (() => boolean);
|
|
61
|
+
/** 受控回调(可选) */
|
|
62
|
+
onOpenChange?: (open: boolean) => void;
|
|
63
|
+
/** 面板宽度(px,可选):自动 clamp 到视口(≤ 100vw - 32px) */
|
|
64
|
+
width?: number;
|
|
65
|
+
/** 点外部关闭(默认 true) */
|
|
66
|
+
closeOnOutside?: boolean;
|
|
67
|
+
/** Escape 关闭(默认 true) */
|
|
68
|
+
closeOnEscape?: boolean;
|
|
69
|
+
/** 长按触发时长(ms,仅 trigger='longpress',默认 500) */
|
|
70
|
+
longPressDuration?: number;
|
|
71
|
+
/** hover 打开延迟(ms 或 getter——动态读最新 props,仅 trigger='hover',默认 0) */
|
|
72
|
+
openDelay?: number | (() => number);
|
|
73
|
+
/** hover 关闭延迟(ms 或 getter,仅 trigger='hover',默认 0) */
|
|
74
|
+
closeDelay?: number | (() => number);
|
|
75
|
+
/** 禁用(getter):禁用时所有触发不生效且 portal 不渲染 */
|
|
76
|
+
disabled?: () => boolean;
|
|
77
|
+
}
|
|
78
|
+
/** 弹层组合器返回值 — usePopup */
|
|
79
|
+
export interface UsePopupHandle {
|
|
80
|
+
/** 当前打开状态(渲染期读取) */
|
|
81
|
+
open: boolean;
|
|
82
|
+
setOpen: (open: boolean) => void;
|
|
83
|
+
/** spread 到触发/包装元素:触发(hover 门控/tap 降级/longpress)+ Escape + focus */
|
|
84
|
+
wrapProps: Record<string, any>;
|
|
85
|
+
/** 包装弹层内容:定位 + 视口/宽度 clamp + portal;关闭时返回 null */
|
|
86
|
+
portal: (content: VNode, portalKey?: string) => VNode | null;
|
|
87
|
+
/** 立即重算坐标(打开/动画结束后调用) */
|
|
88
|
+
refresh: () => void;
|
|
89
|
+
}
|
|
90
|
+
/** 长按配置 — 供 ctx.ui.useLongPress 使用 */
|
|
91
|
+
export interface UseLongPressOptions {
|
|
92
|
+
/** 长按时长(ms,默认 500) */
|
|
93
|
+
duration?: number;
|
|
94
|
+
/** 长按触发回调(接收触发事件,含 clientX/clientY) */
|
|
95
|
+
onLongPress: (e?: any) => void;
|
|
96
|
+
}
|
|
97
|
+
/** 长按返回的触发 props — spread 到目标元素 */
|
|
98
|
+
export interface UseLongPressHandle {
|
|
99
|
+
onPointerDown: (e: any) => void;
|
|
100
|
+
onPointerUp: (e: any) => void;
|
|
101
|
+
onPointerLeave: (e: any) => void;
|
|
102
|
+
onPointerMove: (e: any) => void;
|
|
103
|
+
/** 桌面右键兼容(移动端浏览器 contextmenu 也会触发) */
|
|
104
|
+
onContextMenu: (e: any) => void;
|
|
105
|
+
}
|
|
106
|
+
/** 可视视口(visualViewport)状态 — useVisualViewport 返回值 */
|
|
107
|
+
export interface VisualViewportHandle {
|
|
108
|
+
/** 可视视口高度(visualViewport.height;无 visualViewport 时 = innerHeight) */
|
|
109
|
+
height: number;
|
|
110
|
+
/** 可视视口相对布局视口顶部的偏移(键盘弹起时 > 0) */
|
|
111
|
+
offsetTop: number;
|
|
112
|
+
/** 键盘是否弹起(height < 0.9 × innerHeight 近似) */
|
|
113
|
+
keyboardOpen: boolean;
|
|
114
|
+
}
|
|
37
115
|
/** 可见性观察配置 — 供 ctx.ui.useInView 使用(IntersectionObserver 封装,替代 scroll 监听) */
|
|
38
116
|
export interface UseInViewOptions {
|
|
39
117
|
/** IO 根元素 getter(默认视口;滚动容器场景传 target) */
|
|
@@ -97,6 +175,36 @@ export interface WfuiContext {
|
|
|
97
175
|
useBreakpoint: (bpsOrCallback: Record<string, string> | ((vp: string) => void), callback?: (vp: string) => void) => void;
|
|
98
176
|
/** 弹层位置跟踪:滚动/resize 时自动重算 fixed 坐标 */
|
|
99
177
|
usePopupPosition: (options: PopupPositionOptions) => PopupPosition;
|
|
178
|
+
/**
|
|
179
|
+
* 弹层组合器:收敛 open 状态 + 触发(hover/tap 降级/longpress)+ Escape +
|
|
180
|
+
* 外部点击 + 定位/视口 clamp + portal。移动端友好由构造保证。
|
|
181
|
+
*
|
|
182
|
+
* ```ts
|
|
183
|
+
* const popup = ctx.ui.usePopup({
|
|
184
|
+
* trigger: 'hover', // 触屏自动降级 tap
|
|
185
|
+
* el: () => wrapEl,
|
|
186
|
+
* isOpen: () => $.open,
|
|
187
|
+
* setOpen: (v) => { $.open = v; ctx.ui.render() },
|
|
188
|
+
* width: 320, // 自动 clamp 视口
|
|
189
|
+
* })
|
|
190
|
+
* return () => h('div', { ref: wrapRef, ...popup.wrapProps }, [
|
|
191
|
+
* children, popup.portal(h('div', { class: 'wf-panel' }, content)),
|
|
192
|
+
* ].filter(Boolean))
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
usePopup: (options: UsePopupOptions) => UsePopupHandle;
|
|
196
|
+
/** 当前设备是否支持 hover(matchMedia '(hover: hover)',mount 期一次判定) */
|
|
197
|
+
useHoverCapable: () => boolean;
|
|
198
|
+
/**
|
|
199
|
+
* 可视视口跟踪(visualViewport):键盘弹起/缩放时自动更新 + dirty。
|
|
200
|
+
* 无 visualViewport(桌面)降级 innerHeight。fixed 底部栏防键盘遮挡用。
|
|
201
|
+
*/
|
|
202
|
+
useVisualViewport: () => VisualViewportHandle;
|
|
203
|
+
/**
|
|
204
|
+
* 长按手势:pointerdown 按住 duration 触发,提前松开/位移取消,桌面右键兼容。
|
|
205
|
+
* 返回的 props spread 到目标元素。
|
|
206
|
+
*/
|
|
207
|
+
useLongPress: (options: UseLongPressOptions) => UseLongPressHandle;
|
|
100
208
|
/**
|
|
101
209
|
* 可见性观察(IntersectionObserver 封装):替代组件自建 scroll 监听。
|
|
102
210
|
* IO 在合成器线程评估,滚动/尺寸变化自动触发,无 scroll-linked 定位警告。
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 在 aiStream(传输解码)之上加一层「一段对话」的语义:
|
|
5
5
|
* 消息累积、工具调用内嵌、HITL 审批、错误恢复、stop/retry/clear。
|
|
6
6
|
*
|
|
7
|
-
* - 协议透明:消费 wf: 事件(
|
|
7
|
+
* - 协议透明:消费 wf: 事件(design/ai-contract.md),页面不需要知道事件名
|
|
8
8
|
* - 状态即 $:useChat 返回组件同一个响应式 Proxy,赋值自动渲染
|
|
9
9
|
* - 就地累积:token 经 state.messages[idx] 代理就地 append(O(1)/token,
|
|
10
10
|
* 不重建数组;配合 key 稳定引用 → VDOM 只 patch 文本节点)
|
|
@@ -43,5 +43,7 @@ export interface AiChatProps {
|
|
|
43
43
|
renderMessage?: (msg: UiMessage) => any;
|
|
44
44
|
/** 工具参数渲染(透传 ToolCallCard) */
|
|
45
45
|
renderToolArgs?: (args: Record<string, unknown>) => any;
|
|
46
|
+
/** 键盘弹起时输入区 fixed 抬升(全屏 chat 布局用;内联卡片默认 false——原生聚焦滚动已够) */
|
|
47
|
+
raiseOnKeyboard?: boolean;
|
|
46
48
|
}
|
|
47
49
|
export declare const AiChat: Component<AiChatProps>;
|
|
@@ -13,5 +13,5 @@ export interface ContextMenuProps {
|
|
|
13
13
|
'aria-label'?: string;
|
|
14
14
|
className?: string;
|
|
15
15
|
}
|
|
16
|
-
/** 右键菜单(对应 shadcn ContextMenu
|
|
16
|
+
/** 右键菜单(对应 shadcn ContextMenu):桌面右键 / 触屏长按 在光标处弹出,点外部/Escape 关闭,方向键导航 */
|
|
17
17
|
export declare const ContextMenu: Component<ContextMenuProps>;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* weifuwu/components — Dropdown
|
|
3
|
+
*
|
|
4
|
+
* usePopup 组合器:click 触发 + 受控 open + 外部点击/Escape(document 级,
|
|
5
|
+
* 弹层在 portal 中按 Escape 也能关)+ 定位/视口 clamp + portal。
|
|
3
6
|
*/
|
|
4
7
|
import type { Component } from '../../client/vnode.ts';
|
|
5
8
|
export interface DropdownItem {
|
|
@@ -13,7 +16,7 @@ export interface DropdownProps {
|
|
|
13
16
|
trigger: any;
|
|
14
17
|
items?: DropdownItem[];
|
|
15
18
|
open?: boolean;
|
|
16
|
-
/** 关闭回调(面板内 Escape
|
|
19
|
+
/** 关闭回调(面板内 Escape / 外部点击) */
|
|
17
20
|
onOpenChange?: (open: boolean) => void;
|
|
18
21
|
}
|
|
19
22
|
export declare const Dropdown: Component<DropdownProps>;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* weifuwu/components — HoverCard
|
|
3
|
+
*
|
|
4
|
+
* usePopup 组合器:hover 触发(触屏自动降级 tap)+ openDelay/closeDelay +
|
|
5
|
+
* 定位/视口 clamp + Escape + portal。对应 shadcn HoverCard。
|
|
6
|
+
*/
|
|
1
7
|
import type { Component } from '../../client/vnode.ts';
|
|
2
8
|
import type { Placement } from '../../client/popup.ts';
|
|
3
9
|
export type HoverCardPosition = Placement;
|
|
@@ -12,5 +18,5 @@ export interface HoverCardProps {
|
|
|
12
18
|
/** 移出关闭延迟(ms),默认 0 */
|
|
13
19
|
closeDelay?: number;
|
|
14
20
|
}
|
|
15
|
-
/**
|
|
21
|
+
/** 悬停富内容卡:hover 延迟显隐,支持任意 VNode 内容(移动端 tap 降级) */
|
|
16
22
|
export declare const HoverCard: Component<HoverCardProps>;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* weifuwu/components — Popover
|
|
3
|
+
*
|
|
4
|
+
* usePopup 组合器:click/hover 双触发(hover 触屏自动降级 tap)+ 受控 open +
|
|
5
|
+
* 外部点击(document 级,取代原 overlay)+ 定位/视口 clamp + Escape + portal。
|
|
3
6
|
*/
|
|
4
7
|
import type { Component } from '../../client/vnode.ts';
|
|
5
8
|
import type { Placement } from '../../client/popup.ts';
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* weifuwu/components — Tooltip
|
|
3
|
+
*
|
|
4
|
+
* usePopup 组合器:hover 触发(触屏自动降级 tap)+ 定位/视口 clamp + Escape + portal。
|
|
5
|
+
* 移动端友好由构造保证——tap 可显、44px 命中区走 base coarse 清单。
|
|
3
6
|
*/
|
|
4
7
|
import type { Component } from '../../client/vnode.ts';
|
|
5
8
|
import type { Placement } from '../../client/popup.ts';
|