weifuwu 0.95.0 → 0.95.2

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.
@@ -1,47 +1,47 @@
1
- var sa=Object.defineProperty;var Py=Object.getOwnPropertyDescriptor;var Ny=Object.getOwnPropertyNames;var My=Object.prototype.hasOwnProperty;var N=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var ie=(n,e)=>{for(var t in e)sa(n,t,{get:e[t],enumerable:!0})},$y=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ny(e))!My.call(n,s)&&s!==t&&sa(n,s,{get:()=>e[s],enumerable:!(r=Py(e,s))||r.enumerable});return n};var qy=n=>$y(sa({},"__esModule",{value:!0}),n);function hd(n){let e;try{e=new URL(n.url)}catch{return{ok:!1,reason:"invalid-url"}}let t=oa(e);try{decodeURI(e.pathname)}catch{return{ok:!1,reason:"malformed-encoding"}}for(let r of gd(e.pathname))try{decodeURIComponent(r)}catch{return{ok:!1,reason:"malformed-encoding"}}return{ok:!0,segments:gd(e.pathname),pathname:e.pathname,query:t}}function gd(n){return n.split("/").filter(Boolean)}function wd(n){return n?{...n.params}:{}}function oa(n){return Object.fromEntries(n.searchParams)}var ia=N(()=>{"use strict"});function yd(n){let e=async(t,r,s)=>{let i=await n.setup(r);return Object.assign(r,i),s(t,r)};return e.__meta={injects:n.injects,depends:n.depends??[]},e}var T,ze=N(()=>{"use strict";T=class extends Error{status;constructor(e,t){super(e),this.name="HttpError",this.status=t}}});import Dy from"node:http";import jy from"node:crypto";async function Wy(n,e){let t=e??aa;if(t>0&&parseInt(n.headers["content-length"]??"0",10)>t)throw new T("Request body too large",413);let r=[],s=0;for await(let i of n){if(s+=i.byteLength,t>0&&s>t)throw new T("Request body too large",413);r.push(i)}return Buffer.concat(r)}function Uy(n,e){let t=new URL(n.url??"/","http://localhost"),r=oa(t),s={};for(let[o,a]of Object.entries(n.headers))a!==void 0&&(s[o]=Array.isArray(a)?a.join(", "):a);return[new Request(t.href,{method:n.method?.toUpperCase()??"GET",headers:s,body:n.method!=="GET"&&n.method!=="HEAD"&&e.length>0?e:null}),r]}async function By(n,e,t){let r={};if(e.headers.forEach((s,i)=>{if(i.toLowerCase()==="set-cookie"){let o=r[i];r[i]=o?Array.isArray(o)?[...o,s]:[o,s]:s}else r[i]=s}),t?.traceId&&!r["x-trace-id"]&&(r["x-trace-id"]=t.traceId),n.writeHead(e.status,e.statusText,r),e.body){let s=e.body.getReader(),i=new Promise(a=>{n.once("close",()=>a("closed"))});n.on("error",()=>{});let o=()=>s.cancel(new Error("client disconnected")).catch(()=>{});try{for(;;){let a=await Promise.race([s.read().then(c=>({kind:"chunk",r:c})),i]);if(a==="closed"||n.destroyed){await o();return}let{done:l,value:u}=a.r;if(l)break;if(!n.write(u)){let c=new Promise(d=>n.once("drain",()=>d("drain")));if(await Promise.race([c,i])==="closed"){await o();return}}}n.end()}catch(a){n.destroyed||n.destroy(a instanceof Error?a:void 0)}finally{s.releaseLock()}return}n.end()}function bd(n,e){let t=n.handler(),r=e?.port??0,s=e?.hostname??"0.0.0.0",i=new Set;async function o(f,g){let w=f.headers["x-trace-id"]||f.headers.traceparent?.split("-")[1]||jy.randomUUID();try{let k=Number(f.headers["content-length"]??"0")>0||f.headers["transfer-encoding"]!==void 0?await Wy(f,e?.maxBodySize):Ly,[_,v]=Uy(f,k),S=await t(_,{params:{},query:v});await By(g,S,{traceId:w})}catch(y){let k=y instanceof Error?y:new Error(String(y));if(k instanceof T){g.writeHead(k.status,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:k.message}));return}let _=f.url??"/",v=f.method??"GET";console.error(`[serve] ${v} ${_}:`,k.stack||k.message),g.writeHead(500,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:"Internal Server Error"}))}}let a=Dy.createServer((f,g)=>{let y=o(f,g).then(()=>{},()=>{});i.add(y),y.then(()=>{i.delete(y)})});a.timeout=e?.timeout??12e4,a.keepAliveTimeout=e?.keepAliveTimeout??5e3,a.headersTimeout=e?.headersTimeout??6e3;let l=null;if(n.hasWsRoutes()){if(!e?.wsAdapter)throw new Error("serve(): \u8DEF\u7531\u6CE8\u518C\u4E86 WS \u7AEF\u70B9\u4F46\u672A\u63D0\u4F9B wsAdapter\u2014\u2014core \u4E0D\u542B ws \u5B9E\u73B0\uFF1B\u4ECE weifuwu \u5BFC\u5165 serve\uFF08\u81EA\u52A8\u6CE8\u5165\uFF09\uFF0C\u6216\u4F20 options.wsAdapter");l=e.wsAdapter(),a.on("upgrade",n.websocketHandler(l))}let u,c=new Promise(f=>{u=f}),d=null;if(e?.shutdown!==!1){let f=!1,g=async()=>{f||(f=!0,console.log("weifuwu shutting down..."),await h().catch(()=>{}),process.exit(0))};d=g,process.on("SIGTERM",g),process.on("SIGINT",g)}let p=0,m="";if(e?.signal){if(e.signal.aborted)return p=0,m="",a.close(),u(),{stop:()=>Promise.resolve(),close:()=>Promise.resolve(),ready:c,get port(){return 0},get hostname(){return s}};e.signal.addEventListener("abort",()=>{a.close()},{once:!0})}a.on("error",f=>{console.error("weifuwu server error:",f.message||f),a.close(),p=0,u()}),a.listen(r,s,()=>{let f=a.address();f&&typeof f!="string"&&(p=f.port,m=f.address),u(),console.log(`weifuwu listening on http://${m==="0.0.0.0"?"localhost":m||"localhost"}:${p}`)});async function h(f=2e3){if(d&&(process.off("SIGTERM",d),process.off("SIGINT",d),d=null),a.close(),a.closeIdleConnections(),i.size>0&&f>0&&await Promise.race([Promise.allSettled([...i]).then(()=>{}),new Promise(g=>setTimeout(g,f))]),l?.shutdown)try{await l.shutdown()}catch{}await n.close().catch(()=>{}),a.closeAllConnections()}return{close:h,stop:h,ready:c,get port(){return a.listening?p:0},get hostname(){return a.listening&&m||s}}}var aa,Ly,la=N(()=>{"use strict";ia();ze();aa=10*1024*1024,Ly=Buffer.alloc(0)});function Nt(n,e=Hy,t={}){let r=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),s=t.fin!==!1,i=t.mask===!0,o=r.length,a;if(o<126?(a=Buffer.allocUnsafe(2),a[1]=o):o<65536?(a=Buffer.allocUnsafe(4),a[1]=126,a.writeUInt16BE(o,2)):(a=Buffer.allocUnsafe(10),a[1]=127,a.writeUInt32BE(Math.floor(o/2**32),2),a.writeUInt32BE(o>>>0,6)),a[0]=(s?128:0)|n&15,!i)return Buffer.concat([a,r]);a[1]|=128;let l=Buffer.allocUnsafe(4);for(let c=0;c<4;c++)l[c]=Math.random()*256|0;let u=Buffer.allocUnsafe(o);for(let c=0;c<o;c++)u[c]=r[c]^l[c&3];return Buffer.concat([a,l,u])}function ua(n,e=100*1024*1024,t=!0){let r=[],s=0,i=(o,a)=>({frames:r,rest:n.slice(s),error:{code:o,reason:a}});for(;!(n.length-s<2);){let o=n[s],a=n[s+1],l=(o&128)!==0,u=o&112,c=o&15,d=(a&128)!==0,p=a&127;if(u!==0)return i(1002,"RSV must be 0");if(c>10||c>2&&c<8)return i(1002,`invalid opcode ${c}`);if(t&&!d)return i(1002,"client frame must be masked");if(c>=8){if(!l)return i(1002,"control frame must not be fragmented");if(p>125)return i(1002,"control frame payload > 125")}let m=2;if(p===126){if(n.length-s<4)break;if(p=n.readUInt16BE(s+2),p<126)return i(1002,"non-minimal length encoding");m=4}else if(p===127){if(n.length-s<10)break;let f=n.readUInt32BE(s+2),g=n.readUInt32BE(s+6);if(f&2147483648)return i(1002,"length high bit must be 0");let w=f*2**32+g;if(w<=65535)return i(1002,"non-minimal length encoding");p=w,m=10}if(p>e)return i(1009,`frame payload ${p} exceeds maxPayload ${e}`);let h=m+(d?4:0)+p;if(n.length-s<h)break;if(d){let f=n.slice(s+m,s+m+4),g=Buffer.allocUnsafe(p);for(let w=0;w<p;w++)g[w]=n[s+m+4+w]^f[w&3];r.push({fin:l,opcode:c,payload:g})}else r.push({fin:l,opcode:c,payload:Buffer.from(n.subarray(s+m,s+m+p))});s+=h}return{frames:r,rest:n.slice(s)}}var _e,Hy,ca=N(()=>{"use strict";_e={CONT:0,TEXT:1,BINARY:2,CLOSE:8,PING:9,PONG:10},Hy=Buffer.alloc(0)});function Fy(n){return n>=1e3&&n<=1003||n>=1007&&n<=1011||n>=3e3&&n<=4999}function da(n,e=""){if(n===void 0)return Xs;let t=Buffer.from(e,"utf8").subarray(0,123),r=Buffer.allocUnsafe(2+t.length);return r.writeUInt16BE(n,0),t.copy(r,2),r}var Xs,Hr,pa=N(()=>{"use strict";ca();Xs=Buffer.alloc(0);Hr=class{CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;readyState=1;socket;opts;listeners=new Map;buf=Xs;fragmentOpcode=null;fragments=[];fragmentBytes=0;textParts=[];textDecoder=null;closeSent=!1;closed=!1;closeTimer=null;closedEvent=!1;constructor(e,t={}){this.socket=e,this.opts={maxPayload:t.maxPayload??100*1024*1024,closeTimeoutMs:t.closeTimeoutMs??5e3},e.on("data",r=>this.feed(r)),e.on("end",()=>this.destroy()),e.on("close",()=>this.destroy()),e.on("error",r=>{this.emit("error",r),this.destroy()})}on(e,t){let r=this.listeners.get(e);return r||this.listeners.set(e,r=new Set),r.add(t),this}once(e,t){let r=(...s)=>{this.off(e,r),t(...s)};return this.on(e,r)}off(e,t){return this.listeners.get(e)?.delete(t),this}addEventListener(e,t){this.on(e,t)}removeEventListener(e,t){this.off(e,t)}emit(e,...t){let r=this.listeners.get(e);if(r)for(let s of[...r])try{s(...t)}catch(i){e!=="error"&&this.emit("error",i instanceof Error?i:new Error(String(i)))}}send(e){if(this.readyState!==this.OPEN)return;let t=typeof e=="string";this.write(Nt(t?_e.TEXT:_e.BINARY,e))}ping(e=Xs){if(this.readyState!==this.OPEN)return;let t=Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf8"):Buffer.from(String(e),"utf8");this.write(Nt(_e.PING,t))}close(e=1e3,t=""){this.closeSent||this.closed||(this.closeSent=!0,this.readyState=this.CLOSING,this.write(Nt(_e.CLOSE,da(e,t))),this.closeTimer=setTimeout(()=>this.destroy(),this.opts.closeTimeoutMs))}write(e){this.socket.destroyed||this.socket.write(e)}destroy(){this.closed||(this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer),this.socket.destroy(),this.emitClose(1006,""))}emitClose(e,t){this.closedEvent||(this.closedEvent=!0,this.emit("close",e,t))}feed(e){if(this.closed||this.readyState===this.CLOSED)return;this.buf=this.buf.length?Buffer.concat([this.buf,e]):e;let{frames:t,rest:r,error:s}=ua(this.buf,this.opts.maxPayload);if(this.buf=r,s){this.fail(s.code,s.reason);return}for(let i of t){if(this.closed||this.readyState===this.CLOSED)return;this.handleFrame(i)}}handleFrame(e){switch(e.opcode){case _e.TEXT:case _e.BINARY:return this.fragmentOpcode!==null?this.fail(1002,"expected continuation frame"):e.fin?this.deliver(e.opcode,[e.payload]):(this.fragmentOpcode=e.opcode,this.fragments=[e.payload],this.fragmentBytes=e.payload.length,this.textParts=[],this.textDecoder=e.opcode===_e.TEXT?new TextDecoder("utf-8",{fatal:!0}):null,e.opcode===_e.TEXT&&!this.feedText(e.payload,!1),void 0);case _e.CONT:{if(this.fragmentOpcode===null)return this.fail(1002,"unexpected continuation frame");if(this.fragmentBytes+=e.payload.length,this.fragmentBytes>this.opts.maxPayload)return this.fail(1009,"message exceeds maxPayload");if(this.fragmentOpcode===_e.TEXT&&!this.feedText(e.payload,e.fin))return;if(this.fragments.push(e.payload),e.fin){let t=this.fragmentOpcode;this.fragmentOpcode=null,this.deliver(t,this.fragments)}return}case _e.PING:this.write(Nt(_e.PONG,e.payload)),this.emit("ping",e.payload);return;case _e.PONG:this.emit("pong",e.payload);return;case _e.CLOSE:this.handleClose(e.payload);return}}feedText(e,t){let r=this.textDecoder;if(!r)return!0;try{return this.textParts.push(r.decode(e,{stream:!t})),!0}catch{return this.fail(1007,"invalid utf-8 in text message"),!1}}deliver(e,t){if(!this.closed)if(e===_e.TEXT){let r;if(this.textParts.length||this.textDecoder){try{r=this.textParts.join("")+(this.textDecoder?.decode()??"")}catch{return this.fail(1007,"invalid utf-8 in text message")}this.textParts=[],this.textDecoder=null}else try{r=new TextDecoder("utf-8",{fatal:!0}).decode(t[0]??Xs)}catch{return this.fail(1007,"invalid utf-8 in text message")}this.emit("message",r,!1)}else this.emit("message",t.length===1?t[0]:Buffer.concat(t),!0)}handleClose(e){let t=1005,r="";if(e.length===1)return this.fail(1002,"close payload length 1");if(e.length>=2){if(t=e.readUInt16BE(0),!Fy(t))return this.fail(1002,`invalid close code ${t}`);try{r=new TextDecoder("utf-8",{fatal:!0}).decode(e.subarray(2))}catch{return this.fail(1007,"invalid utf-8 in close reason")}}this.closeSent||(this.closeSent=!0,this.readyState=this.CLOSING,this.write(Nt(_e.CLOSE,da(t===1005?void 0:t,r)))),this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer),this.socket.writable&&this.socket.end(),this.emitClose(t,r)}fail(e,t){if(this.closed)return;this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer);let r=Nt(_e.CLOSE,da(e,t));this.socket.destroyed||this.socket.end(r),this.emitClose(e,t)}}});import{createHash as Vy}from"node:crypto";function ma(n={}){let e=new Set;return{handleUpgrade(t,r,s,i){let o=String(t.headers["sec-websocket-key"]??""),a=String(t.headers.upgrade??"").toLowerCase(),l=String(t.headers.connection??"").toLowerCase();if(String(t.headers["sec-websocket-version"]??"")!=="13"&&o){r.end(`HTTP/1.1 426 Upgrade Required\r
1
+ var aa=Object.defineProperty;var Iy=Object.getOwnPropertyDescriptor;var Py=Object.getOwnPropertyNames;var Ny=Object.prototype.hasOwnProperty;var I=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var ie=(n,e)=>{for(var t in e)aa(n,t,{get:e[t],enumerable:!0})},My=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Py(e))!Ny.call(n,s)&&s!==t&&aa(n,s,{get:()=>e[s],enumerable:!(r=Iy(e,s))||r.enumerable});return n};var $y=n=>My(aa({},"__esModule",{value:!0}),n);function yd(n){let e;try{e=new URL(n.url)}catch{return{ok:!1,reason:"invalid-url"}}let t=la(e);try{decodeURI(e.pathname)}catch{return{ok:!1,reason:"malformed-encoding"}}for(let r of wd(e.pathname))try{decodeURIComponent(r)}catch{return{ok:!1,reason:"malformed-encoding"}}return{ok:!0,segments:wd(e.pathname),pathname:e.pathname,query:t}}function wd(n){return n.split("/").filter(Boolean)}function bd(n){return n?{...n.params}:{}}function la(n){return Object.fromEntries(n.searchParams)}var ua=I(()=>{"use strict"});function _d(n){let e=async(t,r,s)=>{let o=await n.setup(r);return Object.assign(r,o),s(t,r)};return e.__meta={injects:n.injects,depends:n.depends??[]},e}var T,Ke=I(()=>{"use strict";T=class extends Error{status;constructor(e,t){super(e),this.name="HttpError",this.status=t}}});import qy from"node:http";import Dy from"node:crypto";async function Ly(n,e){let t=e??ca;if(t>0&&parseInt(n.headers["content-length"]??"0",10)>t)throw new T("Request body too large",413);let r=[],s=0;for await(let o of n){if(s+=o.byteLength,t>0&&s>t)throw new T("Request body too large",413);r.push(o)}return Buffer.concat(r)}function Wy(n,e){let t=new URL(n.url??"/","http://localhost"),r=la(t),s={};for(let[i,a]of Object.entries(n.headers))a!==void 0&&(s[i]=Array.isArray(a)?a.join(", "):a);return[new Request(t.href,{method:n.method?.toUpperCase()??"GET",headers:s,body:n.method!=="GET"&&n.method!=="HEAD"&&e.length>0?e:null}),r]}async function Uy(n,e,t){let r={};if(e.headers.forEach((s,o)=>{if(o.toLowerCase()==="set-cookie"){let i=r[o];r[o]=i?Array.isArray(i)?[...i,s]:[i,s]:s}else r[o]=s}),t?.traceId&&!r["x-trace-id"]&&(r["x-trace-id"]=t.traceId),n.writeHead(e.status,e.statusText,r),e.body){let s=e.body.getReader(),o=new Promise(a=>{n.once("close",()=>a("closed"))});n.on("error",()=>{});let i=()=>s.cancel(new Error("client disconnected")).catch(()=>{});try{for(;;){let a=await Promise.race([s.read().then(c=>({kind:"chunk",r:c})),o]);if(a==="closed"||n.destroyed){await i();return}let{done:l,value:u}=a.r;if(l)break;if(!n.write(u)){let c=new Promise(d=>n.once("drain",()=>d("drain")));if(await Promise.race([c,o])==="closed"){await i();return}}}n.end()}catch(a){n.destroyed||n.destroy(a instanceof Error?a:void 0)}finally{s.releaseLock()}return}n.end()}function vd(n,e){let t=n.handler(),r=e?.port??0,s=e?.hostname??"0.0.0.0",o=new Set;async function i(m,g){let h=m.headers["x-trace-id"]||m.headers.traceparent?.split("-")[1]||Dy.randomUUID();try{let k=Number(m.headers["content-length"]??"0")>0||m.headers["transfer-encoding"]!==void 0?await Ly(m,e?.maxBodySize):jy,[_,v]=Wy(m,k),S=await t(_,{params:{},query:v});await Uy(g,S,{traceId:h})}catch(b){let k=b instanceof Error?b:new Error(String(b));if(k instanceof T){g.writeHead(k.status,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:k.message}));return}let _=m.url??"/",v=m.method??"GET";console.error(`[serve] ${v} ${_}:`,k.stack||k.message),g.writeHead(500,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:"Internal Server Error"}))}}let a=qy.createServer((m,g)=>{let b=i(m,g).then(()=>{},()=>{});o.add(b),b.then(()=>{o.delete(b)})});a.timeout=e?.timeout??12e4,a.keepAliveTimeout=e?.keepAliveTimeout??5e3,a.headersTimeout=e?.headersTimeout??6e3;let l=null;if(n.hasWsRoutes()){if(!e?.wsAdapter)throw new Error("serve(): \u8DEF\u7531\u6CE8\u518C\u4E86 WS \u7AEF\u70B9\u4F46\u672A\u63D0\u4F9B wsAdapter\u2014\u2014core \u4E0D\u542B ws \u5B9E\u73B0\uFF1B\u4ECE weifuwu \u5BFC\u5165 serve\uFF08\u81EA\u52A8\u6CE8\u5165\uFF09\uFF0C\u6216\u4F20 options.wsAdapter");l=e.wsAdapter(),a.on("upgrade",n.websocketHandler(l))}let u,c=new Promise(m=>{u=m}),d=null;if(e?.shutdown!==!1){let m=!1,g=async()=>{m||(m=!0,console.log("weifuwu shutting down..."),await w().catch(()=>{}),process.exit(0))};d=g,process.on("SIGTERM",g),process.on("SIGINT",g)}let p=0,f="";if(e?.signal){if(e.signal.aborted)return p=0,f="",a.close(),u(),{stop:()=>Promise.resolve(),close:()=>Promise.resolve(),ready:c,get port(){return 0},get hostname(){return s}};e.signal.addEventListener("abort",()=>{a.close()},{once:!0})}a.on("error",m=>{console.error("weifuwu server error:",m.message||m),a.close(),p=0,u()}),a.listen(r,s,()=>{let m=a.address();m&&typeof m!="string"&&(p=m.port,f=m.address),u(),console.log(`weifuwu listening on http://${f==="0.0.0.0"?"localhost":f||"localhost"}:${p}`)});async function w(m=2e3){if(d&&(process.off("SIGTERM",d),process.off("SIGINT",d),d=null),a.close(),a.closeIdleConnections(),o.size>0&&m>0&&await Promise.race([Promise.allSettled([...o]).then(()=>{}),new Promise(g=>setTimeout(g,m))]),l?.shutdown)try{await l.shutdown()}catch{}await n.close().catch(()=>{}),a.closeAllConnections()}return{close:w,stop:w,ready:c,get port(){return a.listening?p:0},get hostname(){return a.listening&&f||s}}}var ca,jy,da=I(()=>{"use strict";ua();Ke();ca=10*1024*1024,jy=Buffer.alloc(0)});function Nt(n,e=By,t={}){let r=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),s=t.fin!==!1,o=t.mask===!0,i=r.length,a;if(i<126?(a=Buffer.allocUnsafe(2),a[1]=i):i<65536?(a=Buffer.allocUnsafe(4),a[1]=126,a.writeUInt16BE(i,2)):(a=Buffer.allocUnsafe(10),a[1]=127,a.writeUInt32BE(Math.floor(i/2**32),2),a.writeUInt32BE(i>>>0,6)),a[0]=(s?128:0)|n&15,!o)return Buffer.concat([a,r]);a[1]|=128;let l=Buffer.allocUnsafe(4);for(let c=0;c<4;c++)l[c]=Math.random()*256|0;let u=Buffer.allocUnsafe(i);for(let c=0;c<i;c++)u[c]=r[c]^l[c&3];return Buffer.concat([a,l,u])}function pa(n,e=100*1024*1024,t=!0){let r=[],s=0,o=(i,a)=>({frames:r,rest:n.slice(s),error:{code:i,reason:a}});for(;!(n.length-s<2);){let i=n[s],a=n[s+1],l=(i&128)!==0,u=i&112,c=i&15,d=(a&128)!==0,p=a&127;if(u!==0)return o(1002,"RSV must be 0");if(c>10||c>2&&c<8)return o(1002,`invalid opcode ${c}`);if(t&&!d)return o(1002,"client frame must be masked");if(c>=8){if(!l)return o(1002,"control frame must not be fragmented");if(p>125)return o(1002,"control frame payload > 125")}let f=2;if(p===126){if(n.length-s<4)break;if(p=n.readUInt16BE(s+2),p<126)return o(1002,"non-minimal length encoding");f=4}else if(p===127){if(n.length-s<10)break;let m=n.readUInt32BE(s+2),g=n.readUInt32BE(s+6);if(m&2147483648)return o(1002,"length high bit must be 0");let h=m*2**32+g;if(h<=65535)return o(1002,"non-minimal length encoding");p=h,f=10}if(p>e)return o(1009,`frame payload ${p} exceeds maxPayload ${e}`);let w=f+(d?4:0)+p;if(n.length-s<w)break;if(d){let m=n.slice(s+f,s+f+4),g=Buffer.allocUnsafe(p);for(let h=0;h<p;h++)g[h]=n[s+f+4+h]^m[h&3];r.push({fin:l,opcode:c,payload:g})}else r.push({fin:l,opcode:c,payload:Buffer.from(n.subarray(s+f,s+f+p))});s+=w}return{frames:r,rest:n.slice(s)}}var _e,By,ma=I(()=>{"use strict";_e={CONT:0,TEXT:1,BINARY:2,CLOSE:8,PING:9,PONG:10},By=Buffer.alloc(0)});function Hy(n){return n>=1e3&&n<=1003||n>=1007&&n<=1011||n>=3e3&&n<=4999}function fa(n,e=""){if(n===void 0)return eo;let t=Buffer.from(e,"utf8").subarray(0,123),r=Buffer.allocUnsafe(2+t.length);return r.writeUInt16BE(n,0),t.copy(r,2),r}var eo,zr,ga=I(()=>{"use strict";ma();eo=Buffer.alloc(0);zr=class{CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;readyState=1;socket;opts;listeners=new Map;buf=eo;fragmentOpcode=null;fragments=[];fragmentBytes=0;textParts=[];textDecoder=null;closeSent=!1;closed=!1;closeTimer=null;closedEvent=!1;constructor(e,t={}){this.socket=e,this.opts={maxPayload:t.maxPayload??100*1024*1024,closeTimeoutMs:t.closeTimeoutMs??5e3},e.on("data",r=>this.feed(r)),e.on("end",()=>this.destroy()),e.on("close",()=>this.destroy()),e.on("error",r=>{this.emit("error",r),this.destroy()})}on(e,t){let r=this.listeners.get(e);return r||this.listeners.set(e,r=new Set),r.add(t),this}once(e,t){let r=(...s)=>{this.off(e,r),t(...s)};return this.on(e,r)}off(e,t){return this.listeners.get(e)?.delete(t),this}addEventListener(e,t){this.on(e,t)}removeEventListener(e,t){this.off(e,t)}emit(e,...t){let r=this.listeners.get(e);if(r)for(let s of[...r])try{s(...t)}catch(o){e!=="error"&&this.emit("error",o instanceof Error?o:new Error(String(o)))}}send(e){if(this.readyState!==this.OPEN)return;let t=typeof e=="string";this.write(Nt(t?_e.TEXT:_e.BINARY,e))}ping(e=eo){if(this.readyState!==this.OPEN)return;let t=Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf8"):Buffer.from(String(e),"utf8");this.write(Nt(_e.PING,t))}close(e=1e3,t=""){this.closeSent||this.closed||(this.closeSent=!0,this.readyState=this.CLOSING,this.write(Nt(_e.CLOSE,fa(e,t))),this.closeTimer=setTimeout(()=>this.destroy(),this.opts.closeTimeoutMs))}write(e){this.socket.destroyed||this.socket.write(e)}destroy(){this.closed||(this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer),this.socket.destroy(),this.emitClose(1006,""))}emitClose(e,t){this.closedEvent||(this.closedEvent=!0,this.emit("close",e,t))}feed(e){if(this.closed||this.readyState===this.CLOSED)return;this.buf=this.buf.length?Buffer.concat([this.buf,e]):e;let{frames:t,rest:r,error:s}=pa(this.buf,this.opts.maxPayload);if(this.buf=r,s){this.fail(s.code,s.reason);return}for(let o of t){if(this.closed||this.readyState===this.CLOSED)return;this.handleFrame(o)}}handleFrame(e){switch(e.opcode){case _e.TEXT:case _e.BINARY:return this.fragmentOpcode!==null?this.fail(1002,"expected continuation frame"):e.fin?this.deliver(e.opcode,[e.payload]):(this.fragmentOpcode=e.opcode,this.fragments=[e.payload],this.fragmentBytes=e.payload.length,this.textParts=[],this.textDecoder=e.opcode===_e.TEXT?new TextDecoder("utf-8",{fatal:!0}):null,e.opcode===_e.TEXT&&!this.feedText(e.payload,!1),void 0);case _e.CONT:{if(this.fragmentOpcode===null)return this.fail(1002,"unexpected continuation frame");if(this.fragmentBytes+=e.payload.length,this.fragmentBytes>this.opts.maxPayload)return this.fail(1009,"message exceeds maxPayload");if(this.fragmentOpcode===_e.TEXT&&!this.feedText(e.payload,e.fin))return;if(this.fragments.push(e.payload),e.fin){let t=this.fragmentOpcode;this.fragmentOpcode=null,this.deliver(t,this.fragments)}return}case _e.PING:this.write(Nt(_e.PONG,e.payload)),this.emit("ping",e.payload);return;case _e.PONG:this.emit("pong",e.payload);return;case _e.CLOSE:this.handleClose(e.payload);return}}feedText(e,t){let r=this.textDecoder;if(!r)return!0;try{return this.textParts.push(r.decode(e,{stream:!t})),!0}catch{return this.fail(1007,"invalid utf-8 in text message"),!1}}deliver(e,t){if(!this.closed)if(e===_e.TEXT){let r;if(this.textParts.length||this.textDecoder){try{r=this.textParts.join("")+(this.textDecoder?.decode()??"")}catch{return this.fail(1007,"invalid utf-8 in text message")}this.textParts=[],this.textDecoder=null}else try{r=new TextDecoder("utf-8",{fatal:!0}).decode(t[0]??eo)}catch{return this.fail(1007,"invalid utf-8 in text message")}this.emit("message",r,!1)}else this.emit("message",t.length===1?t[0]:Buffer.concat(t),!0)}handleClose(e){let t=1005,r="";if(e.length===1)return this.fail(1002,"close payload length 1");if(e.length>=2){if(t=e.readUInt16BE(0),!Hy(t))return this.fail(1002,`invalid close code ${t}`);try{r=new TextDecoder("utf-8",{fatal:!0}).decode(e.subarray(2))}catch{return this.fail(1007,"invalid utf-8 in close reason")}}this.closeSent||(this.closeSent=!0,this.readyState=this.CLOSING,this.write(Nt(_e.CLOSE,fa(t===1005?void 0:t,r)))),this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer),this.socket.writable&&this.socket.end(),this.emitClose(t,r)}fail(e,t){if(this.closed)return;this.closed=!0,this.readyState=this.CLOSED,this.closeTimer&&clearTimeout(this.closeTimer);let r=Nt(_e.CLOSE,fa(e,t));this.socket.destroyed||this.socket.end(r),this.emitClose(e,t)}}});import{createHash as Fy}from"node:crypto";function ha(n={}){let e=new Set;return{handleUpgrade(t,r,s,o){let i=String(t.headers["sec-websocket-key"]??""),a=String(t.headers.upgrade??"").toLowerCase(),l=String(t.headers.connection??"").toLowerCase();if(String(t.headers["sec-websocket-version"]??"")!=="13"&&i){r.end(`HTTP/1.1 426 Upgrade Required\r
2
2
  Sec-WebSocket-Version: 13\r
3
3
  Connection: close\r
4
4
  Content-Length: 0\r
5
5
  \r
6
- `);return}if(t.method!=="GET"||a!=="websocket"||!l.split(/\s*,\s*/).includes("upgrade")||!o||!Ky.test(o)){r.end(`HTTP/1.1 400 Bad Request\r
6
+ `);return}if(t.method!=="GET"||a!=="websocket"||!l.split(/\s*,\s*/).includes("upgrade")||!i||!zy.test(i)){r.end(`HTTP/1.1 400 Bad Request\r
7
7
  Connection: close\r
8
8
  Content-Length: 0\r
9
9
  \r
10
- `);return}let c=Vy("sha1").update(o+zy).digest("base64");r.write(`HTTP/1.1 101 Switching Protocols\r
10
+ `);return}let c=Fy("sha1").update(i+Vy).digest("base64");r.write(`HTTP/1.1 101 Switching Protocols\r
11
11
  Upgrade: websocket\r
12
12
  Connection: Upgrade\r
13
13
  Sec-WebSocket-Accept: ${c}\r
14
14
  \r
15
- `);let d=new Hr(r,n);e.add(d),d.on("close",()=>e.delete(d)),i(d),s?.length&&d.feed(s)},async shutdown(){if(e.size===0)return;let t=[...e],r=new Promise(s=>{let i=t.length,o=setTimeout(s,500);for(let a of t)a.once("close",()=>{--i===0&&(clearTimeout(o),s())})});for(let s of t)try{s.close(1001,"server shutting down")}catch{}await r}}}var zy,Ky,_d=N(()=>{"use strict";pa();zy="258EAFA5-E914-47DA-95CA-C5AB0DC85B11",Ky=/^[+/0-9A-Za-z]{22}==$/});var vd=N(()=>{"use strict";_d();pa();ca()});var Le,ue,ce,mn,se,fn,ye=N(()=>{"use strict";Le=class extends Error{kind;code;cause;constructor(e,t,r){super(t),this.name="DbError",this.kind=e,this.code=r?.code,this.cause=r?.cause}},ue=class extends Le{constructor(e,t){super("protocol",t??`${e} is not supported by weifuwu/db`,{code:"UNSUPPORTED"}),this.name="ProtocolError"}},ce=class extends Le{attempts;constructor(e,t=1,r){super("connection",e,{cause:r}),this.name="ConnectionError",this.attempts=t}},mn=class extends Le{operation;ms;constructor(e,t){super("timeout",`${e} timed out after ${t}ms`),this.name="TimeoutError",this.operation=e,this.ms=t}},se=class extends Le{constructor(e){super("validation",e),this.name="ValidationError"}},fn=class extends Le{constructor(e){super("protocol",e,{code:"RESP"}),this.name="RespError"}}});function Ne(n,e){return Response.json(n,{status:200,...e})}function et(n,e){return Response.json(n,{status:201,...e})}function gn(n){return new Response(null,{status:204,...n})}function We(n){return Response.json({error:n??"Bad Request"},{status:400})}function kd(n){return Response.json({error:n??"Unauthorized"},{status:401})}function Sd(n){return Response.json({error:n??"Forbidden"},{status:403})}function xd(n){return Response.json({error:n??"Not Found"},{status:404})}function Rd(n){return Response.json({error:n??"Conflict"},{status:409})}function Ed(n){return Response.json({error:n??"Unprocessable Entity"},{status:422})}function Td(n){return Response.json({error:n??"Too Many Requests"},{status:429})}function Cd(n){return Response.json({error:n??"Internal Server Error"},{status:500})}function Ad(n,e=302){return new Response(null,{status:e,headers:{Location:n}})}function Te(n,e){let t=n instanceof Error?n.message:String(n),r;if(n instanceof T)return Response.json({error:t},{status:e??n.status});if(n instanceof Le){let s=e??(n.code==="23505"?409:400);return r=n.code==="23505"?"conflict":n.kind,Response.json({error:t,code:r},{status:s})}return Response.json({error:t},{status:e??400})}var Hn=N(()=>{"use strict";ze();ye()});function fa(n,e,t){if(!e)return()=>{};let r=s=>{let i=s instanceof Error?s:new Error(String(s));t?t(i):console.error(`[ws] ${n} handler error:`,i.stack||i.message)};return(...s)=>{try{let i=e(...s);i&&typeof i.catch=="function"&&i.catch(r)}catch(i){r(i)}}}function Od(n,e,t){return(r,s,i)=>{let o=r.url?.split("/").filter(Boolean)??[],a=e(o);if(!a){s.destroy();return}n.handleUpgrade(r,s,i,l=>{let u=new URL(r.url??"/","http://localhost"),c={params:a.params,query:Object.fromEntries(u.searchParams),hub:t},d=a.handler,p=d.error?g=>{try{let w=d.error(l,c,g);w&&typeof w.catch=="function"&&w.catch(y=>console.error("[ws] error handler failed:",y))}catch(w){console.error("[ws] error handler failed:",w)}}:null,m=fa("open",d.open,p),h=fa("message",d.message,p),f=fa("close",d.close,p);m(l,c),l.on("message",(g,w)=>{let y=w===!1&&typeof g!="string"?String(g):g;h(l,c,y)}),l.on("close",()=>f(l,c)),l.on("error",g=>{let w=g;p?p(w):console.error("[ws] connection error:",w.message)})})}}var Id=N(()=>{"use strict"});function Fr(){return{children:new Map}}function ga(n){return n.split("/").filter(Boolean)}function Gy(n,e,t){let r=e.slice(1);if(!n.children.has(":")){let i=t();i.param=r,n.children.set(":",i)}let s=n.children.get(":");if(s.param!==r)throw new Error(`[router] param conflict: ":${s.param}" already registered, cannot register ":${r}"`);return s}function Qy(n,e,t){return e==="*"?(n.wildcard=!0,n):e.startsWith(":")?Gy(n,e,t):(n.children.has(e)||n.children.set(e,t()),n.children.get(e))}function Pd(n,e){let t=ga(e),r=n;for(let s of t){if(!r)return null;if(s==="*")return r;r=s.startsWith(":")?r.children.get(":")??null:r.children.get(s)??null}return r}function eo(n,e,t){let r=ga(e),s=n;for(let i of r){if(i==="*")return s.wildcard=!0,s.wildcardValue=t,s;s=Qy(s,i,()=>Fr())}return s.value=t,s}function Ys(n,e,t,r,s="value"){if(t===e.length){let l=s==="value"?n.value:n.wildcardValue;return l!==void 0?{value:l,params:{...r},node:n}:null}let i=e[t],o=n.children.get(i);if(o){let l=Ys(o,e,t+1,r,s);if(l)return l}let a=n.children.get(":");if(a?.param){let l={...r,[a.param]:decodeURIComponent(i)},u=Ys(a,e,t+1,l,s);if(u)return u}return null}function Vr(n,e){let t=Ys(n,e,0,{});if(t){let r=t.node.wildcardValue!==void 0;return{value:t.value,params:r?{...t.params,"*":""}:t.params,wildcard:!1}}return Jy(n,e,e.length)}function Jy(n,e,t){for(let r=0;r<=t;r++){let s=Ys(n,e.slice(0,r),0,{},"wildcard");if(s)return{value:s.value,params:{...s.params,"*":e.slice(r).join("/")},wildcard:!0}}return null}var to=N(()=>{"use strict"});function ha(n,e=""){let t=[];for(let[s,i]of n.value?.handlers??[]){let o=n.value?.middlewares.get(s)||[];t.push({method:s,path:e||"/",handler:i,middlewares:[...o]})}let r=n.wildcardValue;if(r)for(let[s,i]of r.handlers){let o=r.middlewares.get(s)||[];t.push({method:s,path:(e||"/")+"/*",handler:i,middlewares:[...o]})}for(let[s,i]of n.children)t.push(...ha(i,e+"/"+(s===":"?`:${i.param}`:s)));return t}function wa(n,e=""){let t=[];n.value?.handler&&t.push({path:e||"/",handler:n.value.handler,middlewares:[...n.value.middlewares]}),n.wildcardValue?.handler&&t.push({path:(e||"/")+"/*",handler:n.wildcardValue.handler,middlewares:[...n.wildcardValue.middlewares]});for(let[r,s]of n.children)t.push(...wa(s,e+"/"+(r===":"?`:${s.param}`:r)));return t}function ya(n,e,t){for(let[r]of n.value?.handlers??[]){let s=r==="*"?"ANY":r,i=(e||"/")+(n.wildcard?"/*":""),o=n.value?.middlewares.get(r),a=o?` (+${o.length} mw)`:"";t.push(`${s.padEnd(7)} ${i}${a}`)}for(let[r,s]of n.children){let i=r===":"?`:${s.param}`:r;ya(s,e+"/"+i,t)}}function ba(n,e,t){if(n.value?.handler){let r=e||"/",s=n.value.middlewares.length?` (+${n.value.middlewares.length} mw)`:"";t.push(`WS ${r}${s}`)}for(let[r,s]of n.children){let i=r===":"?`:${s.param}`:r;ba(s,e+"/"+i,t)}}var Nd=N(()=>{"use strict"});async function no(n,e,t,r){if(n.length===0)return e(t,r);let s=0,i=(o,a)=>{if(s>=n.length)return Promise.resolve(e(o,a));let l=n[s++],u=!1,c=(d,p)=>{if(u)throw new Error("[router] next() called more than once in middleware");return u=!0,i(d,p)};return Promise.resolve(l(o,a,c))};return i(t,r)}var Md=N(()=>{"use strict"});function Zy(n){return Response.json({error:"Bad Request",reason:n},{status:400})}async function _a(n,e,t,r){let s=hd(t);if(!s.ok)return Zy(s.reason);let i=Vr(n,s.segments),o=i?{value:i.value,params:wd(i),wildcard:i.wildcard}:null;e.enrichCtx?.(r,o,s.pathname,s.query);try{if(!o)return await e.onNotFound(t,r,s.pathname);let a=e.resolveHandler(o,t,r);if(a.kind==="not-found")return await e.onNotFound(t,r,s.pathname);if(a.kind==="not-allowed")return e.onMethodNotAllowed?await e.onMethodNotAllowed(a.methods,t,r,s.pathname):new Response("Method Not Allowed",{status:405,headers:{Allow:a.methods.join(", ")}});let l=await a.run();return e.onRouteSuccess?.(t,r,s.pathname),l}catch(a){if(e.onError)return e.onError(a,t,r,s.pathname);throw a}}var va=N(()=>{"use strict";to();ia()});function $d(){let n=new Set;return{register(e){for(let t of e)n.add(t)},check(e,t){for(let r of e)if(!n.has(r))throw new Error(`[weifuwu] Middleware at "${t}" depends on ctx.${r} but it hasn't been registered.
16
- Register the provider before this middleware: app.use(${r}())`)},has(e){return n.has(e)}}}var qd=N(()=>{"use strict"});function Dd(){let n=new Map,e=new Map;return{join(t,r){let s=n.get(t);s||(s=new Set,n.set(t,s)),s.add(r);let i=e.get(r);i||(i=new Set,e.set(r,i)),i.add(t)},leave(t){let r=e.get(t);if(r){for(let s of r){let i=n.get(s);i&&(i.delete(t),i.size===0&&n.delete(s))}e.delete(t)}},send(t,r){let s=n.get(t);if(s)for(let i of s)try{i.send(r)}catch{}},async close(){n.clear(),e.clear()}}}var jd=N(()=>{"use strict"});function Ld(n,e){zr.totalErrors++;let t=zr.errState.get(n);if(t){t.count++;return}zr.errState.set(n,{shown:!0,count:1}),console.error(`[router] ${n}\uFF08\u91CD\u590D\u9519\u8BEF\u5DF2\u53BB\u91CD\u2014\u2014\u7D2F\u8BA1 ${zr.totalErrors}\uFF09:`,e instanceof Error?e.stack||e.message:e)}function Wd(n){zr.errState.delete(n)}var ka,zr,Ud=N(()=>{"use strict";ka=globalThis;ka.__wfRouterErrState||(ka.__wfRouterErrState={errState:new Map,totalErrors:0});zr=ka.__wfRouterErrState});var Xy,lt,Sa=N(()=>{"use strict";ze();Hn();ye();Id();to();Nd();Md();va();qd();jd();Ud();Xy=()=>({handlers:new Map,middlewares:new Map}),lt=class n{root=Fr();wsRoot=Fr();globalMws=[];errorHandler;_hasWildcard=!1;_hub;_wsCount=0;_ctxRegistry=$d();_closeables=[];_pipeline;get pipeline(){return this._pipeline??=this.buildPipeline()}buildPipeline(){return{resolveHandler:(e,t,r)=>{let s=e.value,i=t.method;if(e.wildcard){let a=s.handlers.get(i)||s.handlers.get("*");if(!a)return{kind:"not-found"};let l=s.middlewares.get(i)||s.middlewares.get("*")||[];return{kind:"route",run:()=>this.runWithChain(l,a,t,r)}}let o=s.handlers.get(i)||s.handlers.get("*");if(!o&&i==="HEAD"&&(o=s.handlers.get("GET")),o){let a=s.middlewares.get(i)||s.middlewares.get("*")||(i==="HEAD"?s.middlewares.get("GET"):void 0)||[];return{kind:"route",run:()=>this.runWithChain(a,o,t,r)}}return s.handlers.size>0?{kind:"not-allowed",methods:[...s.handlers.keys()].filter(a=>a!=="*")}:{kind:"not-found"}},onNotFound:(e,t,r)=>{let s=()=>Response.json({error:"Not Found",path:r,method:e.method},{status:404});return this.globalMws.length>0?no(this.globalMws,s,e,t):s()},onMethodNotAllowed:(e,t,r)=>{let s=()=>new Response("Method Not Allowed",{status:405,headers:{Allow:e.join(", ")}});return this.globalMws.length>0?no(this.globalMws,s,t,r):s()},onError:(e,t,r,s)=>this.handleError(e,t,r,s),onRouteSuccess:(e,t,r)=>Wd(`${e.method} ${r}`),enrichCtx:(e,t)=>{t&&Object.assign(e.params,t.params)}}}runWithChain(e,t,r,s){let i=e.length===0?this.globalMws:[...this.globalMws,...e];return no(i,t,r,s)}get hub(){return this._hub||(this._hub=Dd()),this._hub}wsHub(e){return this._hub=e,this}use(e){return this.globalMws.push(e),this._checkMiddlewareMeta(e,"global"),typeof e.close=="function"&&this._closeables.push(e),this}plugin(e){return e(this),this}mount(e,t){return this._mountRouter(e,t),this}onError(e){return this.errorHandler=e,this}get(e,...t){return this._route("GET",e,...t)}post(e,...t){return this._route("POST",e,...t)}put(e,...t){return this._route("PUT",e,...t)}delete(e,...t){return this._route("DELETE",e,...t)}patch(e,...t){return this._route("PATCH",e,...t)}head(e,...t){return this._route("HEAD",e,...t)}options(e,...t){return this._route("OPTIONS",e,...t)}all(e,...t){return this._route("*",e,...t)}ws(e,...t){let r=t.pop(),s=t;return eo(this.wsRoot,e,{handler:r,middlewares:s}),this._wsCount++,this}hasWsRoutes(){return this._wsCount>0}handler(){return(e,t)=>_a(this.root,this.pipeline,e,t)}websocketHandler(e){return Od(e,t=>this.matchWsTrie(this.wsRoot,t),this.hub)}routes(){let e=[];return this.globalMws.length>0&&e.push(`MIDDLEWARE [${this.globalMws.length} global]`),ya(this.root,"",e),ba(this.wsRoot,"",e),e}_route(e,t,...r){return this._routeImpl(e,t,r)}_routeImpl(e,t,r){let s=r[r.length-1];if(s instanceof n)return this._mountRouter(t,s,r.slice(0,-1)),this;let i=r.pop(),o=r;for(let p of o)this._checkMiddlewareMeta(p,`${e} ${t}`);let a=Pd(this.root,t),l=t.includes("*"),u=l?a?.wildcardValue:a?.value;if(!l&&u?.handlers.has(e))throw new Error(`[router] route conflict: ${e} ${t} already registered`);let c=u??Xy();c.handlers.set(e,i),o.length>0&&c.middlewares.set(e,o);let d=eo(this.root,t,c);return l&&(this._hasWildcard=!0),this}_mountRouter(e,t,r=[]){let s=e==="/"?"":e.replace(/\/$/,""),i=(u,c,d)=>(c.mountPath=(c.mountPath||"")+s,d(u,c)),o=r.length===0&&t.globalMws.length===0?[i]:[i,...r,...t.globalMws];for(let u of o)this._checkMiddlewareMeta(u,`mount:${e}`);let a=ha(t.root);for(let{method:u,path:c,handler:d,middlewares:p}of a)this._routeImpl(u,s+c,[...o,...p,d]);let l=wa(t.wsRoot);for(let{path:u,handler:c,middlewares:d}of l)this.ws(s+u,...o,...d,c)}matchWsTrie(e,t){let r=Vr(e,t);return r?{handler:r.value.handler,middlewares:r.value.middlewares,params:r.params}:null}async handleError(e,t,r,s){let i=e instanceof Error?e:new Error(String(e));return this.errorHandler?this.errorHandler(i,t,r):i instanceof T||i instanceof Le||i instanceof se?Te(i):(Ld(`${t.method} ${s??new URL(t.url).pathname}`,e),Response.json({error:"Internal Server Error"},{status:500}))}onClose(e){return this._closeables.push(e),this}_closed=!1;async close(){if(!this._closed){this._closed=!0;for(let e of this._closeables)try{await e.close()}catch{}}}_checkMiddlewareMeta(e,t){let r=e.__meta??(typeof e=="object"&&e&&"middleware"in e?e.middleware().__meta:void 0);r&&(this._ctxRegistry.check(r.depends,t),this._ctxRegistry.register(r.injects))}}});function ro(n){let e={origin:"*",methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],allowedHeaders:["Content-Type","Authorization"],...n};function t(s){if(typeof e.origin=="string")return e.origin==="*"?e.credentials?s:"*":e.origin;if(Array.isArray(e.origin))return e.origin.includes(s)?s:"";let i=e.origin(s);return typeof i=="boolean"?i?s:"":typeof i=="string"?i:""}function r(s,i){if(!i)return s;let o=new Headers(s.headers);return o.set("Access-Control-Allow-Origin",i),e.credentials&&o.set("Access-Control-Allow-Credentials","true"),e.exposedHeaders?.length&&o.set("Access-Control-Expose-Headers",e.exposedHeaders.join(", ")),i!=="*"&&o.set("Vary","Origin"),new Response(s.body,{status:s.status,statusText:s.statusText,headers:o})}return(s,i,o)=>{let a=s.headers.get("origin")??"",l=t(a);if(s.method==="OPTIONS"&&l){let u=new Headers;return u.set("Access-Control-Allow-Origin",l),u.set("Access-Control-Allow-Methods",e.methods.join(", ")),u.set("Access-Control-Allow-Headers",e.allowedHeaders.join(", ")),e.credentials&&u.set("Access-Control-Allow-Credentials","true"),e.maxAge!=null&&u.set("Access-Control-Max-Age",String(e.maxAge)),l!=="*"&&u.set("Vary","Origin"),new Response(null,{status:204,headers:u})}return l?Promise.resolve(o(s,i)).then(u=>r(u,l)):o(s,i)}}var Bd=N(()=>{"use strict"});import{createGzip as Yy,createBrotliCompress as eb}from"node:zlib";import{Readable as Hd}from"node:stream";function Fd(n={}){let e=n.threshold??1024,t=n.level;return async(r,s,i)=>{let o=await i(r,s),a=o.headers.get("content-encoding"),l=o.headers.get("content-type")??"";if(!o.body||a||!tb(l)||o.status===204||o.status===304)return o;let u=r.headers.get("accept-encoding")??"",c=null;if(/\bbr\b/.test(u)?c="br":/\bgzip\b/.test(u)&&(c="gzip"),!c)return o;let d=Number(o.headers.get("content-length")??"0");if(d>0&&d<e)return o;let p=Hd.fromWeb(o.body),m=c==="br"?eb(t!==void 0?{params:{}}:void 0):Yy(t!==void 0?{level:t}:void 0),h=Hd.toWeb(p.pipe(m)),f=new Headers(o.headers);f.delete("content-length"),f.set("content-encoding",c);let g=f.get("vary");return g?/\baccept-encoding\b/i.test(g)||f.set("vary",`${g}, Accept-Encoding`):f.set("vary","Accept-Encoding"),new Response(h,{status:o.status,statusText:o.statusText,headers:f})}}var tb,Vd=N(()=>{"use strict";tb=n=>{if(!n)return!1;let e=n.split(";")[0].trim().toLowerCase();return e==="text/event-stream"?!1:e.startsWith("text/")||e==="application/json"||e==="application/javascript"||e==="application/xml"||e==="image/svg+xml"||e==="application/wasm"}});import{open as nb,stat as so,realpath as rb}from"node:fs/promises";import{extname as sb,resolve as xa,normalize as ob,sep as Ra}from"node:path";import{Readable as ib}from"node:stream";function zd(n,e){let t=xa(n),r=e??{};return async(s,i,o)=>{let a=i.params["*"]??new URL(s.url).pathname.slice(1),l=decodeURIComponent(a);if(l.includes("..")||l.includes("\0"))return new Response("Forbidden",{status:403});let u=ob(xa(t,l));if(!u.startsWith(t+Ra)&&u!==t)return new Response("Forbidden",{status:403});try{let c=await so(u);if(c.isDirectory()){let V=r.index??"index.html";if(u=xa(u,V),!u.startsWith(t+Ra))return new Response("Forbidden",{status:403});if(c=await so(u),!c.isFile())return new Response("Not Found",{status:404})}let d=await rb(u);if(!d.startsWith(t+Ra)&&d!==t)return new Response("Forbidden",{status:403});let p=ab[sb(u).toLowerCase()]??"application/octet-stream",m=s.headers.get("accept-encoding")??"",h=u,f=c,g=null;if(/\bbr\b/.test(m))try{let V=await so(u+".br");V.mtimeMs>=c.mtimeMs&&(h=u+".br",f=V,g="br")}catch{}else if(/\bgzip\b/.test(m))try{let V=await so(u+".gz");V.mtimeMs>=c.mtimeMs&&(h=u+".gz",f=V,g="gzip")}catch{}let w;w=await nb(h,"r");let y=`"${f.ino}-${f.size}-${f.mtimeMs}"`;if(s.headers.get("if-none-match")===y)return await w.close(),new Response(null,{status:304});let _=s.headers.get("if-modified-since");if(_&&f.mtimeMs<=new Date(_).getTime())return await w.close(),new Response(null,{status:304});let v=0,S=f.size-1,A=!1,C=s.headers.get("range");if(C){let V=/^bytes=(\d*)-(\d*)$/.exec(C);if(V&&(V[1]!==""||V[2]!=="")){if(V[1]===""){let Q=Math.min(Number(V[2]),f.size);v=f.size-Q,S=f.size-1}else v=Number(V[1]),S=V[2]!==""?Math.min(Number(V[2]),f.size-1):f.size-1;if(v>S||v>=f.size)return await w.close(),new Response(null,{status:416,headers:{"Content-Range":`bytes */${f.size}`}});A=!0}}let j={"Content-Type":p,"Content-Length":String(S-v+1),ETag:y,"Last-Modified":f.mtime.toUTCString(),"Cache-Control":r.immutable?`public, max-age=${r.maxAge??31536e3}, immutable`:`public, max-age=${r.maxAge??0}`,"Accept-Ranges":"bytes"};g&&(j["Content-Encoding"]=g),A&&(j["Content-Range"]=`bytes ${v}-${S}/${f.size}`);let K=w.createReadStream({start:v,end:S}),U=()=>w.close().catch(()=>{});K.on("close",U),K.on("error",U);let H=ib.toWeb(K);return new Response(H,{status:A?206:200,headers:j})}catch(c){return c?.code==="ENOENT"?o?o(s,i):new Response("Not Found",{status:404}):new Response("Internal Server Error",{status:500})}}}var ab,Kd=N(()=>{"use strict";ab={".html":"text/html; charset=utf-8",".htm":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".avif":"image/avif",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".eot":"application/vnd.ms-fontobject",".txt":"text/plain; charset=utf-8",".xml":"application/xml",".pdf":"application/pdf",".zip":"application/zip",".wasm":"application/wasm",".map":"application/json",".ts":"application/x-typescript",".tsx":"application/x-typescript",".md":"text/markdown; charset=utf-8",".yaml":"application/x-yaml",".yml":"application/x-yaml",".csv":"text/csv; charset=utf-8",".mp4":"video/mp4",".mp3":"audio/mpeg",".wav":"audio/wav"}});function lb(n){return n.headers.get("x-forwarded-for")?.split(",")[0]?.trim()??n.headers.get("x-real-ip")??"unknown"}function oo(n){if(!n.redis)throw new Error("rateLimit: options.redis is required \u2014 \u4F20 redis() \u7684 .redis\uFF08\u5148 app.use(redis())\uFF09\u6216 new RedisPool()");let e={redis:n.redis,windowMs:n?.windowMs??6e4,max:n?.max??100,key:n?.key??(o=>o.headers.get("x-forwarded-for")?.split(",")[0]?.trim()??"unknown"),algorithm:n?.algorithm??"fixed",statusCode:n?.statusCode??429,message:n?.message??"Too Many Requests",headers:n?.headers??!0},t=e.redis;async function r(o,a,l){let u=(w,y)=>{throw w instanceof Error?w:new Error(`rateLimit: pipeline[${y}] failed`)};if(e.algorithm==="fixed"){let w=await t.pipeline();w.raw("INCR",Fn+o).raw("TTL",Fn+o);let y=await w.exec();if(y[0]instanceof Error)return u(y[0],0);if(y[1]instanceof Error)return u(y[1],1);let k=Number(y[0]),_=Number(y[1]);_<0&&await t.command("PEXPIRE",Fn+o,l);let v=_>0?_:Math.ceil(l/1e3);return{allowed:k<=a,remaining:Math.max(0,a-k),resetSeconds:Math.max(1,v)}}let c=Fn+o,d=Date.now(),p=d-l,m=await t.pipeline();m.raw("ZREMRANGEBYSCORE",c,0,p).raw("ZCARD",c);let h=await m.exec();if(h[0]instanceof Error)return u(h[0],0);if(h[1]instanceof Error)return u(h[1],1);let f=Number(h[1]);if(f>=a){let w=Number(await t.command("TTL",c));return{allowed:!1,remaining:0,resetSeconds:Math.max(1,w)}}return Number(await t.command("ZADD",c,d,`${d}-${Math.random().toString(36).slice(2)}`))===1&&await t.command("EXPIRE",c,Math.ceil(l/1e3)*2),{allowed:!0,remaining:Math.max(0,a-f-1),resetSeconds:Math.ceil(l/1e3)}}function s(o){let a={"Content-Type":"application/json"};return e.headers&&(a["Retry-After"]=String(o),a["RateLimit-Limit"]=String(e.max),a["RateLimit-Remaining"]="0",a["RateLimit-Reset"]=String(o)),new Response(JSON.stringify({error:e.message,retryAfter:o}),{status:e.statusCode,headers:a})}let i=(async(o,a,l)=>{a.limit=async(d,p)=>{let m=(p?.scope??"ip")==="global"?"":`:${lb(o)}`,h=`${Fn}${d}${m}`,f=p?.max??e.max,g=p?.windowMs??e.windowMs,w=await r(h,f,g);if(!w.allowed){let y=new T(e.message,e.statusCode);throw y.retryAfter=w.resetSeconds,y}};let u=await r(Fn+"global:"+e.key(o),e.max,e.windowMs);if(!u.allowed)return s(u.resetSeconds);let c=await l(o,a);return e.headers&&(c.headers.set("RateLimit-Limit",String(e.max)),c.headers.set("RateLimit-Remaining",String(u.remaining)),c.headers.set("RateLimit-Reset",String(u.resetSeconds))),c});return i.__meta={injects:["limit"],depends:[]},i}var Fn,Gd=N(()=>{"use strict";ze();Fn="rl:"});function Ea(n){let e=n.apiKey??process.env.EMAIL_API_KEY??process.env.RESEND_API_KEY??"";if(!e)throw new Error("email: \u9700\u8981 apiKey\uFF08EMAIL_API_KEY \u6216\u663E\u5F0F\u4F20\u5165\u2014\u2014\u4E0D\u76F4\u8FDE SMTP\uFF09");let t=n.baseUrl??process.env.EMAIL_API_URL??process.env.RESEND_API_URL??"https://api.resend.com",r=n.timeoutMs??1e4;return{async send(s){let i=new AbortController,o=setTimeout(()=>i.abort(),r),a;try{a=await fetch(`${t}/emails`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({from:s.from??n.from,to:Array.isArray(s.to)?s.to:[s.to],subject:s.subject,text:s.text,html:s.html}),signal:i.signal})}catch(u){throw i.signal.aborted?new T(`email: \u4E0A\u6E38\u8D85\u65F6 after ${r}ms`,502):new T(`email: \u7F51\u7EDC\u9519\u8BEF: ${u instanceof Error?u.message:String(u)}`,502)}finally{clearTimeout(o)}let l={};try{l=await a.json()}catch{}if(!a.ok)throw new T(`email: \u4E0A\u6E38 ${a.status}${l.message?` ${l.message}`:""}`,502);return{id:l.id,accepted:!0}}}}var Ta=N(()=>{"use strict";ze()});function Kr(n){let e=Array.isArray(n.to)?n.to:[n.to];if(!e.length||e.some(t=>!t.trim()))throw new Error("email: msg.to \u5FC5\u987B\u662F\u975E\u7A7A\u6536\u4EF6\u4EBA\u5217\u8868");if(/[\r\n]/.test(n.from??"")||e.some(t=>/[\r\n]/.test(t)))throw new Error("email: invalid header value (CR/LF not allowed)")}var io=N(()=>{"use strict"});function Vn(n){let e=[],t=()=>`memory-mail-${e.length}`,r=async i=>(Kr(i),e.push(i),n?.onSend?n.onSend(i):{id:t(),accepted:!0}),s=(async(i,o,a)=>(o.email={send:r},a(i,o)));return s.__meta={injects:["email"],depends:[]},s.send=r,s.sent=e,s}var Ca,Aa=N(()=>{"use strict";io();Ca=Vn});import ub from"node:http";async function ao(n={}){let e=[],t=[],r=Vn({...n,onSend:async o=>(e.push(o),n.onSend?n.onSend(o):{id:`memory-mail-${e.length}`,accepted:!0})}),s=ub.createServer((o,a)=>{(async()=>{let l=new URL(o.url??"/","http://localhost"),u=[];for await(let m of o)u.push(m);let c=Buffer.concat(u).toString("utf8"),d={method:o.method??"GET",path:l.pathname,headers:Object.fromEntries(Object.entries(o.headers).map(([m,h])=>[m,String(h)])),body:c?JSON.parse(c):{}};t.push(d);let p=n.respond?.(d);if(p){if("hang"in p)return;a.writeHead(p.status,{"Content-Type":"application/json"}),a.end(JSON.stringify(p.body??{}));return}if(o.method==="POST"&&l.pathname==="/emails"){let m=d.body,h=await r.send({to:m.to,subject:m.subject,text:m.text,html:m.html,from:m.from});a.writeHead(200,{"Content-Type":"application/json"}),a.end(JSON.stringify({id:h.id}));return}if(o.method==="GET"&&l.pathname==="/emails"){a.writeHead(200,{"Content-Type":"application/json"}),a.end(JSON.stringify({messages:e}));return}a.writeHead(404,{"Content-Type":"application/json"}),a.end(JSON.stringify({error:"not found"}))})().catch(l=>{a.writeHead(400,{"Content-Type":"application/json"}),a.end(JSON.stringify({error:l instanceof Error?l.message:String(l)}))})});await new Promise(o=>s.listen(n.port??0,"127.0.0.1",o));let i=s.address().port;return{port:i,url:`http://127.0.0.1:${i}`,emails:e,requests:t,closeAllConnections:()=>s.closeAllConnections(),close:()=>new Promise((o,a)=>s.close(l=>l?a(l):o()))}}var Oa,Qd=N(()=>{"use strict";Aa();Oa=ao});function lo(n){if(!n.from)throw new Error("email: options.from is required");let e=n.adapter??Ea({apiKey:n.apiKey,baseUrl:n.baseUrl,timeoutMs:n.timeoutMs,from:n.from}).send,t=async s=>(Kr(s),e(s)),r=(async(s,i,o)=>(i.email={send:t},o(s,i)));return r.__meta={injects:["email"],depends:[]},r.send=t,r}var Ia=N(()=>{"use strict";Ta();io();io();Ta();Aa();Qd()});function cb(n,e){let t=n[e];if(t instanceof $t)return t.lit;if(t instanceof qt)return t.values;throw new Error(`z.discriminatedUnion: \u5224\u522B\u5B57\u6BB5\u9700\u4E3A literal/enum\u2014\u2014\u5F97\u5230 ${t?._typeName?.()}`)}var uo,ve,Mt,hn,wn,$t,qt,yn,Gr,Pa,Na,Qr,Ma,$a,zn,Kn,Gn,Jr,Zr,b,bn=N(()=>{"use strict";uo=class extends Error{issues;constructor(e){super(e.map(t=>`${t.path}: ${t.message}`).join("; ")),this.name="ZodError",this.issues=e}},ve=class{_meta={};get metaInfo(){return this._meta}meta(e){return this._meta={...this._meta,...e},this}parse(e){let t=this._parse(e);if(!t.ok)throw new uo([{path:t.path??"",message:t.message??"invalid"}]);return t.value}safeParse(e){let t=this._parse(e);return t.ok?{success:!0,data:t.value}:{success:!1,error:new uo([{path:t.path??"",message:t.message??"invalid"}])}}optional(){return new zn(this)}nullable(){return new Kn(this)}default(e){return new Gn(this,e)}refine(e,t){return new Jr(this,e,t)}transform(e){return new Zr(this,e)}},Mt=class extends ve{_typeName(){return"string"}_parse(e){if(typeof e!="string")return{ok:!1,path:"",message:"expected string"};let t=e;return this._min!==void 0&&t.length<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t.length>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:this._pattern&&!this._pattern.test(t)?{ok:!1,path:"",message:"invalid pattern"}:this._email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?{ok:!1,path:"",message:"invalid email"}:this._uuid&&!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)?{ok:!1,path:"",message:"invalid uuid"}:{ok:!0,value:t}}_min;_max;_pattern;_email=!1;_uuid=!1;min(e){return this._min=e,this}max(e){return this._max=e,this}regex(e,t){return this._pattern=e,this}email(){return this._email=!0,this}uuid(){return this._uuid=!0,this}},hn=class extends ve{_typeName(){return"number"}_parse(e){if(typeof e!="number"||Number.isNaN(e))return{ok:!1,path:"",message:"expected number"};let t=e;return this._int&&!Number.isInteger(t)?{ok:!1,path:"",message:"expected integer"}:this._min!==void 0&&t<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:{ok:!0,value:t}}_int=!1;_min;_max;int(){return this._int=!0,this}min(e){return this._min=e,this}max(e){return this._max=e,this}positive(){return this._min=0,this}},wn=class extends ve{_typeName(){return"boolean"}_parse(e){return typeof e!="boolean"?{ok:!1,path:"",message:"expected boolean"}:{ok:!0,value:e}}},$t=class extends ve{lit;constructor(e){super(),this.lit=e}get value(){return this.lit}_typeName(){return"literal"}_parse(e){return e!==this.lit?{ok:!1,path:"",message:`expected literal ${JSON.stringify(this.lit)}`}:{ok:!0,value:e}}},qt=class extends ve{raw;constructor(e){super(),this.raw=e}get values(){return this.raw}_typeName(){return"enum"}_parse(e){return typeof e!="string"||!this.raw.includes(e)?{ok:!1,path:"",message:`expected one of ${this.raw.join(" | ")}`}:{ok:!0,value:e}}},yn=class extends ve{_typeName(){return"datetime"}_parse(e){return typeof e!="string"||Number.isNaN(Date.parse(e))?{ok:!1,path:"",message:"expected datetime string (ISO)"}:{ok:!0,value:e}}},Gr=class extends ve{dims;constructor(e){super(),this.dims=e}_typeName(){return"vector"}_parse(e){return typeof e!="object"||e===null||!Array.isArray(e)||!e.every(t=>typeof t=="number")?{ok:!1,path:"",message:"expected number[] vector"}:this.dims>0&&e.length!==this.dims?{ok:!1,path:"",message:`expected vector(${this.dims})\u2014\u2014got ${e.length} dims`}:{ok:!0,value:e}}},Pa=class extends ve{_typeName(){return"json"}_parse(e){return{ok:!0,value:e}}},Na=class n extends ve{shape;constructor(e){super(),this.shape=e}_typeName(){return"object"}_parse(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,path:"",message:"expected object"};let t={},r=[];for(let[s,i]of Object.entries(this.shape)){let o=i._parse(e[s]);if(!o.ok){r.push({path:s,message:o.message??""});continue}t[s]=o.value}return r.length?{ok:!1,path:r[0].path,message:r[0].message}:{ok:!0,value:t}}pick(e){let t={};for(let r of e)t[r]=this.shape[r];return new n(t)}omit(e){let t={};for(let[r,s]of Object.entries(this.shape))e.includes(r)||(t[r]=s);return new n(t)}extend(e){return new n({...this.shape,...e})}},Qr=class extends ve{inner;constructor(e){super(),this.inner=e}get itemSchema(){return this.inner}_typeName(){return"array"}_parse(e){if(!Array.isArray(e))return{ok:!1,path:"",message:"expected array"};if(this._min!==void 0&&e.length<this._min)return{ok:!1,path:"",message:`too small (min ${this._min})`};if(this._max!==void 0&&e.length>this._max)return{ok:!1,path:"",message:`too big (max ${this._max})`};let t=[];for(let r=0;r<e.length;r++){let s=this.inner._parse(e[r]);if(!s.ok)return{ok:!1,path:`${r}`,message:s.message};t.push(s.value)}return{ok:!0,value:t}}_min;_max;min(e){return this._min=e,this}max(e){return this._max=e,this}},Ma=class extends ve{options;constructor(e){super(),this.options=e}_typeName(){return"union"}_parse(e){let t=null;for(let r of this.options){let s=r._parse(e);if(s.ok)return{ok:!0,value:s.value};t||(t={path:s.path??"",message:s.message??""})}return{ok:!1,path:"",message:`expected union (${t?.message})`}}},$a=class extends ve{disc;options;discValueOf;constructor(e,t,r){super(),this.disc=e,this.options=t,this.discValueOf=r}_typeName(){return"disUnion"}_parse(e){if(typeof e!="object"||e===null)return{ok:!1,path:"",message:"expected object"};let t=e[this.disc];for(let r of this.options)if(this.discValueOf(r.shape)===t){let s=r._parse(e);return s.ok?{ok:!0,value:s.value}:{ok:!1,path:`(${String(t)})`,message:s.message??""}}return{ok:!1,path:this.disc,message:`invalid discriminator value ${JSON.stringify(t)}`}}};zn=class extends ve{inner;constructor(e){super(),this.inner=e}_typeName(){return"optional"}_parse(e){return e===void 0?{ok:!0,value:void 0}:this.inner._parse(e)}},Kn=class extends ve{inner;constructor(e){super(),this.inner=e}_typeName(){return"nullable"}_parse(e){return e===null?{ok:!0,value:null}:this.inner._parse(e)}},Gn=class extends ve{inner;d;constructor(e,t){super(),this.inner=e,this.d=t}_typeName(){return"default"}_parse(e){if(e===void 0){let t=typeof this.d=="function"?this.d():this.d;return this.inner._parse(t)}return this.inner._parse(e)}},Jr=class extends ve{inner;fn;msg;constructor(e,t,r){super(),this.inner=e,this.fn=t,this.msg=r}_typeName(){return"effects"}_parse(e){let t=this.inner._parse(e);return t.ok?this.fn(t.value)?{ok:!0,value:t.value}:{ok:!1,path:"",message:this.msg??"refine failed"}:{ok:!1,path:t.path??"",message:t.message??""}}},Zr=class extends ve{inner;fn;constructor(e,t){super(),this.inner=e,this.fn=t}_typeName(){return"transform"}_parse(e){let t=this.inner._parse(e);return t.ok?{ok:!0,value:this.fn(t.value)}:{ok:!1,path:t.path??"",message:t.message??""}}},b={string:()=>new Mt,number:()=>new hn,boolean:()=>new wn,literal:n=>new $t(n),enum:n=>new qt(n),date:()=>new yn,uuid:()=>new Mt().uuid(),json:()=>new Pa,vector:n=>new Gr(n),object:n=>new Na(n),array:n=>new Qr(n),union:n=>new Ma(n),discriminatedUnion:(n,e)=>new $a(n,e,t=>cb(t,n))}});function Qn(n,e){return n.meta(e)}function co(n){let e={},t;for(let[i,o]of Object.entries(n.fields)){let a=o.metaInfo??{};e[i]={column:a.column??i,...a.pk?{pk:!0}:{},...a.unique?{unique:!0}:{},...a.notNull?{notNull:!0}:{},...a.default!==void 0?{default:a.default}:{},...a.references?{references:a.references}:{},...a.onDelete?{onDelete:a.onDelete}:{}},a.pk&&(t=i)}let r={table:n.table,fields:n.fields,dbFields:e,pkField:t},s=i=>{let o=e[i];return o?.default==="random"||o?.default==="now"};return r.insertSchema=(i={})=>{let o={};for(let[a,l]of Object.entries(n.fields)){if(s(a)||i.omit?.includes(a))continue;let u=l,c=u._typeName?.()==="nullable";o[a]=e[a]?.default!==void 0||c?u.optional():u}return Jd(b.object(o))},r.toDb=i=>{let o={},a=i;for(let[l,u]of Object.entries(a)){let c=e[l];o[c?.column??l]=u}return o},r.fromDb=i=>{let o={},a=i;for(let[l,u]of Object.entries(e))a[u.column??l]!==void 0&&(o[l]=a[u.column??l]);for(let l of Object.keys(a))!Object.values(e).some(c=>c.column===l)&&!(l in o)&&(o[l]=a[l]);return o},r.updateSchema=(i={})=>{let o={};for(let[a,l]of Object.entries(n.fields))s(a)||i.omit?.includes(a)||(o[a]=l.optional());return Jd(b.object(o))},r}function Jd(n){return n.transform(e=>typeof e!="object"||e===null?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)))}var R,Jn=N(()=>{"use strict";bn();R={pk:n=>Qn(n,{pk:!0,default:"random"}),req:n=>Qn(n,{notNull:!0}),col:(n,e)=>Qn(n,{column:e}),now:n=>Qn(n,{default:"now"}),unique:n=>Qn(n,{unique:!0}),dflt:(n,e)=>Qn(n,{default:e})}});import{randomBytes as db,scrypt as pb,timingSafeEqual as mb}from"node:crypto";import{promisify as fb}from"node:util";async function vt(n){let e=db(16),t=await Zd(n,e,gb,po);return`scrypt$${po.N}$${po.r}$${po.p}$${e.toString("hex")}$${t.toString("hex")}`}async function Dt(n,e){let t=e.split("$");if(t.length!==6||t[0]!=="scrypt")return!1;let[,r,s,i,o,a]=t,l=Buffer.from(a,"hex"),u=await Zd(n,Buffer.from(o,"hex"),l.length,{N:Number(r),r:Number(s),p:Number(i)});return u.length===l.length&&mb(u,l)}var Zd,gb,po,qa=N(()=>{"use strict";Zd=fb(pb),gb=64,po={N:16384,r:8,p:1}});import{createHash as hb,createHmac as Yd,randomBytes as wb,timingSafeEqual as yb}from"node:crypto";function Zn(n,e,t){let r=Math.floor(Date.now()/1e3),s=`${Xd({alg:"HS256",typ:"JWT"})}.${Xd({...n,iat:r,exp:r+t})}`,i=Yd("sha256",e).update(s).digest("base64url");return`${s}.${i}`}function jt(n,e){let t=n.split(".");if(t.length!==3)return null;let[r,s,i]=t,o=`${r}.${s}`,a=Yd("sha256",e).update(o).digest("base64url"),l=Buffer.from(i),u=Buffer.from(a);if(l.length!==u.length||!yb(l,u))return null;try{let c=JSON.parse(Buffer.from(s,"base64url").toString("utf8"));return typeof c.exp=="number"&&c.exp<Date.now()/1e3?null:c}catch{return null}}function mo(){return wb(32).toString("hex")}function fo(n){return hb("sha256").update(n).digest("hex")}var Xd,go=N(()=>{"use strict";Xd=n=>Buffer.from(JSON.stringify(n)).toString("base64url")});import{randomBytes as ep}from"node:crypto";function ja(n){if(n.length<np)throw new T(`password must be at least ${np} characters`,400);if(n.length>vb)throw new T("password is too long",400)}function Lt(n){return n.trim().toLowerCase()}async function sp(n){rp??=await vt("dummy-timing-equalize-password"),await Dt(n,rp)}function wo(n){let e=n.orm,t=e.table(bb,ho.users),r=e.table(_b,ho.sessions),s=e.table(Da,ho.apps),i=e.table(tp,ho.members),o=n.secret??process.env.AUTH_SECRET;if(!o)throw new Error("userSystem: secret is required \u2014 pass options.secret or set AUTH_SECRET (at least 32 chars)");if(o.length<16)throw new Error("userSystem: secret must be at least 16 characters");let a=o,l=n.hooks,u=n.allowedRoles??["owner","admin","member","viewer"],c=n.sso??null,d=n.inviteRoles??u;function p(U){if(U!==void 0&&!u.includes(U))throw new T(`invalid role: ${U}\uFF08allowed: ${u.join("/")}\uFF09`,403)}let m=n.accessTtlSeconds??3600,h=n.refreshTtlDays??30,f=n.prefix??"/api/auth",g=U=>({id:String(U.id),email:U.email,name:U.name,role:U.role,tenant:U.tenant}),w=168*3600;async function y(U){let H=await t.select("id","email","name","role","tenant").where({id:{eq:U}}).run();return H.length?H[0]:null}async function k(U,H){(await i.select("role").where({app_id:{eq:Ke},user_id:{eq:U}}).run()).length||await i.insert({app_id:Ke,user_id:U,role:"member",invited_by:null,source:H}).onConflict().run()}async function _(U,H){let V=await i.select("role").where({app_id:{eq:U},user_id:{eq:H}}).run();return V.length?String(V[0].role):null}async function v(U){let H=await s.select("id").where({slug:{eq:U}}).run();return H.length?String(H[0].id):null}async function S(U){let H=await t.select("id","email","name","role","tenant").where({email:{eq:U}}).run();return H.length?H[0]:null}async function A(U){return(await e.query.from(`${tp} m`).select("m.app_id","m.role","a.id","a.slug","a.name").join(`${Da} a`,{"a.id":{col:"m.app_id"}}).where({"m.user_id":{eq:U}}).run()).filter(V=>!String(V.slug).startsWith("_")).map(V=>({id:String(V.id),slug:String(V.slug),name:String(V.name),role:String(V.role)}))}async function C(U,H){let V=Zn({sub:U.id,...U.email?{email:U.email}:{},...U.name?{name:U.name}:{},...H?.appId?{appId:H.appId,role:H.role}:{},...!H?.appId&&U.tenant?{tenantId:U.tenant}:{}},a,m),Q=mo(),P=new Date(Date.now()+h*24*3600*1e3);return await r.insert({token_hash:fo(Q),user_id:U.id,expires_at:P.toISOString(),...H?.appId?{app_id:H.appId}:{}}).run(),{token:V,refreshToken:Q}}async function j(U){let H=await r.update({revoked_at:new Date().toISOString()}).where({token_hash:{eq:fo(U)},revoked_at:{isNull:!0}}).returning("user_id","expires_at","app_id").run();if(!H.length)throw new T("Invalid refresh token",401);let V=H[0];if(new Date(String(V.expires_at))<new Date)throw new T("Refresh token expired",401);let Q=await y(V.user_id);if(!Q)throw new T("User not found",401);return{user:Q,appId:V.app_id?String(V.app_id):void 0}}let K=(async(U,H,V)=>{let Q=null,P=null,E={},x,O,I,$=U.headers.get("authorization"),M=null;if($?.startsWith("Bearer "))M=$.slice(7);else if(U.method==="GET"){let q=new URL(U.url??"","http://localhost"),D=q.searchParams.get("ticket");if(D){let B=jt(D,a);B?.type==="download"&&B?.sub&&(P=await y(String(B.sub)),Q=P,E.userId=String(B.sub),B.appId!=null&&(O=B.appId,E.appId=String(B.appId)))}else M=q.searchParams.get("token")}if(M&&!P){let q=jt(M,a);if(q?.sub){P=await y(String(q.sub)),Q=P;for(let[D,B]of Object.entries(q))D==="sub"||D==="iat"||D==="exp"||D==="type"||(E[D]=B);E.userId=String(q.sub),x=q.tenantId,O=q.appId,I=q.role}}H.user=P,O!=null&&(H.appId=String(O)),H.session=O!=null?{userId:String(P.id),appId:String(O),role:String(I??"")}:null,x!=null&&(H.tenantId=String(x));let W={...E,async register(q){if(!q.email||!q.password)throw new T("email and password are required",400);ja(q.password);let D=Lt(q.email),B=await vt(q.password),z=await t.insert({email:D,password_hash:B,name:q.name??null,role:null,tenant:q.tenant??null}).run(),Y=g(z[0]),te=await C(Y);return await k(Y.id,"register"),Q=Y,{...te,user:Y}},async registerWithApp(q){let D=await this.register({email:q.email,password:q.password,name:q.name});await k(D.user.id,"register");let B=(q.appSlug??q.email.split("@")[1]??"default").trim().toLowerCase(),z=B;for(let ee=1;ee<=200&&await v(z);ee++)z=`${B}-${ee}`;let Y=await this.createApp({slug:z,name:q.appName??`${q.name??"\u7528\u6237"} \u7684\u5E94\u7528`,openRegistration:!1}),te=await C(D.user,{appId:Y.id,role:"owner"});return await l?.onRegisterApp?.(D.user.id,Y),{...te,user:D.user,app:{...Y,role:"owner"}}},async login(q,D){let z=(await t.select("id","email","password_hash","name","role","tenant").where({email:{eq:Lt(q)}}).run())[0];if(!z||z.password_hash==null)throw await sp(D),new T("Invalid email or password",401);if(!await Dt(D,String(z.password_hash)))throw new T("Invalid email or password",401);let te={id:String(z.id),email:String(z.email),name:z.name,role:z.role,tenant:z.tenant},ee=await C(te),pe=await A(te.id);return Q=te,{...ee,user:te,apps:pe}},async logout(q){await r.update({revoked_at:new Date().toISOString()}).where({token_hash:{eq:fo(q)}}).run()},requireAuth(){if(!P)throw new T("Unauthorized",401);return P},async setPassword(q,D){ja(D);let B=await vt(D);await t.update({password_hash:B}).where({id:{eq:q}}).run()},createToken(q,D,B){return Zn({type:q,...D},a,B.ttlSeconds)},async createApp(q){if(!Q)throw new T("Unauthorized",401);if(!q.slug||!q.name)throw new T("slug and name are required",400);let D=q.slug.trim().toLowerCase();if(D.startsWith("_"))throw new T("slug \u4EE5 _ \u5F00\u5934\u4E3A\u7CFB\u7EDF\u4FDD\u7559\u540D",400);if(!await _(Ke,Q.id))throw new T("\u4EC5\u5E94\u7528\u7BA1\u7406\u9762\uFF08_builtin\uFF09\u6210\u5458\u53EF\u521B\u5EFA\u5E94\u7528",403);let z=ep(32).toString("hex"),te=(await s.insert({slug:D,name:q.name,owner_user_id:Q.id,open_registration:q.openRegistration??!1,app_key:z}).run())[0];return await i.insert({app_id:te.id,user_id:Q.id,role:"owner",invited_by:Q.id}).run(),te},async registerInApp(q){if(!q.email||!q.password)throw new T("email and password are required",400);ja(q.password);let D=await s.select("id","open_registration").where({slug:{eq:q.appSlug}}).run();if(!D.length)throw new T("Application not found",404);let B=D[0],z=String(B.id),Y=Lt(q.email),te="member";if(!B.open_registration){if(!q.inviteToken)throw new T("Registration closed for this application",403);let me=jt(q.inviteToken,a);if(!me||me.type!=="app-invite"||me.appId!==z)throw new T("Invalid invite",403);if(me.email&&String(me.email)!==Y)throw new T("Invite email mismatch",403);typeof me.role=="string"&&me.role!=="owner"&&(p(me.role),te=me.role)}let ee=await S(Y);if(!ee){let me=await vt(q.password),Pe=await t.insert({email:Y,password_hash:me,name:q.name??null,role:null,tenant:null}).onConflict("email").run();if(ee=Pe.length?g(Pe[0]):await S(Y),!ee)throw new T("User creation failed",500)}await k(ee.id,"register"),await _(z,ee.id)||await i.insert({app_id:z,user_id:ee.id,role:te,invited_by:Q?.id??null,source:"invite"}).onConflict().run();let je=await C(ee,{appId:z,role:te});return await i.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:z},user_id:{eq:ee.id}}).run(),Q=ee,await l?.onJoinApp?.(ee.id,z,te),{...je,user:ee}},async loginApp(q,D,B){let z=await s.select("id").where({slug:{eq:q}}).run();if(!z.length)throw new T("Application not found",404);let Y=String(z[0].id),ee=(await t.select("id","email","password_hash","name","role","tenant").where({email:{eq:Lt(D)}}).run())[0];if(!ee||ee.password_hash==null)throw await sp(B),new T("Invalid email or password",401);if(!await Dt(B,String(ee.password_hash)))throw new T("Invalid email or password",401);let je=await _(Y,String(ee.id));if(!je)throw new T("Not a member of this application",401);let me={id:String(ee.id),email:String(ee.email),name:ee.name,role:ee.role,tenant:ee.tenant},Pe=await C(me,{appId:Y,role:je});return await i.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:Y},user_id:{eq:me.id}}).run(),Q=me,{...Pe,user:me,role:je}},async ssoLogin(q,D){let B=Lt(q),z=await S(B);if(!z){let ee=await t.insert({email:B,password_hash:null,name:D?.name??null,role:null,tenant:null}).onConflict("email").run();if(z=ee.length?g(ee[0]):await S(B),!z)throw new T("User creation failed",500)}await k(z.id,"sso");let Y;D?.appId&&(await _(D.appId,z.id)||await i.insert({app_id:D.appId,user_id:z.id,role:"member",invited_by:null,source:"sso"}).onConflict().run(),Y=D.appId,await i.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:D.appId},user_id:{eq:z.id}}).run());let te=await C(z,Y?{appId:Y,role:"member"}:void 0);return Q=z,{...te,user:z}},async createInvite(q,D){if(q===Ke)throw new T("_builtin \u4E0D\u8D70\u9080\u8BF7\u6D41\uFF08\u4EFB\u547D\u5236\uFF09",403);if(D.role!==void 0&&!d.includes(D.role))throw new T(`invite role not allowed: ${D.role}\uFF08allowed: ${d.join("/")}\uFF09`,403);if(!Q)throw new T("Unauthorized",401);if(await _(q,Q.id)!=="owner")throw new T("Owner only",403);let z=D.role&&D.role!=="owner"?D.role:"member";return{inviteToken:Zn({type:"app-invite",appId:q,...D.email?{email:Lt(D.email)}:{},role:z},a,w)}},async addMember(q,D,B){if(p(B),q===Ke&&B!==void 0&&B==="viewer")throw new T("_builtin \u65E0\u53EA\u8BFB\uFF08viewer \u7981\u2014\u2014\u7BA1\u7406\u9762\u8EAB\u4EFD\uFF09",403);if(!Q)throw new T("Unauthorized",401);if(await _(q,Q.id)!=="owner")throw new T("Owner only",403);let Y=await t.select("id").where({email:{eq:Lt(D)}}).run();if(!Y.length)throw new T("User not found \u2014 invite them to register first",400);let te=B&&B!=="owner"?B:"member";await i.insert({app_id:q,user_id:String(Y[0].id),role:te,invited_by:Q.id}).run()},async setOpenRegistration(q,D){if(!Q)throw new T("Unauthorized",401);if(q===Ke)throw new T("_builtin \u6CE8\u518C\u5F00\u5173\u6052 false",403);if(await _(q,Q.id)!=="owner")throw new T("Owner only",403);await s.update({open_registration:D}).where({id:{eq:q}}).run()},async listMyApps(){if(!Q)throw new T("Unauthorized",401);return A(Q.id)},async requireApp(q){if(!Q)throw new T("Unauthorized",401);let D=await _(q,Q.id);if(!D)throw new T("Not a member of this application",403);return{userId:Q.id,appId:q,role:D}}};return H.auth=W,V(U,H)});return K.__meta={injects:["user","auth"],depends:[]},K.seedBuiltinOwners=async U=>{let H={owner:null,admins:[]};for(let V of U){let Q=Lt(V);if(!Q)continue;let P=await S(Q);if(!P){let x=await t.insert({email:Q,password_hash:null,name:null,role:null,tenant:null}).onConflict("email").run();P=x.length?g(x[0]):await S(Q)}if(!P)continue;let E=await i.select("role").where({app_id:{eq:Ke},user_id:{eq:P.id}}).run();if(E.length){String(E[0].role??"")==="owner"?H.owner=String(P.id):H.admins.push(String(P.id));continue}if(H.owner)await i.insert({app_id:Ke,user_id:String(P.id),role:"admin",invited_by:H.owner,source:"seed"}).run(),H.admins.push(String(P.id));else{await i.insert({app_id:Ke,user_id:String(P.id),role:"owner",invited_by:null,source:"seed"}).run(),H.owner=String(P.id);let x=await v("_default");x&&(await _(x,String(P.id))||await i.insert({app_id:x,user_id:String(P.id),role:"owner",invited_by:null,source:"seed"}).run())}}return H},K.migrate=async()=>{(await s.select("id").where({slug:{eq:"_builtin"}}).run()).length||await e.query.insert(Da).values({id:Ke,slug:"_builtin",name:"System",owner_user_id:null,open_registration:!1}).returning("id").run();let H=await s.select("id").where({app_key:{isNull:!0}}).run();for(let P of H)await s.update({app_key:ep(32).toString("hex")}).where({id:{eq:String(P.id)}}).run();(await s.select("id").where({slug:{eq:"_default"}}).run()).length||await s.insert({slug:"_default",name:"Default",owner_user_id:null,open_registration:!1}).run();let Q=await t.select("id").run();for(let P of Q)await k(String(P.id),"migrate")},K.routes=(U,H)=>{let V=H?.prefix??f,Q=new Set(H?.exclude??[]);if(Q.has("register")||U.post(`${V}/register`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await E.auth.register(x);return et(O)}),Q.has("register")||U.post(`${V}/register-app`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await E.auth.registerWithApp(x);return et(O)}),Q.has("login")||U.post(`${V}/login`,async(P,E)=>{let x=await P.json().catch(()=>({}));if(!x.email||!x.password)return We("email and password are required");let O=await E.auth.login(x.email,x.password);return Ne(O)}),Q.has("logout")||U.post(`${V}/logout`,async(P,E)=>{let x=await P.json().catch(()=>({}));return x.refreshToken?(await E.auth.logout(x.refreshToken),gn()):We("refreshToken is required")}),Q.has("refresh")||U.post(`${V}/refresh`,async(P,E)=>{let x=await P.json().catch(()=>({}));if(!x.refreshToken)throw new T("refreshToken is required",400);let{user:O,appId:I}=await j(x.refreshToken),$;if(I){let W=await _(I,O.id);W&&($={appId:I,role:W})}let M=await C(O,$);return Ne({...M,user:O})}),Q.has("me")||U.get(`${V}/me`,async(P,E)=>{if(!E.user)throw new T("Unauthorized",401);return Ne({user:E.user,session:E.session??null})}),c){let P=`${V}/apps/_builtin/auth/sso`;U.get(`${P}/enabled`,async()=>Ne({enabled:!0,appSlug:c.defaultAppSlug??null})),U.get(`${P}/login`,async E=>{let O=new URL(E.url??"","http://localhost").searchParams.get("app")??c.defaultAppSlug,I=new URLSearchParams({response_type:"code",client_id:c.clientId,redirect_uri:c.redirectBase?`${c.redirectBase.replace(/\/$/,"")}${P}/callback`:`${new URL(E.url,"http://localhost").origin}${P}/callback`,scope:c.scope??"openid email profile",state:O??"sso"});return new Response(null,{status:302,headers:{Location:`${c.issuer.replace(/\/$/,"")}/authorize?${I}`}})}),U.get(`${P}/callback`,async(E,x)=>{let O=new URL(E.url??"","http://localhost"),I=O.searchParams.get("code");if(!I)throw new T("SSO \u56DE\u8C03\u7F3A\u5C11 code",400);let $=c.redirectBase?`${c.redirectBase.replace(/\/$/,"")}${P}/callback`:`${O.origin}${P}/callback`,M=await fetch(`${c.issuer.replace(/\/$/,"")}/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:I,redirect_uri:$,client_id:c.clientId,client_secret:c.clientSecret})});if(!M.ok)throw new T("SSO token \u4EA4\u6362\u5931\u8D25",401);let W=await M.json(),q=await fetch(`${c.issuer.replace(/\/$/,"")}/userinfo`,{headers:{Authorization:`Bearer ${W.access_token}`}});if(!q.ok)throw new T("SSO \u7528\u6237\u4FE1\u606F\u83B7\u53D6\u5931\u8D25",401);let D=await q.json(),B=(D.email??"").trim().toLowerCase();if(!B)throw new T("SSO \u672A\u8FD4\u56DE\u90AE\u7BB1\uFF08\u9700\u8981 email scope\uFF09",401);let z=O.searchParams.get("state"),Y;if(z&&z!=="sso"){let pe=await v(z);pe&&(Y=pe)}let te=await x.auth.ssoLogin(B,{appId:Y,name:D.name});await l?.onSsoLogin?.(te.user.id,Y);let ee={token:te.token,refreshToken:te.refreshToken,user:te.user};if(c.renderCallback){let pe=c.renderCallback(ee);return typeof pe=="string"?new Response(pe,{headers:{"Content-Type":"text/html; charset=utf-8"}}):pe}return Ne(ee)})}Q.has("apps")||(U.post(`${V}/apps`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await E.auth.createApp(x);return et({app:O})}),U.get(`${V}/apps`,async(P,E)=>{let x=await E.auth.listMyApps();return Ne({apps:x})}),U.post(`${V}/apps/:appSlug/auth/members`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await v(E.params.appSlug);if(!O)throw new T("Application not found",404);return await E.auth.addMember(O,x.email??"",x.role),et({ok:!0})}),U.post(`${V}/apps/:appSlug/auth/invites`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await v(E.params.appSlug);if(!O)throw new T("Application not found",404);let I=await E.auth.createInvite(O,{email:x.email,role:x.role});return et(I)}),U.post(`${V}/apps/:appSlug/auth/login`,async(P,E)=>{let x=await P.json().catch(()=>({}));if(!x.email||!x.password)return We("email and password are required");let O=await E.auth.loginApp(E.params.appSlug,x.email,x.password);return Ne(O)}),U.patch(`${V}/apps/:appSlug/auth/registration`,async(P,E)=>{let x=await P.json().catch(()=>({}));if(typeof x.open!="boolean")return We("open is required (boolean)");let O=await v(E.params.appSlug);if(!O)throw new T("Application not found",404);return await E.auth.setOpenRegistration(O,x.open),Ne({open:x.open})}),U.post(`${V}/apps/:appSlug/auth/verify`,async(P,E)=>{let x=P.headers.get("x-wf-app-id"),O=P.headers.get("x-wf-app-key");if(!x||!O)return We("X-Wf-App-Id / X-Wf-App-Key required");let I=await s.select("id","slug","name").where({id:{eq:x},app_key:{eq:O}}).run();if(!I.length)throw new T("Invalid app credentials",403);let $=I[0];return Ne({app:{id:String($.id),slug:String($.slug),name:String($.name)}})}),U.post(`${V}/apps/:appSlug/auth/register`,async(P,E)=>{let x=await P.json().catch(()=>({})),O=await E.auth.registerInApp({appSlug:E.params.appSlug,email:x.email??"",password:x.password??"",name:x.name,inviteToken:x.inviteToken});return et(O)}))},K.asAppAuth=()=>K,K}var ho,bb,_b,Da,Ke,tp,np,vb,rp,yo,op=N(()=>{"use strict";ze();bn();Jn();qa();go();Hn();ho={users:{id:R.pk(b.uuid()),email:R.req(b.string()).meta({unique:!0}),password_hash:b.string().nullable(),name:b.string().nullable(),role:b.string().nullable(),tenant:b.string().nullable(),email_verified:b.boolean().meta({notNull:!0,default:!1}),created_at:R.now(b.date())},sessions:{token_hash:R.req(b.string()),user_id:R.req(b.uuid()),app_id:b.string().nullable(),expires_at:R.req(b.date()),revoked_at:b.date().nullable(),created_at:R.now(b.date())},apps:{id:R.pk(b.uuid()),slug:R.req(b.string()).meta({unique:!0}),name:R.req(b.string()),owner_user_id:b.uuid().nullable(),open_registration:b.boolean().meta({notNull:!0,default:!1}),app_key:b.string().nullable(),created_at:R.now(b.date())},members:{app_id:R.req(b.uuid()),user_id:R.req(b.uuid()),role:b.string().meta({notNull:!0,default:"member"}),invited_by:b.uuid().nullable(),joined_at:R.now(b.date()),source:b.string().nullable(),last_login_at:b.date().nullable()}},bb="_weifuwu_users",_b="_weifuwu_sessions",Da="_weifuwu_apps",Ke="00000000-0000-4000-8000-0000000000b1",tp="_weifuwu_app_members",np=8,vb=1024;rp=null;yo={tables:[{name:"_weifuwu_users",columns:{id:R.pk(b.uuid()),email:R.req(b.string()).meta({unique:!0}),password_hash:b.string(),name:b.string(),role:b.string(),tenant:b.string(),email_verified:b.boolean().meta({default:!1}),created_at:b.date().meta({default:"now"})},dropNotNull:["password_hash"]},{name:"_weifuwu_sessions",columns:{token_hash:b.string().meta({pk:!0}),user_id:R.req(b.uuid()).meta({references:"_weifuwu_users",onDelete:"cascade"}),app_id:b.string(),expires_at:b.date().meta({notNull:!0}),revoked_at:b.date(),created_at:b.date().meta({default:"now"})}},{name:"_weifuwu_apps",columns:{id:R.pk(b.uuid()),slug:R.req(b.string()).meta({unique:!0}),name:R.req(b.string()),owner_user_id:b.uuid().meta({references:"_weifuwu_users",onDelete:"cascade"}),open_registration:b.boolean().meta({default:!1}),created_at:b.date().meta({default:"now"}),app_key:b.string()}},{name:"_weifuwu_app_members",columns:{app_id:R.req(b.uuid()).meta({references:"_weifuwu_apps",onDelete:"cascade"}),user_id:R.req(b.uuid()).meta({references:"_weifuwu_users",onDelete:"cascade"}),role:b.string().meta({default:"member"}),invited_by:b.uuid(),joined_at:b.date().meta({default:"now"}),source:b.string(),last_login_at:b.date()},uniques:[["app_id","user_id"]]}]}});function ip(n){return async(t,r,s)=>{let i=null,o=null,a=t.headers.get("authorization");if(a?.startsWith("Bearer ")&&(o=a.slice(7)),!o){let l=new URL(t.url??"","http://localhost").searchParams.get("token");l&&(o=l)}if(o){let l=jt(o.trim(),n.secret);if(l?.sub&&(n.verifyToken&&(await n.verifyToken(o.trim())||(l.sub="")),l.sub)){let u=typeof l.appId=="string"?l.appId:void 0;i=u?{userId:String(l.sub),appId:u,role:String(l.role??"")}:null,r.user={id:String(l.sub),...typeof l.email=="string"?{email:l.email}:{},...typeof l.name=="string"?{name:l.name}:{}}}}if(r.session=i,r.auth={requireAuth(){if(!i)throw new T("Unauthorized",401);return i},get userId(){return i?.userId},get appId(){return i?.appId},get role(){return i?.role}},i&&(r.appId=i.appId),n.builtin){let{baseUrl:l,appId:u,appKey:c}=n.builtin,d=async(p,m)=>{let h=await fetch(`${l.replace(/\/$/,"")}${p}`,{...m,headers:{"Content-Type":"application/json","X-Wf-App-Id":u,"X-Wf-App-Key":c,...m?.headers}});if(!h.ok)throw new T(`builtin \u8C03\u7528\u5931\u8D25 HTTP ${h.status}`,h.status);return h.json()};r.builtin={get:p=>d(p),post:(p,m)=>d(p,{method:"POST",body:JSON.stringify(m??{})})}}return s(t,r)}}var ap=N(()=>{"use strict";go();ze()});function kb(n){let e=n.__shape;return e||n}function Sb(n,e){if(n instanceof se)return n;let t=n?.issues;if(Array.isArray(t)&&t.length){let r=t.map(s=>`${s.path?`${s.path}: `:""}${s.message}`).join("\uFF1B");return new se(`\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF08${e}\uFF09\uFF1A${r}`)}return new se(`\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF08${e}\uFF09\uFF1A${n instanceof Error?n.message:String(n)}`)}async function Wt(n,e,t={}){let r=kb(e),s;try{s=await n.json()}catch{throw new se("\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF1A\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF08content-type \u5E94\u4E3A application/json\uFF09")}if(typeof s!="object"||s===null||Array.isArray(s))throw new se("\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF1Abody \u5FC5\u987B\u4E3A\u5BF9\u8C61");let i=t.variant==="patch"?r.updateSchema({omit:t.omit}):r.insertSchema({omit:t.omit});try{return i.parse(s)}catch(o){throw Sb(o,r.table)}}var lp=N(()=>{"use strict";ye()});function xb(n){let e=n;for(;;){let t=e.inner;if(t&&typeof e._typeName=="string"&&["optional","nullable","default","effects","transform"].includes(e._typeName))e=t;else break}return e}function Rb(n,e){let r=xb(n.fields[e]).values;return Array.isArray(r)?r.map(String):void 0}function Xn(n,e,t={}){let r=t.maxLimit??100,s=t.defaultLimit??20,o=e.__shape??e,a=n.searchParams,l=Object.keys(o.fields),u=new Set(l),c={};for(let[f,g]of a.entries()){if(f==="sort"||f==="limit"||f==="offset")continue;let w=Rb(o,f);if(w&&!w.includes(g))throw new Error(`invalid enum value for ${f}: ${g}\uFF08\u5141\u8BB8\uFF1A${w.join(" | ")}\uFF09`);c[f]={eq:g}}let d=[],p=a.get("sort");if(p)for(let f of p.split(",")){let g=f.startsWith("-")?"desc":"asc",w=g==="desc"?f.slice(1):f;if(!u.has(w))throw new Error(`invalid sort field: ${w}`);d.push({field:w,dir:g})}let m=Math.min(r,Math.max(1,parseInt(a.get("limit")??String(s),10)||s)),h=Math.max(0,parseInt(a.get("offset")??"0",10)||0);return{filter:c,sort:d,limit:m,offset:h}}var La=N(()=>{"use strict";Hn()});function _o(n){return n.inner}function Ut(n){let e=n._typeName();switch(e){case"string":return n._uuid?"UUID":"TEXT";case"number":return n._int?"INT":"DOUBLE PRECISION";case"boolean":return"BOOLEAN";case"datetime":return"TIMESTAMPTZ";case"json":case"object":case"array":return"JSONB";case"vector":return"JSONB";case"enum":return"TEXT";case"optional":case"nullable":case"default":case"effects":case"transform":return Ut(_o(n)??n);default:throw new Error(`schema: \u65E0\u6CD5\u6620\u5C04 zod \u7C7B\u578B ${e}\uFF08\u5217\u578B\u6CE8\u89E3 columnTypes \u53EF\u8986\u76D6\uFF09`)}}function Wa(n){if(n._typeName()==="enum")return(n.values??[]).map(String);let e=_o(n);return e?Wa(e):void 0}function bo(n){return n===null?"NULL":typeof n=="number"||typeof n=="bigint"?String(n):typeof n=="boolean"?n?"TRUE":"FALSE":typeof n=="string"?`'${n.replace(/'/g,"''")}'`:`'${JSON.stringify(n).replace(/'/g,"''")}'::JSONB`}function Xr(n){let e=[];for(let t of n.extensions??[])e.push({kind:"ddl",op:"createExtension",table:t});for(let t of n.enums??[]){e.push({kind:"ddl",op:"createEnum",table:t.name,enumValues:t.values});for(let r of t.values)e.push({kind:"ddl",op:"alterEnumAddValue",table:t.name,enumValues:[r]})}for(let t of n.tables)e.push(...Ib(t));return e}function vo(n){let e=[];for(let t of n)e.push(...Eb(t));return e.join(`
17
- `)}function Eb(n){switch(n.op){case"createExtension":return[`CREATE EXTENSION IF NOT EXISTS ${n.table};`];case"createEnum":return[`DO $$ BEGIN
15
+ `);let d=new zr(r,n);e.add(d),d.on("close",()=>e.delete(d)),o(d),s?.length&&d.feed(s)},async shutdown(){if(e.size===0)return;let t=[...e],r=new Promise(s=>{let o=t.length,i=setTimeout(s,500);for(let a of t)a.once("close",()=>{--o===0&&(clearTimeout(i),s())})});for(let s of t)try{s.close(1001,"server shutting down")}catch{}await r}}}var Vy,zy,kd=I(()=>{"use strict";ga();Vy="258EAFA5-E914-47DA-95CA-C5AB0DC85B11",zy=/^[+/0-9A-Za-z]{22}==$/});var Sd=I(()=>{"use strict";kd();ga();ma()});var We,ue,ce,mn,se,fn,ye=I(()=>{"use strict";We=class extends Error{kind;code;cause;constructor(e,t,r){super(t),this.name="DbError",this.kind=e,this.code=r?.code,this.cause=r?.cause}},ue=class extends We{constructor(e,t){super("protocol",t??`${e} is not supported by weifuwu/db`,{code:"UNSUPPORTED"}),this.name="ProtocolError"}},ce=class extends We{attempts;constructor(e,t=1,r){super("connection",e,{cause:r}),this.name="ConnectionError",this.attempts=t}},mn=class extends We{operation;ms;constructor(e,t){super("timeout",`${e} timed out after ${t}ms`),this.name="TimeoutError",this.operation=e,this.ms=t}},se=class extends We{constructor(e){super("validation",e),this.name="ValidationError"}},fn=class extends We{constructor(e){super("protocol",e,{code:"RESP"}),this.name="RespError"}}});function Me(n,e){return Response.json(n,{status:200,...e})}function et(n,e){return Response.json(n,{status:201,...e})}function gn(n){return new Response(null,{status:204,...n})}function Ue(n){return Response.json({error:n??"Bad Request"},{status:400})}function xd(n){return Response.json({error:n??"Unauthorized"},{status:401})}function Rd(n){return Response.json({error:n??"Forbidden"},{status:403})}function Ed(n){return Response.json({error:n??"Not Found"},{status:404})}function Td(n){return Response.json({error:n??"Conflict"},{status:409})}function Cd(n){return Response.json({error:n??"Unprocessable Entity"},{status:422})}function Ad(n){return Response.json({error:n??"Too Many Requests"},{status:429})}function Od(n){return Response.json({error:n??"Internal Server Error"},{status:500})}function Id(n,e=302){return new Response(null,{status:e,headers:{Location:n}})}function Ae(n,e){let t=n instanceof Error?n.message:String(n),r;if(n instanceof T)return Response.json({error:t},{status:e??n.status});if(n instanceof We){let s=e??(n.code==="23505"?409:400);return r=n.code==="23505"?"conflict":n.kind,Response.json({error:t,code:r},{status:s})}return Response.json({error:t},{status:e??400})}var Hn=I(()=>{"use strict";Ke();ye()});function wa(n,e,t){if(!e)return()=>{};let r=s=>{let o=s instanceof Error?s:new Error(String(s));t?t(o):console.error(`[ws] ${n} handler error:`,o.stack||o.message)};return(...s)=>{try{let o=e(...s);o&&typeof o.catch=="function"&&o.catch(r)}catch(o){r(o)}}}function Pd(n,e,t){return(r,s,o)=>{let i=r.url?.split("/").filter(Boolean)??[],a=e(i);if(!a){s.destroy();return}n.handleUpgrade(r,s,o,l=>{let u=new URL(r.url??"/","http://localhost"),c={params:a.params,query:Object.fromEntries(u.searchParams),hub:t},d=a.handler,p=d.error?g=>{try{let h=d.error(l,c,g);h&&typeof h.catch=="function"&&h.catch(b=>console.error("[ws] error handler failed:",b))}catch(h){console.error("[ws] error handler failed:",h)}}:null,f=wa("open",d.open,p),w=wa("message",d.message,p),m=wa("close",d.close,p);f(l,c),l.on("message",(g,h)=>{let b=h===!1&&typeof g!="string"?String(g):g;w(l,c,b)}),l.on("close",()=>m(l,c)),l.on("error",g=>{let h=g;p?p(h):console.error("[ws] connection error:",h.message)})})}}var Nd=I(()=>{"use strict"});function Kr(){return{children:new Map}}function ya(n){return n.split("/").filter(Boolean)}function Ky(n,e,t){let r=e.slice(1);if(!n.children.has(":")){let o=t();o.param=r,n.children.set(":",o)}let s=n.children.get(":");if(s.param!==r)throw new Error(`[router] param conflict: ":${s.param}" already registered, cannot register ":${r}"`);return s}function Gy(n,e,t){return e==="*"?(n.wildcard=!0,n):e.startsWith(":")?Ky(n,e,t):(n.children.has(e)||n.children.set(e,t()),n.children.get(e))}function Md(n,e){let t=ya(e),r=n;for(let s of t){if(!r)return null;if(s==="*")return r;r=s.startsWith(":")?r.children.get(":")??null:r.children.get(s)??null}return r}function no(n,e,t){let r=ya(e),s=n;for(let o of r){if(o==="*")return s.wildcard=!0,s.wildcardValue=t,s;s=Gy(s,o,()=>Kr())}return s.value=t,s}function to(n,e,t,r,s="value"){if(t===e.length){let l=s==="value"?n.value:n.wildcardValue;return l!==void 0?{value:l,params:{...r},node:n}:null}let o=e[t],i=n.children.get(o);if(i){let l=to(i,e,t+1,r,s);if(l)return l}let a=n.children.get(":");if(a?.param){let l={...r,[a.param]:decodeURIComponent(o)},u=to(a,e,t+1,l,s);if(u)return u}return null}function Gr(n,e){let t=to(n,e,0,{});if(t){let r=t.node.wildcardValue!==void 0;return{value:t.value,params:r?{...t.params,"*":""}:t.params,wildcard:!1}}return Qy(n,e,e.length)}function Qy(n,e,t){for(let r=0;r<=t;r++){let s=to(n,e.slice(0,r),0,{},"wildcard");if(s)return{value:s.value,params:{...s.params,"*":e.slice(r).join("/")},wildcard:!0}}return null}var ro=I(()=>{"use strict"});function ba(n,e=""){let t=[];for(let[s,o]of n.value?.handlers??[]){let i=n.value?.middlewares.get(s)||[];t.push({method:s,path:e||"/",handler:o,middlewares:[...i]})}let r=n.wildcardValue;if(r)for(let[s,o]of r.handlers){let i=r.middlewares.get(s)||[];t.push({method:s,path:(e||"/")+"/*",handler:o,middlewares:[...i]})}for(let[s,o]of n.children)t.push(...ba(o,e+"/"+(s===":"?`:${o.param}`:s)));return t}function _a(n,e=""){let t=[];n.value?.handler&&t.push({path:e||"/",handler:n.value.handler,middlewares:[...n.value.middlewares]}),n.wildcardValue?.handler&&t.push({path:(e||"/")+"/*",handler:n.wildcardValue.handler,middlewares:[...n.wildcardValue.middlewares]});for(let[r,s]of n.children)t.push(..._a(s,e+"/"+(r===":"?`:${s.param}`:r)));return t}function va(n,e,t){for(let[r]of n.value?.handlers??[]){let s=r==="*"?"ANY":r,o=(e||"/")+(n.wildcard?"/*":""),i=n.value?.middlewares.get(r),a=i?` (+${i.length} mw)`:"";t.push(`${s.padEnd(7)} ${o}${a}`)}for(let[r,s]of n.children){let o=r===":"?`:${s.param}`:r;va(s,e+"/"+o,t)}}function ka(n,e,t){if(n.value?.handler){let r=e||"/",s=n.value.middlewares.length?` (+${n.value.middlewares.length} mw)`:"";t.push(`WS ${r}${s}`)}for(let[r,s]of n.children){let o=r===":"?`:${s.param}`:r;ka(s,e+"/"+o,t)}}var $d=I(()=>{"use strict"});async function so(n,e,t,r){if(n.length===0)return e(t,r);let s=0,o=(i,a)=>{if(s>=n.length)return Promise.resolve(e(i,a));let l=n[s++],u=!1,c=(d,p)=>{if(u)throw new Error("[router] next() called more than once in middleware");return u=!0,o(d,p)};return Promise.resolve(l(i,a,c))};return o(t,r)}var qd=I(()=>{"use strict"});function Jy(n){return Response.json({error:"Bad Request",reason:n},{status:400})}async function Sa(n,e,t,r){let s=yd(t);if(!s.ok)return Jy(s.reason);let o=Gr(n,s.segments),i=o?{value:o.value,params:bd(o),wildcard:o.wildcard}:null;e.enrichCtx?.(r,i,s.pathname,s.query);try{if(!i)return await e.onNotFound(t,r,s.pathname);let a=e.resolveHandler(i,t,r);if(a.kind==="not-found")return await e.onNotFound(t,r,s.pathname);if(a.kind==="not-allowed")return e.onMethodNotAllowed?await e.onMethodNotAllowed(a.methods,t,r,s.pathname):new Response("Method Not Allowed",{status:405,headers:{Allow:a.methods.join(", ")}});let l=await a.run();return e.onRouteSuccess?.(t,r,s.pathname),l}catch(a){if(e.onError)return e.onError(a,t,r,s.pathname);throw a}}var xa=I(()=>{"use strict";ro();ua()});function Dd(){let n=new Set;return{register(e){for(let t of e)n.add(t)},check(e,t){for(let r of e)if(!n.has(r))throw new Error(`[weifuwu] Middleware at "${t}" depends on ctx.${r} but it hasn't been registered.
16
+ Register the provider before this middleware: app.use(${r}())`)},has(e){return n.has(e)}}}var jd=I(()=>{"use strict"});function Ld(){let n=new Map,e=new Map;return{join(t,r){let s=n.get(t);s||(s=new Set,n.set(t,s)),s.add(r);let o=e.get(r);o||(o=new Set,e.set(r,o)),o.add(t)},leave(t){let r=e.get(t);if(r){for(let s of r){let o=n.get(s);o&&(o.delete(t),o.size===0&&n.delete(s))}e.delete(t)}},send(t,r){let s=n.get(t);if(s)for(let o of s)try{o.send(r)}catch{}},async close(){n.clear(),e.clear()}}}var Wd=I(()=>{"use strict"});function Ud(n,e){Qr.totalErrors++;let t=Qr.errState.get(n);if(t){t.count++;return}Qr.errState.set(n,{shown:!0,count:1}),console.error(`[router] ${n}\uFF08\u91CD\u590D\u9519\u8BEF\u5DF2\u53BB\u91CD\u2014\u2014\u7D2F\u8BA1 ${Qr.totalErrors}\uFF09:`,e instanceof Error?e.stack||e.message:e)}function Bd(n){Qr.errState.delete(n)}var Ra,Qr,Hd=I(()=>{"use strict";Ra=globalThis;Ra.__wfRouterErrState||(Ra.__wfRouterErrState={errState:new Map,totalErrors:0});Qr=Ra.__wfRouterErrState});var Zy,lt,Ea=I(()=>{"use strict";Ke();Hn();ye();Nd();ro();$d();qd();xa();jd();Wd();Hd();Zy=()=>({handlers:new Map,middlewares:new Map}),lt=class n{root=Kr();wsRoot=Kr();globalMws=[];errorHandler;_hasWildcard=!1;_hub;_wsCount=0;_ctxRegistry=Dd();_closeables=[];_pipeline;get pipeline(){return this._pipeline??=this.buildPipeline()}buildPipeline(){return{resolveHandler:(e,t,r)=>{let s=e.value,o=t.method;if(e.wildcard){let a=s.handlers.get(o)||s.handlers.get("*");if(!a)return{kind:"not-found"};let l=s.middlewares.get(o)||s.middlewares.get("*")||[];return{kind:"route",run:()=>this.runWithChain(l,a,t,r)}}let i=s.handlers.get(o)||s.handlers.get("*");if(!i&&o==="HEAD"&&(i=s.handlers.get("GET")),i){let a=s.middlewares.get(o)||s.middlewares.get("*")||(o==="HEAD"?s.middlewares.get("GET"):void 0)||[];return{kind:"route",run:()=>this.runWithChain(a,i,t,r)}}return s.handlers.size>0?{kind:"not-allowed",methods:[...s.handlers.keys()].filter(a=>a!=="*")}:{kind:"not-found"}},onNotFound:(e,t,r)=>{let s=()=>Response.json({error:"Not Found",path:r,method:e.method},{status:404});return this.globalMws.length>0?so(this.globalMws,s,e,t):s()},onMethodNotAllowed:(e,t,r)=>{let s=()=>new Response("Method Not Allowed",{status:405,headers:{Allow:e.join(", ")}});return this.globalMws.length>0?so(this.globalMws,s,t,r):s()},onError:(e,t,r,s)=>this.handleError(e,t,r,s),onRouteSuccess:(e,t,r)=>Bd(`${e.method} ${r}`),enrichCtx:(e,t)=>{t&&Object.assign(e.params,t.params)}}}runWithChain(e,t,r,s){let o=e.length===0?this.globalMws:[...this.globalMws,...e];return so(o,t,r,s)}get hub(){return this._hub||(this._hub=Ld()),this._hub}wsHub(e){return this._hub=e,this}use(e){return this.globalMws.push(e),this._checkMiddlewareMeta(e,"global"),typeof e.close=="function"&&this._closeables.push(e),this}plugin(e){return e(this),this}mount(e,t){return this._mountRouter(e,t),this}onError(e){return this.errorHandler=e,this}get(e,...t){return this._route("GET",e,...t)}post(e,...t){return this._route("POST",e,...t)}put(e,...t){return this._route("PUT",e,...t)}delete(e,...t){return this._route("DELETE",e,...t)}patch(e,...t){return this._route("PATCH",e,...t)}head(e,...t){return this._route("HEAD",e,...t)}options(e,...t){return this._route("OPTIONS",e,...t)}all(e,...t){return this._route("*",e,...t)}ws(e,...t){let r=t.pop(),s=t;return no(this.wsRoot,e,{handler:r,middlewares:s}),this._wsCount++,this}hasWsRoutes(){return this._wsCount>0}handler(){return(e,t)=>Sa(this.root,this.pipeline,e,t)}websocketHandler(e){return Pd(e,t=>this.matchWsTrie(this.wsRoot,t),this.hub)}routes(){let e=[];return this.globalMws.length>0&&e.push(`MIDDLEWARE [${this.globalMws.length} global]`),va(this.root,"",e),ka(this.wsRoot,"",e),e}_route(e,t,...r){return this._routeImpl(e,t,r)}_routeImpl(e,t,r){let s=r[r.length-1];if(s instanceof n)return this._mountRouter(t,s,r.slice(0,-1)),this;let o=r.pop(),i=r;for(let p of i)this._checkMiddlewareMeta(p,`${e} ${t}`);let a=Md(this.root,t),l=t.includes("*"),u=l?a?.wildcardValue:a?.value;if(!l&&u?.handlers.has(e))throw new Error(`[router] route conflict: ${e} ${t} already registered`);let c=u??Zy();c.handlers.set(e,o),i.length>0&&c.middlewares.set(e,i);let d=no(this.root,t,c);return l&&(this._hasWildcard=!0),this}_mountRouter(e,t,r=[]){let s=e==="/"?"":e.replace(/\/$/,""),o=(u,c,d)=>(c.mountPath=(c.mountPath||"")+s,d(u,c)),i=r.length===0&&t.globalMws.length===0?[o]:[o,...r,...t.globalMws];for(let u of i)this._checkMiddlewareMeta(u,`mount:${e}`);let a=ba(t.root);for(let{method:u,path:c,handler:d,middlewares:p}of a)this._routeImpl(u,s+c,[...i,...p,d]);let l=_a(t.wsRoot);for(let{path:u,handler:c,middlewares:d}of l)this.ws(s+u,...i,...d,c)}matchWsTrie(e,t){let r=Gr(e,t);return r?{handler:r.value.handler,middlewares:r.value.middlewares,params:r.params}:null}async handleError(e,t,r,s){let o=e instanceof Error?e:new Error(String(e));return this.errorHandler?this.errorHandler(o,t,r):o instanceof T||o instanceof We||o instanceof se?Ae(o):(Ud(`${t.method} ${s??new URL(t.url).pathname}`,e),Response.json({error:"Internal Server Error"},{status:500}))}onClose(e){return this._closeables.push(e),this}_closed=!1;async close(){if(!this._closed){this._closed=!0;for(let e of this._closeables)try{await e.close()}catch{}}}_checkMiddlewareMeta(e,t){let r=e.__meta??(typeof e=="object"&&e&&"middleware"in e?e.middleware().__meta:void 0);r&&(this._ctxRegistry.check(r.depends,t),this._ctxRegistry.register(r.injects))}}});function oo(n){let e={origin:"*",methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],allowedHeaders:["Content-Type","Authorization"],...n};function t(s){if(typeof e.origin=="string")return e.origin==="*"?e.credentials?s:"*":e.origin;if(Array.isArray(e.origin))return e.origin.includes(s)?s:"";let o=e.origin(s);return typeof o=="boolean"?o?s:"":typeof o=="string"?o:""}function r(s,o){if(!o)return s;let i=new Headers(s.headers);return i.set("Access-Control-Allow-Origin",o),e.credentials&&i.set("Access-Control-Allow-Credentials","true"),e.exposedHeaders?.length&&i.set("Access-Control-Expose-Headers",e.exposedHeaders.join(", ")),o!=="*"&&i.set("Vary","Origin"),new Response(s.body,{status:s.status,statusText:s.statusText,headers:i})}return(s,o,i)=>{let a=s.headers.get("origin")??"",l=t(a);if(s.method==="OPTIONS"&&l){let u=new Headers;return u.set("Access-Control-Allow-Origin",l),u.set("Access-Control-Allow-Methods",e.methods.join(", ")),u.set("Access-Control-Allow-Headers",e.allowedHeaders.join(", ")),e.credentials&&u.set("Access-Control-Allow-Credentials","true"),e.maxAge!=null&&u.set("Access-Control-Max-Age",String(e.maxAge)),l!=="*"&&u.set("Vary","Origin"),new Response(null,{status:204,headers:u})}return l?Promise.resolve(i(s,o)).then(u=>r(u,l)):i(s,o)}}var Fd=I(()=>{"use strict"});import{createGzip as Xy,createBrotliCompress as Yy}from"node:zlib";import{Readable as Vd}from"node:stream";function zd(n={}){let e=n.threshold??1024,t=n.level;return async(r,s,o)=>{let i=await o(r,s),a=i.headers.get("content-encoding"),l=i.headers.get("content-type")??"";if(!i.body||a||!eb(l)||i.status===204||i.status===304)return i;let u=r.headers.get("accept-encoding")??"",c=null;if(/\bbr\b/.test(u)?c="br":/\bgzip\b/.test(u)&&(c="gzip"),!c)return i;let d=Number(i.headers.get("content-length")??"0");if(d>0&&d<e)return i;let p=Vd.fromWeb(i.body),f=c==="br"?Yy(t!==void 0?{params:{}}:void 0):Xy(t!==void 0?{level:t}:void 0),w=Vd.toWeb(p.pipe(f)),m=new Headers(i.headers);m.delete("content-length"),m.set("content-encoding",c);let g=m.get("vary");return g?/\baccept-encoding\b/i.test(g)||m.set("vary",`${g}, Accept-Encoding`):m.set("vary","Accept-Encoding"),new Response(w,{status:i.status,statusText:i.statusText,headers:m})}}var eb,Kd=I(()=>{"use strict";eb=n=>{if(!n)return!1;let e=n.split(";")[0].trim().toLowerCase();return e==="text/event-stream"?!1:e.startsWith("text/")||e==="application/json"||e==="application/javascript"||e==="application/xml"||e==="image/svg+xml"||e==="application/wasm"}});import{open as tb,stat as io,realpath as nb}from"node:fs/promises";import{extname as rb,resolve as Ta,normalize as sb,sep as Ca}from"node:path";import{Readable as ob}from"node:stream";function Gd(n,e){let t=Ta(n),r=e??{};return async(s,o,i)=>{let a=o.params["*"]??new URL(s.url).pathname.slice(1),l=decodeURIComponent(a);if(l.includes("..")||l.includes("\0"))return new Response("Forbidden",{status:403});let u=sb(Ta(t,l));if(!u.startsWith(t+Ca)&&u!==t)return new Response("Forbidden",{status:403});try{let c=await io(u);if(c.isDirectory()){let K=r.index??"index.html";if(u=Ta(u,K),!u.startsWith(t+Ca))return new Response("Forbidden",{status:403});if(c=await io(u),!c.isFile())return new Response("Not Found",{status:404})}let d=await nb(u);if(!d.startsWith(t+Ca)&&d!==t)return new Response("Forbidden",{status:403});let p=ib[rb(u).toLowerCase()]??"application/octet-stream",f=s.headers.get("accept-encoding")??"",w=u,m=c,g=null;if(/\bbr\b/.test(f))try{let K=await io(u+".br");K.mtimeMs>=c.mtimeMs&&(w=u+".br",m=K,g="br")}catch{}else if(/\bgzip\b/.test(f))try{let K=await io(u+".gz");K.mtimeMs>=c.mtimeMs&&(w=u+".gz",m=K,g="gzip")}catch{}let h;h=await tb(w,"r");let b=`"${m.ino}-${m.size}-${m.mtimeMs}"`;if(s.headers.get("if-none-match")===b)return await h.close(),new Response(null,{status:304});let _=s.headers.get("if-modified-since");if(_&&m.mtimeMs<=new Date(_).getTime())return await h.close(),new Response(null,{status:304});let v=0,S=m.size-1,A=!1,C=s.headers.get("range");if(C){let K=/^bytes=(\d*)-(\d*)$/.exec(C);if(K&&(K[1]!==""||K[2]!=="")){if(K[1]===""){let M=Math.min(Number(K[2]),m.size);v=m.size-M,S=m.size-1}else v=Number(K[1]),S=K[2]!==""?Math.min(Number(K[2]),m.size-1):m.size-1;if(v>S||v>=m.size)return await h.close(),new Response(null,{status:416,headers:{"Content-Range":`bytes */${m.size}`}});A=!0}}let W={"Content-Type":p,"Content-Length":String(S-v+1),ETag:b,"Last-Modified":m.mtime.toUTCString(),"Cache-Control":r.immutable?`public, max-age=${r.maxAge??31536e3}, immutable`:`public, max-age=${r.maxAge??0}`,"Accept-Ranges":"bytes"};g&&(W["Content-Encoding"]=g),A&&(W["Content-Range"]=`bytes ${v}-${S}/${m.size}`);let G=h.createReadStream({start:v,end:S}),U=()=>h.close().catch(()=>{});G.on("close",U),G.on("error",U);let F=ob.toWeb(G);return new Response(F,{status:A?206:200,headers:W})}catch(c){return c?.code==="ENOENT"?i?i(s,o):new Response("Not Found",{status:404}):new Response("Internal Server Error",{status:500})}}}var ib,Qd=I(()=>{"use strict";ib={".html":"text/html; charset=utf-8",".htm":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".webp":"image/webp",".avif":"image/avif",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".eot":"application/vnd.ms-fontobject",".txt":"text/plain; charset=utf-8",".xml":"application/xml",".pdf":"application/pdf",".zip":"application/zip",".wasm":"application/wasm",".map":"application/json",".ts":"application/x-typescript",".tsx":"application/x-typescript",".md":"text/markdown; charset=utf-8",".yaml":"application/x-yaml",".yml":"application/x-yaml",".csv":"text/csv; charset=utf-8",".mp4":"video/mp4",".mp3":"audio/mpeg",".wav":"audio/wav"}});function ab(n){return n.headers.get("x-forwarded-for")?.split(",")[0]?.trim()??n.headers.get("x-real-ip")??"unknown"}function ao(n){if(!n.redis)throw new Error("rateLimit: options.redis is required \u2014 \u4F20 redis() \u7684 .redis\uFF08\u5148 app.use(redis())\uFF09\u6216 new RedisPool()");let e={redis:n.redis,windowMs:n?.windowMs??6e4,max:n?.max??100,key:n?.key??(i=>i.headers.get("x-forwarded-for")?.split(",")[0]?.trim()??"unknown"),algorithm:n?.algorithm??"fixed",statusCode:n?.statusCode??429,message:n?.message??"Too Many Requests",headers:n?.headers??!0},t=e.redis;async function r(i,a,l){let u=(h,b)=>{throw h instanceof Error?h:new Error(`rateLimit: pipeline[${b}] failed`)};if(e.algorithm==="fixed"){let h=await t.pipeline();h.raw("INCR",Fn+i).raw("TTL",Fn+i);let b=await h.exec();if(b[0]instanceof Error)return u(b[0],0);if(b[1]instanceof Error)return u(b[1],1);let k=Number(b[0]),_=Number(b[1]);_<0&&await t.command("PEXPIRE",Fn+i,l);let v=_>0?_:Math.ceil(l/1e3);return{allowed:k<=a,remaining:Math.max(0,a-k),resetSeconds:Math.max(1,v)}}let c=Fn+i,d=Date.now(),p=d-l,f=await t.pipeline();f.raw("ZREMRANGEBYSCORE",c,0,p).raw("ZCARD",c);let w=await f.exec();if(w[0]instanceof Error)return u(w[0],0);if(w[1]instanceof Error)return u(w[1],1);let m=Number(w[1]);if(m>=a){let h=Number(await t.command("TTL",c));return{allowed:!1,remaining:0,resetSeconds:Math.max(1,h)}}return Number(await t.command("ZADD",c,d,`${d}-${Math.random().toString(36).slice(2)}`))===1&&await t.command("EXPIRE",c,Math.ceil(l/1e3)*2),{allowed:!0,remaining:Math.max(0,a-m-1),resetSeconds:Math.ceil(l/1e3)}}function s(i){let a={"Content-Type":"application/json"};return e.headers&&(a["Retry-After"]=String(i),a["RateLimit-Limit"]=String(e.max),a["RateLimit-Remaining"]="0",a["RateLimit-Reset"]=String(i)),new Response(JSON.stringify({error:e.message,retryAfter:i}),{status:e.statusCode,headers:a})}let o=(async(i,a,l)=>{a.limit=async(d,p)=>{let f=(p?.scope??"ip")==="global"?"":`:${ab(i)}`,w=`${Fn}${d}${f}`,m=p?.max??e.max,g=p?.windowMs??e.windowMs,h=await r(w,m,g);if(!h.allowed){let b=new T(e.message,e.statusCode);throw b.retryAfter=h.resetSeconds,b}};let u=await r(Fn+"global:"+e.key(i),e.max,e.windowMs);if(!u.allowed)return s(u.resetSeconds);let c=await l(i,a);return e.headers&&(c.headers.set("RateLimit-Limit",String(e.max)),c.headers.set("RateLimit-Remaining",String(u.remaining)),c.headers.set("RateLimit-Reset",String(u.resetSeconds))),c});return o.__meta={injects:["limit"],depends:[]},o}var Fn,Jd=I(()=>{"use strict";Ke();Fn="rl:"});function Aa(n){let e=n.apiKey??process.env.EMAIL_API_KEY??process.env.RESEND_API_KEY??"";if(!e)throw new Error("email: \u9700\u8981 apiKey\uFF08EMAIL_API_KEY \u6216\u663E\u5F0F\u4F20\u5165\u2014\u2014\u4E0D\u76F4\u8FDE SMTP\uFF09");let t=n.baseUrl??process.env.EMAIL_API_URL??process.env.RESEND_API_URL??"https://api.resend.com",r=n.timeoutMs??1e4;return{async send(s){let o=new AbortController,i=setTimeout(()=>o.abort(),r),a;try{a=await fetch(`${t}/emails`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({from:s.from??n.from,to:Array.isArray(s.to)?s.to:[s.to],subject:s.subject,text:s.text,html:s.html}),signal:o.signal})}catch(u){throw o.signal.aborted?new T(`email: \u4E0A\u6E38\u8D85\u65F6 after ${r}ms`,502):new T(`email: \u7F51\u7EDC\u9519\u8BEF: ${u instanceof Error?u.message:String(u)}`,502)}finally{clearTimeout(i)}let l={};try{l=await a.json()}catch{}if(!a.ok)throw new T(`email: \u4E0A\u6E38 ${a.status}${l.message?` ${l.message}`:""}`,502);return{id:l.id,accepted:!0}}}}var Oa=I(()=>{"use strict";Ke()});function Jr(n){let e=Array.isArray(n.to)?n.to:[n.to];if(!e.length||e.some(t=>!t.trim()))throw new Error("email: msg.to \u5FC5\u987B\u662F\u975E\u7A7A\u6536\u4EF6\u4EBA\u5217\u8868");if(/[\r\n]/.test(n.from??"")||e.some(t=>/[\r\n]/.test(t)))throw new Error("email: invalid header value (CR/LF not allowed)")}var lo=I(()=>{"use strict"});function Vn(n){let e=[],t=()=>`memory-mail-${e.length}`,r=async o=>(Jr(o),e.push(o),n?.onSend?n.onSend(o):{id:t(),accepted:!0}),s=(async(o,i,a)=>(i.email={send:r},a(o,i)));return s.__meta={injects:["email"],depends:[]},s.send=r,s.sent=e,s}var Ia,Pa=I(()=>{"use strict";lo();Ia=Vn});import lb from"node:http";async function uo(n={}){let e=[],t=[],r=Vn({...n,onSend:async i=>(e.push(i),n.onSend?n.onSend(i):{id:`memory-mail-${e.length}`,accepted:!0})}),s=lb.createServer((i,a)=>{(async()=>{let l=new URL(i.url??"/","http://localhost"),u=[];for await(let f of i)u.push(f);let c=Buffer.concat(u).toString("utf8"),d={method:i.method??"GET",path:l.pathname,headers:Object.fromEntries(Object.entries(i.headers).map(([f,w])=>[f,String(w)])),body:c?JSON.parse(c):{}};t.push(d);let p=n.respond?.(d);if(p){if("hang"in p)return;a.writeHead(p.status,{"Content-Type":"application/json"}),a.end(JSON.stringify(p.body??{}));return}if(i.method==="POST"&&l.pathname==="/emails"){let f=d.body,w=await r.send({to:f.to,subject:f.subject,text:f.text,html:f.html,from:f.from});a.writeHead(200,{"Content-Type":"application/json"}),a.end(JSON.stringify({id:w.id}));return}if(i.method==="GET"&&l.pathname==="/emails"){a.writeHead(200,{"Content-Type":"application/json"}),a.end(JSON.stringify({messages:e}));return}a.writeHead(404,{"Content-Type":"application/json"}),a.end(JSON.stringify({error:"not found"}))})().catch(l=>{a.writeHead(400,{"Content-Type":"application/json"}),a.end(JSON.stringify({error:l instanceof Error?l.message:String(l)}))})});await new Promise(i=>s.listen(n.port??0,"127.0.0.1",i));let o=s.address().port;return{port:o,url:`http://127.0.0.1:${o}`,emails:e,requests:t,closeAllConnections:()=>s.closeAllConnections(),close:()=>new Promise((i,a)=>s.close(l=>l?a(l):i()))}}var Na,Zd=I(()=>{"use strict";Pa();Na=uo});function co(n){if(!n.from)throw new Error("email: options.from is required");let e=n.adapter??Aa({apiKey:n.apiKey,baseUrl:n.baseUrl,timeoutMs:n.timeoutMs,from:n.from}).send,t=async s=>(Jr(s),e(s)),r=(async(s,o,i)=>(o.email={send:t},i(s,o)));return r.__meta={injects:["email"],depends:[]},r.send=t,r}var Ma=I(()=>{"use strict";Oa();lo();lo();Oa();Pa();Zd()});function ub(n,e){let t=n[e];if(t instanceof $t)return t.lit;if(t instanceof qt)return t.values;throw new Error(`z.discriminatedUnion: \u5224\u522B\u5B57\u6BB5\u9700\u4E3A literal/enum\u2014\u2014\u5F97\u5230 ${t?._typeName?.()}`)}var po,ve,Mt,hn,wn,$t,qt,yn,Zr,$a,qa,Xr,Da,ja,zn,Kn,Gn,Yr,es,y,bn=I(()=>{"use strict";po=class extends Error{issues;constructor(e){super(e.map(t=>`${t.path}: ${t.message}`).join("; ")),this.name="ZodError",this.issues=e}},ve=class{_meta={};get metaInfo(){return this._meta}meta(e){return this._meta={...this._meta,...e},this}parse(e){let t=this._parse(e);if(!t.ok)throw new po([{path:t.path??"",message:t.message??"invalid"}]);return t.value}safeParse(e){let t=this._parse(e);return t.ok?{success:!0,data:t.value}:{success:!1,error:new po([{path:t.path??"",message:t.message??"invalid"}])}}optional(){return new zn(this)}nullable(){return new Kn(this)}default(e){return new Gn(this,e)}refine(e,t){return new Yr(this,e,t)}transform(e){return new es(this,e)}},Mt=class extends ve{_typeName(){return"string"}_parse(e){if(typeof e!="string")return{ok:!1,path:"",message:"expected string"};let t=e;return this._min!==void 0&&t.length<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t.length>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:this._pattern&&!this._pattern.test(t)?{ok:!1,path:"",message:"invalid pattern"}:this._email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?{ok:!1,path:"",message:"invalid email"}:this._uuid&&!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)?{ok:!1,path:"",message:"invalid uuid"}:{ok:!0,value:t}}_min;_max;_pattern;_email=!1;_uuid=!1;min(e){return this._min=e,this}max(e){return this._max=e,this}regex(e,t){return this._pattern=e,this}email(){return this._email=!0,this}uuid(){return this._uuid=!0,this}},hn=class extends ve{_typeName(){return"number"}_parse(e){if(typeof e!="number"||Number.isNaN(e))return{ok:!1,path:"",message:"expected number"};let t=e;return this._int&&!Number.isInteger(t)?{ok:!1,path:"",message:"expected integer"}:this._min!==void 0&&t<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:{ok:!0,value:t}}_int=!1;_min;_max;int(){return this._int=!0,this}min(e){return this._min=e,this}max(e){return this._max=e,this}positive(){return this._min=0,this}},wn=class extends ve{_typeName(){return"boolean"}_parse(e){return typeof e!="boolean"?{ok:!1,path:"",message:"expected boolean"}:{ok:!0,value:e}}},$t=class extends ve{lit;constructor(e){super(),this.lit=e}get value(){return this.lit}_typeName(){return"literal"}_parse(e){return e!==this.lit?{ok:!1,path:"",message:`expected literal ${JSON.stringify(this.lit)}`}:{ok:!0,value:e}}},qt=class extends ve{raw;constructor(e){super(),this.raw=e}get values(){return this.raw}_typeName(){return"enum"}_parse(e){return typeof e!="string"||!this.raw.includes(e)?{ok:!1,path:"",message:`expected one of ${this.raw.join(" | ")}`}:{ok:!0,value:e}}},yn=class extends ve{_typeName(){return"datetime"}_parse(e){return typeof e!="string"||Number.isNaN(Date.parse(e))?{ok:!1,path:"",message:"expected datetime string (ISO)"}:{ok:!0,value:e}}},Zr=class extends ve{dims;constructor(e){super(),this.dims=e}_typeName(){return"vector"}_parse(e){return typeof e!="object"||e===null||!Array.isArray(e)||!e.every(t=>typeof t=="number")?{ok:!1,path:"",message:"expected number[] vector"}:this.dims>0&&e.length!==this.dims?{ok:!1,path:"",message:`expected vector(${this.dims})\u2014\u2014got ${e.length} dims`}:{ok:!0,value:e}}},$a=class extends ve{_typeName(){return"json"}_parse(e){return{ok:!0,value:e}}},qa=class n extends ve{shape;constructor(e){super(),this.shape=e}_typeName(){return"object"}_parse(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,path:"",message:"expected object"};let t={},r=[];for(let[s,o]of Object.entries(this.shape)){let i=o._parse(e[s]);if(!i.ok){r.push({path:s,message:i.message??""});continue}t[s]=i.value}return r.length?{ok:!1,path:r[0].path,message:r[0].message}:{ok:!0,value:t}}pick(e){let t={};for(let r of e)t[r]=this.shape[r];return new n(t)}omit(e){let t={};for(let[r,s]of Object.entries(this.shape))e.includes(r)||(t[r]=s);return new n(t)}extend(e){return new n({...this.shape,...e})}},Xr=class extends ve{inner;constructor(e){super(),this.inner=e}get itemSchema(){return this.inner}_typeName(){return"array"}_parse(e){if(!Array.isArray(e))return{ok:!1,path:"",message:"expected array"};if(this._min!==void 0&&e.length<this._min)return{ok:!1,path:"",message:`too small (min ${this._min})`};if(this._max!==void 0&&e.length>this._max)return{ok:!1,path:"",message:`too big (max ${this._max})`};let t=[];for(let r=0;r<e.length;r++){let s=this.inner._parse(e[r]);if(!s.ok)return{ok:!1,path:`${r}`,message:s.message};t.push(s.value)}return{ok:!0,value:t}}_min;_max;min(e){return this._min=e,this}max(e){return this._max=e,this}},Da=class extends ve{options;constructor(e){super(),this.options=e}_typeName(){return"union"}_parse(e){let t=null;for(let r of this.options){let s=r._parse(e);if(s.ok)return{ok:!0,value:s.value};t||(t={path:s.path??"",message:s.message??""})}return{ok:!1,path:"",message:`expected union (${t?.message})`}}},ja=class extends ve{disc;options;discValueOf;constructor(e,t,r){super(),this.disc=e,this.options=t,this.discValueOf=r}_typeName(){return"disUnion"}_parse(e){if(typeof e!="object"||e===null)return{ok:!1,path:"",message:"expected object"};let t=e[this.disc];for(let r of this.options)if(this.discValueOf(r.shape)===t){let s=r._parse(e);return s.ok?{ok:!0,value:s.value}:{ok:!1,path:`(${String(t)})`,message:s.message??""}}return{ok:!1,path:this.disc,message:`invalid discriminator value ${JSON.stringify(t)}`}}};zn=class extends ve{inner;constructor(e){super(),this.inner=e}_typeName(){return"optional"}_parse(e){return e===void 0?{ok:!0,value:void 0}:this.inner._parse(e)}},Kn=class extends ve{inner;constructor(e){super(),this.inner=e}_typeName(){return"nullable"}_parse(e){return e===null?{ok:!0,value:null}:this.inner._parse(e)}},Gn=class extends ve{inner;d;constructor(e,t){super(),this.inner=e,this.d=t}_typeName(){return"default"}_parse(e){if(e===void 0){let t=typeof this.d=="function"?this.d():this.d;return this.inner._parse(t)}return this.inner._parse(e)}},Yr=class extends ve{inner;fn;msg;constructor(e,t,r){super(),this.inner=e,this.fn=t,this.msg=r}_typeName(){return"effects"}_parse(e){let t=this.inner._parse(e);return t.ok?this.fn(t.value)?{ok:!0,value:t.value}:{ok:!1,path:"",message:this.msg??"refine failed"}:{ok:!1,path:t.path??"",message:t.message??""}}},es=class extends ve{inner;fn;constructor(e,t){super(),this.inner=e,this.fn=t}_typeName(){return"transform"}_parse(e){let t=this.inner._parse(e);return t.ok?{ok:!0,value:this.fn(t.value)}:{ok:!1,path:t.path??"",message:t.message??""}}},y={string:()=>new Mt,number:()=>new hn,boolean:()=>new wn,literal:n=>new $t(n),enum:n=>new qt(n),date:()=>new yn,uuid:()=>new Mt().uuid(),json:()=>new $a,vector:n=>new Zr(n),object:n=>new qa(n),array:n=>new Xr(n),union:n=>new Da(n),discriminatedUnion:(n,e)=>new ja(n,e,t=>ub(t,n))}});function Qn(n,e){return n.meta(e)}function mo(n){let e={},t;for(let[o,i]of Object.entries(n.fields)){let a=i.metaInfo??{};e[o]={column:a.column??o,...a.pk?{pk:!0}:{},...a.unique?{unique:!0}:{},...a.notNull?{notNull:!0}:{},...a.default!==void 0?{default:a.default}:{},...a.references?{references:a.references}:{},...a.onDelete?{onDelete:a.onDelete}:{}},a.pk&&(t=o)}let r={table:n.table,fields:n.fields,dbFields:e,pkField:t},s=o=>{let i=e[o];return i?.default==="random"||i?.default==="now"};return r.insertSchema=(o={})=>{let i={};for(let[a,l]of Object.entries(n.fields)){if(s(a)||o.omit?.includes(a))continue;let u=l,c=u._typeName?.()==="nullable";i[a]=e[a]?.default!==void 0||c?u.optional():u}return Xd(y.object(i))},r.toDb=o=>{let i={},a=o;for(let[l,u]of Object.entries(a)){let c=e[l];i[c?.column??l]=u}return i},r.fromDb=o=>{let i={},a=o;for(let[l,u]of Object.entries(e))a[u.column??l]!==void 0&&(i[l]=a[u.column??l]);for(let l of Object.keys(a))!Object.values(e).some(c=>c.column===l)&&!(l in i)&&(i[l]=a[l]);return i},r.updateSchema=(o={})=>{let i={};for(let[a,l]of Object.entries(n.fields))s(a)||o.omit?.includes(a)||(i[a]=l.optional());return Xd(y.object(i))},r}function Xd(n){return n.transform(e=>typeof e!="object"||e===null?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)))}var R,Jn=I(()=>{"use strict";bn();R={pk:n=>Qn(n,{pk:!0,default:"random"}),req:n=>Qn(n,{notNull:!0}),col:(n,e)=>Qn(n,{column:e}),now:n=>Qn(n,{default:"now"}),unique:n=>Qn(n,{unique:!0}),dflt:(n,e)=>Qn(n,{default:e})}});import{randomBytes as cb,scrypt as db,timingSafeEqual as pb}from"node:crypto";import{promisify as mb}from"node:util";async function vt(n){let e=cb(16),t=await Yd(n,e,fb,fo);return`scrypt$${fo.N}$${fo.r}$${fo.p}$${e.toString("hex")}$${t.toString("hex")}`}async function Dt(n,e){let t=e.split("$");if(t.length!==6||t[0]!=="scrypt")return!1;let[,r,s,o,i,a]=t,l=Buffer.from(a,"hex"),u=await Yd(n,Buffer.from(i,"hex"),l.length,{N:Number(r),r:Number(s),p:Number(o)});return u.length===l.length&&pb(u,l)}var Yd,fb,fo,La=I(()=>{"use strict";Yd=mb(db),fb=64,fo={N:16384,r:8,p:1}});import{createHash as gb,createHmac as tp,randomBytes as hb,timingSafeEqual as wb}from"node:crypto";function Zn(n,e,t){let r=Math.floor(Date.now()/1e3),s=`${ep({alg:"HS256",typ:"JWT"})}.${ep({...n,iat:r,exp:r+t})}`,o=tp("sha256",e).update(s).digest("base64url");return`${s}.${o}`}function jt(n,e){let t=n.split(".");if(t.length!==3)return null;let[r,s,o]=t,i=`${r}.${s}`,a=tp("sha256",e).update(i).digest("base64url"),l=Buffer.from(o),u=Buffer.from(a);if(l.length!==u.length||!wb(l,u))return null;try{let c=JSON.parse(Buffer.from(s,"base64url").toString("utf8"));return typeof c.exp=="number"&&c.exp<Date.now()/1e3?null:c}catch{return null}}function go(){return hb(32).toString("hex")}function ho(n){return gb("sha256").update(n).digest("hex")}var ep,wo=I(()=>{"use strict";ep=n=>Buffer.from(JSON.stringify(n)).toString("base64url")});import{randomBytes as np}from"node:crypto";function Ua(n){if(n.length<sp)throw new T(`password must be at least ${sp} characters`,400);if(n.length>_b)throw new T("password is too long",400)}function Lt(n){return n.trim().toLowerCase()}async function ip(n){op??=await vt("dummy-timing-equalize-password"),await Dt(n,op)}function bo(n){let e=n.orm,t=e.table(yb,yo.users),r=e.table(bb,yo.sessions),s=e.table(Wa,yo.apps),o=e.table(rp,yo.members),i=n.secret??process.env.AUTH_SECRET;if(!i)throw new Error("userSystem: secret is required \u2014 pass options.secret or set AUTH_SECRET (at least 32 chars)");if(i.length<16)throw new Error("userSystem: secret must be at least 16 characters");let a=i,l=n.hooks,u=n.allowedRoles??["owner","admin","member","viewer"],c=n.sso??null,d=n.inviteRoles??u;function p(U){if(U!==void 0&&!u.includes(U))throw new T(`invalid role: ${U}\uFF08allowed: ${u.join("/")}\uFF09`,403)}let f=n.accessTtlSeconds??3600,w=n.refreshTtlDays??30,m=n.prefix??"/api/auth",g=U=>({id:String(U.id),email:U.email,name:U.name,role:U.role,tenant:U.tenant}),h=168*3600;async function b(U){let F=await t.select("id","email","name","role","tenant").where({id:{eq:U}}).run();return F.length?F[0]:null}async function k(U,F){(await o.select("role").where({app_id:{eq:Be},user_id:{eq:U}}).run()).length||await o.insert({app_id:Be,user_id:U,role:"member",invited_by:null,source:F}).onConflict().run()}async function _(U,F){let K=await o.select("role").where({app_id:{eq:U},user_id:{eq:F}}).run();return K.length?String(K[0].role):null}async function v(U){let F=await s.select("id").where({slug:{eq:U}}).run();return F.length?String(F[0].id):null}async function S(U){let F=await t.select("id","email","name","role","tenant").where({email:{eq:U}}).run();return F.length?F[0]:null}async function A(U){return(await e.query.from(`${rp} m`).select("m.app_id","m.role","a.id","a.slug","a.name").join(`${Wa} a`,{"a.id":{col:"m.app_id"}}).where({"m.user_id":{eq:U}}).run()).filter(K=>!String(K.slug).startsWith("_")).map(K=>({id:String(K.id),slug:String(K.slug),name:String(K.name),role:String(K.role)}))}async function C(U,F){let K=Zn({sub:U.id,...U.email?{email:U.email}:{},...U.name?{name:U.name}:{},...F?.appId?{appId:F.appId,role:F.role}:{},...!F?.appId&&U.tenant?{tenantId:U.tenant}:{}},a,f),M=go(),O=new Date(Date.now()+w*24*3600*1e3);return await r.insert({token_hash:ho(M),user_id:U.id,expires_at:O.toISOString(),...F?.appId?{app_id:F.appId}:{}}).run(),{token:K,refreshToken:M}}async function W(U){let F=await r.update({revoked_at:new Date().toISOString()}).where({token_hash:{eq:ho(U)},revoked_at:{isNull:!0}}).returning("user_id","expires_at","app_id").run();if(!F.length)throw new T("Invalid refresh token",401);let K=F[0];if(new Date(String(K.expires_at))<new Date)throw new T("Refresh token expired",401);let M=await b(K.user_id);if(!M)throw new T("User not found",401);return{user:M,appId:K.app_id?String(K.app_id):void 0}}let G=(async(U,F,K)=>{let M=null,O=null,E={},x,P,N,D=U.headers.get("authorization"),q=null;if(D?.startsWith("Bearer "))q=D.slice(7);else if(U.method==="GET"){let $=new URL(U.url??"","http://localhost"),j=$.searchParams.get("ticket");if(j){let H=jt(j,a);H?.type==="download"&&H?.sub&&(O=await b(String(H.sub)),M=O,E.userId=String(H.sub),H.appId!=null&&(P=H.appId,E.appId=String(H.appId)))}else q=$.searchParams.get("token")}if(q&&!O){let $=jt(q,a);if($?.sub){O=await b(String($.sub)),M=O;for(let[j,H]of Object.entries($))j==="sub"||j==="iat"||j==="exp"||j==="type"||(E[j]=H);E.userId=String($.sub),x=$.tenantId,P=$.appId,N=$.role}}F.user=O,P!=null&&(F.appId=String(P)),F.session=P!=null?{userId:String(O.id),appId:String(P),role:String(N??"")}:null,x!=null&&(F.tenantId=String(x));let B={...E,async register($){if(!$.email||!$.password)throw new T("email and password are required",400);Ua($.password);let j=Lt($.email),H=await vt($.password),z=await t.insert({email:j,password_hash:H,name:$.name??null,role:null,tenant:$.tenant??null}).run(),Y=g(z[0]),ee=await C(Y);return await k(Y.id,"register"),M=Y,{...ee,user:Y}},async registerWithApp($){let j=await this.register({email:$.email,password:$.password,name:$.name});await k(j.user.id,"register");let H=($.appSlug??$.email.split("@")[1]??"default").trim().toLowerCase(),z=H;for(let te=1;te<=200&&await v(z);te++)z=`${H}-${te}`;let Y=await this.createApp({slug:z,name:$.appName??`${$.name??"\u7528\u6237"} \u7684\u5E94\u7528`,openRegistration:!1}),ee=await C(j.user,{appId:Y.id,role:"owner"});return await l?.onRegisterApp?.(j.user.id,Y),{...ee,user:j.user,app:{...Y,role:"owner"}}},async login($,j){let z=(await t.select("id","email","password_hash","name","role","tenant").where({email:{eq:Lt($)}}).run())[0];if(!z||z.password_hash==null)throw await ip(j),new T("Invalid email or password",401);if(!await Dt(j,String(z.password_hash)))throw new T("Invalid email or password",401);let ee={id:String(z.id),email:String(z.email),name:z.name,role:z.role,tenant:z.tenant},te=await C(ee),ge=await A(ee.id);return M=ee,{...te,user:ee,apps:ge}},async logout($){await r.update({revoked_at:new Date().toISOString()}).where({token_hash:{eq:ho($)}}).run()},requireAuth(){if(!O)throw new T("Unauthorized",401);return O},async setPassword($,j){Ua(j);let H=await vt(j);await t.update({password_hash:H}).where({id:{eq:$}}).run()},createToken($,j,H){return Zn({type:$,...j},a,H.ttlSeconds)},async createApp($){if(!M)throw new T("Unauthorized",401);if(!$.slug||!$.name)throw new T("slug and name are required",400);let j=$.slug.trim().toLowerCase();if(j.startsWith("_"))throw new T("slug \u4EE5 _ \u5F00\u5934\u4E3A\u7CFB\u7EDF\u4FDD\u7559\u540D",400);if(!await _(Be,M.id))throw new T("\u4EC5\u5E94\u7528\u7BA1\u7406\u9762\uFF08_builtin\uFF09\u6210\u5458\u53EF\u521B\u5EFA\u5E94\u7528",403);let z=np(32).toString("hex"),ee=(await s.insert({slug:j,name:$.name,owner_user_id:M.id,open_registration:$.openRegistration??!1,app_key:z}).run())[0];return await o.insert({app_id:ee.id,user_id:M.id,role:"owner",invited_by:M.id}).run(),ee},async registerInApp($){if(!$.email||!$.password)throw new T("email and password are required",400);Ua($.password);let j=await s.select("id","open_registration").where({slug:{eq:$.appSlug}}).run();if(!j.length)throw new T("Application not found",404);let H=j[0],z=String(H.id),Y=Lt($.email),ee="member";if(!H.open_registration){if(!$.inviteToken)throw new T("Registration closed for this application",403);let pe=jt($.inviteToken,a);if(!pe||pe.type!=="app-invite"||pe.appId!==z)throw new T("Invalid invite",403);if(pe.email&&String(pe.email)!==Y)throw new T("Invite email mismatch",403);typeof pe.role=="string"&&pe.role!=="owner"&&(p(pe.role),ee=pe.role)}let te=await S(Y);if(!te){let pe=await vt($.password),xe=await t.insert({email:Y,password_hash:pe,name:$.name??null,role:null,tenant:null}).onConflict("email").run();if(te=xe.length?g(xe[0]):await S(Y),!te)throw new T("User creation failed",500)}await k(te.id,"register"),await _(z,te.id)||await o.insert({app_id:z,user_id:te.id,role:ee,invited_by:M?.id??null,source:"invite"}).onConflict().run();let Ce=await C(te,{appId:z,role:ee});return await o.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:z},user_id:{eq:te.id}}).run(),M=te,await l?.onJoinApp?.(te.id,z,ee),{...Ce,user:te}},async loginApp($,j,H){let z=await s.select("id").where({slug:{eq:$}}).run();if(!z.length)throw new T("Application not found",404);let Y=String(z[0].id),te=(await t.select("id","email","password_hash","name","role","tenant").where({email:{eq:Lt(j)}}).run())[0];if(!te||te.password_hash==null)throw await ip(H),new T("Invalid email or password",401);if(!await Dt(H,String(te.password_hash)))throw new T("Invalid email or password",401);let Ce=await _(Y,String(te.id));if(!Ce)throw new T("Not a member of this application",401);let pe={id:String(te.id),email:String(te.email),name:te.name,role:te.role,tenant:te.tenant},xe=await C(pe,{appId:Y,role:Ce});return await o.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:Y},user_id:{eq:pe.id}}).run(),M=pe,{...xe,user:pe,role:Ce}},async ssoLogin($,j){let H=Lt($),z=await S(H);if(!z){let te=await t.insert({email:H,password_hash:null,name:j?.name??null,role:null,tenant:null}).onConflict("email").run();if(z=te.length?g(te[0]):await S(H),!z)throw new T("User creation failed",500)}await k(z.id,"sso");let Y;j?.appId&&(await _(j.appId,z.id)||await o.insert({app_id:j.appId,user_id:z.id,role:"member",invited_by:null,source:"sso"}).onConflict().run(),Y=j.appId,await o.update({last_login_at:new Date().toISOString()}).where({app_id:{eq:j.appId},user_id:{eq:z.id}}).run());let ee=await C(z,Y?{appId:Y,role:"member"}:void 0);return M=z,{...ee,user:z}},async createInvite($,j){if($===Be)throw new T("_builtin \u4E0D\u8D70\u9080\u8BF7\u6D41\uFF08\u4EFB\u547D\u5236\uFF09",403);if(j.role!==void 0&&!d.includes(j.role))throw new T(`invite role not allowed: ${j.role}\uFF08allowed: ${d.join("/")}\uFF09`,403);if(!M)throw new T("Unauthorized",401);if(await _($,M.id)!=="owner")throw new T("Owner only",403);let z=j.role&&j.role!=="owner"?j.role:"member";return{inviteToken:Zn({type:"app-invite",appId:$,...j.email?{email:Lt(j.email)}:{},role:z},a,h)}},async addMember($,j,H){if(p(H),$===Be&&H!==void 0&&H==="viewer")throw new T("_builtin \u65E0\u53EA\u8BFB\uFF08viewer \u7981\u2014\u2014\u7BA1\u7406\u9762\u8EAB\u4EFD\uFF09",403);if(!M)throw new T("Unauthorized",401);if(await _($,M.id)!=="owner")throw new T("Owner only",403);let Y=await t.select("id").where({email:{eq:Lt(j)}}).run();if(!Y.length)throw new T("User not found \u2014 invite them to register first",400);let ee=H&&H!=="owner"?H:"member";await o.insert({app_id:$,user_id:String(Y[0].id),role:ee,invited_by:M.id}).run()},async setOpenRegistration($,j){if(!M)throw new T("Unauthorized",401);if($===Be)throw new T("_builtin \u6CE8\u518C\u5F00\u5173\u6052 false",403);if(await _($,M.id)!=="owner")throw new T("Owner only",403);await s.update({open_registration:j}).where({id:{eq:$}}).run()},async listMyApps(){if(!M)throw new T("Unauthorized",401);return A(M.id)},async requireApp($){if(!M)throw new T("Unauthorized",401);let j=await _($,M.id);if(!j)throw new T("Not a member of this application",403);return{userId:M.id,appId:$,role:j}}};return F.auth=B,K(U,F)});return G.__meta={injects:["user","auth"],depends:[]},G.seedBuiltinOwners=async U=>{let F={owner:null,admins:[]};for(let K of U){let M=Lt(K);if(!M)continue;let O=await S(M);if(!O){let x=await t.insert({email:M,password_hash:null,name:null,role:null,tenant:null}).onConflict("email").run();O=x.length?g(x[0]):await S(M)}if(!O)continue;let E=await o.select("role").where({app_id:{eq:Be},user_id:{eq:O.id}}).run();if(E.length){String(E[0].role??"")==="owner"?F.owner=String(O.id):F.admins.push(String(O.id));continue}if(F.owner)await o.insert({app_id:Be,user_id:String(O.id),role:"admin",invited_by:F.owner,source:"seed"}).run(),F.admins.push(String(O.id));else{await o.insert({app_id:Be,user_id:String(O.id),role:"owner",invited_by:null,source:"seed"}).run(),F.owner=String(O.id);let x=await v("_default");x&&(await _(x,String(O.id))||await o.insert({app_id:x,user_id:String(O.id),role:"owner",invited_by:null,source:"seed"}).run())}}return F},G.migrate=async()=>{(await s.select("id").where({slug:{eq:"_builtin"}}).run()).length||await e.query.insert(Wa).values({id:Be,slug:"_builtin",name:"System",owner_user_id:null,open_registration:!1}).returning("id").run();let F=await s.select("id").where({app_key:{isNull:!0}}).run();for(let E of F)await s.update({app_key:np(32).toString("hex")}).where({id:{eq:String(E.id)}}).run();(await s.select("id").where({slug:{eq:"_default"}}).run()).length||await s.insert({slug:"_default",name:"Default",owner_user_id:null,open_registration:!1}).run();let M=await v("_default");if(M){let E=await o.select("user_id").where({app_id:{eq:Be},role:{eq:"owner"}}).run();for(let x of E){let P=String(x.user_id);await _(M,P)||await o.insert({app_id:M,user_id:P,role:"owner",invited_by:null,source:"migrate"}).onConflict().run()}}let O=await t.select("id").run();for(let E of O)await k(String(E.id),"migrate")},G.routes=(U,F)=>{let K=F?.prefix??m,M=new Set(F?.exclude??[]);if(M.has("register")||U.post(`${K}/register`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await E.auth.register(x);return et(P)}),M.has("register")||U.post(`${K}/register-app`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await E.auth.registerWithApp(x);return et(P)}),M.has("login")||U.post(`${K}/login`,async(O,E)=>{let x=await O.json().catch(()=>({}));if(!x.email||!x.password)return Ue("email and password are required");let P=await E.auth.login(x.email,x.password);return Me(P)}),M.has("logout")||U.post(`${K}/logout`,async(O,E)=>{let x=await O.json().catch(()=>({}));return x.refreshToken?(await E.auth.logout(x.refreshToken),gn()):Ue("refreshToken is required")}),M.has("refresh")||U.post(`${K}/refresh`,async(O,E)=>{let x=await O.json().catch(()=>({}));if(!x.refreshToken)throw new T("refreshToken is required",400);let{user:P,appId:N}=await W(x.refreshToken),D;if(N){let B=await _(N,P.id);B&&(D={appId:N,role:B})}let q=await C(P,D);return Me({...q,user:P})}),M.has("me")||U.get(`${K}/me`,async(O,E)=>{if(!E.user)throw new T("Unauthorized",401);return Me({user:E.user,session:E.session??null})}),c){let O=`${K}/apps/_builtin/auth/sso`;U.get(`${O}/enabled`,async()=>Me({enabled:!0,appSlug:c.defaultAppSlug??null})),U.get(`${O}/login`,async E=>{let P=new URL(E.url??"","http://localhost").searchParams.get("app")??c.defaultAppSlug,N=new URLSearchParams({response_type:"code",client_id:c.clientId,redirect_uri:c.redirectBase?`${c.redirectBase.replace(/\/$/,"")}${O}/callback`:`${new URL(E.url,"http://localhost").origin}${O}/callback`,scope:c.scope??"openid email profile",state:P??"sso"});return new Response(null,{status:302,headers:{Location:`${c.issuer.replace(/\/$/,"")}/authorize?${N}`}})}),U.get(`${O}/callback`,async(E,x)=>{let P=new URL(E.url??"","http://localhost"),N=P.searchParams.get("code");if(!N)throw new T("SSO \u56DE\u8C03\u7F3A\u5C11 code",400);let D=c.redirectBase?`${c.redirectBase.replace(/\/$/,"")}${O}/callback`:`${P.origin}${O}/callback`,q=await fetch(`${c.issuer.replace(/\/$/,"")}/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:N,redirect_uri:D,client_id:c.clientId,client_secret:c.clientSecret})});if(!q.ok)throw new T("SSO token \u4EA4\u6362\u5931\u8D25",401);let B=await q.json(),$=await fetch(`${c.issuer.replace(/\/$/,"")}/userinfo`,{headers:{Authorization:`Bearer ${B.access_token}`}});if(!$.ok)throw new T("SSO \u7528\u6237\u4FE1\u606F\u83B7\u53D6\u5931\u8D25",401);let j=await $.json(),H=(j.email??"").trim().toLowerCase();if(!H)throw new T("SSO \u672A\u8FD4\u56DE\u90AE\u7BB1\uFF08\u9700\u8981 email scope\uFF09",401);let z=P.searchParams.get("state"),Y;if(z&&z!=="sso"){let ge=await v(z);ge&&(Y=ge)}let ee=await x.auth.ssoLogin(H,{appId:Y,name:j.name});await l?.onSsoLogin?.(ee.user.id,Y);let te={token:ee.token,refreshToken:ee.refreshToken,user:ee.user};if(c.renderCallback){let ge=c.renderCallback(te);return typeof ge=="string"?new Response(ge,{headers:{"Content-Type":"text/html; charset=utf-8"}}):ge}return Me(te)})}M.has("apps")||(U.post(`${K}/apps`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await E.auth.createApp(x);return et({app:P})}),U.get(`${K}/apps`,async(O,E)=>{let x=await E.auth.listMyApps();return Me({apps:x})}),U.post(`${K}/apps/:appSlug/auth/members`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await v(E.params.appSlug);if(!P)throw new T("Application not found",404);return await E.auth.addMember(P,x.email??"",x.role),et({ok:!0})}),U.post(`${K}/apps/:appSlug/auth/invites`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await v(E.params.appSlug);if(!P)throw new T("Application not found",404);let N=await E.auth.createInvite(P,{email:x.email,role:x.role});return et(N)}),U.post(`${K}/apps/:appSlug/auth/login`,async(O,E)=>{let x=await O.json().catch(()=>({}));if(!x.email||!x.password)return Ue("email and password are required");let P=await E.auth.loginApp(E.params.appSlug,x.email,x.password);return Me(P)}),U.patch(`${K}/apps/:appSlug/auth/registration`,async(O,E)=>{let x=await O.json().catch(()=>({}));if(typeof x.open!="boolean")return Ue("open is required (boolean)");let P=await v(E.params.appSlug);if(!P)throw new T("Application not found",404);return await E.auth.setOpenRegistration(P,x.open),Me({open:x.open})}),U.post(`${K}/apps/:appSlug/auth/verify`,async(O,E)=>{let x=O.headers.get("x-wf-app-id"),P=O.headers.get("x-wf-app-key");if(!x||!P)return Ue("X-Wf-App-Id / X-Wf-App-Key required");let N=await s.select("id","slug","name").where({id:{eq:x},app_key:{eq:P}}).run();if(!N.length)throw new T("Invalid app credentials",403);let D=N[0];return Me({app:{id:String(D.id),slug:String(D.slug),name:String(D.name)}})}),U.post(`${K}/apps/:appSlug/auth/register`,async(O,E)=>{let x=await O.json().catch(()=>({})),P=await E.auth.registerInApp({appSlug:E.params.appSlug,email:x.email??"",password:x.password??"",name:x.name,inviteToken:x.inviteToken});return et(P)}))},G.asAppAuth=()=>G,G}var yo,yb,bb,Wa,Be,rp,sp,_b,op,_o,ap=I(()=>{"use strict";Ke();bn();Jn();La();wo();Hn();yo={users:{id:R.pk(y.uuid()),email:R.req(y.string()).meta({unique:!0}),password_hash:y.string().nullable(),name:y.string().nullable(),role:y.string().nullable(),tenant:y.string().nullable(),email_verified:y.boolean().meta({notNull:!0,default:!1}),created_at:R.now(y.date())},sessions:{token_hash:R.req(y.string()),user_id:R.req(y.uuid()),app_id:y.string().nullable(),expires_at:R.req(y.date()),revoked_at:y.date().nullable(),created_at:R.now(y.date())},apps:{id:R.pk(y.uuid()),slug:R.req(y.string()).meta({unique:!0}),name:R.req(y.string()),owner_user_id:y.uuid().nullable(),open_registration:y.boolean().meta({notNull:!0,default:!1}),app_key:y.string().nullable(),created_at:R.now(y.date())},members:{app_id:R.req(y.uuid()),user_id:R.req(y.uuid()),role:y.string().meta({notNull:!0,default:"member"}),invited_by:y.uuid().nullable(),joined_at:R.now(y.date()),source:y.string().nullable(),last_login_at:y.date().nullable()}},yb="_weifuwu_users",bb="_weifuwu_sessions",Wa="_weifuwu_apps",Be="00000000-0000-4000-8000-0000000000b1",rp="_weifuwu_app_members",sp=8,_b=1024;op=null;_o={tables:[{name:"_weifuwu_users",columns:{id:R.pk(y.uuid()),email:R.req(y.string()).meta({unique:!0}),password_hash:y.string(),name:y.string(),role:y.string(),tenant:y.string(),email_verified:y.boolean().meta({default:!1}),created_at:y.date().meta({default:"now"})},dropNotNull:["password_hash"]},{name:"_weifuwu_sessions",columns:{token_hash:y.string().meta({pk:!0}),user_id:R.req(y.uuid()).meta({references:"_weifuwu_users",onDelete:"cascade"}),app_id:y.string(),expires_at:y.date().meta({notNull:!0}),revoked_at:y.date(),created_at:y.date().meta({default:"now"})}},{name:"_weifuwu_apps",columns:{id:R.pk(y.uuid()),slug:R.req(y.string()).meta({unique:!0}),name:R.req(y.string()),owner_user_id:y.uuid().meta({references:"_weifuwu_users",onDelete:"cascade"}),open_registration:y.boolean().meta({default:!1}),created_at:y.date().meta({default:"now"}),app_key:y.string()}},{name:"_weifuwu_app_members",columns:{app_id:R.req(y.uuid()).meta({references:"_weifuwu_apps",onDelete:"cascade"}),user_id:R.req(y.uuid()).meta({references:"_weifuwu_users",onDelete:"cascade"}),role:y.string().meta({default:"member"}),invited_by:y.uuid(),joined_at:y.date().meta({default:"now"}),source:y.string(),last_login_at:y.date()},uniques:[["app_id","user_id"]]}]}});function lp(n){return async(t,r,s)=>{let o=null,i=null,a=t.headers.get("authorization");if(a?.startsWith("Bearer ")&&(i=a.slice(7)),!i){let l=new URL(t.url??"","http://localhost").searchParams.get("token");l&&(i=l)}if(i){let l=jt(i.trim(),n.secret);if(l?.sub&&(n.verifyToken&&(await n.verifyToken(i.trim())||(l.sub="")),l.sub)){let u=typeof l.appId=="string"?l.appId:void 0;o=u?{userId:String(l.sub),appId:u,role:String(l.role??"")}:null,r.user={id:String(l.sub),...typeof l.email=="string"?{email:l.email}:{},...typeof l.name=="string"?{name:l.name}:{}}}}if(r.session=o,r.auth={requireAuth(){if(!o)throw new T("Unauthorized",401);return o},get userId(){return o?.userId},get appId(){return o?.appId},get role(){return o?.role}},o&&(r.appId=o.appId),n.builtin){let{baseUrl:l,appId:u,appKey:c}=n.builtin,d=async(p,f)=>{let w=await fetch(`${l.replace(/\/$/,"")}${p}`,{...f,headers:{"Content-Type":"application/json","X-Wf-App-Id":u,"X-Wf-App-Key":c,...f?.headers}});if(!w.ok)throw new T(`builtin \u8C03\u7528\u5931\u8D25 HTTP ${w.status}`,w.status);return w.json()};r.builtin={get:p=>d(p),post:(p,f)=>d(p,{method:"POST",body:JSON.stringify(f??{})})}}return s(t,r)}}var up=I(()=>{"use strict";wo();Ke()});function vb(n){let e=n.__shape;return e||n}function kb(n,e){if(n instanceof se)return n;let t=n?.issues;if(Array.isArray(t)&&t.length){let r=t.map(s=>`${s.path?`${s.path}: `:""}${s.message}`).join("\uFF1B");return new se(`\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF08${e}\uFF09\uFF1A${r}`)}return new se(`\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF08${e}\uFF09\uFF1A${n instanceof Error?n.message:String(n)}`)}async function Wt(n,e,t={}){let r=vb(e),s;try{s=await n.json()}catch{throw new se("\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF1A\u8BF7\u6C42\u4F53\u4E0D\u662F\u5408\u6CD5 JSON\uFF08content-type \u5E94\u4E3A application/json\uFF09")}if(typeof s!="object"||s===null||Array.isArray(s))throw new se("\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF1Abody \u5FC5\u987B\u4E3A\u5BF9\u8C61");let o=t.variant==="patch"?r.updateSchema({omit:t.omit}):r.insertSchema({omit:t.omit});try{return o.parse(s)}catch(i){throw kb(i,r.table)}}var cp=I(()=>{"use strict";ye()});function Sb(n){let e=n;for(;;){let t=e.inner;if(t&&typeof e._typeName=="string"&&["optional","nullable","default","effects","transform"].includes(e._typeName))e=t;else break}return e}function xb(n,e){let r=Sb(n.fields[e]).values;return Array.isArray(r)?r.map(String):void 0}function Xn(n,e,t={}){let r=t.maxLimit??100,s=t.defaultLimit??20,i=e.__shape??e,a=n.searchParams,l=Object.keys(i.fields),u=new Set(l),c={};for(let[m,g]of a.entries()){if(m==="sort"||m==="limit"||m==="offset")continue;let h=xb(i,m);if(h&&!h.includes(g))throw new Error(`invalid enum value for ${m}: ${g}\uFF08\u5141\u8BB8\uFF1A${h.join(" | ")}\uFF09`);c[m]={eq:g}}let d=[],p=a.get("sort");if(p)for(let m of p.split(",")){let g=m.startsWith("-")?"desc":"asc",h=g==="desc"?m.slice(1):m;if(!u.has(h))throw new Error(`invalid sort field: ${h}`);d.push({field:h,dir:g})}let f=Math.min(r,Math.max(1,parseInt(a.get("limit")??String(s),10)||s)),w=Math.max(0,parseInt(a.get("offset")??"0",10)||0);return{filter:c,sort:d,limit:f,offset:w}}var Ba=I(()=>{"use strict";Hn()});function ko(n){return n.inner}function Ut(n){let e=n._typeName();switch(e){case"string":return n._uuid?"UUID":"TEXT";case"number":return n._int?"INT":"DOUBLE PRECISION";case"boolean":return"BOOLEAN";case"datetime":return"TIMESTAMPTZ";case"json":case"object":case"array":return"JSONB";case"vector":return"JSONB";case"enum":return"TEXT";case"optional":case"nullable":case"default":case"effects":case"transform":return Ut(ko(n)??n);default:throw new Error(`schema: \u65E0\u6CD5\u6620\u5C04 zod \u7C7B\u578B ${e}\uFF08\u5217\u578B\u6CE8\u89E3 columnTypes \u53EF\u8986\u76D6\uFF09`)}}function Ha(n){if(n._typeName()==="enum")return(n.values??[]).map(String);let e=ko(n);return e?Ha(e):void 0}function vo(n){return n===null?"NULL":typeof n=="number"||typeof n=="bigint"?String(n):typeof n=="boolean"?n?"TRUE":"FALSE":typeof n=="string"?`'${n.replace(/'/g,"''")}'`:`'${JSON.stringify(n).replace(/'/g,"''")}'::JSONB`}function ts(n){let e=[];for(let t of n.extensions??[])e.push({kind:"ddl",op:"createExtension",table:t});for(let t of n.enums??[]){e.push({kind:"ddl",op:"createEnum",table:t.name,enumValues:t.values});for(let r of t.values)e.push({kind:"ddl",op:"alterEnumAddValue",table:t.name,enumValues:[r]})}for(let t of n.tables)e.push(...Ob(t));return e}function So(n){let e=[];for(let t of n)e.push(...Rb(t));return e.join(`
17
+ `)}function Rb(n){switch(n.op){case"createExtension":return[`CREATE EXTENSION IF NOT EXISTS ${n.table};`];case"createEnum":return[`DO $$ BEGIN
18
18
  CREATE TYPE ${n.table} AS ENUM (${(n.enumValues??[]).map(e=>`'${e.replace(/'/g,"''")}'`).join(", ")});
19
19
  EXCEPTION WHEN duplicate_object THEN NULL;
20
20
  END $$;`];case"alterEnumAddValue":return[(n.enumValues??[]).map(e=>`ALTER TYPE ${n.table} ADD VALUE IF NOT EXISTS '${e.replace(/'/g,"''")}';`).join(`
21
- `)].filter(Boolean);case"createTable":return[Ab(n)];case"alterAddColumn":return[`ALTER TABLE ${n.table} ADD COLUMN IF NOT EXISTS ${n.column} ${n.columnType}${Tb(n)}${n.columnType&&!Cb(n)?" NOT NULL":""};`];case"alter":return(n.dropNotNull??[]).length?[`ALTER TABLE ${n.table} ALTER COLUMN ${(n.dropNotNull??[]).join(", ")} DROP NOT NULL;`]:[];case"createIndex":return[Ob(n)];default:return[]}}function Tb(n){return n.defaultVal===void 0?"":typeof n.defaultVal=="object"&&n.defaultVal!==null&&"__now"in n.defaultVal?" DEFAULT NOW()":` DEFAULT ${bo(n.defaultVal)}`}function Cb(n){return n.defaultVal!==void 0||n.nullable===!0}function Ab(n){let e=[],t=[],r=[];for(let s of n.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&t.push(` UNIQUE (${s.constraintCols.join(", ")})`);continue}let i=[s.name,s.type];s.pk?(i.push("PRIMARY KEY"),s.defaultUuid&&i.push("DEFAULT gen_random_uuid()")):(s.defaultUuid?i.push("DEFAULT gen_random_uuid()"):s.defaultNow?i.push("DEFAULT NOW()"):s.defaultVal!==void 0&&i.push(`DEFAULT ${bo(s.defaultVal)}`),s.nullable||i.push("NOT NULL"),s.unique&&i.push("UNIQUE")),s.ref&&i.push(`REFERENCES ${s.ref.table} (${s.ref.col??"id"})${s.ref.onDelete?` ON DELETE ${s.ref.onDelete}`:""}`),e.push(` ${i.join(" ")}`)}for(let s of n.checks??[])r.push(`CONSTRAINT ${n.table}_${s.col}_check CHECK (${s.col} IN (${s.vals.map(i=>`'${i.replace(/'/g,"''")}'`).join(", ")}))`);return`CREATE TABLE IF NOT EXISTS ${n.table} (
21
+ `)].filter(Boolean);case"createTable":return[Cb(n)];case"alterAddColumn":return[`ALTER TABLE ${n.table} ADD COLUMN IF NOT EXISTS ${n.column} ${n.columnType}${Eb(n)}${n.columnType&&!Tb(n)?" NOT NULL":""};`];case"alter":return(n.dropNotNull??[]).length?[`ALTER TABLE ${n.table} ALTER COLUMN ${(n.dropNotNull??[]).join(", ")} DROP NOT NULL;`]:[];case"createIndex":return[Ab(n)];default:return[]}}function Eb(n){return n.defaultVal===void 0?"":typeof n.defaultVal=="object"&&n.defaultVal!==null&&"__now"in n.defaultVal?" DEFAULT NOW()":` DEFAULT ${vo(n.defaultVal)}`}function Tb(n){return n.defaultVal!==void 0||n.nullable===!0}function Cb(n){let e=[],t=[],r=[];for(let s of n.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&t.push(` UNIQUE (${s.constraintCols.join(", ")})`);continue}let o=[s.name,s.type];s.pk?(o.push("PRIMARY KEY"),s.defaultUuid&&o.push("DEFAULT gen_random_uuid()")):(s.defaultUuid?o.push("DEFAULT gen_random_uuid()"):s.defaultNow?o.push("DEFAULT NOW()"):s.defaultVal!==void 0&&o.push(`DEFAULT ${vo(s.defaultVal)}`),s.nullable||o.push("NOT NULL"),s.unique&&o.push("UNIQUE")),s.ref&&o.push(`REFERENCES ${s.ref.table} (${s.ref.col??"id"})${s.ref.onDelete?` ON DELETE ${s.ref.onDelete}`:""}`),e.push(` ${o.join(" ")}`)}for(let s of n.checks??[])r.push(`CONSTRAINT ${n.table}_${s.col}_check CHECK (${s.col} IN (${s.vals.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ")}))`);return`CREATE TABLE IF NOT EXISTS ${n.table} (
22
22
  ${[...e,...t,...r].join(`,
23
23
  `)}
24
- );`}function Ob(n){let e=n.index;if(!e)return"";let t=e.unique?"UNIQUE ":"",r=e.using?` USING ${e.using}`:"",s=e.opclass?` ${e.opclass}`:"",i=e.with?` WITH (${e.with})`:"",o=e.where?" WHERE "+e.where:"";return`CREATE ${t}INDEX IF NOT EXISTS ${e.name} ON ${n.table}${r} (${e.cols}${s})${i}${o};`}function Ib(n){let e=[],t={kind:"ddl",op:"createTable",table:n.name,ifNotExists:!0,columns:[],checks:[]},r=i=>{let o=i._typeName();return o==="nullable"||o==="optional"?!1:o==="default"||o==="effects"||o==="transform"?r(_o(i)??i):!0},s=[];for(let[i,o]of Object.entries(n.columns)){let a=o,l=a.metaInfo,u=l.column??i,c=n.columnTypes?.[u]??Ut(a);s.push({col:u,pgType:c,zt:a,pk:!!l.pk,nullable:!r(a)});let d=n.refs?.[u],p=l.references,m={name:u,type:c,pk:!!l.pk,unique:!!l.unique,defaultNow:l.default==="now",defaultUuid:l.default==="random",defaultVal:l.default!==void 0&&l.default!=="now"&&l.default!=="random"?l.default:void 0,nullable:!r(a)};if(d)m.ref={table:d.table,col:d.col,onDelete:d.onDelete};else if(p){let[f,g]=p.includes(".")?p.split("."):[p,"id"];m.ref={table:f,col:g,onDelete:l.onDelete}}t.columns.push(m);let h=Wa(a);h&&h.length>1&&t.checks.push({col:u,vals:h})}for(let i of n.uniques??[])t.columns.push({name:i[0],type:"table-constraint",pk:!1,unique:!0,defaultNow:!1,defaultUuid:!1,constraintCols:i});for(let[i,o]of Object.entries(n.checks??{}))t.checks.push({col:i,vals:o});for(let[i]of Object.entries(n.refs??{}))if(!s.some(o=>o.col===i))throw new Error(`schema: ${n.name}.${i} refs \u58F0\u660E\u7684\u5217\u4E0D\u5B58\u5728`);n.dropNotNull&&e.push({kind:"ddl",op:"alter",table:n.name,dropNotNull:n.dropNotNull}),e.push(t);for(let i of s){if(i.pk)continue;let l=Object.entries(n.columns).find(([c,d])=>(d.metaInfo?.column??c)===i.col)?.[1]?.metaInfo?.default,u=l!==void 0&&l!=="now"&&l!=="random";e.push({kind:"ddl",op:"alterAddColumn",table:n.name,column:i.col,columnType:i.pgType,defaultVal:l==="now"?{__now:!0}:u?l:void 0,nullable:i.nullable})}for(let i of n.indexes??[]){let o=i.cols.map(u=>typeof u=="string"?u:`${u.col}${u.desc?" DESC":""}`).join(", "),a=i.name??`idx_${n.name}_${i.cols.map(u=>typeof u=="string"?u:u.col).join("_")}`,l=i.where?i.where.map(u=>u.isNull!==void 0?`${u.col} IS ${u.isNull?"":"NOT "}NULL`:u.eq!==void 0?`${u.col} = '${u.eq.replace(/'/g,"''")}'`:u.ne!==void 0?`${u.col} <> '${u.ne.replace(/'/g,"''")}'`:"").filter(Boolean).join(" AND "):void 0;e.push({kind:"ddl",op:"createIndex",table:n.name,index:{name:a,cols:o,unique:!!i.unique,using:i.using,opclass:i.opclass,with:i.with,where:l}})}return e}function up(n){let e=[];for(let t of n.extensions??[])e.push(`CREATE EXTENSION IF NOT EXISTS ${t};`);for(let t of n.enums??[]){e.push(`DO $$ BEGIN
24
+ );`}function Ab(n){let e=n.index;if(!e)return"";let t=e.unique?"UNIQUE ":"",r=e.using?` USING ${e.using}`:"",s=e.opclass?` ${e.opclass}`:"",o=e.with?` WITH (${e.with})`:"",i=e.where?" WHERE "+e.where:"";return`CREATE ${t}INDEX IF NOT EXISTS ${e.name} ON ${n.table}${r} (${e.cols}${s})${o}${i};`}function Ob(n){let e=[],t={kind:"ddl",op:"createTable",table:n.name,ifNotExists:!0,columns:[],checks:[]},r=o=>{let i=o._typeName();return i==="nullable"||i==="optional"?!1:i==="default"||i==="effects"||i==="transform"?r(ko(o)??o):!0},s=[];for(let[o,i]of Object.entries(n.columns)){let a=i,l=a.metaInfo,u=l.column??o,c=n.columnTypes?.[u]??Ut(a);s.push({col:u,pgType:c,zt:a,pk:!!l.pk,nullable:!r(a)});let d=n.refs?.[u],p=l.references,f={name:u,type:c,pk:!!l.pk,unique:!!l.unique,defaultNow:l.default==="now",defaultUuid:l.default==="random",defaultVal:l.default!==void 0&&l.default!=="now"&&l.default!=="random"?l.default:void 0,nullable:!r(a)};if(d)f.ref={table:d.table,col:d.col,onDelete:d.onDelete};else if(p){let[m,g]=p.includes(".")?p.split("."):[p,"id"];f.ref={table:m,col:g,onDelete:l.onDelete}}t.columns.push(f);let w=Ha(a);w&&w.length>1&&t.checks.push({col:u,vals:w})}for(let o of n.uniques??[])t.columns.push({name:o[0],type:"table-constraint",pk:!1,unique:!0,defaultNow:!1,defaultUuid:!1,constraintCols:o});for(let[o,i]of Object.entries(n.checks??{}))t.checks.push({col:o,vals:i});for(let[o]of Object.entries(n.refs??{}))if(!s.some(i=>i.col===o))throw new Error(`schema: ${n.name}.${o} refs \u58F0\u660E\u7684\u5217\u4E0D\u5B58\u5728`);n.dropNotNull&&e.push({kind:"ddl",op:"alter",table:n.name,dropNotNull:n.dropNotNull}),e.push(t);for(let o of s){if(o.pk)continue;let l=Object.entries(n.columns).find(([c,d])=>(d.metaInfo?.column??c)===o.col)?.[1]?.metaInfo?.default,u=l!==void 0&&l!=="now"&&l!=="random";e.push({kind:"ddl",op:"alterAddColumn",table:n.name,column:o.col,columnType:o.pgType,defaultVal:l==="now"?{__now:!0}:u?l:void 0,nullable:o.nullable})}for(let o of n.indexes??[]){let i=o.cols.map(u=>typeof u=="string"?u:`${u.col}${u.desc?" DESC":""}`).join(", "),a=o.name??`idx_${n.name}_${o.cols.map(u=>typeof u=="string"?u:u.col).join("_")}`,l=o.where?o.where.map(u=>u.isNull!==void 0?`${u.col} IS ${u.isNull?"":"NOT "}NULL`:u.eq!==void 0?`${u.col} = '${u.eq.replace(/'/g,"''")}'`:u.ne!==void 0?`${u.col} <> '${u.ne.replace(/'/g,"''")}'`:"").filter(Boolean).join(" AND "):void 0;e.push({kind:"ddl",op:"createIndex",table:n.name,index:{name:a,cols:i,unique:!!o.unique,using:o.using,opclass:o.opclass,with:o.with,where:l}})}return e}function dp(n){let e=[];for(let t of n.extensions??[])e.push(`CREATE EXTENSION IF NOT EXISTS ${t};`);for(let t of n.enums??[]){e.push(`DO $$ BEGIN
25
25
  CREATE TYPE ${t.name} AS ENUM (${t.values.map(r=>`'${r.replace(/'/g,"''")}'`).join(", ")});
26
26
  EXCEPTION WHEN duplicate_object THEN NULL;
27
- END $$;`);for(let r of t.values)e.push(`ALTER TYPE ${t.name} ADD VALUE IF NOT EXISTS '${r.replace(/'/g,"''")}';`)}for(let t of n.tables)e.push(...Pb(t));return e.join(`
28
- `)}function Pb(n){let e=[],t=[],r=[],s=[],i=o=>{let a=o._typeName();return a==="nullable"||a==="optional"?!1:a==="default"||a==="effects"||a==="transform"?i(_o(o)??o):!0};for(let[o,a]of Object.entries(n.columns)){let l=a,u=l.metaInfo,c=u.column??o,d=n.columnTypes?.[c]??Ut(l),p=[c,d];u.pk?(p.push("PRIMARY KEY"),u.default==="random"&&p.push("DEFAULT gen_random_uuid()")):(u.default==="random"?p.push("DEFAULT gen_random_uuid()"):u.default==="now"?p.push("DEFAULT NOW()"):u.default!==void 0&&p.push(`DEFAULT ${bo(u.default)}`),i(l)&&p.push("NOT NULL"),u.unique&&p.push("UNIQUE"));let m=u.references;if(m){let[f,g]=m.includes(".")?m.split("."):[m,"id"];p.push(`REFERENCES ${f} (${g})`),u.onDelete&&p.push(`ON DELETE ${u.onDelete}`)}let h=Wa(l);h&&h.length>1&&s.push(`CONSTRAINT ${n.name}_${c}_check CHECK (${c} IN (${h.map(f=>`'${f.replace(/'/g,"''")}'`).join(", ")}))`),t.push(` ${p.join(" ")}`)}for(let o of n.uniques??[])r.push(` UNIQUE (${o.join(", ")})`);for(let[o,a]of Object.entries(n.refs??{})){let l=t.findIndex(u=>u.startsWith(` ${o} `));if(l>=0)t[l]+=` REFERENCES ${a.table} (${a.col??"id"})${a.onDelete?` ON DELETE ${a.onDelete}`:""}`;else throw new Error(`schema: ${n.name}.${o} refs \u58F0\u660E\u7684\u5217\u4E0D\u5B58\u5728`)}for(let[o,a]of Object.entries(n.checks??{}))s.push(`CONSTRAINT ${n.name}_${o}_check CHECK (${o} IN (${a.map(l=>`'${l.replace(/'/g,"''")}'`).join(", ")}))`);n.dropNotNull&&e.push(`ALTER TABLE ${n.name} ALTER COLUMN ${n.dropNotNull.join(", ")} DROP NOT NULL;`),e.push(`CREATE TABLE IF NOT EXISTS ${n.name} (
27
+ END $$;`);for(let r of t.values)e.push(`ALTER TYPE ${t.name} ADD VALUE IF NOT EXISTS '${r.replace(/'/g,"''")}';`)}for(let t of n.tables)e.push(...Ib(t));return e.join(`
28
+ `)}function Ib(n){let e=[],t=[],r=[],s=[],o=i=>{let a=i._typeName();return a==="nullable"||a==="optional"?!1:a==="default"||a==="effects"||a==="transform"?o(ko(i)??i):!0};for(let[i,a]of Object.entries(n.columns)){let l=a,u=l.metaInfo,c=u.column??i,d=n.columnTypes?.[c]??Ut(l),p=[c,d];u.pk?(p.push("PRIMARY KEY"),u.default==="random"&&p.push("DEFAULT gen_random_uuid()")):(u.default==="random"?p.push("DEFAULT gen_random_uuid()"):u.default==="now"?p.push("DEFAULT NOW()"):u.default!==void 0&&p.push(`DEFAULT ${vo(u.default)}`),o(l)&&p.push("NOT NULL"),u.unique&&p.push("UNIQUE"));let f=u.references;if(f){let[m,g]=f.includes(".")?f.split("."):[f,"id"];p.push(`REFERENCES ${m} (${g})`),u.onDelete&&p.push(`ON DELETE ${u.onDelete}`)}let w=Ha(l);w&&w.length>1&&s.push(`CONSTRAINT ${n.name}_${c}_check CHECK (${c} IN (${w.map(m=>`'${m.replace(/'/g,"''")}'`).join(", ")}))`),t.push(` ${p.join(" ")}`)}for(let i of n.uniques??[])r.push(` UNIQUE (${i.join(", ")})`);for(let[i,a]of Object.entries(n.refs??{})){let l=t.findIndex(u=>u.startsWith(` ${i} `));if(l>=0)t[l]+=` REFERENCES ${a.table} (${a.col??"id"})${a.onDelete?` ON DELETE ${a.onDelete}`:""}`;else throw new Error(`schema: ${n.name}.${i} refs \u58F0\u660E\u7684\u5217\u4E0D\u5B58\u5728`)}for(let[i,a]of Object.entries(n.checks??{}))s.push(`CONSTRAINT ${n.name}_${i}_check CHECK (${i} IN (${a.map(l=>`'${l.replace(/'/g,"''")}'`).join(", ")}))`);n.dropNotNull&&e.push(`ALTER TABLE ${n.name} ALTER COLUMN ${n.dropNotNull.join(", ")} DROP NOT NULL;`),e.push(`CREATE TABLE IF NOT EXISTS ${n.name} (
29
29
  ${[...t,...r,...s].join(`,
30
30
  `)}
31
- );`);for(let[o,a]of Object.entries(n.columns)){let l=a,u=l.metaInfo,c=u.column??o;if(u.pk)continue;let d=n.columnTypes?.[c]??Ut(l),p=[`ALTER TABLE ${n.name} ADD COLUMN IF NOT EXISTS ${c} ${d}`];u.default==="now"?p.push("DEFAULT NOW()"):u.default!==void 0&&p.push(`DEFAULT ${bo(u.default)}`),!i(l)||u.default!==void 0||p.push("NOT NULL"),e.push(`${p.join(" ")};`)}for(let o of n.indexes??[]){let a=o.cols.map(h=>typeof h=="string"?h:`${h.col}${h.desc?" DESC":""}`).join(", "),l=o.name??`idx_${n.name}_${o.cols.map(h=>typeof h=="string"?h:h.col).join("_")}`,u=o.unique?"UNIQUE ":"",c=o.using?` USING ${o.using}`:"",d=o.opclass?` ${o.opclass}`:"",p=o.with?` WITH (${o.with})`:"",m=o.where?" WHERE "+o.where.map(h=>h.isNull!==void 0?`${h.col} IS ${h.isNull?"":"NOT "}NULL`:h.eq!==void 0?`${h.col} = '${h.eq.replace(/'/g,"''")}'`:h.ne!==void 0?`${h.col} <> '${h.ne.replace(/'/g,"''")}'`:"").filter(Boolean).join(" AND "):"";e.push(`CREATE ${u}INDEX IF NOT EXISTS ${l} ON ${n.name}${c} (${a}${d})${p}${m};`)}return e}var Yr=N(()=>{"use strict"});function ko(n){let e=n.toLowerCase().replace(/\(\d+(,\d+)?\)/,""),t=[["text",["text","character varying","varchar","character","char","bpchar","citext"]],["uuid",["uuid"]],["int",["int","integer","int4","int2","smallint","serial"]],["int8",["bigint","int8"]],["numeric",["numeric","decimal"]],["float",["double precision","float8","real","float4"]],["bool",["boolean","bool"]],["timestamptz",["timestamp with time zone","timestamp without time zone","timestamp","timestamptz","date"]],["jsonb",["jsonb","json"]]];for(let[r,s]of t)if(s.includes(e))return r;return e}function es(n,e){let t=[],r=new Map(e.map(s=>[s.name,s]));for(let s of n){let i=r.get(s.name);if(!i){t.push({level:"error",kind:"table-missing",table:s.name});continue}let o=new Map(i.columns.map(a=>[a.name.toLowerCase(),a]));for(let[a,l]of Object.entries(s.fields)){let u=(s.dbFields[a]?.column??a).toLowerCase(),c=o.get(u);if(!c){t.push({level:"error",kind:"column-missing",table:s.name,column:u});continue}let d;try{d=ko(Ut(l))}catch{d=void 0}d&&ko(c.type)!==d&&t.push({level:"warn",kind:"type-mismatch",table:s.name,column:u,expected:d,found:c.type})}}for(let s of e){if(s.name.startsWith("_weifuwu"))continue;let i=n.find(a=>a.name===s.name);if(!i){t.push({level:"warn",kind:"table-extra",table:s.name});continue}let o=new Set(Object.entries(i.fields).map(([a])=>(i.dbFields[a]?.column??a).toLowerCase()));for(let a of s.columns)o.has(a.name.toLowerCase())||t.push({level:"warn",kind:"column-extra",table:s.name,column:a.name})}return{ok:t.every(s=>s.level==="warn"),issues:t}}var Ua=N(()=>{"use strict";Yr()});function Ht(n,e){return n.push(e),`$${n.length}`}function Bt(n,e){let t=[];for(let[r,s]of Object.entries(n)){if(r==="or"){let o=s.map(a=>Bt(a,e)).filter(a=>a!=="");t.push(o.length?`(${o.join(" OR ")})`:"");continue}if(r==="and"){let o=s.map(a=>Bt(a,e)).filter(a=>a!=="");t.push(o.length?`(${o.join(" AND ")})`:"");continue}if(typeof s=="object"&&s!==null){let i=s;for(let[u,c]of Object.entries(i))if(c===void 0)throw new Le("protocol",`where.${r}.${u} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`,{code:"PROTOCOL"});if(!Ba.some(u=>i[u]!==void 0)){t.push(`${r} = ${Ht(e,s)}`);continue}let a=[],l=u=>{if(typeof u=="object"&&u!==null&&("__interval"in u||"__monthStart"in u)){if("__monthStart"in u)return"DATE_TRUNC('month', NOW())";let[c,d]=u.__interval,p=Math.abs(c);return`NOW() ${c<0?"-":"+"} INTERVAL '${p} ${d}'`}return Ht(e,u)};i.col!==void 0&&t.push(`${r} = ${i.col}`),i.eq===null?a.push(["IS","NULL"]):i.eq!==void 0&&a.push(["=",l(i.eq)]),i.gt!==void 0&&a.push([">",l(i.gt)]),i.gte!==void 0&&a.push([">=",l(i.gte)]),i.lt!==void 0&&a.push(["<",l(i.lt)]),i.lte!==void 0&&a.push(["<=",l(i.lte)]),i.ne!==void 0&&a.push(["<>",l(i.ne)]),i.in&&a.push(["IN",`(${i.in.map(u=>l(u)).join(", ")})`]),i.notIn&&a.push(["NOT IN",`(${i.notIn.map(u=>l(u)).join(", ")})`]),i.like!==void 0&&a.push(["LIKE",l(i.like)]),i.ilike!==void 0&&a.push(["ILIKE",l(i.ilike)]),i.between&&a.push(["BETWEEN",`${l(i.between[0])} AND ${l(i.between[1])}`]),i.isNull!==void 0&&a.push(["IS",i.isNull?"NULL":"NOT NULL"]);for(let[u,c]of a)t.push(`${r} ${u} ${c}`);continue}throw new ue(`weifuwu/db: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08{ eq: v } / { in: [...] } / { isNull: true }\u2014\u2014\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\uFF09`)}return t.filter(r=>r!=="").join(" AND ")}function Nb(n){return n?.length?` ORDER BY ${n.map(e=>`${e.col} ${e.dir==="desc"?"DESC":"ASC"}`).join(", ")}`:""}function Mb(n,e){let t=`[${n.vec.join(",")}]`;return`${Ht(e,t)}::vector`}function $b(n,e){return n.aggregate?.length?n.aggregate.map(t=>{let r=t.filter?` FILTER (WHERE ${Bt(t.filter,e)})`:"";return`${t.fn.toUpperCase()}(${t.col==="*"?"*":t.col})${r} AS ${t.as}`}).join(", "):""}function cp(n){let e=[],t=(n.cols&&n.cols.length?n.cols.map(o=>Ha(o)?Fa(o,e):o).join(", "):n.aggregate?.length?"":"*")+(n.vector?`, 1 - (${n.vector.col} <=> ${Mb(n.vector,e)}) as ${n.vector.as}`:""),r=n.aggregate?.length?`${t?", ":""}${$b(n,e)}`:"",i=`SELECT ${n.distinct?"DISTINCT ":""}${t}${r} FROM ${n.table}${n.alias?` ${n.alias}`:""}`;for(let o of n.joins??[]){let a=Ha(o.on)?Fa(o.on,e):Bt(o.on,e);i+=` ${o.type==="left"?"LEFT JOIN":"JOIN"} ${o.table}${o.alias?` ${o.alias}`:""} ON ${a||"(1=1)"}`}{let o=n.where?Bt(n.where,e):"";o&&(i+=` WHERE ${o}`)}for(let o of n.sub??[]){let a=cp(o.query),l=e.length+1,u=a.sql.replace(/\$(\d+)/g,(d,p)=>`$${l+Number(p)-1}`);e.push(...a.params);let c=o.type==="exists"?o.not?"NOT EXISTS":"EXISTS":o.not?"NOT IN":"IN";o.type==="exists"?i+=` AND ${c} (${u})`:i+=` AND ${o.col} ${c} (${u})`}return n.groupBy?.length&&(i+=` GROUP BY ${n.groupBy.join(", ")}`),n.having&&(i+=` HAVING ${Bt(n.having,e)}`),i+=Nb(n.orderBy),n.limit!==void 0&&(i+=` LIMIT ${Ht(e,n.limit)}`),n.offset!==void 0&&(i+=` OFFSET ${Ht(e,n.offset)}`),{sql:i,params:e}}function qb(n){let e=[],t=Object.keys(n.rows[0]),r=t.join(", "),s=n.rows.map(o=>`(${t.map(a=>Ht(e,o[a])).join(", ")})`),i=`INSERT INTO ${n.table} (${r}) VALUES ${s.join(", ")}`;if(n.onConflict)if(n.onConflict.col){let o=Array.isArray(n.onConflict.col)?n.onConflict.col:[n.onConflict.col];if(i+=` ON CONFLICT (${o.join(", ")})`,n.onConflict.update){let a=new Set(o),l=n.onConflict.merge,u=l?Object.keys(l):t.filter(d=>!a.has(d)),c=u.length?u:o;i+=` DO UPDATE SET ${c.map(d=>l&&d in l?`${d} = ${pp(d,l[d],e,n.table)}`:`${d} = EXCLUDED.${d}`).join(", ")}`}else i+=" DO NOTHING"}else i+=" ON CONFLICT DO NOTHING";if(n.returning){let o=n.returning==="*"?"*":n.returning.join(", ");i+=` RETURNING ${o}`}return{sql:i,params:e}}function Db(n){let e=[];if(!n.where)throw new se("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u7528 orm.execute \u663E\u5F0F\uFF09");let t=Object.entries(n.sets).map(([s,i])=>`${s} = ${pp(s,i,e,n.table)}`).join(", "),r=`UPDATE ${n.table} SET ${t}`;{let s=Bt(n.where,e);if(!s)throw new se("weifuwu/db: UPDATE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u66F4\u65B0\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");r+=` WHERE ${s}`}if(n.returning){let s=n.returning==="*"?"*":n.returning.join(", ");r+=` RETURNING ${s}`}return{sql:r,params:e}}function jb(n){let e=[];if(!n.where)throw new se("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u5220\u9664\u7528 orm.execute \u663E\u5F0F\uFF09");let t=`DELETE FROM ${n.table}`;{let r=Bt(n.where,e);if(!r)throw new se("weifuwu/db: DELETE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u5220\u9664\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");t+=` WHERE ${r}`}if(n.returning){let r=n.returning==="*"?"*":n.returning.join(", ");t+=` RETURNING ${r}`}return{sql:t,params:e}}function dp(n){switch(n.kind){case"select":return cp(n);case"insert":return qb(n);case"update":return Db(n);case"delete":return jb(n);case"ddl":throw new ue("memory-sql: DDL \u4E0D\u8D70 Query Language\u2014\u2014\u58F0\u660E\u5F0F migrateModule\uFF08SchemaModule\uFF09\u6216\u8FC1\u79FB\u9762 runMigration(name, sql)")}}function Lb(n,e){if(typeof n!="object"||n===null||typeof e!="object"||e===null)return null;let t=n,r=e,s=Ba.some(o=>Object.hasOwn(t,o)),i=Ba.some(o=>Object.hasOwn(r,o));if(!s||!i)return null;for(let o of Object.keys(r))if(Object.hasOwn(t,o))return null;return{...t,...r}}function Wb(n,e,t){if(e==="and"&&Array.isArray(t)){n.and=[...n.and??[],...t];return}if(!(e in n)){n[e]=t;return}let r=Lb(n[e],t);if(r!==null){n[e]=r;return}n.and=[...n.and??[],{[e]:t}]}function So(n,e){let t={...n};for(let[r,s]of Object.entries(e)){if(r==="or"&&t.or!==void 0&&Array.isArray(s)){t.and=[...t.and??[],{or:s}];continue}Wb(t,r,s)}return t}function Ha(n){return typeof n=="object"&&n!==null&&"__raw"in n}function pp(n,e,t,r){if(Ha(e))return Fa(e,t);if(typeof e=="object"&&e!==null){if("__jsonbAppend"in e)return`${r}.${n} || ${Ht(t,e.__jsonbAppend)}::jsonb`;if("__inc"in e)return`${n} + ${Number(e.__inc)||1}`;if("__now"in e)return"NOW()";if("__interval"in e){let[s,i]=e.__interval,o=Math.abs(s);return`NOW() ${s<0?"-":"+"} INTERVAL '${o} ${i}'`}if("__colRef"in e)return String(e.__colRef)}return Ht(t,e)}function Fa(n,e){let t=e.length,r=n.__raw.replace(/\$(\d+)/g,(s,i)=>`$${t+Number(i)}`);return e.push(...n.params),r}var Ba,Va=N(()=>{"use strict";ye();Ba=["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"]});function ts(n,e="where"){if(n!=null){if(Array.isArray(n)){for(let t of n)ts(t,e);return}if(typeof n=="object")for(let[t,r]of Object.entries(n)){if(r===void 0)throw new se(`weifuwu/db: ${e}.${t} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\uFF08\u65E0\u8BE5\u6761\u4EF6\uFF09\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&ts(r,`${e}.${t}`)}}}function ns(n){let e=(i,o)=>{let a={kind:"select",table:i,alias:o},l={distinct(){return a.distinct=!0,l},select(...u){return a.cols=u.length===1&&u[0]==="*"?void 0:u,l},join(u,c,d){a.joins??=[];let p=u,m=d?.alias;return!m&&/\s/.test(u)&&([p,m]=u.split(/\s+/)),a.joins.push({table:p,alias:m,type:d?.type??"inner",on:c}),l},where(u){return ts(u),a.where=a.where?So(a.where,u):u,l},in(u,c,d=!1){return a.sub??=[],a.sub.push({type:"in",col:u,query:c,not:d}),l},exists(u,c=!1){return a.sub??=[],a.sub.push({type:"exists",query:u,not:c}),l},groupBy(...u){return a.groupBy=u,l},having(u){return a.having=u,l},count(u="*",c="count",d){return a.aggregate??=[],a.aggregate.push({fn:"count",col:u,as:c,filter:d}),l},sum(u,c="sum",d){return a.aggregate??=[],a.aggregate.push({fn:"sum",col:u,as:c,filter:d}),l},avg(u,c="avg",d){return a.aggregate??=[],a.aggregate.push({fn:"avg",col:u,as:c,filter:d}),l},min(u,c="min",d){return a.aggregate??=[],a.aggregate.push({fn:"min",col:u,as:c,filter:d}),l},max(u,c="max",d){return a.aggregate??=[],a.aggregate.push({fn:"max",col:u,as:c,filter:d}),l},orderBy(u,c="asc"){return a.orderBy??=[],a.orderBy.push({col:u,dir:c}),l},vectorScore(u,c,d){return a.vector={col:u,vec:c,as:d},l},limit(u){return a.limit=u,l},offset(u){return a.offset=u,l},async run(){return n(a)},async one(){return(await n(a))[0]},toQuery(){return structuredClone(a)}};return l},t=i=>{let o={kind:"insert",table:i,rows:[]},a={values(l){return o.rows.push(l),a},rows(l){return o.rows.push(...l),a},returning(...l){return o.returning=l.length===1&&l[0]==="*"?"*":l,a},onConflict(l,u=!1,c){return o.onConflict={col:l,update:u,merge:c},a},async run(){return n(o)},toQuery(){return structuredClone(o)}};return a},r=i=>{let o={kind:"update",table:i,sets:{}},a={set(l){return o.sets=l,a},where(l){return ts(l),o.where=o.where?So(o.where,l):l,a},returning(...l){return o.returning=l.length===1&&l[0]==="*"?"*":l,a},async run(){if(!o.where)throw new se("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u9010\u6279 where \u6216\u8FC1\u79FB\u9762\u663E\u5F0F\u6267\u884C\uFF09");return n(o)},toQuery(){return structuredClone(o)}};return a},s=i=>{let o={kind:"delete",table:i},a={where(l){return ts(l),o.where=o.where?So(o.where,l):l,a},returning(...l){return o.returning=l.length===1&&l[0]==="*"?"*":l,a},async run(){if(!o.where)throw new se("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u6E05\u7A7A\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u8FC1\u79FB\u9762 runMigration \u663E\u5F0F\u6267\u884C\uFF09");return n(o)},toQuery(){return structuredClone(o)}};return a};return{from:(i,o)=>{if(!o&&/\s/.test(i)){let[a,l]=i.split(/\s+/);return e(a,l)}return e(i,o)},insert:i=>t(i),update:i=>r(i),delete:i=>s(i)}}function mp(){return ns((()=>{throw new Error("buildQuery \u65E0\u6267\u884C\u9762\u2014\u2014\u534F\u8BAE\u5C42\u53EA\u6784\u5EFA AST")}))}var za=N(()=>{"use strict";ye();Va()});function xo(n){n.gql&&(Ka=n.gql),n.rest&&(Ga=n.rest)}function _n(n,e){return fp(n,e,new Map)}function fp(n,e,t){let r=ns(async l=>await n.executeQuery(l));function s(l,u){let c=t.get(l);if(c)return c.t;if(u===void 0)throw new se(`weifuwu/db: \u8868 ${l} \u672A\u6CE8\u518C\uFF08tx/ctx \u6D3E\u751F\u7528 orm.table(name, shapeDef) \u5148\u884C\u6CE8\u518C\uFF09`);let d=Object.keys(u),p=co({table:l,fields:u}),m=d.map(_=>p.dbFields[_]?.column??_),h=_=>p.fromDb(_),f=new Set(["distinct","select","join","where","in","exists","groupBy","having","count","sum","avg","min","max","orderBy","limit","offset","values","rows","returning","onConflict","set"]),g=_=>_==="*"?"*":typeof _=="string"?p.dbFields[_]?.column??_:_,w=_=>{let v={run:()=>_.run().then(S=>S.map(A=>h(A))),one:async()=>(await v.run())[0]};for(let S of f){if(S==="returning")continue;let A=_[S];typeof A=="function"&&(v[S]=(...C)=>(A.apply(_,C),v))}return v.returning=(...S)=>(_.returning(...S.map(A=>g(A))),v),v},y={};for(let _ of d)y[_]={ref:p.dbFields[_]?.column??_,__out:void 0};let k={c:y,select:(..._)=>w(r.from(l).select(..._.length?_.map(v=>g(v)):["*"])),insert:_=>{let v=p.insertSchema(),S=Array.isArray(_)?_:[_],A=r.insert(l);for(let C of S)A=A.values(p.toDb(v.parse(C)));return w(A.returning(...m))},update:_=>{let v=Object.entries(_).filter(([,C])=>typeof C=="object"&&C!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(j=>j in C)).map(([C])=>C),S=Object.fromEntries(Object.entries(_).filter(([C])=>!v.includes(C))),A={...p.updateSchema().parse(S),...Object.fromEntries(v.map(C=>[C,_[C]]))};return w(r.update(l).set(p.toDb(A)).returning(...m))},delete:()=>w(r.delete(l).returning(...m)),exists:async _=>(await r.from(l).select("1").where(_).limit(1).run()).length>0,paginate:async _=>{let v=Math.max(1,Math.min(_.limit??50,100)),S=Math.max(0,_.offset??0),A=r.from(l);_.filter&&A.where(_.filter);let[C]=await A.count("*","total").run(),j=Number(C.total??0),K=r.from(l);_.filter&&K.where(_.filter);for(let H of _.sort??[])K.orderBy(H.field,H.dir==="desc"?"desc":"asc");return K.limit(v).offset(S),{rows:await w(K).run(),total:j}},shapeDef:u,__shape:p,__shapeDbFields:p.dbFields};return t.set(l,{t:k}),k}let i=l=>{let u=()=>e?.value(l),c=(d,p)=>{let m=s(d,p),h=m.__shape,f=e&&h.dbFields[e.field]?h.dbFields[e.field].column??e.field:null,g=()=>{let w=u();return w!==void 0&&f?{[f]:{eq:w}}:null};return{...m,select:(...w)=>{let y=m.select(...w),k=g();return k&&y.where(k),y},insert:w=>{let y=Array.isArray(w)?w:[w],k=u(),_=y.map(v=>g()&&v[e.field]===void 0?{...v,[e.field]:k}:v);return m.insert(Array.isArray(w)?_:_[0])},update:w=>{let y=m.update(w),k=g();return k&&y.where(k),y},delete:()=>{let w=m.delete(),y=g();return y&&w.where(y),w},paginate:async w=>{let y=g();return m.paginate({...w,filter:y?{and:[w.filter??{},y]}:w.filter})}}};return{...o(),ctxTable:c}},o=()=>a,a={table:s,query:r,gql:(l,u)=>{if(!l.__shape)throw new Error("orm.gql: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");if(!Ka)throw new Error("orm.gql: \u751F\u6210\u5668\u672A\u6CE8\u518C\uFF08\u4ECE weifuwu \u5BFC\u5165\u81EA\u5E26 gql \u9762\uFF0C\u6216\u5148\u52A0\u8F7D db/gql-from-shape.ts\uFF09");let c=u,d={...c,...c?.tenant===void 0&&e?{tenant:{field:e.field,value:e.value}}:{},sql:()=>a};return Ka(l.__shape,d)},rest:(l,u)=>{if(!l.__shape)throw new Error("orm.rest: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");if(!Ga)throw new Error("orm.rest: \u751F\u6210\u5668\u672A\u6CE8\u518C\uFF08\u4ECE weifuwu \u5BFC\u5165\u81EA\u5E26 rest \u9762\uFF0C\u6216\u5148\u52A0\u8F7D db/rest-from-shape.ts\uFF09");return Ga(l.__shape,u)},withCtx:i,execute:l=>n.executeQuery(l),tables:()=>{let l=[];for(let[u,c]of t)l.push({name:u,fields:c.t.shapeDef,dbFields:c.t.__shapeDbFields});return l},transaction:l=>n.transaction?n.transaction(async u=>l(fp({executeQuery:d=>u(d)},e,t))):l(a)};return a}function Ro(n,e){return{executeQuery:async t=>{let{sql:r,params:s}=e(t);return n.query(r,s)},transaction:t=>{let r=n;if(!r.transaction)throw new se("weifuwu/db: \u5F53\u524D adapter \u65E0\u4E8B\u52A1\u80FD\u529B");return r.transaction(async s=>t(i=>{let{sql:o,params:a}=e(i);return s.query(o,a)}))}}}function Yn(n){let e=new Map;return{executeQuery:t=>Promise.resolve(n.executeQuery(t)),transaction:t=>{if(!n.snapshot||!n.restore)return t(s=>Promise.resolve(n.executeQuery(s)));let r=n.snapshot();return t(s=>Promise.resolve(n.executeQuery(s))).catch(s=>{throw n.restore(r),s})}}}var Ka,Ga,er=N(()=>{"use strict";za();Jn();ye();Ka=null,Ga=null});function Qa(n,e){let t={};if(!n)return t;for(let[r,s]of Object.entries(n)){if(r==="and"||r==="or"){let l=(Array.isArray(s)?s:[s]).map(u=>Qa(u,e));t[r]=l;continue}if(s===null||typeof s!="object")continue;let i=e.dbFields[r]?.column??r,o=s;if(o.eq===null&&Object.keys(o).length===1){t[i]={isNull:!0};continue}if(Object.keys(o).some(l=>l==="eq")&&Object.keys(o).length===1&&typeof o.eq!="object"){t[i]={eq:o.eq};continue}let a={};for(let[l,u]of Object.entries(o)){if(u===void 0)throw new se(`filter \u503C\u4E0D\u80FD\u4E3A undefined\uFF08\u5217 ${i} \u7B97\u5B50 ${l}\uFF09\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);if(u===null){if(l==="eq"){a.isNull=!0;continue}continue}if(!(l==="eq"&&u===null)){if(l==="contains"){a.ilike=`%${String(u).replace(/([%_])/g,"\\$1")}%`;continue}if(l==="startsWith"){a.ilike=`${String(u).replace(/([%_])/g,"\\$1")}%`;continue}if(l==="endsWith"){a.ilike=`%${String(u).replace(/([%_])/g,"\\$1")}`;continue}a[l]=u}}Object.keys(a).length&&(t[i]=a)}return t}var gp=N(()=>{"use strict";ye()});function Ja(n){let e=n;for(;;)if(e instanceof zn||e instanceof Kn||e instanceof Gn||e instanceof Jr)e=e.inner;else if(e instanceof Zr)e=e.inner;else break;return e}function hp(n){return n instanceof zn||n instanceof Gn||n instanceof Kn}function vn(n){return n.replace(/[-_](.)/g,(e,t)=>t.toUpperCase()).replace(/^(.)/,e=>e.toUpperCase())}function Eo(n,e,t,r){let s=Ja(n);if(s instanceof Mt||s instanceof yn)return"String";if(s instanceof hn)return"Float";if(s instanceof wn)return"Boolean";if(s instanceof $t)return t.has(e)||(t.add(e),r.push(`enum ${e} { ${JSON.stringify(s.value)} }`)),e;if(s instanceof qt)return t.has(e)||(t.add(e),r.push(`enum ${e} { ${s.values.join(" ")} }`)),e;if(s instanceof Qr){let i=Eo(s.itemSchema,`${e}Item`,t,r);return i?`[${i}!]`:null}return s instanceof Gr?"[Float!]":null}function Za(n,e={}){let t=e.name??vn(n.table),r=new Set,s=[],i=[],o=[],a=[],l=[],u=[],c=new Set(e.hidden??[]),d=h=>c.has(h);for(let[h,f]of Object.entries(n.fields)){if(d(h))continue;let g=hp(f)?"":"!",w=Eo(f,`${t}${vn(h)}Enum`,r,s);w&&i.push(` ${h}: ${w}${g}`);let y=Ja(f),k=y instanceof Mt||y instanceof yn?"str":y instanceof hn?"num":y instanceof wn?"bool":null;if(!k){if(y instanceof qt||y instanceof $t){let A=Eo(f,`${t}${vn(h)}Enum`,r,s);A&&o.push(`input ${t}${vn(h)}Filter {
31
+ );`);for(let[i,a]of Object.entries(n.columns)){let l=a,u=l.metaInfo,c=u.column??i;if(u.pk)continue;let d=n.columnTypes?.[c]??Ut(l),p=[`ALTER TABLE ${n.name} ADD COLUMN IF NOT EXISTS ${c} ${d}`];u.default==="now"?p.push("DEFAULT NOW()"):u.default!==void 0&&p.push(`DEFAULT ${vo(u.default)}`),!o(l)||u.default!==void 0||p.push("NOT NULL"),e.push(`${p.join(" ")};`)}for(let i of n.indexes??[]){let a=i.cols.map(w=>typeof w=="string"?w:`${w.col}${w.desc?" DESC":""}`).join(", "),l=i.name??`idx_${n.name}_${i.cols.map(w=>typeof w=="string"?w:w.col).join("_")}`,u=i.unique?"UNIQUE ":"",c=i.using?` USING ${i.using}`:"",d=i.opclass?` ${i.opclass}`:"",p=i.with?` WITH (${i.with})`:"",f=i.where?" WHERE "+i.where.map(w=>w.isNull!==void 0?`${w.col} IS ${w.isNull?"":"NOT "}NULL`:w.eq!==void 0?`${w.col} = '${w.eq.replace(/'/g,"''")}'`:w.ne!==void 0?`${w.col} <> '${w.ne.replace(/'/g,"''")}'`:"").filter(Boolean).join(" AND "):"";e.push(`CREATE ${u}INDEX IF NOT EXISTS ${l} ON ${n.name}${c} (${a}${d})${p}${f};`)}return e}var ns=I(()=>{"use strict"});function xo(n){let e=n.toLowerCase().replace(/\(\d+(,\d+)?\)/,""),t=[["text",["text","character varying","varchar","character","char","bpchar","citext"]],["uuid",["uuid"]],["int",["int","integer","int4","int2","smallint","serial"]],["int8",["bigint","int8"]],["numeric",["numeric","decimal"]],["float",["double precision","float8","real","float4"]],["bool",["boolean","bool"]],["timestamptz",["timestamp with time zone","timestamp without time zone","timestamp","timestamptz","date"]],["jsonb",["jsonb","json"]]];for(let[r,s]of t)if(s.includes(e))return r;return e}function rs(n,e){let t=[],r=new Map(e.map(s=>[s.name,s]));for(let s of n){let o=r.get(s.name);if(!o){t.push({level:"error",kind:"table-missing",table:s.name});continue}let i=new Map(o.columns.map(a=>[a.name.toLowerCase(),a]));for(let[a,l]of Object.entries(s.fields)){let u=(s.dbFields[a]?.column??a).toLowerCase(),c=i.get(u);if(!c){t.push({level:"error",kind:"column-missing",table:s.name,column:u});continue}let d;try{d=xo(Ut(l))}catch{d=void 0}d&&xo(c.type)!==d&&t.push({level:"warn",kind:"type-mismatch",table:s.name,column:u,expected:d,found:c.type})}}for(let s of e){if(s.name.startsWith("_weifuwu"))continue;let o=n.find(a=>a.name===s.name);if(!o){t.push({level:"warn",kind:"table-extra",table:s.name});continue}let i=new Set(Object.entries(o.fields).map(([a])=>(o.dbFields[a]?.column??a).toLowerCase()));for(let a of s.columns)i.has(a.name.toLowerCase())||t.push({level:"warn",kind:"column-extra",table:s.name,column:a.name})}return{ok:t.every(s=>s.level==="warn"),issues:t}}var Fa=I(()=>{"use strict";ns()});function Ht(n,e){return n.push(e),`$${n.length}`}function Bt(n,e){let t=[];for(let[r,s]of Object.entries(n)){if(r==="or"){let i=s.map(a=>Bt(a,e)).filter(a=>a!=="");t.push(i.length?`(${i.join(" OR ")})`:"");continue}if(r==="and"){let i=s.map(a=>Bt(a,e)).filter(a=>a!=="");t.push(i.length?`(${i.join(" AND ")})`:"");continue}if(typeof s=="object"&&s!==null){let o=s;for(let[u,c]of Object.entries(o))if(c===void 0)throw new We("protocol",`where.${r}.${u} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`,{code:"PROTOCOL"});if(!Va.some(u=>o[u]!==void 0)){t.push(`${r} = ${Ht(e,s)}`);continue}let a=[],l=u=>{if(typeof u=="object"&&u!==null&&("__interval"in u||"__monthStart"in u)){if("__monthStart"in u)return"DATE_TRUNC('month', NOW())";let[c,d]=u.__interval,p=Math.abs(c);return`NOW() ${c<0?"-":"+"} INTERVAL '${p} ${d}'`}return Ht(e,u)};o.col!==void 0&&t.push(`${r} = ${o.col}`),o.eq===null?a.push(["IS","NULL"]):o.eq!==void 0&&a.push(["=",l(o.eq)]),o.gt!==void 0&&a.push([">",l(o.gt)]),o.gte!==void 0&&a.push([">=",l(o.gte)]),o.lt!==void 0&&a.push(["<",l(o.lt)]),o.lte!==void 0&&a.push(["<=",l(o.lte)]),o.ne!==void 0&&a.push(["<>",l(o.ne)]),o.in&&a.push(["IN",`(${o.in.map(u=>l(u)).join(", ")})`]),o.notIn&&a.push(["NOT IN",`(${o.notIn.map(u=>l(u)).join(", ")})`]),o.like!==void 0&&a.push(["LIKE",l(o.like)]),o.ilike!==void 0&&a.push(["ILIKE",l(o.ilike)]),o.between&&a.push(["BETWEEN",`${l(o.between[0])} AND ${l(o.between[1])}`]),o.isNull!==void 0&&a.push(["IS",o.isNull?"NULL":"NOT NULL"]);for(let[u,c]of a)t.push(`${r} ${u} ${c}`);continue}throw new ue(`weifuwu/db: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08{ eq: v } / { in: [...] } / { isNull: true }\u2014\u2014\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\uFF09`)}return t.filter(r=>r!=="").join(" AND ")}function Pb(n){return n?.length?` ORDER BY ${n.map(e=>`${e.col} ${e.dir==="desc"?"DESC":"ASC"}`).join(", ")}`:""}function Nb(n,e){let t=`[${n.vec.join(",")}]`;return`${Ht(e,t)}::vector`}function Mb(n,e){return n.aggregate?.length?n.aggregate.map(t=>{let r=t.filter?` FILTER (WHERE ${Bt(t.filter,e)})`:"";return`${t.fn.toUpperCase()}(${t.col==="*"?"*":t.col})${r} AS ${t.as}`}).join(", "):""}function pp(n){let e=[],t=(n.cols&&n.cols.length?n.cols.map(i=>za(i)?Ka(i,e):i).join(", "):n.aggregate?.length?"":"*")+(n.vector?`, 1 - (${n.vector.col} <=> ${Nb(n.vector,e)}) as ${n.vector.as}`:""),r=n.aggregate?.length?`${t?", ":""}${Mb(n,e)}`:"",o=`SELECT ${n.distinct?"DISTINCT ":""}${t}${r} FROM ${n.table}${n.alias?` ${n.alias}`:""}`;for(let i of n.joins??[]){let a=za(i.on)?Ka(i.on,e):Bt(i.on,e);o+=` ${i.type==="left"?"LEFT JOIN":"JOIN"} ${i.table}${i.alias?` ${i.alias}`:""} ON ${a||"(1=1)"}`}{let i=n.where?Bt(n.where,e):"";i&&(o+=` WHERE ${i}`)}for(let i of n.sub??[]){let a=pp(i.query),l=e.length+1,u=a.sql.replace(/\$(\d+)/g,(d,p)=>`$${l+Number(p)-1}`);e.push(...a.params);let c=i.type==="exists"?i.not?"NOT EXISTS":"EXISTS":i.not?"NOT IN":"IN";i.type==="exists"?o+=` AND ${c} (${u})`:o+=` AND ${i.col} ${c} (${u})`}return n.groupBy?.length&&(o+=` GROUP BY ${n.groupBy.join(", ")}`),n.having&&(o+=` HAVING ${Bt(n.having,e)}`),o+=Pb(n.orderBy),n.limit!==void 0&&(o+=` LIMIT ${Ht(e,n.limit)}`),n.offset!==void 0&&(o+=` OFFSET ${Ht(e,n.offset)}`),{sql:o,params:e}}function $b(n){let e=[],t=Object.keys(n.rows[0]),r=t.join(", "),s=n.rows.map(i=>`(${t.map(a=>Ht(e,i[a])).join(", ")})`),o=`INSERT INTO ${n.table} (${r}) VALUES ${s.join(", ")}`;if(n.onConflict)if(n.onConflict.col){let i=Array.isArray(n.onConflict.col)?n.onConflict.col:[n.onConflict.col];if(o+=` ON CONFLICT (${i.join(", ")})`,n.onConflict.update){let a=new Set(i),l=n.onConflict.merge,u=l?Object.keys(l):t.filter(d=>!a.has(d)),c=u.length?u:i;o+=` DO UPDATE SET ${c.map(d=>l&&d in l?`${d} = ${fp(d,l[d],e,n.table)}`:`${d} = EXCLUDED.${d}`).join(", ")}`}else o+=" DO NOTHING"}else o+=" ON CONFLICT DO NOTHING";if(n.returning){let i=n.returning==="*"?"*":n.returning.join(", ");o+=` RETURNING ${i}`}return{sql:o,params:e}}function qb(n){let e=[];if(!n.where)throw new se("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u7528 orm.execute \u663E\u5F0F\uFF09");let t=Object.entries(n.sets).map(([s,o])=>`${s} = ${fp(s,o,e,n.table)}`).join(", "),r=`UPDATE ${n.table} SET ${t}`;{let s=Bt(n.where,e);if(!s)throw new se("weifuwu/db: UPDATE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u66F4\u65B0\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");r+=` WHERE ${s}`}if(n.returning){let s=n.returning==="*"?"*":n.returning.join(", ");r+=` RETURNING ${s}`}return{sql:r,params:e}}function Db(n){let e=[];if(!n.where)throw new se("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u5220\u9664\u7528 orm.execute \u663E\u5F0F\uFF09");let t=`DELETE FROM ${n.table}`;{let r=Bt(n.where,e);if(!r)throw new se("weifuwu/db: DELETE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u5220\u9664\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");t+=` WHERE ${r}`}if(n.returning){let r=n.returning==="*"?"*":n.returning.join(", ");t+=` RETURNING ${r}`}return{sql:t,params:e}}function mp(n){switch(n.kind){case"select":return pp(n);case"insert":return $b(n);case"update":return qb(n);case"delete":return Db(n);case"ddl":throw new ue("memory-sql: DDL \u4E0D\u8D70 Query Language\u2014\u2014\u58F0\u660E\u5F0F migrateModule\uFF08SchemaModule\uFF09\u6216\u8FC1\u79FB\u9762 runMigration(name, sql)")}}function jb(n,e){if(typeof n!="object"||n===null||typeof e!="object"||e===null)return null;let t=n,r=e,s=Va.some(i=>Object.hasOwn(t,i)),o=Va.some(i=>Object.hasOwn(r,i));if(!s||!o)return null;for(let i of Object.keys(r))if(Object.hasOwn(t,i))return null;return{...t,...r}}function Lb(n,e,t){if(e==="and"&&Array.isArray(t)){n.and=[...n.and??[],...t];return}if(!(e in n)){n[e]=t;return}let r=jb(n[e],t);if(r!==null){n[e]=r;return}n.and=[...n.and??[],{[e]:t}]}function Ro(n,e){let t={...n};for(let[r,s]of Object.entries(e)){if(r==="or"&&t.or!==void 0&&Array.isArray(s)){t.and=[...t.and??[],{or:s}];continue}Lb(t,r,s)}return t}function za(n){return typeof n=="object"&&n!==null&&"__raw"in n}function fp(n,e,t,r){if(za(e))return Ka(e,t);if(typeof e=="object"&&e!==null){if("__jsonbAppend"in e)return`${r}.${n} || ${Ht(t,e.__jsonbAppend)}::jsonb`;if("__inc"in e)return`${n} + ${Number(e.__inc)||1}`;if("__now"in e)return"NOW()";if("__interval"in e){let[s,o]=e.__interval,i=Math.abs(s);return`NOW() ${s<0?"-":"+"} INTERVAL '${i} ${o}'`}if("__colRef"in e)return String(e.__colRef)}return Ht(t,e)}function Ka(n,e){let t=e.length,r=n.__raw.replace(/\$(\d+)/g,(s,o)=>`$${t+Number(o)}`);return e.push(...n.params),r}var Va,Ga=I(()=>{"use strict";ye();Va=["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"]});function ss(n,e="where"){if(n!=null){if(Array.isArray(n)){for(let t of n)ss(t,e);return}if(typeof n=="object")for(let[t,r]of Object.entries(n)){if(r===void 0)throw new se(`weifuwu/db: ${e}.${t} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\uFF08\u65E0\u8BE5\u6761\u4EF6\uFF09\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&ss(r,`${e}.${t}`)}}}function os(n){let e=(o,i)=>{let a={kind:"select",table:o,alias:i},l={distinct(){return a.distinct=!0,l},select(...u){return a.cols=u.length===1&&u[0]==="*"?void 0:u,l},join(u,c,d){a.joins??=[];let p=u,f=d?.alias;return!f&&/\s/.test(u)&&([p,f]=u.split(/\s+/)),a.joins.push({table:p,alias:f,type:d?.type??"inner",on:c}),l},where(u){return ss(u),a.where=a.where?Ro(a.where,u):u,l},in(u,c,d=!1){return a.sub??=[],a.sub.push({type:"in",col:u,query:c,not:d}),l},exists(u,c=!1){return a.sub??=[],a.sub.push({type:"exists",query:u,not:c}),l},groupBy(...u){return a.groupBy=u,l},having(u){return a.having=u,l},count(u="*",c="count",d){return a.aggregate??=[],a.aggregate.push({fn:"count",col:u,as:c,filter:d}),l},sum(u,c="sum",d){return a.aggregate??=[],a.aggregate.push({fn:"sum",col:u,as:c,filter:d}),l},avg(u,c="avg",d){return a.aggregate??=[],a.aggregate.push({fn:"avg",col:u,as:c,filter:d}),l},min(u,c="min",d){return a.aggregate??=[],a.aggregate.push({fn:"min",col:u,as:c,filter:d}),l},max(u,c="max",d){return a.aggregate??=[],a.aggregate.push({fn:"max",col:u,as:c,filter:d}),l},orderBy(u,c="asc"){return a.orderBy??=[],a.orderBy.push({col:u,dir:c}),l},vectorScore(u,c,d){return a.vector={col:u,vec:c,as:d},l},limit(u){return a.limit=u,l},offset(u){return a.offset=u,l},async run(){return n(a)},async one(){return(await n(a))[0]},toQuery(){return structuredClone(a)}};return l},t=o=>{let i={kind:"insert",table:o,rows:[]},a={values(l){return i.rows.push(l),a},rows(l){return i.rows.push(...l),a},returning(...l){return i.returning=l.length===1&&l[0]==="*"?"*":l,a},onConflict(l,u=!1,c){return i.onConflict={col:l,update:u,merge:c},a},async run(){return n(i)},toQuery(){return structuredClone(i)}};return a},r=o=>{let i={kind:"update",table:o,sets:{}},a={set(l){return i.sets=l,a},where(l){return ss(l),i.where=i.where?Ro(i.where,l):l,a},returning(...l){return i.returning=l.length===1&&l[0]==="*"?"*":l,a},async run(){if(!i.where)throw new se("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u9010\u6279 where \u6216\u8FC1\u79FB\u9762\u663E\u5F0F\u6267\u884C\uFF09");return n(i)},toQuery(){return structuredClone(i)}};return a},s=o=>{let i={kind:"delete",table:o},a={where(l){return ss(l),i.where=i.where?Ro(i.where,l):l,a},returning(...l){return i.returning=l.length===1&&l[0]==="*"?"*":l,a},async run(){if(!i.where)throw new se("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u6E05\u7A7A\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u8FC1\u79FB\u9762 runMigration \u663E\u5F0F\u6267\u884C\uFF09");return n(i)},toQuery(){return structuredClone(i)}};return a};return{from:(o,i)=>{if(!i&&/\s/.test(o)){let[a,l]=o.split(/\s+/);return e(a,l)}return e(o,i)},insert:o=>t(o),update:o=>r(o),delete:o=>s(o)}}function gp(){return os((()=>{throw new Error("buildQuery \u65E0\u6267\u884C\u9762\u2014\u2014\u534F\u8BAE\u5C42\u53EA\u6784\u5EFA AST")}))}var Qa=I(()=>{"use strict";ye();Ga()});function Eo(n){n.gql&&(Ja=n.gql),n.rest&&(Za=n.rest)}function _n(n,e){return hp(n,e,new Map)}function hp(n,e,t){let r=os(async l=>await n.executeQuery(l));function s(l,u){let c=t.get(l);if(c)return c.t;if(u===void 0)throw new se(`weifuwu/db: \u8868 ${l} \u672A\u6CE8\u518C\uFF08tx/ctx \u6D3E\u751F\u7528 orm.table(name, shapeDef) \u5148\u884C\u6CE8\u518C\uFF09`);let d=Object.keys(u),p=mo({table:l,fields:u}),f=d.map(_=>p.dbFields[_]?.column??_),w=_=>p.fromDb(_),m=new Set(["distinct","select","join","where","in","exists","groupBy","having","count","sum","avg","min","max","orderBy","limit","offset","values","rows","returning","onConflict","set"]),g=_=>_==="*"?"*":typeof _=="string"?p.dbFields[_]?.column??_:_,h=_=>{let v={run:()=>_.run().then(S=>S.map(A=>w(A))),one:async()=>(await v.run())[0]};for(let S of m){if(S==="returning")continue;let A=_[S];typeof A=="function"&&(v[S]=(...C)=>(A.apply(_,C),v))}return v.returning=(...S)=>(_.returning(...S.map(A=>g(A))),v),v},b={};for(let _ of d)b[_]={ref:p.dbFields[_]?.column??_,__out:void 0};let k={c:b,select:(..._)=>h(r.from(l).select(..._.length?_.map(v=>g(v)):["*"])),insert:_=>{let v=p.insertSchema(),S=Array.isArray(_)?_:[_],A=r.insert(l);for(let C of S)A=A.values(p.toDb(v.parse(C)));return h(A.returning(...f))},update:_=>{let v=Object.entries(_).filter(([,C])=>typeof C=="object"&&C!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(W=>W in C)).map(([C])=>C),S=Object.fromEntries(Object.entries(_).filter(([C])=>!v.includes(C))),A={...p.updateSchema().parse(S),...Object.fromEntries(v.map(C=>[C,_[C]]))};return h(r.update(l).set(p.toDb(A)).returning(...f))},delete:()=>h(r.delete(l).returning(...f)),exists:async _=>(await r.from(l).select("1").where(_).limit(1).run()).length>0,paginate:async _=>{let v=Math.max(1,Math.min(_.limit??50,100)),S=Math.max(0,_.offset??0),A=r.from(l);_.filter&&A.where(_.filter);let[C]=await A.count("*","total").run(),W=Number(C.total??0),G=r.from(l);_.filter&&G.where(_.filter);for(let F of _.sort??[])G.orderBy(F.field,F.dir==="desc"?"desc":"asc");return G.limit(v).offset(S),{rows:await h(G).run(),total:W}},shapeDef:u,__shape:p,__shapeDbFields:p.dbFields};return t.set(l,{t:k}),k}let o=l=>{let u=()=>e?.value(l),c=(d,p)=>{let f=s(d,p),w=f.__shape,m=e&&w.dbFields[e.field]?w.dbFields[e.field].column??e.field:null,g=()=>{let h=u();return h!==void 0&&m?{[m]:{eq:h}}:null};return{...f,select:(...h)=>{let b=f.select(...h),k=g();return k&&b.where(k),b},insert:h=>{let b=Array.isArray(h)?h:[h],k=u(),_=b.map(v=>g()&&v[e.field]===void 0?{...v,[e.field]:k}:v);return f.insert(Array.isArray(h)?_:_[0])},update:h=>{let b=f.update(h),k=g();return k&&b.where(k),b},delete:()=>{let h=f.delete(),b=g();return b&&h.where(b),h},paginate:async h=>{let b=g();return f.paginate({...h,filter:b?{and:[h.filter??{},b]}:h.filter})}}};return{...i(),ctxTable:c}},i=()=>a,a={table:s,query:r,gql:(l,u)=>{if(!l.__shape)throw new Error("orm.gql: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");if(!Ja)throw new Error("orm.gql: \u751F\u6210\u5668\u672A\u6CE8\u518C\uFF08\u4ECE weifuwu \u5BFC\u5165\u81EA\u5E26 gql \u9762\uFF0C\u6216\u5148\u52A0\u8F7D db/gql-from-shape.ts\uFF09");let c=u,d={...c,...c?.tenant===void 0&&e?{tenant:{field:e.field,value:e.value}}:{},sql:()=>a};return Ja(l.__shape,d)},rest:(l,u)=>{if(!l.__shape)throw new Error("orm.rest: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");if(!Za)throw new Error("orm.rest: \u751F\u6210\u5668\u672A\u6CE8\u518C\uFF08\u4ECE weifuwu \u5BFC\u5165\u81EA\u5E26 rest \u9762\uFF0C\u6216\u5148\u52A0\u8F7D db/rest-from-shape.ts\uFF09");return Za(l.__shape,u)},withCtx:o,execute:l=>n.executeQuery(l),tables:()=>{let l=[];for(let[u,c]of t)l.push({name:u,fields:c.t.shapeDef,dbFields:c.t.__shapeDbFields});return l},transaction:l=>n.transaction?n.transaction(async u=>l(hp({executeQuery:d=>u(d)},e,t))):l(a)};return a}function To(n,e){return{executeQuery:async t=>{let{sql:r,params:s}=e(t);return n.query(r,s)},transaction:t=>{let r=n;if(!r.transaction)throw new se("weifuwu/db: \u5F53\u524D adapter \u65E0\u4E8B\u52A1\u80FD\u529B");return r.transaction(async s=>t(o=>{let{sql:i,params:a}=e(o);return s.query(i,a)}))}}}function Yn(n){let e=new Map;return{executeQuery:t=>Promise.resolve(n.executeQuery(t)),transaction:t=>{if(!n.snapshot||!n.restore)return t(s=>Promise.resolve(n.executeQuery(s)));let r=n.snapshot();return t(s=>Promise.resolve(n.executeQuery(s))).catch(s=>{throw n.restore(r),s})}}}var Ja,Za,er=I(()=>{"use strict";Qa();Jn();ye();Ja=null,Za=null});function Xa(n,e){let t={};if(!n)return t;for(let[r,s]of Object.entries(n)){if(r==="and"||r==="or"){let l=(Array.isArray(s)?s:[s]).map(u=>Xa(u,e));t[r]=l;continue}if(s===null||typeof s!="object")continue;let o=e.dbFields[r]?.column??r,i=s;if(i.eq===null&&Object.keys(i).length===1){t[o]={isNull:!0};continue}if(Object.keys(i).some(l=>l==="eq")&&Object.keys(i).length===1&&typeof i.eq!="object"){t[o]={eq:i.eq};continue}let a={};for(let[l,u]of Object.entries(i)){if(u===void 0)throw new se(`filter \u503C\u4E0D\u80FD\u4E3A undefined\uFF08\u5217 ${o} \u7B97\u5B50 ${l}\uFF09\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);if(u===null){if(l==="eq"){a.isNull=!0;continue}continue}if(!(l==="eq"&&u===null)){if(l==="contains"){a.ilike=`%${String(u).replace(/([%_])/g,"\\$1")}%`;continue}if(l==="startsWith"){a.ilike=`${String(u).replace(/([%_])/g,"\\$1")}%`;continue}if(l==="endsWith"){a.ilike=`%${String(u).replace(/([%_])/g,"\\$1")}`;continue}a[l]=u}}Object.keys(a).length&&(t[o]=a)}return t}var wp=I(()=>{"use strict";ye()});function Ya(n){let e=n;for(;;)if(e instanceof zn||e instanceof Kn||e instanceof Gn||e instanceof Yr)e=e.inner;else if(e instanceof es)e=e.inner;else break;return e}function yp(n){return n instanceof zn||n instanceof Gn||n instanceof Kn}function vn(n){return n.replace(/[-_](.)/g,(e,t)=>t.toUpperCase()).replace(/^(.)/,e=>e.toUpperCase())}function Co(n,e,t,r){let s=Ya(n);if(s instanceof Mt||s instanceof yn)return"String";if(s instanceof hn)return"Float";if(s instanceof wn)return"Boolean";if(s instanceof $t)return t.has(e)||(t.add(e),r.push(`enum ${e} { ${JSON.stringify(s.value)} }`)),e;if(s instanceof qt)return t.has(e)||(t.add(e),r.push(`enum ${e} { ${s.values.join(" ")} }`)),e;if(s instanceof Xr){let o=Co(s.itemSchema,`${e}Item`,t,r);return o?`[${o}!]`:null}return s instanceof Zr?"[Float!]":null}function el(n,e={}){let t=e.name??vn(n.table),r=new Set,s=[],o=[],i=[],a=[],l=[],u=[],c=new Set(e.hidden??[]),d=w=>c.has(w);for(let[w,m]of Object.entries(n.fields)){if(d(w))continue;let g=yp(m)?"":"!",h=Co(m,`${t}${vn(w)}Enum`,r,s);h&&o.push(` ${w}: ${h}${g}`);let b=Ya(m),k=b instanceof Mt||b instanceof yn?"str":b instanceof hn?"num":b instanceof wn?"bool":null;if(!k){if(b instanceof qt||b instanceof $t){let A=Co(m,`${t}${vn(w)}Enum`,r,s);A&&i.push(`input ${t}${vn(w)}Filter {
32
32
  eq: ${A}
33
33
  ne: ${A}
34
34
  in: [${A}!]
35
35
  notIn: [${A}!]
36
36
  isNull: Boolean
37
37
  }`)}continue}let _=["eq","ne","in","notIn","isNull"];k==="str"&&_.push("contains","ilike","startsWith","endsWith"),k==="num"&&_.push("gt","gte","lt","lte");let v=k==="num"?"Float":k==="bool"?"Boolean":"String",S=_.map(A=>` ${A}: ${A==="in"||A==="notIn"?`[${v}!]`:A==="isNull"?"Boolean":v}`).join(`
38
- `);o.push(`input ${t}${vn(h)}Filter {
38
+ `);i.push(`input ${t}${vn(w)}Filter {
39
39
  ${S}
40
- }`),a.push(` ${h}`)}for(let[h,f]of Object.entries(n.fields)){if(Ub(n,h)||d(h))continue;let g=Eo(f,`${t}${vn(h)}Enum`,r,s);if(!g)continue;let w=h===e.tenant?.field||hp(f)||n.dbFields[h]?.default!==void 0;l.push(` ${h}: ${g}${w?"":"!"}`),u.push(` ${h}: ${g}`)}let p=Object.keys(n.fields).filter(h=>{if(d(h))return!1;let f=Ja(n.fields[h]);return f instanceof Mt||f instanceof yn||f instanceof hn||f instanceof wn||f instanceof qt||f instanceof $t});return{typeDefs:[`type ${t} {
41
- ${i.join(`
40
+ }`),a.push(` ${w}`)}for(let[w,m]of Object.entries(n.fields)){if(Wb(n,w)||d(w))continue;let g=Co(m,`${t}${vn(w)}Enum`,r,s);if(!g)continue;let h=w===e.tenant?.field||yp(m)||n.dbFields[w]?.default!==void 0;l.push(` ${w}: ${g}${h?"":"!"}`),u.push(` ${w}: ${g}`)}let p=Object.keys(n.fields).filter(w=>{if(d(w))return!1;let m=Ya(n.fields[w]);return m instanceof Mt||m instanceof yn||m instanceof hn||m instanceof wn||m instanceof qt||m instanceof $t});return{typeDefs:[`type ${t} {
41
+ ${o.join(`
42
42
  `)}
43
- }`,...s,...o,`input ${t}Filter {
44
- ${p.map(h=>` ${h}: ${t}${vn(h)}Filter`).join(`
43
+ }`,...s,...i,`input ${t}Filter {
44
+ ${p.map(w=>` ${w}: ${t}${vn(w)}Filter`).join(`
45
45
  `)}
46
46
  and: [${t}Filter!]
47
47
  or: [${t}Filter!]
@@ -67,54 +67,54 @@ ${u.join(`
67
67
  ${ot(t)}Delete(id: ID!): ${t}
68
68
  }`].join(`
69
69
 
70
- `),resolvers:Bb(n,t,e)}}function Ub(n,e){let t=n.dbFields[e];return t?.default==="random"||t?.default==="now"}function ot(n){return n.replace(/^(.)/,e=>e.toLowerCase())}function Bb(n,e,t){let r=n.table,s=n.pkField??"id",i=new Set(t.hidden??[]),a=Object.keys(n.fields).filter(h=>!i.has(h)).map(h=>n.dbFields[h]?.column??h),l=h=>{let f=n.fromDb(h);for(let g of i)delete f[g];return f},u=t.sql??(h=>h.orm),c=t.tenant?n.dbFields[t.tenant.field]?.column??t.tenant.field:void 0;function d(h){return u(h).query}function p(h,f){let g=Qa(h,n);if(c&&f){let w=t.tenant.value(f);w!==void 0&&g[c]===void 0&&(g[c]={eq:w})}return g}async function m(h,f){let g=d(f).from(r).select(...a),w=p(h.filter,f);Object.keys(w).length&&g.where(w);let y=h.sort;if(y?.length)for(let _ of y)g.orderBy(n.dbFields[_.field]?.column??_.field,_.dir==="desc"?"desc":"asc");return h.limit!==void 0&&h.limit!==null&&g.limit(Math.min(Number(h.limit),t.maxLimit??100)),h.offset!==void 0&&h.offset!==null&&g.offset(Number(h.offset)),(await g.run()).map(_=>l(_))}return{Query:{[`${ot(e)}List`]:async(h,f,g)=>await m(f,g),[`${ot(e)}ListPage`]:async(h,f,g)=>{let w=await m(f,g),y=p(f.filter,g),k=await d(g).from(r).count("*","__total").where(y).run(),_=Number(k[0]?.__total??w.length);return{rows:w,total:Number.isFinite(_)?_:w.length}},[`${ot(e)}One`]:async(h,f,g)=>{let w=await d(g).from(r).select(...a).where(p(f.filter,g)).limit(1).run();return w[0]?l(w[0]):null}},Mutation:{[`${ot(e)}Insert`]:async(h,f,g)=>{let w={...f.data};if(t.tenant){let v=t.tenant.value(g);v!==void 0&&w[t.tenant.field]===void 0&&(w[t.tenant.field]=v)}let y=n.insertSchema().parse(w),k=n.toDb(y),_=await d(g).insert(r).values(k).returning(...a).run();return _[0]?l(_[0]):null},[`${ot(e)}Update`]:async(h,f,g)=>{let w=n.updateSchema().parse(f.patch),y=n.toDb(w),k=p({[s]:{eq:f.id}},g),_=await d(g).update(r).set(y).where(k).returning(...a).run();return _[0]?l(_[0]):null},[`${ot(e)}Delete`]:async(h,f,g)=>{let w=p({[s]:{eq:f.id}},g),y=await d(g).from(r).select(...a).where(w).run();return y.length?(await d(g).delete(r).where(w).run(),l(y[0])):null}}}}var wp=N(()=>{"use strict";gp();er();bn();xo({gql:Za})});function Xa(n,e={}){let t=e.name??n.table,r=new Set(e.hidden??[]),s=e.maxLimit??100,i=Object.keys(n.fields).filter(p=>!r.has(p)),o=i.map(p=>n.dbFields[p]?.column??p),a=new Set(i),l=n.pkField??"id",u=p=>{let m=n.fromDb(p);for(let h of r)delete m[h];return m},c=p=>{let m=p.orm;return typeof m.ctxTable=="function"?m.ctxTable(t):m.table(t)},d=async p=>{let m=await p.json().catch(()=>null);if(!m||typeof m!="object")throw new Error("invalid JSON body");return m};return{mount:(p,m)=>{p.get(m,async(h,f)=>{try{let g=e.hooks;await g?.beforeList?.(h,f);let w=new URL(h.url),y=c(f),{filter:k,sort:_,limit:v,offset:S}=Xn(w,n,{maxLimit:s,defaultLimit:20}),C=await y.paginate({filter:k,sort:_,limit:v,offset:S}),j=C.rows.map(u);return g?.afterList&&(j=await g.afterList(j,h,f)),Response.json({[t]:j,total:C.total})}catch(g){return Te(g)}}),p.get(`${m}/:id`,async(h,f)=>{try{let g=f.params.id,y=await c(f).select(...o).where({[l]:{eq:g}}).limit(1).run();return y.length?Response.json(u(y[0])):Response.json({error:"not found"},{status:404})}catch(g){return Te(g)}}),p.post(m,async(h,f)=>{try{await e.hooks?.beforeInsert?.(await d(h).catch(()=>({})),h,f);let g=await d(h),y=await c(f).insert(g).returning(...o).run();return Response.json(u(y[0]??{}),{status:201})}catch(g){return Te(g)}}),p.patch(`${m}/:id`,async(h,f)=>{try{let g=f.params.id;await e.hooks?.beforeUpdate?.(g,await d(h).catch(()=>({})),h,f);let w=await d(h),k=await c(f).update(w).where({[l]:{eq:g}}).returning(...o).run();return k.length?Response.json(u(k[0])):Response.json({error:"not found"},{status:404})}catch(g){return Te(g)}}),p.delete(`${m}/:id`,async(h,f)=>{try{let g=f.params.id;await e.hooks?.beforeDelete?.(g,h,f);let w=c(f);return(await w.select(...o).where({[l]:{eq:g}}).limit(1).run()).length?(await w.delete().where({[l]:{eq:g}}).run(),new Response(null,{status:204})):Response.json({error:"not found"},{status:404})}catch(g){return Te(g)}})}}}var yp=N(()=>{"use strict";er();La();xo({rest:Xa})});var G={};ie(G,{and:()=>F,between:()=>il,colRef:()=>zb,cols:()=>Ya,contains:()=>ul,endsWith:()=>dl,eq:()=>L,eqCol:()=>pl,gt:()=>el,gte:()=>tl,ilike:()=>ll,inArray:()=>sl,isNotNull:()=>ss,isNull:()=>ml,like:()=>al,lt:()=>nl,lte:()=>rl,mergeAppend:()=>Kb,mergeInc:()=>Gb,mergeNow:()=>Qb,monthStart:()=>Vb,ne:()=>rs,not:()=>gl,notInArray:()=>ol,now:()=>bp,nowAgo:()=>Fb,nowInterval:()=>Hb,or:()=>fl,startsWith:()=>cl});function Ya(n,e){return{}}function Hb(n,e="day"){return{__interval:[n,e]}}function Fb(n,e="day"){return{__interval:[-n,e]}}function F(...n){let e=n.filter(t=>Object.keys(t).length>0);return e.length===0?{}:e.length===1?e[0]:{and:e}}function fl(...n){let e=n.filter(t=>Object.keys(t).length>0);return e.length===0?{}:e.length===1?e[0]:{or:e}}function gl(n){let e=Object.keys(n);if(e.length===1){let t=e[0],r=n[t];if(r!==null&&typeof r=="object"){let s={...r};if(r.eq!==void 0)return{[t]:{ne:r.eq}};if(r.ne!==void 0)return{[t]:{eq:r.ne}};if(r.gt!==void 0)return{[t]:{lte:r.gt}};if(r.gte!==void 0)return{[t]:{lt:r.gte}};if(r.lt!==void 0)return{[t]:{gte:r.lt}};if(r.lte!==void 0)return{[t]:{gt:r.lte}};if(r.in!==void 0)return{[t]:{notIn:r.in}};if(r.notIn!==void 0)return{[t]:{in:r.notIn}};if(r.isNull!==void 0)return{[t]:{isNull:!r.isNull}}}if(r!==null&&typeof r!="object"&&!Array.isArray(r))return{[t]:{ne:r}}}throw new Error("ops.not: \u590D\u5408\u6761\u4EF6 NOT \u4E0D\u652F\u6301\uFF08\u5185\u5B58\u9762\uFF09\u2014\u2014\u8BF7\u7528 ne/notInArray \u8868\u8FBE")}function hl(n){return n.replace(/([%_])/g,"\\$1")}function Kb(n){return{__jsonbAppend:n}}function Gb(n=1){return{__inc:n}}var L,rs,el,tl,nl,rl,sl,ol,il,al,ll,ul,cl,dl,pl,ml,ss,bp,Vb,zb,Qb,wl=N(()=>{"use strict";L=(n,e)=>({[n.ref]:{eq:e}}),rs=(n,e)=>({[n.ref]:{ne:e}}),el=(n,e)=>({[n.ref]:{gt:e}}),tl=(n,e)=>({[n.ref]:{gte:e}}),nl=(n,e)=>({[n.ref]:{lt:e}}),rl=(n,e)=>({[n.ref]:{lte:e}}),sl=(n,e)=>({[n.ref]:{in:e}}),ol=(n,e)=>({[n.ref]:{notIn:e}}),il=(n,e,t)=>({[n.ref]:{between:[e,t]}}),al=(n,e)=>({[n.ref]:{like:e}}),ll=(n,e)=>({[n.ref]:{ilike:e}}),ul=(n,e)=>({[n.ref]:{ilike:`%${hl(e)}%`}}),cl=(n,e)=>({[n.ref]:{ilike:`${hl(e)}%`}}),dl=(n,e)=>({[n.ref]:{ilike:`%${hl(e)}`}}),pl=(n,e)=>({[n.ref]:{col:e.ref}}),ml=n=>({[n.ref]:{isNull:!0}}),ss=n=>({[n.ref]:{isNull:!1}}),bp=()=>({__now:!0});Vb=()=>({__monthStart:!0}),zb=n=>({__colRef:n});Qb=bp});function os(n,e){return{from(t){return new yl(n.query.from(t))}}}var yl,_p=N(()=>{"use strict";yl=class{rt;constructor(e){this.rt=e}join(e,t){return this.rt=this.rt.join(e,t),this}select(...e){return this.rt=this.rt.select(...e),this}where(e){return this.rt=this.rt.where(e),this}groupBy(...e){return this.rt=this.rt.groupBy(...e),this}having(e){return this.rt=this.rt.having(e),this}count(e="*",t,r){return this.rt=this.rt.count(e,t,r),this}sum(e,t,r){return this.rt=this.rt.sum(e,t,r),this}avg(e,t,r){return this.rt=this.rt.avg(e,t,r),this}min(e,t,r){return this.rt=this.rt.min(e,t,r),this}max(e,t,r){return this.rt=this.rt.max(e,t,r),this}vectorScore(e,t,r){return this.rt=this.rt.vectorScore(e,t,r),this}orderBy(e,t){return this.rt=this.rt.orderBy(e,t),this}limit(e){return this.rt=this.rt.limit(e),this}offset(e){return this.rt=this.rt.offset(e),this}distinct(){return this.rt=this.rt.distinct(),this}run(){return this.rt.run()}one(){return this.rt.one()}}});function To(n){let e=n.orm,t=e.table(is,_l.conversations),r=e.table(Ft,_l.members),s=e.table(bl,_l.messages),i=n.prefix??"/api/messages";async function o(I,$){let M=await e.query.from(`${is} c`).where({"c.type":{eq:"direct"}}).exists({kind:"select",table:Ft,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:I}}}).exists({kind:"select",table:Ft,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:$}}}).in("c.id",{kind:"select",table:Ft,alias:"m",cols:["conversation_id"],groupBy:["conversation_id"],having:{"count(*)":{eq:2}}}).select("c.id","c.type","c.created_by","c.created_at").limit(1).run();return M.length?M[0]:null}async function a(I,$,M){let W=I.table(Ft);for(let q of M)await W.insert({conversation_id:$,user_id:q}).onConflict(void 0,!1).run()}async function l(I,$){if($.type==="direct"){let W=[I,$.otherUserId].sort().join(":"),q=await o(I,$.otherUserId);if(q)return q;let D=async Y=>{let ee=await Y.table(is).insert({type:"direct",created_by:I,direct_key:W}).onConflict("direct_key").run();if(!ee.length)return null;let pe=ee[0];return await a(Y,String(pe.id),[I,$.otherUserId]),pe},B=await e.transaction(D);if(B)return B;let z=await t.select().where({type:{eq:"direct"},direct_key:{eq:W}}).run();if(z.length)return z[0];throw new T("Conversation creation failed",500)}let M=[I,...$.memberIds.filter(W=>W!==I)];return u(I,"group",M)}async function u(I,$,M){let W=async q=>{let z=(await q.table(is).insert({type:$,created_by:I}).run())[0];return await a(q,String(z.id),M),z};return e.transaction(W)}async function c(I){let $=await e.query.from(`${Ft} m`).join(`${is} c`,{"c.id":{col:"m.conversation_id"}}).where({"m.user_id":{eq:I}}).select("c.id","c.type","c.created_by","c.created_at","m.last_read_at").run(),M=[];for(let W of $){let q=String(W.id),D=await s.select().where({conversation_id:{eq:q},deleted_at:{isNull:!0}}).orderBy("created_at","desc").orderBy("id","desc").limit(1).run(),B=await s.select().where({conversation_id:{eq:q},deleted_at:{isNull:!0},...W.last_read_at?{created_at:{gt:String(W.last_read_at)}}:{},or:[{sender_id:{isNull:!0}},{sender_id:{ne:I}}]}).count().run();M.push({id:q,type:W.type,created_by:W.created_by,created_at:new Date(W.created_at).toISOString(),last_message:D.length?y(D[0]):null,unread_count:Number(B[0].count)})}return M.sort((W,q)=>{let D=W.last_message?Date.parse(W.last_message.created_at):Date.parse(W.created_at);return(q.last_message?Date.parse(q.last_message.created_at):Date.parse(q.created_at))-D}),M}async function d(I,$){if(!await p(I,$))return null;let M=await t.select().where({id:{eq:I}}).run();return M.length?M[0]:null}async function p(I,$){return r.exists({conversation_id:{eq:I},user_id:{eq:$}})}async function m(I,$){let M=await s.insert({conversation_id:I,sender_type:$.senderType,sender_id:$.senderId??null,content:$.content,msg_type:$.msgType??"text"}).run();return y(M[0])}async function h(I,$){let M=$.limit??50,W=s.select().where({conversation_id:{eq:I}});if($.before){let[D]=await s.select("created_at","id").where({id:{eq:$.before}}).run();D&&W.where({or:[{created_at:{lt:D.created_at}},{created_at:{eq:D.created_at},id:{lt:D.id}}]})}return(await W.orderBy("created_at","desc").orderBy("id","desc").limit(M).run()).map(y)}async function f(I,$){let M=await s.update({content:$,edited_at:new Date().toISOString()}).where({id:{eq:I},deleted_at:{isNull:!0}}).returning("*").run();return M.length?y(M[0]):null}async function g(I){return(await s.update({deleted_at:new Date().toISOString()}).where({id:{eq:I},deleted_at:{isNull:!0}}).returning("id").run()).length>0}async function w(I,$){await r.update({last_read_at:new Date().toISOString()}).where({conversation_id:{eq:I},user_id:{eq:$}}).run()}function y(I){return{id:I.id,conversation_id:I.conversation_id,sender_type:I.sender_type,sender_id:I.sender_id,content:I.content,msg_type:I.msg_type,created_at:new Date(I.created_at).toISOString(),edited_at:I.edited_at?new Date(I.edited_at).toISOString():null,deleted_at:I.deleted_at?new Date(I.deleted_at).toISOString():null}}let k="wf:msg:",_=new Map,v=new Map,S=null;function A(){let I=n.redis;!I||S||(S=I.createSubscriber(),S?.connect()?.then(()=>{S.psubscribe(`${k}*`,($,M)=>{try{let W=$.slice(k.length),q=JSON.parse(M);if(q._pid===C)return;j(W,q)}catch{}})}).catch($=>{console.error("[messager] redis subscriber init error:",$)}))}let C=`wf:${process.pid}:${++Jb}`;function j(I,$){let M=_.get(I);if(!M)return;let{_pid:W,...q}=$,D=JSON.stringify(q);for(let B of[...M])if(B.readyState===B.OPEN)try{B.send(D)}catch{}}function K(I,$){j(I,$);let M=n.redis;M&&M.publish(`${k}${I}`,JSON.stringify({...$,_pid:C})).catch(W=>{console.error("[messager] redis publish error:",W)})}function U(I,$){K(`user:${I}`,$)}function H(I,$){let M=_.get(I);M||(M=new Set,_.set(I,M)),M.add($);let W=v.get($);W||(W=new Set,v.set($,W)),W.add(I)}function V(I,$){_.get(I)?.delete($),_.get(I)?.size===0&&_.delete(I),v.get($)?.delete(I)}function Q(I){let $=v.get(I);if($)for(let M of[...$])V(M,I);v.delete(I)}function P(I){let $=new Map;return{async open(M,W){if(I?.verifyToken){let q=W.query.token;if(q){let D=await I.verifyToken(q);D?.sub&&$.set(M,D.sub)}if(!$.has(M)){M.send(JSON.stringify({type:"unauthorized"}));return}}M.send(JSON.stringify({type:"connected"}))},async message(M,W,q){try{let D=JSON.parse(q.toString());if(D.type==="ping")M.send(JSON.stringify({type:"pong"}));else if(D.type==="subscribe"&&D.room){if(I?.verifyToken){let B=$.get(M);if(!B){M.send(JSON.stringify({type:"error",code:"unauthorized",room:D.room}));return}if(I.authorizeRoom&&!await I.authorizeRoom(B,D.room)){M.send(JSON.stringify({type:"error",code:"forbidden",room:D.room}));return}}H(D.room,M),M.send(JSON.stringify({type:"subscribed",room:D.room}))}else D.type==="unsubscribe"&&D.room&&V(D.room,M)}catch{}},close(M){Q(M),$.delete(M)},error(M){Q(M),$.delete(M)}}}async function E(){if(S){try{await S.close?.()}catch{}S=null}_.clear(),v.clear()}let x={handler:P,broadcast:K,sendTo:U,join:H,leave:V,close:E,createConversation:l,listConversations:c,getConversationForUser:d,isMember:p,sendMessage:m,listMessages:h,editMessage:f,deleteMessage:g,markRead:w};A();let O=(async(I,$,M)=>($.msg=x,M(I,$)));return O.client=x,O.__meta={injects:["msg"],depends:[]},O.routes=(I,$)=>{let M=$?.prefix??i;async function W(q,D){if(!D.user)throw new T("Unauthorized",401);if(!await p(q,D.user.id))throw new T("Forbidden: not a conversation member",403)}I.post(`${M}/conversations`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=await q.json().catch(()=>({}));if(B.type==="direct"&&B.otherUserId){let z=await l(D.user.id,{type:"direct",otherUserId:B.otherUserId});return et(z)}if(B.type==="group"&&Array.isArray(B.memberIds)){let z=await l(D.user.id,{type:"group",memberIds:B.memberIds});return et(z)}return We("conversation input invalid")}),I.get(`${M}/conversations`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);return Ne(await c(D.user.id))}),I.get(`${M}/conversations/:id/messages`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=D.params.id;await W(B,D);let z=new URL(q.url),Y=z.searchParams.get("before")??void 0,te=Math.min(100,Math.max(1,Number(z.searchParams.get("limit")??50)||50));return Ne(await h(B,{before:Y,limit:te}))}),I.post(`${M}/conversations/:id/messages`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=D.params.id;await W(B,D);let z=await q.json().catch(()=>({}));if(!z.content?.trim())return We("content is required");let Y=await m(B,{senderType:"user",senderId:D.user.id,content:z.content,msgType:z.msgType??"text"});return K(`conv:${B}`,{type:"new_message",message:Y}),et(Y)}),I.post(`${M}/conversations/:id/read`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=D.params.id;return await W(B,D),await w(B,D.user.id),gn()}),I.patch(`${M}/messages/:id`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=D.params.id,z=await q.json().catch(()=>({}));if(!z.content?.trim())return We("content is required");let Y=await e.query.from(`${bl} m`).join(`${Ft} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:B},"mem.user_id":{eq:String(D.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!Y.length)return We("message not found");let te=Y[0];if(te.sender_type==="user"&&te.sender_id!==D.user.id)throw new T("Forbidden: not your message",403);let ee=await f(B,z.content);return ee?(K(`conv:${ee.conversation_id}`,{type:"message_edited",message:ee}),Ne(ee)):We("message not found")}),I.delete(`${M}/messages/:id`,async(q,D)=>{if(!D.user)throw new T("Unauthorized",401);let B=D.params.id,z=await e.query.from(`${bl} m`).join(`${Ft} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:B},"mem.user_id":{eq:String(D.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!z.length)return We("message not found");let Y=z[0];if(Y.sender_type==="user"&&Y.sender_id!==D.user.id)throw new T("Forbidden: not your message",403);return await g(B),K(`conv:${Y.conversation_id}`,{type:"message_deleted",messageId:B}),gn()})},O}var Jb,is,Ft,bl,_l,Co,vp=N(()=>{"use strict";ze();bn();Jn();Hn();Jb=0,is="_weifuwu_conversations",Ft="_weifuwu_conversation_members",bl="_weifuwu_messages",_l={conversations:{id:R.pk(b.uuid()),type:b.string().meta({notNull:!0,default:"direct"}),created_by:b.uuid().nullable(),direct_key:b.string().nullable(),created_at:R.now(b.date())},members:{conversation_id:R.req(b.uuid()),user_id:R.req(b.uuid()),last_read_at:b.date().nullable(),joined_at:R.now(b.date())},messages:{id:R.pk(b.uuid()),conversation_id:R.req(b.uuid()),sender_type:b.string().meta({notNull:!0,default:"user"}),sender_id:b.uuid().nullable(),content:R.req(b.string()),msg_type:b.string().meta({notNull:!0,default:"text"}),created_at:R.now(b.date()),edited_at:b.date().nullable(),deleted_at:b.date().nullable()}};Co={tables:[{name:"_weifuwu_conversations",columns:{id:R.pk(b.uuid()),type:b.string().meta({default:"direct"}),created_by:b.uuid(),direct_key:b.string().nullable().meta({unique:!0}),created_at:b.date().meta({default:"now"})}},{name:"_weifuwu_conversation_members",columns:{conversation_id:R.req(b.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),user_id:R.req(b.uuid()),last_read_at:b.date(),joined_at:b.date().meta({default:"now"})},uniques:[["conversation_id","user_id"]]},{name:"_weifuwu_messages",columns:{id:R.pk(b.uuid()),conversation_id:R.req(b.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),sender_type:b.string().meta({default:"user"}),sender_id:b.uuid(),content:b.string().meta({notNull:!0}),msg_type:b.string().meta({default:"text"}),created_at:b.date().meta({default:"now"}),edited_at:b.date(),deleted_at:b.date()},indexes:[{cols:["conversation_id",{col:"created_at",desc:!0},{col:"id",desc:!0}],name:"idx_messages_conv"}]}]}});function kt(n,e,t){if(e.length!==t)throw new Error(`std.${n}: \u671F\u671B ${t} \u4E2A\u53C2\u6570\uFF0C\u6536\u5230 ${e.length}`)}function tr(n,e,t){let r=Number(e);if(!Number.isFinite(r))throw new Error(`std.${n}: \u53C2\u6570 ${t+1} \u4E0D\u662F\u6709\u9650\u6570\u5B57\uFF08${String(e)}\uFF09`);return r}var kp,Sp,xp,vl,kl,Rp,Ao=N(()=>{"use strict";kp={sum:n=>{kt("sum",n,1);let e=n[0];if(!Array.isArray(e))throw new Error("std.sum: \u671F\u671B\u6570\u7EC4");return e.reduce((t,r)=>t+tr("sum",r,0),0)},avg:n=>{kt("avg",n,1);let e=n[0];if(!Array.isArray(e))throw new Error("std.avg: \u671F\u671B\u6570\u7EC4");if(e.length===0)throw new Error("std.avg: \u7A7A\u6570\u7EC4");return e.reduce((t,r)=>t+tr("avg",r,0),0)/e.length},clamp:n=>{kt("clamp",n,3);let e=tr("clamp",n[0],0),t=tr("clamp",n[1],1),r=tr("clamp",n[2],2);if(t>r)throw new Error("std.clamp: lo > hi");return Math.min(r,Math.max(t,e))}},Sp={upper:n=>{if(kt("upper",n,1),typeof n[0]!="string")throw new Error(`std.upper: \u671F\u671B\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`);return n[0].toUpperCase()},lower:n=>{if(kt("lower",n,1),typeof n[0]!="string")throw new Error(`std.lower: \u671F\u671B\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`);return n[0].toLowerCase()},join:n=>{if(kt("join",n,2),!Array.isArray(n[0])||typeof n[1]!="string")throw new Error("std.join: \u671F\u671B(\u6570\u7EC4, \u5206\u9694\u7B26)");return n[0].map(e=>String(e)).join(n[1])},split:n=>{if(kt("split",n,2),typeof n[0]!="string"||typeof n[1]!="string")throw new Error("std.split: \u671F\u671B(\u5B57\u7B26\u4E32, \u5206\u9694\u7B26)");return n[0].split(n[1])}},xp={count:n=>{if(kt("count",n,1),Array.isArray(n[0])||typeof n[0]=="string")return n[0].length;throw new Error(`std.count: \u671F\u671B\u6570\u7EC4\u6216\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`)},pick:n=>{if(kt("pick",n,2),!Array.isArray(n[0]))throw new Error("std.pick: \u671F\u671B\u6570\u7EC4");let e=tr("pick",n[1],1);if(!Number.isInteger(e)||e<0||e>=n[0].length)throw new Error(`std.pick: \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08\u957F\u5EA6 ${n[0].length}\uFF09`);return n[0][e]}},vl={"wf://std/math":kp,"wf://std/strings":Sp,"wf://std/collections":xp},kl={...kp,...Sp,...xp},Rp=Object.keys(kl)});function n_(n){let e=[],t=0,r=n.length;for(;t<r;){let s=n[t];if(s===" "||s===" "||s===`
70
+ `),resolvers:Ub(n,t,e)}}function Wb(n,e){let t=n.dbFields[e];return t?.default==="random"||t?.default==="now"}function ot(n){return n.replace(/^(.)/,e=>e.toLowerCase())}function Ub(n,e,t){let r=n.table,s=n.pkField??"id",o=new Set(t.hidden??[]),a=Object.keys(n.fields).filter(w=>!o.has(w)).map(w=>n.dbFields[w]?.column??w),l=w=>{let m=n.fromDb(w);for(let g of o)delete m[g];return m},u=t.sql??(w=>w.orm),c=t.tenant?n.dbFields[t.tenant.field]?.column??t.tenant.field:void 0;function d(w){return u(w).query}function p(w,m){let g=Xa(w,n);if(c&&m){let h=t.tenant.value(m);h!==void 0&&g[c]===void 0&&(g[c]={eq:h})}return g}async function f(w,m){let g=d(m).from(r).select(...a),h=p(w.filter,m);Object.keys(h).length&&g.where(h);let b=w.sort;if(b?.length)for(let _ of b)g.orderBy(n.dbFields[_.field]?.column??_.field,_.dir==="desc"?"desc":"asc");return w.limit!==void 0&&w.limit!==null&&g.limit(Math.min(Number(w.limit),t.maxLimit??100)),w.offset!==void 0&&w.offset!==null&&g.offset(Number(w.offset)),(await g.run()).map(_=>l(_))}return{Query:{[`${ot(e)}List`]:async(w,m,g)=>await f(m,g),[`${ot(e)}ListPage`]:async(w,m,g)=>{let h=await f(m,g),b=p(m.filter,g),k=await d(g).from(r).count("*","__total").where(b).run(),_=Number(k[0]?.__total??h.length);return{rows:h,total:Number.isFinite(_)?_:h.length}},[`${ot(e)}One`]:async(w,m,g)=>{let h=await d(g).from(r).select(...a).where(p(m.filter,g)).limit(1).run();return h[0]?l(h[0]):null}},Mutation:{[`${ot(e)}Insert`]:async(w,m,g)=>{let h={...m.data};if(t.tenant){let v=t.tenant.value(g);v!==void 0&&h[t.tenant.field]===void 0&&(h[t.tenant.field]=v)}let b=n.insertSchema().parse(h),k=n.toDb(b),_=await d(g).insert(r).values(k).returning(...a).run();return _[0]?l(_[0]):null},[`${ot(e)}Update`]:async(w,m,g)=>{let h=n.updateSchema().parse(m.patch),b=n.toDb(h),k=p({[s]:{eq:m.id}},g),_=await d(g).update(r).set(b).where(k).returning(...a).run();return _[0]?l(_[0]):null},[`${ot(e)}Delete`]:async(w,m,g)=>{let h=p({[s]:{eq:m.id}},g),b=await d(g).from(r).select(...a).where(h).run();return b.length?(await d(g).delete(r).where(h).run(),l(b[0])):null}}}}var bp=I(()=>{"use strict";wp();er();bn();Eo({gql:el})});function tl(n,e={}){let t=e.name??n.table,r=new Set(e.hidden??[]),s=e.maxLimit??100,o=Object.keys(n.fields).filter(p=>!r.has(p)),i=o.map(p=>n.dbFields[p]?.column??p),a=new Set(o),l=n.pkField??"id",u=p=>{let f=n.fromDb(p);for(let w of r)delete f[w];return f},c=p=>{let f=p.orm;return typeof f.ctxTable=="function"?f.ctxTable(t):f.table(t)},d=async p=>{let f=await p.json().catch(()=>null);if(!f||typeof f!="object")throw new Error("invalid JSON body");return f};return{mount:(p,f)=>{p.get(f,async(w,m)=>{try{let g=e.hooks;await g?.beforeList?.(w,m);let h=new URL(w.url),b=c(m),{filter:k,sort:_,limit:v,offset:S}=Xn(h,n,{maxLimit:s,defaultLimit:20}),C=await b.paginate({filter:k,sort:_,limit:v,offset:S}),W=C.rows.map(u);return g?.afterList&&(W=await g.afterList(W,w,m)),Response.json({[t]:W,total:C.total})}catch(g){return Ae(g)}}),p.get(`${f}/:id`,async(w,m)=>{try{let g=m.params.id,b=await c(m).select(...i).where({[l]:{eq:g}}).limit(1).run();return b.length?Response.json(u(b[0])):Response.json({error:"not found"},{status:404})}catch(g){return Ae(g)}}),p.post(f,async(w,m)=>{try{await e.hooks?.beforeInsert?.(await d(w).catch(()=>({})),w,m);let g=await d(w),b=await c(m).insert(g).returning(...i).run();return Response.json(u(b[0]??{}),{status:201})}catch(g){return Ae(g)}}),p.patch(`${f}/:id`,async(w,m)=>{try{let g=m.params.id;await e.hooks?.beforeUpdate?.(g,await d(w).catch(()=>({})),w,m);let h=await d(w),k=await c(m).update(h).where({[l]:{eq:g}}).returning(...i).run();return k.length?Response.json(u(k[0])):Response.json({error:"not found"},{status:404})}catch(g){return Ae(g)}}),p.delete(`${f}/:id`,async(w,m)=>{try{let g=m.params.id;await e.hooks?.beforeDelete?.(g,w,m);let h=c(m);return(await h.select(...i).where({[l]:{eq:g}}).limit(1).run()).length?(await h.delete().where({[l]:{eq:g}}).run(),new Response(null,{status:204})):Response.json({error:"not found"},{status:404})}catch(g){return Ae(g)}})}}}var _p=I(()=>{"use strict";er();Ba();Eo({rest:tl})});var Q={};ie(Q,{and:()=>V,between:()=>ul,colRef:()=>Vb,cols:()=>nl,contains:()=>pl,endsWith:()=>fl,eq:()=>L,eqCol:()=>gl,gt:()=>rl,gte:()=>sl,ilike:()=>dl,inArray:()=>al,isNotNull:()=>as,isNull:()=>hl,like:()=>cl,lt:()=>ol,lte:()=>il,mergeAppend:()=>zb,mergeInc:()=>Kb,mergeNow:()=>Gb,monthStart:()=>Fb,ne:()=>is,not:()=>yl,notInArray:()=>ll,now:()=>vp,nowAgo:()=>Hb,nowInterval:()=>Bb,or:()=>wl,startsWith:()=>ml});function nl(n,e){return{}}function Bb(n,e="day"){return{__interval:[n,e]}}function Hb(n,e="day"){return{__interval:[-n,e]}}function V(...n){let e=n.filter(t=>Object.keys(t).length>0);return e.length===0?{}:e.length===1?e[0]:{and:e}}function wl(...n){let e=n.filter(t=>Object.keys(t).length>0);return e.length===0?{}:e.length===1?e[0]:{or:e}}function yl(n){let e=Object.keys(n);if(e.length===1){let t=e[0],r=n[t];if(r!==null&&typeof r=="object"){let s={...r};if(r.eq!==void 0)return{[t]:{ne:r.eq}};if(r.ne!==void 0)return{[t]:{eq:r.ne}};if(r.gt!==void 0)return{[t]:{lte:r.gt}};if(r.gte!==void 0)return{[t]:{lt:r.gte}};if(r.lt!==void 0)return{[t]:{gte:r.lt}};if(r.lte!==void 0)return{[t]:{gt:r.lte}};if(r.in!==void 0)return{[t]:{notIn:r.in}};if(r.notIn!==void 0)return{[t]:{in:r.notIn}};if(r.isNull!==void 0)return{[t]:{isNull:!r.isNull}}}if(r!==null&&typeof r!="object"&&!Array.isArray(r))return{[t]:{ne:r}}}throw new Error("ops.not: \u590D\u5408\u6761\u4EF6 NOT \u4E0D\u652F\u6301\uFF08\u5185\u5B58\u9762\uFF09\u2014\u2014\u8BF7\u7528 ne/notInArray \u8868\u8FBE")}function bl(n){return n.replace(/([%_])/g,"\\$1")}function zb(n){return{__jsonbAppend:n}}function Kb(n=1){return{__inc:n}}var L,is,rl,sl,ol,il,al,ll,ul,cl,dl,pl,ml,fl,gl,hl,as,vp,Fb,Vb,Gb,_l=I(()=>{"use strict";L=(n,e)=>({[n.ref]:{eq:e}}),is=(n,e)=>({[n.ref]:{ne:e}}),rl=(n,e)=>({[n.ref]:{gt:e}}),sl=(n,e)=>({[n.ref]:{gte:e}}),ol=(n,e)=>({[n.ref]:{lt:e}}),il=(n,e)=>({[n.ref]:{lte:e}}),al=(n,e)=>({[n.ref]:{in:e}}),ll=(n,e)=>({[n.ref]:{notIn:e}}),ul=(n,e,t)=>({[n.ref]:{between:[e,t]}}),cl=(n,e)=>({[n.ref]:{like:e}}),dl=(n,e)=>({[n.ref]:{ilike:e}}),pl=(n,e)=>({[n.ref]:{ilike:`%${bl(e)}%`}}),ml=(n,e)=>({[n.ref]:{ilike:`${bl(e)}%`}}),fl=(n,e)=>({[n.ref]:{ilike:`%${bl(e)}`}}),gl=(n,e)=>({[n.ref]:{col:e.ref}}),hl=n=>({[n.ref]:{isNull:!0}}),as=n=>({[n.ref]:{isNull:!1}}),vp=()=>({__now:!0});Fb=()=>({__monthStart:!0}),Vb=n=>({__colRef:n});Gb=vp});function ls(n,e){return{from(t){return new vl(n.query.from(t))}}}var vl,kp=I(()=>{"use strict";vl=class{rt;constructor(e){this.rt=e}join(e,t){return this.rt=this.rt.join(e,t),this}select(...e){return this.rt=this.rt.select(...e),this}where(e){return this.rt=this.rt.where(e),this}groupBy(...e){return this.rt=this.rt.groupBy(...e),this}having(e){return this.rt=this.rt.having(e),this}count(e="*",t,r){return this.rt=this.rt.count(e,t,r),this}sum(e,t,r){return this.rt=this.rt.sum(e,t,r),this}avg(e,t,r){return this.rt=this.rt.avg(e,t,r),this}min(e,t,r){return this.rt=this.rt.min(e,t,r),this}max(e,t,r){return this.rt=this.rt.max(e,t,r),this}vectorScore(e,t,r){return this.rt=this.rt.vectorScore(e,t,r),this}orderBy(e,t){return this.rt=this.rt.orderBy(e,t),this}limit(e){return this.rt=this.rt.limit(e),this}offset(e){return this.rt=this.rt.offset(e),this}distinct(){return this.rt=this.rt.distinct(),this}run(){return this.rt.run()}one(){return this.rt.one()}}});function Ao(n){let e=n.orm,t=e.table(us,Sl.conversations),r=e.table(Ft,Sl.members),s=e.table(kl,Sl.messages),o=n.prefix??"/api/messages";async function i(N,D){let q=await e.query.from(`${us} c`).where({"c.type":{eq:"direct"}}).exists({kind:"select",table:Ft,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:N}}}).exists({kind:"select",table:Ft,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:D}}}).in("c.id",{kind:"select",table:Ft,alias:"m",cols:["conversation_id"],groupBy:["conversation_id"],having:{"count(*)":{eq:2}}}).select("c.id","c.type","c.created_by","c.created_at").limit(1).run();return q.length?q[0]:null}async function a(N,D,q){let B=N.table(Ft);for(let $ of q)await B.insert({conversation_id:D,user_id:$}).onConflict(void 0,!1).run()}async function l(N,D){if(D.type==="direct"){let B=[N,D.otherUserId].sort().join(":"),$=await i(N,D.otherUserId);if($)return $;let j=async Y=>{let te=await Y.table(us).insert({type:"direct",created_by:N,direct_key:B}).onConflict("direct_key").run();if(!te.length)return null;let ge=te[0];return await a(Y,String(ge.id),[N,D.otherUserId]),ge},H=await e.transaction(j);if(H)return H;let z=await t.select().where({type:{eq:"direct"},direct_key:{eq:B}}).run();if(z.length)return z[0];throw new T("Conversation creation failed",500)}let q=[N,...D.memberIds.filter(B=>B!==N)];return u(N,"group",q)}async function u(N,D,q){let B=async $=>{let z=(await $.table(us).insert({type:D,created_by:N}).run())[0];return await a($,String(z.id),q),z};return e.transaction(B)}async function c(N){let D=await e.query.from(`${Ft} m`).join(`${us} c`,{"c.id":{col:"m.conversation_id"}}).where({"m.user_id":{eq:N}}).select("c.id","c.type","c.created_by","c.created_at","m.last_read_at").run(),q=[];for(let B of D){let $=String(B.id),j=await s.select().where({conversation_id:{eq:$},deleted_at:{isNull:!0}}).orderBy("created_at","desc").orderBy("id","desc").limit(1).run(),H=await s.select().where({conversation_id:{eq:$},deleted_at:{isNull:!0},...B.last_read_at?{created_at:{gt:String(B.last_read_at)}}:{},or:[{sender_id:{isNull:!0}},{sender_id:{ne:N}}]}).count().run();q.push({id:$,type:B.type,created_by:B.created_by,created_at:new Date(B.created_at).toISOString(),last_message:j.length?b(j[0]):null,unread_count:Number(H[0].count)})}return q.sort((B,$)=>{let j=B.last_message?Date.parse(B.last_message.created_at):Date.parse(B.created_at);return($.last_message?Date.parse($.last_message.created_at):Date.parse($.created_at))-j}),q}async function d(N,D){if(!await p(N,D))return null;let q=await t.select().where({id:{eq:N}}).run();return q.length?q[0]:null}async function p(N,D){return r.exists({conversation_id:{eq:N},user_id:{eq:D}})}async function f(N,D){let q=await s.insert({conversation_id:N,sender_type:D.senderType,sender_id:D.senderId??null,content:D.content,msg_type:D.msgType??"text"}).run();return b(q[0])}async function w(N,D){let q=D.limit??50,B=s.select().where({conversation_id:{eq:N}});if(D.before){let[j]=await s.select("created_at","id").where({id:{eq:D.before}}).run();j&&B.where({or:[{created_at:{lt:j.created_at}},{created_at:{eq:j.created_at},id:{lt:j.id}}]})}return(await B.orderBy("created_at","desc").orderBy("id","desc").limit(q).run()).map(b)}async function m(N,D){let q=await s.update({content:D,edited_at:new Date().toISOString()}).where({id:{eq:N},deleted_at:{isNull:!0}}).returning("*").run();return q.length?b(q[0]):null}async function g(N){return(await s.update({deleted_at:new Date().toISOString()}).where({id:{eq:N},deleted_at:{isNull:!0}}).returning("id").run()).length>0}async function h(N,D){await r.update({last_read_at:new Date().toISOString()}).where({conversation_id:{eq:N},user_id:{eq:D}}).run()}function b(N){return{id:N.id,conversation_id:N.conversation_id,sender_type:N.sender_type,sender_id:N.sender_id,content:N.content,msg_type:N.msg_type,created_at:new Date(N.created_at).toISOString(),edited_at:N.edited_at?new Date(N.edited_at).toISOString():null,deleted_at:N.deleted_at?new Date(N.deleted_at).toISOString():null}}let k="wf:msg:",_=new Map,v=new Map,S=null;function A(){let N=n.redis;!N||S||(S=N.createSubscriber(),S?.connect()?.then(()=>{S.psubscribe(`${k}*`,(D,q)=>{try{let B=D.slice(k.length),$=JSON.parse(q);if($._pid===C)return;W(B,$)}catch{}})}).catch(D=>{console.error("[messager] redis subscriber init error:",D)}))}let C=`wf:${process.pid}:${++Qb}`;function W(N,D){let q=_.get(N);if(!q)return;let{_pid:B,...$}=D,j=JSON.stringify($);for(let H of[...q])if(H.readyState===H.OPEN)try{H.send(j)}catch{}}function G(N,D){W(N,D);let q=n.redis;q&&q.publish(`${k}${N}`,JSON.stringify({...D,_pid:C})).catch(B=>{console.error("[messager] redis publish error:",B)})}function U(N,D){G(`user:${N}`,D)}function F(N,D){let q=_.get(N);q||(q=new Set,_.set(N,q)),q.add(D);let B=v.get(D);B||(B=new Set,v.set(D,B)),B.add(N)}function K(N,D){_.get(N)?.delete(D),_.get(N)?.size===0&&_.delete(N),v.get(D)?.delete(N)}function M(N){let D=v.get(N);if(D)for(let q of[...D])K(q,N);v.delete(N)}function O(N){let D=new Map;return{async open(q,B){if(N?.verifyToken){let $=B.query.token;if($){let j=await N.verifyToken($);j?.sub&&D.set(q,j.sub)}if(!D.has(q)){q.send(JSON.stringify({type:"unauthorized"}));return}}q.send(JSON.stringify({type:"connected"}))},async message(q,B,$){try{let j=JSON.parse($.toString());if(j.type==="ping")q.send(JSON.stringify({type:"pong"}));else if(j.type==="subscribe"&&j.room){if(N?.verifyToken){let H=D.get(q);if(!H){q.send(JSON.stringify({type:"error",code:"unauthorized",room:j.room}));return}if(N.authorizeRoom&&!await N.authorizeRoom(H,j.room)){q.send(JSON.stringify({type:"error",code:"forbidden",room:j.room}));return}}F(j.room,q),q.send(JSON.stringify({type:"subscribed",room:j.room}))}else j.type==="unsubscribe"&&j.room&&K(j.room,q)}catch{}},close(q){M(q),D.delete(q)},error(q){M(q),D.delete(q)}}}async function E(){if(S){try{await S.close?.()}catch{}S=null}_.clear(),v.clear()}let x={handler:O,broadcast:G,sendTo:U,join:F,leave:K,close:E,createConversation:l,listConversations:c,getConversationForUser:d,isMember:p,sendMessage:f,listMessages:w,editMessage:m,deleteMessage:g,markRead:h};A();let P=(async(N,D,q)=>(D.msg=x,q(N,D)));return P.client=x,P.__meta={injects:["msg"],depends:[]},P.routes=(N,D)=>{let q=D?.prefix??o;async function B($,j){if(!j.user)throw new T("Unauthorized",401);if(!await p($,j.user.id))throw new T("Forbidden: not a conversation member",403)}N.post(`${q}/conversations`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=await $.json().catch(()=>({}));if(H.type==="direct"&&H.otherUserId){let z=await l(j.user.id,{type:"direct",otherUserId:H.otherUserId});return et(z)}if(H.type==="group"&&Array.isArray(H.memberIds)){let z=await l(j.user.id,{type:"group",memberIds:H.memberIds});return et(z)}return Ue("conversation input invalid")}),N.get(`${q}/conversations`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);return Me(await c(j.user.id))}),N.get(`${q}/conversations/:id/messages`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=j.params.id;await B(H,j);let z=new URL($.url),Y=z.searchParams.get("before")??void 0,ee=Math.min(100,Math.max(1,Number(z.searchParams.get("limit")??50)||50));return Me(await w(H,{before:Y,limit:ee}))}),N.post(`${q}/conversations/:id/messages`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=j.params.id;await B(H,j);let z=await $.json().catch(()=>({}));if(!z.content?.trim())return Ue("content is required");let Y=await f(H,{senderType:"user",senderId:j.user.id,content:z.content,msgType:z.msgType??"text"});return G(`conv:${H}`,{type:"new_message",message:Y}),et(Y)}),N.post(`${q}/conversations/:id/read`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=j.params.id;return await B(H,j),await h(H,j.user.id),gn()}),N.patch(`${q}/messages/:id`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=j.params.id,z=await $.json().catch(()=>({}));if(!z.content?.trim())return Ue("content is required");let Y=await e.query.from(`${kl} m`).join(`${Ft} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:H},"mem.user_id":{eq:String(j.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!Y.length)return Ue("message not found");let ee=Y[0];if(ee.sender_type==="user"&&ee.sender_id!==j.user.id)throw new T("Forbidden: not your message",403);let te=await m(H,z.content);return te?(G(`conv:${te.conversation_id}`,{type:"message_edited",message:te}),Me(te)):Ue("message not found")}),N.delete(`${q}/messages/:id`,async($,j)=>{if(!j.user)throw new T("Unauthorized",401);let H=j.params.id,z=await e.query.from(`${kl} m`).join(`${Ft} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:H},"mem.user_id":{eq:String(j.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!z.length)return Ue("message not found");let Y=z[0];if(Y.sender_type==="user"&&Y.sender_id!==j.user.id)throw new T("Forbidden: not your message",403);return await g(H),G(`conv:${Y.conversation_id}`,{type:"message_deleted",messageId:H}),gn()})},P}var Qb,us,Ft,kl,Sl,Oo,Sp=I(()=>{"use strict";Ke();bn();Jn();Hn();Qb=0,us="_weifuwu_conversations",Ft="_weifuwu_conversation_members",kl="_weifuwu_messages",Sl={conversations:{id:R.pk(y.uuid()),type:y.string().meta({notNull:!0,default:"direct"}),created_by:y.uuid().nullable(),direct_key:y.string().nullable(),created_at:R.now(y.date())},members:{conversation_id:R.req(y.uuid()),user_id:R.req(y.uuid()),last_read_at:y.date().nullable(),joined_at:R.now(y.date())},messages:{id:R.pk(y.uuid()),conversation_id:R.req(y.uuid()),sender_type:y.string().meta({notNull:!0,default:"user"}),sender_id:y.uuid().nullable(),content:R.req(y.string()),msg_type:y.string().meta({notNull:!0,default:"text"}),created_at:R.now(y.date()),edited_at:y.date().nullable(),deleted_at:y.date().nullable()}};Oo={tables:[{name:"_weifuwu_conversations",columns:{id:R.pk(y.uuid()),type:y.string().meta({default:"direct"}),created_by:y.uuid(),direct_key:y.string().nullable().meta({unique:!0}),created_at:y.date().meta({default:"now"})}},{name:"_weifuwu_conversation_members",columns:{conversation_id:R.req(y.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),user_id:R.req(y.uuid()),last_read_at:y.date(),joined_at:y.date().meta({default:"now"})},uniques:[["conversation_id","user_id"]]},{name:"_weifuwu_messages",columns:{id:R.pk(y.uuid()),conversation_id:R.req(y.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),sender_type:y.string().meta({default:"user"}),sender_id:y.uuid(),content:y.string().meta({notNull:!0}),msg_type:y.string().meta({default:"text"}),created_at:y.date().meta({default:"now"}),edited_at:y.date(),deleted_at:y.date()},indexes:[{cols:["conversation_id",{col:"created_at",desc:!0},{col:"id",desc:!0}],name:"idx_messages_conv"}]}]}});function kt(n,e,t){if(e.length!==t)throw new Error(`std.${n}: \u671F\u671B ${t} \u4E2A\u53C2\u6570\uFF0C\u6536\u5230 ${e.length}`)}function tr(n,e,t){let r=Number(e);if(!Number.isFinite(r))throw new Error(`std.${n}: \u53C2\u6570 ${t+1} \u4E0D\u662F\u6709\u9650\u6570\u5B57\uFF08${String(e)}\uFF09`);return r}var xp,Rp,Ep,xl,Rl,Tp,Io=I(()=>{"use strict";xp={sum:n=>{kt("sum",n,1);let e=n[0];if(!Array.isArray(e))throw new Error("std.sum: \u671F\u671B\u6570\u7EC4");return e.reduce((t,r)=>t+tr("sum",r,0),0)},avg:n=>{kt("avg",n,1);let e=n[0];if(!Array.isArray(e))throw new Error("std.avg: \u671F\u671B\u6570\u7EC4");if(e.length===0)throw new Error("std.avg: \u7A7A\u6570\u7EC4");return e.reduce((t,r)=>t+tr("avg",r,0),0)/e.length},clamp:n=>{kt("clamp",n,3);let e=tr("clamp",n[0],0),t=tr("clamp",n[1],1),r=tr("clamp",n[2],2);if(t>r)throw new Error("std.clamp: lo > hi");return Math.min(r,Math.max(t,e))}},Rp={upper:n=>{if(kt("upper",n,1),typeof n[0]!="string")throw new Error(`std.upper: \u671F\u671B\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`);return n[0].toUpperCase()},lower:n=>{if(kt("lower",n,1),typeof n[0]!="string")throw new Error(`std.lower: \u671F\u671B\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`);return n[0].toLowerCase()},join:n=>{if(kt("join",n,2),!Array.isArray(n[0])||typeof n[1]!="string")throw new Error("std.join: \u671F\u671B(\u6570\u7EC4, \u5206\u9694\u7B26)");return n[0].map(e=>String(e)).join(n[1])},split:n=>{if(kt("split",n,2),typeof n[0]!="string"||typeof n[1]!="string")throw new Error("std.split: \u671F\u671B(\u5B57\u7B26\u4E32, \u5206\u9694\u7B26)");return n[0].split(n[1])}},Ep={count:n=>{if(kt("count",n,1),Array.isArray(n[0])||typeof n[0]=="string")return n[0].length;throw new Error(`std.count: \u671F\u671B\u6570\u7EC4\u6216\u5B57\u7B26\u4E32\uFF08${String(n[0])}\uFF09`)},pick:n=>{if(kt("pick",n,2),!Array.isArray(n[0]))throw new Error("std.pick: \u671F\u671B\u6570\u7EC4");let e=tr("pick",n[1],1);if(!Number.isInteger(e)||e<0||e>=n[0].length)throw new Error(`std.pick: \u7D22\u5F15 ${e} \u8D8A\u754C\uFF08\u957F\u5EA6 ${n[0].length}\uFF09`);return n[0][e]}},xl={"wf://std/math":xp,"wf://std/strings":Rp,"wf://std/collections":Ep},Rl={...xp,...Rp,...Ep},Tp=Object.keys(Rl)});function t_(n){let e=[],t=0,r=n.length;for(;t<r;){let s=n[t];if(s===" "||s===" "||s===`
71
71
  `||s==="\r"){t++;continue}if(s==='"'||s==="'"){let l=s,u=t+1,c="";for(;u<r&&n[u]!==l;){if(n[u]==="\\"){let d=n[u+1];if(d==="\\"||d===l){c+=d,u+=2;continue}if(d==="n"){c+=`
72
- `,u+=2;continue}if(d==="t"){c+=" ",u+=2;continue}throw new Error(`expression: invalid escape '\\${d??""}' at ${u} (in ${JSON.stringify(n)})`)}c+=n[u],u++}if(u>=r)throw new Error(`expression: unterminated string (in ${JSON.stringify(n)})`);e.push({t:"str",v:c,pos:t}),t=u+1;continue}let i=n.slice(t,t+3);if(Yb.includes(i)){e.push({t:"op",v:i,pos:t}),t+=3;continue}let o=n.slice(t,t+2);if(e_.includes(o)){e.push({t:"op",v:o,pos:t}),t+=2;continue}if(t_.includes(s)){e.push({t:"op",v:s,pos:t}),t++;continue}if(s==="."||s==="["||s==="]"||s==="("||s===")"||s===","||s===":"){e.push({t:"punc",v:s,pos:t}),t++;continue}if(s>="0"&&s<="9"){let l=Xb.exec(n.slice(t));if(!l)throw new Error(`expression: invalid number at ${t} (in ${JSON.stringify(n)})`);e.push({t:"num",v:Number(l[0]),pos:t}),t+=l[0].length;continue}let a=Zb.exec(n.slice(t));if(a){e.push({t:"ident",v:a[0],pos:t}),t+=a[0].length;continue}throw new Error(`expression: unexpected character '${s}' at ${t} (in ${JSON.stringify(n)})`)}return e.push({t:"eof",pos:r}),e}function St(n){return new Sl(n_(n),n).parse()}function r_(n,e){function t(r,s){let i=e[s];if(i===void 0)return r;if(r==null)return;if(i==="*"){if(!Array.isArray(r))return[];let a=[];for(let l of r){let u=t(l,s+1);Array.isArray(u)?a.push(...u):u!==void 0&&a.push(u)}return a}let o;return typeof i=="number"?o=Array.isArray(r)?r[i]:void 0:i==="length"&&(Array.isArray(r)||typeof r=="string")?o=r.length:typeof r=="object"?o=r[i]:o=void 0,t(o,s+1)}return t(n,0)}function s_(n,e,t){if(typeof e!="number"||typeof t!="number")throw new Error(`expression: arithmetic '${n}' requires numbers (got ${xl(e)} ${n} ${xl(t)})`);let r;switch(n){case"+":r=e+t;break;case"-":r=e-t;break;case"*":r=e*t;break;case"/":r=e/t;break;case"%":r=e%t;break}if(!Number.isFinite(r))throw new Error(`expression: arithmetic '${n}' produced non-finite result`);return r}function xl(n){return n===null?"null":Array.isArray(n)?"array":typeof n}function Ce(n,e,t){switch(n.kind){case"path":return r_(e,n.segments);case"literal":return n.value;case"neg":{let r=Ce(n.operand,e,t);if(typeof r!="number")throw new Error(`expression: unary '-' requires number (got ${xl(r)})`);return-r}case"arith":return s_(n.op,Ce(n.left,e,t),Ce(n.right,e,t));case"ternary":return Ep(n.cond,e,t)?Ce(n.then,e,t):Ce(n.else,e,t);case"call":{if(!t?.[n.name])throw new Error(`expression: \u672A\u6CE8\u518C\u51FD\u6570 '${n.name}'\uFF08std \u7EAF\u51FD\u6570\uFF1A${Rp.join("/")}\uFF09`);return t[n.name](n.args.map(r=>Ce(r,e,t)))}case"compare":{let r=Ce(n.left,e,t),s=Ce(n.right,e,t);switch(n.op){case"==":return r==s;case"!=":return r!=s;case"===":return r===s;case"!==":return r!==s;case"<":return r<s;case"<=":return r<=s;case">":return r>s;case">=":return r>=s}}case"not":return!Vt(Ce(n.operand,e,t));case"and":{let r=Ce(n.left,e,t);return Vt(r)?Ce(n.right,e,t):r}case"or":{let r=Ce(n.left,e,t);return Vt(r)?r:Ce(n.right,e,t)}}}function Vt(n){return!!n}function Ep(n,e,t){return Vt(Ce(n,e,t))}function nr(n,e){let t=St(n);return r=>Ce(t,r,e)}function o_(n){return n==null?"":typeof n=="string"?n:typeof n=="object"?JSON.stringify(n):String(n)}function ut(n,e,t){if(!n.includes("{{"))return n;let r="",s=0;for(;;){let i=n.indexOf("{{",s);if(i===-1){r+=n.slice(s);break}let o=n.indexOf("}}",i+2);if(o===-1)throw new Error(`workflow/expression: interpolate: unclosed '{{' at ${i} (in ${JSON.stringify(n)})`);let a=n.slice(i+2,o).trim();if(!a)throw new Error(`workflow/expression: interpolate: empty expression (in ${JSON.stringify(n)})`);r+=n.slice(s,i),r+=o_(Ce(St(a),e,t)),s=o+2}return r}function xe(n){switch(n.kind){case"path":return n.segments.reduce((e,t)=>e+(typeof t=="number"?`[${t}]`:t==="*"?"[*]":e===""?t:`.${t}`),"");case"literal":return n.value===null?"null":typeof n.value=="string"?`'${n.value.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`:String(n.value);case"ternary":return`(${xe(n.cond)} ? ${xe(n.then)} : ${xe(n.else)})`;case"call":return`${n.name}(${n.args.map(e=>xe(e)).join(", ")})`;case"neg":return`-${xe(n.operand)}`;case"arith":return`(${xe(n.left)} ${n.op} ${xe(n.right)})`;case"compare":return`(${xe(n.left)} ${n.op} ${xe(n.right)})`;case"not":return`!${xe(n.operand)}`;case"and":return`(${xe(n.left)} && ${xe(n.right)})`;case"or":return`(${xe(n.left)} || ${xe(n.right)})`}}var Zb,Xb,Yb,e_,t_,Sl,kn=N(()=>{"use strict";Ao();Zb=/[A-Za-z_$][A-Za-z0-9_$]*/,Xb=/[0-9]+(?:\.[0-9]+)?/,Yb=["===","!=="],e_=["==","!=","&&","||","<=",">="],t_=["!","+","-","*","/","%","<",">","?"];Sl=class{i=0;tokens;src;depth=0;constructor(e,t){this.tokens=e,this.src=t}peek(){return this.tokens[this.i]}next(){return this.tokens[this.i++]}fail(e,t){throw new Error(`${e} at ${t} (in ${JSON.stringify(this.src)})`)}expectPunc(e){let t=this.next();(t.t!=="punc"||t.v!==e)&&this.fail(`expression: expected '${e}'`,t.pos)}parse(){let e=this.parseTernary(),t=this.peek();return t.t!=="eof"&&this.fail(`expression: unexpected '${String(t.v)}'`,t.pos),e}parseTernary(){++this.depth>65&&this.fail("expression: nested expression too deep (max 64 \u5C42)",this.peek().pos);try{return this.parseTernaryInner()}finally{this.depth--}}parseTernaryInner(){let e=this.parseOr(),t=this.peek();if(t.t==="op"&&t.v==="?"){this.next();let r=this.parseTernary(),s=this.next();(s.t!=="punc"||s.v!==":")&&this.fail("expression: expected ':' in ternary",s.pos);let i=this.parseTernary();return{kind:"ternary",cond:e,then:r,else:i}}return e}parseOr(){let e=this.parseAnd();for(;this.isOp("||");)this.next(),e={kind:"or",left:e,right:this.parseAnd()};return e}parseAnd(){let e=this.parseCmp();for(;this.isOp("&&");)this.next(),e={kind:"and",left:e,right:this.parseCmp()};return e}parseCmp(){let e=this.parseArith(),t=this.peek();return t.t==="op"&&["==","!=","===","!==","<","<=",">",">="].includes(t.v)?(this.next(),{kind:"compare",op:t.v,left:e,right:this.parseArith()}):e}parseArith(){let e=this.parseTerm();for(;this.isOp("+")||this.isOp("-");)e={kind:"arith",op:this.next().v,left:e,right:this.parseTerm()};return e}parseTerm(){let e=this.parseUnary();for(;this.isOp("*")||this.isOp("/")||this.isOp("%");)e={kind:"arith",op:this.next().v,left:e,right:this.parseUnary()};return e}isOp(e){let t=this.peek();return t.t==="op"&&t.v===e}parseUnary(){let e=this.peek();return e.t==="op"&&e.v==="!"?(this.next(),{kind:"not",operand:this.parseUnary()}):e.t==="op"&&e.v==="-"?(this.next(),{kind:"neg",operand:this.parseUnary()}):this.parseAtom()}parseAtom(){let e=this.peek();if(e.t==="punc"&&e.v==="("){this.next();let t=this.parseTernary();return this.expectPunc(")"),t}if(e.t==="num")return this.next(),{kind:"literal",value:e.v};if(e.t==="str")return this.next(),{kind:"literal",value:e.v};if(e.t==="ident"){let t=e.v;if(t==="null"||t==="true"||t==="false")return this.next(),{kind:"literal",value:t==="null"?null:t==="true"};let r=this.parsePath(),s=this.peek();if(r.kind==="path"&&s.t==="punc"&&s.v==="("){this.next();let i=[];if(!this.isPunc2(")"))for(;;){if(i.push(this.parseTernary()),this.isPunc2(",")){this.next();continue}break}return this.expectPunc(")"),{kind:"call",name:r.segments[0],args:i}}return r}this.fail(`expression: unexpected '${e.t==="eof"?"(end)":String(e.v)}'`,e.pos)}isPunc2(e){let t=this.peek();return t.t==="punc"&&t.v===e}parsePath(){let e=[],t=this.next();for(t.t!=="ident"&&this.fail("expression: expected path",t.pos),e.push(t.v);;){let r=this.peek();if(r.t==="punc"&&r.v==="."){this.next();let s=this.next();s.t!=="ident"&&this.fail("expression: expected property after '.'",s.pos),e.push(s.v);continue}if(r.t==="punc"&&r.v==="["){this.next();let s=this.next();if(s.t==="op"&&s.v==="*"){this.expectPunc("]"),e.push("*");continue}(s.t!=="num"||!Number.isInteger(s.v))&&this.fail("expression: expected integer index or '*' in '[]'",s.pos),this.expectPunc("]"),e.push(s.v);continue}break}return{kind:"path",segments:e}}}});function a_(n){let e=n.reduce((s,i)=>s+i.length,0),t=new Uint8Array(e),r=0;for(let s of n)t.set(s,r),r+=s.length;return t}function l_(n){let e=String(n??"GET").toUpperCase();return["GET","POST","PUT","PATCH","DELETE","HEAD"].includes(e)?e:"GET"}function Tp(){return f_}var i_,u_,c_,d_,p_,m_,f_,Cp=N(()=>{"use strict";kn();i_={type:"http",label:"HTTP \u8BF7\u6C42",fields:[{name:"url",label:"URL",type:"string"},{name:"method",label:"\u65B9\u6CD5",type:"string"}],required:["url"],async run(n,e,t){let r=String(n.url),s=l_(n.method),i=typeof n.timeoutMs=="number"&&n.timeoutMs>0?n.timeoutMs:1e4,o=t.fetch??globalThis.fetch;if(!o)throw new Error("http step: no fetch available");let a=n.headers??{},l=typeof n.body=="string"?n.body:void 0,u=await o(r,{method:s,headers:a,body:l,signal:AbortSignal.timeout(i)}),c=typeof n.maxBytes=="number"&&n.maxBytes>0?n.maxBytes:10*1024*1024,d=Number(u.headers.get("content-length")??0);if(d>c)throw new Error(`http step: \u54CD\u5E94 ${d} \u5B57\u8282\u8D85\u8FC7\u4E0A\u9650 ${c}`);let p;if(u.body){let h=u.body.getReader(),f=[],g=0;for(;;){let{done:w,value:y}=await h.read();if(w)break;if(g+=y.length,g>c)throw await h.cancel(),new Error(`http step: \u54CD\u5E94\u8D85\u8FC7\u4E0A\u9650 ${c} \u5B57\u8282\uFF08\u53EF\u7ECF config.maxBytes \u8C03\u6574\uFF09`);f.push(y)}p=new TextDecoder().decode(a_(f))}else p=await u.text();let m={status:u.status,text:p};try{m.json=JSON.parse(p)}catch{}return m}};u_={type:"template",label:"\u6570\u636E\u6A21\u677F",fields:[{name:"template",label:"\u6A21\u677F",type:"string"}],required:["template"],run(n,e){return{text:ut(String(n.template),e)}}},c_={type:"log",label:"\u65E5\u5FD7",fields:[{name:"message",label:"\u6D88\u606F",type:"string"}],required:[],run(n,e,t){let r=ut(String(n.message??""),e);return t.log?.(r),{text:r}}},d_={type:"ai",label:"AI \u751F\u6210",fields:[{name:"prompt",label:"\u63D0\u793A\u8BCD\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"},{name:"system",label:"\u7CFB\u7EDF\u6307\u4EE4",type:"string"}],required:["prompt"],effects:!0,async run(n,e,t){if(!t.ai?.chat)throw new Error("ai step: \u672A\u6CE8\u5165 ai \u9002\u914D\u5668\uFF08workflow({ ai })\uFF09");let r=n.system?ut(String(n.system),e):void 0,s=ut(String(n.prompt),e);return{text:(await t.ai.chat({messages:[...r?[{role:"system",content:r}]:[],{role:"user",content:s}]})).content}}},p_={type:"email",label:"\u53D1\u9001\u90AE\u4EF6",fields:[{name:"to",label:"\u6536\u4EF6\u4EBA",type:"string"},{name:"subject",label:"\u4E3B\u9898\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"},{name:"body",label:"\u6B63\u6587\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"}],required:["to"],effects:!0,async run(n,e,t){if(!t.email?.send)throw new Error("email step: \u672A\u6CE8\u5165 email \u9002\u914D\u5668\uFF08workflow({ email })\uFF09");let r=ut(String(n.to),e),s=n.subject?ut(String(n.subject),e):"workflow \u901A\u77E5",i=n.body?ut(String(n.body),e):"",o=await t.email.send({to:r.split(",").map(a=>a.trim()).filter(Boolean),subject:s,body:i});if(!o.ok)throw new Error(`email step: \u53D1\u9001\u5931\u8D25${o.id?` (${o.id})`:""}`);return{id:o.id}}},m_={type:"store",label:"KV \u5B58\u50A8",fields:[{name:"op",label:"\u64CD\u4F5C\uFF08get/set\uFF09",type:"string"},{name:"key",label:"\u952E",type:"string"},{name:"value",label:"\u503C\uFF08set \u65F6\uFF09",type:"string"}],required:["op","key"],run:async(n,e,t)=>{let r=t.store;if(!r)throw new Error("store \u6B65\u9AA4\u9700\u8981\u5B58\u50A8\u6CE8\u5165\uFF1Aworkflow({ store }) \u6216 workflow({ redis })");let s=String(n.op),i=ut(String(n.key),e);if(s==="get")return await r.get(i);if(s==="set"){let o=ut(String(n.value??""),e);return await r.set(i,o),o}throw new Error(`store \u672A\u77E5\u64CD\u4F5C\uFF1A'${s}'\uFF08get/set\uFF09`)}},f_=[i_,u_,c_,d_,p_,m_]});async function Op(n,e,t,r){let i=(e.mode??"live")==="dry",o=Date.now(),a={},l={status:"success",executed:[],skippedSteps:[],stepResults:a,dry:i,startedAt:o,finishedAt:0},u=e.budgetMs??6e5,c=AbortSignal.timeout(u),d=e.signal?AbortSignal.any([e.signal,c]):c,p={result:l,steps:a,dry:i,signal:d,budgetMs:u,def:n,fnDepth:0},m=await xn(n.steps,{steps:a,vars:{},input:e.input},t,r,p);return l.finishedAt=Date.now(),l}async function xn(n,e,t,r,s){let{result:i,steps:o}=s;for(let a of n){if(s.signal?.aborted)return i.status="error",i.error=s.signal.reason?.name==="TimeoutError"?`\u6267\u884C\u8D85\u65F6\uFF08\u9884\u7B97 ${s.budgetMs??6e5}ms\u2014\u2014\u53EF\u7ECF budgetMs \u8C03\u6574\uFF09`:`aborted before step '${a.id}'`,{k:"return"};if(a.when!==void 0){let c;try{c=Vt(Sn(a.when,e,`when of '${a.id}'`))}catch(d){return o[a.id]={ok:!1,error:`when \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${d.message}`},i.status="error",i.error=`step '${a.id}': ${d.message}`,{k:"return"}}if(!c){i.skippedSteps.push(a.id);continue}}switch(a.type){case"assign":{let c=a.config;try{e.vars[c.target]=Sn(c.value,e,`\u8D4B\u503C ${c.target}`),o[a.id]={ok:!0,data:e.vars[c.target]},i.executed.push(a.id)}catch(d){return Ap(s,a,d)}continue}case"if":{let c=a.config,d=await g_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"try":{let c=a.config,d=await h_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"while":{let c=a.config,d=await w_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"for":{let c=a.config,d=await y_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"return":{let c=a.config,d=c.value!==void 0?Sn(c.value,e,"return"):void 0;return o[a.id]={ok:!0,data:d},i.executed.push(a.id),{k:"return",value:d}}case"call":{let c=a.config,d=s.def.functions?.find(f=>f.name===c.name);if(!d)return o[a.id]={ok:!1,error:`\u672A\u77E5\u51FD\u6570\uFF1A'${c.name}'`},i.status="error",i.error=`step '${a.id}': \u672A\u77E5\u51FD\u6570 '${c.name}'`,{k:"return"};if(s.fnDepth>=64)return o[a.id]={ok:!1,error:`\u51FD\u6570\u9012\u5F52\u6DF1\u5EA6\u8D85\u8FC7 64\uFF08${c.name}\uFF09`},i.status="error",i.error=`step '${a.id}': \u51FD\u6570\u9012\u5F52\u6DF1\u5EA6\u8D85\u8FC7 64`,{k:"return"};let p={};try{for(let f=0;f<d.params.length;f++){let g=c.args?.[f]??"undefined";p[d.params[f]]=Sn(g,e,`\u51FD\u6570 '${c.name}' \u53C2\u6570 ${d.params[f]}`)}}catch(f){return o[a.id]={ok:!1,error:f.message},i.status="error",i.error=`step '${a.id}': ${f.message}`,{k:"return"}}let m={...e,vars:p};s.fnDepth++;let h=await xn(d.step.steps,m,t,r,s);s.fnDepth--,h.k==="continue"?o[a.id]={ok:!0,data:void 0}:o[a.id]={ok:!0,data:h.value},i.executed.push(a.id);continue}}let l=r.get(a.type);if(!l)return o[a.id]={ok:!1,error:`\u672A\u6CE8\u518C\u6B65\u9AA4\u7C7B\u578B\uFF1A'${a.type}'`},i.status="error",i.error=`step '${a.id}': \u672A\u6CE8\u518C\u7C7B\u578B '${a.type}'`,{k:"return"};let u=a.config??{};try{let c;s.dry&&l.effects?(c=void 0,o[a.id]={ok:!0,dry:!0}):(c=await l.run(u,e,t),o[a.id]={ok:!0,data:c}),i.executed.push(a.id)}catch(c){return Ap(s,a,c)}if(s.signal?.aborted)return i.status="error",i.error=s.signal.reason?.name==="TimeoutError"?`\u6267\u884C\u8D85\u65F6\uFF08\u9884\u7B97 ${s.budgetMs??6e5}ms\u2014\u2014\u53EF\u7ECF budgetMs \u8C03\u6574\uFF09`:`aborted after step '${a.id}'`,{k:"return"}}return{k:"continue"}}async function g_(n,e,t,r,s,i){let{result:o,steps:a}=i,l;try{l=Vt(Sn(e.when,t,`if '${n.id}' \u6761\u4EF6`))}catch(c){return a[n.id]={ok:!1,error:`if \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${c.message}`},o.status="error",o.error=`step '${n.id}': ${c.message}`,{k:"return"}}a[n.id]={ok:!0,data:{satisfied:l}},o.executed.push(n.id);let u=l?e.then:e.else??void 0;return u?xn(u.steps,t,r,s,i):{k:"continue"}}async function h_(n,e,t,r,s,i){let{result:o,steps:a}=i,l=o.error,u=await xn(e.step.steps,t,r,s,i);if(u.k==="return"&&o.status==="error"&&o.error!==l){let c=o.error??"\u672A\u77E5\u9519\u8BEF";return a[n.id]={ok:!1,error:c},o.status="success",o.error=void 0,o.executed.push(n.id),e.catch?.steps.length?xn(e.catch.steps,t,r,s,i):{k:"continue"}}return a[n.id]={ok:!0,data:{}},o.executed.push(n.id),u}async function w_(n,e,t,r,s,i){let{result:o,steps:a}=i,l=e.maxIters??1e3;for(let u=0;;u++){if(i.signal?.aborted)return o.status="error",o.error=`aborted in while '${n.id}'`,{k:"return"};let c;try{c=Vt(Sn(e.when,t,`while '${n.id}' \u6761\u4EF6`))}catch(p){return a[n.id]={ok:!1,error:`while \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${p.message}`},o.status="error",o.error=`step '${n.id}': ${p.message}`,{k:"return"}}if(!c)return a[n.id]={ok:!0,data:{iterations:u}},o.executed.push(n.id),{k:"continue"};if(u>=l)return a[n.id]={ok:!1,error:`while \u8D85\u8FC7 maxIters=${l}\uFF08\u9632\u6B7B\u5FAA\u73AF\uFF09`},o.status="error",o.error=`step '${n.id}': while \u8D85\u8FC7 maxIters=${l}`,{k:"return"};let d=await xn(e.step.steps,t,r,s,i);if(d.k!=="continue")return d}}async function y_(n,e,t,r,s,i){let{result:o,steps:a}=i,l;try{l=Sn(e.items,t,`for '${n.id}' items`)}catch(d){return a[n.id]={ok:!1,error:`for \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${d.message}`},o.status="error",o.error=`step '${n.id}': ${d.message}`,{k:"return"}}if(!Array.isArray(l))return a[n.id]={ok:!1,error:`for items \u5FC5\u987B\u662F\u6570\u7EC4\uFF08\u5F97\u5230 ${String(l)}\uFF09`},o.status="error",o.error=`step '${n.id}': for items \u975E\u6570\u7EC4`,{k:"return"};let u=e.maxIters??1e3;if(l.length>u)return a[n.id]={ok:!1,error:`for \u8D85\u8FC7 maxIters=${u}\uFF08items ${l.length} \u9879\uFF09`},o.status="error",o.error=`step '${n.id}': for \u8D85\u8FC7 maxIters=${u}`,{k:"return"};let c=t.loop;for(let d=0;d<l.length;d++){if(i.signal?.aborted)return o.status="error",o.error=`aborted in for '${n.id}'`,{k:"return"};t.loop={item:l[d],index:d};let p=await xn(e.step.steps,t,r,s,i);if(p.k!=="continue")return t.loop=c,p}return t.loop=c,a[n.id]={ok:!0,data:{iterations:l.length}},o.executed.push(n.id),{k:"continue"}}function Ap(n,e,t){return n.steps[e.id]={ok:!1,error:t.message},n.result.status="error",n.result.error=`step '${e.id}' (${e.type}): ${t.message}`,{k:"return"}}function Sn(n,e,t){try{return nr(n,kl)(e)}catch(r){throw new Error(`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF08${t}\uFF09\uFF1A${r.message}`)}}var Ip=N(()=>{"use strict";kn();Ao()});function as(n){return{get:async e=>{let t=await n.command("GET",e);return t==null?null:String(t)},set:async(e,t)=>{await n.command("SET",e,t)},del:async e=>{await n.command("DEL",e)}}}var Rl=N(()=>{"use strict"});var Pp,Np=N(()=>{"use strict";Pp=["assign","if","try","while","for","return","call"]});function $p(n,e){let t=[],r=n;if(!Array.isArray(r?.steps)||r.steps.length===0)return{ok:!1,errors:[{path:"steps",message:"steps \u5FC5\u987B\u4E3A\u975E\u7A7A\u6570\u7EC4"}]};let s=new Set,i=new Set,o=new Set;b_(r,i,o),Oo(r.steps,"steps",e,t,s,0);let a=[];__(r,a);for(let l of a){let u;try{u=St(l.expr)}catch{continue}qp(u,i,o,l.path,t)}return{ok:t.length===0,errors:t}}function b_(n,e,t){let r=s=>{for(let i of s){t.add(i.id);let o=i.config??{};i.type==="assign"&&typeof o.target=="string"&&e.add(o.target);let a=o.then;a&&Array.isArray(a.steps)&&r(a.steps);let l=o.else;l&&Array.isArray(l.steps)&&r(l.steps);let u=o.step;u&&Array.isArray(u.steps)&&r(u.steps);let c=o.catch;c&&Array.isArray(c.steps)&&r(c.steps)}};r(n.steps);for(let s of n.functions??[]){for(let i of s.params??[])e.add(i);r(s.step.steps)}}function __(n,e){let t=(o,a)=>{for(let l of o){let u=l.config??{},c=`${a}/${l.id}`;if(l.type==="assign")s(u.value,`${c}.value`);else if(l.type==="if"){s(u.when,`${c}.when`);for(let d of["then","else"]){let p=u[d];p&&Array.isArray(p.steps)&&t(p.steps,`${c}.${d}`)}}else if(l.type==="while")s(u.when,`${c}.when`);else if(l.type==="for")s(u.items,`${c}.items`);else if(l.type==="return")s(u.value,`${c}.value`);else if(l.type==="call")for(let[d,p]of(u.args??[]).entries())s(p,`${c}.args[${d}]`);else for(let[d,p]of Object.entries(u))typeof p=="string"?i(p,`${c}.${d}`):p&&typeof p=="object"&&!Array.isArray(p)&&r(p,`${c}.${d}`);typeof l.when=="string"&&s(l.when,`${c}.when`)}},r=(o,a)=>{for(let[l,u]of Object.entries(o))typeof u=="string"?i(u,`${a}.${l}`):u&&typeof u=="object"&&!Array.isArray(u)&&r(u,`${a}.${l}`)},s=(o,a)=>{typeof o=="string"&&e.push({path:a,expr:o})},i=(o,a)=>{for(let l of o.matchAll(/\{\{([\s\S]+?)\}\}/g))e.push({path:a,expr:l[1].trim()})};t(n.steps,"steps");for(let o of n.functions??[])t(o.step.steps,`functions.${o.name}`)}function qp(n,e,t,r,s){if(!(!n||typeof n!="object")){if("segments"in n&&Array.isArray(n.segments)){let i=n.segments[0];if(i==="vars"&&n.segments[1]==="loop")return;i==="vars"&&typeof n.segments[1]=="string"&&!e.has(n.segments[1])?s.push({path:r,message:`\u672A\u58F0\u660E\u53D8\u91CF\u5F15\u7528\uFF1Avars.${n.segments[1]}\uFF08\u987B\u6709 assign target \u58F0\u660E\uFF09`}):i==="steps"&&typeof n.segments[1]=="string"&&!t.has(n.segments[1])&&s.push({path:r,message:`\u672A\u77E5\u6B65\u9AA4\u5F15\u7528\uFF1Asteps.${n.segments[1]}\uFF08\u987B\u662F\u5DF2\u5B9A\u4E49\u6B65\u9AA4 id\uFF09`});return}for(let i of Object.values(n))i&&typeof i=="object"&&qp(i,e,t,r,s)}}function Oo(n,e,t,r,s,i){if(i>Mp){r.push({path:e,message:`\u5B50\u94FE\u5D4C\u5957\u8D85\u8FC7 ${Mp} \u5C42`});return}for(let[o,a]of n.entries()){let l=`${e}[${o}]`;if(!a||typeof a!="object"){r.push({path:l,message:"step \u5FC5\u987B\u662F\u5BF9\u8C61"});continue}if(!a.id||typeof a.id!="string"?r.push({path:`${l}.id`,message:"\u5FC5\u586B\uFF1A\u552F\u4E00 id"}):s.has(a.id)?r.push({path:`${l}.id`,message:`id \u91CD\u590D\uFF1A'${a.id}'`}):s.add(a.id),!a.type||typeof a.type!="string"){r.push({path:`${l}.type`,message:"\u5FC5\u586B\uFF1A\u6B65\u9AA4\u7C7B\u578B"});continue}if(!Pp.includes(a.type)&&!t.has(a.type)){r.push({path:`${l}.type`,message:`\u672A\u6CE8\u518C\u7684\u6B65\u9AA4\u7C7B\u578B\uFF1A'${a.type}'`});continue}let u=a.config??{};switch(a.type){case"assign":rr(u,"target","\u76EE\u6807\u53D8\u91CF\u540D",r,`${l}.config.target`,!1),rr(u,"value","\u8D4B\u503C\u8868\u8FBE\u5F0F",r,`${l}.config.value`,!1);break;case"if":{rr(u,"when","\u6761\u4EF6\u8868\u8FBE\u5F0F",r,`${l}.config.when`,!1);for(let c of["then","else"]){let d=u[c];d!==void 0&&(Array.isArray(d.steps)?Oo(d.steps,`${l}.config.${c}.steps`,t,r,s,i+1):r.push({path:`${l}.config.${c}.steps`,message:"\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4"}))}break}case"try":{El(u,"step",t,r,s,i,l,"steps");let c=u.catch;!c||!Array.isArray(c.steps)?r.push({path:`${l}.config.catch.steps`,message:"catch \u94FE\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4\uFF08v0 try \u5FC5\u914D catch\uFF09"}):Oo(c.steps,`${l}.config.catch.steps`,t,r,s,i+1);break}case"while":{rr(u,"when","\u5FAA\u73AF\u6761\u4EF6",r,`${l}.config.when`,!1),El(u,"step",t,r,s,i,l,"steps");break}case"for":{rr(u,"items","\u96C6\u5408\u8868\u8FBE\u5F0F",r,`${l}.config.items`,!1),El(u,"step",t,r,s,i,l,"steps");break}case"return":{u.value!==void 0&&rr(u,"value","\u8FD4\u56DE\u503C\u8868\u8FBE\u5F0F",r,`${l}.config.value`,!0);break}default:{let c=t.schema(a.type);for(let d of c?.required??[])(typeof u[d]!="string"||u[d]==="")&&r.push({path:`${l}.config.${d}`,message:`\u5FC5\u586B\uFF1A${d}`})}}if(a.when!==void 0&&typeof a.when!="string")r.push({path:`${l}.when`,message:"\u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u8868\u8FBE\u5F0F"});else if(typeof a.when=="string")try{nr(a.when)}catch(c){r.push({path:`${l}.when`,message:`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${c.message}`})}}}function El(n,e,t,r,s,i,o,a){let l=n[e];if(!l||!Array.isArray(l.steps)){r.push({path:`${o}.config.${e}.${a}`,message:"\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4"});return}Oo(l.steps,`${o}.config.${e}.${a}`,t,r,s,i+1)}function rr(n,e,t,r,s,i){let o=n[e];if(typeof o!="string"||o===""){i||r.push({path:s,message:`\u5FC5\u586B\uFF1A${t}`});return}try{nr(o)}catch(a){r.push({path:s,message:`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${a.message}`})}}var Mp,Dp=N(()=>{"use strict";Np();kn();Mp=16});function Tl(n){let e={};for(let t of n){let r={};for(let s of t.fields??[])r[s.name]={type:s.type==="number"?"number":s.type==="boolean"?"boolean":"string",title:s.label,placeholder:s.placeholder};e[t.type]={type:"object",title:t.label,properties:r,...t.required&&t.required.length?{required:t.required}:{}}}return{type:"object",title:"Workflow",properties:e}}function jp(n,e,t){if(n==="if"){let r=e?.length??0,s=t?.length??0;return`then\xD7${r}${s?`/else\xD7${s}`:""}`}return n==="while"||n==="for"?`\xD7${e?.length??0} \u5B50\u6B65\u9AA4`:""}function Cl(n,e){let t=e?.labels??{},r=[],s=[],i=n.steps??[];for(let[o,a]of i.entries()){let l=a.config??{},u=`${t[a.type]??v_[a.type]??a.type} ${a.id}`;if(a.type==="if"){let c=l.then?.steps,d=l.else?.steps,p=jp("if",c,d);p&&(u+=`\uFF08${p}\uFF09`)}else if(a.type==="while"||a.type==="for"){let c=l.step?.steps,d=jp(a.type,c);d&&(u+=`\uFF08${d}\uFF09`)}r.push({id:a.id,label:u}),o>0&&s.push({from:i[o-1].id,to:a.id})}return{nodes:r,edges:s}}function Lp(n,e,t){if(e.length===0)throw new Error("patchStepConfig: \u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");let s=(a=>a&&typeof a=="object"?JSON.parse(JSON.stringify(a)):a)(n),i=s.steps,o=null;for(let a=0;a<e.length;a++){let l=e[a];if(typeof l=="number"){if(!i||!i[l])throw new Error(`patchStepConfig: \u6B65\u9AA4\u7D22\u5F15 ${l} \u8D8A\u754C`);o=i[l];let u=e[a+1];if(typeof u=="string"){let d=(o.config??{})[u];if(u==="step"&&!d?.steps)throw new Error(`patchStepConfig: \u6B65\u9AA4 ${i[l].id} \u65E0\u5B50\u94FE\uFF08step\uFF09`);if((u==="then"||u==="else")&&!d?.steps)throw new Error(`patchStepConfig: \u6B65\u9AA4 ${i[l].id} \u65E0\u5B50\u94FE\uFF08${u}\uFF09`);i=d?.steps??[],a++}else if(a!==e.length-1)throw new Error("patchStepConfig: \u94FE token\uFF08then/else/step\uFF09\u540E\u5FC5\u987B\u8DDF\u7D22\u5F15")}}if(!o)throw new Error("patchStepConfig: \u5B9A\u4F4D\u5931\u8D25");return o.config={...o.config??{},...t},s}function Up(n,e,t,r){let s=JSON.parse(JSON.stringify(n)),i;if(e===null){if(t.length>0)throw new Error("insert: \u9876\u5C42\u951A\u70B9\uFF08anchor=null\uFF09\u4E0D\u80FD\u6307\u5B9A\u5B50\u94FE\u2014\u2014\u8BF7\u7528\u6B65\u9AA4 id \u951A\u70B9");i=s.steps}else{if(t.length!==1)throw new Error("insert: v0 \u4EC5\u652F\u6301\u5355\u6BB5\u94FE\uFF08then/else/step \u4E4B\u4E00\uFF09\u2014\u2014\u591A\u6BB5\u5D4C\u5957\u94FE\u7F16\u8F91\u5668\u6682\u4E0D\u652F\u6301");let c=Wp(s.steps,e);if(!c)throw new Error(`insert: \u951A\u70B9\u6B65\u9AA4 ${e} \u4E0D\u5B58\u5728`);let p=(c.config??{})[t[0]];if(!p?.steps)throw new Error(`insert: \u6B65\u9AA4 ${c.id} \u65E0\u5B50\u94FE\uFF08${t[0]}\uFF09`);i=p.steps}let o=new Set,a=c=>{for(let d of c){o.add(String(d.id));let p=d.config??{};for(let m of["then","else","step"]){let h=p[m];h?.steps&&a(h.steps)}}};a(s.steps);let l=`_${r.type}${i.length+1}`,u=1;for(;o.has(l);)l=`_${r.type}${i.length+1+u++}`;return i.push({id:l,type:r.type,config:{...r.config}}),s}function Bp(n,e){let t=JSON.parse(JSON.stringify(n));if(e.length===0)throw new Error("removeStep: \u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");let r=t.steps,s=-1;for(let i=0;i<e.length;i++){let o=e[i];if(typeof o=="number"){if(!r[o])throw new Error(`removeStep: \u6B65\u9AA4\u7D22\u5F15 ${o} \u8D8A\u754C`);s=o;let a=e[i+1];if(typeof a=="string"){let u=(r[o].config??{})[a];if(!u?.steps)throw new Error(`removeStep: \u6B65\u9AA4 ${r[o].id} \u65E0\u5B50\u94FE\uFF08${a}\uFF09`);r=u.steps,i++}}}if(s<0)throw new Error("removeStep: \u5B9A\u4F4D\u5931\u8D25");return r.splice(s,1),t}var v_,Wp,Al=N(()=>{"use strict";v_={http:"HTTP",assign:"\u8D4B\u503C",call:"\u8C03\u7528",if:"\u6761\u4EF6",while:"\u5FAA\u73AF",for:"\u904D\u5386",return:"\u8FD4\u56DE",store:"\u5B58\u50A8",email:"\u90AE\u4EF6",ai:"AI",template:"\u6A21\u677F",log:"\u65E5\u5FD7"};Wp=(n,e)=>{for(let t of n){if(String(t.id)===e)return t;let r=t.config??{};for(let s of["then","else","step"]){let i=r[s];if(i?.steps){let o=Wp(i.steps,e);if(o)return o}}}return null}});function T_(n){let e=[],t=0,r=n.length;for(;t<r;){let s=n[t];if(s===" "||s===" "||s===`
72
+ `,u+=2;continue}if(d==="t"){c+=" ",u+=2;continue}throw new Error(`expression: invalid escape '\\${d??""}' at ${u} (in ${JSON.stringify(n)})`)}c+=n[u],u++}if(u>=r)throw new Error(`expression: unterminated string (in ${JSON.stringify(n)})`);e.push({t:"str",v:c,pos:t}),t=u+1;continue}let o=n.slice(t,t+3);if(Xb.includes(o)){e.push({t:"op",v:o,pos:t}),t+=3;continue}let i=n.slice(t,t+2);if(Yb.includes(i)){e.push({t:"op",v:i,pos:t}),t+=2;continue}if(e_.includes(s)){e.push({t:"op",v:s,pos:t}),t++;continue}if(s==="."||s==="["||s==="]"||s==="("||s===")"||s===","||s===":"){e.push({t:"punc",v:s,pos:t}),t++;continue}if(s>="0"&&s<="9"){let l=Zb.exec(n.slice(t));if(!l)throw new Error(`expression: invalid number at ${t} (in ${JSON.stringify(n)})`);e.push({t:"num",v:Number(l[0]),pos:t}),t+=l[0].length;continue}let a=Jb.exec(n.slice(t));if(a){e.push({t:"ident",v:a[0],pos:t}),t+=a[0].length;continue}throw new Error(`expression: unexpected character '${s}' at ${t} (in ${JSON.stringify(n)})`)}return e.push({t:"eof",pos:r}),e}function St(n){return new El(t_(n),n).parse()}function n_(n,e){function t(r,s){let o=e[s];if(o===void 0)return r;if(r==null)return;if(o==="*"){if(!Array.isArray(r))return[];let a=[];for(let l of r){let u=t(l,s+1);Array.isArray(u)?a.push(...u):u!==void 0&&a.push(u)}return a}let i;return typeof o=="number"?i=Array.isArray(r)?r[o]:void 0:o==="length"&&(Array.isArray(r)||typeof r=="string")?i=r.length:typeof r=="object"?i=r[o]:i=void 0,t(i,s+1)}return t(n,0)}function r_(n,e,t){if(typeof e!="number"||typeof t!="number")throw new Error(`expression: arithmetic '${n}' requires numbers (got ${Tl(e)} ${n} ${Tl(t)})`);let r;switch(n){case"+":r=e+t;break;case"-":r=e-t;break;case"*":r=e*t;break;case"/":r=e/t;break;case"%":r=e%t;break}if(!Number.isFinite(r))throw new Error(`expression: arithmetic '${n}' produced non-finite result`);return r}function Tl(n){return n===null?"null":Array.isArray(n)?"array":typeof n}function Oe(n,e,t){switch(n.kind){case"path":return n_(e,n.segments);case"literal":return n.value;case"neg":{let r=Oe(n.operand,e,t);if(typeof r!="number")throw new Error(`expression: unary '-' requires number (got ${Tl(r)})`);return-r}case"arith":return r_(n.op,Oe(n.left,e,t),Oe(n.right,e,t));case"ternary":return Cp(n.cond,e,t)?Oe(n.then,e,t):Oe(n.else,e,t);case"call":{if(!t?.[n.name])throw new Error(`expression: \u672A\u6CE8\u518C\u51FD\u6570 '${n.name}'\uFF08std \u7EAF\u51FD\u6570\uFF1A${Tp.join("/")}\uFF09`);return t[n.name](n.args.map(r=>Oe(r,e,t)))}case"compare":{let r=Oe(n.left,e,t),s=Oe(n.right,e,t);switch(n.op){case"==":return r==s;case"!=":return r!=s;case"===":return r===s;case"!==":return r!==s;case"<":return r<s;case"<=":return r<=s;case">":return r>s;case">=":return r>=s}}case"not":return!Vt(Oe(n.operand,e,t));case"and":{let r=Oe(n.left,e,t);return Vt(r)?Oe(n.right,e,t):r}case"or":{let r=Oe(n.left,e,t);return Vt(r)?r:Oe(n.right,e,t)}}}function Vt(n){return!!n}function Cp(n,e,t){return Vt(Oe(n,e,t))}function nr(n,e){let t=St(n);return r=>Oe(t,r,e)}function s_(n){return n==null?"":typeof n=="string"?n:typeof n=="object"?JSON.stringify(n):String(n)}function ut(n,e,t){if(!n.includes("{{"))return n;let r="",s=0;for(;;){let o=n.indexOf("{{",s);if(o===-1){r+=n.slice(s);break}let i=n.indexOf("}}",o+2);if(i===-1)throw new Error(`workflow/expression: interpolate: unclosed '{{' at ${o} (in ${JSON.stringify(n)})`);let a=n.slice(o+2,i).trim();if(!a)throw new Error(`workflow/expression: interpolate: empty expression (in ${JSON.stringify(n)})`);r+=n.slice(s,o),r+=s_(Oe(St(a),e,t)),s=i+2}return r}function Re(n){switch(n.kind){case"path":return n.segments.reduce((e,t)=>e+(typeof t=="number"?`[${t}]`:t==="*"?"[*]":e===""?t:`.${t}`),"");case"literal":return n.value===null?"null":typeof n.value=="string"?`'${n.value.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`:String(n.value);case"ternary":return`(${Re(n.cond)} ? ${Re(n.then)} : ${Re(n.else)})`;case"call":return`${n.name}(${n.args.map(e=>Re(e)).join(", ")})`;case"neg":return`-${Re(n.operand)}`;case"arith":return`(${Re(n.left)} ${n.op} ${Re(n.right)})`;case"compare":return`(${Re(n.left)} ${n.op} ${Re(n.right)})`;case"not":return`!${Re(n.operand)}`;case"and":return`(${Re(n.left)} && ${Re(n.right)})`;case"or":return`(${Re(n.left)} || ${Re(n.right)})`}}var Jb,Zb,Xb,Yb,e_,El,kn=I(()=>{"use strict";Io();Jb=/[A-Za-z_$][A-Za-z0-9_$]*/,Zb=/[0-9]+(?:\.[0-9]+)?/,Xb=["===","!=="],Yb=["==","!=","&&","||","<=",">="],e_=["!","+","-","*","/","%","<",">","?"];El=class{i=0;tokens;src;depth=0;constructor(e,t){this.tokens=e,this.src=t}peek(){return this.tokens[this.i]}next(){return this.tokens[this.i++]}fail(e,t){throw new Error(`${e} at ${t} (in ${JSON.stringify(this.src)})`)}expectPunc(e){let t=this.next();(t.t!=="punc"||t.v!==e)&&this.fail(`expression: expected '${e}'`,t.pos)}parse(){let e=this.parseTernary(),t=this.peek();return t.t!=="eof"&&this.fail(`expression: unexpected '${String(t.v)}'`,t.pos),e}parseTernary(){++this.depth>65&&this.fail("expression: nested expression too deep (max 64 \u5C42)",this.peek().pos);try{return this.parseTernaryInner()}finally{this.depth--}}parseTernaryInner(){let e=this.parseOr(),t=this.peek();if(t.t==="op"&&t.v==="?"){this.next();let r=this.parseTernary(),s=this.next();(s.t!=="punc"||s.v!==":")&&this.fail("expression: expected ':' in ternary",s.pos);let o=this.parseTernary();return{kind:"ternary",cond:e,then:r,else:o}}return e}parseOr(){let e=this.parseAnd();for(;this.isOp("||");)this.next(),e={kind:"or",left:e,right:this.parseAnd()};return e}parseAnd(){let e=this.parseCmp();for(;this.isOp("&&");)this.next(),e={kind:"and",left:e,right:this.parseCmp()};return e}parseCmp(){let e=this.parseArith(),t=this.peek();return t.t==="op"&&["==","!=","===","!==","<","<=",">",">="].includes(t.v)?(this.next(),{kind:"compare",op:t.v,left:e,right:this.parseArith()}):e}parseArith(){let e=this.parseTerm();for(;this.isOp("+")||this.isOp("-");)e={kind:"arith",op:this.next().v,left:e,right:this.parseTerm()};return e}parseTerm(){let e=this.parseUnary();for(;this.isOp("*")||this.isOp("/")||this.isOp("%");)e={kind:"arith",op:this.next().v,left:e,right:this.parseUnary()};return e}isOp(e){let t=this.peek();return t.t==="op"&&t.v===e}parseUnary(){let e=this.peek();return e.t==="op"&&e.v==="!"?(this.next(),{kind:"not",operand:this.parseUnary()}):e.t==="op"&&e.v==="-"?(this.next(),{kind:"neg",operand:this.parseUnary()}):this.parseAtom()}parseAtom(){let e=this.peek();if(e.t==="punc"&&e.v==="("){this.next();let t=this.parseTernary();return this.expectPunc(")"),t}if(e.t==="num")return this.next(),{kind:"literal",value:e.v};if(e.t==="str")return this.next(),{kind:"literal",value:e.v};if(e.t==="ident"){let t=e.v;if(t==="null"||t==="true"||t==="false")return this.next(),{kind:"literal",value:t==="null"?null:t==="true"};let r=this.parsePath(),s=this.peek();if(r.kind==="path"&&s.t==="punc"&&s.v==="("){this.next();let o=[];if(!this.isPunc2(")"))for(;;){if(o.push(this.parseTernary()),this.isPunc2(",")){this.next();continue}break}return this.expectPunc(")"),{kind:"call",name:r.segments[0],args:o}}return r}this.fail(`expression: unexpected '${e.t==="eof"?"(end)":String(e.v)}'`,e.pos)}isPunc2(e){let t=this.peek();return t.t==="punc"&&t.v===e}parsePath(){let e=[],t=this.next();for(t.t!=="ident"&&this.fail("expression: expected path",t.pos),e.push(t.v);;){let r=this.peek();if(r.t==="punc"&&r.v==="."){this.next();let s=this.next();s.t!=="ident"&&this.fail("expression: expected property after '.'",s.pos),e.push(s.v);continue}if(r.t==="punc"&&r.v==="["){this.next();let s=this.next();if(s.t==="op"&&s.v==="*"){this.expectPunc("]"),e.push("*");continue}(s.t!=="num"||!Number.isInteger(s.v))&&this.fail("expression: expected integer index or '*' in '[]'",s.pos),this.expectPunc("]"),e.push(s.v);continue}break}return{kind:"path",segments:e}}}});function i_(n){let e=n.reduce((s,o)=>s+o.length,0),t=new Uint8Array(e),r=0;for(let s of n)t.set(s,r),r+=s.length;return t}function a_(n){let e=String(n??"GET").toUpperCase();return["GET","POST","PUT","PATCH","DELETE","HEAD"].includes(e)?e:"GET"}function Ap(){return m_}var o_,l_,u_,c_,d_,p_,m_,Op=I(()=>{"use strict";kn();o_={type:"http",label:"HTTP \u8BF7\u6C42",fields:[{name:"url",label:"URL",type:"string"},{name:"method",label:"\u65B9\u6CD5",type:"string"}],required:["url"],async run(n,e,t){let r=String(n.url),s=a_(n.method),o=typeof n.timeoutMs=="number"&&n.timeoutMs>0?n.timeoutMs:1e4,i=t.fetch??globalThis.fetch;if(!i)throw new Error("http step: no fetch available");let a=n.headers??{},l=typeof n.body=="string"?n.body:void 0,u=await i(r,{method:s,headers:a,body:l,signal:AbortSignal.timeout(o)}),c=typeof n.maxBytes=="number"&&n.maxBytes>0?n.maxBytes:10*1024*1024,d=Number(u.headers.get("content-length")??0);if(d>c)throw new Error(`http step: \u54CD\u5E94 ${d} \u5B57\u8282\u8D85\u8FC7\u4E0A\u9650 ${c}`);let p;if(u.body){let w=u.body.getReader(),m=[],g=0;for(;;){let{done:h,value:b}=await w.read();if(h)break;if(g+=b.length,g>c)throw await w.cancel(),new Error(`http step: \u54CD\u5E94\u8D85\u8FC7\u4E0A\u9650 ${c} \u5B57\u8282\uFF08\u53EF\u7ECF config.maxBytes \u8C03\u6574\uFF09`);m.push(b)}p=new TextDecoder().decode(i_(m))}else p=await u.text();let f={status:u.status,text:p};try{f.json=JSON.parse(p)}catch{}return f}};l_={type:"template",label:"\u6570\u636E\u6A21\u677F",fields:[{name:"template",label:"\u6A21\u677F",type:"string"}],required:["template"],run(n,e){return{text:ut(String(n.template),e)}}},u_={type:"log",label:"\u65E5\u5FD7",fields:[{name:"message",label:"\u6D88\u606F",type:"string"}],required:[],run(n,e,t){let r=ut(String(n.message??""),e);return t.log?.(r),{text:r}}},c_={type:"ai",label:"AI \u751F\u6210",fields:[{name:"prompt",label:"\u63D0\u793A\u8BCD\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"},{name:"system",label:"\u7CFB\u7EDF\u6307\u4EE4",type:"string"}],required:["prompt"],effects:!0,async run(n,e,t){if(!t.ai?.chat)throw new Error("ai step: \u672A\u6CE8\u5165 ai \u9002\u914D\u5668\uFF08workflow({ ai })\uFF09");let r=n.system?ut(String(n.system),e):void 0,s=ut(String(n.prompt),e);return{text:(await t.ai.chat({messages:[...r?[{role:"system",content:r}]:[],{role:"user",content:s}]})).content}}},d_={type:"email",label:"\u53D1\u9001\u90AE\u4EF6",fields:[{name:"to",label:"\u6536\u4EF6\u4EBA",type:"string"},{name:"subject",label:"\u4E3B\u9898\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"},{name:"body",label:"\u6B63\u6587\uFF08\u652F\u6301 {{}} \u63D2\u503C\uFF09",type:"string"}],required:["to"],effects:!0,async run(n,e,t){if(!t.email?.send)throw new Error("email step: \u672A\u6CE8\u5165 email \u9002\u914D\u5668\uFF08workflow({ email })\uFF09");let r=ut(String(n.to),e),s=n.subject?ut(String(n.subject),e):"workflow \u901A\u77E5",o=n.body?ut(String(n.body),e):"",i=await t.email.send({to:r.split(",").map(a=>a.trim()).filter(Boolean),subject:s,body:o});if(!i.ok)throw new Error(`email step: \u53D1\u9001\u5931\u8D25${i.id?` (${i.id})`:""}`);return{id:i.id}}},p_={type:"store",label:"KV \u5B58\u50A8",fields:[{name:"op",label:"\u64CD\u4F5C\uFF08get/set\uFF09",type:"string"},{name:"key",label:"\u952E",type:"string"},{name:"value",label:"\u503C\uFF08set \u65F6\uFF09",type:"string"}],required:["op","key"],run:async(n,e,t)=>{let r=t.store;if(!r)throw new Error("store \u6B65\u9AA4\u9700\u8981\u5B58\u50A8\u6CE8\u5165\uFF1Aworkflow({ store }) \u6216 workflow({ redis })");let s=String(n.op),o=ut(String(n.key),e);if(s==="get")return await r.get(o);if(s==="set"){let i=ut(String(n.value??""),e);return await r.set(o,i),i}throw new Error(`store \u672A\u77E5\u64CD\u4F5C\uFF1A'${s}'\uFF08get/set\uFF09`)}},m_=[o_,l_,u_,c_,d_,p_]});async function Pp(n,e,t,r){let o=(e.mode??"live")==="dry",i=Date.now(),a={},l={status:"success",executed:[],skippedSteps:[],stepResults:a,dry:o,startedAt:i,finishedAt:0},u=e.budgetMs??6e5,c=AbortSignal.timeout(u),d=e.signal?AbortSignal.any([e.signal,c]):c,p={result:l,steps:a,dry:o,signal:d,budgetMs:u,def:n,fnDepth:0},f=await xn(n.steps,{steps:a,vars:{},input:e.input},t,r,p);return l.finishedAt=Date.now(),l}async function xn(n,e,t,r,s){let{result:o,steps:i}=s;for(let a of n){if(s.signal?.aborted)return o.status="error",o.error=s.signal.reason?.name==="TimeoutError"?`\u6267\u884C\u8D85\u65F6\uFF08\u9884\u7B97 ${s.budgetMs??6e5}ms\u2014\u2014\u53EF\u7ECF budgetMs \u8C03\u6574\uFF09`:`aborted before step '${a.id}'`,{k:"return"};if(a.when!==void 0){let c;try{c=Vt(Sn(a.when,e,`when of '${a.id}'`))}catch(d){return i[a.id]={ok:!1,error:`when \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${d.message}`},o.status="error",o.error=`step '${a.id}': ${d.message}`,{k:"return"}}if(!c){o.skippedSteps.push(a.id);continue}}switch(a.type){case"assign":{let c=a.config;try{e.vars[c.target]=Sn(c.value,e,`\u8D4B\u503C ${c.target}`),i[a.id]={ok:!0,data:e.vars[c.target]},o.executed.push(a.id)}catch(d){return Ip(s,a,d)}continue}case"if":{let c=a.config,d=await f_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"try":{let c=a.config,d=await g_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"while":{let c=a.config,d=await h_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"for":{let c=a.config,d=await w_(a,c,e,t,r,s);if(d.k!=="continue")return d;continue}case"return":{let c=a.config,d=c.value!==void 0?Sn(c.value,e,"return"):void 0;return i[a.id]={ok:!0,data:d},o.executed.push(a.id),{k:"return",value:d}}case"call":{let c=a.config,d=s.def.functions?.find(m=>m.name===c.name);if(!d)return i[a.id]={ok:!1,error:`\u672A\u77E5\u51FD\u6570\uFF1A'${c.name}'`},o.status="error",o.error=`step '${a.id}': \u672A\u77E5\u51FD\u6570 '${c.name}'`,{k:"return"};if(s.fnDepth>=64)return i[a.id]={ok:!1,error:`\u51FD\u6570\u9012\u5F52\u6DF1\u5EA6\u8D85\u8FC7 64\uFF08${c.name}\uFF09`},o.status="error",o.error=`step '${a.id}': \u51FD\u6570\u9012\u5F52\u6DF1\u5EA6\u8D85\u8FC7 64`,{k:"return"};let p={};try{for(let m=0;m<d.params.length;m++){let g=c.args?.[m]??"undefined";p[d.params[m]]=Sn(g,e,`\u51FD\u6570 '${c.name}' \u53C2\u6570 ${d.params[m]}`)}}catch(m){return i[a.id]={ok:!1,error:m.message},o.status="error",o.error=`step '${a.id}': ${m.message}`,{k:"return"}}let f={...e,vars:p};s.fnDepth++;let w=await xn(d.step.steps,f,t,r,s);s.fnDepth--,w.k==="continue"?i[a.id]={ok:!0,data:void 0}:i[a.id]={ok:!0,data:w.value},o.executed.push(a.id);continue}}let l=r.get(a.type);if(!l)return i[a.id]={ok:!1,error:`\u672A\u6CE8\u518C\u6B65\u9AA4\u7C7B\u578B\uFF1A'${a.type}'`},o.status="error",o.error=`step '${a.id}': \u672A\u6CE8\u518C\u7C7B\u578B '${a.type}'`,{k:"return"};let u=a.config??{};try{let c;s.dry&&l.effects?(c=void 0,i[a.id]={ok:!0,dry:!0}):(c=await l.run(u,e,t),i[a.id]={ok:!0,data:c}),o.executed.push(a.id)}catch(c){return Ip(s,a,c)}if(s.signal?.aborted)return o.status="error",o.error=s.signal.reason?.name==="TimeoutError"?`\u6267\u884C\u8D85\u65F6\uFF08\u9884\u7B97 ${s.budgetMs??6e5}ms\u2014\u2014\u53EF\u7ECF budgetMs \u8C03\u6574\uFF09`:`aborted after step '${a.id}'`,{k:"return"}}return{k:"continue"}}async function f_(n,e,t,r,s,o){let{result:i,steps:a}=o,l;try{l=Vt(Sn(e.when,t,`if '${n.id}' \u6761\u4EF6`))}catch(c){return a[n.id]={ok:!1,error:`if \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${c.message}`},i.status="error",i.error=`step '${n.id}': ${c.message}`,{k:"return"}}a[n.id]={ok:!0,data:{satisfied:l}},i.executed.push(n.id);let u=l?e.then:e.else??void 0;return u?xn(u.steps,t,r,s,o):{k:"continue"}}async function g_(n,e,t,r,s,o){let{result:i,steps:a}=o,l=i.error,u=await xn(e.step.steps,t,r,s,o);if(u.k==="return"&&i.status==="error"&&i.error!==l){let c=i.error??"\u672A\u77E5\u9519\u8BEF";return a[n.id]={ok:!1,error:c},i.status="success",i.error=void 0,i.executed.push(n.id),e.catch?.steps.length?xn(e.catch.steps,t,r,s,o):{k:"continue"}}return a[n.id]={ok:!0,data:{}},i.executed.push(n.id),u}async function h_(n,e,t,r,s,o){let{result:i,steps:a}=o,l=e.maxIters??1e3;for(let u=0;;u++){if(o.signal?.aborted)return i.status="error",i.error=`aborted in while '${n.id}'`,{k:"return"};let c;try{c=Vt(Sn(e.when,t,`while '${n.id}' \u6761\u4EF6`))}catch(p){return a[n.id]={ok:!1,error:`while \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${p.message}`},i.status="error",i.error=`step '${n.id}': ${p.message}`,{k:"return"}}if(!c)return a[n.id]={ok:!0,data:{iterations:u}},i.executed.push(n.id),{k:"continue"};if(u>=l)return a[n.id]={ok:!1,error:`while \u8D85\u8FC7 maxIters=${l}\uFF08\u9632\u6B7B\u5FAA\u73AF\uFF09`},i.status="error",i.error=`step '${n.id}': while \u8D85\u8FC7 maxIters=${l}`,{k:"return"};let d=await xn(e.step.steps,t,r,s,o);if(d.k!=="continue")return d}}async function w_(n,e,t,r,s,o){let{result:i,steps:a}=o,l;try{l=Sn(e.items,t,`for '${n.id}' items`)}catch(d){return a[n.id]={ok:!1,error:`for \u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${d.message}`},i.status="error",i.error=`step '${n.id}': ${d.message}`,{k:"return"}}if(!Array.isArray(l))return a[n.id]={ok:!1,error:`for items \u5FC5\u987B\u662F\u6570\u7EC4\uFF08\u5F97\u5230 ${String(l)}\uFF09`},i.status="error",i.error=`step '${n.id}': for items \u975E\u6570\u7EC4`,{k:"return"};let u=e.maxIters??1e3;if(l.length>u)return a[n.id]={ok:!1,error:`for \u8D85\u8FC7 maxIters=${u}\uFF08items ${l.length} \u9879\uFF09`},i.status="error",i.error=`step '${n.id}': for \u8D85\u8FC7 maxIters=${u}`,{k:"return"};let c=t.loop;for(let d=0;d<l.length;d++){if(o.signal?.aborted)return i.status="error",i.error=`aborted in for '${n.id}'`,{k:"return"};t.loop={item:l[d],index:d};let p=await xn(e.step.steps,t,r,s,o);if(p.k!=="continue")return t.loop=c,p}return t.loop=c,a[n.id]={ok:!0,data:{iterations:l.length}},i.executed.push(n.id),{k:"continue"}}function Ip(n,e,t){return n.steps[e.id]={ok:!1,error:t.message},n.result.status="error",n.result.error=`step '${e.id}' (${e.type}): ${t.message}`,{k:"return"}}function Sn(n,e,t){try{return nr(n,Rl)(e)}catch(r){throw new Error(`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF08${t}\uFF09\uFF1A${r.message}`)}}var Np=I(()=>{"use strict";kn();Io()});function cs(n){return{get:async e=>{let t=await n.command("GET",e);return t==null?null:String(t)},set:async(e,t)=>{await n.command("SET",e,t)},del:async e=>{await n.command("DEL",e)}}}var Cl=I(()=>{"use strict"});var Mp,$p=I(()=>{"use strict";Mp=["assign","if","try","while","for","return","call"]});function Dp(n,e){let t=[],r=n;if(!Array.isArray(r?.steps)||r.steps.length===0)return{ok:!1,errors:[{path:"steps",message:"steps \u5FC5\u987B\u4E3A\u975E\u7A7A\u6570\u7EC4"}]};let s=new Set,o=new Set,i=new Set;y_(r,o,i),Po(r.steps,"steps",e,t,s,0);let a=[];b_(r,a);for(let l of a){let u;try{u=St(l.expr)}catch{continue}jp(u,o,i,l.path,t)}return{ok:t.length===0,errors:t}}function y_(n,e,t){let r=s=>{for(let o of s){t.add(o.id);let i=o.config??{};o.type==="assign"&&typeof i.target=="string"&&e.add(i.target);let a=i.then;a&&Array.isArray(a.steps)&&r(a.steps);let l=i.else;l&&Array.isArray(l.steps)&&r(l.steps);let u=i.step;u&&Array.isArray(u.steps)&&r(u.steps);let c=i.catch;c&&Array.isArray(c.steps)&&r(c.steps)}};r(n.steps);for(let s of n.functions??[]){for(let o of s.params??[])e.add(o);r(s.step.steps)}}function b_(n,e){let t=(i,a)=>{for(let l of i){let u=l.config??{},c=`${a}/${l.id}`;if(l.type==="assign")s(u.value,`${c}.value`);else if(l.type==="if"){s(u.when,`${c}.when`);for(let d of["then","else"]){let p=u[d];p&&Array.isArray(p.steps)&&t(p.steps,`${c}.${d}`)}}else if(l.type==="while")s(u.when,`${c}.when`);else if(l.type==="for")s(u.items,`${c}.items`);else if(l.type==="return")s(u.value,`${c}.value`);else if(l.type==="call")for(let[d,p]of(u.args??[]).entries())s(p,`${c}.args[${d}]`);else for(let[d,p]of Object.entries(u))typeof p=="string"?o(p,`${c}.${d}`):p&&typeof p=="object"&&!Array.isArray(p)&&r(p,`${c}.${d}`);typeof l.when=="string"&&s(l.when,`${c}.when`)}},r=(i,a)=>{for(let[l,u]of Object.entries(i))typeof u=="string"?o(u,`${a}.${l}`):u&&typeof u=="object"&&!Array.isArray(u)&&r(u,`${a}.${l}`)},s=(i,a)=>{typeof i=="string"&&e.push({path:a,expr:i})},o=(i,a)=>{for(let l of i.matchAll(/\{\{([\s\S]+?)\}\}/g))e.push({path:a,expr:l[1].trim()})};t(n.steps,"steps");for(let i of n.functions??[])t(i.step.steps,`functions.${i.name}`)}function jp(n,e,t,r,s){if(!(!n||typeof n!="object")){if("segments"in n&&Array.isArray(n.segments)){let o=n.segments[0];if(o==="vars"&&n.segments[1]==="loop")return;o==="vars"&&typeof n.segments[1]=="string"&&!e.has(n.segments[1])?s.push({path:r,message:`\u672A\u58F0\u660E\u53D8\u91CF\u5F15\u7528\uFF1Avars.${n.segments[1]}\uFF08\u987B\u6709 assign target \u58F0\u660E\uFF09`}):o==="steps"&&typeof n.segments[1]=="string"&&!t.has(n.segments[1])&&s.push({path:r,message:`\u672A\u77E5\u6B65\u9AA4\u5F15\u7528\uFF1Asteps.${n.segments[1]}\uFF08\u987B\u662F\u5DF2\u5B9A\u4E49\u6B65\u9AA4 id\uFF09`});return}for(let o of Object.values(n))o&&typeof o=="object"&&jp(o,e,t,r,s)}}function Po(n,e,t,r,s,o){if(o>qp){r.push({path:e,message:`\u5B50\u94FE\u5D4C\u5957\u8D85\u8FC7 ${qp} \u5C42`});return}for(let[i,a]of n.entries()){let l=`${e}[${i}]`;if(!a||typeof a!="object"){r.push({path:l,message:"step \u5FC5\u987B\u662F\u5BF9\u8C61"});continue}if(!a.id||typeof a.id!="string"?r.push({path:`${l}.id`,message:"\u5FC5\u586B\uFF1A\u552F\u4E00 id"}):s.has(a.id)?r.push({path:`${l}.id`,message:`id \u91CD\u590D\uFF1A'${a.id}'`}):s.add(a.id),!a.type||typeof a.type!="string"){r.push({path:`${l}.type`,message:"\u5FC5\u586B\uFF1A\u6B65\u9AA4\u7C7B\u578B"});continue}if(!Mp.includes(a.type)&&!t.has(a.type)){r.push({path:`${l}.type`,message:`\u672A\u6CE8\u518C\u7684\u6B65\u9AA4\u7C7B\u578B\uFF1A'${a.type}'`});continue}let u=a.config??{};switch(a.type){case"assign":rr(u,"target","\u76EE\u6807\u53D8\u91CF\u540D",r,`${l}.config.target`,!1),rr(u,"value","\u8D4B\u503C\u8868\u8FBE\u5F0F",r,`${l}.config.value`,!1);break;case"if":{rr(u,"when","\u6761\u4EF6\u8868\u8FBE\u5F0F",r,`${l}.config.when`,!1);for(let c of["then","else"]){let d=u[c];d!==void 0&&(Array.isArray(d.steps)?Po(d.steps,`${l}.config.${c}.steps`,t,r,s,o+1):r.push({path:`${l}.config.${c}.steps`,message:"\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4"}))}break}case"try":{Al(u,"step",t,r,s,o,l,"steps");let c=u.catch;!c||!Array.isArray(c.steps)?r.push({path:`${l}.config.catch.steps`,message:"catch \u94FE\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4\uFF08v0 try \u5FC5\u914D catch\uFF09"}):Po(c.steps,`${l}.config.catch.steps`,t,r,s,o+1);break}case"while":{rr(u,"when","\u5FAA\u73AF\u6761\u4EF6",r,`${l}.config.when`,!1),Al(u,"step",t,r,s,o,l,"steps");break}case"for":{rr(u,"items","\u96C6\u5408\u8868\u8FBE\u5F0F",r,`${l}.config.items`,!1),Al(u,"step",t,r,s,o,l,"steps");break}case"return":{u.value!==void 0&&rr(u,"value","\u8FD4\u56DE\u503C\u8868\u8FBE\u5F0F",r,`${l}.config.value`,!0);break}default:{let c=t.schema(a.type);for(let d of c?.required??[])(typeof u[d]!="string"||u[d]==="")&&r.push({path:`${l}.config.${d}`,message:`\u5FC5\u586B\uFF1A${d}`})}}if(a.when!==void 0&&typeof a.when!="string")r.push({path:`${l}.when`,message:"\u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u8868\u8FBE\u5F0F"});else if(typeof a.when=="string")try{nr(a.when)}catch(c){r.push({path:`${l}.when`,message:`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${c.message}`})}}}function Al(n,e,t,r,s,o,i,a){let l=n[e];if(!l||!Array.isArray(l.steps)){r.push({path:`${i}.config.${e}.${a}`,message:"\u5FC5\u987B\u662F\u6B65\u9AA4\u6570\u7EC4"});return}Po(l.steps,`${i}.config.${e}.${a}`,t,r,s,o+1)}function rr(n,e,t,r,s,o){let i=n[e];if(typeof i!="string"||i===""){o||r.push({path:s,message:`\u5FC5\u586B\uFF1A${t}`});return}try{nr(i)}catch(a){r.push({path:s,message:`\u8868\u8FBE\u5F0F\u9519\u8BEF\uFF1A${a.message}`})}}var qp,Lp=I(()=>{"use strict";$p();kn();qp=16});function Ol(n){let e={};for(let t of n){let r={};for(let s of t.fields??[])r[s.name]={type:s.type==="number"?"number":s.type==="boolean"?"boolean":"string",title:s.label,placeholder:s.placeholder};e[t.type]={type:"object",title:t.label,properties:r,...t.required&&t.required.length?{required:t.required}:{}}}return{type:"object",title:"Workflow",properties:e}}function Wp(n,e,t){if(n==="if"){let r=e?.length??0,s=t?.length??0;return`then\xD7${r}${s?`/else\xD7${s}`:""}`}return n==="while"||n==="for"?`\xD7${e?.length??0} \u5B50\u6B65\u9AA4`:""}function Il(n,e){let t=e?.labels??{},r=[],s=[],o=n.steps??[];for(let[i,a]of o.entries()){let l=a.config??{},u=`${t[a.type]??__[a.type]??a.type} ${a.id}`;if(a.type==="if"){let c=l.then?.steps,d=l.else?.steps,p=Wp("if",c,d);p&&(u+=`\uFF08${p}\uFF09`)}else if(a.type==="while"||a.type==="for"){let c=l.step?.steps,d=Wp(a.type,c);d&&(u+=`\uFF08${d}\uFF09`)}r.push({id:a.id,label:u}),i>0&&s.push({from:o[i-1].id,to:a.id})}return{nodes:r,edges:s}}function Up(n,e,t){if(e.length===0)throw new Error("patchStepConfig: \u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");let s=(a=>a&&typeof a=="object"?JSON.parse(JSON.stringify(a)):a)(n),o=s.steps,i=null;for(let a=0;a<e.length;a++){let l=e[a];if(typeof l=="number"){if(!o||!o[l])throw new Error(`patchStepConfig: \u6B65\u9AA4\u7D22\u5F15 ${l} \u8D8A\u754C`);i=o[l];let u=e[a+1];if(typeof u=="string"){let d=(i.config??{})[u];if(u==="step"&&!d?.steps)throw new Error(`patchStepConfig: \u6B65\u9AA4 ${o[l].id} \u65E0\u5B50\u94FE\uFF08step\uFF09`);if((u==="then"||u==="else")&&!d?.steps)throw new Error(`patchStepConfig: \u6B65\u9AA4 ${o[l].id} \u65E0\u5B50\u94FE\uFF08${u}\uFF09`);o=d?.steps??[],a++}else if(a!==e.length-1)throw new Error("patchStepConfig: \u94FE token\uFF08then/else/step\uFF09\u540E\u5FC5\u987B\u8DDF\u7D22\u5F15")}}if(!i)throw new Error("patchStepConfig: \u5B9A\u4F4D\u5931\u8D25");return i.config={...i.config??{},...t},s}function Hp(n,e,t,r){let s=JSON.parse(JSON.stringify(n)),o;if(e===null){if(t.length>0)throw new Error("insert: \u9876\u5C42\u951A\u70B9\uFF08anchor=null\uFF09\u4E0D\u80FD\u6307\u5B9A\u5B50\u94FE\u2014\u2014\u8BF7\u7528\u6B65\u9AA4 id \u951A\u70B9");o=s.steps}else{if(t.length!==1)throw new Error("insert: v0 \u4EC5\u652F\u6301\u5355\u6BB5\u94FE\uFF08then/else/step \u4E4B\u4E00\uFF09\u2014\u2014\u591A\u6BB5\u5D4C\u5957\u94FE\u7F16\u8F91\u5668\u6682\u4E0D\u652F\u6301");let c=Bp(s.steps,e);if(!c)throw new Error(`insert: \u951A\u70B9\u6B65\u9AA4 ${e} \u4E0D\u5B58\u5728`);let p=(c.config??{})[t[0]];if(!p?.steps)throw new Error(`insert: \u6B65\u9AA4 ${c.id} \u65E0\u5B50\u94FE\uFF08${t[0]}\uFF09`);o=p.steps}let i=new Set,a=c=>{for(let d of c){i.add(String(d.id));let p=d.config??{};for(let f of["then","else","step"]){let w=p[f];w?.steps&&a(w.steps)}}};a(s.steps);let l=`_${r.type}${o.length+1}`,u=1;for(;i.has(l);)l=`_${r.type}${o.length+1+u++}`;return o.push({id:l,type:r.type,config:{...r.config}}),s}function Fp(n,e){let t=JSON.parse(JSON.stringify(n));if(e.length===0)throw new Error("removeStep: \u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");let r=t.steps,s=-1;for(let o=0;o<e.length;o++){let i=e[o];if(typeof i=="number"){if(!r[i])throw new Error(`removeStep: \u6B65\u9AA4\u7D22\u5F15 ${i} \u8D8A\u754C`);s=i;let a=e[o+1];if(typeof a=="string"){let u=(r[i].config??{})[a];if(!u?.steps)throw new Error(`removeStep: \u6B65\u9AA4 ${r[i].id} \u65E0\u5B50\u94FE\uFF08${a}\uFF09`);r=u.steps,o++}}}if(s<0)throw new Error("removeStep: \u5B9A\u4F4D\u5931\u8D25");return r.splice(s,1),t}var __,Bp,Pl=I(()=>{"use strict";__={http:"HTTP",assign:"\u8D4B\u503C",call:"\u8C03\u7528",if:"\u6761\u4EF6",while:"\u5FAA\u73AF",for:"\u904D\u5386",return:"\u8FD4\u56DE",store:"\u5B58\u50A8",email:"\u90AE\u4EF6",ai:"AI",template:"\u6A21\u677F",log:"\u65E5\u5FD7"};Bp=(n,e)=>{for(let t of n){if(String(t.id)===e)return t;let r=t.config??{};for(let s of["then","else","step"]){let o=r[s];if(o?.steps){let i=Bp(o.steps,e);if(i)return i}}}return null}});function E_(n){let e=[],t=0,r=n.length;for(;t<r;){let s=n[t];if(s===" "||s===" "||s===`
73
73
  `||s==="\r"){t++;continue}if(s==="#"||s==="/"&&n[t+1]==="/"){for(;t<r&&n[t]!==`
74
74
  `;)t++;continue}if(s==="`"){let l=t+1,u="";for(;l<r&&n[l]!=="`";){if(n[l]==="\\"){u+=n[l]+(n[l+1]??""),l+=2;continue}u+=n[l],l++}if(l>=r)throw new Error(`wfjs: unterminated template string at ${t}`);e.push({t:"template",raw:u,v:"",pos:t,end:l+1}),t=l+1;continue}if(s==='"'||s==="'"){let l=s,u=t+1,c="";for(;u<r&&n[u]!==l;){if(n[u]==="\\"){let d=n[u+1];if(d==="n"){c+=`
75
- `,u+=2;continue}if(d==="t"){c+=" ",u+=2;continue}c+=d??"",u+=2;continue}c+=n[u],u++}if(u>=r)throw new Error(`wfjs: unterminated string at ${t}`);e.push({t:"str",v:c,pos:t,end:u+1}),t=u+1;continue}let i=n.slice(t,t+3);if(i==="==="||i==="!=="){e.push({t:"op",v:i,pos:t,end:t+3}),t+=3;continue}let o=n.slice(t,t+2);if(R_.has(o)){e.push({t:"op",v:o,pos:t,end:t+2}),t+=2;continue}if(E_.has(s)){e.push({t:"op",v:s,pos:t,end:t+1}),t++;continue}if(S_.has(s)){e.push({t:"punc",v:s,pos:t,end:t+1}),t++;continue}if(s>="0"&&s<="9"){let l=/[0-9]+(?:\.[0-9]+)?/.exec(n.slice(t));e.push({t:"num",v:Number(l[0]),pos:t,end:t+l[0].length}),t+=l[0].length;continue}let a=/[A-Za-z_$][A-Za-z0-9_$]*/.exec(n.slice(t));if(a){e.push(k_.has(a[0])?{t:"kw",v:a[0],pos:t,end:t+a[0].length}:{t:"ident",v:a[0],pos:t,end:t+a[0].length}),t+=a[0].length;continue}throw new Error(`wfjs: unexpected character '${s}' at ${t} (in ${JSON.stringify(n)})`)}return e.push({t:"eof",v:"",pos:r,end:r}),e}function C_(n){let e=[],t=0,r="";for(;t<n.length;){if(n[t]==="$"&&n[t+1]==="{"){let s=1,i=t+2,o="";for(;i<n.length&&s>0;){if(n[i]==="\\"){o+=n[i]+(n[i+1]??""),i+=2;continue}n[i]==="{"&&s++,n[i]==="}"&&s--,s>0&&(o+=n[i]),i++}if(s!==0)throw new Error("wfjs: unclosed '${' in template");r&&(e.push(r),r=""),e.push({expr:o.trim()}),t=i;continue}r+=n[t],t++}return r&&e.push(r),e}function Pl(n,e,t){let r=n;if(!(!r||typeof r!="object")){if(r.kind==="call"){let s=r.name??"";if(A_.has(s))throw new Error(`wfjs: \u526F\u4F5C\u7528\u51FD\u6570 '${s}()' \u4E0D\u80FD\u51FA\u73B0\u5728\u8868\u8FBE\u5F0F\u5185\uFF08in ${t}\uFF09\u2014\u2014\u9700\u8BED\u53E5\u7EA7\u8C03\u7528`);if(!e.stdFns.has(s))throw new Error(`wfjs: \u8868\u8FBE\u5F0F\u5185\u672A\u5BFC\u5165\u51FD\u6570 '${s}()'\uFF08in ${t}\uFF09\u2014\u2014std \u51FD\u6570\u9700 import \u540E\u53EF\u7528`)}for(let s of["left","right","operand","cond","then","else"])r[s]&&typeof r[s]=="object"&&Pl(r[s],e,t);if(r.args)for(let s of r.args)Pl(s,e,t)}}function ht(n,e,t,r){let s=St(n);return Pl(s,t,r),sr(s,i=>{let o=i.segments[0];if(typeof o!="string")return;let a=e.get(o);if(!a&&(o==="input"||o==="steps"||o==="vars"||o==="loop"))return;if(!a)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${o}'\uFF08in ${r}: ${n}\uFF09`);let l=a.kind==="step"?["steps",a.id,"data"]:a.kind==="var"?["vars",a.name]:["loop","item"];i.segments=[...l,...i.segments.slice(1)]}),xe(s)}function sr(n,e){let t=n;if(!(!t||typeof t!="object")){if(t.kind==="path"&&e(t),t.kind==="ternary"){sr(t.cond,e),sr(t.then,e),sr(t.else,e);return}if(t.kind==="call"){for(let r of t.args)sr(r,e);return}for(let r of[["left","right"],["operand"]])for(let s of r)t[s]&&typeof t[s]=="object"&&sr(t[s],e)}}function Nl(n,e){for(let t=1;;t++){let r=`${e}${t}`;if(!n.bindings.has(r)&&!n.steps.some(s=>s.id===r))return r}}function Io(n,e,t,r){switch(n.t){case"str":return r==="expr"?`'${n.v.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`:n.v;case"num":return String(n.v);case"expr":return r==="template"?`{{${ht(n.src,e.bindings,e,t)}}}`:ht(n.src,e.bindings,e,t);case"tpl":{if(r==="expr")throw new Error(`wfjs: \u8868\u8FBE\u5F0F\u5B57\u6BB5\u4E0D\u652F\u6301\u6A21\u677F\u4E32\uFF08in ${t}\uFF09`);let s="";for(let i of n.parts)typeof i=="string"?s+=i:s+=`{{${ht(i.expr,e.bindings,e,t)}}}`;return s}case"obj":{let s={};for(let i of n.kvs)s[i.key]=Io(i.value,e,t,r);return s}}}function Ol(n,e,t){if(n.key===null){let s=n.value;if(s.t==="expr")return`{{${ht(s.src,t.bindings,t,"store \u53C2\u6570")}}}`;if(s.t==="str")return s.v;if(s.t==="num")return String(s.v);throw new Error("wfjs: store \u53C2\u6570\u5FC5\u987B\u662F\u8868\u8FBE\u5F0F\u6216\u5B57\u9762\u91CF")}let r=Ml[e]?.[n.key]??"template";return Io(n.value,t,`${e}(${n.key})`,r)}function Rn(n,e){return{bindings:new Map(n.bindings),consts:new Set(n.consts),steps:e,imports:n.imports,stdBindings:n.stdBindings,stdFns:n.stdFns,scopes:[...n.scopes,{names:new Set}],hideCount:n.hideCount,functions:n.functions,inFunction:n.inFunction,autoPrefix:n.autoPrefix,exports:n.exports,remoteImports:n.remoteImports}}function O_(n,e,t){let r=n.scopes[n.scopes.length-1];if(r.names.has(e))throw new Error(`wfjs: \u91CD\u590D\u58F0\u660E '${e}'\uFF08${t}\uFF09`);let s=n.scopes.slice(0,-1).some(o=>o.names.has(e)),i=e;if(s){let o=new Set;for(let a of n.bindings.values())a.kind==="var"?o.add(a.name):a.kind==="step"&&o.add(a.id);do n.hideCount++,i=`${e}$${n.hideCount}`;while(o.has(i))}return r.names.add(e),i}function I_(n,e,t){let r=()=>Nl(e,`${e.autoPrefix}_${n.k}`);switch(n.k){case"export":{let s=e.functions,i=o=>{if(!s.some(a=>a.name===o))throw new Error(`wfjs: \u5BFC\u51FA '${o}' \u5FC5\u987B\u662F\u5DF2\u5B9A\u4E49\u51FD\u6570\uFF08v1 \u51FD\u6570\u5BFC\u51FA\u2014\u2014\u53D8\u91CF\u5BFC\u51FA v2\uFF09`)};if(n.named.forEach(o=>i(o.name)),n.default&&i(n.default),n.named.length===0&&!n.default)throw new Error("wfjs: export \u5FC5\u987B\u81F3\u5C11\u5BFC\u51FA\u4E00\u4E2A\u6210\u5458");e.exports.named.push(...n.named),n.default&&(e.exports.default=n.default);return}case"function":{if(e.inFunction)throw new Error(`wfjs: \u4E0D\u652F\u6301\u5D4C\u5957\u51FD\u6570\uFF08\u51FD\u6570 '${n.name}'\uFF09`);let s=e.functions.find(u=>u.name===n.name);if(!s)throw new Error(`wfjs: \u5185\u90E8\u9519\u8BEF\uFF1A\u51FD\u6570 '${n.name}' \u672A\u9884\u6CE8\u518C`);let i=new Map,o=new Set,a=[...e.scopes,{names:o}];for(let u of n.params){if(o.has(u))throw new Error(`wfjs: \u91CD\u590D\u53C2\u6570 '${u}'`);o.add(u),i.set(u,{kind:"var",name:u})}for(let[u,c]of e.bindings)c.kind==="var"&&!o.has(u)&&i.set(u,c);let l={bindings:i,consts:new Set,steps:[],imports:e.imports,stdBindings:e.stdBindings,stdFns:e.stdFns,scopes:a,hideCount:e.hideCount,functions:e.functions,inFunction:!0,autoPrefix:`_fn:${n.name}:`,exports:e.exports,remoteImports:e.remoteImports};zt(n.body,l,!1),s.step={steps:l.steps};return}case"import":{if(n.from.startsWith("wf://std/")){let i=vl[n.from]??(n.from==="wf://std/store"?{store:null}:void 0);if(!i)throw new Error(`wfjs: std \u6A21\u5757 '${n.from}' \u672A\u6CE8\u518C\uFF08${Object.keys(vl).join(" / ")} \u4E0E wf://std/store\uFF09`);for(let{name:o,as:a}of n.names){let l=a??o;if(o==="store"&&n.from==="wf://std/store")e.stdBindings.set(l,"store");else if(i[o]!==void 0)e.stdBindings.set(l,"fn"),e.stdFns.add(l);else throw new Error(`wfjs: \u6A21\u5757 '${n.from}' \u65E0\u5BFC\u51FA '${o}'`)}e.imports.push({from:n.from,names:n.names});return}if(!n.from.startsWith("https://"))throw new Error(`wfjs: \u6A21\u5757 '${n.from}' \u4E0D\u5408\u6CD5\uFF08wf://std/* \u6216 https://\u2026\uFF09`);e.imports.push({from:n.from,names:n.names});return}case"var":{let{name:s}=n;if(xt.has(s))throw new Error(`wfjs: \u53D8\u91CF\u540D '${s}' \u4E0E\u5185\u7F6E\u51FD\u6570\u51B2\u7A81`);let i=O_(e,s,`\u58F0\u660E ${s}`);if(n.init&&P_(n.init)){let o=n.init;if(!xt.has(o.name)&&!o.name.startsWith("@")){if(e.functions.some(a=>a.name===o.name)){e.steps.push({id:i,type:"call",config:{name:o.name,args:Fp(o.args,e)}}),e.bindings.set(s,{kind:"step",id:i}),n.isConst&&e.consts.add(i);return}throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${o.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u9700\u5148\u58F0\u660E\uFF09`)}if(e.inFunction)throw new Error(`wfjs: \u51FD\u6570\u4F53\u5185\u4E0D\u652F\u6301\u526F\u4F5C\u7528\u5185\u7F6E\uFF08${o.name}\uFF09\u2014\u2014\u51FD\u6570\u662F\u7EAF\u903B\u8F91\uFF08v1 \u88C1\u526A\uFF09`);Vp(o,i,e),e.bindings.set(s,{kind:"step",id:i})}else{let o=n.init?Io(n.init,e,`\u58F0\u660E ${s}`,"expr"):"null";e.steps.push({id:i,type:"assign",config:{target:i,value:o}}),e.bindings.set(s,{kind:"var",name:i})}n.isConst&&e.consts.add(i);return}case"assign":{let s=e.bindings.get(n.target);if(!s)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${n.target}'`);let i=s.kind==="var"?s.name:s.kind==="step"?s.id:n.target;if(e.consts.has(i))throw new Error(`wfjs: \u4E0D\u80FD\u7ED9 const '${n.target}' \u8D4B\u503C`);let o=ht(n.value,e.bindings,e,`\u8D4B\u503C ${n.target}`),a=n.op==="="?o:`(vars.${i} ${n.op[0]} ${o})`;e.steps.push({id:r(),type:"assign",config:{target:i,value:a}});return}case"incdec":{let s=e.bindings.get(n.target);if(!s)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${n.target}'`);let i=s.kind==="var"?s.name:s.kind==="step"?s.id:n.target;if(e.consts.has(i))throw new Error(`wfjs: \u4E0D\u80FD\u7ED9 const '${n.target}' \u8D4B\u503C`);e.steps.push({id:r(),type:"assign",config:{target:i,value:`(vars.${i} ${n.inc?"+":"-"} 1)`}});return}case"if":{let s=ht(n.cond,e.bindings,e,"if \u6761\u4EF6"),i=[];zt(n.then,Rn(e,i),t);let o={when:s};if(n.once&&(o.edge=!0),i.length&&(o.then={steps:i}),n.else){let a=[];zt(n.else,Rn(e,a),t),a.length&&(o.else={steps:a})}e.steps.push({id:r(),type:"if",config:o});return}case"try":{let s=[];zt(n.body,Rn(e,s),t);let i=[];zt(n.catchBody,Rn(e,i),t);let o={step:{steps:s},catch:{steps:i}};e.steps.push({id:r(),type:"try",config:o});return}case"while":{let s=ht(n.cond,e.bindings,e,"while \u6761\u4EF6"),i=[];zt(n.body,Rn(e,i),!0),e.steps.push({id:r(),type:"while",config:{when:s,step:{steps:i}}});return}case"forof":{let s=ht(n.items,e.bindings,e,"for-of"),i=Rn(e,[]);i.bindings.set(n.varName,{kind:"loop"}),i.scopes[i.scopes.length-1].names.add(n.varName);let o=[];zt(n.body,Rn(i,o),!0),e.steps.push({id:r(),type:"for",config:{items:s,step:{steps:o}}});return}case"return":{let s=n.value?Io(n.value,e,"return","expr"):void 0;e.steps.push({id:r(),type:"return",config:s!==void 0?{value:s}:{}});return}case"call":{if(!xt.has(n.call.name)&&!n.call.name.startsWith("@")){if(!e.functions.some(s=>s.name===n.call.name))throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${n.call.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u9700\u5148\u58F0\u660E\uFF09`);e.steps.push({id:r(),type:"call",config:{name:n.call.name,args:Fp(n.call.args,e)}});return}if(e.inFunction)throw new Error(`wfjs: \u51FD\u6570\u4F53\u5185\u4E0D\u652F\u6301\u526F\u4F5C\u7528\u5185\u7F6E\uFF08${n.call.name}\uFF09\u2014\u2014\u51FD\u6570\u662F\u7EAF\u903B\u8F91\uFF08v1 \u88C1\u526A\uFF09`);Vp(n.call,null,e);return}}}function Fp(n,e){return n.map(t=>{if(t.key!==null)throw new Error("wfjs: \u51FD\u6570\u8C03\u7528\u4E0D\u652F\u6301\u547D\u540D\u53C2\u6570");let r=t.value;if(r.t==="expr")return ht(r.src,e.bindings,e,"\u51FD\u6570\u53C2\u6570");if(r.t==="str")return`'${r.v.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`;if(r.t==="num")return String(r.v);if(r.t==="tpl"){let s="`";for(let i of r.parts)typeof i=="string"?s+=i:s+="${"+ht(i.expr,e.bindings,e,"\u51FD\u6570\u53C2\u6570\u6A21\u677F")+"}";return s+"`"}throw new Error("wfjs: \u51FD\u6570\u53C2\u6570\u503C\u4E0D\u5408\u6CD5")})}function P_(n){return typeof n.name=="string"&&Array.isArray(n.args)}function zt(n,e,t){for(let r of n)I_(r,e,t)}function Vp(n,e,t){if(n.name==="@store.get"||n.name==="@store.set"){let i=n.name.slice(1),o=i.endsWith(".get")?"get":"set";if(!t.stdBindings.has("store")||t.stdBindings.get("store")!=="store")throw new Error("wfjs: \u4F7F\u7528 store \u524D\u9700\u5BFC\u5165\uFF1Aimport { store } from 'wf://std/store'");if(n.args.length!==(o==="get"?1:2))throw new Error(`wfjs: ${i}() \u53C2\u6570\u6570\u91CF\u9519\u8BEF\uFF08${o==="get"?"key":"key, value"}\uFF09\uFF0C\u6536\u5230 ${n.args.length}`);let a={op:o,key:Ol(n.args[0],"store",t)};o==="set"&&(a.value=Ol(n.args[1],"store",t)),t.steps.push({id:e??Nl(t,`_store${o}`),type:"store",config:a});return}if(!xt.has(n.name))throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${n.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u8C03\u7528\u5728 W8 wave\uFF09`);let r=e??Nl(t,`_${n.name}`),s={};for(let i of n.args)s[i.key]=Ol(i,n.name,t);t.steps.push({id:r,type:n.name==="stop"?"return":n.name,config:s})}function N_(n,e){let t=e;if(!t||typeof t!="object"||!Array.isArray(t.functions))throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${n}' \u683C\u5F0F\u4E0D\u5408\u6CD5\uFF08\u671F\u671B { functions: [...] }\u2014\u2014\u767D\u540D\u5355\uFF09`);for(let[r,s]of t.functions.entries()){let i=s;if(typeof i.name!="string"||!Array.isArray(i.params)||typeof i.step!="object")throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${n}' functions[${r}] \u7F3A\u5B57\u6BB5\uFF08name/params/step\uFF09`)}return{functions:t.functions}}async function $l(n,e){let r=new Il(T_(n),n).parseProgram(),s={bindings:new Map,consts:new Set,steps:[],imports:[],stdBindings:new Map,stdFns:new Set,scopes:[{names:new Set}],hideCount:0,functions:[],inFunction:!1,autoPrefix:"",exports:{named:[]},remoteImports:[]};for(let o of r)if(o.k==="function"){if(xt.has(o.name))throw new Error(`wfjs: \u51FD\u6570\u540D '${o.name}' \u4E0E\u5185\u7F6E\u51B2\u7A81`);if(s.functions.some(a=>a.name===o.name))throw new Error(`wfjs: \u91CD\u590D\u51FD\u6570 '${o.name}'`);s.functions.push({name:o.name,params:o.params,step:{steps:[]}})}for(let o of r)o.k==="import"&&!o.from.startsWith("wf://std/")&&s.remoteImports.push({from:o.from,names:o.names});for(let o of s.remoteImports){if(!e?.remoteFetch)throw new Error(`wfjs: \u8FDC\u7A0B\u5BFC\u5165 '${o.from}' \u9700\u8981 compileWfjs({ remoteFetch })`);let a=await e.remoteFetch(o.from),l=N_(o.from,a);for(let{name:u,as:c}of o.names){let d=c??u,p=l.functions.find(m=>m.name===u);if(!p)throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${o.from}' \u65E0\u5BFC\u51FA\u51FD\u6570 '${u}'`);if(s.functions.some(m=>m.name===d))throw new Error(`wfjs: \u51FD\u6570\u540D '${d}' \u51B2\u7A81\uFF08\u8FDC\u7A0B\u5BFC\u5165\uFF09`);s.functions.push({...p,name:d})}}zt(r,s,!1);let i={steps:s.steps};return s.imports.length&&(i.imports=s.imports),s.functions.length&&(i.functions=s.functions),(s.exports.named.length||s.exports.default)&&(i.exports=s.exports),i}var k_,S_,x_,Hp,R_,E_,Il,xt,A_,Ml,ql=N(()=>{"use strict";Ao();kn();k_=new Set(["const","let","var","if","else","while","for","of","return","function","import","export","from","as","default","await","async","once","true","false","null","try","catch","finally"]),S_=new Set(["{","}","(",")","[","]",";",",",":","."]),x_=new Set(["+","-","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||"]),Hp=n=>x_.has(n),R_=new Set(["==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","++","--"]),E_=new Set(["=","+","-","*","/","%","<",">","!","?"]);Il=class{i=0;tokens;src;constructor(e,t){this.tokens=e,this.src=t}peek(){return this.tokens[this.i]}next(){return this.tokens[this.i++]}fail(e,t){throw new Error(`${e} at ${t} (in ${JSON.stringify(this.src)})`)}expect(e){let t=this.next();return t.v!==e&&this.fail(`wfjs: expected '${e}'`,t.pos),t}isPunc(e){let t=this.peek();return t.t==="punc"&&t.v===e}isKw(e){let t=this.peek();return t.t==="kw"&&t.v===e}parseProgram(){let e=[];for(;this.peek().t!=="eof";){if(this.isPunc(";")){this.next();continue}e.push(this.parseStmt()),this.isPunc(";")&&this.next()}return e}parseStmt(){if(this.peek().t==="kw"){let e=this.peek().v;if(e==="const"||e==="let"||e==="var")return this.parseVar();if(e==="if")return this.parseIf();if(e==="try")return this.parseTry();if(e==="while")return this.parseWhile();if(e==="for")return this.parseFor();if(e==="return")return this.parseReturn();if(e==="async")return this.next(),this.parseStmt();if(e==="await")return this.next(),this.parseStmt();if(e==="import")return this.parseImport();if(e==="function")return this.parseFunction();if(e==="export")return this.parseExport()}if(this.peek().t==="ident")return this.parseAssignOrCall();this.fail(`wfjs: unexpected '${this.peek().t==="eof"?"(end)":String(this.peek().v)}'`,this.peek().pos)}parseTry(){this.expect("try"),this.expect("{");let e=this.parseBlockBody();this.isKw("catch")||this.fail("wfjs: try \u5FC5\u987B\u914D catch\uFF08v0 \u65E0 finally\uFF09\u2014\u2014\u671F\u671B catch",this.peek().pos),this.next(),this.peek().t==="punc"&&this.peek().v==="("&&this.fail("wfjs: catch \u7ED1\u5B9A\u53D8\u91CF\u6682\u4E0D\u652F\u6301\uFF08ES2019 \u53EF\u9009\u7ED1\u5B9A\u8BED\u4E49\uFF09\u2014\u2014\u9519\u8BEF\u4ECE steps.<tryId>.error \u8BFB\u53D6",this.peek().pos),this.expect("{");let t=this.parseBlockBody();return{k:"try",body:e,catchBody:t}}parseBlockBody(){let e=[];for(;!this.isPunc("}");){if(this.peek().t==="eof"&&this.fail("wfjs: unclosed block",this.peek().pos),this.isPunc(";")){this.next();continue}e.push(this.parseStmt()),this.isPunc(";")&&this.next()}return this.next(),e}parseExport(){if(this.next(),this.isKw("default")){this.next();let t=this.next();return t.t!=="ident"&&this.fail("wfjs: export default \u540E\u5FC5\u987B\u662F\u51FD\u6570\u540D",t.pos),{k:"export",named:[],default:String(t.v)}}this.expect("{");let e=[];for(;!this.isPunc("}");){let t=this.next();t.t!=="ident"&&this.fail("wfjs: export \u6210\u5458\u540D\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",t.pos);let r=t.v;if(this.isKw("as")){this.next();let s=this.next();s.t!=="ident"&&this.fail("wfjs: as \u540E\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",s.pos),r=s.v}if(r!==t.v?e.push({name:t.v,as:r}):e.push({name:t.v}),this.isPunc(",")){this.next();continue}}return this.next(),{k:"export",named:e,default:void 0}}parseFunction(){this.next();let e=this.next();e.t!=="ident"&&this.fail("wfjs: function \u540E\u5FC5\u987B\u662F\u51FD\u6570\u540D",e.pos),this.expect("(");let t=[];if(!this.isPunc(")"))for(;;){let s=this.next();if(s.t!=="ident"&&this.fail("wfjs: \u53C2\u6570\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",s.pos),t.push(String(s.v)),this.isPunc(",")){this.next();continue}break}this.expect(")"),this.expect("{");let r=this.parseBlockBody();return{k:"function",name:String(e.v),params:t,body:r}}parseImport(){this.next(),this.isPunc("{")||this.fail("wfjs: import \u4EC5\u652F\u6301\u547D\u540D\u5BFC\u5165\uFF08{ ... }\uFF09\u2014\u2014\u9ED8\u8BA4/\u547D\u540D\u7A7A\u95F4\u5BFC\u5165 W8",this.peek().pos),this.next();let e=[];for(;!this.isPunc("}");){let r=this.next();r.t!=="ident"&&this.fail("wfjs: import \u6210\u5458\u540D\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",r.pos);let s=r.v;if(this.isKw("as")){this.next();let i=this.next();i.t!=="ident"&&this.fail("wfjs: as \u540E\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",i.pos),s=i.v}if(s!==r.v?e.push({name:r.v,as:s}):e.push({name:r.v}),this.isPunc(",")){this.next();continue}}this.next(),this.expect("from");let t=this.next();return t.t!=="str"&&this.fail("wfjs: import \u6765\u6E90\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",t.pos),{k:"import",names:e,from:String(t.v)}}tryParseMethodCall(){let e=this.peek(),t=this.tokens[this.i+1],r=this.tokens[this.i+2],s=this.tokens[this.i+3];if(e.t!=="ident"||t?.t!=="punc"||t.v!=="."||r?.t!=="ident"||s?.t!=="punc"||s.v!=="(")return null;let i=String(e.v),o=String(r.v);this.next(),this.next(),this.next(),this.next();let a=[];if(!this.isPunc(")"))for(;;){if(a.push({key:null,value:this.parseValue()}),this.isPunc(",")){this.next();continue}break}return this.expect(")"),{name:`@${i}.${o}`,args:a}}parseVar(){let e=this.next();e.t==="kw"&&e.v==="var"&&this.fail("wfjs: 'var' \u4E0D\u652F\u6301\uFF08\u51FD\u6570\u4F5C\u7528\u57DF\u8BED\u4E49\u6613\u6DF7\u6DC6\uFF09\u2014\u2014\u8BF7\u7528 let/const",e.pos);let t=this.next();t.t!=="ident"&&this.fail(`wfjs: expected variable name after '${e.v}'`,t.pos);let r=null;return this.peek().t==="op"&&this.peek().v==="="&&(this.next(),r=this.parseValueOrCall()),{k:"var",name:t.v,init:r,isConst:e.v==="const"}}parseValueOrCall(){let e=!1;this.peek().t==="kw"&&this.peek().v==="await"&&(this.next(),e=!0);let t=this.tryParseMethodCall();if(t)return t;let r=this.peek(),s=this.tokens[this.i+1];if(e&&r.t==="ident"&&s?.t==="punc"&&s.v==="("){let i=String(this.next().v);if(this.next(),xt.has(i))return{name:i,args:this.parseCallArgs()};let o=[];if(!this.isPunc(")"))for(;;){if(o.push({key:null,value:this.parseValue()}),this.isPunc(",")){this.next();continue}break}return this.expect(")"),{name:i,args:o}}if(r.t==="ident"&&s?.t==="punc"&&s.v==="("){let i=this.tokens[this.i+2];i?.t==="punc"&&i.v==="{"&&this.fail(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${String(r.v)}'\uFF08\u4EC5\u5185\u7F6E\u6216 std \u7EAF\u51FD\u6570\u2014\u2014\u51FD\u6570\u5B9A\u4E49 W8\uFF09`,r.pos)}return this.parseValue()}parseCallArgs(){if(this.isPunc(")"))return this.next(),[];if(this.isPunc("{")){let e=this.parseObjectArgs();return this.expect(")"),e}return this.fail("wfjs: \u5185\u7F6E\u8C03\u7528\u9700\u5BF9\u8C61\u53C2\u6570\uFF08{ key: value }\uFF09\u2014\u2014\u4F4D\u7F6E\u53C2\u6570\u4EC5\u9650 W8 \u51FD\u6570\u8C03\u7528",this.peek().pos),[]}parseObjectArgs(){this.expect("{");let e=[];for(;!this.isPunc("}");){let t=this.next();if(t.t!=="ident"&&t.t!=="str"&&this.fail("wfjs: expected argument key in object literal",t.pos),this.expect(":"),e.push({key:String(t.v),value:this.parseValue()}),this.isPunc(","))this.next();else break}return this.expect("}"),e}parseValue(){let e=this.peek();if(e.t==="template"||e.t==="str"||e.t==="num"){let t=this.tokens[this.i+1];return t&&t.t==="op"&&Hp(t.v)?{t:"expr",src:this.scanExpr()}:e.t==="template"?(this.next(),{t:"tpl",parts:C_(e.raw)}):e.t==="str"?(this.next(),{t:"str",v:e.v}):(this.next(),{t:"num",v:e.v})}if(e.t==="kw"&&(e.v==="true"||e.v==="false"||e.v==="null")){let t=this.tokens[this.i+1];return t&&t.t==="op"&&Hp(t.v)?{t:"expr",src:this.scanExpr()}:(this.next(),{t:"expr",src:e.v})}if(e.t==="punc"&&e.v==="{"){this.next();let t=[];for(;!this.isPunc("}");){let r=this.next();if(r.t!=="ident"&&r.t!=="str"&&this.fail("wfjs: expected object key",r.pos),this.expect(":"),t.push({key:String(r.v),value:this.parseValue()}),this.isPunc(","))this.next();else break}return this.expect("}"),{t:"obj",kvs:t}}return{t:"expr",src:this.scanExpr()}}scanExpr(){let e=this.peek().pos,t="",r=0,s=-1;for(;;){let o=this.peek();if(o.t==="eof"||r===0&&(o.t==="punc"&&(o.v===","||o.v===";"||o.v===")"||o.v==="}")||o.t==="op"&&(o.v==="="||o.v==="+="||o.v==="-="||o.v==="*="||o.v==="/="||o.v==="%=")||s>=0&&this.src.slice(s,o.pos).includes(`
76
- `)))break;if(o.t==="punc"&&(o.v==="("||o.v==="[")&&r++,o.t==="punc"&&(o.v===")"||o.v==="]")){if(r===0)break;r--}t+=this.src.slice(o.pos,o.end),s=o.end,this.next()}let i=t.trim();return i||this.fail("wfjs: expected expression",e),i}parseIf(){this.expect("if");let e=!1;this.isKw("once")&&(this.next(),e=!0),this.expect("(");let t=this.scanExpr();this.expect(")"),this.expect("{");let r=this.parseBlockBody(),s=null;return this.isKw("else")&&(this.next(),this.isPunc("{")?(this.next(),s=this.parseBlockBody()):s=[this.parseStmt()]),{k:"if",cond:t,then:r,else:s,once:e}}parseWhile(){this.expect("while"),this.expect("(");let e=this.scanExpr();this.expect(")"),this.expect("{");let t=this.parseBlockBody();return{k:"while",cond:e,body:t}}parseFor(){this.expect("for"),this.expect("(");let e=this.next();(e.t!=="kw"||!["const","let","var"].includes(e.v))&&this.fail("wfjs: for-of \u9700\u8981 const/let",e.pos);let t=this.next();t.t!=="ident"&&this.fail("wfjs: expected loop variable",t.pos);let r=this.next();(r.t!=="kw"||r.v!=="of")&&this.fail("wfjs: only for...of supported",r.pos);let s=this.scanExpr();this.expect(")"),this.expect("{");let i=this.parseBlockBody();return{k:"forof",varName:t.v,items:s,body:i}}parseReturn(){let e=this.next(),t=this.peek();return this.isPunc(";")||this.isPunc("}")?{k:"return",value:null}:t.t==="eof"?{k:"return",value:null}:this.src.slice(e.end,t.pos).includes(`
77
- `)?{k:"return",value:null}:{k:"return",value:this.parseValue()}}parseAssignOrCall(){let e=this.tryParseMethodCall();if(e)return{k:"call",call:e};let t=this.next();t.t!=="ident"&&this.fail("wfjs: expected identifier",t.pos);let r=this.peek();if(r.t==="punc"&&r.v==="(")return this.next(),{k:"call",call:{name:t.v,args:this.parseCallArgs()}};if(r.t==="op"&&["=","+=","-=","*=","/=","%="].includes(r.v)){let s=r.v;return this.next(),{k:"assign",target:t.v,op:s,value:this.scanExpr()}}if(r.t==="op"&&(r.v==="++"||r.v==="--"))return this.next(),{k:"incdec",target:t.v,inc:r.v==="++"};this.fail(`wfjs: expected assignment or call after '${t.v}'`,r.pos)}};xt=new Set(["http","email","ai","template","log","stop"]);A_=new Set(["http","email","ai","template","log"]);Ml={http:{url:"template",method:"template",body:"template",headers:"template",timeoutMs:"template"},email:{to:"template",subject:"template",body:"template"},ai:{prompt:"template",system:"template"},template:{template:"template"},log:{message:"template"},stop:{},store:{key:"expr",value:"expr"}}});function or(n){let e=q_(n.imports??[]),t=$_(n.functions??[]),r=Kt(n.steps,{seenVars:new Set,loopNames:[],inReturn:!1}).trimEnd(),s=M_(n.exports);return[e,t,r,s].filter(Boolean).join(`
75
+ `,u+=2;continue}if(d==="t"){c+=" ",u+=2;continue}c+=d??"",u+=2;continue}c+=n[u],u++}if(u>=r)throw new Error(`wfjs: unterminated string at ${t}`);e.push({t:"str",v:c,pos:t,end:u+1}),t=u+1;continue}let o=n.slice(t,t+3);if(o==="==="||o==="!=="){e.push({t:"op",v:o,pos:t,end:t+3}),t+=3;continue}let i=n.slice(t,t+2);if(x_.has(i)){e.push({t:"op",v:i,pos:t,end:t+2}),t+=2;continue}if(R_.has(s)){e.push({t:"op",v:s,pos:t,end:t+1}),t++;continue}if(k_.has(s)){e.push({t:"punc",v:s,pos:t,end:t+1}),t++;continue}if(s>="0"&&s<="9"){let l=/[0-9]+(?:\.[0-9]+)?/.exec(n.slice(t));e.push({t:"num",v:Number(l[0]),pos:t,end:t+l[0].length}),t+=l[0].length;continue}let a=/[A-Za-z_$][A-Za-z0-9_$]*/.exec(n.slice(t));if(a){e.push(v_.has(a[0])?{t:"kw",v:a[0],pos:t,end:t+a[0].length}:{t:"ident",v:a[0],pos:t,end:t+a[0].length}),t+=a[0].length;continue}throw new Error(`wfjs: unexpected character '${s}' at ${t} (in ${JSON.stringify(n)})`)}return e.push({t:"eof",v:"",pos:r,end:r}),e}function T_(n){let e=[],t=0,r="";for(;t<n.length;){if(n[t]==="$"&&n[t+1]==="{"){let s=1,o=t+2,i="";for(;o<n.length&&s>0;){if(n[o]==="\\"){i+=n[o]+(n[o+1]??""),o+=2;continue}n[o]==="{"&&s++,n[o]==="}"&&s--,s>0&&(i+=n[o]),o++}if(s!==0)throw new Error("wfjs: unclosed '${' in template");r&&(e.push(r),r=""),e.push({expr:i.trim()}),t=o;continue}r+=n[t],t++}return r&&e.push(r),e}function $l(n,e,t){let r=n;if(!(!r||typeof r!="object")){if(r.kind==="call"){let s=r.name??"";if(C_.has(s))throw new Error(`wfjs: \u526F\u4F5C\u7528\u51FD\u6570 '${s}()' \u4E0D\u80FD\u51FA\u73B0\u5728\u8868\u8FBE\u5F0F\u5185\uFF08in ${t}\uFF09\u2014\u2014\u9700\u8BED\u53E5\u7EA7\u8C03\u7528`);if(!e.stdFns.has(s))throw new Error(`wfjs: \u8868\u8FBE\u5F0F\u5185\u672A\u5BFC\u5165\u51FD\u6570 '${s}()'\uFF08in ${t}\uFF09\u2014\u2014std \u51FD\u6570\u9700 import \u540E\u53EF\u7528`)}for(let s of["left","right","operand","cond","then","else"])r[s]&&typeof r[s]=="object"&&$l(r[s],e,t);if(r.args)for(let s of r.args)$l(s,e,t)}}function ht(n,e,t,r){let s=St(n);return $l(s,t,r),sr(s,o=>{let i=o.segments[0];if(typeof i!="string")return;let a=e.get(i);if(!a&&(i==="input"||i==="steps"||i==="vars"||i==="loop"))return;if(!a)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${i}'\uFF08in ${r}: ${n}\uFF09`);let l=a.kind==="step"?["steps",a.id,"data"]:a.kind==="var"?["vars",a.name]:["loop","item"];o.segments=[...l,...o.segments.slice(1)]}),Re(s)}function sr(n,e){let t=n;if(!(!t||typeof t!="object")){if(t.kind==="path"&&e(t),t.kind==="ternary"){sr(t.cond,e),sr(t.then,e),sr(t.else,e);return}if(t.kind==="call"){for(let r of t.args)sr(r,e);return}for(let r of[["left","right"],["operand"]])for(let s of r)t[s]&&typeof t[s]=="object"&&sr(t[s],e)}}function ql(n,e){for(let t=1;;t++){let r=`${e}${t}`;if(!n.bindings.has(r)&&!n.steps.some(s=>s.id===r))return r}}function No(n,e,t,r){switch(n.t){case"str":return r==="expr"?`'${n.v.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`:n.v;case"num":return String(n.v);case"expr":return r==="template"?`{{${ht(n.src,e.bindings,e,t)}}}`:ht(n.src,e.bindings,e,t);case"tpl":{if(r==="expr")throw new Error(`wfjs: \u8868\u8FBE\u5F0F\u5B57\u6BB5\u4E0D\u652F\u6301\u6A21\u677F\u4E32\uFF08in ${t}\uFF09`);let s="";for(let o of n.parts)typeof o=="string"?s+=o:s+=`{{${ht(o.expr,e.bindings,e,t)}}}`;return s}case"obj":{let s={};for(let o of n.kvs)s[o.key]=No(o.value,e,t,r);return s}}}function Nl(n,e,t){if(n.key===null){let s=n.value;if(s.t==="expr")return`{{${ht(s.src,t.bindings,t,"store \u53C2\u6570")}}}`;if(s.t==="str")return s.v;if(s.t==="num")return String(s.v);throw new Error("wfjs: store \u53C2\u6570\u5FC5\u987B\u662F\u8868\u8FBE\u5F0F\u6216\u5B57\u9762\u91CF")}let r=Dl[e]?.[n.key]??"template";return No(n.value,t,`${e}(${n.key})`,r)}function Rn(n,e){return{bindings:new Map(n.bindings),consts:new Set(n.consts),steps:e,imports:n.imports,stdBindings:n.stdBindings,stdFns:n.stdFns,scopes:[...n.scopes,{names:new Set}],hideCount:n.hideCount,functions:n.functions,inFunction:n.inFunction,autoPrefix:n.autoPrefix,exports:n.exports,remoteImports:n.remoteImports}}function A_(n,e,t){let r=n.scopes[n.scopes.length-1];if(r.names.has(e))throw new Error(`wfjs: \u91CD\u590D\u58F0\u660E '${e}'\uFF08${t}\uFF09`);let s=n.scopes.slice(0,-1).some(i=>i.names.has(e)),o=e;if(s){let i=new Set;for(let a of n.bindings.values())a.kind==="var"?i.add(a.name):a.kind==="step"&&i.add(a.id);do n.hideCount++,o=`${e}$${n.hideCount}`;while(i.has(o))}return r.names.add(e),o}function O_(n,e,t){let r=()=>ql(e,`${e.autoPrefix}_${n.k}`);switch(n.k){case"export":{let s=e.functions,o=i=>{if(!s.some(a=>a.name===i))throw new Error(`wfjs: \u5BFC\u51FA '${i}' \u5FC5\u987B\u662F\u5DF2\u5B9A\u4E49\u51FD\u6570\uFF08v1 \u51FD\u6570\u5BFC\u51FA\u2014\u2014\u53D8\u91CF\u5BFC\u51FA v2\uFF09`)};if(n.named.forEach(i=>o(i.name)),n.default&&o(n.default),n.named.length===0&&!n.default)throw new Error("wfjs: export \u5FC5\u987B\u81F3\u5C11\u5BFC\u51FA\u4E00\u4E2A\u6210\u5458");e.exports.named.push(...n.named),n.default&&(e.exports.default=n.default);return}case"function":{if(e.inFunction)throw new Error(`wfjs: \u4E0D\u652F\u6301\u5D4C\u5957\u51FD\u6570\uFF08\u51FD\u6570 '${n.name}'\uFF09`);let s=e.functions.find(u=>u.name===n.name);if(!s)throw new Error(`wfjs: \u5185\u90E8\u9519\u8BEF\uFF1A\u51FD\u6570 '${n.name}' \u672A\u9884\u6CE8\u518C`);let o=new Map,i=new Set,a=[...e.scopes,{names:i}];for(let u of n.params){if(i.has(u))throw new Error(`wfjs: \u91CD\u590D\u53C2\u6570 '${u}'`);i.add(u),o.set(u,{kind:"var",name:u})}for(let[u,c]of e.bindings)c.kind==="var"&&!i.has(u)&&o.set(u,c);let l={bindings:o,consts:new Set,steps:[],imports:e.imports,stdBindings:e.stdBindings,stdFns:e.stdFns,scopes:a,hideCount:e.hideCount,functions:e.functions,inFunction:!0,autoPrefix:`_fn:${n.name}:`,exports:e.exports,remoteImports:e.remoteImports};zt(n.body,l,!1),s.step={steps:l.steps};return}case"import":{if(n.from.startsWith("wf://std/")){let o=xl[n.from]??(n.from==="wf://std/store"?{store:null}:void 0);if(!o)throw new Error(`wfjs: std \u6A21\u5757 '${n.from}' \u672A\u6CE8\u518C\uFF08${Object.keys(xl).join(" / ")} \u4E0E wf://std/store\uFF09`);for(let{name:i,as:a}of n.names){let l=a??i;if(i==="store"&&n.from==="wf://std/store")e.stdBindings.set(l,"store");else if(o[i]!==void 0)e.stdBindings.set(l,"fn"),e.stdFns.add(l);else throw new Error(`wfjs: \u6A21\u5757 '${n.from}' \u65E0\u5BFC\u51FA '${i}'`)}e.imports.push({from:n.from,names:n.names});return}if(!n.from.startsWith("https://"))throw new Error(`wfjs: \u6A21\u5757 '${n.from}' \u4E0D\u5408\u6CD5\uFF08wf://std/* \u6216 https://\u2026\uFF09`);e.imports.push({from:n.from,names:n.names});return}case"var":{let{name:s}=n;if(xt.has(s))throw new Error(`wfjs: \u53D8\u91CF\u540D '${s}' \u4E0E\u5185\u7F6E\u51FD\u6570\u51B2\u7A81`);let o=A_(e,s,`\u58F0\u660E ${s}`);if(n.init&&I_(n.init)){let i=n.init;if(!xt.has(i.name)&&!i.name.startsWith("@")){if(e.functions.some(a=>a.name===i.name)){e.steps.push({id:o,type:"call",config:{name:i.name,args:zp(i.args,e)}}),e.bindings.set(s,{kind:"step",id:o}),n.isConst&&e.consts.add(o);return}throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${i.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u9700\u5148\u58F0\u660E\uFF09`)}if(e.inFunction)throw new Error(`wfjs: \u51FD\u6570\u4F53\u5185\u4E0D\u652F\u6301\u526F\u4F5C\u7528\u5185\u7F6E\uFF08${i.name}\uFF09\u2014\u2014\u51FD\u6570\u662F\u7EAF\u903B\u8F91\uFF08v1 \u88C1\u526A\uFF09`);Kp(i,o,e),e.bindings.set(s,{kind:"step",id:o})}else{let i=n.init?No(n.init,e,`\u58F0\u660E ${s}`,"expr"):"null";e.steps.push({id:o,type:"assign",config:{target:o,value:i}}),e.bindings.set(s,{kind:"var",name:o})}n.isConst&&e.consts.add(o);return}case"assign":{let s=e.bindings.get(n.target);if(!s)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${n.target}'`);let o=s.kind==="var"?s.name:s.kind==="step"?s.id:n.target;if(e.consts.has(o))throw new Error(`wfjs: \u4E0D\u80FD\u7ED9 const '${n.target}' \u8D4B\u503C`);let i=ht(n.value,e.bindings,e,`\u8D4B\u503C ${n.target}`),a=n.op==="="?i:`(vars.${o} ${n.op[0]} ${i})`;e.steps.push({id:r(),type:"assign",config:{target:o,value:a}});return}case"incdec":{let s=e.bindings.get(n.target);if(!s)throw new Error(`wfjs: \u672A\u58F0\u660E\u53D8\u91CF '${n.target}'`);let o=s.kind==="var"?s.name:s.kind==="step"?s.id:n.target;if(e.consts.has(o))throw new Error(`wfjs: \u4E0D\u80FD\u7ED9 const '${n.target}' \u8D4B\u503C`);e.steps.push({id:r(),type:"assign",config:{target:o,value:`(vars.${o} ${n.inc?"+":"-"} 1)`}});return}case"if":{let s=ht(n.cond,e.bindings,e,"if \u6761\u4EF6"),o=[];zt(n.then,Rn(e,o),t);let i={when:s};if(n.once&&(i.edge=!0),o.length&&(i.then={steps:o}),n.else){let a=[];zt(n.else,Rn(e,a),t),a.length&&(i.else={steps:a})}e.steps.push({id:r(),type:"if",config:i});return}case"try":{let s=[];zt(n.body,Rn(e,s),t);let o=[];zt(n.catchBody,Rn(e,o),t);let i={step:{steps:s},catch:{steps:o}};e.steps.push({id:r(),type:"try",config:i});return}case"while":{let s=ht(n.cond,e.bindings,e,"while \u6761\u4EF6"),o=[];zt(n.body,Rn(e,o),!0),e.steps.push({id:r(),type:"while",config:{when:s,step:{steps:o}}});return}case"forof":{let s=ht(n.items,e.bindings,e,"for-of"),o=Rn(e,[]);o.bindings.set(n.varName,{kind:"loop"}),o.scopes[o.scopes.length-1].names.add(n.varName);let i=[];zt(n.body,Rn(o,i),!0),e.steps.push({id:r(),type:"for",config:{items:s,step:{steps:i}}});return}case"return":{let s=n.value?No(n.value,e,"return","expr"):void 0;e.steps.push({id:r(),type:"return",config:s!==void 0?{value:s}:{}});return}case"call":{if(!xt.has(n.call.name)&&!n.call.name.startsWith("@")){if(!e.functions.some(s=>s.name===n.call.name))throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${n.call.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u9700\u5148\u58F0\u660E\uFF09`);e.steps.push({id:r(),type:"call",config:{name:n.call.name,args:zp(n.call.args,e)}});return}if(e.inFunction)throw new Error(`wfjs: \u51FD\u6570\u4F53\u5185\u4E0D\u652F\u6301\u526F\u4F5C\u7528\u5185\u7F6E\uFF08${n.call.name}\uFF09\u2014\u2014\u51FD\u6570\u662F\u7EAF\u903B\u8F91\uFF08v1 \u88C1\u526A\uFF09`);Kp(n.call,null,e);return}}}function zp(n,e){return n.map(t=>{if(t.key!==null)throw new Error("wfjs: \u51FD\u6570\u8C03\u7528\u4E0D\u652F\u6301\u547D\u540D\u53C2\u6570");let r=t.value;if(r.t==="expr")return ht(r.src,e.bindings,e,"\u51FD\u6570\u53C2\u6570");if(r.t==="str")return`'${r.v.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`;if(r.t==="num")return String(r.v);if(r.t==="tpl"){let s="`";for(let o of r.parts)typeof o=="string"?s+=o:s+="${"+ht(o.expr,e.bindings,e,"\u51FD\u6570\u53C2\u6570\u6A21\u677F")+"}";return s+"`"}throw new Error("wfjs: \u51FD\u6570\u53C2\u6570\u503C\u4E0D\u5408\u6CD5")})}function I_(n){return typeof n.name=="string"&&Array.isArray(n.args)}function zt(n,e,t){for(let r of n)O_(r,e,t)}function Kp(n,e,t){if(n.name==="@store.get"||n.name==="@store.set"){let o=n.name.slice(1),i=o.endsWith(".get")?"get":"set";if(!t.stdBindings.has("store")||t.stdBindings.get("store")!=="store")throw new Error("wfjs: \u4F7F\u7528 store \u524D\u9700\u5BFC\u5165\uFF1Aimport { store } from 'wf://std/store'");if(n.args.length!==(i==="get"?1:2))throw new Error(`wfjs: ${o}() \u53C2\u6570\u6570\u91CF\u9519\u8BEF\uFF08${i==="get"?"key":"key, value"}\uFF09\uFF0C\u6536\u5230 ${n.args.length}`);let a={op:i,key:Nl(n.args[0],"store",t)};i==="set"&&(a.value=Nl(n.args[1],"store",t)),t.steps.push({id:e??ql(t,`_store${i}`),type:"store",config:a});return}if(!xt.has(n.name))throw new Error(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${n.name}'\uFF08\u5185\u7F6E\uFF1A${[...xt].join("/")}\uFF1B\u51FD\u6570\u8C03\u7528\u5728 W8 wave\uFF09`);let r=e??ql(t,`_${n.name}`),s={};for(let o of n.args)s[o.key]=Nl(o,n.name,t);t.steps.push({id:r,type:n.name==="stop"?"return":n.name,config:s})}function P_(n,e){let t=e;if(!t||typeof t!="object"||!Array.isArray(t.functions))throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${n}' \u683C\u5F0F\u4E0D\u5408\u6CD5\uFF08\u671F\u671B { functions: [...] }\u2014\u2014\u767D\u540D\u5355\uFF09`);for(let[r,s]of t.functions.entries()){let o=s;if(typeof o.name!="string"||!Array.isArray(o.params)||typeof o.step!="object")throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${n}' functions[${r}] \u7F3A\u5B57\u6BB5\uFF08name/params/step\uFF09`)}return{functions:t.functions}}async function jl(n,e){let r=new Ml(E_(n),n).parseProgram(),s={bindings:new Map,consts:new Set,steps:[],imports:[],stdBindings:new Map,stdFns:new Set,scopes:[{names:new Set}],hideCount:0,functions:[],inFunction:!1,autoPrefix:"",exports:{named:[]},remoteImports:[]};for(let i of r)if(i.k==="function"){if(xt.has(i.name))throw new Error(`wfjs: \u51FD\u6570\u540D '${i.name}' \u4E0E\u5185\u7F6E\u51B2\u7A81`);if(s.functions.some(a=>a.name===i.name))throw new Error(`wfjs: \u91CD\u590D\u51FD\u6570 '${i.name}'`);s.functions.push({name:i.name,params:i.params,step:{steps:[]}})}for(let i of r)i.k==="import"&&!i.from.startsWith("wf://std/")&&s.remoteImports.push({from:i.from,names:i.names});for(let i of s.remoteImports){if(!e?.remoteFetch)throw new Error(`wfjs: \u8FDC\u7A0B\u5BFC\u5165 '${i.from}' \u9700\u8981 compileWfjs({ remoteFetch })`);let a=await e.remoteFetch(i.from),l=P_(i.from,a);for(let{name:u,as:c}of i.names){let d=c??u,p=l.functions.find(f=>f.name===u);if(!p)throw new Error(`wfjs: \u8FDC\u7A0B\u6A21\u5757 '${i.from}' \u65E0\u5BFC\u51FA\u51FD\u6570 '${u}'`);if(s.functions.some(f=>f.name===d))throw new Error(`wfjs: \u51FD\u6570\u540D '${d}' \u51B2\u7A81\uFF08\u8FDC\u7A0B\u5BFC\u5165\uFF09`);s.functions.push({...p,name:d})}}zt(r,s,!1);let o={steps:s.steps};return s.imports.length&&(o.imports=s.imports),s.functions.length&&(o.functions=s.functions),(s.exports.named.length||s.exports.default)&&(o.exports=s.exports),o}var v_,k_,S_,Vp,x_,R_,Ml,xt,C_,Dl,Ll=I(()=>{"use strict";Io();kn();v_=new Set(["const","let","var","if","else","while","for","of","return","function","import","export","from","as","default","await","async","once","true","false","null","try","catch","finally"]),k_=new Set(["{","}","(",")","[","]",";",",",":","."]),S_=new Set(["+","-","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||"]),Vp=n=>S_.has(n),x_=new Set(["==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","++","--"]),R_=new Set(["=","+","-","*","/","%","<",">","!","?"]);Ml=class{i=0;tokens;src;constructor(e,t){this.tokens=e,this.src=t}peek(){return this.tokens[this.i]}next(){return this.tokens[this.i++]}fail(e,t){throw new Error(`${e} at ${t} (in ${JSON.stringify(this.src)})`)}expect(e){let t=this.next();return t.v!==e&&this.fail(`wfjs: expected '${e}'`,t.pos),t}isPunc(e){let t=this.peek();return t.t==="punc"&&t.v===e}isKw(e){let t=this.peek();return t.t==="kw"&&t.v===e}parseProgram(){let e=[];for(;this.peek().t!=="eof";){if(this.isPunc(";")){this.next();continue}e.push(this.parseStmt()),this.isPunc(";")&&this.next()}return e}parseStmt(){if(this.peek().t==="kw"){let e=this.peek().v;if(e==="const"||e==="let"||e==="var")return this.parseVar();if(e==="if")return this.parseIf();if(e==="try")return this.parseTry();if(e==="while")return this.parseWhile();if(e==="for")return this.parseFor();if(e==="return")return this.parseReturn();if(e==="async")return this.next(),this.parseStmt();if(e==="await")return this.next(),this.parseStmt();if(e==="import")return this.parseImport();if(e==="function")return this.parseFunction();if(e==="export")return this.parseExport()}if(this.peek().t==="ident")return this.parseAssignOrCall();this.fail(`wfjs: unexpected '${this.peek().t==="eof"?"(end)":String(this.peek().v)}'`,this.peek().pos)}parseTry(){this.expect("try"),this.expect("{");let e=this.parseBlockBody();this.isKw("catch")||this.fail("wfjs: try \u5FC5\u987B\u914D catch\uFF08v0 \u65E0 finally\uFF09\u2014\u2014\u671F\u671B catch",this.peek().pos),this.next(),this.peek().t==="punc"&&this.peek().v==="("&&this.fail("wfjs: catch \u7ED1\u5B9A\u53D8\u91CF\u6682\u4E0D\u652F\u6301\uFF08ES2019 \u53EF\u9009\u7ED1\u5B9A\u8BED\u4E49\uFF09\u2014\u2014\u9519\u8BEF\u4ECE steps.<tryId>.error \u8BFB\u53D6",this.peek().pos),this.expect("{");let t=this.parseBlockBody();return{k:"try",body:e,catchBody:t}}parseBlockBody(){let e=[];for(;!this.isPunc("}");){if(this.peek().t==="eof"&&this.fail("wfjs: unclosed block",this.peek().pos),this.isPunc(";")){this.next();continue}e.push(this.parseStmt()),this.isPunc(";")&&this.next()}return this.next(),e}parseExport(){if(this.next(),this.isKw("default")){this.next();let t=this.next();return t.t!=="ident"&&this.fail("wfjs: export default \u540E\u5FC5\u987B\u662F\u51FD\u6570\u540D",t.pos),{k:"export",named:[],default:String(t.v)}}this.expect("{");let e=[];for(;!this.isPunc("}");){let t=this.next();t.t!=="ident"&&this.fail("wfjs: export \u6210\u5458\u540D\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",t.pos);let r=t.v;if(this.isKw("as")){this.next();let s=this.next();s.t!=="ident"&&this.fail("wfjs: as \u540E\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",s.pos),r=s.v}if(r!==t.v?e.push({name:t.v,as:r}):e.push({name:t.v}),this.isPunc(",")){this.next();continue}}return this.next(),{k:"export",named:e,default:void 0}}parseFunction(){this.next();let e=this.next();e.t!=="ident"&&this.fail("wfjs: function \u540E\u5FC5\u987B\u662F\u51FD\u6570\u540D",e.pos),this.expect("(");let t=[];if(!this.isPunc(")"))for(;;){let s=this.next();if(s.t!=="ident"&&this.fail("wfjs: \u53C2\u6570\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",s.pos),t.push(String(s.v)),this.isPunc(",")){this.next();continue}break}this.expect(")"),this.expect("{");let r=this.parseBlockBody();return{k:"function",name:String(e.v),params:t,body:r}}parseImport(){this.next(),this.isPunc("{")||this.fail("wfjs: import \u4EC5\u652F\u6301\u547D\u540D\u5BFC\u5165\uFF08{ ... }\uFF09\u2014\u2014\u9ED8\u8BA4/\u547D\u540D\u7A7A\u95F4\u5BFC\u5165 W8",this.peek().pos),this.next();let e=[];for(;!this.isPunc("}");){let r=this.next();r.t!=="ident"&&this.fail("wfjs: import \u6210\u5458\u540D\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",r.pos);let s=r.v;if(this.isKw("as")){this.next();let o=this.next();o.t!=="ident"&&this.fail("wfjs: as \u540E\u5FC5\u987B\u662F\u6807\u8BC6\u7B26",o.pos),s=o.v}if(s!==r.v?e.push({name:r.v,as:s}):e.push({name:r.v}),this.isPunc(",")){this.next();continue}}this.next(),this.expect("from");let t=this.next();return t.t!=="str"&&this.fail("wfjs: import \u6765\u6E90\u5FC5\u987B\u662F\u5B57\u7B26\u4E32",t.pos),{k:"import",names:e,from:String(t.v)}}tryParseMethodCall(){let e=this.peek(),t=this.tokens[this.i+1],r=this.tokens[this.i+2],s=this.tokens[this.i+3];if(e.t!=="ident"||t?.t!=="punc"||t.v!=="."||r?.t!=="ident"||s?.t!=="punc"||s.v!=="(")return null;let o=String(e.v),i=String(r.v);this.next(),this.next(),this.next(),this.next();let a=[];if(!this.isPunc(")"))for(;;){if(a.push({key:null,value:this.parseValue()}),this.isPunc(",")){this.next();continue}break}return this.expect(")"),{name:`@${o}.${i}`,args:a}}parseVar(){let e=this.next();e.t==="kw"&&e.v==="var"&&this.fail("wfjs: 'var' \u4E0D\u652F\u6301\uFF08\u51FD\u6570\u4F5C\u7528\u57DF\u8BED\u4E49\u6613\u6DF7\u6DC6\uFF09\u2014\u2014\u8BF7\u7528 let/const",e.pos);let t=this.next();t.t!=="ident"&&this.fail(`wfjs: expected variable name after '${e.v}'`,t.pos);let r=null;return this.peek().t==="op"&&this.peek().v==="="&&(this.next(),r=this.parseValueOrCall()),{k:"var",name:t.v,init:r,isConst:e.v==="const"}}parseValueOrCall(){let e=!1;this.peek().t==="kw"&&this.peek().v==="await"&&(this.next(),e=!0);let t=this.tryParseMethodCall();if(t)return t;let r=this.peek(),s=this.tokens[this.i+1];if(e&&r.t==="ident"&&s?.t==="punc"&&s.v==="("){let o=String(this.next().v);if(this.next(),xt.has(o))return{name:o,args:this.parseCallArgs()};let i=[];if(!this.isPunc(")"))for(;;){if(i.push({key:null,value:this.parseValue()}),this.isPunc(",")){this.next();continue}break}return this.expect(")"),{name:o,args:i}}if(r.t==="ident"&&s?.t==="punc"&&s.v==="("){let o=this.tokens[this.i+2];o?.t==="punc"&&o.v==="{"&&this.fail(`wfjs: \u672A\u8BC6\u522B\u8C03\u7528 '${String(r.v)}'\uFF08\u4EC5\u5185\u7F6E\u6216 std \u7EAF\u51FD\u6570\u2014\u2014\u51FD\u6570\u5B9A\u4E49 W8\uFF09`,r.pos)}return this.parseValue()}parseCallArgs(){if(this.isPunc(")"))return this.next(),[];if(this.isPunc("{")){let e=this.parseObjectArgs();return this.expect(")"),e}return this.fail("wfjs: \u5185\u7F6E\u8C03\u7528\u9700\u5BF9\u8C61\u53C2\u6570\uFF08{ key: value }\uFF09\u2014\u2014\u4F4D\u7F6E\u53C2\u6570\u4EC5\u9650 W8 \u51FD\u6570\u8C03\u7528",this.peek().pos),[]}parseObjectArgs(){this.expect("{");let e=[];for(;!this.isPunc("}");){let t=this.next();if(t.t!=="ident"&&t.t!=="str"&&this.fail("wfjs: expected argument key in object literal",t.pos),this.expect(":"),e.push({key:String(t.v),value:this.parseValue()}),this.isPunc(","))this.next();else break}return this.expect("}"),e}parseValue(){let e=this.peek();if(e.t==="template"||e.t==="str"||e.t==="num"){let t=this.tokens[this.i+1];return t&&t.t==="op"&&Vp(t.v)?{t:"expr",src:this.scanExpr()}:e.t==="template"?(this.next(),{t:"tpl",parts:T_(e.raw)}):e.t==="str"?(this.next(),{t:"str",v:e.v}):(this.next(),{t:"num",v:e.v})}if(e.t==="kw"&&(e.v==="true"||e.v==="false"||e.v==="null")){let t=this.tokens[this.i+1];return t&&t.t==="op"&&Vp(t.v)?{t:"expr",src:this.scanExpr()}:(this.next(),{t:"expr",src:e.v})}if(e.t==="punc"&&e.v==="{"){this.next();let t=[];for(;!this.isPunc("}");){let r=this.next();if(r.t!=="ident"&&r.t!=="str"&&this.fail("wfjs: expected object key",r.pos),this.expect(":"),t.push({key:String(r.v),value:this.parseValue()}),this.isPunc(","))this.next();else break}return this.expect("}"),{t:"obj",kvs:t}}return{t:"expr",src:this.scanExpr()}}scanExpr(){let e=this.peek().pos,t="",r=0,s=-1;for(;;){let i=this.peek();if(i.t==="eof"||r===0&&(i.t==="punc"&&(i.v===","||i.v===";"||i.v===")"||i.v==="}")||i.t==="op"&&(i.v==="="||i.v==="+="||i.v==="-="||i.v==="*="||i.v==="/="||i.v==="%=")||s>=0&&this.src.slice(s,i.pos).includes(`
76
+ `)))break;if(i.t==="punc"&&(i.v==="("||i.v==="[")&&r++,i.t==="punc"&&(i.v===")"||i.v==="]")){if(r===0)break;r--}t+=this.src.slice(i.pos,i.end),s=i.end,this.next()}let o=t.trim();return o||this.fail("wfjs: expected expression",e),o}parseIf(){this.expect("if");let e=!1;this.isKw("once")&&(this.next(),e=!0),this.expect("(");let t=this.scanExpr();this.expect(")"),this.expect("{");let r=this.parseBlockBody(),s=null;return this.isKw("else")&&(this.next(),this.isPunc("{")?(this.next(),s=this.parseBlockBody()):s=[this.parseStmt()]),{k:"if",cond:t,then:r,else:s,once:e}}parseWhile(){this.expect("while"),this.expect("(");let e=this.scanExpr();this.expect(")"),this.expect("{");let t=this.parseBlockBody();return{k:"while",cond:e,body:t}}parseFor(){this.expect("for"),this.expect("(");let e=this.next();(e.t!=="kw"||!["const","let","var"].includes(e.v))&&this.fail("wfjs: for-of \u9700\u8981 const/let",e.pos);let t=this.next();t.t!=="ident"&&this.fail("wfjs: expected loop variable",t.pos);let r=this.next();(r.t!=="kw"||r.v!=="of")&&this.fail("wfjs: only for...of supported",r.pos);let s=this.scanExpr();this.expect(")"),this.expect("{");let o=this.parseBlockBody();return{k:"forof",varName:t.v,items:s,body:o}}parseReturn(){let e=this.next(),t=this.peek();return this.isPunc(";")||this.isPunc("}")?{k:"return",value:null}:t.t==="eof"?{k:"return",value:null}:this.src.slice(e.end,t.pos).includes(`
77
+ `)?{k:"return",value:null}:{k:"return",value:this.parseValue()}}parseAssignOrCall(){let e=this.tryParseMethodCall();if(e)return{k:"call",call:e};let t=this.next();t.t!=="ident"&&this.fail("wfjs: expected identifier",t.pos);let r=this.peek();if(r.t==="punc"&&r.v==="(")return this.next(),{k:"call",call:{name:t.v,args:this.parseCallArgs()}};if(r.t==="op"&&["=","+=","-=","*=","/=","%="].includes(r.v)){let s=r.v;return this.next(),{k:"assign",target:t.v,op:s,value:this.scanExpr()}}if(r.t==="op"&&(r.v==="++"||r.v==="--"))return this.next(),{k:"incdec",target:t.v,inc:r.v==="++"};this.fail(`wfjs: expected assignment or call after '${t.v}'`,r.pos)}};xt=new Set(["http","email","ai","template","log","stop"]);C_=new Set(["http","email","ai","template","log"]);Dl={http:{url:"template",method:"template",body:"template",headers:"template",timeoutMs:"template"},email:{to:"template",subject:"template",body:"template"},ai:{prompt:"template",system:"template"},template:{template:"template"},log:{message:"template"},stop:{},store:{key:"expr",value:"expr"}}});function or(n){let e=$_(n.imports??[]),t=M_(n.functions??[]),r=Kt(n.steps,{seenVars:new Set,loopNames:[],inReturn:!1}).trimEnd(),s=N_(n.exports);return[e,t,r,s].filter(Boolean).join(`
78
78
 
79
- `)}function M_(n){if(!n)return"";let e=[];return(n.named??[]).length&&e.push(`export { ${n.named.map(t=>t.as&&t.as!==t.name?`${t.name} as ${t.as}`:t.name).join(", ")} }`),n.default&&e.push(`export default ${n.default}`),e.join(`
80
- `)}function $_(n){return n?.length?n.map(e=>{let t={seenVars:new Set,loopNames:[],inReturn:!1},r=Kt(e.step.steps,t);return`function ${e.name}(${e.params.join(", ")}) {
79
+ `)}function N_(n){if(!n)return"";let e=[];return(n.named??[]).length&&e.push(`export { ${n.named.map(t=>t.as&&t.as!==t.name?`${t.name} as ${t.as}`:t.name).join(", ")} }`),n.default&&e.push(`export default ${n.default}`),e.join(`
80
+ `)}function M_(n){return n?.length?n.map(e=>{let t={seenVars:new Set,loopNames:[],inReturn:!1},r=Kt(e.step.steps,t);return`function ${e.name}(${e.params.join(", ")}) {
81
81
  ${En(r)}
82
82
  }`}).join(`
83
- `):""}function q_(n){return n?.length?n.map(e=>`import { ${e.names.map(r=>r.as&&r.as!==r.name?`${r.name} as ${r.as}`:r.name).join(", ")} } from '${e.from}'`).join(`
84
- `):""}function Kt(n,e){return n.map(t=>L_(t,e)).join(`
85
- `)}function Gt(n,e){return D_(n,r=>{let[s,i,o,...a]=r;return s==="steps"&&typeof i=="string"&&(o==="data"||o==="result")&&!i.startsWith("_")?[i,...r.slice(3)]:s==="vars"&&typeof i=="string"?[i,...r.slice(2)]:s==="loop"&&i==="item"?[e.loopNames[e.loopNames.length-1]??"it",...r.slice(2)]:null})}function D_(n,e){let t=St(n),r=s=>{let i=s;if(!(!i||typeof i!="object")){if(i.kind==="path"&&i.segments){let o=e(i.segments);o&&(i.segments=o);return}if(i.kind==="ternary"){r(i.cond),r(i.then),r(i.else);return}if(i.kind==="call"){i.args?.forEach(r);return}for(let o of["left","right","operand"])r(i[o])}};return r(t),xe(t)}function Dl(n,e,t){if(typeof n!="string")return JSON.stringify(n);if(e==="expr")return Gt(n,t);if(!n.includes("{{"))return`'${n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`;let r="`",s=0;for(;;){let i=n.indexOf("{{",s);if(i===-1){r+=n.slice(s).replace(/`/g,"\\`").replace(/\\/g,"\\\\");break}r+=n.slice(s,i).replace(/`/g,"\\`").replace(/\\/g,"\\\\");let o=n.indexOf("}}",i+2);if(o===-1)break;r+="${"+Gt(n.slice(i+2,o),t)+"}",s=o+2}return r+"`"}function zp(n,e,t){let r=[];for(let[s,i]of Object.entries(e)){if(i===void 0)continue;let o=Ml[n]?.[s]??"template";if(i&&typeof i=="object"&&!Array.isArray(i)){r.push(`${s}: { ${zp(n,i,t)} }`);continue}r.push(`${s}: ${Dl(i,o,t)}`)}return r.join(", ")}function j_(n,e){let t=n.config??{};if(n.type==="call"){let i=(t.args??[]).map(a=>Gt(a,e)).join(", "),o=`await ${t.name}(${i})`;return n.id.startsWith("_")||n.id.includes(":")?o:`const ${n.id} = ${o}`}if(n.type==="store"){let i=Dl(String(t.key),"template",e),o=t.op==="get"?"get":"set",a=t.op==="set"?`${i}, ${Dl(String(t.value??""),"template",e)}`:i,l=`await store.${o}(${a})`;return n.id.startsWith("_")?l:`const ${n.id} = ${l}`}let r=zp(n.type,t,e),s=`await ${n.type}({ ${r} })`;return n.id.startsWith("_")?s:`const ${n.id} = ${s}`}function L_(n,e){switch(n.type){case"assign":{let t=n.config,r=Gt(t.value,e);return e.seenVars.has(t.target)?`${t.target} = ${r}`:(e.seenVars.add(t.target),`let ${t.target} = ${r}`)}case"if":{let t=n.config,i=[`if (${Gt(t.when,e)}) {`];return t.then?.steps.length&&i.push(En(Kt(t.then.steps,ls(e)))),t.else?.steps.length&&(i.push((t.then?.steps.length,"} else {")),i.push(En(Kt(t.else.steps,ls(e))))),i.push("}"),i.join(`
86
- `)}case"try":{let t=n.config,r=["try {"];return t.step?.steps.length&&r.push(En(Kt(t.step.steps,ls(e)))),r.push("} catch {"),t.catch?.steps.length&&r.push(En(Kt(t.catch.steps,ls(e)))),r.push("}"),r.join(`
83
+ `):""}function $_(n){return n?.length?n.map(e=>`import { ${e.names.map(r=>r.as&&r.as!==r.name?`${r.name} as ${r.as}`:r.name).join(", ")} } from '${e.from}'`).join(`
84
+ `):""}function Kt(n,e){return n.map(t=>j_(t,e)).join(`
85
+ `)}function Gt(n,e){return q_(n,r=>{let[s,o,i,...a]=r;return s==="steps"&&typeof o=="string"&&(i==="data"||i==="result")&&!o.startsWith("_")?[o,...r.slice(3)]:s==="vars"&&typeof o=="string"?[o,...r.slice(2)]:s==="loop"&&o==="item"?[e.loopNames[e.loopNames.length-1]??"it",...r.slice(2)]:null})}function q_(n,e){let t=St(n),r=s=>{let o=s;if(!(!o||typeof o!="object")){if(o.kind==="path"&&o.segments){let i=e(o.segments);i&&(o.segments=i);return}if(o.kind==="ternary"){r(o.cond),r(o.then),r(o.else);return}if(o.kind==="call"){o.args?.forEach(r);return}for(let i of["left","right","operand"])r(o[i])}};return r(t),Re(t)}function Wl(n,e,t){if(typeof n!="string")return JSON.stringify(n);if(e==="expr")return Gt(n,t);if(!n.includes("{{"))return`'${n.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`;let r="`",s=0;for(;;){let o=n.indexOf("{{",s);if(o===-1){r+=n.slice(s).replace(/`/g,"\\`").replace(/\\/g,"\\\\");break}r+=n.slice(s,o).replace(/`/g,"\\`").replace(/\\/g,"\\\\");let i=n.indexOf("}}",o+2);if(i===-1)break;r+="${"+Gt(n.slice(o+2,i),t)+"}",s=i+2}return r+"`"}function Gp(n,e,t){let r=[];for(let[s,o]of Object.entries(e)){if(o===void 0)continue;let i=Dl[n]?.[s]??"template";if(o&&typeof o=="object"&&!Array.isArray(o)){r.push(`${s}: { ${Gp(n,o,t)} }`);continue}r.push(`${s}: ${Wl(o,i,t)}`)}return r.join(", ")}function D_(n,e){let t=n.config??{};if(n.type==="call"){let o=(t.args??[]).map(a=>Gt(a,e)).join(", "),i=`await ${t.name}(${o})`;return n.id.startsWith("_")||n.id.includes(":")?i:`const ${n.id} = ${i}`}if(n.type==="store"){let o=Wl(String(t.key),"template",e),i=t.op==="get"?"get":"set",a=t.op==="set"?`${o}, ${Wl(String(t.value??""),"template",e)}`:o,l=`await store.${i}(${a})`;return n.id.startsWith("_")?l:`const ${n.id} = ${l}`}let r=Gp(n.type,t,e),s=`await ${n.type}({ ${r} })`;return n.id.startsWith("_")?s:`const ${n.id} = ${s}`}function j_(n,e){switch(n.type){case"assign":{let t=n.config,r=Gt(t.value,e);return e.seenVars.has(t.target)?`${t.target} = ${r}`:(e.seenVars.add(t.target),`let ${t.target} = ${r}`)}case"if":{let t=n.config,o=[`if (${Gt(t.when,e)}) {`];return t.then?.steps.length&&o.push(En(Kt(t.then.steps,ds(e)))),t.else?.steps.length&&(o.push((t.then?.steps.length,"} else {")),o.push(En(Kt(t.else.steps,ds(e))))),o.push("}"),o.join(`
86
+ `)}case"try":{let t=n.config,r=["try {"];return t.step?.steps.length&&r.push(En(Kt(t.step.steps,ds(e)))),r.push("} catch {"),t.catch?.steps.length&&r.push(En(Kt(t.catch.steps,ds(e)))),r.push("}"),r.join(`
87
87
  `)}case"while":{let t=n.config;return`while (${Gt(t.when,e)}) {
88
- ${En(Kt(t.step.steps,ls(e)))}
88
+ ${En(Kt(t.step.steps,ds(e)))}
89
89
  }`}case"for":{let t=n.config,r=Gt(t.items,e),s=`it${e.loopNames.length}`;return`for (const ${s} of ${r}) {
90
90
  ${En(Kt(t.step.steps,{...e,loopNames:[...e.loopNames,s]}))}
91
- }`}case"return":{let t=n.config;return t.value!==void 0?`return ${Gt(t.value,e)}`:"return"}default:return j_(n,e)}}function ls(n){return{...n,inReturn:!1}}function En(n){return n.split(`
91
+ }`}case"return":{let t=n.config;return t.value!==void 0?`return ${Gt(t.value,e)}`:"return"}default:return D_(n,e)}}function ds(n){return{...n,inReturn:!1}}function En(n){return n.split(`
92
92
  `).map(e=>" "+e).join(`
93
- `)}var Kp=N(()=>{"use strict";kn();ql()});function Po(n){let e=new Map;for(let s of Tp())e.set(s.type,s);let t={fetch:n?.fetch,ai:n?.ai,email:n?.email,log:n?.log,store:n?.store??(n?.redis?as(n.redis):void 0)},r={get:s=>e.get(s),has:s=>e.has(s),schema:s=>{let i=e.get(s);if(i)return{required:i.required??[],fields:i.fields}}};return{validate:s=>$p(s,r),execute:(s,i)=>Op(s,i??{},t,r),registerStep:s=>{e.set(s.type,s)},stepSchemas:()=>[...e.values()].map(s=>({type:s.type,label:s.label,fields:s.fields,required:s.required??[]}))}}var No=N(()=>{"use strict";Cp();Ip();Rl();Dp();Rl();Al();ql();Kp();kn()});function Gp(n,e){let t=W_[e],r=a=>e===4?a>=0&&a<=7:a>=(e===2||e===3?1:0)&&a<=U_[e],s=a=>{if(!r(a))throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u503C ${a} \u8D8A\u754C`)};if(n.includes(",")){let a=n.split(",").map(u=>u.trim());if(a.some(u=>!u))throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u5217\u8868\u542B\u7A7A\u9879`);let l=a.map(u=>Gp(u,e));return u=>l.some(c=>c(u))}let i=n.match(/^\*\/(\d+)$/);if(i){let a=Number(i[1]);if(a<1)throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u6B65\u957F\u5FC5\u987B \u22651`);return l=>l%a===0}let o=n.match(/^(\d+)-(\d+)$/);if(o){let a=Number(o[1]),l=Number(o[2]);if(s(a),s(l),a>l)throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u8303\u56F4\u8D77\u5927\u4E8E\u6B62\uFF08${a}-${l}\uFF09`);return u=>u>=a&&u<=l}if(n==="*")return()=>!0;if(/^\d+$/.test(n)){let a=Number(n);return s(a),l=>l===a}throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u65E0\u6CD5\u8BC6\u522B\uFF1A'${n}'\uFF08\u652F\u6301 * a/N N N-M N,M\uFF09`)}function jl(n){let e=n.trim().split(/\s+/);if(e.length!==5)throw new Error(`cron \u8868\u8FBE\u5F0F\u9700 5 \u5B57\u6BB5\uFF08\u5206 \u65F6 \u65E5 \u6708 \u5468\uFF09\u2014\u2014\u6536\u5230 ${e.length} \u4E2A\uFF1A'${n}'`);let[t,r,s,i,o]=e.map((a,l)=>Gp(a,l));return a=>t(a.getMinutes())&&r(a.getHours())&&s(a.getDate())&&i(a.getMonth()+1)&&o(a.getDay())}function Qp(n){let e=t=>String(t).padStart(2,"0");return`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}`}var W_,U_,Jp=N(()=>{"use strict";W_=["\u5206\u949F(0-59)","\u5C0F\u65F6(0-23)","\u65E5(1-31)","\u6708(1-12)","\u5468(0-7, 0/7=\u5468\u65E5)"],U_=[59,23,31,12,7]});function B_(n,e,t={}){let r=t.intervalMs??3e4,s=t.now??(()=>new Date),i=new Map,o=null,a=async()=>{let l=s(),u=Qp(l);try{let c=await n.query.from(Qt).where({status:{eq:"active"}}).select("id","app_id","cron").run();for(let d of c){let p=String(d.cron??"");if(!p)continue;let m;try{m=jl(p)(l)}catch{continue}if(!m)continue;let h=`${u}:${String(d.id)}`;i.has(h)||(i.set(h,!0),i.size>1e4&&i.clear(),await e(String(d.app_id),String(d.id),{},"cron").catch(f=>{console.error(`[workflow-scheduler] cron \u89E6\u53D1\u6267\u884C\u5931\u8D25 (${String(d.id)}):`,f instanceof Error?f.message:f)}))}}catch(c){console.error("[workflow-scheduler] tick \u626B\u63CF\u5931\u8D25:",c instanceof Error?c.message:c)}};return{start:()=>{o||(o=setInterval(()=>{a()},r),o.unref?.(),a())},stop:()=>{o&&(clearInterval(o),o=null)}}}function Mo(n){let{orm:e,redis:t}=n,r=Po({store:t?as(t):void 0}),s=async({wfjs:g,def:w})=>{if(typeof g=="string"){let y=await $l(g),k=r.validate(y);if(!k.ok)throw new Error(`wfjs \u7F16\u8BD1\u901A\u8FC7\u4F46\u6821\u9A8C\u5931\u8D25\uFF1A${k.errors.map(_=>`${_.path}: ${_.message}`).join("\uFF1B")}`);return{def:y,wfjs:or(y)}}if(w){let y=r.validate(w);if(!y.ok)throw new Error(`DSL \u6821\u9A8C\u5931\u8D25\uFF1A${y.errors.map(_=>`${_.path}: ${_.message}`).join("\uFF1B")}`);let k=w;return{def:k,wfjs:or(k)}}throw new Error("\u521B\u5EFA workflow \u9700\u8981 wfjs \u6E90\u7801\u6216 DSL def")},i=async(g,w)=>{try{let y=await r.execute(g,{input:w});return{status:y.status,result:y,error:y.status==="error"?y.error??"\u6267\u884C\u5931\u8D25":null}}catch(y){return{status:"error",result:null,error:y.message}}},o="id, app_id, name, description, def_json, src_wfjs, status, cron, created_at, updated_at",a="id, app_id, workflow_id, trigger, status, args_json, result_json, error, started_at, finished_at, created_at",l=g=>typeof g=="string"?JSON.parse(g):g,u=g=>typeof g=="string"?JSON.parse(g):g,c=g=>({...g,def_json:l(g.def_json)}),d=g=>({...g,args_json:l(g.args_json),result_json:l(g.result_json)}),p={async create(g,w){let{def:y,wfjs:k}=await s(w),_=await e.query.insert(Qt).values({app_id:g,name:w.name,description:w.description??null,def_json:JSON.stringify(y),src_wfjs:k,cron:w.cron??null}).returning(...o.split(", ")).run(),v=c(_[0]);return await e.query.insert(us).values({app_id:g,workflow_id:v.id,def_json:JSON.stringify(y),note:"\u521D\u59CB\u7248\u672C"}).run(),v},async list(g,w){let y=w?.offset??0,k=Math.min(100,Math.max(1,w?.limit??50)),v=(await e.query.from(Qt).where({app_id:{eq:g}}).select(...o.split(", ")).orderBy("updated_at","desc").limit(k).offset(y).run()).map(S=>c(S));for(let S of v){let A=await e.query.from(ir).where({workflow_id:{eq:S.id},app_id:{eq:g}}).orderBy("created_at","desc").limit(1).run();S.last_run=A[0]?d(A[0]):null}return v},async get(g,w){let y=await e.query.from(Qt).where({app_id:{eq:g},id:{eq:w}}).select(...o.split(", ")).limit(1).run();return y[0]?c(y[0]):null},async update(g,w,y){if(!(await e.query.from(Qt).where({app_id:{eq:g},id:{eq:w}}).select("id").limit(1).run())[0])return!1;let _=null;if((y.wfjs!==void 0||y.def!==void 0)&&(_=await s(y)),y.cron!==void 0&&y.cron!==null&&y.cron!=="")try{jl(String(y.cron))}catch(S){throw new T(`cron \u8868\u8FBE\u5F0F\u975E\u6CD5\uFF1A${String(S?.message??S)}`,400)}let v={};return y.name!==void 0&&(v.name=y.name),y.cron!==void 0&&(v.cron=y.cron||null),_&&(v.def_json=JSON.stringify(_.def),v.src_wfjs=_.wfjs,await e.query.insert(us).values({app_id:g,workflow_id:w,def_json:JSON.stringify(_.def),note:y.note??null}).run()),v.updated_at=new Date().toISOString(),await e.query.update(Qt).set(v).where({app_id:{eq:g},id:{eq:w}}).run(),!0},async listVersions(g,w,y){let k=y?.offset??0,_=Math.min(100,Math.max(1,y?.limit??30));return(await e.query.from(us).where({app_id:{eq:g},workflow_id:{eq:w}}).select(..."id, app_id, workflow_id, def_json, note, created_at".split(", ")).orderBy("created_at","desc").limit(_).offset(k).run()).map(S=>{let A=S;return{...A,def_json:u(A.def_json)}})},async rollback(g,w,y){let k=await e.query.from(us).where({app_id:{eq:g},workflow_id:{eq:w},id:{eq:y}}).select(..."id, def_json".split(", ")).limit(1).run();if(!k[0]||!await p.get(g,w))return!1;let v=u(k[0].def_json);return await e.query.update(Qt).set({def_json:JSON.stringify(v),src_wfjs:or(v),updated_at:new Date().toISOString()}).where({app_id:{eq:g},id:{eq:w}}).run(),await e.query.insert(us).values({app_id:g,workflow_id:w,def_json:JSON.stringify(v),note:`\u56DE\u6EDA\u81EA ${y.slice(0,8)}`}).run(),!0},async remove(g,w){return await e.query.delete(Qt).where({app_id:{eq:g},id:{eq:w}}).run(),!0},async listRuns(g,w,y){let k=y?.offset??0,_=Math.min(100,Math.max(1,y?.limit??50));return(await e.query.from(ir).where({app_id:{eq:g},workflow_id:{eq:w}}).select(...a.split(", ")).orderBy("created_at","desc").limit(_).offset(k).run()).map(S=>d(S))},async getRun(g,w,y){let k=await e.query.from(ir).where({app_id:{eq:g},id:{eq:y},workflow_id:{eq:w}}).select(...a.split(", ")).limit(1).run();return k[0]?d(k[0]):null}},m=async(g,w,y,k="manual")=>{let _=await p.get(g,w);if(!_)throw new Error("workflow \u4E0D\u5B58\u5728");let v=new Date().toISOString(),S=await e.query.insert(ir).values({app_id:g,workflow_id:w,trigger:k,status:"running",args_json:JSON.stringify(y),result_json:null,error:null,started_at:v,finished_at:null}).returning(...a.split(", ")).run(),A=String(S[0].id);try{let C=await i(_.def_json,y),j=await e.query.update(ir).set({status:C.status,result_json:JSON.stringify(C.result),error:C.error,finished_at:new Date().toISOString()}).where({id:{eq:A}}).returning(...a.split(", ")).run();return d(j[0])}catch(C){return await e.query.update(ir).set({status:"error",error:C.message,finished_at:new Date().toISOString()}).where({id:{eq:A}}).run(),d({status:"error",error:C.message})}},h={crud:p,compileGate:s,validate:g=>r.validate(g),execute:m,executeDef:i,dag:g=>Cl(g),schema:()=>Tl(r.stepSchemas()),defToWfjs:g=>or(g)},f=(async(g,w,y)=>(w.wf=h,y(g,w)));return f.wf=h,f.crud=p,f.scheduler=B_(e,m),f.__meta={injects:["wf"],depends:[]},f.routes=(g,w)=>{let y=w?.prefix??n.prefix??"/api/workflows",k=w?.appId??(S=>S.auth?.appId),_=S=>{let A=k(S);if(!A)throw new T("workflow route \u9700\u8981 appId\uFF08\u5E94\u7528\u4E0A\u4E0B\u6587\uFF09",400);return A},v=(S,A=200)=>Response.json(S,{status:A});g.get(`${y}/:id/versions`,async(S,A)=>await p.get(_(A),A.params.id)?v({versions:await p.listVersions(_(A),A.params.id)}):v({error:"workflow \u4E0D\u5B58\u5728"},404)),g.post(`${y}/:id/versions/:vid/rollback`,async(S,A)=>await p.rollback(_(A),A.params.id,A.params.vid)?v({ok:!0}):v({error:"workflow \u6216\u7248\u672C\u4E0D\u5B58\u5728"},404)),g.get(`${y}/meta`,async(S,A)=>v({schemas:h.schema()})),g.get(`${y}`,async(S,A)=>{let C=new URL(S.url),j=Math.max(0,parseInt(C.searchParams.get("offset")??"0",10)),K=Math.min(100,Math.max(1,parseInt(C.searchParams.get("limit")??"50",10)));return v({workflows:await p.list(_(A),{offset:j,limit:K})})}),g.post(`${y}`,async(S,A)=>{let C=await S.json().catch(()=>({}));if(!C?.name)return v({error:"\u5FC5\u586B\uFF1Aname"},400);try{let j=await p.create(_(A),C);return v({ok:!0,workflow:j},201)}catch(j){return v({error:j.message},400)}}),g.get(`${y}/:id`,async(S,A)=>{let C=await p.get(_(A),A.params.id);return C?v({workflow:{...C,def:C.def_json,wfjs:C.src_wfjs,dag:h.dag(C.def_json)}}):v({error:"workflow \u4E0D\u5B58\u5728"},404)}),g.put(`${y}/:id`,async(S,A)=>{let C=await S.json().catch(()=>({}));try{if(C.patch){let K=await p.get(_(A),A.params.id);if(!K)return v({error:"workflow \u4E0D\u5B58\u5728"},404);let U=C.patch,H;if(U.op==="insert"){if(!U.step?.type)return v({error:"insert \u9700\u8981 step.type"},400);H=Up(K.def_json,U.anchor??null,U.chain??[],U.step)}else if(U.op==="remove")H=Bp(K.def_json,U.path);else{if(!U.config)return v({error:"set \u9700\u8981 config"},400);H=Lp(K.def_json,U.path,U.config)}let V=h.validate(H);return V.ok?(await p.update(_(A),A.params.id,{def:H}),v({ok:!0})):v({error:`patch \u6821\u9A8C\u5931\u8D25\uFF1A${V.errors.map(Q=>Q.message).join("\uFF1B")}`},400)}return await p.update(_(A),A.params.id,C)?v({ok:!0}):v({error:"workflow \u4E0D\u5B58\u5728"},404)}catch(j){return v({error:j.message},400)}}),g.delete(`${y}/:id`,async(S,A)=>(await p.remove(_(A),A.params.id),v({ok:!0}))),g.post(`${y}/:id/runs`,async(S,A)=>{let C=await S.json().catch(()=>({}));try{let j=await m(_(A),A.params.id,C.args??{});return v({ok:!0,run:j},201)}catch(j){return v({error:j.message},400)}}),g.get(`${y}/:id/runs`,async(S,A)=>{if(!await p.get(_(A),A.params.id))return v({error:"workflow \u4E0D\u5B58\u5728"},404);let j=new URL(S.url),K=Math.max(0,parseInt(j.searchParams.get("offset")??"0",10)),U=Math.min(100,Math.max(1,parseInt(j.searchParams.get("limit")??"50",10)));return v({runs:await p.listRuns(_(A),A.params.id,{offset:K,limit:U})})}),g.get(`${y}/:id/runs/:runId`,async(S,A)=>{let C=await p.getRun(_(A),A.params.id,A.params.runId);return C?v({run:C}):v({error:"run \u4E0D\u5B58\u5728"},404)})},f}var Qt,ir,us,$o,Zp=N(()=>{"use strict";bn();Jn();ze();No();Jp();No();Al();Qt="_weifuwu_workflows",ir="_weifuwu_workflow_runs",us="_weifuwu_workflow_versions";$o={tables:[{name:"_weifuwu_workflows",columns:{id:R.pk(b.uuid()),app_id:R.req(b.uuid()),name:R.req(b.string()),description:b.string(),def_json:b.json().meta({notNull:!0}),src_wfjs:b.string(),status:b.string().meta({default:"active"}),cron:b.string(),created_at:b.date().meta({default:"now"}),updated_at:b.date().meta({default:"now"})},indexes:[{cols:["app_id",{col:"updated_at",desc:!0}],name:"idx_wf_workflows_app"}]},{name:"_weifuwu_workflow_runs",columns:{id:R.pk(b.uuid()),app_id:R.req(b.uuid()),workflow_id:R.req(b.uuid()).meta({references:"_weifuwu_workflows",onDelete:"cascade"}),trigger:b.string().meta({default:"manual"}),status:b.string().meta({default:"queued"}),args_json:b.json(),result_json:b.json(),error:b.string(),started_at:b.date(),finished_at:b.date(),created_at:b.date().meta({default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_wf_runs_app"},{cols:["workflow_id",{col:"created_at",desc:!0}],name:"idx_wf_runs_wf"}]},{name:"_weifuwu_workflow_versions",columns:{id:R.pk(b.uuid()),app_id:R.req(b.uuid()),workflow_id:R.req(b.uuid()).meta({references:"_weifuwu_workflows",onDelete:"cascade"}),def_json:b.json().meta({notNull:!0}),note:b.string(),created_at:b.date().meta({default:"now"})},indexes:[{cols:["workflow_id",{col:"created_at",desc:!0}],name:"idx_wf_versions_wf"}]}]}});import{randomUUID as H_}from"node:crypto";import{hostname as F_}from"node:os";function qo(n){let e=n.redis,t=n.prefix??"q:",r=l=>`${t}${l}`,s=l=>`${t}${l}:dead`;async function i(l,u){let c=await e.command("XADD",r(l),"*","payload",JSON.stringify(u));return String(c)}let o={async add(l,u,c){return{id:await i(l,{id:H_(),name:l,data:u,attempts:0,maxAttempts:c?.attempts??3,addedAt:Date.now()})}},length:async l=>Number(await e.command("XLEN",r(l))),worker(l,u,c){let d=c?.consumer??`${F_()}-${process.pid}-${Math.random().toString(36).slice(2,6)}`,p=c?.concurrency??1,m=c?.visibilityTimeout??3e4,h=c?.blockMs??1e3,f=r(l),g=s(l),w=`${t}${l}:delayed`,y=!1,k=0,_=0,v=null,S=-1,A=500,C=new Map,j=new Set;function K(){let M=v;v=null,S=-1,M?.close().catch(()=>{})}async function U(M){let W=M instanceof Error?M.message:String(M);return/pool is closed/.test(W)?!1:(K(),await new Promise(q=>setTimeout(q,A)),A=Math.min(A*2,5e3),!0)}function H(){A=500}async function V(M){if(v&&S===M)return v;if(v){let q=v;v=null,S=-1,await q.close().catch(()=>{})}let W=await e.createConnection();return v=W,S=M,W}async function Q(){let M;for(let W=0;W<3;W++)try{await v.command("XGROUP","CREATE",f,Tn,"0","MKSTREAM");return}catch(q){if(String(q.message).includes("BUSYGROUP"))return;M=q,W<2&&await new Promise(D=>setTimeout(D,50))}throw M}async function P(M,W){let q;try{q=JSON.parse(W.payload??"{}")}catch{await v.command("XADD",g,"*","payload",JSON.stringify({originalId:M,name:l,error:"unparseable payload",attempts:-1})),await v.command("XACK",f,Tn,M);return}let D=Number(q.attempts??0),B=Number(q.maxAttempts??3);try{await u({id:M,name:l,data:q.data,attempts:D}),await v.command("XACK",f,Tn,M)}catch(z){let Y=D+1;Y>=B?(await v.command("XADD",g,"*","payload",JSON.stringify({originalId:M,name:l,data:q.data,error:z instanceof Error?z.message:String(z),attempts:Y})),await v.command("XACK",f,Tn,M),console.error(`[queue] ${l} job failed permanently (attempt ${Y}/${B}):`,z)):(await v.command("ZADD",w,String(Date.now()+m),JSON.stringify({...q,attempts:Y})),await v.command("XACK",f,Tn,M),console.error(`[queue] ${l} job failed (attempt ${Y}/${B}), retry in ${m}ms:`,z))}}async function E(){let M=Date.now(),W;try{W=await v.command("ZRANGEBYSCORE",w,0,M)}catch(q){if(Ll(q)){if(await U(q))return;y=!1;return}y&&I()&&console.error("[queue] ZRANGEBYSCORE:",q instanceof Error?q.message:q);return}for(let q of W)await v.command("ZREM",w,q)&&await v.command("XADD",f,"*","payload",q)}async function x(){try{let W=(await v.command("XAUTOCLAIM",f,Tn,d,m,"0","COUNT",String(p)))[1];for(let[q,D]of W)await P(q,Xp(D))}catch(M){if(Ll(M)){if(await U(M))return;y=!1;return}if(await O(M))return;y&&I()&&console.error("[queue] XAUTOCLAIM:",M instanceof Error?M.message:M)}}async function O(M){let W=M instanceof Error?M.message:String(M);if(!/NOGROUP/.test(W))return!1;try{return await Q(),!0}catch{return!1}}function I(){let M=Date.now();return M-k>5e3?(k=M,!0):!1}async function $(M){for(;y&&M===_;){if(!v||S!==M){try{await V(M)}catch(B){y&&I()&&console.error("[queue] reconnect:",B instanceof Error?B.message:B),await new Promise(z=>setTimeout(z,A)),A=Math.min(A*2,5e3);continue}H()}if(await x(),await E(),j.size>=p){await Promise.race([...j].map(B=>B.catch(()=>{})));continue}let W;try{W=await v.command("XREADGROUP","GROUP",Tn,d,"COUNT",String(p-j.size),"BLOCK",String(h),"STREAMS",f,">"),H()}catch(B){if(Ll(B)){if(await U(B))continue;y=!1;return}if(await O(B))continue;y&&I()&&console.error("[queue] XREADGROUP:",B instanceof Error?B.message:B);continue}if(!W)continue;let D=W[0][1];for(let[B,z]of D){let Y=P(B,Xp(z));j.add(Y),Y.finally(()=>j.delete(Y)).catch(()=>{})}}}return{start:async()=>{if(y)return;y=!0;let M=_;try{await V(M),await Q()}catch(q){if(y=!1,v){let D=v;v=null,S=-1,await D.close().catch(()=>{})}throw q}let W=$(M);C.set(M,W),W.finally(()=>C.delete(M)).catch(q=>console.error("[queue] worker loop crashed:",q))},stop:async()=>{if(!y){await Promise.allSettled([...C.values()]);return}_++,y=!1;let M=v;v=null,S=-1;let W=[...C.entries()].filter(([q])=>q<_).map(([,q])=>q);await Promise.allSettled([...j]),await Promise.allSettled(W),await M?.close().catch(()=>{})}}}},a=(async(l,u,c)=>(u.queue=o,c(l,u)));return a.__meta={injects:["queue"],depends:[]},a.queue=o,a.close=async()=>{},a}function Xp(n){let e={};for(let t=0;t+1<n.length;t+=2)e[String(n[t])]=String(n[t+1]);return e}function Ll(n){let e=n instanceof Error?n.message:String(n);return/pool is closed|connection closed/.test(e)}var Tn,Yp=N(()=>{"use strict";Tn="workers"});function z_(n,e){let[t,r]=V_[e],s=["minute","hour","day","month","weekday"][e];if(n==="*")return null;if(n.startsWith("*/")){let o=Number(n.slice(2));if(!Number.isInteger(o)||o<=0||o>r)throw new Error(`cron: invalid step '${n}' in ${s} field (must be 1..${r})`);let a=new Set;for(let l=t;l<=r;l+=o)a.add(l);return a}let i=new Set;for(let o of n.split(",")){if(o==="")throw new Error(`cron: empty item in '${n}' (${s})`);if(o.includes("-")){let[a,l]=o.split("/"),u=l!==void 0?Number(l):1,[c,d]=a.split("-").map(Number);if(!Number.isInteger(c)||!Number.isInteger(d)||c<t||d>r||c>d)throw new Error(`cron: invalid range '${o}' in ${s} field (${t}..${r})`);if(!Number.isInteger(u)||u<=0)throw new Error(`cron: invalid step in '${o}'`);for(let p=c;p<=d;p+=u)i.add(p)}else{let a=Number(o);if(!Number.isInteger(a)||a<t||a>r)throw new Error(`cron: value '${o}' out of range ${t}..${r} in ${s} field`);i.add(a)}}return i}function Ul(n){let e=n.trim().split(/\s+/);if(e.length!==5)throw new Error(`cron: expected 5 fields (min hour dom month dow), got ${e.length}: '${n}'`);let t=e.map((r,s)=>z_(r,s));return{fields:t.map(r=>({values:r})),domExplicit:t[2]!==null,dowExplicit:t[4]!==null}}function Wl(n,e){return n===null?!0:n.has(e)}function K_(n,e,t){let r=Wl(n.fields[2].values,e),s=Wl(n.fields[4].values,t);return n.domExplicit&&n.dowExplicit?r||s:n.domExplicit?r:n.dowExplicit?s:!0}function em(n,e,t,r){if(n===null)return e;for(let s=e;s<=r;s++)if(n.has(s))return s;return null}function Bl(n,e){let t=new Date(e.getTime());t.setSeconds(0,0),t.setMinutes(t.getMinutes()+1);let r=e.getTime()+5*366*24*3600*1e3;for(;t.getTime()<=r;){let s=t.getFullYear(),i=t.getMonth()+1,o=t.getDate(),a=t.getDay();if(!Wl(n.fields[3].values,i)){t.setMonth(i,1),t.setHours(0,0,0,0),t.setMonth(i);continue}if(!K_(n,o,a)){t.setDate(o+1),t.setHours(0,0,0,0);continue}let l=t.getHours(),u=em(n.fields[1].values,l,0,23);if(u===null){t.setDate(o+1),t.setHours(0,0,0,0);continue}if(u!==l){t.setHours(u,0,0,0);continue}let c=t.getMinutes(),d=em(n.fields[0].values,c,0,59);if(d===null){t.setHours(l+1,0,0,0);continue}if(d!==c){t.setMinutes(d,0,0);continue}return t}throw new Error("cron: no next run within 5 years (invalid expression?)")}var V_,tm=N(()=>{"use strict";V_=[[0,59],[0,23],[1,31],[1,12],[0,6]]});import{randomUUID as G_}from"node:crypto";function nm(n){let e=n.prefix??"wf:sched:",t=n.tickMs??1e3,r=`${e}delayed`,s=`${e}crons`,i=n.queue,o=null;function a(){return o||(o=n.redis.createConnection(),o.catch(()=>{o=null})),o}let l=!1,u=null;async function c(){await d();let y;try{y=await(await a()).command("ZRANGEBYSCORE",r,0,Date.now())}catch{return}for(let k of y){let _;try{_=await(await a()).command("ZREM",r,k)}catch{return}if(_===1)try{let v=JSON.parse(k);await i.queue.add(v.name,v.data)}catch(v){console.error("[scheduler] enqueue:",v instanceof Error?v.message:v),await(await a()).command("ZADD",r,Date.now(),k).catch(()=>{})}}}async function d(){let y;try{y=await(await a()).command("HGETALL",s)}catch{return}let k=Date.now(),_=y;for(let v=0;v+1<_.length;v+=2){let S=_[v],A=_[v+1],C;try{C=JSON.parse(A)}catch{continue}let j=Ul(C.expr),K=C.nextRunAt;for(;K<=k;){let U=K,H=JSON.stringify({id:`cron:${S}:${U}`,name:C.name,data:C.data});try{await(await a()).command("ZADD",r,"NX",U,H)}catch{break}K=Bl(j,new Date(U)).getTime()}K!==C.nextRunAt&&await(await a()).command("HSET",s,S,JSON.stringify({...C,nextRunAt:K}))}}let p=async(y,k,_)=>{let v=Ul(y),S=Bl(v,new Date),A=JSON.stringify({expr:y,name:k,data:_,nextRunAt:S.getTime()});await(await a()).command("HSET",s,k,A)},m=async y=>{let k=await(await a()).command("HDEL",s,y);try{let _=await(await a()).command("ZRANGE",r,0,-1);for(let v of _)try{JSON.parse(v).name===y&&await(await a()).command("ZREM",r,v)}catch{}}catch{}return k===1};async function h(){l||(l=!0,await a(),await c(),u=setInterval(()=>{c().catch(y=>console.error("[scheduler] tick:",y instanceof Error?y.message:y))},t),u.unref?.())}let f=async(y,k,_={})=>{let v=_.delayMs??0,S=_.when?_.when.getTime():Date.now()+v;if(!Number.isFinite(S))throw new Error("scheduler: invalid when/delayMs");let A=G_(),C=JSON.stringify({id:A,name:y,data:k});return await(await a()).command("ZADD",r,S,C),{id:A}},g=async y=>{try{let k=await(await a()).command("ZRANGE",r,0,-1);for(let _ of k)try{if(JSON.parse(_).id===y&&await(await a()).command("ZREM",r,_)===1)return!0}catch{}}catch{}return!1},w=(async(y,k,_)=>(k.schedule=f,k.cron=p,k.cancelCron=m,k.cancelSchedule=g,_(y,k)));return w.__meta={injects:["schedule","cron","cancelCron","cancelSchedule"],depends:["queue"]},w.schedule=f,w.cron=p,w.cancelCron=m,w.cancelSchedule=g,w.close=async()=>{l=!1,u&&(clearInterval(u),u=null),o&&await o.then(y=>y.close()).catch(()=>{})},h().catch(y=>console.error("[scheduler] start:",y instanceof Error?y.message:y)),w}var rm=N(()=>{"use strict";tm()});function Jt(n,e){let t=new TextEncoder,r=e?.heartbeatMs??15e3,s,i=new ReadableStream({async start(o){let a=(l,u)=>{o.enqueue(t.encode(`event: ${l}
93
+ `)}var Qp=I(()=>{"use strict";kn();Ll()});function Mo(n){let e=new Map;for(let s of Ap())e.set(s.type,s);let t={fetch:n?.fetch,ai:n?.ai,email:n?.email,log:n?.log,store:n?.store??(n?.redis?cs(n.redis):void 0)},r={get:s=>e.get(s),has:s=>e.has(s),schema:s=>{let o=e.get(s);if(o)return{required:o.required??[],fields:o.fields}}};return{validate:s=>Dp(s,r),execute:(s,o)=>Pp(s,o??{},t,r),registerStep:s=>{e.set(s.type,s)},stepSchemas:()=>[...e.values()].map(s=>({type:s.type,label:s.label,fields:s.fields,required:s.required??[]}))}}var $o=I(()=>{"use strict";Op();Np();Cl();Lp();Cl();Pl();Ll();Qp();kn()});function Jp(n,e){let t=L_[e],r=a=>e===4?a>=0&&a<=7:a>=(e===2||e===3?1:0)&&a<=W_[e],s=a=>{if(!r(a))throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u503C ${a} \u8D8A\u754C`)};if(n.includes(",")){let a=n.split(",").map(u=>u.trim());if(a.some(u=>!u))throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u5217\u8868\u542B\u7A7A\u9879`);let l=a.map(u=>Jp(u,e));return u=>l.some(c=>c(u))}let o=n.match(/^\*\/(\d+)$/);if(o){let a=Number(o[1]);if(a<1)throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u6B65\u957F\u5FC5\u987B \u22651`);return l=>l%a===0}let i=n.match(/^(\d+)-(\d+)$/);if(i){let a=Number(i[1]),l=Number(i[2]);if(s(a),s(l),a>l)throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u8303\u56F4\u8D77\u5927\u4E8E\u6B62\uFF08${a}-${l}\uFF09`);return u=>u>=a&&u<=l}if(n==="*")return()=>!0;if(/^\d+$/.test(n)){let a=Number(n);return s(a),l=>l===a}throw new Error(`cron \u5B57\u6BB5\u300C${t}\u300D\u65E0\u6CD5\u8BC6\u522B\uFF1A'${n}'\uFF08\u652F\u6301 * a/N N N-M N,M\uFF09`)}function Ul(n){let e=n.trim().split(/\s+/);if(e.length!==5)throw new Error(`cron \u8868\u8FBE\u5F0F\u9700 5 \u5B57\u6BB5\uFF08\u5206 \u65F6 \u65E5 \u6708 \u5468\uFF09\u2014\u2014\u6536\u5230 ${e.length} \u4E2A\uFF1A'${n}'`);let[t,r,s,o,i]=e.map((a,l)=>Jp(a,l));return a=>t(a.getMinutes())&&r(a.getHours())&&s(a.getDate())&&o(a.getMonth()+1)&&i(a.getDay())}function Zp(n){let e=t=>String(t).padStart(2,"0");return`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}`}var L_,W_,Xp=I(()=>{"use strict";L_=["\u5206\u949F(0-59)","\u5C0F\u65F6(0-23)","\u65E5(1-31)","\u6708(1-12)","\u5468(0-7, 0/7=\u5468\u65E5)"],W_=[59,23,31,12,7]});function U_(n,e,t={}){let r=t.intervalMs??3e4,s=t.now??(()=>new Date),o=new Map,i=null,a=async()=>{let l=s(),u=Zp(l);try{let c=await n.query.from(Qt).where({status:{eq:"active"}}).select("id","app_id","cron").run();for(let d of c){let p=String(d.cron??"");if(!p)continue;let f;try{f=Ul(p)(l)}catch{continue}if(!f)continue;let w=`${u}:${String(d.id)}`;o.has(w)||(o.set(w,!0),o.size>1e4&&o.clear(),await e(String(d.app_id),String(d.id),{},"cron").catch(m=>{console.error(`[workflow-scheduler] cron \u89E6\u53D1\u6267\u884C\u5931\u8D25 (${String(d.id)}):`,m instanceof Error?m.message:m)}))}}catch(c){console.error("[workflow-scheduler] tick \u626B\u63CF\u5931\u8D25:",c instanceof Error?c.message:c)}};return{start:()=>{i||(i=setInterval(()=>{a()},r),i.unref?.(),a())},stop:()=>{i&&(clearInterval(i),i=null)}}}function qo(n){let{orm:e,redis:t}=n,r=Mo({store:t?cs(t):void 0}),s=async({wfjs:g,def:h})=>{if(typeof g=="string"){let b=await jl(g),k=r.validate(b);if(!k.ok)throw new Error(`wfjs \u7F16\u8BD1\u901A\u8FC7\u4F46\u6821\u9A8C\u5931\u8D25\uFF1A${k.errors.map(_=>`${_.path}: ${_.message}`).join("\uFF1B")}`);return{def:b,wfjs:or(b)}}if(h){let b=r.validate(h);if(!b.ok)throw new Error(`DSL \u6821\u9A8C\u5931\u8D25\uFF1A${b.errors.map(_=>`${_.path}: ${_.message}`).join("\uFF1B")}`);let k=h;return{def:k,wfjs:or(k)}}throw new Error("\u521B\u5EFA workflow \u9700\u8981 wfjs \u6E90\u7801\u6216 DSL def")},o=async(g,h)=>{try{let b=await r.execute(g,{input:h});return{status:b.status,result:b,error:b.status==="error"?b.error??"\u6267\u884C\u5931\u8D25":null}}catch(b){return{status:"error",result:null,error:b.message}}},i="id, app_id, name, description, def_json, src_wfjs, status, cron, created_at, updated_at",a="id, app_id, workflow_id, trigger, status, args_json, result_json, error, started_at, finished_at, created_at",l=g=>typeof g=="string"?JSON.parse(g):g,u=g=>typeof g=="string"?JSON.parse(g):g,c=g=>({...g,def_json:l(g.def_json)}),d=g=>({...g,args_json:l(g.args_json),result_json:l(g.result_json)}),p={async create(g,h){let{def:b,wfjs:k}=await s(h),_=await e.query.insert(Qt).values({app_id:g,name:h.name,description:h.description??null,def_json:JSON.stringify(b),src_wfjs:k,cron:h.cron??null}).returning(...i.split(", ")).run(),v=c(_[0]);return await e.query.insert(ps).values({app_id:g,workflow_id:v.id,def_json:JSON.stringify(b),note:"\u521D\u59CB\u7248\u672C"}).run(),v},async list(g,h){let b=h?.offset??0,k=Math.min(100,Math.max(1,h?.limit??50)),v=(await e.query.from(Qt).where({app_id:{eq:g}}).select(...i.split(", ")).orderBy("updated_at","desc").limit(k).offset(b).run()).map(S=>c(S));for(let S of v){let A=await e.query.from(ir).where({workflow_id:{eq:S.id},app_id:{eq:g}}).orderBy("created_at","desc").limit(1).run();S.last_run=A[0]?d(A[0]):null}return v},async get(g,h){let b=await e.query.from(Qt).where({app_id:{eq:g},id:{eq:h}}).select(...i.split(", ")).limit(1).run();return b[0]?c(b[0]):null},async update(g,h,b){if(!(await e.query.from(Qt).where({app_id:{eq:g},id:{eq:h}}).select("id").limit(1).run())[0])return!1;let _=null;if((b.wfjs!==void 0||b.def!==void 0)&&(_=await s(b)),b.cron!==void 0&&b.cron!==null&&b.cron!=="")try{Ul(String(b.cron))}catch(S){throw new T(`cron \u8868\u8FBE\u5F0F\u975E\u6CD5\uFF1A${String(S?.message??S)}`,400)}let v={};return b.name!==void 0&&(v.name=b.name),b.cron!==void 0&&(v.cron=b.cron||null),_&&(v.def_json=JSON.stringify(_.def),v.src_wfjs=_.wfjs,await e.query.insert(ps).values({app_id:g,workflow_id:h,def_json:JSON.stringify(_.def),note:b.note??null}).run()),v.updated_at=new Date().toISOString(),await e.query.update(Qt).set(v).where({app_id:{eq:g},id:{eq:h}}).run(),!0},async listVersions(g,h,b){let k=b?.offset??0,_=Math.min(100,Math.max(1,b?.limit??30));return(await e.query.from(ps).where({app_id:{eq:g},workflow_id:{eq:h}}).select(..."id, app_id, workflow_id, def_json, note, created_at".split(", ")).orderBy("created_at","desc").limit(_).offset(k).run()).map(S=>{let A=S;return{...A,def_json:u(A.def_json)}})},async rollback(g,h,b){let k=await e.query.from(ps).where({app_id:{eq:g},workflow_id:{eq:h},id:{eq:b}}).select(..."id, def_json".split(", ")).limit(1).run();if(!k[0]||!await p.get(g,h))return!1;let v=u(k[0].def_json);return await e.query.update(Qt).set({def_json:JSON.stringify(v),src_wfjs:or(v),updated_at:new Date().toISOString()}).where({app_id:{eq:g},id:{eq:h}}).run(),await e.query.insert(ps).values({app_id:g,workflow_id:h,def_json:JSON.stringify(v),note:`\u56DE\u6EDA\u81EA ${b.slice(0,8)}`}).run(),!0},async remove(g,h){return await e.query.delete(Qt).where({app_id:{eq:g},id:{eq:h}}).run(),!0},async listRuns(g,h,b){let k=b?.offset??0,_=Math.min(100,Math.max(1,b?.limit??50));return(await e.query.from(ir).where({app_id:{eq:g},workflow_id:{eq:h}}).select(...a.split(", ")).orderBy("created_at","desc").limit(_).offset(k).run()).map(S=>d(S))},async getRun(g,h,b){let k=await e.query.from(ir).where({app_id:{eq:g},id:{eq:b},workflow_id:{eq:h}}).select(...a.split(", ")).limit(1).run();return k[0]?d(k[0]):null}},f=async(g,h,b,k="manual")=>{let _=await p.get(g,h);if(!_)throw new Error("workflow \u4E0D\u5B58\u5728");let v=new Date().toISOString(),S=await e.query.insert(ir).values({app_id:g,workflow_id:h,trigger:k,status:"running",args_json:JSON.stringify(b),result_json:null,error:null,started_at:v,finished_at:null}).returning(...a.split(", ")).run(),A=String(S[0].id);try{let C=await o(_.def_json,b),W=await e.query.update(ir).set({status:C.status,result_json:JSON.stringify(C.result),error:C.error,finished_at:new Date().toISOString()}).where({id:{eq:A}}).returning(...a.split(", ")).run();return d(W[0])}catch(C){return await e.query.update(ir).set({status:"error",error:C.message,finished_at:new Date().toISOString()}).where({id:{eq:A}}).run(),d({status:"error",error:C.message})}},w={crud:p,compileGate:s,validate:g=>r.validate(g),execute:f,executeDef:o,dag:g=>Il(g),schema:()=>Ol(r.stepSchemas()),defToWfjs:g=>or(g)},m=(async(g,h,b)=>(h.wf=w,b(g,h)));return m.wf=w,m.crud=p,m.scheduler=U_(e,f),m.__meta={injects:["wf"],depends:[]},m.routes=(g,h)=>{let b=h?.prefix??n.prefix??"/api/workflows",k=h?.appId??(S=>S.auth?.appId),_=S=>{let A=k(S);if(!A)throw new T("workflow route \u9700\u8981 appId\uFF08\u5E94\u7528\u4E0A\u4E0B\u6587\uFF09",400);return A},v=(S,A=200)=>Response.json(S,{status:A});g.get(`${b}/:id/versions`,async(S,A)=>await p.get(_(A),A.params.id)?v({versions:await p.listVersions(_(A),A.params.id)}):v({error:"workflow \u4E0D\u5B58\u5728"},404)),g.post(`${b}/:id/versions/:vid/rollback`,async(S,A)=>await p.rollback(_(A),A.params.id,A.params.vid)?v({ok:!0}):v({error:"workflow \u6216\u7248\u672C\u4E0D\u5B58\u5728"},404)),g.get(`${b}/meta`,async(S,A)=>v({schemas:w.schema()})),g.get(`${b}`,async(S,A)=>{let C=new URL(S.url),W=Math.max(0,parseInt(C.searchParams.get("offset")??"0",10)),G=Math.min(100,Math.max(1,parseInt(C.searchParams.get("limit")??"50",10)));return v({workflows:await p.list(_(A),{offset:W,limit:G})})}),g.post(`${b}`,async(S,A)=>{let C=await S.json().catch(()=>({}));if(!C?.name)return v({error:"\u5FC5\u586B\uFF1Aname"},400);try{let W=await p.create(_(A),C);return v({ok:!0,workflow:W},201)}catch(W){return v({error:W.message},400)}}),g.get(`${b}/:id`,async(S,A)=>{let C=await p.get(_(A),A.params.id);return C?v({workflow:{...C,def:C.def_json,wfjs:C.src_wfjs,dag:w.dag(C.def_json)}}):v({error:"workflow \u4E0D\u5B58\u5728"},404)}),g.put(`${b}/:id`,async(S,A)=>{let C=await S.json().catch(()=>({}));try{if(C.patch){let G=await p.get(_(A),A.params.id);if(!G)return v({error:"workflow \u4E0D\u5B58\u5728"},404);let U=C.patch,F;if(U.op==="insert"){if(!U.step?.type)return v({error:"insert \u9700\u8981 step.type"},400);F=Hp(G.def_json,U.anchor??null,U.chain??[],U.step)}else if(U.op==="remove")F=Fp(G.def_json,U.path);else{if(!U.config)return v({error:"set \u9700\u8981 config"},400);F=Up(G.def_json,U.path,U.config)}let K=w.validate(F);return K.ok?(await p.update(_(A),A.params.id,{def:F}),v({ok:!0})):v({error:`patch \u6821\u9A8C\u5931\u8D25\uFF1A${K.errors.map(M=>M.message).join("\uFF1B")}`},400)}return await p.update(_(A),A.params.id,C)?v({ok:!0}):v({error:"workflow \u4E0D\u5B58\u5728"},404)}catch(W){return v({error:W.message},400)}}),g.delete(`${b}/:id`,async(S,A)=>(await p.remove(_(A),A.params.id),v({ok:!0}))),g.post(`${b}/:id/runs`,async(S,A)=>{let C=await S.json().catch(()=>({}));try{let W=await f(_(A),A.params.id,C.args??{});return v({ok:!0,run:W},201)}catch(W){return v({error:W.message},400)}}),g.get(`${b}/:id/runs`,async(S,A)=>{if(!await p.get(_(A),A.params.id))return v({error:"workflow \u4E0D\u5B58\u5728"},404);let W=new URL(S.url),G=Math.max(0,parseInt(W.searchParams.get("offset")??"0",10)),U=Math.min(100,Math.max(1,parseInt(W.searchParams.get("limit")??"50",10)));return v({runs:await p.listRuns(_(A),A.params.id,{offset:G,limit:U})})}),g.get(`${b}/:id/runs/:runId`,async(S,A)=>{let C=await p.getRun(_(A),A.params.id,A.params.runId);return C?v({run:C}):v({error:"run \u4E0D\u5B58\u5728"},404)})},m}var Qt,ir,ps,Do,Yp=I(()=>{"use strict";bn();Jn();Ke();$o();Xp();$o();Pl();Qt="_weifuwu_workflows",ir="_weifuwu_workflow_runs",ps="_weifuwu_workflow_versions";Do={tables:[{name:"_weifuwu_workflows",columns:{id:R.pk(y.uuid()),app_id:R.req(y.uuid()),name:R.req(y.string()),description:y.string(),def_json:y.json().meta({notNull:!0}),src_wfjs:y.string(),status:y.string().meta({default:"active"}),cron:y.string(),created_at:y.date().meta({default:"now"}),updated_at:y.date().meta({default:"now"})},indexes:[{cols:["app_id",{col:"updated_at",desc:!0}],name:"idx_wf_workflows_app"}]},{name:"_weifuwu_workflow_runs",columns:{id:R.pk(y.uuid()),app_id:R.req(y.uuid()),workflow_id:R.req(y.uuid()).meta({references:"_weifuwu_workflows",onDelete:"cascade"}),trigger:y.string().meta({default:"manual"}),status:y.string().meta({default:"queued"}),args_json:y.json(),result_json:y.json(),error:y.string(),started_at:y.date(),finished_at:y.date(),created_at:y.date().meta({default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_wf_runs_app"},{cols:["workflow_id",{col:"created_at",desc:!0}],name:"idx_wf_runs_wf"}]},{name:"_weifuwu_workflow_versions",columns:{id:R.pk(y.uuid()),app_id:R.req(y.uuid()),workflow_id:R.req(y.uuid()).meta({references:"_weifuwu_workflows",onDelete:"cascade"}),def_json:y.json().meta({notNull:!0}),note:y.string(),created_at:y.date().meta({default:"now"})},indexes:[{cols:["workflow_id",{col:"created_at",desc:!0}],name:"idx_wf_versions_wf"}]}]}});import{randomUUID as B_}from"node:crypto";import{hostname as H_}from"node:os";function jo(n){let e=n.redis,t=n.prefix??"q:",r=l=>`${t}${l}`,s=l=>`${t}${l}:dead`;async function o(l,u){let c=await e.command("XADD",r(l),"*","payload",JSON.stringify(u));return String(c)}let i={async add(l,u,c){return{id:await o(l,{id:B_(),name:l,data:u,attempts:0,maxAttempts:c?.attempts??3,addedAt:Date.now()})}},length:async l=>Number(await e.command("XLEN",r(l))),worker(l,u,c){let d=c?.consumer??`${H_()}-${process.pid}-${Math.random().toString(36).slice(2,6)}`,p=c?.concurrency??1,f=c?.visibilityTimeout??3e4,w=c?.blockMs??1e3,m=r(l),g=s(l),h=`${t}${l}:delayed`,b=!1,k=0,_=0,v=null,S=-1,A=500,C=new Map,W=new Set;function G(){let q=v;v=null,S=-1,q?.close().catch(()=>{})}async function U(q){let B=q instanceof Error?q.message:String(q);return/pool is closed/.test(B)?!1:(G(),await new Promise($=>setTimeout($,A)),A=Math.min(A*2,5e3),!0)}function F(){A=500}async function K(q){if(v&&S===q)return v;if(v){let $=v;v=null,S=-1,await $.close().catch(()=>{})}let B=await e.createConnection();return v=B,S=q,B}async function M(){let q;for(let B=0;B<3;B++)try{await v.command("XGROUP","CREATE",m,Tn,"0","MKSTREAM");return}catch($){if(String($.message).includes("BUSYGROUP"))return;q=$,B<2&&await new Promise(j=>setTimeout(j,50))}throw q}async function O(q,B){let $;try{$=JSON.parse(B.payload??"{}")}catch{await v.command("XADD",g,"*","payload",JSON.stringify({originalId:q,name:l,error:"unparseable payload",attempts:-1})),await v.command("XACK",m,Tn,q);return}let j=Number($.attempts??0),H=Number($.maxAttempts??3);try{await u({id:q,name:l,data:$.data,attempts:j}),await v.command("XACK",m,Tn,q)}catch(z){let Y=j+1;Y>=H?(await v.command("XADD",g,"*","payload",JSON.stringify({originalId:q,name:l,data:$.data,error:z instanceof Error?z.message:String(z),attempts:Y})),await v.command("XACK",m,Tn,q),console.error(`[queue] ${l} job failed permanently (attempt ${Y}/${H}):`,z)):(await v.command("ZADD",h,String(Date.now()+f),JSON.stringify({...$,attempts:Y})),await v.command("XACK",m,Tn,q),console.error(`[queue] ${l} job failed (attempt ${Y}/${H}), retry in ${f}ms:`,z))}}async function E(){let q=Date.now(),B;try{B=await v.command("ZRANGEBYSCORE",h,0,q)}catch($){if(Bl($)){if(await U($))return;b=!1;return}b&&N()&&console.error("[queue] ZRANGEBYSCORE:",$ instanceof Error?$.message:$);return}for(let $ of B)await v.command("ZREM",h,$)&&await v.command("XADD",m,"*","payload",$)}async function x(){try{let B=(await v.command("XAUTOCLAIM",m,Tn,d,f,"0","COUNT",String(p)))[1];for(let[$,j]of B)await O($,em(j))}catch(q){if(Bl(q)){if(await U(q))return;b=!1;return}if(await P(q))return;b&&N()&&console.error("[queue] XAUTOCLAIM:",q instanceof Error?q.message:q)}}async function P(q){let B=q instanceof Error?q.message:String(q);if(!/NOGROUP/.test(B))return!1;try{return await M(),!0}catch{return!1}}function N(){let q=Date.now();return q-k>5e3?(k=q,!0):!1}async function D(q){for(;b&&q===_;){if(!v||S!==q){try{await K(q)}catch(H){b&&N()&&console.error("[queue] reconnect:",H instanceof Error?H.message:H),await new Promise(z=>setTimeout(z,A)),A=Math.min(A*2,5e3);continue}F()}if(await x(),await E(),W.size>=p){await Promise.race([...W].map(H=>H.catch(()=>{})));continue}let B;try{B=await v.command("XREADGROUP","GROUP",Tn,d,"COUNT",String(p-W.size),"BLOCK",String(w),"STREAMS",m,">"),F()}catch(H){if(Bl(H)){if(await U(H))continue;b=!1;return}if(await P(H))continue;b&&N()&&console.error("[queue] XREADGROUP:",H instanceof Error?H.message:H);continue}if(!B)continue;let j=B[0][1];for(let[H,z]of j){let Y=O(H,em(z));W.add(Y),Y.finally(()=>W.delete(Y)).catch(()=>{})}}}return{start:async()=>{if(b)return;b=!0;let q=_;try{await K(q),await M()}catch($){if(b=!1,v){let j=v;v=null,S=-1,await j.close().catch(()=>{})}throw $}let B=D(q);C.set(q,B),B.finally(()=>C.delete(q)).catch($=>console.error("[queue] worker loop crashed:",$))},stop:async()=>{if(!b){await Promise.allSettled([...C.values()]);return}_++,b=!1;let q=v;v=null,S=-1;let B=[...C.entries()].filter(([$])=>$<_).map(([,$])=>$);await Promise.allSettled([...W]),await Promise.allSettled(B),await q?.close().catch(()=>{})}}}},a=(async(l,u,c)=>(u.queue=i,c(l,u)));return a.__meta={injects:["queue"],depends:[]},a.queue=i,a.close=async()=>{},a}function em(n){let e={};for(let t=0;t+1<n.length;t+=2)e[String(n[t])]=String(n[t+1]);return e}function Bl(n){let e=n instanceof Error?n.message:String(n);return/pool is closed|connection closed/.test(e)}var Tn,tm=I(()=>{"use strict";Tn="workers"});function V_(n,e){let[t,r]=F_[e],s=["minute","hour","day","month","weekday"][e];if(n==="*")return null;if(n.startsWith("*/")){let i=Number(n.slice(2));if(!Number.isInteger(i)||i<=0||i>r)throw new Error(`cron: invalid step '${n}' in ${s} field (must be 1..${r})`);let a=new Set;for(let l=t;l<=r;l+=i)a.add(l);return a}let o=new Set;for(let i of n.split(",")){if(i==="")throw new Error(`cron: empty item in '${n}' (${s})`);if(i.includes("-")){let[a,l]=i.split("/"),u=l!==void 0?Number(l):1,[c,d]=a.split("-").map(Number);if(!Number.isInteger(c)||!Number.isInteger(d)||c<t||d>r||c>d)throw new Error(`cron: invalid range '${i}' in ${s} field (${t}..${r})`);if(!Number.isInteger(u)||u<=0)throw new Error(`cron: invalid step in '${i}'`);for(let p=c;p<=d;p+=u)o.add(p)}else{let a=Number(i);if(!Number.isInteger(a)||a<t||a>r)throw new Error(`cron: value '${i}' out of range ${t}..${r} in ${s} field`);o.add(a)}}return o}function Fl(n){let e=n.trim().split(/\s+/);if(e.length!==5)throw new Error(`cron: expected 5 fields (min hour dom month dow), got ${e.length}: '${n}'`);let t=e.map((r,s)=>V_(r,s));return{fields:t.map(r=>({values:r})),domExplicit:t[2]!==null,dowExplicit:t[4]!==null}}function Hl(n,e){return n===null?!0:n.has(e)}function z_(n,e,t){let r=Hl(n.fields[2].values,e),s=Hl(n.fields[4].values,t);return n.domExplicit&&n.dowExplicit?r||s:n.domExplicit?r:n.dowExplicit?s:!0}function nm(n,e,t,r){if(n===null)return e;for(let s=e;s<=r;s++)if(n.has(s))return s;return null}function Vl(n,e){let t=new Date(e.getTime());t.setSeconds(0,0),t.setMinutes(t.getMinutes()+1);let r=e.getTime()+5*366*24*3600*1e3;for(;t.getTime()<=r;){let s=t.getFullYear(),o=t.getMonth()+1,i=t.getDate(),a=t.getDay();if(!Hl(n.fields[3].values,o)){t.setMonth(o,1),t.setHours(0,0,0,0),t.setMonth(o);continue}if(!z_(n,i,a)){t.setDate(i+1),t.setHours(0,0,0,0);continue}let l=t.getHours(),u=nm(n.fields[1].values,l,0,23);if(u===null){t.setDate(i+1),t.setHours(0,0,0,0);continue}if(u!==l){t.setHours(u,0,0,0);continue}let c=t.getMinutes(),d=nm(n.fields[0].values,c,0,59);if(d===null){t.setHours(l+1,0,0,0);continue}if(d!==c){t.setMinutes(d,0,0);continue}return t}throw new Error("cron: no next run within 5 years (invalid expression?)")}var F_,rm=I(()=>{"use strict";F_=[[0,59],[0,23],[1,31],[1,12],[0,6]]});import{randomUUID as K_}from"node:crypto";function sm(n){let e=n.prefix??"wf:sched:",t=n.tickMs??1e3,r=`${e}delayed`,s=`${e}crons`,o=n.queue,i=null;function a(){return i||(i=n.redis.createConnection(),i.catch(()=>{i=null})),i}let l=!1,u=null;async function c(){await d();let b;try{b=await(await a()).command("ZRANGEBYSCORE",r,0,Date.now())}catch{return}for(let k of b){let _;try{_=await(await a()).command("ZREM",r,k)}catch{return}if(_===1)try{let v=JSON.parse(k);await o.queue.add(v.name,v.data)}catch(v){console.error("[scheduler] enqueue:",v instanceof Error?v.message:v),await(await a()).command("ZADD",r,Date.now(),k).catch(()=>{})}}}async function d(){let b;try{b=await(await a()).command("HGETALL",s)}catch{return}let k=Date.now(),_=b;for(let v=0;v+1<_.length;v+=2){let S=_[v],A=_[v+1],C;try{C=JSON.parse(A)}catch{continue}let W=Fl(C.expr),G=C.nextRunAt;for(;G<=k;){let U=G,F=JSON.stringify({id:`cron:${S}:${U}`,name:C.name,data:C.data});try{await(await a()).command("ZADD",r,"NX",U,F)}catch{break}G=Vl(W,new Date(U)).getTime()}G!==C.nextRunAt&&await(await a()).command("HSET",s,S,JSON.stringify({...C,nextRunAt:G}))}}let p=async(b,k,_)=>{let v=Fl(b),S=Vl(v,new Date),A=JSON.stringify({expr:b,name:k,data:_,nextRunAt:S.getTime()});await(await a()).command("HSET",s,k,A)},f=async b=>{let k=await(await a()).command("HDEL",s,b);try{let _=await(await a()).command("ZRANGE",r,0,-1);for(let v of _)try{JSON.parse(v).name===b&&await(await a()).command("ZREM",r,v)}catch{}}catch{}return k===1};async function w(){l||(l=!0,await a(),await c(),u=setInterval(()=>{c().catch(b=>console.error("[scheduler] tick:",b instanceof Error?b.message:b))},t),u.unref?.())}let m=async(b,k,_={})=>{let v=_.delayMs??0,S=_.when?_.when.getTime():Date.now()+v;if(!Number.isFinite(S))throw new Error("scheduler: invalid when/delayMs");let A=K_(),C=JSON.stringify({id:A,name:b,data:k});return await(await a()).command("ZADD",r,S,C),{id:A}},g=async b=>{try{let k=await(await a()).command("ZRANGE",r,0,-1);for(let _ of k)try{if(JSON.parse(_).id===b&&await(await a()).command("ZREM",r,_)===1)return!0}catch{}}catch{}return!1},h=(async(b,k,_)=>(k.schedule=m,k.cron=p,k.cancelCron=f,k.cancelSchedule=g,_(b,k)));return h.__meta={injects:["schedule","cron","cancelCron","cancelSchedule"],depends:["queue"]},h.schedule=m,h.cron=p,h.cancelCron=f,h.cancelSchedule=g,h.close=async()=>{l=!1,u&&(clearInterval(u),u=null),i&&await i.then(b=>b.close()).catch(()=>{})},w().catch(b=>console.error("[scheduler] start:",b instanceof Error?b.message:b)),h}var om=I(()=>{"use strict";rm()});function Jt(n,e){let t=new TextEncoder,r=e?.heartbeatMs??15e3,s,o=new ReadableStream({async start(i){let a=(l,u)=>{i.enqueue(t.encode(`event: ${l}
94
94
  data: ${JSON.stringify(u)}
95
95
 
96
- `))};r>0&&(s=setInterval(()=>{try{o.enqueue(t.encode(`: wf-heartbeat
96
+ `))};r>0&&(s=setInterval(()=>{try{i.enqueue(t.encode(`: wf-heartbeat
97
97
 
98
- `))}catch{}},r));try{await n(a),o.close()}catch(l){try{a("wf:error",{code:"provider_error",message:l instanceof Error?l.message:String(l)}),o.close()}catch{o.error(l)}}finally{s&&(clearInterval(s),s=void 0)}},cancel(){s&&(clearInterval(s),s=void 0),e?.onAbort?.()}});return new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}})}var Do=N(()=>{"use strict"});function Hl(n,e){let t=e.apiKey??process.env.DASHSCOPE_API_KEY??"";if(!t)throw new Error(`ai ${n}: DASHSCOPE_API_KEY \u672A\u8BBE\u7F6E\uFF08${n} \u751F\u6210\u9700\u8981\uFF09`);return t}function sm(n){return n.baseUrl??process.env.DASHSCOPE_MAAS_API_URL??"https://dashscope.aliyuncs.com"}function Y_(n){for(let t of n.output?.choices??[])for(let r of t.message?.content??[])if(r.image)return r.image;let e=n.output?.results??[];for(let t of e){if(t?.url)return t.url;if(t?.b64_image)return`data:image/png;base64,${t.b64_image}`}return null}function ev(n){let e=String(n.task_status??"unknown"),t=n.video_url?String(n.video_url):void 0;return e==="SUCCEEDED"&&t?{status:"done",url:t}:e==="FAILED"||e==="CANCELED"?{status:"failed",error:n.message?`${n.message}${n.code?`\uFF08${n.code}\uFF09`:""}`:`\u89C6\u9891\u4EFB\u52A1\u5931\u8D25\uFF08${e}\uFF09`}:e==="PENDING"?{status:"pending"}:{status:"running"}}function om(n={}){let e=sm(n),t=()=>n.model??process.env.DASHSCOPE_IMAGE_MODEL??Q_;return{async generateImage(r,s){let i=Hl("image",n),o=String(r.prompt??"").trim();if(!o)throw new Error("ai image: prompt \u4E3A\u5FC5\u586B");let a=/^\d{2,4}\*\d{2,4}$/.test(r.size??"")?r.size:"1024*1024",l=await fetch(`${e}/api/v1/services/aigc/multimodal-generation/generation`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify({model:r.model??t(),input:{messages:[{role:"user",content:[{text:o}]}]},parameters:{prompt_extend:!1,size:a}}),signal:s?.signal});if(!l.ok){let d=await l.text().catch(()=>"");throw new Error(`\u56FE\u50CF\u751F\u6210\u5931\u8D25 HTTP ${l.status}: ${d.slice(0,300)}`)}let u=await l.json(),c=Y_(u);if(!c)throw new Error(`\u56FE\u50CF\u751F\u6210\u5931\u8D25\uFF1A\u54CD\u5E94\u65E0\u56FE\u7247\uFF08${u.message??u.code??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);return c.startsWith("data:image")?{dataUrl:c,mime:"image/png"}:{url:c}}}}function im(n={}){let e=sm(n),t=()=>n.model??process.env.DASHSCOPE_VIDEO_MODEL??J_;return{async createVideoTask(r,s){let i=Hl("video",n),o=String(r.prompt??"").trim();if(!o)throw new Error("ai video: prompt \u4E3A\u5FC5\u586B");let a=await fetch(`${e}/api/v1/services/aigc/video-generation/video-synthesis`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`,"X-DashScope-Async":"enable"},body:JSON.stringify({model:r.model??t(),input:{prompt:o},parameters:{resolution:Z_.has(r.resolution??"")?r.resolution:"1080P",ratio:X_.has(r.ratio??"")?r.ratio:"16:9",duration:Math.min(15,Math.max(3,Math.round(Number(r.duration??5)||5))),watermark:r.watermark!==!1}}),signal:s?.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`\u89C6\u9891\u4EFB\u52A1\u521B\u5EFA\u5931\u8D25 HTTP ${a.status}: ${c.slice(0,300)}`)}let l=await a.json(),u=l.output?.task_id;if(!u)throw new Error(`\u89C6\u9891\u4EFB\u52A1\u521B\u5EFA\u5931\u8D25\uFF1A\u54CD\u5E94\u65E0 task_id\uFF08${l.message??l.code??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);return{taskId:u}},async videoStatus(r,s){let i=Hl("video",n),o=await fetch(`${e}/api/v1/tasks/${r}`,{headers:{Authorization:`Bearer ${i}`},signal:s?.signal});if(!o.ok)throw new Error(`\u89C6\u9891\u4EFB\u52A1\u67E5\u8BE2\u5931\u8D25 HTTP ${o.status}: ${(await o.text().catch(()=>"")).slice(0,300)}`);let a=await o.json();return ev(a.output??{})}}}var Q_,J_,Z_,X_,am=N(()=>{"use strict";Q_="z-image-turbo",J_="happyhorse-1.1-t2v",Z_=new Set(["480P","720P","1080P"]),X_=new Set(["1:1","16:9","4:3","21:9"])});import{randomUUID as tv}from"node:crypto";async function*nv(n){let e=n.getReader(),t=new TextDecoder,r="";try{for(;;){let{done:s,value:i}=await e.read();if(s)break;r+=t.decode(i,{stream:!0});let o=r.split(`
99
- `);r=o.pop()??"";for(let a of o){let l=a.trim();if(!l||l.startsWith(":"))continue;let u=l.startsWith("data: ")?l.slice(6):l;if(u==="[DONE]")return;try{yield JSON.parse(u)}catch{}}}}finally{e.releaseLock()}}async function Fl(n){let e="";try{let s=await n.json();e=s?.error?.message??JSON.stringify(s)}catch{e=await n.text().catch(()=>"")}let t=n.status,r;return t===401||t===403?r="auth_failed":t===429?r="rate_limited":t>=500?r="provider_error":/context|token|length/i.test(e)?r="context_length":t===400?r="invalid_request":r="provider_error",{code:r,message:e||`provider error (${t})`}}function rv(n){let e=n?.apiKey??process.env.DASHSCOPE_API_KEY??"",t=!!(n?.apiKey||process.env.DASHSCOPE_API_KEY),r=n?.baseUrl??process.env.DASHSCOPE_BASE_URL??"https://dashscope.aliyuncs.com/compatible-mode/v1",s=n?.defaultModel??process.env.DASHSCOPE_EMBEDDING_MODEL??"text-embedding-v4",i=`${r.replace(/\/$/,"")}/embeddings`,o={"Content-Type":"application/json",Authorization:`Bearer ${e}`};async function a(l){if(!t)throw new Rt("unsupported","ai embedding: \u672A\u914D\u7F6E\u2014\u2014\u4F20 ai({ embedding }) \u6216\u8BBE DASHSCOPE_API_KEY\uFF08DeepSeek \u65E0 embedding API\uFF0C\u9700\u72EC\u7ACB provider\uFF09");if(!e)throw new Rt("auth_failed","ai embedding: DASHSCOPE_API_KEY \u672A\u8BBE\u7F6E");let u=new AbortController,c=setTimeout(()=>u.abort(),3e3),d;try{d=await fetch(i,{method:"POST",headers:o,body:JSON.stringify({model:s,input:l}),signal:u.signal})}catch(m){throw u.signal.aborted?new Rt("provider_error","embedding \u8BF7\u6C42\u8D85\u65F6\uFF083s\uFF09"):new Rt("provider_error",m instanceof Error?m.message:String(m))}finally{clearTimeout(c)}if(!d.ok){let{code:m,message:h}=await Fl(d);throw new Rt(m,h)}let p=await d.json();return p.data.sort((m,h)=>m.index-h.index),p.data.map(m=>m.embedding)}return{async embed(l){return(await a([l]))[0]},embedMany:a}}function lm(n){let e=rv(n.embedding),t=om(n.image),r=im(n.video),s=n.firstTokenTimeoutMs??6e4,i=n.streamRetries??0;function o(w){return`${(w.baseUrl??n.baseUrl).replace(/\/$/,"")}/chat/completions`}function a(w){return{"Content-Type":"application/json",Authorization:`Bearer ${w.apiKey??n.apiKey}`}}let l=new Map;function u(w){let y=l.get(w.id);return y?(l.delete(w.id),y(w),!0):!1}async function c(w,y,k=sv,_){let v=Date.now()+k;return y("wf:approval_request",{...w,expiresAt:v}),new Promise(S=>{let A=!1,C=U=>{A||(A=!0,clearTimeout(j),_?.removeEventListener("abort",K),S(U))},j=setTimeout(()=>{l.has(w.id)&&l.delete(w.id),C({id:w.id,decision:"rejected"})},k),K=()=>{l.has(w.id)&&l.delete(w.id),C({id:w.id,decision:"rejected"})};_?.addEventListener("abort",K,{once:!0}),l.set(w.id,U=>{l.has(w.id)&&l.delete(w.id),C(U)})})}function d(w){let y=new Map,k=[];for(let _ of w){let v=_.choices[0]?.delta;if(v?.tool_calls)for(let S of v.tool_calls){let A=S.index??0,C=y.get(A);C||(C={id:S.id??`tc_${A}`,type:"function",function:{name:S.function?.name??"",arguments:""}},y.set(A,C),k.push(A)),S.id&&(C.id=S.id),S.function?.name&&(C.function.name=S.function.name),S.function?.arguments&&(C.function.arguments+=S.function.arguments)}}return k.map(_=>y.get(_))}async function p(w,y){let k=await fetch(o(w),{method:"POST",headers:a(w),body:JSON.stringify({...w,model:w.model??n.defaultModel,stream:!1}),signal:y?.signal});if(!k.ok){let{code:_,message:v}=await Fl(k);throw new Rt(_,v)}return k.json()}function m(w,y){let k=new AbortController,_=y?.signal,v=()=>k.abort();return _&&(_.aborted?k.abort():_.addEventListener("abort",v,{once:!0})),Jt(async S=>{try{S("wf:message_start",{id:y?.traceId??tv()}),await h(w,{emit:S,signal:k.signal,onFinish:A=>S("wf:done",{content:A.content,usage:A.usage,...A.reasoning_content?{reasoning:A.reasoning_content}:{}})})}finally{_?.removeEventListener("abort",v)}},{onAbort:()=>k.abort()})}async function h(w,y){let{emit:k,signal:_,onFinish:v}=y,S=y.retries??i;for(let A=0;;A++){let C=await f(w,_,k,v,y.emitUsage!==!1);if(C==="ok"||C==="terminal")return;if(C.retryable&&A<S){await new Promise(j=>setTimeout(j,250));continue}k("wf:error",{code:C.code,message:C.message});return}}async function f(w,y,k,_,v){let S=new AbortController,A=()=>S.abort();y?.addEventListener("abort",A,{once:!0});let C=!1,j;s>0&&(j=setTimeout(()=>{C=!0,S.abort()},s));let K=()=>k("wf:error",{code:"timeout",message:`\u63D0\u4F9B\u5546\u9996 token \u8D85\u65F6\uFF08${s}ms\uFF09`});try{let U;try{U=await fetch(o(w),{method:"POST",headers:a(w),body:JSON.stringify({...w,model:w.model??n.defaultModel,stream:!0}),signal:S.signal})}catch(x){return C?(K(),"terminal"):y?.aborted?"terminal":{code:"provider_error",message:x instanceof Error?x.message:String(x),retryable:!0}}if(!U.ok){let{code:x,message:O}=await Fl(U);return{code:x,message:O,retryable:x==="rate_limited"||x==="provider_error"}}let H="",V="",Q=[],P;try{for await(let x of nv(U.body)){if(j&&(clearTimeout(j),j=void 0),S.signal.aborted)return C&&K(),"terminal";let O=x.choices[0]?.delta;O?.content&&(H+=O.content,k("wf:token",{text:O.content})),O?.reasoning_content&&(V+=O.reasoning_content),O?.tool_calls&&Q.push(x),x.usage&&(P=x.usage)}}catch(x){return C?(K(),"terminal"):(y?.aborted||k("wf:error",{code:"provider_error",message:x instanceof Error?x.message:String(x)}),"terminal")}let E=d(Q);for(let x of E)k("wf:tool_call",{id:x.id,name:x.function?.name??"",args:jo(x.function?.arguments??"")});return P&&v&&k("wf:usage",P),_?.({content:H,reasoning_content:V||void 0,toolCalls:E,usage:P}),"ok"}finally{j&&clearTimeout(j),y?.removeEventListener("abort",A)}}function g(w,y){let k=new AbortController,_=y?.signal,v=()=>k.abort();return _&&(_.aborted?k.abort():_.addEventListener("abort",v,{once:!0})),Jt(async S=>{try{await w(S)}finally{_?.removeEventListener("abort",v)}},{onAbort:()=>k.abort()})}return{chat:p,stream:m,sse:g,streamStep:h,waitApproval:c,approve:u,embed:w=>e.embed(w),embedMany:w=>e.embedMany(w),generateImage:(w,y)=>t.generateImage(w,y),createVideoTask:(w,y)=>r.createVideoTask(w,y),videoStatus:(w,y)=>r.videoStatus(w,y),close:async()=>{}}}function jo(n){if(!n)return{};try{return JSON.parse(n)}catch{return{}}}var Rt,sv,Lo=N(()=>{"use strict";Do();am();Rt=class extends Error{code;constructor(e,t){super(t),this.name="AiError",this.code=e}};sv=5*6e4});import{randomUUID as Vl}from"node:crypto";function um(n,e){let t=e.maxSteps??10,r=e.tools.map(u=>({type:"function",function:{name:u.name,description:u.description??"",parameters:u.parameters??{}}}));function s(u){let c=new AbortController,d=()=>c.abort();return u&&(u.aborted?c.abort():u.addEventListener("abort",d,{once:!0})),{signal:c.signal,abort:()=>c.abort(),release:()=>u?.removeEventListener("abort",d)}}async function i(u,c){let{signal:d,release:p}=s(c?.signal),m=c?.emit??(()=>{});try{m("wf:message_start",{id:c?.traceId??Vl()}),await l(u,m,d)}finally{p()}}function o(u,c){let{signal:d,abort:p,release:m}=s(c?.signal);return Jt(async h=>{try{h("wf:message_start",{id:c?.traceId??Vl()}),await l(u,h,d)}finally{m()}},{onAbort:()=>p()})}async function a(u,c){let d="",p=[],m,h=(w,y)=>{if(w==="wf:token")d+=y.text;else if(w==="wf:step"){let k=y;k.type==="llm"?p.push({type:"llm",content:k.content}):p.push({type:"tool_call",toolCall:{id:k.toolCallId??"",name:k.name??"",arguments:""}})}else if(w==="wf:tool_result"){let k=y,_=p[p.length-1];_&&_.type==="tool_call"&&(p[p.length-1]={type:"tool_result",toolCall:_.toolCall,toolResult:k.ok?JSON.stringify(k.output??""):`Error: ${k.error?.message??"unknown"}`})}else w==="wf:usage"&&(m=y)},{signal:f,release:g}=s(c?.signal);try{await l(u,h,f)}finally{g()}return{content:d,steps:p,usage:m}}async function l(u,c,d){let p=[{role:"system",content:e.systemPrompt},...u],m={prompt_tokens:0,completion_tokens:0,total_tokens:0},h="";for(let f=0;f<t;f++){if(d?.aborted)return;c("wf:step",{type:"llm"});let g={content:"",toolCalls:[]};if(await n.streamStep({model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl,messages:p,tools:r},{emit:c,signal:d,emitUsage:!1,onFinish:k=>{g=k,k.content&&(h+=k.content),k.usage&&(m.prompt_tokens+=k.usage.prompt_tokens??0,m.completion_tokens+=k.usage.completion_tokens??0,m.total_tokens+=k.usage.total_tokens??0)}}),d?.aborted)return;if(!g.toolCalls?.length){c("wf:usage",m),c("wf:done",{content:h,usage:m,reasoning:g.reasoning_content});return}p.push({role:"assistant",content:g.content??"",reasoning_content:g.reasoning_content,tool_calls:g.toolCalls});let w=[],y=async k=>{if(d?.aborted)return;let _=k.function?.name??"",v=jo(k.function?.arguments??"");c("wf:step",{type:"tool",toolCallId:k.id,name:_,args:k.function?.arguments??"{}"});let S=v;if(typeof e.humanInTheLoop=="function"?e.humanInTheLoop({name:_,args:v}):!!e.humanInTheLoop){let j=await n.waitApproval({id:Vl(),toolCallId:k.id,name:_,args:v},c,e.approvalTimeoutMs,d);if(j.decision==="rejected"){c("wf:tool_result",{id:k.id,ok:!1,error:{code:"rejected",message:j.note??"\u7528\u6237\u62D2\u7EDD"}}),w.push({role:"tool",content:`Human rejected: ${j.note??""}`,tool_call_id:k.id,name:_});return}j.decision==="modified"&&j.modifiedArgs&&(S=j.modifiedArgs)}let C=e.tools.find(j=>j.name===_);if(!C){c("wf:tool_result",{id:k.id,ok:!1,error:{code:"tool_error",message:`\u5DE5\u5177\u4E0D\u5B58\u5728: ${_}`}}),w.push({role:"tool",content:`Error: tool not found: ${_}`,tool_call_id:k.id,name:_});return}try{let j=await C.run(S,{emit:c,signal:d,...e.toolContext?{context:e.toolContext}:{}});c("wf:tool_result",{id:k.id,ok:!0,output:j}),w.push({role:"tool",content:JSON.stringify(j??""),tool_call_id:k.id,name:_})}catch(j){let K=j instanceof Error?j.message:String(j);c("wf:tool_result",{id:k.id,ok:!1,error:{code:"tool_error",message:K}}),w.push({role:"tool",content:`Error: ${K}`,tool_call_id:k.id,name:_})}};if(e.parallelTools&&g.toolCalls.length>1)if(g.toolCalls.some(_=>{let v=_.function?.name??"",S=jo(_.function?.arguments??"");return typeof e.humanInTheLoop=="function"?e.humanInTheLoop({name:v,args:S}):!!e.humanInTheLoop}))for(let _ of g.toolCalls)await y(_);else await Promise.all(g.toolCalls.map(_=>y(_)));else for(let k of g.toolCalls)await y(k);for(let k of g.toolCalls){let _=w.find(v=>v.tool_call_id===k.id);_&&p.push(_)}}c("wf:usage",m),c("wf:done",{content:h,usage:m})}return{run:o,stream:i,runToResult:a}}var cm=N(()=>{"use strict";Do();Lo()});function Wo(n){let e=(r,s,i)=>(s.ai=t,i(r,s));e.__meta={injects:["ai"],depends:[]};let t=e;return t.chat=n.chat,t.stream=n.stream,t.sse=n.sse,t.streamStep=n.streamStep,t.waitApproval=n.waitApproval,t.approve=n.approve,t.agent=r=>um(n,r),t.embed=n.embed,t.embedMany=n.embedMany,t.generateImage=n.generateImage,t.createVideoTask=n.createVideoTask,t.videoStatus=n.videoStatus,t.close=n.close,t}var zl=N(()=>{"use strict";cm()});function cs(n){let e=n?.apiKey??process.env.DEEPSEEK_API_KEY??"",t=n?.baseUrl??process.env.DEEPSEEK_BASE_URL??"https://api.deepseek.com/v1",r=n?.defaultModel??process.env.DEEPSEEK_MODEL??"deepseek-v4-flash";if(!e)throw new Error("ai: DEEPSEEK_API_KEY \u672A\u8BBE\u7F6E\u3002\u8BF7\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF\u6216\u4F20\u5165 apiKey\uFF08\u6216 provider=memory \u7528\u5185\u5B58\u5B9E\u73B0\uFF09");let s=lm({apiKey:e,baseUrl:t,defaultModel:r,embedding:n?.embedding,image:n?.image,video:n?.video,firstTokenTimeoutMs:n?.firstTokenTimeoutMs,streamRetries:n?.streamRetries});return Wo(s)}var dm=N(()=>{"use strict";Lo();zl()});function pm(n=3e5){let e=new Map;return{approve(t){let r=e.get(t.id);return r?(e.delete(t.id),r(t),!0):!1},async waitApproval(t,r,s=n,i){let o=Date.now()+s;return r("wf:approval_request",{...t,expiresAt:o}),new Promise(a=>{let l=!1,u=p=>{l||(l=!0,clearTimeout(c),i?.removeEventListener("abort",d),a(p))},c=setTimeout(()=>{e.has(t.id)&&e.delete(t.id),u({id:t.id,decision:"rejected"})},s),d=()=>{e.has(t.id)&&e.delete(t.id),u({id:t.id,decision:"rejected"})};i?.addEventListener("abort",d,{once:!0}),e.set(t.id,p=>{e.has(t.id)&&e.delete(t.id),u(p)})})}}}var mm=N(()=>{"use strict"});import{randomUUID as fm}from"node:crypto";function iv(n,e=32){let t=5381,r=new Array(e);for(let i=0;i<e;i++)t=(t<<5)+t^n.charCodeAt(i%n.length)+i*31,t|=0,r[i]=t%1e3/1e3;let s=Math.sqrt(r.reduce((i,o)=>i+o*o,0))||1;return r.map(i=>i/s)}function av(n){return{chat:(e,t)=>n.chat(e,t),stream:(e,t)=>n.stream(e,t),sse:(e,t)=>n.sse(e,t),streamStep:(e,t)=>n.streamStep(e,t),approve:e=>n.approve(e),waitApproval:(e,t,r,s)=>n.waitApproval(e,t,r,s),embed:e=>n.embed(e),embedMany:e=>n.embedMany(e),generateImage:(e,t)=>n.generateImage(e,t),createVideoTask:(e,t)=>n.createVideoTask(e,t),videoStatus:(e,t)=>n.videoStatus(e,t),close:()=>n.close()}}function Uo(n){return Wo(av(new Kl(n)))}function lv(n){if(!n)return{};try{return JSON.parse(n)}catch{return{}}}var Kl,ds,Gl=N(()=>{"use strict";zl();Do();mm();Kl=class n{opts;approvals;model;constructor(e={}){this.opts=e,this.approvals=pm(e.approvalTimeoutMs??3e5),this.model=e.defaultModel??"memory-ai"}async decide(e){if(this.opts.onChat){let s=await this.opts.onChat(e);return{content:s.content,reasoning_content:s.reasoning_content,toolCalls:s.toolCalls??[],usage:s.usage}}let t=[...e.messages].reverse().find(s=>s.role==="user");return{content:`MemoryAI: ${typeof t?.content=="string"?t.content:""}`,toolCalls:[]}}async chat(e,t){let r=await this.decide(e),s={role:"assistant",content:r.content,...r.reasoning_content?{reasoning:r.reasoning_content}:{},...r.toolCalls.length>0?{tool_calls:r.toolCalls}:{}};return{id:fm(),model:e.model??this.model,choices:[{index:0,message:s,finish_reason:r.toolCalls.length>0?"tool_calls":"stop"}],usage:r.usage}}async streamStep(e,t){if(t.signal?.aborted)return;let r=await this.decide(e);if(!t.signal?.aborted){r.content&&t.emit("wf:token",{text:r.content});for(let s of r.toolCalls)t.emit("wf:tool_call",{id:s.id,name:s.function?.name??"",args:lv(s.function?.arguments??"")});r.usage&&t.emitUsage!==!1&&t.emit("wf:usage",r.usage),t.onFinish?.({content:r.content,reasoning_content:r.reasoning_content,toolCalls:r.toolCalls,usage:r.usage})}}stream(e,t){return Jt(async r=>{r("wf:message_start",{id:t?.traceId??fm()}),await this.streamStep(e,{emit:r,signal:t?.signal,onFinish:s=>r("wf:done",{content:s.content,usage:s.usage,...s.reasoning_content?{reasoning:s.reasoning_content}:{}})})},{onAbort:()=>{}})}sse(e,t){return Jt(e,{onAbort:()=>{}})}approve(e){return this.approvals.approve(e)}waitApproval(e,t,r,s){return this.approvals.waitApproval(e,t,r,s)}async embed(e){return(await this.embedMany([e]))[0]}async embedMany(e){return this.opts.onEmbed?this.opts.onEmbed(e):e.map(t=>iv(t))}static TINY_PNG="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async generateImage(e,t){return this.opts.onImage?this.opts.onImage(e):{dataUrl:n.TINY_PNG,mime:"image/png"}}async createVideoTask(e,t){return this.opts.onVideoSubmit?this.opts.onVideoSubmit(e):{taskId:`memory-task-${e.prompt.slice(0,8)||"empty"}`}}async videoStatus(e,t){return this.opts.onVideoStatus?this.opts.onVideoStatus(e):{status:"done",url:`memory://video/${e}`}}async close(){}};ds=Uo});var gm=N(()=>{"use strict";dm();Gl();Lo()});import uv from"node:http";async function Ql(n={}){let e=n.ai??ds(n),t=[],r=uv.createServer((o,a)=>{let l=new URL(o.url??"/","http://localhost"),u=o.method??"GET";(async()=>{let c="";for await(let h of o)c+=h;let d=c?JSON.parse(c):{},p={method:u,path:l.pathname,headers:Object.fromEntries(Object.entries(o.headers).map(([h,f])=>[h,String(f)])),body:d};t.push(p);let m=n.respond?.(p);if(m){if("sse"in m){a.writeHead(200,{"Content-Type":"text/event-stream"});for(let h of m.sse)a.write(h);if(!("hang"in m))a.end();else return}else{if("hang"in m)return;a.writeHead(m.status,Zt),a.end(JSON.stringify(m.body??{}))}return}await cv(e,u,l,o,a,d)})().catch(c=>{a.headersSent||(a.writeHead(500,Zt),a.end(JSON.stringify({error:{message:String(c?.message??c)}})))})});await new Promise(o=>r.listen(n.port??0,"127.0.0.1",o));let s=r.address(),i=typeof s=="object"&&s?s.port:0;return{port:i,url:`http://127.0.0.1:${i}`,requests:t,closeAllConnections:()=>r.closeAllConnections(),close:()=>new Promise(o=>r.close(()=>o()))}}async function Bo(n){let e="";for await(let t of n)e+=t;return e?JSON.parse(e):{}}async function cv(n,e,t,r,s,i){let o=t.pathname;if(e==="POST"&&o==="/v1/chat/completions"){let a=i??await Bo(r),u={messages:a.messages??[],model:String(a.model??"memory-ai")},c=await n.chat(u);if(a.stream===!0){s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache"});let d={id:c.id,object:"chat.completion.chunk",created:Date.now(),model:c.model},p=h=>s.write(`data: ${JSON.stringify(h)}
98
+ `))}catch{}},r));try{await n(a),i.close()}catch(l){try{a("wf:error",{code:"provider_error",message:l instanceof Error?l.message:String(l)}),i.close()}catch{i.error(l)}}finally{s&&(clearInterval(s),s=void 0)}},cancel(){s&&(clearInterval(s),s=void 0),e?.onAbort?.()}});return new Response(o,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}})}var Lo=I(()=>{"use strict"});function zl(n,e){let t=e.apiKey??process.env.DASHSCOPE_API_KEY??"";if(!t)throw new Error(`ai ${n}: DASHSCOPE_API_KEY \u672A\u8BBE\u7F6E\uFF08${n} \u751F\u6210\u9700\u8981\uFF09`);return t}function im(n){return n.baseUrl??process.env.DASHSCOPE_MAAS_API_URL??"https://dashscope.aliyuncs.com"}function X_(n){for(let t of n.output?.choices??[])for(let r of t.message?.content??[])if(r.image)return r.image;let e=n.output?.results??[];for(let t of e){if(t?.url)return t.url;if(t?.b64_image)return`data:image/png;base64,${t.b64_image}`}return null}function Y_(n){let e=String(n.task_status??"unknown"),t=n.video_url?String(n.video_url):void 0;return e==="SUCCEEDED"&&t?{status:"done",url:t}:e==="FAILED"||e==="CANCELED"?{status:"failed",error:n.message?`${n.message}${n.code?`\uFF08${n.code}\uFF09`:""}`:`\u89C6\u9891\u4EFB\u52A1\u5931\u8D25\uFF08${e}\uFF09`}:e==="PENDING"?{status:"pending"}:{status:"running"}}function am(n={}){let e=im(n),t=()=>n.model??process.env.DASHSCOPE_IMAGE_MODEL??G_;return{async generateImage(r,s){let o=zl("image",n),i=String(r.prompt??"").trim();if(!i)throw new Error("ai image: prompt \u4E3A\u5FC5\u586B");let a=/^\d{2,4}\*\d{2,4}$/.test(r.size??"")?r.size:"1024*1024",l=await fetch(`${e}/api/v1/services/aigc/multimodal-generation/generation`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({model:r.model??t(),input:{messages:[{role:"user",content:[{text:i}]}]},parameters:{prompt_extend:!1,size:a}}),signal:s?.signal});if(!l.ok){let d=await l.text().catch(()=>"");throw new Error(`\u56FE\u50CF\u751F\u6210\u5931\u8D25 HTTP ${l.status}: ${d.slice(0,300)}`)}let u=await l.json(),c=X_(u);if(!c)throw new Error(`\u56FE\u50CF\u751F\u6210\u5931\u8D25\uFF1A\u54CD\u5E94\u65E0\u56FE\u7247\uFF08${u.message??u.code??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);return c.startsWith("data:image")?{dataUrl:c,mime:"image/png"}:{url:c}}}}function lm(n={}){let e=im(n),t=()=>n.model??process.env.DASHSCOPE_VIDEO_MODEL??Q_;return{async createVideoTask(r,s){let o=zl("video",n),i=String(r.prompt??"").trim();if(!i)throw new Error("ai video: prompt \u4E3A\u5FC5\u586B");let a=await fetch(`${e}/api/v1/services/aigc/video-generation/video-synthesis`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`,"X-DashScope-Async":"enable"},body:JSON.stringify({model:r.model??t(),input:{prompt:i},parameters:{resolution:J_.has(r.resolution??"")?r.resolution:"1080P",ratio:Z_.has(r.ratio??"")?r.ratio:"16:9",duration:Math.min(15,Math.max(3,Math.round(Number(r.duration??5)||5))),watermark:r.watermark!==!1}}),signal:s?.signal});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`\u89C6\u9891\u4EFB\u52A1\u521B\u5EFA\u5931\u8D25 HTTP ${a.status}: ${c.slice(0,300)}`)}let l=await a.json(),u=l.output?.task_id;if(!u)throw new Error(`\u89C6\u9891\u4EFB\u52A1\u521B\u5EFA\u5931\u8D25\uFF1A\u54CD\u5E94\u65E0 task_id\uFF08${l.message??l.code??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);return{taskId:u}},async videoStatus(r,s){let o=zl("video",n),i=await fetch(`${e}/api/v1/tasks/${r}`,{headers:{Authorization:`Bearer ${o}`},signal:s?.signal});if(!i.ok)throw new Error(`\u89C6\u9891\u4EFB\u52A1\u67E5\u8BE2\u5931\u8D25 HTTP ${i.status}: ${(await i.text().catch(()=>"")).slice(0,300)}`);let a=await i.json();return Y_(a.output??{})}}}var G_,Q_,J_,Z_,um=I(()=>{"use strict";G_="z-image-turbo",Q_="happyhorse-1.1-t2v",J_=new Set(["480P","720P","1080P"]),Z_=new Set(["1:1","16:9","4:3","21:9"])});import{randomUUID as ev}from"node:crypto";async function*tv(n){let e=n.getReader(),t=new TextDecoder,r="";try{for(;;){let{done:s,value:o}=await e.read();if(s)break;r+=t.decode(o,{stream:!0});let i=r.split(`
99
+ `);r=i.pop()??"";for(let a of i){let l=a.trim();if(!l||l.startsWith(":"))continue;let u=l.startsWith("data: ")?l.slice(6):l;if(u==="[DONE]")return;try{yield JSON.parse(u)}catch{}}}}finally{e.releaseLock()}}async function Kl(n){let e="";try{let s=await n.json();e=s?.error?.message??JSON.stringify(s)}catch{e=await n.text().catch(()=>"")}let t=n.status,r;return t===401||t===403?r="auth_failed":t===429?r="rate_limited":t>=500?r="provider_error":/context|token|length/i.test(e)?r="context_length":t===400?r="invalid_request":r="provider_error",{code:r,message:e||`provider error (${t})`}}function nv(n){let e=n?.apiKey??process.env.DASHSCOPE_API_KEY??"",t=!!(n?.apiKey||process.env.DASHSCOPE_API_KEY),r=n?.baseUrl??process.env.DASHSCOPE_BASE_URL??"https://dashscope.aliyuncs.com/compatible-mode/v1",s=n?.defaultModel??process.env.DASHSCOPE_EMBEDDING_MODEL??"text-embedding-v4",o=`${r.replace(/\/$/,"")}/embeddings`,i={"Content-Type":"application/json",Authorization:`Bearer ${e}`};async function a(l){if(!t)throw new Rt("unsupported","ai embedding: \u672A\u914D\u7F6E\u2014\u2014\u4F20 ai({ embedding }) \u6216\u8BBE DASHSCOPE_API_KEY\uFF08DeepSeek \u65E0 embedding API\uFF0C\u9700\u72EC\u7ACB provider\uFF09");if(!e)throw new Rt("auth_failed","ai embedding: DASHSCOPE_API_KEY \u672A\u8BBE\u7F6E");let u=new AbortController,c=setTimeout(()=>u.abort(),3e3),d;try{d=await fetch(o,{method:"POST",headers:i,body:JSON.stringify({model:s,input:l}),signal:u.signal})}catch(f){throw u.signal.aborted?new Rt("provider_error","embedding \u8BF7\u6C42\u8D85\u65F6\uFF083s\uFF09"):new Rt("provider_error",f instanceof Error?f.message:String(f))}finally{clearTimeout(c)}if(!d.ok){let{code:f,message:w}=await Kl(d);throw new Rt(f,w)}let p=await d.json();return p.data.sort((f,w)=>f.index-w.index),p.data.map(f=>f.embedding)}return{async embed(l){return(await a([l]))[0]},embedMany:a}}function cm(n){let e=nv(n.embedding),t=am(n.image),r=lm(n.video),s=n.firstTokenTimeoutMs??6e4,o=n.streamRetries??0;function i(h){return`${(h.baseUrl??n.baseUrl).replace(/\/$/,"")}/chat/completions`}function a(h){return{"Content-Type":"application/json",Authorization:`Bearer ${h.apiKey??n.apiKey}`}}let l=new Map;function u(h){let b=l.get(h.id);return b?(l.delete(h.id),b(h),!0):!1}async function c(h,b,k=rv,_){let v=Date.now()+k;return b("wf:approval_request",{...h,expiresAt:v}),new Promise(S=>{let A=!1,C=U=>{A||(A=!0,clearTimeout(W),_?.removeEventListener("abort",G),S(U))},W=setTimeout(()=>{l.has(h.id)&&l.delete(h.id),C({id:h.id,decision:"rejected"})},k),G=()=>{l.has(h.id)&&l.delete(h.id),C({id:h.id,decision:"rejected"})};_?.addEventListener("abort",G,{once:!0}),l.set(h.id,U=>{l.has(h.id)&&l.delete(h.id),C(U)})})}function d(h){let b=new Map,k=[];for(let _ of h){let v=_.choices[0]?.delta;if(v?.tool_calls)for(let S of v.tool_calls){let A=S.index??0,C=b.get(A);C||(C={id:S.id??`tc_${A}`,type:"function",function:{name:S.function?.name??"",arguments:""}},b.set(A,C),k.push(A)),S.id&&(C.id=S.id),S.function?.name&&(C.function.name=S.function.name),S.function?.arguments&&(C.function.arguments+=S.function.arguments)}}return k.map(_=>b.get(_))}async function p(h,b){let k=await fetch(i(h),{method:"POST",headers:a(h),body:JSON.stringify({...h,model:h.model??n.defaultModel,stream:!1}),signal:b?.signal});if(!k.ok){let{code:_,message:v}=await Kl(k);throw new Rt(_,v)}return k.json()}function f(h,b){let k=new AbortController,_=b?.signal,v=()=>k.abort();return _&&(_.aborted?k.abort():_.addEventListener("abort",v,{once:!0})),Jt(async S=>{try{S("wf:message_start",{id:b?.traceId??ev()}),await w(h,{emit:S,signal:k.signal,onFinish:A=>S("wf:done",{content:A.content,usage:A.usage,...A.reasoning_content?{reasoning:A.reasoning_content}:{}})})}finally{_?.removeEventListener("abort",v)}},{onAbort:()=>k.abort()})}async function w(h,b){let{emit:k,signal:_,onFinish:v}=b,S=b.retries??o;for(let A=0;;A++){let C=await m(h,_,k,v,b.emitUsage!==!1);if(C==="ok"||C==="terminal")return;if(C.retryable&&A<S){await new Promise(W=>setTimeout(W,250));continue}k("wf:error",{code:C.code,message:C.message});return}}async function m(h,b,k,_,v){let S=new AbortController,A=()=>S.abort();b?.addEventListener("abort",A,{once:!0});let C=!1,W;s>0&&(W=setTimeout(()=>{C=!0,S.abort()},s));let G=()=>k("wf:error",{code:"timeout",message:`\u63D0\u4F9B\u5546\u9996 token \u8D85\u65F6\uFF08${s}ms\uFF09`});try{let U;try{U=await fetch(i(h),{method:"POST",headers:a(h),body:JSON.stringify({...h,model:h.model??n.defaultModel,stream:!0}),signal:S.signal})}catch(x){return C?(G(),"terminal"):b?.aborted?"terminal":{code:"provider_error",message:x instanceof Error?x.message:String(x),retryable:!0}}if(!U.ok){let{code:x,message:P}=await Kl(U);return{code:x,message:P,retryable:x==="rate_limited"||x==="provider_error"}}let F="",K="",M=[],O;try{for await(let x of tv(U.body)){if(W&&(clearTimeout(W),W=void 0),S.signal.aborted)return C&&G(),"terminal";let P=x.choices[0]?.delta;P?.content&&(F+=P.content,k("wf:token",{text:P.content})),P?.reasoning_content&&(K+=P.reasoning_content),P?.tool_calls&&M.push(x),x.usage&&(O=x.usage)}}catch(x){return C?(G(),"terminal"):(b?.aborted||k("wf:error",{code:"provider_error",message:x instanceof Error?x.message:String(x)}),"terminal")}let E=d(M);for(let x of E)k("wf:tool_call",{id:x.id,name:x.function?.name??"",args:Wo(x.function?.arguments??"")});return O&&v&&k("wf:usage",O),_?.({content:F,reasoning_content:K||void 0,toolCalls:E,usage:O}),"ok"}finally{W&&clearTimeout(W),b?.removeEventListener("abort",A)}}function g(h,b){let k=new AbortController,_=b?.signal,v=()=>k.abort();return _&&(_.aborted?k.abort():_.addEventListener("abort",v,{once:!0})),Jt(async S=>{try{await h(S)}finally{_?.removeEventListener("abort",v)}},{onAbort:()=>k.abort()})}return{chat:p,stream:f,sse:g,streamStep:w,waitApproval:c,approve:u,embed:h=>e.embed(h),embedMany:h=>e.embedMany(h),generateImage:(h,b)=>t.generateImage(h,b),createVideoTask:(h,b)=>r.createVideoTask(h,b),videoStatus:(h,b)=>r.videoStatus(h,b),close:async()=>{}}}function Wo(n){if(!n)return{};try{return JSON.parse(n)}catch{return{}}}var Rt,rv,Uo=I(()=>{"use strict";Lo();um();Rt=class extends Error{code;constructor(e,t){super(t),this.name="AiError",this.code=e}};rv=5*6e4});import{randomUUID as Gl}from"node:crypto";function dm(n,e){let t=e.maxSteps??10,r=e.tools.map(u=>({type:"function",function:{name:u.name,description:u.description??"",parameters:u.parameters??{}}}));function s(u){let c=new AbortController,d=()=>c.abort();return u&&(u.aborted?c.abort():u.addEventListener("abort",d,{once:!0})),{signal:c.signal,abort:()=>c.abort(),release:()=>u?.removeEventListener("abort",d)}}async function o(u,c){let{signal:d,release:p}=s(c?.signal),f=c?.emit??(()=>{});try{f("wf:message_start",{id:c?.traceId??Gl()}),await l(u,f,d)}finally{p()}}function i(u,c){let{signal:d,abort:p,release:f}=s(c?.signal);return Jt(async w=>{try{w("wf:message_start",{id:c?.traceId??Gl()}),await l(u,w,d)}finally{f()}},{onAbort:()=>p()})}async function a(u,c){let d="",p=[],f,w=(h,b)=>{if(h==="wf:token")d+=b.text;else if(h==="wf:step"){let k=b;k.type==="llm"?p.push({type:"llm",content:k.content}):p.push({type:"tool_call",toolCall:{id:k.toolCallId??"",name:k.name??"",arguments:""}})}else if(h==="wf:tool_result"){let k=b,_=p[p.length-1];_&&_.type==="tool_call"&&(p[p.length-1]={type:"tool_result",toolCall:_.toolCall,toolResult:k.ok?JSON.stringify(k.output??""):`Error: ${k.error?.message??"unknown"}`})}else h==="wf:usage"&&(f=b)},{signal:m,release:g}=s(c?.signal);try{await l(u,w,m)}finally{g()}return{content:d,steps:p,usage:f}}async function l(u,c,d){let p=[{role:"system",content:e.systemPrompt},...u],f={prompt_tokens:0,completion_tokens:0,total_tokens:0},w="";for(let m=0;m<t;m++){if(d?.aborted)return;c("wf:step",{type:"llm"});let g={content:"",toolCalls:[]};if(await n.streamStep({model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl,messages:p,tools:r},{emit:c,signal:d,emitUsage:!1,onFinish:k=>{g=k,k.content&&(w+=k.content),k.usage&&(f.prompt_tokens+=k.usage.prompt_tokens??0,f.completion_tokens+=k.usage.completion_tokens??0,f.total_tokens+=k.usage.total_tokens??0)}}),d?.aborted)return;if(!g.toolCalls?.length){c("wf:usage",f),c("wf:done",{content:w,usage:f,reasoning:g.reasoning_content});return}p.push({role:"assistant",content:g.content??"",reasoning_content:g.reasoning_content,tool_calls:g.toolCalls});let h=[],b=async k=>{if(d?.aborted)return;let _=k.function?.name??"",v=Wo(k.function?.arguments??"");c("wf:step",{type:"tool",toolCallId:k.id,name:_,args:k.function?.arguments??"{}"});let S=v;if(typeof e.humanInTheLoop=="function"?e.humanInTheLoop({name:_,args:v}):!!e.humanInTheLoop){let W=await n.waitApproval({id:Gl(),toolCallId:k.id,name:_,args:v},c,e.approvalTimeoutMs,d);if(W.decision==="rejected"){c("wf:tool_result",{id:k.id,ok:!1,error:{code:"rejected",message:W.note??"\u7528\u6237\u62D2\u7EDD"}}),h.push({role:"tool",content:`Human rejected: ${W.note??""}`,tool_call_id:k.id,name:_});return}W.decision==="modified"&&W.modifiedArgs&&(S=W.modifiedArgs)}let C=e.tools.find(W=>W.name===_);if(!C){c("wf:tool_result",{id:k.id,ok:!1,error:{code:"tool_error",message:`\u5DE5\u5177\u4E0D\u5B58\u5728: ${_}`}}),h.push({role:"tool",content:`Error: tool not found: ${_}`,tool_call_id:k.id,name:_});return}try{let W=await C.run(S,{emit:c,signal:d,...e.toolContext?{context:e.toolContext}:{}});c("wf:tool_result",{id:k.id,ok:!0,output:W}),h.push({role:"tool",content:JSON.stringify(W??""),tool_call_id:k.id,name:_})}catch(W){let G=W instanceof Error?W.message:String(W);c("wf:tool_result",{id:k.id,ok:!1,error:{code:"tool_error",message:G}}),h.push({role:"tool",content:`Error: ${G}`,tool_call_id:k.id,name:_})}};if(e.parallelTools&&g.toolCalls.length>1)if(g.toolCalls.some(_=>{let v=_.function?.name??"",S=Wo(_.function?.arguments??"");return typeof e.humanInTheLoop=="function"?e.humanInTheLoop({name:v,args:S}):!!e.humanInTheLoop}))for(let _ of g.toolCalls)await b(_);else await Promise.all(g.toolCalls.map(_=>b(_)));else for(let k of g.toolCalls)await b(k);for(let k of g.toolCalls){let _=h.find(v=>v.tool_call_id===k.id);_&&p.push(_)}}c("wf:usage",f),c("wf:done",{content:w,usage:f})}return{run:i,stream:o,runToResult:a}}var pm=I(()=>{"use strict";Lo();Uo()});function Bo(n){let e=(r,s,o)=>(s.ai=t,o(r,s));e.__meta={injects:["ai"],depends:[]};let t=e;return t.chat=n.chat,t.stream=n.stream,t.sse=n.sse,t.streamStep=n.streamStep,t.waitApproval=n.waitApproval,t.approve=n.approve,t.agent=r=>dm(n,r),t.embed=n.embed,t.embedMany=n.embedMany,t.generateImage=n.generateImage,t.createVideoTask=n.createVideoTask,t.videoStatus=n.videoStatus,t.close=n.close,t}var Ql=I(()=>{"use strict";pm()});function ms(n){let e=n?.apiKey??process.env.DEEPSEEK_API_KEY??"",t=n?.baseUrl??process.env.DEEPSEEK_BASE_URL??"https://api.deepseek.com/v1",r=n?.defaultModel??process.env.DEEPSEEK_MODEL??"deepseek-v4-flash";if(!e)throw new Error("ai: DEEPSEEK_API_KEY \u672A\u8BBE\u7F6E\u3002\u8BF7\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF\u6216\u4F20\u5165 apiKey\uFF08\u6216 provider=memory \u7528\u5185\u5B58\u5B9E\u73B0\uFF09");let s=cm({apiKey:e,baseUrl:t,defaultModel:r,embedding:n?.embedding,image:n?.image,video:n?.video,firstTokenTimeoutMs:n?.firstTokenTimeoutMs,streamRetries:n?.streamRetries});return Bo(s)}var mm=I(()=>{"use strict";Uo();Ql()});function fm(n=3e5){let e=new Map;return{approve(t){let r=e.get(t.id);return r?(e.delete(t.id),r(t),!0):!1},async waitApproval(t,r,s=n,o){let i=Date.now()+s;return r("wf:approval_request",{...t,expiresAt:i}),new Promise(a=>{let l=!1,u=p=>{l||(l=!0,clearTimeout(c),o?.removeEventListener("abort",d),a(p))},c=setTimeout(()=>{e.has(t.id)&&e.delete(t.id),u({id:t.id,decision:"rejected"})},s),d=()=>{e.has(t.id)&&e.delete(t.id),u({id:t.id,decision:"rejected"})};o?.addEventListener("abort",d,{once:!0}),e.set(t.id,p=>{e.has(t.id)&&e.delete(t.id),u(p)})})}}}var gm=I(()=>{"use strict"});import{randomUUID as hm}from"node:crypto";function ov(n,e=32){let t=5381,r=new Array(e);for(let o=0;o<e;o++)t=(t<<5)+t^n.charCodeAt(o%n.length)+o*31,t|=0,r[o]=t%1e3/1e3;let s=Math.sqrt(r.reduce((o,i)=>o+i*i,0))||1;return r.map(o=>o/s)}function iv(n){return{chat:(e,t)=>n.chat(e,t),stream:(e,t)=>n.stream(e,t),sse:(e,t)=>n.sse(e,t),streamStep:(e,t)=>n.streamStep(e,t),approve:e=>n.approve(e),waitApproval:(e,t,r,s)=>n.waitApproval(e,t,r,s),embed:e=>n.embed(e),embedMany:e=>n.embedMany(e),generateImage:(e,t)=>n.generateImage(e,t),createVideoTask:(e,t)=>n.createVideoTask(e,t),videoStatus:(e,t)=>n.videoStatus(e,t),close:()=>n.close()}}function Ho(n){return Bo(iv(new Jl(n)))}function av(n){if(!n)return{};try{return JSON.parse(n)}catch{return{}}}var Jl,fs,Zl=I(()=>{"use strict";Ql();Lo();gm();Jl=class n{opts;approvals;model;constructor(e={}){this.opts=e,this.approvals=fm(e.approvalTimeoutMs??3e5),this.model=e.defaultModel??"memory-ai"}async decide(e){if(this.opts.onChat){let s=await this.opts.onChat(e);return{content:s.content,reasoning_content:s.reasoning_content,toolCalls:s.toolCalls??[],usage:s.usage}}let t=[...e.messages].reverse().find(s=>s.role==="user");return{content:`MemoryAI: ${typeof t?.content=="string"?t.content:""}`,toolCalls:[]}}async chat(e,t){let r=await this.decide(e),s={role:"assistant",content:r.content,...r.reasoning_content?{reasoning:r.reasoning_content}:{},...r.toolCalls.length>0?{tool_calls:r.toolCalls}:{}};return{id:hm(),model:e.model??this.model,choices:[{index:0,message:s,finish_reason:r.toolCalls.length>0?"tool_calls":"stop"}],usage:r.usage}}async streamStep(e,t){if(t.signal?.aborted)return;let r=await this.decide(e);if(!t.signal?.aborted){r.content&&t.emit("wf:token",{text:r.content});for(let s of r.toolCalls)t.emit("wf:tool_call",{id:s.id,name:s.function?.name??"",args:av(s.function?.arguments??"")});r.usage&&t.emitUsage!==!1&&t.emit("wf:usage",r.usage),t.onFinish?.({content:r.content,reasoning_content:r.reasoning_content,toolCalls:r.toolCalls,usage:r.usage})}}stream(e,t){return Jt(async r=>{r("wf:message_start",{id:t?.traceId??hm()}),await this.streamStep(e,{emit:r,signal:t?.signal,onFinish:s=>r("wf:done",{content:s.content,usage:s.usage,...s.reasoning_content?{reasoning:s.reasoning_content}:{}})})},{onAbort:()=>{}})}sse(e,t){return Jt(e,{onAbort:()=>{}})}approve(e){return this.approvals.approve(e)}waitApproval(e,t,r,s){return this.approvals.waitApproval(e,t,r,s)}async embed(e){return(await this.embedMany([e]))[0]}async embedMany(e){return this.opts.onEmbed?this.opts.onEmbed(e):e.map(t=>ov(t))}static TINY_PNG="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async generateImage(e,t){return this.opts.onImage?this.opts.onImage(e):{dataUrl:n.TINY_PNG,mime:"image/png"}}async createVideoTask(e,t){return this.opts.onVideoSubmit?this.opts.onVideoSubmit(e):{taskId:`memory-task-${e.prompt.slice(0,8)||"empty"}`}}async videoStatus(e,t){return this.opts.onVideoStatus?this.opts.onVideoStatus(e):{status:"done",url:`memory://video/${e}`}}async close(){}};fs=Ho});var wm=I(()=>{"use strict";mm();Zl();Uo()});import lv from"node:http";async function Xl(n={}){let e=n.ai??fs(n),t=[],r=lv.createServer((i,a)=>{let l=new URL(i.url??"/","http://localhost"),u=i.method??"GET";(async()=>{let c="";for await(let w of i)c+=w;let d=c?JSON.parse(c):{},p={method:u,path:l.pathname,headers:Object.fromEntries(Object.entries(i.headers).map(([w,m])=>[w,String(m)])),body:d};t.push(p);let f=n.respond?.(p);if(f){if("sse"in f){a.writeHead(200,{"Content-Type":"text/event-stream"});for(let w of f.sse)a.write(w);if(!("hang"in f))a.end();else return}else{if("hang"in f)return;a.writeHead(f.status,Zt),a.end(JSON.stringify(f.body??{}))}return}await uv(e,u,l,i,a,d)})().catch(c=>{a.headersSent||(a.writeHead(500,Zt),a.end(JSON.stringify({error:{message:String(c?.message??c)}})))})});await new Promise(i=>r.listen(n.port??0,"127.0.0.1",i));let s=r.address(),o=typeof s=="object"&&s?s.port:0;return{port:o,url:`http://127.0.0.1:${o}`,requests:t,closeAllConnections:()=>r.closeAllConnections(),close:()=>new Promise(i=>r.close(()=>i()))}}async function Fo(n){let e="";for await(let t of n)e+=t;return e?JSON.parse(e):{}}async function uv(n,e,t,r,s,o){let i=t.pathname;if(e==="POST"&&i==="/v1/chat/completions"){let a=o??await Fo(r),u={messages:a.messages??[],model:String(a.model??"memory-ai")},c=await n.chat(u);if(a.stream===!0){s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache"});let d={id:c.id,object:"chat.completion.chunk",created:Date.now(),model:c.model},p=w=>s.write(`data: ${JSON.stringify(w)}
100
100
 
101
- `);c.choices[0]?.message?.content&&p({...d,choices:[{index:0,delta:{content:c.choices[0].message.content},finish_reason:null}]});let m=c.choices[0]?.message?.tool_calls;m&&m.length>0&&p({...d,choices:[{index:0,delta:{tool_calls:m},finish_reason:null}]}),p({...d,choices:[{index:0,delta:{},finish_reason:c.choices[0]?.finish_reason??"stop"}],...c.usage?{usage:c.usage}:{}}),s.write(`data: [DONE]
101
+ `);c.choices[0]?.message?.content&&p({...d,choices:[{index:0,delta:{content:c.choices[0].message.content},finish_reason:null}]});let f=c.choices[0]?.message?.tool_calls;f&&f.length>0&&p({...d,choices:[{index:0,delta:{tool_calls:f},finish_reason:null}]}),p({...d,choices:[{index:0,delta:{},finish_reason:c.choices[0]?.finish_reason??"stop"}],...c.usage?{usage:c.usage}:{}}),s.write(`data: [DONE]
102
102
 
103
- `),s.end();return}s.writeHead(200,Zt),s.end(JSON.stringify(c));return}if(e==="POST"&&o==="/v1/embeddings"){let a=i??await Bo(r),l=Array.isArray(a.input)?a.input:[String(a.input??"")],u=await n.embedMany(l);s.writeHead(200,Zt),s.end(JSON.stringify({object:"list",data:u.map((c,d)=>({object:"embedding",index:d,embedding:c}))}));return}if(e==="POST"&&o==="/api/v1/services/aigc/multimodal-generation/generation"){let a=i??await Bo(r),u=(a.input?.messages??[])[0]?.content?.[0]?.text??"",c=await n.generateImage({prompt:u,size:String(a.parameters?.size??"")||void 0});s.writeHead(200,Zt),s.end(JSON.stringify({output:{choices:[{finish_reason:"stop",message:{role:"assistant",content:[{image:c.url??c.dataUrl??""}]}}]}}));return}if(e==="POST"&&o==="/api/v1/services/aigc/video-generation/video-synthesis"){let a=i??await Bo(r),l=String(a.input?.prompt??""),{taskId:u}=await n.createVideoTask({prompt:l,duration:Number(a.parameters?.duration??5)});s.writeHead(200,Zt),s.end(JSON.stringify({output:{task_id:u}}));return}if(e==="GET"&&o.startsWith("/api/v1/tasks/")){let a=o.slice(14),l=await n.videoStatus(a);s.writeHead(200,Zt);let u={pending:{task_status:"PENDING"},running:{task_status:"RUNNING"},done:{task_status:"SUCCEEDED",video_url:l.url},failed:{task_status:"FAILED",message:l.error??"failed"}};s.end(JSON.stringify({output:u[l.status]}));return}s.writeHead(404,Zt),s.end(JSON.stringify({error:{message:`MemoryAiServer: \u4E0D\u652F\u6301 ${e} ${o}`}}))}var Zt,hm,wm=N(()=>{"use strict";Gl();Zt={"Content-Type":"application/json; charset=utf-8"},hm=Ql});function ym(n){let e=[];for(let t of n){let r=`.${t.class}`,s=Ho(r,t.base??{});s&&e.push(s);let i=Ho(`:where(${r})`,t.defaults??{});i&&e.push(i);for(let[o,a]of Object.entries(t.variants??{})){let l=`.${o}`,u=Ho(l,{...t.base??{},...a.cover??{}});u&&e.push(u);let c=Ho(`:where(${l})`,{...t.defaults??{},...a.defaults??{}});c&&e.push(c)}}return e.join(`
104
- `)}var Ho,bm=N(()=>{"use strict";Ho=(n,e)=>e&&Object.keys(e).length?`${n} { ${Object.entries(e).map(([t,r])=>`${t}: ${r};`).join(" ")} }`:""});var _m,vm=N(()=>{"use strict";_m=[{class:"wf-stack",base:{display:"flex","flex-direction":"column"},defaults:{gap:"var(--wf-gap, var(--wf-gap-md))","align-items":"var(--wf-align, stretch)"}},{class:"wf-row",base:{display:"flex","flex-wrap":"wrap"},defaults:{gap:"var(--wf-gap, var(--wf-gap-md))","align-items":"var(--wf-align, center)"},variants:{"wf-row-reverse":{cover:{"flex-direction":"row-reverse"}}}},{class:"wf-items-start",base:{"--wf-align":"flex-start"}},{class:"wf-items-center",base:{"--wf-align":"center"}},{class:"wf-items-end",base:{"--wf-align":"flex-end"}},{class:"wf-items-stretch",base:{"--wf-align":"stretch"}},{class:"wf-grid",base:{display:"grid","grid-template-columns":"var(--wf-cols, repeat(auto-fill, minmax(280px, 1fr)))"},defaults:{gap:"var(--wf-gap, var(--wf-gap-lg))"}},{class:"wf-center",base:{display:"flex","flex-direction":"column","align-items":"center","justify-content":"center"}},{class:"wf-justify-between",base:{display:"flex","justify-content":"space-between"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-justify-end",base:{display:"flex","justify-content":"flex-end"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-justify-center",base:{display:"flex","justify-content":"center"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-fill",base:{flex:"1","min-width":"0","min-height":"0"}},{class:"wf-fill-hover",base:{"border-radius":"var(--wf-radius-sm)",padding:"2px 4px",margin:"-2px -4px",transition:"background 0.15s ease"}},{class:"wf-cover",base:{position:"fixed",inset:"0",display:"flex","align-items":"center","justify-content":"center","z-index":"var(--wf-z, var(--wf-cover-z))"}}]});import{readFile as Sm,readdir as dv}from"node:fs/promises";import{join as ps,resolve as pv}from"node:path";async function hv(n){let e=await Sm(ps(n,"weifuwu-layout.css"),"utf-8"),t=[];for(let r of e.split(`
105
- `)){let s=r.match(/@import\s+['"]([^'"]+)['"]/);s&&t.push(s[1].replace(/^\.\//,""))}if(!t.length)throw new Error(`layout \u5165\u53E3\u65E0 @import\uFF08${n}/weifuwu-layout.css\uFF09\u2014\u2014\u88C5\u914D\u5355\u6E90\u5931\u6548`);return t}async function xm(n){try{let e=await dv(n);return e.includes("weifuwu-layout.css")&&e.some(t=>/^_[a-z-]+\.css$/.test(t))}catch{return!1}}async function Rm(n){let e=pv(n),t=await hv(e),r=[ps(e,"weifuwu-layout.css")],s=[];for(let o of t){if(o==="_stack.css"){r.push(ps(e,"decl.ts"),ps(e,"define.ts")),s.push(`@layer ${km._stack} {
106
- ${ym(_m)}
107
- }`);continue}if(o==="_row.css")continue;let a=ps(e,o);r.push(a);let l=gv(await Sm(a,"utf-8")).trim(),u=o.replace(/\.css$/,""),c=km[u];if(!c)throw new Error(`layout \u6587\u4EF6\u672A\u767B\u8BB0 @layer \u6620\u5C04: ${o}\uFF08\u5728 src/level5/client/layout/bundle.ts LAYER_OF \u4E2D\u767B\u8BB0\uFF09`);s.push(c===fv?l:`@layer ${c} {
103
+ `),s.end();return}s.writeHead(200,Zt),s.end(JSON.stringify(c));return}if(e==="POST"&&i==="/v1/embeddings"){let a=o??await Fo(r),l=Array.isArray(a.input)?a.input:[String(a.input??"")],u=await n.embedMany(l);s.writeHead(200,Zt),s.end(JSON.stringify({object:"list",data:u.map((c,d)=>({object:"embedding",index:d,embedding:c}))}));return}if(e==="POST"&&i==="/api/v1/services/aigc/multimodal-generation/generation"){let a=o??await Fo(r),u=(a.input?.messages??[])[0]?.content?.[0]?.text??"",c=await n.generateImage({prompt:u,size:String(a.parameters?.size??"")||void 0});s.writeHead(200,Zt),s.end(JSON.stringify({output:{choices:[{finish_reason:"stop",message:{role:"assistant",content:[{image:c.url??c.dataUrl??""}]}}]}}));return}if(e==="POST"&&i==="/api/v1/services/aigc/video-generation/video-synthesis"){let a=o??await Fo(r),l=String(a.input?.prompt??""),{taskId:u}=await n.createVideoTask({prompt:l,duration:Number(a.parameters?.duration??5)});s.writeHead(200,Zt),s.end(JSON.stringify({output:{task_id:u}}));return}if(e==="GET"&&i.startsWith("/api/v1/tasks/")){let a=i.slice(14),l=await n.videoStatus(a);s.writeHead(200,Zt);let u={pending:{task_status:"PENDING"},running:{task_status:"RUNNING"},done:{task_status:"SUCCEEDED",video_url:l.url},failed:{task_status:"FAILED",message:l.error??"failed"}};s.end(JSON.stringify({output:u[l.status]}));return}s.writeHead(404,Zt),s.end(JSON.stringify({error:{message:`MemoryAiServer: \u4E0D\u652F\u6301 ${e} ${i}`}}))}var Zt,ym,bm=I(()=>{"use strict";Zl();Zt={"Content-Type":"application/json; charset=utf-8"},ym=Xl});function _m(n){let e=[];for(let t of n){let r=`.${t.class}`,s=Vo(r,t.base??{});s&&e.push(s);let o=Vo(`:where(${r})`,t.defaults??{});o&&e.push(o);for(let[i,a]of Object.entries(t.variants??{})){let l=`.${i}`,u=Vo(l,{...t.base??{},...a.cover??{}});u&&e.push(u);let c=Vo(`:where(${l})`,{...t.defaults??{},...a.defaults??{}});c&&e.push(c)}}return e.join(`
104
+ `)}var Vo,vm=I(()=>{"use strict";Vo=(n,e)=>e&&Object.keys(e).length?`${n} { ${Object.entries(e).map(([t,r])=>`${t}: ${r};`).join(" ")} }`:""});var km,Sm=I(()=>{"use strict";km=[{class:"wf-stack",base:{display:"flex","flex-direction":"column"},defaults:{gap:"var(--wf-gap, var(--wf-gap-md))","align-items":"var(--wf-align, stretch)"}},{class:"wf-row",base:{display:"flex","flex-wrap":"wrap"},defaults:{gap:"var(--wf-gap, var(--wf-gap-md))","align-items":"var(--wf-align, center)"},variants:{"wf-row-reverse":{cover:{"flex-direction":"row-reverse"}}}},{class:"wf-items-start",base:{"--wf-align":"flex-start"}},{class:"wf-items-center",base:{"--wf-align":"center"}},{class:"wf-items-end",base:{"--wf-align":"flex-end"}},{class:"wf-items-stretch",base:{"--wf-align":"stretch"}},{class:"wf-grid",base:{display:"grid","grid-template-columns":"var(--wf-cols, repeat(auto-fill, minmax(280px, 1fr)))"},defaults:{gap:"var(--wf-gap, var(--wf-gap-lg))"}},{class:"wf-center",base:{display:"flex","flex-direction":"column","align-items":"center","justify-content":"center"}},{class:"wf-justify-between",base:{display:"flex","justify-content":"space-between"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-justify-end",base:{display:"flex","justify-content":"flex-end"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-justify-center",base:{display:"flex","justify-content":"center"},defaults:{"align-items":"var(--wf-align, center)",gap:"var(--wf-gap, var(--wf-gap-md))"}},{class:"wf-fill",base:{flex:"1","min-width":"0","min-height":"0"}},{class:"wf-fill-hover",base:{"border-radius":"var(--wf-radius-sm)",padding:"2px 4px",margin:"-2px -4px",transition:"background 0.15s ease"}},{class:"wf-cover",base:{position:"fixed",inset:"0",display:"flex","align-items":"center","justify-content":"center","z-index":"var(--wf-z, var(--wf-cover-z))"}}]});import{readFile as Rm,readdir as cv}from"node:fs/promises";import{join as gs,resolve as dv}from"node:path";async function gv(n){let e=await Rm(gs(n,"weifuwu-layout.css"),"utf-8"),t=[];for(let r of e.split(`
105
+ `)){let s=r.match(/@import\s+['"]([^'"]+)['"]/);s&&t.push(s[1].replace(/^\.\//,""))}if(!t.length)throw new Error(`layout \u5165\u53E3\u65E0 @import\uFF08${n}/weifuwu-layout.css\uFF09\u2014\u2014\u88C5\u914D\u5355\u6E90\u5931\u6548`);return t}async function Em(n){try{let e=await cv(n);return e.includes("weifuwu-layout.css")&&e.some(t=>/^_[a-z-]+\.css$/.test(t))}catch{return!1}}async function Tm(n){let e=dv(n),t=await gv(e),r=[gs(e,"weifuwu-layout.css")],s=[];for(let i of t){if(i==="_stack.css"){r.push(gs(e,"decl.ts"),gs(e,"define.ts")),s.push(`@layer ${xm._stack} {
106
+ ${_m(km)}
107
+ }`);continue}if(i==="_row.css")continue;let a=gs(e,i);r.push(a);let l=fv(await Rm(a,"utf-8")).trim(),u=i.replace(/\.css$/,""),c=xm[u];if(!c)throw new Error(`layout \u6587\u4EF6\u672A\u767B\u8BB0 @layer \u6620\u5C04: ${i}\uFF08\u5728 src/level5/client/layout/bundle.ts LAYER_OF \u4E2D\u767B\u8BB0\uFF09`);s.push(c===mv?l:`@layer ${c} {
108
108
  ${l}
109
109
  }`)}return{css:`/* weifuwu/client/layout \u2014 CSS \u5E03\u5C40\u539F\u8BED + \u8BBE\u8BA1 Token\uFF08\u88C5\u914D\u5355\u6E90\uFF1Asrc/level5/client/layout/bundle.ts\uFF09 */
110
110
 
111
- @layer ${mv.join(", ")};
111
+ @layer ${pv.join(", ")};
112
112
 
113
113
  ${s.join(`
114
114
 
115
115
  `)}
116
- `,inputs:r}}var mv,km,fv,gv,Em=N(()=>{"use strict";bm();vm();mv=["tokens","base","layout","components","utilities"],km={_tokens:"tokens",_dark:"tokens",_presets:"tokens",_props:"tokens",_base:"base",_stack:"layout",_row:"layout",_split:"layout",_center:"layout",_justify:"layout",_fill:"layout",_grid:"layout",_cluster:"layout",_cover:"layout",_position:"layout",_sticky:"layout",_overflow:"layout","_safe-area":"layout",_layer:"layout","_align-self":"layout",_nowrap:"layout",_shrink:"layout",_container:"layout","_app-shell":"layout",_surface:"utilities",_spacing:"utilities",_border:"utilities",_text:"utilities",_hidden:"utilities",_block:"utilities",_flex:"utilities",_popup:"layout"},fv="tokens",gv=n=>n.replace(/@import\s+['"][^'"]+['"]\s*;?\s*\n?/g,"")});var ar,Tm=N(()=>{"use strict";ar=class{value;constructor(e){this.value=e}toString(){return this.value}}});function ms(n,e){wv.inc();let t=Zl.get(n);if(t){t.count++;return}Zl.set(n,{shown:!0,count:1}),console.error(`[vdom] renderFn \u9519\u8BEF\uFF08${n}\uFF09\u2014\u2014\u7EC4\u4EF6\u7EA7 hole \u964D\u7EA7\uFF08\u4E0B\u4E00\u62CD\u91CD\u8BD5\u81EA\u6108\uFF09:`,e)}function Xl(n){Zl.delete(n)}var Fo,Zl,Jl,wv,fs=N(()=>{"use strict";Fo=globalThis;Fo.__wfErrState||(Fo.__wfErrState={errState:new Map,totalErrors:0});({errState:Zl,totalErrorsRef:Jl}={errState:Fo.__wfErrState.errState,totalErrorsRef:Fo.__wfErrState}),wv={get:()=>Jl.totalErrors,inc:()=>{Jl.totalErrors++},reset:()=>{Jl.totalErrors=0}}});function yv(n){return{next:n?.next??Vo,error:n?.error??Vo,complete:n?.complete??Vo}}function be(n){return new wt(n)}var Vo,wt,zo=N(()=>{"use strict";Vo=()=>{},wt=class{_subscribe;constructor(e){this._subscribe=e}subscribe(e){let t=yv(e),r=!1,s=null,i={next:l=>{r||t.next(l)},error:l=>{r||(r=!0,t.error(l),s?.())},complete:()=>{r||(r=!0,t.complete(),s?.())}},o=this._subscribe(i);s=typeof o=="function"?o:o?()=>o.unsubscribe():Vo,r&&s();let a=!1;return{unsubscribe(){a||(a=!0,r||(r=!0,s?.()))}}}pipe(...e){return e.reduce((t,r)=>r(t),this)}}});function lr(n,e){return be(t=>{let r=!0,s=()=>{r&&(r=!1,t.complete())},i=e?.signal;if(i){if(i.aborted)return s(),Yl;i.addEventListener("abort",s,{once:!0})}return n.then(o=>{r&&(r=!1,t.next(o),t.complete())},o=>{r&&(r=!1,t.error(o))}),()=>{r=!1,i&&i.removeEventListener("abort",s)}})}function eu(n,e){return be(t=>{let r=n(s=>t.next(s));return e&&t.next(e()),()=>{typeof r=="function"&&r()}})}var Yl,fe,Xt,Cm=N(()=>{"use strict";zo();Yl=()=>{},fe=class{subs=new Set;closed=!1;asObservable(){return be(e=>this.closed?(e.complete(),Yl):(this.subs.add(e),()=>{this.subs.delete(e)}))}subscribe(e){return this.asObservable().subscribe(e)}next(e){if(!this.closed)for(let t of this.subs)t.next(e)}error(e){if(!this.closed){this.closed=!0;for(let t of this.subs)t.error(e);this.subs.clear()}}complete(){if(!this.closed){this.closed=!0;for(let e of this.subs)e.complete();this.subs.clear()}}},Xt=class extends fe{value;constructor(e){super(),this.value=e}get(){return this.value}next(e){this.value=e,super.next(e)}asObservable(){return be(e=>this.closed?(e.complete(),Yl):(e.next(this.value),this.subs.add(e),()=>{this.subs.delete(e)}))}}});function tu(n){return e=>new wt(t=>e.subscribe({next:r=>t.next(n(r)),error:r=>t.error(r),complete:()=>t.complete()}))}function nu(n){return e=>new wt(t=>e.subscribe({next:r=>{n(r)&&t.next(r)},error:r=>t.error(r),complete:()=>t.complete()}))}function ur(n,e){let t=e;return r=>new wt(s=>r.subscribe({next:i=>{t=n(t,i),s.next(t)},error:i=>s.error(i),complete:()=>s.complete()}))}function Ko(n){return e=>new wt(t=>{let r=null,s=!1,i=e.subscribe({next:o=>{r?.unsubscribe();let a=!1,l=n(o).subscribe({next:u=>t.next(u),error:u=>t.error(u),complete:()=>{a=!0,r=null}});r=a?null:l},error:o=>t.error(o),complete:()=>{s=!0,r||t.complete()}});return()=>{i.unsubscribe(),r?.unsubscribe()}})}function ru(n,e){let t=e?.trailing??!1;return r=>new wt(s=>{let i=null,o=!1,a,l=!1,u=!1,c=m=>{u||s.next(m)},d=()=>{i=null,t&&l&&(l=!1,c(a)),o=!1},p=r.subscribe({next:m=>{o?t&&(a=m,l=!0):(o=!0,c(m),i=setTimeout(d,n))},error:m=>{u=!0,i&&clearTimeout(i),s.error(m)},complete:()=>{u=!0,i&&clearTimeout(i),s.complete()}});return()=>{u=!0,i&&clearTimeout(i),p.unsubscribe()}})}var Am=N(()=>{"use strict";zo()});var he=N(()=>{"use strict";zo();Cm();Am()});function Im(n){let e=new Set,t=new fe,r=n,s=()=>{for(let i of[...e])i();t.next(typeof r=="object"&&r!==null?{...r}:r)};return{get state(){return r},subscribe(i){return e.add(i),()=>{e.delete(i)}},set(i){typeof r=="object"&&r!==null&&!Array.isArray(r)&&typeof i=="object"&&i!==null?r={...r,...i}:r=i,s()},update(i){let o=i(r);o!==void 0&&(typeof r!="object"||r===null||o!==r)&&(r=o),s()},notify:s,changes$:t.asObservable()}}function su(n){let e=Im(n),t=(()=>e.state);return t.set=r=>e.set(r),t.update=r=>e.update(r),t.subscribe=r=>e.subscribe(r),t.notify=()=>e.notify(),t.store=e,t}var ou=N(()=>{"use strict";he()});function ct(n,e){let t=globalThis.__wfSpy;t&&t.length<1e3&&t.push({at:Date.now()%1e5,kind:n,data:e===void 0?void 0:String(e).slice(0,80)})}var Yt=N(()=>{"use strict"});function dt(n,e,t,r){let s=n.getInstanceData(),i=s.get(e);if(!i){let o=t,a=!0,l=new fe,u=e.subscribe({next:p=>{let m=p!==o;o=p,m&&!a&&l.next()},error:p=>{console.error("[vdom] useObservable:",p)}});a=!1;let d=(r?.throttleMs&&r.throttleMs>0?l.asObservable().pipe(ru(r.throttleMs,{trailing:!0})):l.asObservable()).subscribe({next:()=>{ct("obs:next",String(o)+" \u2192 req:render"),n.requestRender()}});n.onUnmount(()=>{u.unsubscribe(),d.unsubscribe()}),i={get:()=>o},s.set(e,i)}return()=>i.get()}var cr=N(()=>{"use strict";he();Yt()});function Pm(n,e,t){if(typeof e=="function"){let s=e;return o=>{o?s(o):t?.()}}return{current:e}}function Nm(n,e,t){let r=typeof e=="object"?e:void 0,s=typeof e=="boolean"?e:!1,i=r??t,o=n.nextHookIndex(),a=n.getHookState(o)??{open:s};n.setHookState(o,a);let l=i?.open!==void 0;return{get open(){return i?.open??a.open},setOpen(u){l?(i?.onOpenChange||console.warn(`[vdom] useOpen${r?.name?`(${r.name})`:""} \u53D7\u63A7\u7F3A onOpenChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),i?.onOpenChange?.(u)):(a.open=u,n.requestRender())},toggle(){this.setOpen(!this.open)}}}function Go(n,e,t){let r=t?e:(()=>!0),s=t??e,i=n.getBrowser()?.window;if(!i)return()=>{};let o=l=>{if(typeof r=="string"){if(l.key!==r)return}else if(!r(l))return;s(l)};i.addEventListener("keydown",o);let a=()=>i.removeEventListener("keydown",o);return n.onUnmount(a),a}var iu=N(()=>{"use strict"});function Mm(n,e,t,r,s,i,o,a){let l=n.getBoundingClientRect();if(l.width===0&&l.height===0)return null;let u=e.innerWidth,c=e.innerHeight,d,p;switch(s){case"bottom":d=l.bottom+i,p=a?l.left+l.width/2-t/2:l.left;break;case"top":d=l.top-r-i,p=a?l.left+l.width/2-t/2:l.left;break;case"left":d=a?l.top+l.height/2-r/2:l.top,p=l.left-t-i;break;case"right":d=a?l.top+l.height/2-r/2:l.top,p=l.right+i;break}return p+t>u-o&&(p=u-t-o),p<o&&(p=o),d+r>c-o&&(d=c-r-o),d<o&&(d=o),{top:d,left:p}}function $m(n,e){let t=e.getComputedStyle(n).animationName;if(t&&t!=="none")return!0;for(let r of n.children){let s=e.getComputedStyle(r).animationName;if(s&&s!=="none")return!0}return!1}function qm(n,e){let t=new fe,r=dt(n,Sv(n,e,t),{top:0,left:0});return{get top(){return r().top},get left(){return r().left},refresh:()=>{t.next()}}}function Sv(n,e,t){let r=n.getBrowser()?.window;return be(s=>{if(!r)return s.next({top:0,left:0}),s.complete(),()=>{};let i,o=()=>{let u=e.el();if(!u)return;let c=u.getBoundingClientRect();c.width===0&&c.height===0||(e.isOpen?.()??!0)&&s.next(e.compute(c))},a=()=>{i===void 0&&(i=r.requestAnimationFrame(()=>{i=void 0,o()}))};r.addEventListener("scroll",a,!0),r.addEventListener("resize",a),o();let l=t?.subscribe({next:()=>o()});return()=>{l?.unsubscribe(),i!==void 0&&r.cancelAnimationFrame(i),r.removeEventListener("scroll",a,!0),r.removeEventListener("resize",a)}})}var au=N(()=>{"use strict";he();cr()});function Dm(n){return n==null?null:typeof n=="string"?n:typeof n=="number"?String(n):(console.warn(`[vdom] key \u5FC5\u987B\u662F string|number\u2014\u2014\u5F53\u524D ${typeof n}\uFF08\u5FFD\u7565\u2014\u2014\u4F4D\u7F6E\u8EAB\u4EFD\uFF09`),null)}function jm(n){return Dm(n?.key)}function Lm(n){let e={...n??{}};return delete e.key,e}var Wm=N(()=>{"use strict"});function lu(n){if(!(n==null||n===!1)){if(typeof n=="string")return n.trim()||void 0;if(typeof n=="number")return String(n);if(Array.isArray(n)){let e=n.map(lu).filter(t=>!!t);return e.length?e.join(" "):void 0}if(typeof n=="object"){let e=Object.entries(n).filter(([,t])=>!!t).map(([t])=>t);return e.length?e.join(" "):void 0}}}function xv(n){for(let e of["class","className"]){let t=n[e];t!=null&&typeof t!="string"&&(n[e]=lu(t))}return n}function Ge(n,e,...t){let r=Lm(xv(e??{}));return t.length===1?r.children=t[0]:t.length>1&&(r.children=t),{type:n,props:r,key:jm(e)}}var Cn=N(()=>{"use strict";Wm()});function Et(n){return n.type===Um}var Um,dr=N(()=>{"use strict";Um=Symbol("vdom-fragment")});function Me(n){let e=n.children??(n.props.children===void 0?[]:n.props.children),t=r=>Array.isArray(r)?r.flatMap(t):[r];return Array.isArray(e)?e.flatMap(t):[e]}function Ae(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&Et(n)?Me(n).reduce((e,t)=>e+Ae(t),0):1}var pr=N(()=>{"use strict";dr()});function it(n,e){return`${n}.k${e.replace(/%/g,"%25").replace(/\./g,"%2E")}`}function Re(n){return n==null||typeof n=="boolean"||typeof n=="string"||typeof n=="number"||Array.isArray(n)?null:n.key}function Rv(n){return Re(n)!==null}function uu(n){return`${Bm}${n}`}function Hm(n){return n.startsWith(Bm)}function gs(n,e){let t=new Set;for(let r of n){let s=Re(r);if(s!==null){if(t.has(s)){console.warn(`[vdom] ${e}\uFF1A\u91CD\u590D key "${s}"\uFF08\u5217\u8868\u8EAB\u4EFD\u6620\u5C04\u6B67\u4E49\u2014\u2014\u589E\u5220/\u91CD\u6392\u884C\u4E3A\u4E0D\u786E\u5B9A\uFF09\u2014\u2014\u8BF7\u4E3A\u6BCF\u9879\u58F0\u660E\u552F\u4E00 key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`);return}t.add(s)}}}function Fm(n,e){if(n.length<2)return;let t=n.some(s=>typeof s?.type=="function"),r=n.some(s=>!Rv(s)&&typeof s?.type=="function");if(t&&r){let s=n.map(i=>{let o=i;if(o==null)return"null";if(typeof o=="boolean")return"bool";if(typeof o=="string"||typeof o=="number")return"text";if(Array.isArray(o))return"arr";if(typeof o.type=="function"){let a=o.type.name;return"comp"+(a?":"+a:"")}return"el"+(o.key?`.k{${String(o.key).slice(0,16)}}`:"")});console.warn(`[vdom] ${e}\uFF1A\u5217\u8868\u542B\u65E0 key \u7684\u7EC4\u4EF6\u9879\uFF08\u957F\u5EA6 ${n.length}\uFF09\u2014\u2014\u9879: [${s.join(", ")}]\u2014\u2014\u52A8\u6001\u589E\u5220/\u91CD\u6392\u65F6\u72B6\u6001\u4F1A\u6309\u4F4D\u7F6E\u7EE7\u627F\u2014\u2014\u8BF7\u4E3A\u7EC4\u4EF6\u9879\u58F0\u660E key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`)}}var Bm,An=N(()=>{"use strict";Bm="pos:"});function hs(n,e){return!n.startsWith("aria-")||typeof e!="boolean"?null:e?"true":"false"}function cu(n,e,t){if(e==="innerHTML"||e==="textContent"||e==="value"){n[e]=t;return}if(t==null){n.removeAttribute(e);return}let r=hs(e,t);if(r!==null){n.setAttribute(e,r);return}if(Ev.has(e)){n.setAttribute(e,t?"true":"false");return}if(t===!1){n.removeAttribute(e);return}if(e==="class"||e==="className"){n.setAttribute("class",String(t));return}if(typeof t=="boolean"){n.setAttribute(e,"");return}n.setAttribute(e,String(t))}var Ev,Qo=N(()=>{"use strict";Ev=new Set(["draggable","contenteditable","spellcheck"])});function ae(n,e){return`${n}.${e}`}function ws(n){let e={};for(let[t,r]of Object.entries(n)){if(t==="children"||t==="key"||t==="ref"||typeof r=="function"||r===void 0)continue;let s=hs(t,r);e[t]=s!==null?s:r}return e}var en=N(()=>{"use strict";pr();An();Qo()});function Vm(n){return n==null||typeof n=="boolean"}function zm(n){return!(n==null||typeof n=="boolean"||typeof n=="string"||typeof n=="number"||Array.isArray(n)||typeof n=="object"&&typeof n.type=="string"||typeof n.type=="function"||typeof n.type=="symbol")}function du(n){return n==null?"null/undefined":typeof n=="object"?`object\uFF08type: ${typeof n.type}\uFF09`:typeof n}function Tv(n,e,t,r){return[{op:"createAnchor",id:n,...r!==void 0?{detail:r}:{}},{op:"insert",id:n,parent:e,ref:t}]}function pu(n,e,t,r,s){for(let i of Tv(e,t,r,s))n(i)}var mu=N(()=>{"use strict"});function pt(n){return n===""?"hole":typeof n=="string"||typeof n=="number"?"text":Vm(n)?"hole":Array.isArray(n)?"array":typeof n.type=="string"?"element":Et(n)?"fragment":typeof n.type=="function"?"component":(zm(n),"invalid")}function Jo(n){return typeof n=="string"||typeof n=="number"?String(n):null}function Qe(n){return pt(n)==="hole"}function tn(n){return pt(n)==="text"}var mr=N(()=>{"use strict";dr();mu()});function Tt(n){if(n==null)return"hole";let e=pt(n);return e==="invalid"?"hole":e}var Km=N(()=>{"use strict";mr()});function Gm(n,e,t,r,s){let i=ws(n.props),o=ws(e.props);for(let[a,l]of Object.entries(o))a==="value"&&s?.formControl?r({op:"setProp",id:t,key:a,value:l}):i[a]!==l&&r({op:"setProp",id:t,key:a,value:l});for(let a of Object.keys(i))a in o||r({op:"setProp",id:t,key:a,value:void 0});for(let[a,l]of Object.entries(e.props))a==="children"||a==="key"||typeof l=="function"&&n.props[a]!==l&&r({op:"setProp",id:t,key:a,value:l,prev:n.props[a]});for(let a of Object.keys(n.props))a==="children"||a==="key"||typeof n.props[a]=="function"&&e.props[a]===void 0&&r({op:"setProp",id:t,key:a,value:void 0,prev:n.props[a]})}var Qm=N(()=>{"use strict";en()});function fr(n,e,t){return typeof n?.type=="function"?ae(e,0):Array.isArray(n)?e:Qe(n)?ae(e,0):t}function ys(n,e,t){return typeof n?.type=="function"||Array.isArray(n)?e:t}function Je(n,e,t,r,s){if(Qe(n)){r({op:"remove",id:e});return}if(tn(n)){r({op:"remove",id:e});return}if(Array.isArray(n)){let l=0;for(let u of n)Je(u,ae(e,l),e,r,s),l+=Ae(u);return}let i=n;if(Et(i)){let l=Number(e.slice(t.length+1)),u=Me(i),c=l;for(let d of u)Je(d,ae(t,c),t,r,s),c+=Ae(d);return}if(typeof i.type=="function"){let l=i.key!==null?it(t,i.key):e;r({op:"unmount",compId:l});let u=s?.get(l)?.lastOutput;if(u!==void 0){let c=nn(u),d=fr(c,l,e),m=c!==null&&typeof c=="object"&&!Array.isArray(c)&&Et(c)?e.slice(0,e.lastIndexOf(".")):ys(c,l,l);Je(c,d,m,r,s)}}let o=Me(i),a=0;o.forEach(l=>{let u=ae(e,a);l!==null&&typeof l!="string"&&typeof l!="number"&&typeof l!="boolean"&&!Array.isArray(l)?Je(l,u,e,r,s):r({op:"remove",id:u}),a+=Ae(l)}),r({op:"remove",id:e})}var gr=N(()=>{"use strict";pr();dr();en();An();tt();mr()});var hr,Jm=N(()=>{"use strict";hr=(n,e,t)=>{t.emit({op:"remove",id:t.oldId}),t.emitNode(e,t.parent,t.index,t.ref)}});var wr,Zm=N(()=>{"use strict";wr=(n,e,t)=>{t.emit({op:"remove",id:t.oldId}),t.emitNode(e,t.parent,t.index,t.ref)}});var yr,Xm=N(()=>{"use strict";gr();yr=(n,e,t)=>{Je(n,t.oldId,t.parent,t.emit,t.registry),t.emitNode(e,t.parent,t.index,t.ref)}});var br,Ym=N(()=>{"use strict";en();gr();tt();br=(n,e,t)=>{t.oldCompId&&t.emit({op:"unmount",compId:t.oldCompId});let r=t.registry?.get(t.oldCompId??"")?.lastOutput;if(r!==void 0){let s=nn(r);Je(s,fr(s,t.oldCompId??"",ae(t.parent,t.index)),ys(s,t.oldCompId??"",t.parent),t.emit,t.registry)}else t.emit({op:"remove",id:t.oldId});t.emitNode(e,t.parent,t.index,t.ref)}});var mt,ef=N(()=>{"use strict";pr();en();gr();mt=(n,e,t)=>{let r=Array.isArray(n)?n:Me(n),s=t.index;for(let i of r)Je(i,ae(t.parent,s),t.parent,t.emit,t.registry),s+=Ae(i);t.emitNode(e,t.parent,t.index,t.ref)}});function fu(n,e){return Cv[n]?.[e]??null}var Cv,tf=N(()=>{"use strict";Jm();Zm();Xm();Ym();ef();Cv={text:{text:null,hole:hr,element:hr,component:hr,fragment:hr,array:hr},hole:{text:wr,hole:null,element:wr,component:wr,fragment:wr,array:wr},element:{text:yr,hole:yr,element:null,component:yr,fragment:yr,array:yr},component:{text:br,hole:br,element:br,component:null,fragment:br,array:br},fragment:{text:mt,hole:mt,element:mt,component:mt,fragment:null,array:mt},array:{text:mt,hole:mt,element:mt,component:mt,fragment:mt,array:null}}});function hu(n,e,t,r,s){let i=[],o=new Map,a={n:0},l=new Map,u=new fe;u.subscribe({next:()=>{for(let h of[...i].reverse())try{h()}catch(f){console.error("[vdom] v2 onUnmount:",f)}}});let c=Object.create(t);c.onUnmount=h=>{i.push(h)},c.ui=yu({requestRender:()=>{ct("req:render",r.slice(-18)),s?.()},onUnmount:h=>{i.push(h)},getBrowser:()=>t.browser??null,nextHookIndex:()=>a.n++,getHookState:h=>l.get(h),setHookState:(h,f)=>{l.set(h,f)},getInstanceData:()=>o,scheduleAfterRender:h=>{let f=t.afterRender;f?f(h):setTimeout(h,0)},getSharedContext:()=>t??null});let d=n(e,c),p;typeof d=="function"?p=d:p=(h=>{let f=n(h,c);return typeof f=="function"?null:f});let m=a.n;return{factory:n,renderFn:p,lastOutput:void 0,hookSeq:a,renderBase:m,instData:o,destroy$:u,disposed:!1,epoch:Av}}function wu(n,e){let t=n.renderFn.shouldRender;return t&&n.lastProps!==void 0&&n.lastOutput!==void 0&&!t(n.lastProps,e)?nn(n.lastOutput):(n.lastProps=e,n.hookSeq.n=n.renderBase,n.renderFn(e))}function at(n,e){let t=e.get(n);if(!(!t||t.disposed)){t.disposed=!0;try{t.destroy$.next()}catch(r){console.error("[vdom] v2 destroy$:",r)}t.instData.clear(),e.delete(n)}}function Ov(n,e,t,r){let s=e.get(n),i=[];if(s){let a=s.lastOutput!==void 0?nn(s.lastOutput):void 0;if(a!==void 0){let l={get:u=>{let c=e.get(u);return c?{lastOutput:c.lastOutput}:void 0}};Je(a,fr(a,n,t),ys(a,n,r),u=>{i.push(u)},l)}}let o=[];for(let a of i)a.op==="unmount"&&e.has(a.compId)&&o.push(a.compId);at(n,e);for(let a of o)e.has(a)&&at(a,e);return i.unshift({op:"unmount",compId:n}),i}function of(n,e,t,r){let s=n?.lastOutput;if(s===void 0)return[e+".0"];if(typeof s=="object"&&s!==null&&"kind"in s){let i=s;if(i.kind==="hole")return[e+".0"];if(i.kind==="array")return(i.items??[]).map((a,l)=>`${e}.${l}`);let o=i.v;return o?typeof o.type=="function"?[e+".0"]:[ae(t,r)]:[e+".0"]}return[e+".0"]}function Iv(n,e,t,r){if(Qe(n))return ae(e,t);if(tn(n))return ae(e,t);let s=n;if(typeof s.type!="function")return ae(e,t);let i=Re(s);if(i===null)return ae(e,t);let o=it(e,i);return of(r?.get(o),o,e,t)[0]}function nf(n,e,t,r,s,i,o,a){let l=[],u=[],c=0,d=null;for(let p=0;p<e.length;p++){let m=Ae(e[p]);l.push(n[p]===void 0?Ue(e[p],t,c,d,r,i,s,o):In(n[p],e[p],t,c,d,r,s,i,o)),d=ae(t,c+m-1),c+=m}for(let p=n.length-1;p>=e.length;p--)u.push(we(On(n[p],t,Pv(n,p),s)));return a?Ze([...u.reverse(),...l]):(u.reverse(),Ze([...l,...u]))}function In(n,e,t,r,s,i,o,a,l){let u=ae(t,r),c=pt(n),d=pt(e);if(c==="text"&&d==="text")return String(n)===String(e)?we([]):we([{op:"setText",id:u,value:Jo(e)}]);if(c==="hole"&&d==="hole")return we([]);if(c==="hole")return Ze([we([{op:"remove",id:u}]),Ue(e,t,r,s,i,a,o,l)]);if(d==="hole")return gu(n,e,t,r,s,i,a,c==="component"?_s(n,t,r):void 0,o,l);if((c==="fragment"||c==="array")&&(d==="fragment"||d==="array")){let f=bs(Array.isArray(n)?n:Me(n)),g=bs(Array.isArray(e)?e:Me(e));return Zo(g)||Zo(f)?sf(f,g,t,i,o,a,l):nf(f,g,t,i,o,a,l,!0)}if(c===d&&typeof n!="string"&&typeof n!="number"){let f=n,g=e;if(typeof f.type=="function"&&typeof g.type=="function"){if(f.type===g.type)return Mv(f,g,t,r,s,i,o,a,l);let w=_s(f,t,r),y=Ov(w,o,ae(t,r),t);return Ze([we(y),Ue(g,t,r,s,i,a,o,l)])}if(typeof f.type=="string"&&typeof g.type=="string"){if(f.type===g.type){let w=[];Gm(f,g,u,v=>w.push(v),{formControl:f.type==="input"||f.type==="textarea"});let y=bs(Me(f)),k=bs(Me(g));if(qv(y,k,u),Zo(k)||Zo(y))return Ze([we(w),sf(y,k,u,i,o,a,l)]);let _=nf(y,k,u,i,o,a,l,!1);return Ze([we(w),_])}return Ze([we(On(f,t,r,o)),Ue(g,t,r,s,i,a,o,l)])}}let p=Tt(n),m=Tt(e),h=pt(n)==="component"?_s(n,t,r):void 0;return gu(n,e,t,r,s,i,a,h,o,l)}function Pv(n,e){let t=0;for(let r=0;r<e;r++)t+=Ae(n[r]);return t}function Nv(n,e){let t=0;for(let r=0;r<e;r++)t+=Ae(n[r]);return t}function Mv(n,e,t,r,s,i,o,a,l){let u=_s(e,t,r),c=o.get(u);if(!c||c.factory!==e.type)return c&&at(u,o),Ue(e,t,r,s,i,a,o,l);let d;try{d=wu(c,e.props)}catch(h){return ms(u,h),we([])}let p=c.lastOutput!==void 0?nn(c.lastOutput):void 0;c.lastOutput=Yo(d);let m=bu(d,u,t,r);return p===void 0?Ue(d,m.parent,m.index,s,i,a,o,l):$v(p,d,m.parent,m.index,s,i,o,a,l)}function $v(n,e,t,r,s,i,o,a,l){if(n===e)return we([]);let u=Array.isArray(n),c=Array.isArray(e);if(u||c){let d=u?n:[n],p=c?e:[e],m=0,h=null,f=[];for(let g=0;g<p.length;g++){let w=Ae(p[g]);f.push(d[g]===void 0?Ue(p[g],t,m,h,i,a,o,l):In(d[g],p[g],t,m,h,i,o,a,l)),h=ae(t,m+w-1),m+=w}for(let g=p.length;g<d.length;g++)f.push(we(On(d[g],t,Nv(d,g),o)));return Ze(f)}return In(n,e,t,r,s,i,o,a,l)}function bs(n){let e=[];for(let t of n)t!==null&&typeof t=="object"&&!Array.isArray(t)&&Et(t)?e.push(...bs(Me(t))):e.push(t);return e}function qv(n,e,t){if(globalThis.__WF_NO_A_CHECK__)return;let r=d=>!Qe(d)&&!tn(d)&&!Array.isArray(d),s=n.filter(r),i=e.filter(r),o=d=>typeof d?.type=="function"&&Re(d)===null,a=(d,p)=>p>=d.length||Qe(d[p]),l=d=>a(n,d)||o(n[d]),u=d=>a(e,d)||o(e[d]);(e.some((d,p)=>o(d)&&!l(p))||n.some((d,p)=>o(d)&&!u(p)))&&Fm(i,`children\uFF08${t}\u2014\u2014\u65E0 key \u7EC4\u4EF6\u5B9E\u69FD\u7FFB\u8F6C ${s.length}\u2192${i.length}\uFF09`)}function _s(n,e,t){return n.key!==null?it(e,n.key):ae(e,t)}function vs(n,e,t,r,s,i){let o=Tt(n),a=Tt(e);return fu(o,a)?gu(n,e,"root",0,null,t,s,o==="component"?_s(n,"root",0):void 0,r,i).pipe(rf):In(n,e,"root",0,null,t,r,s,i).pipe(rf)}function Dv(n,e,t,r,s,i,o,a,l){return n===void 0?Ue(e,t,r,s,i,a,o,l):In(n,e,t,r,s,i,o,a,l)}function sf(n,e,t,r,s,i,o){let a=[],l=(_,v)=>Re(_)??uu(v),u=new Map;n.forEach((_,v)=>{let S=l(_,v);u.has(S)||u.set(S,v)});let c=new Set(e.map((_,v)=>l(_,v))),d=new Map;for(let _=0;_<n.length;_++){let v=n[_];if(Qe(v)){a.push({op:"remove",id:ae(t,_)});continue}if(tn(v)){a.push({op:"remove",id:ae(t,_)});continue}if(Array.isArray(v))continue;let S=Re(v);if(S!==null){let A=(d.get(S)??0)+1;if(d.set(S,A),A===1)continue;a.push(...On(v,t,_,s));continue}}for(let[_,v]of u)if(!c.has(_)&&(a.push(...On(n[v],t,v,s)),!Hm(_))){let S=it(t,_);s.has(S)&&at(S,s)}let p=n.map(_=>Re(_)).filter(_=>_!==null&&c.has(_)),m=e.map(_=>Re(_)).filter(_=>_!==null&&u.has(_)),f=!e.some((_,v)=>{let S=Re(_);if(S===null||typeof _.type!="function")return!1;let A=u.get(S);return A===void 0||A===v?!1:s?.get(it(t,S))===void 0});{let _=0;for(let v of m){let S=p.indexOf(v,_);if(S===-1){f=!1;break}_=S+1}}if(!f){n.forEach((S,A)=>{if(!(Qe(S)||tn(S))&&!Array.isArray(S)){if(Re(S)!==null&&typeof S.type=="function"){a.push(...On(S,t,A,s,{keepSegments:!0}));return}if(Re(S)!==null){a.push({op:"remove",id:ae(t,A)});return}a.push(...On(S,t,A,s))}});let _=[],v=null;for(let S=0;S<e.length;S++){let A=e[S],C=Re(A),j=C!==null?it(t,C):ae(t,S);C!==null&&typeof A.type=="function"?_.push(Ue(A,t,S,v,r,i,s,o)):_.push(Ue(A,t,S,v,r,i,s,o)),v=ae(t,S)}return Ze([we(a),..._])}let g=[];e.forEach((_,v)=>{let S=Re(_);if(S===null)return;let A=u.get(S);A!==void 0&&A!==v&&g.push({oldIdx:A,newIdx:v})});let w=g.every(_=>_.newIdx<_.oldIdx);g.sort((_,v)=>w?_.newIdx-v.newIdx:v.newIdx-_.newIdx);for(let _ of g){let v=e[_.newIdx],S=Re(v);if(S!==null&&typeof v.type=="function"){let A=it(t,S),C=of(s?.get(A),A,t,_.oldIdx);if(C.length===1&&!C[0].startsWith(A+"."))a.push({op:"move",id:C[0],parent:t,ref:null,newId:ae(t,_.newIdx),noMove:!0});else{let K=_.newIdx>0?e[_.newIdx-1]:null,U=K===null?null:Iv(K,t,_.newIdx-1,s);for(let H of C)a.push({op:"move",id:H,parent:t,ref:U,newId:H,noMove:!1}),U=H}}else a.push({op:"move",id:ae(t,_.oldIdx),parent:t,ref:null,newId:ae(t,_.newIdx),noMove:!0})}let y=[],k=null;for(let _=0;_<e.length;_++){let v=e[_],S=Re(v),A=ae(t,_);if(S!==null){let C=u.get(S);C===void 0?y.push(Ue(v,t,_,k,r,i,s,o)):typeof v.type=="function"?y.push(Dv(n[C],v,t,_,k,r,s,i,o)):y.push(In(n[C],v,t,_,k,r,s,i,o))}else{let C=u.get(uu(_)),j=C===void 0?void 0:n[C];j!==void 0&&!Qe(j)&&!tn(j)&&!Array.isArray(j)?y.push(In(j,v,t,_,k,r,s,i,o)):y.push(Ue(v,t,_,k,r,i,s,o))}k=A}return Ze([we(a),...y])}function On(n,e,t,r,s){let i=[],o=ae(e,t),a=r&&r.size>0?{get:u=>{let c=r.get(u);return c?{lastOutput:c.lastOutput}:void 0}}:void 0;if(Je(n,o,e,u=>i.push(u),a),r&&!s?.keepSegments)for(let u of i)u.op==="unmount"&&r.has(u.compId)&&at(u.compId,r);else if(r&&s?.keepSegments){for(let u of i)if(u.op==="unmount"){let c=r.get(u.compId);c&&(c.lastOutput=void 0)}}return s?.keepSegments?i.filter(u=>u.op!=="unmount"):i}function Zo(n){return n.some(e=>Re(e)!==null)}function gu(n,e,t,r,s,i,o,a,l,u){let c=fu(Tt(n),Tt(e));if(!c)throw new Error(`[vdom] v2 \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 ${Tt(n)} \u2192 ${Tt(e)}`);let d=[],p=null,m=[],h=l&&l.size>0?{get:w=>{let y=l.get(w);return y?{lastOutput:y.lastOutput}:void 0}}:o,f={emit:w=>{let y=w;y.op==="unmount"&&l?.has(y.compId)&&m.push(y.compId),d.push(y)},emitNode:(w,y,k,_)=>{p={v:w,p:y,i:k,r:_}},oldId:ae(t,r),newId:ae(t,r),parent:t,index:r,ref:s,oldCompId:a,registry:h};c(n,e,f);let g=p?be(w=>{let y=p;return Ue(y.v,y.p,y.i,y.r,i,o,l,u).subscribe({next:_=>w.next(_),error:_=>w.error(_),complete:()=>w.complete()})}):we([]);return Ze([be(w=>{for(let y of m)l?.has(y)&&at(y,l);return w.complete(),()=>{}}),we(d),g])}var Av,rf,Pn=N(()=>{"use strict";fs();en();An();pr();dr();An();mr();Km();Qm();gr();tf();he();Yt();Xo();tt();Nn();Av=0;rf=n=>Ze([n,we([{op:"done"}])])});function ks(n){return _r.test(n)?n.slice(2).toLowerCase():null}var ei,_r,ti=N(()=>{"use strict";ei=class{table=new Map;rootTypes=new Set;doc;dispatchBound;container;phase="active";constructor(e,t){this.doc=e,this.container=t,this.dispatchBound=this.dispatch.bind(this)}set(e,t,r){if(this.phase==="disposed"){console.error(`[vdom] \u4E8B\u4EF6\u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}, ${t}) \u88AB\u5FFD\u7565`);return}if(typeof r!="function"){console.warn(`[vdom] \u4E8B\u4EF6 ${t} \u975E\u51FD\u6570\u503C\u88AB\u8DF3\u8FC7\uFF08node ${e}\uFF09\u2014\u2014\u671F\u671B\u51FD\u6570\uFF0C\u5B9E\u9645 ${typeof r}`);return}let s=this.table.get(e);s||(s=new Map,this.table.set(e,s)),s.set(t,r),this.ensureRoot(t)}get(e,t){return this.table.get(e)?.get(t)}removeEvent(e,t){let r=this.table.get(e);r&&(r.delete(t),r.size===0&&this.table.delete(e))}remove(e){for(let t of[...this.table.keys()])(t===e||t.startsWith(e+"."))&&this.table.delete(t)}removeOne(e){this.table.delete(e)}ensureRoot(e){this.rootTypes.has(e)||(this.doc.addEventListener(e,this.dispatchBound,{capture:!0}),this.rootTypes.add(e))}dispatch(e){if(this.container){let r=e.target;if(r&&!this.container.contains(r))return}if(e.type==="contextmenu"&&window.__dbgEvt){let r=e.target,s=[...this.table.entries()].map(([i,o])=>i+":"+[...o.keys()].join("+")).join(" | ");console.error("[dbg-evt-dispatch]","target:",r?.getAttribute("data-wf-id"),"ALL:",s.slice(0,400))}let t=e.target;for(t&&t.nodeType===3&&(t=t.parentElement);t;){if(!t.hasAttribute?.("data-wf-id")){let s=t.closest?.("[data-wf-id]");if(s&&s!==t){t=s;continue}}let r=t.getAttribute?.("data-wf-id");if(r){let s=this.table.get(r)?.get(e.type);if(s){try{Object.defineProperty(e,"currentTarget",{value:t,configurable:!0})}catch{}try{s(e)}catch(i){console.error("[vdom] \u4E8B\u4EF6 handler:",i)}if(e.cancelBubble)return}}t=t.parentElement}}clear(){this.table.clear()}dispose(){if(this.phase!=="disposed"){this.phase="disposed";for(let e of this.rootTypes)this.doc.removeEventListener(e,this.dispatchBound,{capture:!0});this.rootTypes.clear(),this.table.clear()}}},_r=/^on[A-Z]/});var ni,af=N(()=>{"use strict";ni=class{refs=new Map;phase="active";set(e,t,r){if(this.phase==="disposed"){console.error(`[vdom] ref \u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}) \u88AB\u5FFD\u7565`);return}if(r&&r!==t&&typeof r=="function")try{r(null)}catch(s){console.error("[vdom] ref prev:",s)}this.refs.set(e,t)}mount(e,t){let r=this.refs.get(e);if(typeof r=="function")try{r(t)}catch(s){console.error("[vdom] ref mount:",s)}}unmount(e){for(let[t,r]of[...this.refs])if(t===e||t.startsWith(e+".")){if(typeof r=="function")try{r(null)}catch(s){console.error("[vdom] ref unmount:",s)}this.refs.delete(t)}}unmountOne(e){let t=this.refs.get(e);if(typeof t=="function")try{t(null)}catch(r){console.error("[vdom] ref unmount:",r)}this.refs.delete(e)}remap(e,t){for(let[r,s]of[...this.refs])(r===e||r.startsWith(e+"."))&&(this.refs.delete(r),this.refs.set(t+r.slice(e.length),s))}clear(){this.refs.clear()}dispose(){this.phase!=="disposed"&&(this.phase="disposed",this.refs.clear())}}});function jv(n,e){switch(e.kind){case"begin":return"consuming";case"next":return e.matched?"consuming":"failed";case"end":return n==="consuming"?e.remaining>0?"failed":"inactive":n;case"reset":return"inactive"}}var ri,lf=N(()=>{"use strict";he();ri=class{queue=null;phase="inactive";events$;failed$;events=new fe;constructor(){this.events$=this.events.asObservable(),this.events.asObservable().pipe(ur(jv,"inactive")).subscribe({next:e=>{this.phase=e}}),this.failed$=this.events.asObservable().pipe(nu(e=>e.kind==="next"&&!e.matched||e.kind==="end"&&e.remaining>0),tu(()=>{}))}begin(e){let t=[],r=s=>{t.push(s);for(let i of s.childNodes)r(i)};for(let s of e.childNodes)r(s);this.queue=t,this.events.next({kind:"begin"})}end(){if(this.phase!=="consuming")return;let e=this.queue?.length??0;this.queue=null,this.events.next({kind:"end",remaining:e})}reset(){this.queue=null,this.events.next({kind:"reset"})}next(e,t,r){if(this.phase!=="consuming")return console.error(`[vdom] absorb \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Anext \u5728 ${this.phase} \u9636\u6BB5\u8C03\u7528\uFF08\u5E94 consuming\uFF09`),null;let s=this.queue;if(!s)return null;for(;s.length>0;){let i=s.shift();if(e==="element"?i.nodeType===1&&i.tagName.toLowerCase()===t:e==="text"?i.nodeType===3:i.nodeType===8){if(e==="text"&&r!==void 0){let a=i,l=a.textContent??"";if(l!==r&&l.startsWith(r)){let u=a.splitText(r.length);s.unshift(u)}}return this.events.next({kind:"next",matched:!0}),i}}return this.events.next({kind:"next",matched:!1}),null}}});function Wv(n,e,t){if(t==null||t===!1){e.startsWith("--")&&n.style.removeProperty(e),n.style[e]="";return}if(e.startsWith("--")){n.style.setProperty(e,String(t));return}typeof t=="number"&&!Lv.has(e)&&(t=`${t}px`),n.style[e]=String(t)}function _u(n,e){if(e==null||e===!1){n.style.cssText="";return}if(typeof e=="string"){n.setAttribute("style",e);return}if(e&&typeof e=="object"){n.style.cssText="";for(let[t,r]of Object.entries(e))Wv(n,t,r)}}var Lv,uf=N(()=>{"use strict";Lv=new Set(["zIndex","opacity","lineHeight","zoom","fontWeight","order","flex","flexGrow","flexShrink","flexBasis","animationIterationCount","orphans","widows","columns","columnCount","columnGap","counterIncrement","counterReset","aspectRatio","scale","rotate"])});function Uv(n){if(si||(si=new WeakSet),!cf.has(n)){cf.add(n);let e=si;n.addEventListener("compositionstart",t=>{let r=t.target;r instanceof HTMLElement&&e.add(r)},!0),n.addEventListener("compositionend",t=>{let r=t.target;r instanceof HTMLElement&&e.delete(r)},!0)}return si}function df(n,e){return Uv(n).has(e)}var si,cf,pf=N(()=>{"use strict";si=null,cf=new WeakSet});function mf(n){return Bv.has(n)}function ff(n,e,t){if(t===void 0){if(Hv.has(e)){n[e]=!1;return}return}if(e==="value"&&n.nodeType===1){let r=n;if(n.ownerDocument&&df(n.ownerDocument,r))return;let s=r.value;if(s===t||String(s)===String(t))return}n[e]=t}var Bv,Hv,gf=N(()=>{"use strict";pf();Bv=new Set(["value","checked","selected","disabled","hidden","autofocus","defaultValue","defaultChecked","innerHTML","textContent","download","indeterminate","multiple","readOnly","required","tabIndex","spellcheck","draggable","scrollTop","scrollLeft","volume","muted","paused","playbackRate","open"]);Hv=new Set(["disabled","checked","selected","multiple","readOnly","required","indeterminate","muted","paused","open","autofocus","draggable","hidden"])});function Ss(n,e){for(let[t,r]of Object.entries(e))t==="style"?_u(n,r):cu(n,t,r)}function hf(n,e,t,r,s,i){if(r!=="ref")if(typeof s=="function"||s===void 0&&typeof i=="function"){if(_r.test(r)){let o=ks(r);o&&n.set(e,o,s)}return}else if(_r.test(r)){let o=ks(r);o&&n.set(e,o,s)}else r==="style"?_u(t,s):mf(r)?ff(t,r,s):cu(t,r,s)}var wf=N(()=>{"use strict";Qo();uf();gf();ti()});function yf(n,e){return Vv.has(e)?n.createElementNS(Fv,e):n.createElement(e)}function zv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===1&&t.tagName.toLowerCase()===e.tag)Ss(t,e.attrs);else if(n.absorb.queue&&!t){let s=n.absorb.next("element",e.tag);if(s)Ss(s,e.attrs),n.nodes.set(e.id,s);else{let i=yf(n.doc,e.tag);Ss(i,e.attrs),n.nodes.set(e.id,i)}}else{let s=yf(n.doc,e.tag);Ss(s,e.attrs),t&&(n.refRegistry.unmountOne(e.id),n.eventRegistry.removeOne(e.id),t.replaceWith(s)),n.nodes.set(e.id,s)}let r=n.nodes.get(e.id);r&&r.nodeType===1&&r.setAttribute("data-wf-id",e.id)}function Kv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===3)t.textContent!==e.value&&(t.textContent=e.value);else if(n.absorb.queue&&!t){let r=n.absorb.next("text",void 0,e.value);if(r)r.textContent!==e.value&&(r.textContent=e.value),n.nodes.set(e.id,r);else{let s=n.doc.createTextNode(e.value);n.nodes.set(e.id,s)}}else{let r=n.doc.createTextNode(e.value);t&&t.replaceWith(r),n.nodes.set(e.id,r)}}function Gv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===8){let r=e.detail?`wf-hole: ${e.detail}`:"wf-hole";t.textContent!==r&&(t.textContent=r)}else if(n.absorb.queue&&!t){let r=n.absorb.next("comment");if(r)n.nodes.set(e.id,r);else{let s=n.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");n.nodes.set(e.id,s)}}else{let r=n.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");t&&t.replaceWith(r),n.nodes.set(e.id,r)}}function Qv(n,e){let t=n.nodes.get(e.id);if(!t||t.isConnected)return;let r=n.parentOf(e);if(r){if(r.nodeType===3){let s=r.parentElement;if(!s)return;let i=r.nextSibling&&r.nextSibling.parentNode===s?r.nextSibling:null;s.insertBefore(t,i),t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id);return}if(r.nodeType===8){console.error(`[vdom] id \u7A7A\u95F4\u8FDD\u4F8B\uFF1Ainsert ${e.id} \u7684 parent \u662F\u6CE8\u91CA\u951A\uFF08${e.parent}\uFF09\u2014\u2014\u63D2\u5230\u951A\u540E`);let s=r.parentElement;s&&s.insertBefore(t,r.nextSibling),t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id);return}if(e.ref){let s=n.nodes.get(e.ref)??null;if(!s){let i=n.childIds.size>0&&n.childIds.has(e.ref)?n.collectDesc(e.ref):null;if(i){let o="",a=-1;for(let l of i){let u=n.seq.get(l)??0;u>a&&(a=u,o=l)}o&&(s=n.nodes.get(o)??null)}else{let o=e.ref+".";for(let[a,l]of n.nodes)a.startsWith(o)&&(s=l)}}s&&s.parentNode===r?r.insertBefore(t,s.nextSibling):s?r.appendChild(t):r.insertBefore(t,r.firstChild)}else r.insertBefore(t,r.firstChild);t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id)}}function Jv(n,e){let t=n.nodes.get(e.id);if(t){if(!e.noMove){let r=n.parentOf(e);if(!r)return;let s=e.ref?n.nodes.get(e.ref)??null:null;s?r.insertBefore(t,s.nextSibling):e.first?r.insertBefore(t,r.firstChild):r.appendChild(t)}n.remapSubtree(e.id,e.newId)}}function Zv(n,e){n.refRegistry.unmountOne(e.id),n.eventRegistry.removeOne(e.id),n.nodes.get(e.id)?.remove();let t=n.childIds.size>0?n.collectDesc(e.id):null,r=t??[];if(!t){let s=e.id+".";for(let i of[...n.nodes.keys()])i.startsWith(s)&&r.push(i)}for(let s of r)n.refRegistry.unmountOne(s),n.eventRegistry.removeOne(s),n.nodes.delete(s),n.unregisterChild(s);n.nodes.delete(e.id),n.unregisterChild(e.id)}function Xv(n,e){let t=n.nodes.get(e.id);t&&t.nodeType===3&&(t.textContent=e.value)}function Yv(n,e){let t=n.nodes.get(e.id);if(!t||t.nodeType!==1)return;let r=t;if(e.key==="ref"){let s=n.refRegistry.refs.get(e.id);if(e.value===void 0){n.refRegistry.set(e.id,void 0,s),n.refRegistry.refs.delete(e.id);return}n.refRegistry.set(e.id,e.value,s),r.isConnected&&n.refRegistry.mount(e.id,r);return}if(_r.test(e.key)){let s=ks(e.key);s&&(e.value===void 0?n.eventRegistry.removeEvent(e.id,s):n.eventRegistry.set(e.id,s,e.value));return}hf(n.eventRegistry,e.id,r,e.key,e.value,e.prev)}function ek(n,e){let t=n.nodes.get(e.id);t&&t.nodeType===1&&typeof e.fn=="function"&&(n.refRegistry.set(e.id,e.fn),n.refRegistry.mount(e.id,t))}function tk(n,e){n.clearNodeRefs(e.id)}function nk(n,e){let t=n.registry?.get(e.compId);t&&(t.phase="mounted")}function rk(n,e){n.registry&&vu(e.compId,n.registry)}function sk(n,e){if(e.full&&n.absorb.end(),e.full&&n.touched.size>0)for(let[t,r]of[...n.nodes])n.touched.has(t)||(n.refRegistry.unmountOne(t),n.eventRegistry.removeOne(t),r.remove(),n.nodes.delete(t),n.unregisterChild(t));n.touched.clear()}function bf(n,e){switch(e.op){case"create":zv(n,e);break;case"createText":Kv(n,e);break;case"createAnchor":Gv(n,e);break;case"insert":Qv(n,e);break;case"move":Jv(n,e);break;case"remove":Zv(n,e);break;case"setText":Xv(n,e);break;case"setProp":Yv(n,e);break;case"ref":ek(n,e);break;case"unref":tk(n,e);break;case"mount":nk(n,e);break;case"unmount":rk(n,e);break;case"done":sk(n,e);break;case"close":break}}var Fv,Vv,_f=N(()=>{"use strict";ti();tt();wf();Fv="http://www.w3.org/2000/svg",Vv=new Set(["svg","path","circle","line","rect","text","g","defs","marker","polyline","polygon","ellipse","use","symbol","tspan","textPath","clipPath","mask","pattern","linearGradient","radialGradient","stop"])});var Mn,xs=N(()=>{"use strict";ti();af();tt();lf();_f();Mn=class{nodes=new Map;touched=new Set;childIds=new Map;byChild=new Map;seq=new Map;seqCounter=0;registerChild(e,t){this.byChild.set(t,e),this.seq.set(t,++this.seqCounter);let r=this.childIds.get(e);r||(r=new Set,this.childIds.set(e,r)),r.add(t)}unregisterChild(e){let t=this.byChild.get(e);if(t===void 0)return;this.byChild.delete(e),this.seq.delete(e);let r=this.childIds.get(t);r&&(r.delete(e),r.size===0&&this.childIds.delete(t))}collectDesc(e){let t=[],r=[e];for(;r.length>0;){let s=r.pop();t.push(s);let i=this.childIds.get(s);if(i)for(let o of i)r.push(o)}return t}reset(){this.nodes.clear(),this.touched.clear(),this.childIds.clear(),this.byChild.clear(),this.seq.clear(),this.seqCounter=0,this.eventRegistry.clear(),this.refRegistry.clear()}eventRegistry;refRegistry=new ni;absorb=new ri;container;doc;registry;devVerify=null;constructor(e,t,r){this.container=e,this.doc=t,this.registry=r??null,this.eventRegistry=new ei(t,e)}dispose(){if(this.eventRegistry.dispose(),this.refRegistry.dispose(),this.registry)for(let e of[...this.registry.keys()].reverse()){let t=this.registry.get(e);if(t){for(let r of[...t.onUnmounts].reverse())try{r()}catch{}this.registry.delete(e)}}}clearNodeRefs(e){this.refRegistry.unmount(e)}remapSubtree(e,t){let r=(i,o)=>{let a=i.get(o);a!==void 0&&(i.delete(o),i.set(t+o.slice(e.length),a))};for(let i of[...this.nodes.keys()])if(i===e||i.startsWith(e+".")){r(this.nodes,i);let o=this.nodes.get(t+i.slice(e.length));o&&o.nodeType===1&&o.setAttribute("data-wf-id",t+i.slice(e.length))}for(let[i,o]of[...this.byChild]){let a=i===e||i.startsWith(e+"."),l=o===e||o.startsWith(e+".");if(!a&&!l)continue;let u=a?t+i.slice(e.length):i,c=l?t+o.slice(e.length):o;this.byChild.delete(i),this.byChild.set(u,c);let d=this.childIds.get(o);d&&(d.delete(i),d.size===0&&this.childIds.delete(o));let p=this.childIds.get(c);p||(p=new Set,this.childIds.set(c,p)),p.add(u)}let s=this.byChild.get(e);s!==void 0&&!this.byChild.has(t)&&(this.unregisterChild(e),this.registerChild(s,t)),this.refRegistry.remap(e,t);for(let i of[...this.eventRegistry.table.keys()])if(i===e||i.startsWith(e+".")){let o=this.eventRegistry.table.get(i);this.eventRegistry.table.delete(i),this.eventRegistry.table.set(t+i.slice(e.length),o)}if(this.registry){for(let i of[...this.registry.keys()])if(i===e||i.startsWith(e+".")){let o=this.registry.get(i);this.registry.delete(i),this.registry.set(t+i.slice(e.length),o)}}}parentOf(e){if(e.parent==="root")return this.container;let t=this.nodes.get(e.parent);if(t&&t.isConnected)return t;let r=e.parent.split(".");for(let s=r.length-1;s>0;s--){let i=r.slice(0,s).join(".");if(i==="root")return this.container;let o=this.nodes.get(i);if(o&&o.isConnected)return o}return null}apply(e){bf(this,e),this.devVerify&&this.devVerify(e,this)}}});function ku(n){return`${oi}-${n}`}var oi,vf=N(()=>{"use strict";oi="__wf_portal"});function ok(n,e){switch(e.kind){case"open":return"open";case"exit":return n==="open"?"exit":n;case"closed":return"closed";case"disposed":return"closed"}}function ik(n){return typeof n=="function"?n():n}function kf(n){return n?typeof n=="function"?n():n:null}function ii(n,e){let t={tree:null,applier:null,container:null,chain:Promise.resolve(),version:0,open:!1,phase:"closed",disposed:!1,panel:null,pos:{top:0,left:0},segments:new Map},r=new fe,s=r.asObservable();r.asObservable().pipe(ur(ok,"closed")).subscribe({next:E=>{t.phase=E}});let i=E=>{r.next(E)},o=n.getBrowser()?.window,a=n.getBrowser()?.document,l=()=>{if(!a)return null;if(t.container)return t.container;let E=a.getElementById(oi);E||(E=a.createElement("div"),E.id=oi,a.body.appendChild(E));let x=e.key??"popup",O=a.getElementById(ku(x));return O?t.container=O:(t.container=a.createElement("div"),t.container.id=ku(x),E.appendChild(t.container)),t.container},u=0,c=!1,d=()=>{if(t.disposed||!t.open)return;if(e.position&&t.panel){let W=e.position();if(W&&typeof W.x=="number"&&typeof W.y=="number"){t.pos={top:W.y,left:W.x,width:W.width},c=!0,f();return}}let E=kf(e.anchor);if(!E||!t.panel){u++<10&&queueMicrotask(d);return}if(!o)return;let x=t.panel,O=x.offsetWidth||x.getBoundingClientRect().width,I=x.offsetHeight||x.getBoundingClientRect().height;if((O===0||I===0)&&u++<10){typeof o.requestAnimationFrame=="function"?o.requestAnimationFrame(d):queueMicrotask(d);return}let $=typeof e.placement=="function"?e.placement():e.placement??"bottom",M=Mm(E,o,O,I,$,e.gap??8,e.margin??8,e.center??!0);if(!M){u++<10&&queueMicrotask(d);return}if(u=0,t.pos=M,t.applier){let W=g(t.tree);W&&w(W)}},p=E=>{if(t.panel=E,E&&t.open&&!c&&e.positioning!=="none"&&(o&&typeof o.requestAnimationFrame=="function"?o.requestAnimationFrame(d):queueMicrotask(d)),E&&e.presence){let x=O=>{t.phase==="exit"&&k()};E.addEventListener("animationend",x),n.onUnmount(()=>E.removeEventListener("animationend",x))}},m=null,h=E=>{m=E,E&&c&&f()},f=()=>{let E=e.mask?m:t.panel;E&&(E.style.top=`${t.pos.top}px`,E.style.left=`${t.pos.left}px`,t.pos.width!==void 0&&(E.style.width=`${t.pos.width}px`))},g=E=>{if(!E)return null;let x=E;e.mask&&(x=Ge("div",{class:"wf-popup-mask",style:{position:"fixed",inset:"0",background:"var(--wf-overlay, rgba(0,0,0,0.5))",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"var(--wf-z-modal, 1000)"},onClick:q=>{e.maskClosable!==!1&&q.target===q.currentTarget&&_()}},e.maskCentered?{...x,props:{...x.props??{}}}:Ge("div",{class:"wf-popup-mask-inner",ref:h,style:e.position?{position:"fixed",top:`${t.pos.top}px`,left:`${t.pos.left}px`,...t.pos.width!==void 0?{width:`${t.pos.width}px`}:{}}:void 0},x)));let O=x.props??{},I=e.positioning==="none"||String(O.class??"").includes("mask")?O.class??"":["wf-popup",O.class].filter(Boolean).join(" "),$=!(e.mask&&e.position),M=e.positioning==="none"?{...O.style??{},position:"fixed"}:{...O.style??{},position:"fixed",...$?{top:`${t.pos.top}px`,left:`${t.pos.left}px`}:{},...$&&t.pos.width!==void 0?{width:`${t.pos.width}px`}:{}};return{...x,props:{...O,class:I,style:M,ref:p}}},w=E=>{let x=++t.version,O=t.tree;t.tree=E,t.chain=t.chain.then(async()=>{if(t.disposed||x!==t.version)return;let I=t.applier;if(!I)return;let $=I.registry;if(!$)return;let M=n.getSharedContext()??{},W=await new Promise((q,D)=>{let B=[],z=()=>n.requestRender?.();(O?vs(O,E,M,t.segments,$,z):vr(E,M,$,t.segments,z)).subscribe({next:te=>B.push(te),error:D,complete:()=>q(B)})});for(let q of W){if(t.disposed||x!==t.version)return;I.apply(q)}for(let q of W)q.op==="unmount"&&at(q.compId,t.segments)}).catch(I=>{console.error("[popup] render error:",I)})},y=()=>{t.disposed||(t.disposed=!0,t.applier&&(t.applier.dispose(),t.applier=null),t.tree=null,t.container&&(t.container.remove(),t.container=null))},k=()=>{t.disposed||(t.open=!1,i({kind:"closed"}),C(),y(),i({kind:"disposed"}),e.onClose?.())},_=()=>{!t.open||t.disposed||(e.presence?(i({kind:"exit"}),t.panel&&o&&!$m(t.panel,o)&&k(),t.panel||k()):k())},v={value:""},S={value:null},A={value:!1},C=()=>{A.value&&(a?.body&&(a.body.style.overflow=v.value),v.value="",S.value&&(S.value.focus?.(),S.value=null),A.value=!1)},j=()=>{n.scheduleAfterRender(()=>{let E=x=>{let O=t.panel;O?(O.querySelector?.("input, button, [tabindex], select, textarea")??O).focus?.():x<10&&t.open&&queueMicrotask(()=>E(x+1))};E(0)})},K=()=>{A.value=!0,e.lockScroll&&a?.body&&(v.value=a.body.style.overflow,a.body.style.overflow="hidden"),e.trapFocus&&o&&(S.value=o.document.activeElement,j())},U=null;e.trapFocus&&o&&(U=E=>{if(E.key!=="Tab"||!t.open||!t.panel)return;let x=Array.from(t.panel.querySelectorAll?.("input, button, [tabindex], select, textarea")??[]).filter(M=>!M.disabled&&M.offsetParent!==null);if(x.length===0)return;let O=x[0],I=x[x.length-1],$=o?.document.activeElement;E.shiftKey&&($===O||$===t.panel||!t.panel.contains($))?(E.preventDefault(),I.focus()):!E.shiftKey&&($===I||!t.panel.contains($))&&(E.preventDefault(),O.focus())},o.addEventListener("keydown",U));let H=E=>{if(!t.open||(e.closeOnOutside??!0)===!1)return;let x=E.target,O=kf(e.anchor);x&&O?.contains(x)||x&&t.panel?.contains(x)||_()},V=E=>{t.open&&(e.closeOnEscape??!0)&&E.key==="Escape"&&_()};o&&(o.addEventListener("mousedown",H),o.addEventListener("keydown",V)),n.onUnmount(()=>{o&&(o.removeEventListener("mousedown",H),o.removeEventListener("keydown",V),U&&o.removeEventListener("keydown",U)),k()});let Q=()=>{if(t.open||t.disposed)return;t.open=!0,i({kind:"open"});let E=l();if(!E)return;e.trapFocus||e.lockScroll?K():e.autoFocus&&j();let x=Ct();t.applier=new Mn(E,a,x),t.segments=new Map;let O=ik(e.content);O!=null?w(g(O)):k()},P={close:_,update(E){if(t.disposed||!t.open)return;if(E==null){_();return}let x=!1;if(e.position){let O=e.position();O&&typeof O.x=="number"&&typeof O.y=="number"&&(t.pos={top:O.y,left:O.x,width:O.width},x=!0)}w(g(E)),x&&f()},refresh(){if(!(t.disposed||!t.open||!t.tree)&&e.position){let E=e.position();E&&typeof E.x=="number"&&typeof E.y=="number"&&(t.pos={top:E.y,left:E.x,width:E.width},f())}},get open(){return t.open},events$:s};return Q(),P}var Su=N(()=>{"use strict";Cn();Nn();Pn();xs();tt();vf();au();he()});function Sf(n,e,t){let r=n.nextHookIndex(),s=n.getHookState(r)??{value:t};n.setHookState(r,s);let i=e.value!==void 0;return{get value(){return e.value??s.value},controlled:e,setValue(o){i?(e.onChange||console.warn("[vdom] useControlled \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548"),e.onChange?.(o)):(s.value=o,n.requestRender())}}}var xf=N(()=>{"use strict"});function Rf(n,e){let t=new fe,r=dt(n,ak(n,e,t),{y:0,x:0});return{get y(){return r().y},get x(){return r().x},refresh:()=>{t.next()}}}function ak(n,e,t){let r=n.getBrowser()?.window,s=n.getBrowser()?.document??null;return be(i=>{if(!r)return i.next({y:0,x:0}),i.complete(),()=>{};let o,a=null,l=null,u=0,c=()=>{if(typeof e=="function")return e();if(e&&typeof e=="object"&&!("nodeType"in e)){let f=e;return typeof f.getScroller=="function"?f.getScroller()??null:f.root?typeof f.root=="string"?s?s.querySelector(f.root)??r:r:f.root:r}return r},d=f=>f?f===r?{y:r.scrollY||0,x:r.scrollX||0}:{y:f.scrollTop,x:f.scrollLeft}:{y:0,x:0},p=()=>{i.next(d(l))},m=()=>{if(a)return;if(l=c(),!l){u++<10&&n.scheduleAfterRender(m);return}let f=()=>{o===void 0&&(o=r.requestAnimationFrame(()=>{o=void 0,p()}))};l.addEventListener("scroll",f,{passive:!0}),a=f,p()};m();let h=t?.subscribe({next:()=>{m(),p()}});return()=>{h?.unsubscribe(),o!==void 0&&r.cancelAnimationFrame(o),a&&l&&l.removeEventListener("scroll",a),a=null}})}function Ef(n,e){let t=n.nextHookIndex(),r=n.getHookState(t)??{isIn:!1,io:null,retries:0,ready:!1};n.setHookState(t,r);let i=n.getBrowser()?.window?.IntersectionObserver,o=e&&typeof e=="object"&&!("nodeType"in e)?e:void 0,a=o?.target??(typeof e=="function"||e&&"nodeType"in e?e:void 0),l=typeof o?.rootMargin=="function"?o.rootMargin():o?.rootMargin,u=typeof o?.threshold=="function"?o.threshold():o?.threshold,c=typeof o?.root=="function"?o.root():o?.root??null,d=p=>{if(!i||!p||r.io)return;let m=new i(h=>{let f=h[0];f&&f.isIntersecting!==r.isIn&&(r.isIn=f.isIntersecting,o?.onChange?.(f,f.isIntersecting),n.requestRender())},{root:c??void 0,rootMargin:l,threshold:u});m.observe(p),r.io=m,r.ready=!0,n.onUnmount(()=>r.io?.disconnect())};if(i&&!r.io){let p=typeof a=="function"?a():a??null;p?d(p):a!==void 0&&r.retries++<10&&n.scheduleAfterRender(()=>d(typeof a=="function"?a():a??null))}return{get isIn(){return r.isIn},get ready(){return r.ready},ref:p=>{p?d(p):r.io?.disconnect()},observe:p=>d(p),disconnect:()=>{r.io?.disconnect(),r.io=null}}}var Tf=N(()=>{"use strict";he();cr()});function Cf(n,e,t){let r=n.nextHookIndex(),s=n.getHookState(r)??{keyword:"",selectedLabel:"",composing:!1};n.setHookState(r,s);let i=e.value!==void 0;return{controlled:e,get value(){return e.value??s.keyword},setValue(o){i?(e.onChange||console.warn(`[vdom] useControlledInput(${t?.name??""}) \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),e.onChange?.(o)):(s.keyword=o,n.requestRender())},get keyword(){return s.keyword},setKeyword(o){s.keyword=o,s.composing||this.setValue(o)},get selectedLabel(){return s.selectedLabel},setSelectedLabel(o){s.selectedLabel=o},get isComposing(){return s.composing},onCompositionStart(){s.composing=!0},onCompositionEnd(){s.composing=!1}}}var Af=N(()=>{"use strict"});function If(n,e){let t={draggable:!0,onDragStart:r=>{e.data!==void 0&&r.dataTransfer?.setData("text/plain",JSON.stringify(e.data)),e.onDragStart?.(r,e.data)},onDragEnd:r=>e.onDragEnd?.(r)};return{draggableProps:t,dragProps:t,dropProps:{onDragEnter:r=>e.onDragEnter?.(r),onDragOver:r=>{r.preventDefault(),e.onDragOver?.(r)},onDragLeave:r=>e.onDragLeave?.(r),onDrop:r=>{r.preventDefault();let s;try{s=r.dataTransfer?.getData("text/plain")?JSON.parse(r.dataTransfer.getData("text/plain")):void 0}catch{s=void 0}e.onDrop?.(r,s)}}}}function uk(n,e){let t=n.getBrowser()?.window,r=t?Of.get(t)??Of.set(t,new Map).get(t):lk,s=r.get(e);return s||(s=eu(i=>{let o=n.getBrowser()?.window,l=(o?.matchMedia?.bind(o)??(typeof globalThis.matchMedia=="function"?globalThis.matchMedia.bind(globalThis):void 0))?.(e);if(!l)return;let u=()=>i(l.matches);return l.addEventListener("change",u),()=>l.removeEventListener("change",u)},()=>{let i=n.getBrowser()?.window,o=i?.matchMedia?.bind(i)??(typeof globalThis.matchMedia=="function"?globalThis.matchMedia.bind(globalThis):void 0);return o?o(e).matches:!1}),r.set(e,s)),s}function Rs(n,e){return dt(n,uk(n,e),!1)}function Pf(n,e){let t=Object.entries(e).sort((r,s)=>r[1]-s[1]);return()=>{let r=t[0]?.[0]??"default";for(let[s,i]of t)Rs(n,`(min-width: ${i}px)`)()&&(r=s);return r}}var Of,lk,xu=N(()=>{"use strict";he();cr();Of=new WeakMap,lk=new Map});function dk(){let n="";return(e,t)=>{let r=e.trim();if(!r)return null;if(r.startsWith("event:"))return n=r.slice(6).trim(),null;let s=t??n,i=r.startsWith("data:")?r.slice(5).trim():r;if(!i)return null;let o;try{o=JSON.parse(i)}catch{return null}if(!s)return o.toolCalls?{toolCalls:o.toolCalls}:o.text!==void 0?{content:String(o.text)}:o.content!==void 0?{content:o.content}:null;switch(s){case"wf:message_start":return null;case"wf:token":return{content:o.text!==void 0?String(o.text):o.content};case"wf:step":return{step:o};case"wf:usage":return{usage:o};case"wf:tool_call":return{toolCalls:[{id:o.id,name:o.name,args:o.args,status:"running",call:o}]};case"wf:tool_progress":return{toolProgress:o};case"wf:tool_result":return{toolResult:o};case"wf:approval_request":return{approval:o};case"wf:error":return{error:o};case"wf:done":{let a=o.usage?{usage:o.usage}:{};return{done:!0,...o.content?{content:o.content,doneContent:!0}:{},...a}}default:return null}}}function Nf(n,e){let t=n.nextHookIndex(),r=n.getHookState(t)??{messages:[],status:"idle",subs:new Set,changes:new fe,controller:null,seq:0,input:"",error:null,usage:null,step:null};if(n.setHookState(t,r),r.messages.length===0){let a=[];e.system&&a.push({id:Ru(),role:"system",content:e.system}),e.initialMessages&&a.push(...e.initialMessages),r.messages=a}let s=()=>{for(let a of[...r.subs])a();r.changes.next([...r.messages])},i=e.parseChunk??dk(),o={get state(){return r.messages},get messages(){return r.messages},changes$:r.changes.asObservable(),get status(){return r.status},get input(){return r.input??""},setInput(a){r.input=a},get streaming(){return r.status==="streaming"},get error(){return r.error??null},get usage(){return r.usage??null},get step(){return r.step??null},subscribe(a){return r.subs.add(a),()=>{r.subs.delete(a)}},set(){},update(){},notify:s,async send(a=r.input){let l=typeof e.url=="function"?e.url():e.url??"/api/chat",u={id:Ru(),role:"user",content:a};r.messages=[...r.messages,u];let c={id:Ru(),role:"assistant",content:"",status:"streaming"};r.messages=[...r.messages,c],r.status="streaming",s();let d=new AbortController;r.controller=d;try{let p=await fetch(l,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({messages:r.messages.map(g=>({role:g.role,content:g.content}))}),signal:d.signal});if(!p.ok||!p.body)throw new Error(`[vdom] chat \u8BF7\u6C42\u5931\u8D25 ${p.status}`);let m=p.body.getReader(),h=new TextDecoder,f="";for(;;){let{value:g,done:w}=await m.read();if(w)break;f+=h.decode(g,{stream:!0});let y=f.split(`
117
- `);f=y.pop()??"";let k;for(let _ of y){if(!_.trim())continue;if(_.trim().startsWith("event:")){k=_.trim().slice(6).trim();continue}let v=i(_,k);if(_.trim().startsWith("data:")&&(k=void 0),!!v){if(v.content&&(c.content=v.doneContent?c.content||v.content:c.content+v.content,s()),v.toolCalls?.length&&(c.toolCalls=[...c.toolCalls??[],...v.toolCalls],s()),v.toolProgress){let S=c.toolCalls?.find(A=>A.id===v.toolProgress.toolCallId);S&&(S.progress=v.toolProgress,s())}if(v.toolResult){let S=c.toolCalls?.find(A=>A.id===v.toolResult.id);S&&(S.result=v.toolResult.output,S.status=v.toolResult.ok===!1?"error":"ok",s())}if(v.approval){c.approval=v.approval;let S=c.toolCalls?.find(A=>A.id===v.approval.toolCallId);S&&(S.approval=v.approval),s()}v.usage&&(r.usage=v.usage,s()),v.step!==void 0&&(r.step=v.step,s()),v.error&&(r.error=v.error,c.status="error",s()),v.done&&(r.step=null,s())}}}c.status=void 0,r.status="idle"}catch(p){p.name!=="AbortError"?(c.status="error",r.status="error"):(c.status=void 0,r.status="idle")}finally{r.controller=null,s()}},stop(){r.controller?.abort()},retry(){let a=[...r.messages].reverse().find(l=>l.role==="user");a&&o.send(a.content)},reset(){r.messages=[],r.status="idle",s()},async approve(a,l,u){let c=!1;for(let d of r.messages){for(let p of d.toolCalls??[])if(!p.approved){p.approved=a!=="rejected",l&&(p.feedback=l),a==="modified"&&u&&(p.args=u),c=!0;break}if(c)break}s()}};return o}var ck,Ru,Mf=N(()=>{"use strict";he();ck=0,Ru=()=>`m${Date.now().toString(36)}${(ck++).toString(36)}`});function Eu(n){return Rs(n,"(prefers-reduced-motion: reduce)")()}function $f(n,e,t){let r=n.getBrowser()?.window,s=Eu(n),i=t?.duration??400;if(i<=0)return{value:e,reset:()=>{}};let o=t?.ease==="linear"?k=>k:k=>1-Math.pow(1-k,3),a=n.nextHookIndex(),l=n.getHookState(a);if(l)return l.reset(e),l;let u=s?e:0,c,d=e,p=0,m=i+200,h,f={get value(){return c!==void 0&&r&&r.performance.now()-p>m?d:u},set value(k){u=k},reset:()=>{}},g=()=>{n.requestRender()},w=k=>{if(d=k,s){f.value=k,g();return}if(k===f.value)return;if(!r){f.value=k;return}c!==void 0&&r.cancelAnimationFrame(c);let _=f.value,v=r.performance.now();p=v,y();let S=A=>{let C=Math.min(1,(A-v)/i);f.value=Math.round(_+(k-_)*o(C)),C<1?c=r.requestAnimationFrame(S):c=void 0,g()};c=r.requestAnimationFrame(S)},y=()=>{r&&(h!==void 0&&clearTimeout(h),h=setTimeout(()=>{h=void 0,c!==void 0&&(r&&r.cancelAnimationFrame(c),c=void 0,f.value=d,g())},m))};return f.reset=k=>{k===d&&c!==void 0||w(k)},n.onUnmount(()=>{c!==void 0&&r&&(r.cancelAnimationFrame(c),c=void 0)}),n.setHookState(a,f),l=f,l.reset(e),l}function qf(n,e){let t=n.getBrowser()?.window,r=0,s=0,i=!1,o=0,a=d=>{i&&e.onMove(d,{x:d.clientX-r,y:d.clientY-s})},l=d=>{i&&d.pointerId===o&&(i=!1,t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u)),e.onEnd?.(d))},u=d=>{!i||d.pointerId!==o||(i=!1,t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u)),e.onEnd?.(d))},c=d=>{i||(d.preventDefault(),i=!0,o=d.pointerId,r=d.clientX,s=d.clientY,t&&(t.addEventListener("pointermove",a),t.addEventListener("pointerup",l),t.addEventListener("pointercancel",u)),e.onStart?.(d))};return n.onUnmount(()=>{i&&t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u),i=!1)}),{onPointerDown:c}}function Df(n){let e=dt(n,pk(n),{height:0,offsetTop:0,keyboardOpen:!1});return{get height(){return e().height},get offsetTop(){return e().offsetTop},get keyboardOpen(){return e().keyboardOpen}}}function pk(n){let e=n.getBrowser()?.window;return be(t=>{let r=()=>{let o=e?.visualViewport,a=o?.height??e?.innerHeight??0;return{height:a,offsetTop:o?.offsetTop??0,keyboardOpen:a<(e?.innerHeight??0)*.9}};if(!e)return t.next({height:0,offsetTop:0,keyboardOpen:!1}),t.complete(),()=>{};let s=()=>t.next(r()),i=e.visualViewport;return i?.addEventListener?(i.addEventListener("resize",s),i.addEventListener("scroll",s),s(),()=>{i.removeEventListener("resize",s),i.removeEventListener("scroll",s)}):(e.addEventListener("resize",s),s(),()=>e.removeEventListener("resize",s))})}var jf=N(()=>{"use strict";xu();he();cr()});function Tu(n,e){let t=n.nextHookIndex(),r=n.getHookState(t);return r===void 0&&(r={v:e},n.setHookState(t,r)),{get:()=>r.v,set:s=>{r.v=typeof s=="function"?s(r.v):s,n.requestRender()}}}var Cu=N(()=>{"use strict"});function Au(n,e){let t=null,r=e,s={onClick:l=>{r.maskClosable!==!1&&l.target===l.currentTarget&&o()}},i={role:e.role??"dialog","aria-modal":!0},o=()=>r.onOpenChange?.(!1),a=(l,u)=>{u&&(r=u);let c=!!r.open;c&&!t?t=ii(n,{key:"overlay",presence:!!r.presence,trapFocus:r.trapFocus!==!1,lockScroll:r.lockScroll!==!1,positioning:"none",closeOnOutside:!1,closeOnEscape:!1,content:l,onClose:()=>{t=null}}):!c&&t?(t.update(l()),t.close(),t=null):t&&t.update(l())};return Go(n,l=>{l.key==="Escape"&&t?.open&&r.closeOnEscape!==!1&&o()}),n.onUnmount?.(()=>{t&&t.close()}),{maskProps:s,panelProps:i,close:o,sync:a}}var Ou=N(()=>{"use strict";Su();iu()});function Iu(n,e){let t=e,r=()=>t.id??(t.name?`wf-${t.name}`:void 0),s=()=>r()??"wf-field";return{get hasWrap(){return!!(t.label||t.error||t.hint)},get stateClass(){return t.error?` ${t.wrapErrClass??"wf-field--err"}`:""},get inputId(){return r()},inputProps(){let i={},o=r();o&&(i.id=o),t.error&&(i["aria-invalid"]=!0);let a=[];return t.error&&a.push(`${s()}-err`),t.hint&&!t.error&&a.push(`${s()}-hint`),a.length&&(i["aria-describedby"]=a.join(" ")),t.required&&(i["aria-required"]=!0),i},renderLabel(){if(t.label==null&&!t.required)return null;let i=[];return t.label!=null&&i.push(t.label),t.required&&i.push(Ge("span",{class:t.reqClass??"wf-field-req"},t.reqChar??"*")),Ge("label",{class:t.labelClass,...r()?{for:r()}:{}},i)},renderError(){return t.error?Ge("div",{class:t.errClass,id:`${s()}-err`},t.error):null},renderHint(){return t.hint&&!t.error?Ge("div",{class:t.hintClass,id:`${s()}-hint`},t.hint):null}}}var Pu=N(()=>{"use strict";Cn()});function yu(n){return{useObservable(e,t,r){return dt(n,e,t,r)},useAsyncData(e,t){let r=Lf.get(t);r||(r={trigger:new Xt(void 0),state$:new Xt(ai.get(t)??null),fetcher:null,started:ai.has(t),seedHit:ai.has(t),sub:null},ai.delete(t),Lf.set(t,r)),r.fetcher=e;let s=()=>{if(r.sub||r.seedHit)return;r.started=!0;let a=r.trigger.asObservable().pipe(Ko(()=>{let l=r.fetcher;if(!l)return lr(Promise.resolve(null));let u=l();return Wf.add(u),u.finally(()=>Wf.delete(u)).catch(()=>{}),lr(u)}));r.sub=a.subscribe({next:l=>{r.state$.next(l)},error:l=>{console.error("[vdom] useAsyncData:",l),mk.next({key:t,error:l}),r.state$.next(null)}})};return s(),[dt(n,r.state$.asObservable(),null),()=>{r.seedHit&&(r.seedHit=!1),r.state$.next(null),r.sub?r.trigger.next():s()}]},useSession(e){let[t]=this.useAsyncData(async()=>{let r={},s=e?.token?.();s&&(r.Authorization=`Bearer ${s}`);let i=await fetch(e?.path??"/api/auth/me",{headers:r});if(!i.ok)throw new Error(`session \u83B7\u53D6\u5931\u8D25 HTTP ${i.status}`);return await i.json()},"wf:session");return t},useExternal(e){let t=n.getInstanceData(),r=t.get(e);if(!r){let s=e.subscribe(()=>n.requestRender());n.onUnmount(s),r={unsub:s},t.set(e,r)}return()=>e.state},signal:e=>{let t=su(e),r=t.subscribe(()=>n.requestRender());return n.onUnmount(r),t},hold:e=>n.onUnmount(e),useStableRef:(e,t)=>Pm(n,e,t),useOpen:(e,t)=>Nm(n,e,t),onUnmount:e=>n.onUnmount(e),useGlobalKey:(e,t)=>Go(n,e,t),openPopup:e=>ii(n,e),usePopupPosition:e=>qm(n,e),useControlled:(e,t)=>Sf(n,e,t),useScrollPosition:e=>Rf(n,e),useInView:e=>Ef(n,e),useControlledInput:(e,t)=>Cf(n,e,t),useDragDrop:e=>If(n,e),useMedia:e=>Rs(n,e),useBreakpoint:e=>Pf(n,e),useChat:e=>Nf(n,e),useTween:(e,t)=>$f(n,e,t),useDrag:e=>qf(n,e),useVisualViewport:()=>Df(n),useReducedMotion:()=>Eu(n),useSignal:e=>Tu(n,e),useOverlay:e=>Au(n,e),useField:e=>Iu(n,e)}}var Lf,Wf,mk,ai,Xo=N(()=>{"use strict";ou();he();cr();iu();au();Su();xf();Tf();Af();xu();Mf();jf();Cu();Ou();Pu();Lf=new Map,Wf=new Set,mk=new fe,ai=new Map});var Nu=N(()=>{"use strict"});var Uf=N(()=>{"use strict"});function Yo(n){return Qe(n)?{kind:"hole"}:Array.isArray(n)?{kind:"array",items:n}:{kind:"vnode",v:n}}function nn(n){return n.kind==="hole"?null:n.kind==="array"?n.items:n.v}function Ct(){let n=new Map;return{get:e=>n.get(e),set:(e,t)=>{n.set(e,t)},delete:e=>{n.delete(e)},keys:()=>[...n.keys()],asyncTimeout:15e3}}function vu(n,e){let t=[...e.keys()].filter(r=>r===n||r.startsWith(n+".")).reverse();for(let r of t){let s=e.get(r);if(s){for(let i of s.onUnmounts.reverse())try{i()}catch(o){console.error("[vdom] onUnmount:",o)}e.delete(r)}}}var tt=N(()=>{"use strict";Xo();gr();Nu();mr();fs();Uf()});function bu(n,e,t,r){return typeof n?.type=="function"||Array.isArray(n)||pt(n)==="hole"?{parent:e,index:0}:{parent:t,index:r}}function Ue(n,e,t,r,s,i,o,a){let l=[];return Es(n,e,t,r,s,i,o,a,l),we(l)}function Es(n,e,t,r,s,i,o,a,l){let u=ae(e,t);switch(pt(n)){case"text":{let c=Jo(n);l.push({op:"createText",id:u,value:c},{op:"insert",id:u,parent:e,ref:r});break}case"hole":{pu(c=>l.push(c),u,e,r);break}case"array":{let c=n;gs(c,`\u6570\u7EC4\u5C55\u5F00\uFF08${e}\uFF09`);let d=t,p=r;for(let m of c){Es(m,e,d,p,s,i,o,a,l);let h=Ae(m);p=ae(e,d+h-1),d+=h}break}case"fragment":{let c=Me(n);gs(c,`Fragment \u5C55\u5F00\uFF08${e}\uFF09`);let d=t,p=r;for(let m of c){Es(m,e,d,p,s,i,o,a,l);let h=Ae(m);p=ae(e,d+h-1),d+=h}break}case"element":{let c=n;l.push({op:"create",id:u,tag:c.type,attrs:ws(c.props)});for(let[f,g]of Object.entries(c.props))f==="children"||f==="key"||f==="ref"||typeof g=="function"&&l.push({op:"setProp",id:u,key:f,value:g});l.push({op:"insert",id:u,parent:e,ref:r});let d=c.props.ref;typeof d=="function"&&l.push({op:"ref",id:u,fn:d});let p=Me(c);gs(p,`\u5143\u7D20 children\uFF08${u}\uFF09`);let m=null,h=0;for(let f of p){Es(f,u,h,m,s,i,o,a,l);let g=Ae(f);m=ae(u,h+g-1),h+=g}l.push({op:"close",id:u});break}case"component":{let c=n,d=c.key!==null?it(e,c.key):u,p=o??new Map,m=p.get(d);m&&m.factory!==c.type&&(at(d,p),m=void 0),m?ct("seg:reuse",d):(m=hu(c.type,c.props,s,d,a),p.set(d,m),ct("seg:create",d));let h;try{h=wu(m,c.props)}catch(g){ms(d,g),h=null}h!==null&&Xl(d),m.lastOutput=Yo(h);let f=bu(h,d,e,t);if(Qe(h)){let g=ae(d,0);l.push({op:"createAnchor",id:g},{op:"insert",id:g,parent:e,ref:r},{op:"mount",compId:d});break}Es(h,f.parent,f.index,r,s,i,p,a,l),l.push({op:"mount",compId:d});break}case"invalid":{console.warn(`[vdom] \u975E\u6CD5\u5B50\u8282\u70B9\u2014\u2014${du(n)}`),pu(c=>l.push(c),u,e,r,du(n));break}}}function vr(n,e,t,r,s){let i=e??{},o=t??Ct();return Ue(n,"root",0,null,i,o,r,s).pipe(fk(we([{op:"done",full:!0}])))}function we(n){return be(e=>{for(let t of n)e.next(t);return e.complete(),()=>{}})}function Ze(n){return be(e=>{let t=0,r=null,s=!1,i=!1,o=()=>{if(!(s||i)){for(i=!0;!s;){if(t>=n.length){e.complete();break}let a=n[t++],l=!1,u=!0;if(r=a.subscribe({next:c=>e.next(c),error:c=>{s||(s=!0,e.error(c))},complete:()=>{l||s||(l=!0,!u&&o())}}),u=!1,!l)break}i=!1}};return o(),()=>{s=!0,r?.unsubscribe()}})}function fk(n){return e=>Ze([e,n])}var Nn=N(()=>{"use strict";fs();tt();pr();An();Yt();en();mr();mu();en();he();Pn();tt()});var zf={};ie(zf,{VOID_ELEMENTS:()=>Hf,attrsToHtml:()=>Vf,commandToHtml:()=>gk,escapeHtml:()=>kr,htmlDocument:()=>hk,kebab:()=>Ff});function kr(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ff(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function Vf(n){let e=[];for(let[t,r]of Object.entries(n)){let s=hs(t,r);if(s!==null){e.push(`${t}="${s}"`);continue}if(!(r==null||r===!1))if(t==="style"&&r&&typeof r=="object"){let i=Object.entries(r).filter(([,o])=>o!=null&&o!==!1).map(([o,a])=>`${Ff(o)}: ${a}`).join("; ");i&&e.push(`style="${kr(i)}"`)}else typeof r=="boolean"?e.push(`${t}=""`):e.push(`${t}="${kr(String(r))}"`)}return e.length?" "+e.join(" "):""}function gk(){let n=[];return new TransformStream({transform(e,t){switch(e.op){case"create":n.push(e.tag),t.enqueue(`<${e.tag}${Vf(e.attrs)}>`);break;case"createText":t.enqueue(kr(e.value));break;case"createAnchor":t.enqueue("<!--wf-hole-->");break;case"close":{let r=n.pop();r&&!Hf.has(r)&&t.enqueue(`</${r}>`);break}case"setText":t.enqueue(kr(e.value));break;case"insert":case"remove":case"setProp":case"ref":case"unref":case"mount":case"unmount":case"move":case"done":break}}})}function hk(n,e={}){let t=e.rootId??"root",r=e.data?`<script>window.__DATA__=${JSON.stringify(e.data).replace(/</g,"\\u003c")}</script>`:"";return`<!DOCTYPE html><html><head><meta charset="utf-8"><title>${kr(e.title??"")}</title></head><body><div id="${t}">${n}</div>${r}</body></html>`}var Hf,Kf=N(()=>{"use strict";Qo();Hf=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"])});function Gf(n){return new Promise((e,t)=>{let r=[];n.subscribe({next:s=>r.push(s),error:t,complete:()=>e(r)})})}async function Mu(n,e,t){let r=t??Ct(),s=await Gf(vr(n,e,r)),{commandToHtml:i}=await Promise.resolve().then(()=>(Kf(),zf)),a=new ReadableStream({start(u){for(let c of s)u.enqueue(c);u.close()}}).pipeThrough(i()).getReader(),l="";for(;;){let{value:u,done:c}=await a.read();if(c)break;l+=u}return l}var Sr=N(()=>{"use strict";Nn();tt();Pn()});var $u=N(()=>{"use strict";to();va()});var qu=N(()=>{"use strict"});var Qf=N(()=>{"use strict";Cn()});var Jf=N(()=>{"use strict"});var Zf=N(()=>{"use strict";Jf()});var Xf=N(()=>{"use strict";Nu()});var Du=N(()=>{"use strict";he();Yt()});var Yf=N(()=>{"use strict";he();Yt();Pn()});var eg=N(()=>{"use strict";Yt();fs()});var ju=N(()=>{"use strict";he();Nn();Yt();Qf();$u();Zf();qu();xs();tt();Xf();Nn();Pn();Du();Yf();eg();Xo()});var tg=N(()=>{"use strict";he();he()});var ng=N(()=>{"use strict";he()});var rg=N(()=>{"use strict";he()});var og=N(()=>{"use strict";Sr();xs();tt();Cn();he()});var ig=N(()=>{"use strict"});var ag=N(()=>{"use strict"});var lg=N(()=>{"use strict";Cn()});var ug=N(()=>{"use strict"});var cg=N(()=>{"use strict";Cn();An();dr();$u();qu();ju();ju();Cu();Ou();Pu();ou();tg();ng();rg();og();Sr();Sr();xs();tt();ig();ag();lg();ug();Nn();Pn();Du();Sr()});import{build as _k}from"esbuild";import{readFile as mg,stat as Lu}from"node:fs/promises";import{createHash as vk}from"node:crypto";import{resolve as li,dirname as Ts,basename as kk,join as Be,sep as Sk}from"node:path";import{existsSync as Wu}from"node:fs";import{fileURLToPath as fg}from"node:url";function xk(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function gg(n){return n==null||n===!1||n===!0?"":Array.isArray(n)?n.map(gg).join(""):n instanceof ar?n.value:xk(String(n))}function Rk(n){return new ar(n)}async function dg(n){let e={};for(let t of n)try{let r=await Lu(t);e[t]={mtimeMs:r.mtimeMs,size:r.size}}catch{e[t]={mtimeMs:-1,size:-1}}return e}async function hg(n,e=new Set){if(e.has(n))return[];e.add(n);let t;try{t=await mg(n,"utf-8")}catch{return[]}let r=Ts(n),s=[];for(let i of t.matchAll(/@import\s+['"](\.[^'"]+\.css)['"]/g)){let o=li(r,i[1]);s.push(o,...await hg(o,e))}return s}function wg(){let n=Ts(fg(import.meta.url));for(;;){if(Wu(Be(n,"package.json")))return n;let e=Ts(n);if(e===n)throw new Error("[ui] \u5305\u6839\u5B9A\u4F4D\u5931\u8D25\uFF08\u5411\u4E0A\u672A\u627E\u5230 package.json\uFF09");n=e}}function yg(n){let e=Be(wg(),"dist"),t=Tk[n];if(t)return Be(e,t);if(n.startsWith("weifuwu/server/"))return Be(e,"level6","server",n.slice(15),"index.js");if(n.startsWith("weifuwu/")){let r=n.slice(8);for(let s of[Be(e,r),`${Be(e,r)}.js`,`${Be(e,r)}.css`,Be(e,r,"index.js"),Be(e,"level6",r,"index.js"),Be(e,"level5",r,"index.js")])if(Wu(s))return s;return Be(e,r,"index.js")}return n}function Ck(n){let e=wg();return n.startsWith(Be(e,"src")+Sk)?Be(e,"src","level6","client","vdom"):Be(e,"dist","level6","client","vdom")}function pg(n){if(n.startsWith(".")||n.startsWith("/"))return li(n);if(n==="weifuwu"||n.startsWith("weifuwu/"))return yg(n);try{return fg(import.meta.resolve(n))}catch{return li(n)}}function ui(n={}){let e=n.cache!==!1,t=new Map,r=new Map,s={builds:0,hits:0,dedups:0};async function i(u){for(let[c,d]of Object.entries(u))try{let p=await Lu(c);if(p.mtimeMs!==d.mtimeMs||p.size!==d.size)return!1}catch{return!1}return!0}async function o(u,c,d){let p=`${u}:${c}`;if(e){let h=t.get(p);if(h&&await i(h.inputs))return s.hits++,h;let f=r.get(p);if(f)return s.dedups++,f}s.builds++;let m=(async()=>{let{code:h,inputs:f}=await d(),g=`"${vk("sha1").update(h).digest("hex").slice(0,20)}"`,w={code:h,etag:g,inputs:f};if(e){if(t.size>=Ek){let y=t.keys().next().value;y!==void 0&&t.delete(y)}t.set(p,w)}return w})();return e&&(r.set(p,m),m.catch(()=>{}).finally(()=>r.delete(p))),m}function a(u,c,d,p){let m={"Content-Type":p,ETag:d,"Cache-Control":"no-cache"};return u.headers.get("if-none-match")===d?new Response(null,{status:304,headers:m}):new Response(c,{headers:m})}let l=(async(u,c,d)=>{function p(m,...h){let f="";for(let g=0;g<m.length;g++)f+=m[g],g<h.length&&(f+=gg(h[g]));return new Response(f,{headers:{"Content-Type":"text/html; charset=utf-8"}})}return c.ui={html:Object.assign(p,{unsafe:Rk}),async ssr(m,h){return Mu(Ge(m,h??{}))},ssrData(m){let h=JSON.stringify(Object.fromEntries(m)).replace(/</g,"<");return new ar(`<script>window.__DATA__=${h};</script>`)},async js(m){let h=pg(m),{code:f,etag:g}=await o("js",h,async()=>{let w=await _k({entryPoints:[h],bundle:!0,format:"esm",platform:"browser",jsx:"automatic",jsxImportSource:Ck(h),write:!1,metafile:!0,logLevel:"silent",plugins:[{name:"weifuwu-dist-fallback",setup(k){k.onResolve({filter:/^weifuwu(\/|$)/},_=>{let v=_.resolveDir;for(;;){if(Wu(Be(v,"tsconfig.json")))return;let S=Ts(v);if(S===v)break;v=S}return{path:yg(_.path)}})}}]}),y={};for(let k of Object.keys(w.metafile?.inputs??{})){let _=li(k);try{let v=await Lu(_);y[_]={mtimeMs:v.mtimeMs,size:v.size}}catch{y[_]={mtimeMs:-1,size:-1}}}return{code:w.outputFiles[0].text,inputs:y}});return a(u,f,g,"application/javascript")},async css(m){let h=pg(m),{code:f,etag:g}=await o("css",h,async()=>{let w=Ts(h);if(kk(h)==="weifuwu-layout.css"&&await xm(w)){let _=await Rm(w);return{code:_.css,inputs:await dg(_.inputs)}}let y=await mg(h,"utf-8"),k=await dg([h,...await hg(h)]);return{code:y,inputs:k}});return a(u,f,g,"text/css; charset=utf-8")}},d(u,c)});return l.__stats=s,l}var Ek,Tk,bg=N(()=>{"use strict";Em();Tm();Sr();cg();Ek=32;Tk={weifuwu:"level6/index.js","weifuwu/client/vdom":"level6/client/vdom/index.js","weifuwu/client/vdom/jsx-runtime":"level6/client/vdom/jsx-runtime.js","weifuwu/client/vdom/testing":"level6/client/vdom/testing.js","weifuwu/client/components":"level6/client/components/index.js","weifuwu/client/layout":"level6/client/layout/index.js","weifuwu/dev":"level6/dev/index.js","weifuwu/shared/router":"level0/router/index.js"}});import{buildSchema as Ak}from"graphql";function _g(n){let e=typeof n.typeDefs=="string"?Ak(n.typeDefs):n.typeDefs,t=n.resolvers??{};for(let[r,s]of Object.entries(t)){let i=e.getType(r);if(!i||typeof i!="object"||!("getFields"in i))continue;let o=i.getFields();for(let[a,l]of Object.entries(s)){let u=o[a];u&&typeof l=="function"&&(u.resolve=l)}}return e}var vg=N(()=>{"use strict"});import{buildSchema as Ok,graphql as Ik,validate as Pk,parse as Nk}from"graphql";function Mk(n){let e=n.searchParams.get("query");if(!e)return null;let t={},r=n.searchParams.get("variables");if(r)try{t=JSON.parse(r)}catch{return{error:"Invalid variables JSON"}}return{query:e,variables:t,operationName:n.searchParams.get("operationName")||void 0}}async function $k(n){try{let e=await n.json();return e.query?{query:e.query,variables:e.variables||{},operationName:e.operationName}:null}catch{return null}}function qk(n){let e=new Set;for(let t of Object.values(n))for(let r of Object.values(t))typeof r=="function"&&e.add(r);return e}function Dk(n,e){if(n.size!==e.size)return!1;for(let t of n)if(!e.has(t))return!1;return!0}function xg(n,e){if(n.size>=e){let t=n.keys().next().value;t!==void 0&&n.delete(t)}}function jk(n){if(typeof n.schema!="string")return n.schema;let e=n.resolvers;if(!e||typeof e!="object"){let o=Uu.get(n.schema);if(o)return o;let a=Ok(n.schema);return xg(Uu,kg),Uu.set(n.schema,a),a}let t=Sg.get(e);t||(t=new Map,Sg.set(e,t));let r=qk(e),s=t.get(n.schema);if(s&&Dk(s.sig,r))return s.schema;let i=_g({typeDefs:n.schema,resolvers:e});return xg(t,kg),t.set(n.schema,{sig:r,schema:i}),i}function Lk(n){let e=new Map;for(let s of n.definitions)s.kind==="FragmentDefinition"&&e.set(s.name.value,s);let t=0;function r(s,i,o){if(i>t&&(t=i),s.kind==="SelectionSet"){for(let a of s.selections)r(a,i,o);return}if(s.kind==="FragmentSpread"){let a=s.name.value;if(o.has(a))return;let l=e.get(a);if(!l)return;let u=new Set(o);u.add(a),r(l.selectionSet,i,u);return}s.selectionSet&&r(s.selectionSet,i+1,o)}for(let s of n.definitions)s.kind==="OperationDefinition"&&r(s,0,new Set);return t}function Wk(n){let e=n instanceof Error?n.message:String(n),t=n instanceof ci?n.status:500;return Response.json({errors:[{message:e}]},{status:t})}async function Rg(n,e,t,r,s){let i=t.maxDepth??10;if(i>0)try{let l=Nk(e.query),u=Lk(l);if(u>i)return Response.json({errors:[{message:`Query depth ${u} exceeds limit ${i}`}]},{status:400});let c=Pk(n,l);if(c.length>0)return Response.json({errors:c.map(d=>({message:d.message}))},{status:400})}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:`Parse error: ${u}`}]},{status:400})}let o=t.timeout??3e4,a;try{a=t.context?await t.context(r,s):s}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:u}]},{status:500})}try{let l=Ik({schema:n,source:e.query,rootValue:t.rootValue,contextValue:a,variableValues:e.variables,operationName:e.operationName}),u;if(o>0){let d=null,p=new Promise((m,h)=>{d=setTimeout(()=>h(new Error("Query timeout")),o)});u=await Promise.race([l,p]),d&&clearTimeout(d)}else u=await l;let c=(u.errors??[]).some(d=>!d.path);return Response.json(u,{status:c?400:200})}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:u}]},{status:500})}}function Uk(n){return`<!doctype html>
116
+ `,inputs:r}}var pv,xm,mv,fv,Cm=I(()=>{"use strict";vm();Sm();pv=["tokens","base","layout","components","utilities"],xm={_tokens:"tokens",_dark:"tokens",_presets:"tokens",_props:"tokens",_base:"base",_stack:"layout",_row:"layout",_split:"layout",_center:"layout",_justify:"layout",_fill:"layout",_grid:"layout",_cluster:"layout",_cover:"layout",_position:"layout",_sticky:"layout",_overflow:"layout","_safe-area":"layout",_layer:"layout","_align-self":"layout",_nowrap:"layout",_shrink:"layout",_container:"layout","_app-shell":"layout",_surface:"utilities",_spacing:"utilities",_border:"utilities",_text:"utilities",_hidden:"utilities",_block:"utilities",_flex:"utilities",_popup:"layout"},mv="tokens",fv=n=>n.replace(/@import\s+['"][^'"]+['"]\s*;?\s*\n?/g,"")});var ar,Am=I(()=>{"use strict";ar=class{value;constructor(e){this.value=e}toString(){return this.value}}});function hs(n,e){hv.inc();let t=eu.get(n);if(t){t.count++;return}eu.set(n,{shown:!0,count:1}),console.error(`[vdom] renderFn \u9519\u8BEF\uFF08${n}\uFF09\u2014\u2014\u7EC4\u4EF6\u7EA7 hole \u964D\u7EA7\uFF08\u4E0B\u4E00\u62CD\u91CD\u8BD5\u81EA\u6108\uFF09:`,e)}function tu(n){eu.delete(n)}var zo,eu,Yl,hv,ws=I(()=>{"use strict";zo=globalThis;zo.__wfErrState||(zo.__wfErrState={errState:new Map,totalErrors:0});({errState:eu,totalErrorsRef:Yl}={errState:zo.__wfErrState.errState,totalErrorsRef:zo.__wfErrState}),hv={get:()=>Yl.totalErrors,inc:()=>{Yl.totalErrors++},reset:()=>{Yl.totalErrors=0}}});function wv(n){return{next:n?.next??Ko,error:n?.error??Ko,complete:n?.complete??Ko}}function be(n){return new wt(n)}var Ko,wt,Go=I(()=>{"use strict";Ko=()=>{},wt=class{_subscribe;constructor(e){this._subscribe=e}subscribe(e){let t=wv(e),r=!1,s=null,o={next:l=>{r||t.next(l)},error:l=>{r||(r=!0,t.error(l),s?.())},complete:()=>{r||(r=!0,t.complete(),s?.())}},i=this._subscribe(o);s=typeof i=="function"?i:i?()=>i.unsubscribe():Ko,r&&s();let a=!1;return{unsubscribe(){a||(a=!0,r||(r=!0,s?.()))}}}pipe(...e){return e.reduce((t,r)=>r(t),this)}}});function lr(n,e){return be(t=>{let r=!0,s=()=>{r&&(r=!1,t.complete())},o=e?.signal;if(o){if(o.aborted)return s(),nu;o.addEventListener("abort",s,{once:!0})}return n.then(i=>{r&&(r=!1,t.next(i),t.complete())},i=>{r&&(r=!1,t.error(i))}),()=>{r=!1,o&&o.removeEventListener("abort",s)}})}function ru(n,e){return be(t=>{let r=n(s=>t.next(s));return e&&t.next(e()),()=>{typeof r=="function"&&r()}})}var nu,me,Xt,Om=I(()=>{"use strict";Go();nu=()=>{},me=class{subs=new Set;closed=!1;asObservable(){return be(e=>this.closed?(e.complete(),nu):(this.subs.add(e),()=>{this.subs.delete(e)}))}subscribe(e){return this.asObservable().subscribe(e)}next(e){if(!this.closed)for(let t of this.subs)t.next(e)}error(e){if(!this.closed){this.closed=!0;for(let t of this.subs)t.error(e);this.subs.clear()}}complete(){if(!this.closed){this.closed=!0;for(let e of this.subs)e.complete();this.subs.clear()}}},Xt=class extends me{value;constructor(e){super(),this.value=e}get(){return this.value}next(e){this.value=e,super.next(e)}asObservable(){return be(e=>this.closed?(e.complete(),nu):(e.next(this.value),this.subs.add(e),()=>{this.subs.delete(e)}))}}});function su(n){return e=>new wt(t=>e.subscribe({next:r=>t.next(n(r)),error:r=>t.error(r),complete:()=>t.complete()}))}function ou(n){return e=>new wt(t=>e.subscribe({next:r=>{n(r)&&t.next(r)},error:r=>t.error(r),complete:()=>t.complete()}))}function ur(n,e){let t=e;return r=>new wt(s=>r.subscribe({next:o=>{t=n(t,o),s.next(t)},error:o=>s.error(o),complete:()=>s.complete()}))}function Qo(n){return e=>new wt(t=>{let r=null,s=!1,o=e.subscribe({next:i=>{r?.unsubscribe();let a=!1,l=n(i).subscribe({next:u=>t.next(u),error:u=>t.error(u),complete:()=>{a=!0,r=null}});r=a?null:l},error:i=>t.error(i),complete:()=>{s=!0,r||t.complete()}});return()=>{o.unsubscribe(),r?.unsubscribe()}})}function iu(n,e){let t=e?.trailing??!1;return r=>new wt(s=>{let o=null,i=!1,a,l=!1,u=!1,c=f=>{u||s.next(f)},d=()=>{o=null,t&&l&&(l=!1,c(a)),i=!1},p=r.subscribe({next:f=>{i?t&&(a=f,l=!0):(i=!0,c(f),o=setTimeout(d,n))},error:f=>{u=!0,o&&clearTimeout(o),s.error(f)},complete:()=>{u=!0,o&&clearTimeout(o),s.complete()}});return()=>{u=!0,o&&clearTimeout(o),p.unsubscribe()}})}var Im=I(()=>{"use strict";Go()});var he=I(()=>{"use strict";Go();Om();Im()});function Nm(n){let e=new Set,t=new me,r=n,s=()=>{for(let o of[...e])o();t.next(typeof r=="object"&&r!==null?{...r}:r)};return{get state(){return r},subscribe(o){return e.add(o),()=>{e.delete(o)}},set(o){typeof r=="object"&&r!==null&&!Array.isArray(r)&&typeof o=="object"&&o!==null?r={...r,...o}:r=o,s()},update(o){let i=o(r);i!==void 0&&(typeof r!="object"||r===null||i!==r)&&(r=i),s()},notify:s,changes$:t.asObservable()}}function au(n){let e=Nm(n),t=(()=>e.state);return t.set=r=>e.set(r),t.update=r=>e.update(r),t.subscribe=r=>e.subscribe(r),t.notify=()=>e.notify(),t.store=e,t}var lu=I(()=>{"use strict";he()});function ct(n,e){let t=globalThis.__wfSpy;t&&t.length<1e3&&t.push({at:Date.now()%1e5,kind:n,data:e===void 0?void 0:String(e).slice(0,80)})}var Yt=I(()=>{"use strict"});function dt(n,e,t,r){let s=n.getInstanceData(),o=s.get(e);if(!o){let i=t,a=!0,l=new me,u=e.subscribe({next:p=>{let f=p!==i;i=p,f&&!a&&l.next()},error:p=>{console.error("[vdom] useObservable:",p)}});a=!1;let d=(r?.throttleMs&&r.throttleMs>0?l.asObservable().pipe(iu(r.throttleMs,{trailing:!0})):l.asObservable()).subscribe({next:()=>{ct("obs:next",String(i)+" \u2192 req:render"),n.requestRender()}});n.onUnmount(()=>{u.unsubscribe(),d.unsubscribe()}),o={get:()=>i},s.set(e,o)}return()=>o.get()}var cr=I(()=>{"use strict";he();Yt()});function Mm(n,e,t){if(typeof e=="function"){let s=e;return i=>{i?s(i):t?.()}}return{current:e}}function $m(n,e,t){let r=typeof e=="object"?e:void 0,s=typeof e=="boolean"?e:!1,o=r??t,i=n.nextHookIndex(),a=n.getHookState(i)??{open:s};n.setHookState(i,a);let l=o?.open!==void 0;return{get open(){return o?.open??a.open},setOpen(u){l?(o?.onOpenChange||console.warn(`[vdom] useOpen${r?.name?`(${r.name})`:""} \u53D7\u63A7\u7F3A onOpenChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),o?.onOpenChange?.(u)):(a.open=u,n.requestRender())},toggle(){this.setOpen(!this.open)}}}function Jo(n,e,t){let r=t?e:(()=>!0),s=t??e,o=n.getBrowser()?.window;if(!o)return()=>{};let i=l=>{if(typeof r=="string"){if(l.key!==r)return}else if(!r(l))return;s(l)};o.addEventListener("keydown",i);let a=()=>o.removeEventListener("keydown",i);return n.onUnmount(a),a}var uu=I(()=>{"use strict"});function qm(n,e,t,r,s,o,i,a){let l=n.getBoundingClientRect();if(l.width===0&&l.height===0)return null;let u=e.innerWidth,c=e.innerHeight,d,p;switch(s){case"bottom":d=l.bottom+o,p=a?l.left+l.width/2-t/2:l.left;break;case"top":d=l.top-r-o,p=a?l.left+l.width/2-t/2:l.left;break;case"left":d=a?l.top+l.height/2-r/2:l.top,p=l.left-t-o;break;case"right":d=a?l.top+l.height/2-r/2:l.top,p=l.right+o;break}return p+t>u-i&&(p=u-t-i),p<i&&(p=i),d+r>c-i&&(d=c-r-i),d<i&&(d=i),{top:d,left:p}}function Dm(n,e){let t=e.getComputedStyle(n).animationName;if(t&&t!=="none")return!0;for(let r of n.children){let s=e.getComputedStyle(r).animationName;if(s&&s!=="none")return!0}return!1}function jm(n,e){let t=new me,r=dt(n,kv(n,e,t),{top:0,left:0});return{get top(){return r().top},get left(){return r().left},refresh:()=>{t.next()}}}function kv(n,e,t){let r=n.getBrowser()?.window;return be(s=>{if(!r)return s.next({top:0,left:0}),s.complete(),()=>{};let o,i=()=>{let u=e.el();if(!u)return;let c=u.getBoundingClientRect();c.width===0&&c.height===0||(e.isOpen?.()??!0)&&s.next(e.compute(c))},a=()=>{o===void 0&&(o=r.requestAnimationFrame(()=>{o=void 0,i()}))};r.addEventListener("scroll",a,!0),r.addEventListener("resize",a),i();let l=t?.subscribe({next:()=>i()});return()=>{l?.unsubscribe(),o!==void 0&&r.cancelAnimationFrame(o),r.removeEventListener("scroll",a,!0),r.removeEventListener("resize",a)}})}var cu=I(()=>{"use strict";he();cr()});function Lm(n){return n==null?null:typeof n=="string"?n:typeof n=="number"?String(n):(console.warn(`[vdom] key \u5FC5\u987B\u662F string|number\u2014\u2014\u5F53\u524D ${typeof n}\uFF08\u5FFD\u7565\u2014\u2014\u4F4D\u7F6E\u8EAB\u4EFD\uFF09`),null)}function Wm(n){return Lm(n?.key)}function Um(n){let e={...n??{}};return delete e.key,e}var Bm=I(()=>{"use strict"});function du(n){if(!(n==null||n===!1)){if(typeof n=="string")return n.trim()||void 0;if(typeof n=="number")return String(n);if(Array.isArray(n)){let e=n.map(du).filter(t=>!!t);return e.length?e.join(" "):void 0}if(typeof n=="object"){let e=Object.entries(n).filter(([,t])=>!!t).map(([t])=>t);return e.length?e.join(" "):void 0}}}function Sv(n){for(let e of["class","className"]){let t=n[e];t!=null&&typeof t!="string"&&(n[e]=du(t))}return n}function Ge(n,e,...t){let r=Um(Sv(e??{}));return t.length===1?r.children=t[0]:t.length>1&&(r.children=t),{type:n,props:r,key:Wm(e)}}var Cn=I(()=>{"use strict";Bm()});function Et(n){return n.type===Hm}var Hm,dr=I(()=>{"use strict";Hm=Symbol("vdom-fragment")});function $e(n){let e=n.children??(n.props.children===void 0?[]:n.props.children),t=r=>Array.isArray(r)?r.flatMap(t):[r];return Array.isArray(e)?e.flatMap(t):[e]}function Ie(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&Et(n)?$e(n).reduce((e,t)=>e+Ie(t),0):1}var pr=I(()=>{"use strict";dr()});function it(n,e){return`${n}.k${e.replace(/%/g,"%25").replace(/\./g,"%2E")}`}function Ee(n){return n==null||typeof n=="boolean"||typeof n=="string"||typeof n=="number"||Array.isArray(n)?null:n.key}function xv(n){return Ee(n)!==null}function pu(n){return`${Fm}${n}`}function Vm(n){return n.startsWith(Fm)}function ys(n,e){let t=new Set;for(let r of n){let s=Ee(r);if(s!==null){if(t.has(s)){console.warn(`[vdom] ${e}\uFF1A\u91CD\u590D key "${s}"\uFF08\u5217\u8868\u8EAB\u4EFD\u6620\u5C04\u6B67\u4E49\u2014\u2014\u589E\u5220/\u91CD\u6392\u884C\u4E3A\u4E0D\u786E\u5B9A\uFF09\u2014\u2014\u8BF7\u4E3A\u6BCF\u9879\u58F0\u660E\u552F\u4E00 key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`);return}t.add(s)}}}function zm(n,e){if(n.length<2)return;let t=n.some(s=>typeof s?.type=="function"),r=n.some(s=>!xv(s)&&typeof s?.type=="function");if(t&&r){let s=n.map(o=>{let i=o;if(i==null)return"null";if(typeof i=="boolean")return"bool";if(typeof i=="string"||typeof i=="number")return"text";if(Array.isArray(i))return"arr";if(typeof i.type=="function"){let a=i.type.name;return"comp"+(a?":"+a:"")}return"el"+(i.key?`.k{${String(i.key).slice(0,16)}}`:"")});console.warn(`[vdom] ${e}\uFF1A\u5217\u8868\u542B\u65E0 key \u7684\u7EC4\u4EF6\u9879\uFF08\u957F\u5EA6 ${n.length}\uFF09\u2014\u2014\u9879: [${s.join(", ")}]\u2014\u2014\u52A8\u6001\u589E\u5220/\u91CD\u6392\u65F6\u72B6\u6001\u4F1A\u6309\u4F4D\u7F6E\u7EE7\u627F\u2014\u2014\u8BF7\u4E3A\u7EC4\u4EF6\u9879\u58F0\u660E key\uFF08\u6570\u636E id \u2192 keyBy\uFF09`)}}var Fm,An=I(()=>{"use strict";Fm="pos:"});function bs(n,e){return!n.startsWith("aria-")||typeof e!="boolean"?null:e?"true":"false"}function mu(n,e,t){if(e==="innerHTML"||e==="textContent"||e==="value"){n[e]=t;return}if(t==null){n.removeAttribute(e);return}let r=bs(e,t);if(r!==null){n.setAttribute(e,r);return}if(Rv.has(e)){n.setAttribute(e,t?"true":"false");return}if(t===!1){n.removeAttribute(e);return}if(e==="class"||e==="className"){n.setAttribute("class",String(t));return}if(typeof t=="boolean"){n.setAttribute(e,"");return}n.setAttribute(e,String(t))}var Rv,Zo=I(()=>{"use strict";Rv=new Set(["draggable","contenteditable","spellcheck"])});function ae(n,e){return`${n}.${e}`}function _s(n){let e={};for(let[t,r]of Object.entries(n)){if(t==="children"||t==="key"||t==="ref"||typeof r=="function"||r===void 0)continue;let s=bs(t,r);e[t]=s!==null?s:r}return e}var en=I(()=>{"use strict";pr();An();Zo()});function Km(n){return n==null||typeof n=="boolean"}function Gm(n){return!(n==null||typeof n=="boolean"||typeof n=="string"||typeof n=="number"||Array.isArray(n)||typeof n=="object"&&typeof n.type=="string"||typeof n.type=="function"||typeof n.type=="symbol")}function fu(n){return n==null?"null/undefined":typeof n=="object"?`object\uFF08type: ${typeof n.type}\uFF09`:typeof n}function Ev(n,e,t,r){return[{op:"createAnchor",id:n,...r!==void 0?{detail:r}:{}},{op:"insert",id:n,parent:e,ref:t}]}function gu(n,e,t,r,s){for(let o of Ev(e,t,r,s))n(o)}var hu=I(()=>{"use strict"});function pt(n){return n===""?"hole":typeof n=="string"||typeof n=="number"?"text":Km(n)?"hole":Array.isArray(n)?"array":typeof n.type=="string"?"element":Et(n)?"fragment":typeof n.type=="function"?"component":(Gm(n),"invalid")}function Xo(n){return typeof n=="string"||typeof n=="number"?String(n):null}function Qe(n){return pt(n)==="hole"}function tn(n){return pt(n)==="text"}var mr=I(()=>{"use strict";dr();hu()});function Tt(n){if(n==null)return"hole";let e=pt(n);return e==="invalid"?"hole":e}var Qm=I(()=>{"use strict";mr()});function Jm(n,e,t,r,s){let o=_s(n.props),i=_s(e.props);for(let[a,l]of Object.entries(i))a==="value"&&s?.formControl?r({op:"setProp",id:t,key:a,value:l}):o[a]!==l&&r({op:"setProp",id:t,key:a,value:l});for(let a of Object.keys(o))a in i||r({op:"setProp",id:t,key:a,value:void 0});for(let[a,l]of Object.entries(e.props))a==="children"||a==="key"||typeof l=="function"&&n.props[a]!==l&&r({op:"setProp",id:t,key:a,value:l,prev:n.props[a]});for(let a of Object.keys(n.props))a==="children"||a==="key"||typeof n.props[a]=="function"&&e.props[a]===void 0&&r({op:"setProp",id:t,key:a,value:void 0,prev:n.props[a]})}var Zm=I(()=>{"use strict";en()});function fr(n,e,t){return typeof n?.type=="function"?ae(e,0):Array.isArray(n)?e:Qe(n)?ae(e,0):t}function vs(n,e,t){return typeof n?.type=="function"||Array.isArray(n)?e:t}function Je(n,e,t,r,s){if(Qe(n)){r({op:"remove",id:e});return}if(tn(n)){r({op:"remove",id:e});return}if(Array.isArray(n)){let l=0;for(let u of n)Je(u,ae(e,l),e,r,s),l+=Ie(u);return}let o=n;if(Et(o)){let l=Number(e.slice(t.length+1)),u=$e(o),c=l;for(let d of u)Je(d,ae(t,c),t,r,s),c+=Ie(d);return}if(typeof o.type=="function"){let l=o.key!==null?it(t,o.key):e;r({op:"unmount",compId:l});let u=s?.get(l)?.lastOutput;if(u!==void 0){let c=nn(u),d=fr(c,l,e),f=c!==null&&typeof c=="object"&&!Array.isArray(c)&&Et(c)?e.slice(0,e.lastIndexOf(".")):vs(c,l,l);Je(c,d,f,r,s)}}let i=$e(o),a=0;i.forEach(l=>{let u=ae(e,a);l!==null&&typeof l!="string"&&typeof l!="number"&&typeof l!="boolean"&&!Array.isArray(l)?Je(l,u,e,r,s):r({op:"remove",id:u}),a+=Ie(l)}),r({op:"remove",id:e})}var gr=I(()=>{"use strict";pr();dr();en();An();tt();mr()});var hr,Xm=I(()=>{"use strict";hr=(n,e,t)=>{t.emit({op:"remove",id:t.oldId}),t.emitNode(e,t.parent,t.index,t.ref)}});var wr,Ym=I(()=>{"use strict";wr=(n,e,t)=>{t.emit({op:"remove",id:t.oldId}),t.emitNode(e,t.parent,t.index,t.ref)}});var yr,ef=I(()=>{"use strict";gr();yr=(n,e,t)=>{Je(n,t.oldId,t.parent,t.emit,t.registry),t.emitNode(e,t.parent,t.index,t.ref)}});var br,tf=I(()=>{"use strict";en();gr();tt();br=(n,e,t)=>{t.oldCompId&&t.emit({op:"unmount",compId:t.oldCompId});let r=t.registry?.get(t.oldCompId??"")?.lastOutput;if(r!==void 0){let s=nn(r);Je(s,fr(s,t.oldCompId??"",ae(t.parent,t.index)),vs(s,t.oldCompId??"",t.parent),t.emit,t.registry)}else t.emit({op:"remove",id:t.oldId});t.emitNode(e,t.parent,t.index,t.ref)}});var mt,nf=I(()=>{"use strict";pr();en();gr();mt=(n,e,t)=>{let r=Array.isArray(n)?n:$e(n),s=t.index;for(let o of r)Je(o,ae(t.parent,s),t.parent,t.emit,t.registry),s+=Ie(o);t.emitNode(e,t.parent,t.index,t.ref)}});function wu(n,e){return Tv[n]?.[e]??null}var Tv,rf=I(()=>{"use strict";Xm();Ym();ef();tf();nf();Tv={text:{text:null,hole:hr,element:hr,component:hr,fragment:hr,array:hr},hole:{text:wr,hole:null,element:wr,component:wr,fragment:wr,array:wr},element:{text:yr,hole:yr,element:null,component:yr,fragment:yr,array:yr},component:{text:br,hole:br,element:br,component:null,fragment:br,array:br},fragment:{text:mt,hole:mt,element:mt,component:mt,fragment:null,array:mt},array:{text:mt,hole:mt,element:mt,component:mt,fragment:mt,array:null}}});function bu(n,e,t,r,s){let o=[],i=new Map,a={n:0},l=new Map,u=new me;u.subscribe({next:()=>{for(let w of[...o].reverse())try{w()}catch(m){console.error("[vdom] v2 onUnmount:",m)}}});let c=Object.create(t);c.onUnmount=w=>{o.push(w)},c.ui=vu({requestRender:()=>{ct("req:render",r.slice(-18)),s?.()},onUnmount:w=>{o.push(w)},getBrowser:()=>t.browser??null,nextHookIndex:()=>a.n++,getHookState:w=>l.get(w),setHookState:(w,m)=>{l.set(w,m)},getInstanceData:()=>i,scheduleAfterRender:w=>{let m=t.afterRender;m?m(w):setTimeout(w,0)},getSharedContext:()=>t??null});let d=n(e,c),p;typeof d=="function"?p=d:p=(w=>{let m=n(w,c);return typeof m=="function"?null:m});let f=a.n;return{factory:n,renderFn:p,lastOutput:void 0,hookSeq:a,renderBase:f,instData:i,destroy$:u,disposed:!1,epoch:Cv}}function _u(n,e){let t=n.renderFn.shouldRender;return t&&n.lastProps!==void 0&&n.lastOutput!==void 0&&!t(n.lastProps,e)?nn(n.lastOutput):(n.lastProps=e,n.hookSeq.n=n.renderBase,n.renderFn(e))}function at(n,e){let t=e.get(n);if(!(!t||t.disposed)){t.disposed=!0;try{t.destroy$.next()}catch(r){console.error("[vdom] v2 destroy$:",r)}t.instData.clear(),e.delete(n)}}function Av(n,e,t,r){let s=e.get(n),o=[];if(s){let a=s.lastOutput!==void 0?nn(s.lastOutput):void 0;if(a!==void 0){let l={get:u=>{let c=e.get(u);return c?{lastOutput:c.lastOutput}:void 0}};Je(a,fr(a,n,t),vs(a,n,r),u=>{o.push(u)},l)}}let i=[];for(let a of o)a.op==="unmount"&&e.has(a.compId)&&i.push(a.compId);at(n,e);for(let a of i)e.has(a)&&at(a,e);return o.unshift({op:"unmount",compId:n}),o}function lf(n,e,t,r){let s=n?.lastOutput;if(s===void 0)return[e+".0"];if(typeof s=="object"&&s!==null&&"kind"in s){let o=s;if(o.kind==="hole")return[e+".0"];if(o.kind==="array")return(o.items??[]).map((a,l)=>`${e}.${l}`);let i=o.v;return i?typeof i.type=="function"?[e+".0"]:[ae(t,r)]:[e+".0"]}return[e+".0"]}function Ov(n,e,t,r){if(Qe(n))return ae(e,t);if(tn(n))return ae(e,t);let s=n;if(typeof s.type!="function")return ae(e,t);let o=Ee(s);if(o===null)return ae(e,t);let i=it(e,o);return lf(r?.get(i),i,e,t)[0]}function sf(n,e,t,r,s,o,i,a){let l=[],u=[],c=0,d=null;for(let p=0;p<e.length;p++){let f=Ie(e[p]);l.push(n[p]===void 0?He(e[p],t,c,d,r,o,s,i):In(n[p],e[p],t,c,d,r,s,o,i)),d=ae(t,c+f-1),c+=f}for(let p=n.length-1;p>=e.length;p--)u.push(we(On(n[p],t,Iv(n,p),s)));return a?Ze([...u.reverse(),...l]):(u.reverse(),Ze([...l,...u]))}function In(n,e,t,r,s,o,i,a,l){let u=ae(t,r),c=pt(n),d=pt(e);if(c==="text"&&d==="text")return String(n)===String(e)?we([]):we([{op:"setText",id:u,value:Xo(e)}]);if(c==="hole"&&d==="hole")return we([]);if(c==="hole")return Ze([we([{op:"remove",id:u}]),He(e,t,r,s,o,a,i,l)]);if(d==="hole")return yu(n,e,t,r,s,o,a,c==="component"?Ss(n,t,r):void 0,i,l);if((c==="fragment"||c==="array")&&(d==="fragment"||d==="array")){let m=ks(Array.isArray(n)?n:$e(n)),g=ks(Array.isArray(e)?e:$e(e));return Yo(g)||Yo(m)?af(m,g,t,o,i,a,l):sf(m,g,t,o,i,a,l,!0)}if(c===d&&typeof n!="string"&&typeof n!="number"){let m=n,g=e;if(typeof m.type=="function"&&typeof g.type=="function"){if(m.type===g.type)return Nv(m,g,t,r,s,o,i,a,l);let h=Ss(m,t,r),b=Av(h,i,ae(t,r),t);return Ze([we(b),He(g,t,r,s,o,a,i,l)])}if(typeof m.type=="string"&&typeof g.type=="string"){if(m.type===g.type){let h=[];Jm(m,g,u,v=>h.push(v),{formControl:m.type==="input"||m.type==="textarea"});let b=ks($e(m)),k=ks($e(g));if($v(b,k,u),Yo(k)||Yo(b))return Ze([we(h),af(b,k,u,o,i,a,l)]);let _=sf(b,k,u,o,i,a,l,!1);return Ze([we(h),_])}return Ze([we(On(m,t,r,i)),He(g,t,r,s,o,a,i,l)])}}let p=Tt(n),f=Tt(e),w=pt(n)==="component"?Ss(n,t,r):void 0;return yu(n,e,t,r,s,o,a,w,i,l)}function Iv(n,e){let t=0;for(let r=0;r<e;r++)t+=Ie(n[r]);return t}function Pv(n,e){let t=0;for(let r=0;r<e;r++)t+=Ie(n[r]);return t}function Nv(n,e,t,r,s,o,i,a,l){let u=Ss(e,t,r),c=i.get(u);if(!c||c.factory!==e.type)return c&&at(u,i),He(e,t,r,s,o,a,i,l);let d;try{d=_u(c,e.props)}catch(w){return hs(u,w),we([])}let p=c.lastOutput!==void 0?nn(c.lastOutput):void 0;c.lastOutput=ti(d);let f=ku(d,u,t,r);return p===void 0?He(d,f.parent,f.index,s,o,a,i,l):Mv(p,d,f.parent,f.index,s,o,i,a,l)}function Mv(n,e,t,r,s,o,i,a,l){if(n===e)return we([]);let u=Array.isArray(n),c=Array.isArray(e);if(u||c){let d=u?n:[n],p=c?e:[e],f=0,w=null,m=[];for(let g=0;g<p.length;g++){let h=Ie(p[g]);m.push(d[g]===void 0?He(p[g],t,f,w,o,a,i,l):In(d[g],p[g],t,f,w,o,i,a,l)),w=ae(t,f+h-1),f+=h}for(let g=p.length;g<d.length;g++)m.push(we(On(d[g],t,Pv(d,g),i)));return Ze(m)}return In(n,e,t,r,s,o,i,a,l)}function ks(n){let e=[];for(let t of n)t!==null&&typeof t=="object"&&!Array.isArray(t)&&Et(t)?e.push(...ks($e(t))):e.push(t);return e}function $v(n,e,t){if(globalThis.__WF_NO_A_CHECK__)return;let r=d=>!Qe(d)&&!tn(d)&&!Array.isArray(d),s=n.filter(r),o=e.filter(r),i=d=>typeof d?.type=="function"&&Ee(d)===null,a=(d,p)=>p>=d.length||Qe(d[p]),l=d=>a(n,d)||i(n[d]),u=d=>a(e,d)||i(e[d]);(e.some((d,p)=>i(d)&&!l(p))||n.some((d,p)=>i(d)&&!u(p)))&&zm(o,`children\uFF08${t}\u2014\u2014\u65E0 key \u7EC4\u4EF6\u5B9E\u69FD\u7FFB\u8F6C ${s.length}\u2192${o.length}\uFF09`)}function Ss(n,e,t){return n.key!==null?it(e,n.key):ae(e,t)}function xs(n,e,t,r,s,o){let i=Tt(n),a=Tt(e);return wu(i,a)?yu(n,e,"root",0,null,t,s,i==="component"?Ss(n,"root",0):void 0,r,o).pipe(of):In(n,e,"root",0,null,t,r,s,o).pipe(of)}function qv(n,e,t,r,s,o,i,a,l){return n===void 0?He(e,t,r,s,o,a,i,l):In(n,e,t,r,s,o,i,a,l)}function af(n,e,t,r,s,o,i){let a=[],l=(_,v)=>Ee(_)??pu(v),u=new Map;n.forEach((_,v)=>{let S=l(_,v);u.has(S)||u.set(S,v)});let c=new Set(e.map((_,v)=>l(_,v))),d=new Map;for(let _=0;_<n.length;_++){let v=n[_];if(Qe(v)){a.push({op:"remove",id:ae(t,_)});continue}if(tn(v)){a.push({op:"remove",id:ae(t,_)});continue}if(Array.isArray(v))continue;let S=Ee(v);if(S!==null){let A=(d.get(S)??0)+1;if(d.set(S,A),A===1)continue;a.push(...On(v,t,_,s));continue}}for(let[_,v]of u)if(!c.has(_)&&(a.push(...On(n[v],t,v,s)),!Vm(_))){let S=it(t,_);s.has(S)&&at(S,s)}let p=n.map(_=>Ee(_)).filter(_=>_!==null&&c.has(_)),f=e.map(_=>Ee(_)).filter(_=>_!==null&&u.has(_)),m=!e.some((_,v)=>{let S=Ee(_);if(S===null||typeof _.type!="function")return!1;let A=u.get(S);return A===void 0||A===v?!1:s?.get(it(t,S))===void 0});{let _=0;for(let v of f){let S=p.indexOf(v,_);if(S===-1){m=!1;break}_=S+1}}if(!m){n.forEach((S,A)=>{if(!(Qe(S)||tn(S))&&!Array.isArray(S)){if(Ee(S)!==null&&typeof S.type=="function"){a.push(...On(S,t,A,s,{keepSegments:!0}));return}if(Ee(S)!==null){a.push({op:"remove",id:ae(t,A)});return}a.push(...On(S,t,A,s))}});let _=[],v=null;for(let S=0;S<e.length;S++){let A=e[S],C=Ee(A),W=C!==null?it(t,C):ae(t,S);C!==null&&typeof A.type=="function"?_.push(He(A,t,S,v,r,o,s,i)):_.push(He(A,t,S,v,r,o,s,i)),v=ae(t,S)}return Ze([we(a),..._])}let g=[];e.forEach((_,v)=>{let S=Ee(_);if(S===null)return;let A=u.get(S);A!==void 0&&A!==v&&g.push({oldIdx:A,newIdx:v})});let h=g.every(_=>_.newIdx<_.oldIdx);g.sort((_,v)=>h?_.newIdx-v.newIdx:v.newIdx-_.newIdx);for(let _ of g){let v=e[_.newIdx],S=Ee(v);if(S!==null&&typeof v.type=="function"){let A=it(t,S),C=lf(s?.get(A),A,t,_.oldIdx);if(C.length===1&&!C[0].startsWith(A+"."))a.push({op:"move",id:C[0],parent:t,ref:null,newId:ae(t,_.newIdx),noMove:!0});else{let G=_.newIdx>0?e[_.newIdx-1]:null,U=G===null?null:Ov(G,t,_.newIdx-1,s);for(let F of C)a.push({op:"move",id:F,parent:t,ref:U,newId:F,noMove:!1}),U=F}}else a.push({op:"move",id:ae(t,_.oldIdx),parent:t,ref:null,newId:ae(t,_.newIdx),noMove:!0})}let b=[],k=null;for(let _=0;_<e.length;_++){let v=e[_],S=Ee(v),A=ae(t,_);if(S!==null){let C=u.get(S);C===void 0?b.push(He(v,t,_,k,r,o,s,i)):typeof v.type=="function"?b.push(qv(n[C],v,t,_,k,r,s,o,i)):b.push(In(n[C],v,t,_,k,r,s,o,i))}else{let C=u.get(pu(_)),W=C===void 0?void 0:n[C];W!==void 0&&!Qe(W)&&!tn(W)&&!Array.isArray(W)?b.push(In(W,v,t,_,k,r,s,o,i)):b.push(He(v,t,_,k,r,o,s,i))}k=A}return Ze([we(a),...b])}function On(n,e,t,r,s){let o=[],i=ae(e,t),a=r&&r.size>0?{get:u=>{let c=r.get(u);return c?{lastOutput:c.lastOutput}:void 0}}:void 0;if(Je(n,i,e,u=>o.push(u),a),r&&!s?.keepSegments)for(let u of o)u.op==="unmount"&&r.has(u.compId)&&at(u.compId,r);else if(r&&s?.keepSegments){for(let u of o)if(u.op==="unmount"){let c=r.get(u.compId);c&&(c.lastOutput=void 0)}}return s?.keepSegments?o.filter(u=>u.op!=="unmount"):o}function Yo(n){return n.some(e=>Ee(e)!==null)}function yu(n,e,t,r,s,o,i,a,l,u){let c=wu(Tt(n),Tt(e));if(!c)throw new Error(`[vdom] v2 \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1A\u672A\u5B9A\u4E49\u8F6C\u6362 ${Tt(n)} \u2192 ${Tt(e)}`);let d=[],p=null,f=[],w=l&&l.size>0?{get:h=>{let b=l.get(h);return b?{lastOutput:b.lastOutput}:void 0}}:i,m={emit:h=>{let b=h;b.op==="unmount"&&l?.has(b.compId)&&f.push(b.compId),d.push(b)},emitNode:(h,b,k,_)=>{p={v:h,p:b,i:k,r:_}},oldId:ae(t,r),newId:ae(t,r),parent:t,index:r,ref:s,oldCompId:a,registry:w};c(n,e,m);let g=p?be(h=>{let b=p;return He(b.v,b.p,b.i,b.r,o,i,l,u).subscribe({next:_=>h.next(_),error:_=>h.error(_),complete:()=>h.complete()})}):we([]);return Ze([be(h=>{for(let b of f)l?.has(b)&&at(b,l);return h.complete(),()=>{}}),we(d),g])}var Cv,of,Pn=I(()=>{"use strict";ws();en();An();pr();dr();An();mr();Qm();Zm();gr();rf();he();Yt();ei();tt();Nn();Cv=0;of=n=>Ze([n,we([{op:"done"}])])});function Rs(n){return _r.test(n)?n.slice(2).toLowerCase():null}var ni,_r,ri=I(()=>{"use strict";ni=class{table=new Map;rootTypes=new Set;doc;dispatchBound;container;phase="active";constructor(e,t){this.doc=e,this.container=t,this.dispatchBound=this.dispatch.bind(this)}set(e,t,r){if(this.phase==="disposed"){console.error(`[vdom] \u4E8B\u4EF6\u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}, ${t}) \u88AB\u5FFD\u7565`);return}if(typeof r!="function"){console.warn(`[vdom] \u4E8B\u4EF6 ${t} \u975E\u51FD\u6570\u503C\u88AB\u8DF3\u8FC7\uFF08node ${e}\uFF09\u2014\u2014\u671F\u671B\u51FD\u6570\uFF0C\u5B9E\u9645 ${typeof r}`);return}let s=this.table.get(e);s||(s=new Map,this.table.set(e,s)),s.set(t,r),this.ensureRoot(t)}get(e,t){return this.table.get(e)?.get(t)}removeEvent(e,t){let r=this.table.get(e);r&&(r.delete(t),r.size===0&&this.table.delete(e))}remove(e){for(let t of[...this.table.keys()])(t===e||t.startsWith(e+"."))&&this.table.delete(t)}removeOne(e){this.table.delete(e)}ensureRoot(e){this.rootTypes.has(e)||(this.doc.addEventListener(e,this.dispatchBound,{capture:!0}),this.rootTypes.add(e))}dispatch(e){if(this.container){let r=e.target;if(r&&!this.container.contains(r))return}if(e.type==="contextmenu"&&window.__dbgEvt){let r=e.target,s=[...this.table.entries()].map(([o,i])=>o+":"+[...i.keys()].join("+")).join(" | ");console.error("[dbg-evt-dispatch]","target:",r?.getAttribute("data-wf-id"),"ALL:",s.slice(0,400))}let t=e.target;for(t&&t.nodeType===3&&(t=t.parentElement);t;){if(!t.hasAttribute?.("data-wf-id")){let s=t.closest?.("[data-wf-id]");if(s&&s!==t){t=s;continue}}let r=t.getAttribute?.("data-wf-id");if(r){let s=this.table.get(r)?.get(e.type);if(s){try{Object.defineProperty(e,"currentTarget",{value:t,configurable:!0})}catch{}try{s(e)}catch(o){console.error("[vdom] \u4E8B\u4EF6 handler:",o)}if(e.cancelBubble)return}}t=t.parentElement}}clear(){this.table.clear()}dispose(){if(this.phase!=="disposed"){this.phase="disposed";for(let e of this.rootTypes)this.doc.removeEventListener(e,this.dispatchBound,{capture:!0});this.rootTypes.clear(),this.table.clear()}}},_r=/^on[A-Z]/});var si,uf=I(()=>{"use strict";si=class{refs=new Map;phase="active";set(e,t,r){if(this.phase==="disposed"){console.error(`[vdom] ref \u8868\u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Adisposed \u540E set(${e}) \u88AB\u5FFD\u7565`);return}if(r&&r!==t&&typeof r=="function")try{r(null)}catch(s){console.error("[vdom] ref prev:",s)}this.refs.set(e,t)}mount(e,t){let r=this.refs.get(e);if(typeof r=="function")try{r(t)}catch(s){console.error("[vdom] ref mount:",s)}}unmount(e){for(let[t,r]of[...this.refs])if(t===e||t.startsWith(e+".")){if(typeof r=="function")try{r(null)}catch(s){console.error("[vdom] ref unmount:",s)}this.refs.delete(t)}}unmountOne(e){let t=this.refs.get(e);if(typeof t=="function")try{t(null)}catch(r){console.error("[vdom] ref unmount:",r)}this.refs.delete(e)}remap(e,t){for(let[r,s]of[...this.refs])(r===e||r.startsWith(e+"."))&&(this.refs.delete(r),this.refs.set(t+r.slice(e.length),s))}clear(){this.refs.clear()}dispose(){this.phase!=="disposed"&&(this.phase="disposed",this.refs.clear())}}});function Dv(n,e){switch(e.kind){case"begin":return"consuming";case"next":return e.matched?"consuming":"failed";case"end":return n==="consuming"?e.remaining>0?"failed":"inactive":n;case"reset":return"inactive"}}var oi,cf=I(()=>{"use strict";he();oi=class{queue=null;phase="inactive";events$;failed$;events=new me;constructor(){this.events$=this.events.asObservable(),this.events.asObservable().pipe(ur(Dv,"inactive")).subscribe({next:e=>{this.phase=e}}),this.failed$=this.events.asObservable().pipe(ou(e=>e.kind==="next"&&!e.matched||e.kind==="end"&&e.remaining>0),su(()=>{}))}begin(e){let t=[],r=s=>{t.push(s);for(let o of s.childNodes)r(o)};for(let s of e.childNodes)r(s);this.queue=t,this.events.next({kind:"begin"})}end(){if(this.phase!=="consuming")return;let e=this.queue?.length??0;this.queue=null,this.events.next({kind:"end",remaining:e})}reset(){this.queue=null,this.events.next({kind:"reset"})}next(e,t,r){if(this.phase!=="consuming")return console.error(`[vdom] absorb \u72B6\u6001\u673A\u8FDD\u4F8B\uFF1Anext \u5728 ${this.phase} \u9636\u6BB5\u8C03\u7528\uFF08\u5E94 consuming\uFF09`),null;let s=this.queue;if(!s)return null;for(;s.length>0;){let o=s.shift();if(e==="element"?o.nodeType===1&&o.tagName.toLowerCase()===t:e==="text"?o.nodeType===3:o.nodeType===8){if(e==="text"&&r!==void 0){let a=o,l=a.textContent??"";if(l!==r&&l.startsWith(r)){let u=a.splitText(r.length);s.unshift(u)}}return this.events.next({kind:"next",matched:!0}),o}}return this.events.next({kind:"next",matched:!1}),null}}});function Lv(n,e,t){if(t==null||t===!1){e.startsWith("--")&&n.style.removeProperty(e),n.style[e]="";return}if(e.startsWith("--")){n.style.setProperty(e,String(t));return}typeof t=="number"&&!jv.has(e)&&(t=`${t}px`),n.style[e]=String(t)}function Su(n,e){if(e==null||e===!1){n.style.cssText="";return}if(typeof e=="string"){n.setAttribute("style",e);return}if(e&&typeof e=="object"){n.style.cssText="";for(let[t,r]of Object.entries(e))Lv(n,t,r)}}var jv,df=I(()=>{"use strict";jv=new Set(["zIndex","opacity","lineHeight","zoom","fontWeight","order","flex","flexGrow","flexShrink","flexBasis","animationIterationCount","orphans","widows","columns","columnCount","columnGap","counterIncrement","counterReset","aspectRatio","scale","rotate"])});function Wv(n){if(ii||(ii=new WeakSet),!pf.has(n)){pf.add(n);let e=ii;n.addEventListener("compositionstart",t=>{let r=t.target;r instanceof HTMLElement&&e.add(r)},!0),n.addEventListener("compositionend",t=>{let r=t.target;r instanceof HTMLElement&&e.delete(r)},!0)}return ii}function mf(n,e){return Wv(n).has(e)}var ii,pf,ff=I(()=>{"use strict";ii=null,pf=new WeakSet});function gf(n){return Uv.has(n)}function hf(n,e,t){if(t===void 0){if(Bv.has(e)){n[e]=!1;return}return}if(e==="value"&&n.nodeType===1){let r=n;if(n.ownerDocument&&mf(n.ownerDocument,r))return;let s=r.value;if(s===t||String(s)===String(t))return}n[e]=t}var Uv,Bv,wf=I(()=>{"use strict";ff();Uv=new Set(["value","checked","selected","disabled","hidden","autofocus","defaultValue","defaultChecked","innerHTML","textContent","download","indeterminate","multiple","readOnly","required","tabIndex","spellcheck","draggable","scrollTop","scrollLeft","volume","muted","paused","playbackRate","open"]);Bv=new Set(["disabled","checked","selected","multiple","readOnly","required","indeterminate","muted","paused","open","autofocus","draggable","hidden"])});function Es(n,e){for(let[t,r]of Object.entries(e))t==="style"?Su(n,r):mu(n,t,r)}function yf(n,e,t,r,s,o){if(r!=="ref")if(typeof s=="function"||s===void 0&&typeof o=="function"){if(_r.test(r)){let i=Rs(r);i&&n.set(e,i,s)}return}else if(_r.test(r)){let i=Rs(r);i&&n.set(e,i,s)}else r==="style"?Su(t,s):gf(r)?hf(t,r,s):mu(t,r,s)}var bf=I(()=>{"use strict";Zo();df();wf();ri()});function _f(n,e){return Fv.has(e)?n.createElementNS(Hv,e):n.createElement(e)}function Vv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===1&&t.tagName.toLowerCase()===e.tag)Es(t,e.attrs);else if(n.absorb.queue&&!t){let s=n.absorb.next("element",e.tag);if(s)Es(s,e.attrs),n.nodes.set(e.id,s);else{let o=_f(n.doc,e.tag);Es(o,e.attrs),n.nodes.set(e.id,o)}}else{let s=_f(n.doc,e.tag);Es(s,e.attrs),t&&(n.refRegistry.unmountOne(e.id),n.eventRegistry.removeOne(e.id),t.replaceWith(s)),n.nodes.set(e.id,s)}let r=n.nodes.get(e.id);r&&r.nodeType===1&&r.setAttribute("data-wf-id",e.id)}function zv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===3)t.textContent!==e.value&&(t.textContent=e.value);else if(n.absorb.queue&&!t){let r=n.absorb.next("text",void 0,e.value);if(r)r.textContent!==e.value&&(r.textContent=e.value),n.nodes.set(e.id,r);else{let s=n.doc.createTextNode(e.value);n.nodes.set(e.id,s)}}else{let r=n.doc.createTextNode(e.value);t&&t.replaceWith(r),n.nodes.set(e.id,r)}}function Kv(n,e){n.touched.add(e.id);let t=n.nodes.get(e.id);if(t&&t.nodeType===8){let r=e.detail?`wf-hole: ${e.detail}`:"wf-hole";t.textContent!==r&&(t.textContent=r)}else if(n.absorb.queue&&!t){let r=n.absorb.next("comment");if(r)n.nodes.set(e.id,r);else{let s=n.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");n.nodes.set(e.id,s)}}else{let r=n.doc.createComment(e.detail?`wf-hole: ${e.detail}`:"wf-hole");t&&t.replaceWith(r),n.nodes.set(e.id,r)}}function Gv(n,e){let t=n.nodes.get(e.id);if(!t||t.isConnected)return;let r=n.parentOf(e);if(r){if(r.nodeType===3){let s=r.parentElement;if(!s)return;let o=r.nextSibling&&r.nextSibling.parentNode===s?r.nextSibling:null;s.insertBefore(t,o),t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id);return}if(r.nodeType===8){console.error(`[vdom] id \u7A7A\u95F4\u8FDD\u4F8B\uFF1Ainsert ${e.id} \u7684 parent \u662F\u6CE8\u91CA\u951A\uFF08${e.parent}\uFF09\u2014\u2014\u63D2\u5230\u951A\u540E`);let s=r.parentElement;s&&s.insertBefore(t,r.nextSibling),t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id);return}if(e.ref){let s=n.nodes.get(e.ref)??null;if(!s){let o=n.childIds.size>0&&n.childIds.has(e.ref)?n.collectDesc(e.ref):null;if(o){let i="",a=-1;for(let l of o){let u=n.seq.get(l)??0;u>a&&(a=u,i=l)}i&&(s=n.nodes.get(i)??null)}else{let i=e.ref+".";for(let[a,l]of n.nodes)a.startsWith(i)&&(s=l)}}s&&s.parentNode===r?r.insertBefore(t,s.nextSibling):s?r.appendChild(t):r.insertBefore(t,r.firstChild)}else r.insertBefore(t,r.firstChild);t.nodeType===1&&n.refRegistry.mount(e.id,t),n.registerChild(e.parent,e.id)}}function Qv(n,e){let t=n.nodes.get(e.id);if(t){if(!e.noMove){let r=n.parentOf(e);if(!r)return;let s=e.ref?n.nodes.get(e.ref)??null:null;s?r.insertBefore(t,s.nextSibling):e.first?r.insertBefore(t,r.firstChild):r.appendChild(t)}n.remapSubtree(e.id,e.newId)}}function Jv(n,e){n.refRegistry.unmountOne(e.id),n.eventRegistry.removeOne(e.id),n.nodes.get(e.id)?.remove();let t=n.childIds.size>0?n.collectDesc(e.id):null,r=t??[];if(!t){let s=e.id+".";for(let o of[...n.nodes.keys()])o.startsWith(s)&&r.push(o)}for(let s of r)n.refRegistry.unmountOne(s),n.eventRegistry.removeOne(s),n.nodes.delete(s),n.unregisterChild(s);n.nodes.delete(e.id),n.unregisterChild(e.id)}function Zv(n,e){let t=n.nodes.get(e.id);t&&t.nodeType===3&&(t.textContent=e.value)}function Xv(n,e){let t=n.nodes.get(e.id);if(!t||t.nodeType!==1)return;let r=t;if(e.key==="ref"){let s=n.refRegistry.refs.get(e.id);if(e.value===void 0){n.refRegistry.set(e.id,void 0,s),n.refRegistry.refs.delete(e.id);return}n.refRegistry.set(e.id,e.value,s),r.isConnected&&n.refRegistry.mount(e.id,r);return}if(_r.test(e.key)){let s=Rs(e.key);s&&(e.value===void 0?n.eventRegistry.removeEvent(e.id,s):n.eventRegistry.set(e.id,s,e.value));return}yf(n.eventRegistry,e.id,r,e.key,e.value,e.prev)}function Yv(n,e){let t=n.nodes.get(e.id);t&&t.nodeType===1&&typeof e.fn=="function"&&(n.refRegistry.set(e.id,e.fn),n.refRegistry.mount(e.id,t))}function ek(n,e){n.clearNodeRefs(e.id)}function tk(n,e){let t=n.registry?.get(e.compId);t&&(t.phase="mounted")}function nk(n,e){n.registry&&xu(e.compId,n.registry)}function rk(n,e){if(e.full&&n.absorb.end(),e.full&&n.touched.size>0)for(let[t,r]of[...n.nodes])n.touched.has(t)||(n.refRegistry.unmountOne(t),n.eventRegistry.removeOne(t),r.remove(),n.nodes.delete(t),n.unregisterChild(t));n.touched.clear()}function vf(n,e){switch(e.op){case"create":Vv(n,e);break;case"createText":zv(n,e);break;case"createAnchor":Kv(n,e);break;case"insert":Gv(n,e);break;case"move":Qv(n,e);break;case"remove":Jv(n,e);break;case"setText":Zv(n,e);break;case"setProp":Xv(n,e);break;case"ref":Yv(n,e);break;case"unref":ek(n,e);break;case"mount":tk(n,e);break;case"unmount":nk(n,e);break;case"done":rk(n,e);break;case"close":break}}var Hv,Fv,kf=I(()=>{"use strict";ri();tt();bf();Hv="http://www.w3.org/2000/svg",Fv=new Set(["svg","path","circle","line","rect","text","g","defs","marker","polyline","polygon","ellipse","use","symbol","tspan","textPath","clipPath","mask","pattern","linearGradient","radialGradient","stop"])});var Mn,Ts=I(()=>{"use strict";ri();uf();tt();cf();kf();Mn=class{nodes=new Map;touched=new Set;childIds=new Map;byChild=new Map;seq=new Map;seqCounter=0;registerChild(e,t){this.byChild.set(t,e),this.seq.set(t,++this.seqCounter);let r=this.childIds.get(e);r||(r=new Set,this.childIds.set(e,r)),r.add(t)}unregisterChild(e){let t=this.byChild.get(e);if(t===void 0)return;this.byChild.delete(e),this.seq.delete(e);let r=this.childIds.get(t);r&&(r.delete(e),r.size===0&&this.childIds.delete(t))}collectDesc(e){let t=[],r=[e];for(;r.length>0;){let s=r.pop();t.push(s);let o=this.childIds.get(s);if(o)for(let i of o)r.push(i)}return t}reset(){this.nodes.clear(),this.touched.clear(),this.childIds.clear(),this.byChild.clear(),this.seq.clear(),this.seqCounter=0,this.eventRegistry.clear(),this.refRegistry.clear()}eventRegistry;refRegistry=new si;absorb=new oi;container;doc;registry;devVerify=null;constructor(e,t,r){this.container=e,this.doc=t,this.registry=r??null,this.eventRegistry=new ni(t,e)}dispose(){if(this.eventRegistry.dispose(),this.refRegistry.dispose(),this.registry)for(let e of[...this.registry.keys()].reverse()){let t=this.registry.get(e);if(t){for(let r of[...t.onUnmounts].reverse())try{r()}catch{}this.registry.delete(e)}}}clearNodeRefs(e){this.refRegistry.unmount(e)}remapSubtree(e,t){let r=(o,i)=>{let a=o.get(i);a!==void 0&&(o.delete(i),o.set(t+i.slice(e.length),a))};for(let o of[...this.nodes.keys()])if(o===e||o.startsWith(e+".")){r(this.nodes,o);let i=this.nodes.get(t+o.slice(e.length));i&&i.nodeType===1&&i.setAttribute("data-wf-id",t+o.slice(e.length))}for(let[o,i]of[...this.byChild]){let a=o===e||o.startsWith(e+"."),l=i===e||i.startsWith(e+".");if(!a&&!l)continue;let u=a?t+o.slice(e.length):o,c=l?t+i.slice(e.length):i;this.byChild.delete(o),this.byChild.set(u,c);let d=this.childIds.get(i);d&&(d.delete(o),d.size===0&&this.childIds.delete(i));let p=this.childIds.get(c);p||(p=new Set,this.childIds.set(c,p)),p.add(u)}let s=this.byChild.get(e);s!==void 0&&!this.byChild.has(t)&&(this.unregisterChild(e),this.registerChild(s,t)),this.refRegistry.remap(e,t);for(let o of[...this.eventRegistry.table.keys()])if(o===e||o.startsWith(e+".")){let i=this.eventRegistry.table.get(o);this.eventRegistry.table.delete(o),this.eventRegistry.table.set(t+o.slice(e.length),i)}if(this.registry){for(let o of[...this.registry.keys()])if(o===e||o.startsWith(e+".")){let i=this.registry.get(o);this.registry.delete(o),this.registry.set(t+o.slice(e.length),i)}}}parentOf(e){if(e.parent==="root")return this.container;let t=this.nodes.get(e.parent);if(t&&t.isConnected)return t;let r=e.parent.split(".");for(let s=r.length-1;s>0;s--){let o=r.slice(0,s).join(".");if(o==="root")return this.container;let i=this.nodes.get(o);if(i&&i.isConnected)return i}return null}apply(e){vf(this,e),this.devVerify&&this.devVerify(e,this)}}});function Ru(n){return`${ai}-${n}`}var ai,Sf=I(()=>{"use strict";ai="__wf_portal"});function sk(n,e){switch(e.kind){case"open":return"open";case"exit":return n==="open"?"exit":n;case"closed":return"closed";case"disposed":return"closed"}}function ok(n){return typeof n=="function"?n():n}function xf(n){return n?typeof n=="function"?n():n:null}function li(n,e){let t={tree:null,applier:null,container:null,chain:Promise.resolve(),version:0,open:!1,phase:"closed",disposed:!1,panel:null,pos:{top:0,left:0},segments:new Map},r=new me,s=r.asObservable();r.asObservable().pipe(ur(sk,"closed")).subscribe({next:E=>{t.phase=E}});let o=E=>{r.next(E)},i=n.getBrowser()?.window,a=n.getBrowser()?.document,l=()=>{if(!a)return null;if(t.container)return t.container;let E=a.getElementById(ai);E||(E=a.createElement("div"),E.id=ai,a.body.appendChild(E));let x=e.key??"popup",P=a.getElementById(Ru(x));return P?t.container=P:(t.container=a.createElement("div"),t.container.id=Ru(x),E.appendChild(t.container)),t.container},u=0,c=!1,d=()=>{if(t.disposed||!t.open)return;if(e.position&&t.panel){let B=e.position();if(B&&typeof B.x=="number"&&typeof B.y=="number"){t.pos={top:B.y,left:B.x,width:B.width},c=!0,m();return}}let E=xf(e.anchor);if(!E||!t.panel){u++<10&&queueMicrotask(d);return}if(!i)return;let x=t.panel,P=x.offsetWidth||x.getBoundingClientRect().width,N=x.offsetHeight||x.getBoundingClientRect().height;if((P===0||N===0)&&u++<10){typeof i.requestAnimationFrame=="function"?i.requestAnimationFrame(d):queueMicrotask(d);return}let D=typeof e.placement=="function"?e.placement():e.placement??"bottom",q=qm(E,i,P,N,D,e.gap??8,e.margin??8,e.center??!0);if(!q){u++<10&&queueMicrotask(d);return}if(u=0,t.pos=q,t.applier){let B=g(t.tree);B&&h(B)}},p=E=>{if(t.panel=E,E&&t.open&&!c&&e.positioning!=="none"&&(i&&typeof i.requestAnimationFrame=="function"?i.requestAnimationFrame(d):queueMicrotask(d)),E&&e.presence){let x=P=>{t.phase==="exit"&&k()};E.addEventListener("animationend",x),n.onUnmount(()=>E.removeEventListener("animationend",x))}},f=null,w=E=>{f=E,E&&c&&m()},m=()=>{let E=e.mask?f:t.panel;E&&(E.style.top=`${t.pos.top}px`,E.style.left=`${t.pos.left}px`,t.pos.width!==void 0&&(E.style.width=`${t.pos.width}px`))},g=E=>{if(!E)return null;let x=E;e.mask&&(x=Ge("div",{class:"wf-popup-mask",style:{position:"fixed",inset:"0",background:"var(--wf-overlay, rgba(0,0,0,0.5))",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"var(--wf-z-modal, 1000)"},onClick:$=>{e.maskClosable!==!1&&$.target===$.currentTarget&&_()}},e.maskCentered?{...x,props:{...x.props??{}}}:Ge("div",{class:"wf-popup-mask-inner",ref:w,style:e.position?{position:"fixed",top:`${t.pos.top}px`,left:`${t.pos.left}px`,...t.pos.width!==void 0?{width:`${t.pos.width}px`}:{}}:void 0},x)));let P=x.props??{},N=e.positioning==="none"||String(P.class??"").includes("mask")?P.class??"":["wf-popup",P.class].filter(Boolean).join(" "),D=!(e.mask&&e.position),q=e.positioning==="none"?{...P.style??{},position:"fixed"}:{...P.style??{},position:"fixed",...D?{top:`${t.pos.top}px`,left:`${t.pos.left}px`}:{},...D&&t.pos.width!==void 0?{width:`${t.pos.width}px`}:{}};return{...x,props:{...P,class:N,style:q,ref:p}}},h=E=>{let x=++t.version,P=t.tree;t.tree=E,t.chain=t.chain.then(async()=>{if(t.disposed||x!==t.version)return;let N=t.applier;if(!N)return;let D=N.registry;if(!D)return;let q=n.getSharedContext()??{},B=await new Promise(($,j)=>{let H=[],z=()=>n.requestRender?.();(P?xs(P,E,q,t.segments,D,z):vr(E,q,D,t.segments,z)).subscribe({next:ee=>H.push(ee),error:j,complete:()=>$(H)})});for(let $ of B){if(t.disposed||x!==t.version)return;N.apply($)}for(let $ of B)$.op==="unmount"&&at($.compId,t.segments)}).catch(N=>{console.error("[popup] render error:",N)})},b=()=>{t.disposed||(t.disposed=!0,t.applier&&(t.applier.dispose(),t.applier=null),t.tree=null,t.container&&(t.container.remove(),t.container=null))},k=()=>{t.disposed||(t.open=!1,o({kind:"closed"}),C(),b(),o({kind:"disposed"}),e.onClose?.())},_=()=>{!t.open||t.disposed||(e.presence?(o({kind:"exit"}),t.panel&&i&&!Dm(t.panel,i)&&k(),t.panel||k()):k())},v={value:""},S={value:null},A={value:!1},C=()=>{A.value&&(a?.body&&(a.body.style.overflow=v.value),v.value="",S.value&&(S.value.focus?.(),S.value=null),A.value=!1)},W=()=>{n.scheduleAfterRender(()=>{let E=x=>{let P=t.panel;P?(P.querySelector?.("input, button, [tabindex], select, textarea")??P).focus?.():x<10&&t.open&&queueMicrotask(()=>E(x+1))};E(0)})},G=()=>{A.value=!0,e.lockScroll&&a?.body&&(v.value=a.body.style.overflow,a.body.style.overflow="hidden"),e.trapFocus&&i&&(S.value=i.document.activeElement,W())},U=null;e.trapFocus&&i&&(U=E=>{if(E.key!=="Tab"||!t.open||!t.panel)return;let x=Array.from(t.panel.querySelectorAll?.("input, button, [tabindex], select, textarea")??[]).filter(q=>!q.disabled&&q.offsetParent!==null);if(x.length===0)return;let P=x[0],N=x[x.length-1],D=i?.document.activeElement;E.shiftKey&&(D===P||D===t.panel||!t.panel.contains(D))?(E.preventDefault(),N.focus()):!E.shiftKey&&(D===N||!t.panel.contains(D))&&(E.preventDefault(),P.focus())},i.addEventListener("keydown",U));let F=E=>{if(!t.open||(e.closeOnOutside??!0)===!1)return;let x=E.target,P=xf(e.anchor);x&&P?.contains(x)||x&&t.panel?.contains(x)||_()},K=E=>{t.open&&(e.closeOnEscape??!0)&&E.key==="Escape"&&_()};i&&(i.addEventListener("mousedown",F),i.addEventListener("keydown",K)),n.onUnmount(()=>{i&&(i.removeEventListener("mousedown",F),i.removeEventListener("keydown",K),U&&i.removeEventListener("keydown",U)),k()});let M=()=>{if(t.open||t.disposed)return;t.open=!0,o({kind:"open"});let E=l();if(!E)return;e.trapFocus||e.lockScroll?G():e.autoFocus&&W();let x=Ct();t.applier=new Mn(E,a,x),t.segments=new Map;let P=ok(e.content);P!=null?h(g(P)):k()},O={close:_,update(E){if(t.disposed||!t.open)return;if(E==null){_();return}let x=!1;if(e.position){let P=e.position();P&&typeof P.x=="number"&&typeof P.y=="number"&&(t.pos={top:P.y,left:P.x,width:P.width},x=!0)}h(g(E)),x&&m()},refresh(){if(!(t.disposed||!t.open||!t.tree)&&e.position){let E=e.position();E&&typeof E.x=="number"&&typeof E.y=="number"&&(t.pos={top:E.y,left:E.x,width:E.width},m())}},get open(){return t.open},events$:s};return M(),O}var Eu=I(()=>{"use strict";Cn();Nn();Pn();Ts();tt();Sf();cu();he()});function Rf(n,e,t){let r=n.nextHookIndex(),s=n.getHookState(r)??{value:t};n.setHookState(r,s);let o=e.value!==void 0;return{get value(){return e.value??s.value},controlled:e,setValue(i){o?(e.onChange||console.warn("[vdom] useControlled \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548"),e.onChange?.(i)):(s.value=i,n.requestRender())}}}var Ef=I(()=>{"use strict"});function Tf(n,e){let t=new me,r=dt(n,ik(n,e,t),{y:0,x:0});return{get y(){return r().y},get x(){return r().x},refresh:()=>{t.next()}}}function ik(n,e,t){let r=n.getBrowser()?.window,s=n.getBrowser()?.document??null;return be(o=>{if(!r)return o.next({y:0,x:0}),o.complete(),()=>{};let i,a=null,l=null,u=0,c=()=>{if(typeof e=="function")return e();if(e&&typeof e=="object"&&!("nodeType"in e)){let m=e;return typeof m.getScroller=="function"?m.getScroller()??null:m.root?typeof m.root=="string"?s?s.querySelector(m.root)??r:r:m.root:r}return r},d=m=>m?m===r?{y:r.scrollY||0,x:r.scrollX||0}:{y:m.scrollTop,x:m.scrollLeft}:{y:0,x:0},p=()=>{o.next(d(l))},f=()=>{if(a)return;if(l=c(),!l){u++<10&&n.scheduleAfterRender(f);return}let m=()=>{i===void 0&&(i=r.requestAnimationFrame(()=>{i=void 0,p()}))};l.addEventListener("scroll",m,{passive:!0}),a=m,p()};f();let w=t?.subscribe({next:()=>{f(),p()}});return()=>{w?.unsubscribe(),i!==void 0&&r.cancelAnimationFrame(i),a&&l&&l.removeEventListener("scroll",a),a=null}})}function Cf(n,e){let t=n.nextHookIndex(),r=n.getHookState(t)??{isIn:!1,io:null,retries:0,ready:!1};n.setHookState(t,r);let o=n.getBrowser()?.window?.IntersectionObserver,i=e&&typeof e=="object"&&!("nodeType"in e)?e:void 0,a=i?.target??(typeof e=="function"||e&&"nodeType"in e?e:void 0),l=typeof i?.rootMargin=="function"?i.rootMargin():i?.rootMargin,u=typeof i?.threshold=="function"?i.threshold():i?.threshold,c=typeof i?.root=="function"?i.root():i?.root??null,d=p=>{if(!o||!p||r.io)return;let f=new o(w=>{let m=w[0];m&&m.isIntersecting!==r.isIn&&(r.isIn=m.isIntersecting,i?.onChange?.(m,m.isIntersecting),n.requestRender())},{root:c??void 0,rootMargin:l,threshold:u});f.observe(p),r.io=f,r.ready=!0,n.onUnmount(()=>r.io?.disconnect())};if(o&&!r.io){let p=typeof a=="function"?a():a??null;p?d(p):a!==void 0&&r.retries++<10&&n.scheduleAfterRender(()=>d(typeof a=="function"?a():a??null))}return{get isIn(){return r.isIn},get ready(){return r.ready},ref:p=>{p?d(p):r.io?.disconnect()},observe:p=>d(p),disconnect:()=>{r.io?.disconnect(),r.io=null}}}var Af=I(()=>{"use strict";he();cr()});function Of(n,e,t){let r=n.nextHookIndex(),s=n.getHookState(r)??{keyword:"",selectedLabel:"",composing:!1};n.setHookState(r,s);let o=e.value!==void 0;return{controlled:e,get value(){return e.value??s.keyword},setValue(i){o?(e.onChange||console.warn(`[vdom] useControlledInput(${t?.name??""}) \u53D7\u63A7\u7F3A onChange \u56DE\u8C03\u2014\u2014\u4EA4\u4E92\u9759\u9ED8\u5931\u6548`),e.onChange?.(i)):(s.keyword=i,n.requestRender())},get keyword(){return s.keyword},setKeyword(i){s.keyword=i,s.composing||this.setValue(i)},get selectedLabel(){return s.selectedLabel},setSelectedLabel(i){s.selectedLabel=i},get isComposing(){return s.composing},onCompositionStart(){s.composing=!0},onCompositionEnd(){s.composing=!1}}}var If=I(()=>{"use strict"});function Nf(n,e){let t={draggable:!0,onDragStart:r=>{e.data!==void 0&&r.dataTransfer?.setData("text/plain",JSON.stringify(e.data)),e.onDragStart?.(r,e.data)},onDragEnd:r=>e.onDragEnd?.(r)};return{draggableProps:t,dragProps:t,dropProps:{onDragEnter:r=>e.onDragEnter?.(r),onDragOver:r=>{r.preventDefault(),e.onDragOver?.(r)},onDragLeave:r=>e.onDragLeave?.(r),onDrop:r=>{r.preventDefault();let s;try{s=r.dataTransfer?.getData("text/plain")?JSON.parse(r.dataTransfer.getData("text/plain")):void 0}catch{s=void 0}e.onDrop?.(r,s)}}}}function lk(n,e){let t=n.getBrowser()?.window,r=t?Pf.get(t)??Pf.set(t,new Map).get(t):ak,s=r.get(e);return s||(s=ru(o=>{let i=n.getBrowser()?.window,l=(i?.matchMedia?.bind(i)??(typeof globalThis.matchMedia=="function"?globalThis.matchMedia.bind(globalThis):void 0))?.(e);if(!l)return;let u=()=>o(l.matches);return l.addEventListener("change",u),()=>l.removeEventListener("change",u)},()=>{let o=n.getBrowser()?.window,i=o?.matchMedia?.bind(o)??(typeof globalThis.matchMedia=="function"?globalThis.matchMedia.bind(globalThis):void 0);return i?i(e).matches:!1}),r.set(e,s)),s}function Cs(n,e){return dt(n,lk(n,e),!1)}function Mf(n,e){let t=Object.entries(e).sort((r,s)=>r[1]-s[1]);return()=>{let r=t[0]?.[0]??"default";for(let[s,o]of t)Cs(n,`(min-width: ${o}px)`)()&&(r=s);return r}}var Pf,ak,Tu=I(()=>{"use strict";he();cr();Pf=new WeakMap,ak=new Map});function ck(){let n="";return(e,t)=>{let r=e.trim();if(!r)return null;if(r.startsWith("event:"))return n=r.slice(6).trim(),null;let s=t??n,o=r.startsWith("data:")?r.slice(5).trim():r;if(!o)return null;let i;try{i=JSON.parse(o)}catch{return null}if(!s)return i.toolCalls?{toolCalls:i.toolCalls}:i.text!==void 0?{content:String(i.text)}:i.content!==void 0?{content:i.content}:null;switch(s){case"wf:message_start":return null;case"wf:token":return{content:i.text!==void 0?String(i.text):i.content};case"wf:step":return{step:i};case"wf:usage":return{usage:i};case"wf:tool_call":return{toolCalls:[{id:i.id,name:i.name,args:i.args,status:"running",call:i}]};case"wf:tool_progress":return{toolProgress:i};case"wf:tool_result":return{toolResult:i};case"wf:approval_request":return{approval:i};case"wf:error":return{error:i};case"wf:done":{let a=i.usage?{usage:i.usage}:{};return{done:!0,...i.content?{content:i.content,doneContent:!0}:{},...a}}default:return null}}}function $f(n,e){let t=n.nextHookIndex(),r=n.getHookState(t)??{messages:[],status:"idle",subs:new Set,changes:new me,controller:null,seq:0,input:"",error:null,usage:null,step:null};if(n.setHookState(t,r),r.messages.length===0){let a=[];e.system&&a.push({id:Cu(),role:"system",content:e.system}),e.initialMessages&&a.push(...e.initialMessages),r.messages=a}let s=()=>{for(let a of[...r.subs])a();r.changes.next([...r.messages])},o=e.parseChunk??ck(),i={get state(){return r.messages},get messages(){return r.messages},changes$:r.changes.asObservable(),get status(){return r.status},get input(){return r.input??""},setInput(a){r.input=a},get streaming(){return r.status==="streaming"},get error(){return r.error??null},get usage(){return r.usage??null},get step(){return r.step??null},subscribe(a){return r.subs.add(a),()=>{r.subs.delete(a)}},set(){},update(){},notify:s,async send(a=r.input){let l=typeof e.url=="function"?e.url():e.url??"/api/chat",u={id:Cu(),role:"user",content:a};r.messages=[...r.messages,u];let c={id:Cu(),role:"assistant",content:"",status:"streaming"};r.messages=[...r.messages,c],r.status="streaming",s();let d=new AbortController;r.controller=d;try{let p=await fetch(l,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({messages:r.messages.map(g=>({role:g.role,content:g.content}))}),signal:d.signal});if(!p.ok||!p.body)throw new Error(`[vdom] chat \u8BF7\u6C42\u5931\u8D25 ${p.status}`);let f=p.body.getReader(),w=new TextDecoder,m="";for(;;){let{value:g,done:h}=await f.read();if(h)break;m+=w.decode(g,{stream:!0});let b=m.split(`
117
+ `);m=b.pop()??"";let k;for(let _ of b){if(!_.trim())continue;if(_.trim().startsWith("event:")){k=_.trim().slice(6).trim();continue}let v=o(_,k);if(_.trim().startsWith("data:")&&(k=void 0),!!v){if(v.content&&(c.content=v.doneContent?c.content||v.content:c.content+v.content,s()),v.toolCalls?.length&&(c.toolCalls=[...c.toolCalls??[],...v.toolCalls],s()),v.toolProgress){let S=c.toolCalls?.find(A=>A.id===v.toolProgress.toolCallId);S&&(S.progress=v.toolProgress,s())}if(v.toolResult){let S=c.toolCalls?.find(A=>A.id===v.toolResult.id);S&&(S.result=v.toolResult.output,S.status=v.toolResult.ok===!1?"error":"ok",s())}if(v.approval){c.approval=v.approval;let S=c.toolCalls?.find(A=>A.id===v.approval.toolCallId);S&&(S.approval=v.approval),s()}v.usage&&(r.usage=v.usage,s()),v.step!==void 0&&(r.step=v.step,s()),v.error&&(r.error=v.error,c.status="error",s()),v.done&&(r.step=null,s())}}}c.status=void 0,r.status="idle"}catch(p){p.name!=="AbortError"?(c.status="error",r.status="error"):(c.status=void 0,r.status="idle")}finally{r.controller=null,s()}},stop(){r.controller?.abort()},retry(){let a=[...r.messages].reverse().find(l=>l.role==="user");a&&i.send(a.content)},reset(){r.messages=[],r.status="idle",s()},async approve(a,l,u){let c=!1;for(let d of r.messages){for(let p of d.toolCalls??[])if(!p.approved){p.approved=a!=="rejected",l&&(p.feedback=l),a==="modified"&&u&&(p.args=u),c=!0;break}if(c)break}s()}};return i}var uk,Cu,qf=I(()=>{"use strict";he();uk=0,Cu=()=>`m${Date.now().toString(36)}${(uk++).toString(36)}`});function Au(n){return Cs(n,"(prefers-reduced-motion: reduce)")()}function Df(n,e,t){let r=n.getBrowser()?.window,s=Au(n),o=t?.duration??400;if(o<=0)return{value:e,reset:()=>{}};let i=t?.ease==="linear"?k=>k:k=>1-Math.pow(1-k,3),a=n.nextHookIndex(),l=n.getHookState(a);if(l)return l.reset(e),l;let u=s?e:0,c,d=e,p=0,f=o+200,w,m={get value(){return c!==void 0&&r&&r.performance.now()-p>f?d:u},set value(k){u=k},reset:()=>{}},g=()=>{n.requestRender()},h=k=>{if(d=k,s){m.value=k,g();return}if(k===m.value)return;if(!r){m.value=k;return}c!==void 0&&r.cancelAnimationFrame(c);let _=m.value,v=r.performance.now();p=v,b();let S=A=>{let C=Math.min(1,(A-v)/o);m.value=Math.round(_+(k-_)*i(C)),C<1?c=r.requestAnimationFrame(S):c=void 0,g()};c=r.requestAnimationFrame(S)},b=()=>{r&&(w!==void 0&&clearTimeout(w),w=setTimeout(()=>{w=void 0,c!==void 0&&(r&&r.cancelAnimationFrame(c),c=void 0,m.value=d,g())},f))};return m.reset=k=>{k===d&&c!==void 0||h(k)},n.onUnmount(()=>{c!==void 0&&r&&(r.cancelAnimationFrame(c),c=void 0)}),n.setHookState(a,m),l=m,l.reset(e),l}function jf(n,e){let t=n.getBrowser()?.window,r=0,s=0,o=!1,i=0,a=d=>{o&&e.onMove(d,{x:d.clientX-r,y:d.clientY-s})},l=d=>{o&&d.pointerId===i&&(o=!1,t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u)),e.onEnd?.(d))},u=d=>{!o||d.pointerId!==i||(o=!1,t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u)),e.onEnd?.(d))},c=d=>{o||(d.preventDefault(),o=!0,i=d.pointerId,r=d.clientX,s=d.clientY,t&&(t.addEventListener("pointermove",a),t.addEventListener("pointerup",l),t.addEventListener("pointercancel",u)),e.onStart?.(d))};return n.onUnmount(()=>{o&&t&&(t.removeEventListener("pointermove",a),t.removeEventListener("pointerup",l),t.removeEventListener("pointercancel",u),o=!1)}),{onPointerDown:c}}function Lf(n){let e=dt(n,dk(n),{height:0,offsetTop:0,keyboardOpen:!1});return{get height(){return e().height},get offsetTop(){return e().offsetTop},get keyboardOpen(){return e().keyboardOpen}}}function dk(n){let e=n.getBrowser()?.window;return be(t=>{let r=()=>{let i=e?.visualViewport,a=i?.height??e?.innerHeight??0;return{height:a,offsetTop:i?.offsetTop??0,keyboardOpen:a<(e?.innerHeight??0)*.9}};if(!e)return t.next({height:0,offsetTop:0,keyboardOpen:!1}),t.complete(),()=>{};let s=()=>t.next(r()),o=e.visualViewport;return o?.addEventListener?(o.addEventListener("resize",s),o.addEventListener("scroll",s),s(),()=>{o.removeEventListener("resize",s),o.removeEventListener("scroll",s)}):(e.addEventListener("resize",s),s(),()=>e.removeEventListener("resize",s))})}var Wf=I(()=>{"use strict";Tu();he();cr()});function Ou(n,e){let t=n.nextHookIndex(),r=n.getHookState(t);return r===void 0&&(r={v:e},n.setHookState(t,r)),{get:()=>r.v,set:s=>{r.v=typeof s=="function"?s(r.v):s,n.requestRender()}}}var Iu=I(()=>{"use strict"});function Pu(n,e){let t=null,r=e,s={onClick:l=>{r.maskClosable!==!1&&l.target===l.currentTarget&&i()}},o={role:e.role??"dialog","aria-modal":!0},i=()=>r.onOpenChange?.(!1),a=(l,u)=>{u&&(r=u);let c=!!r.open;c&&!t?t=li(n,{key:"overlay",presence:!!r.presence,trapFocus:r.trapFocus!==!1,lockScroll:r.lockScroll!==!1,positioning:"none",closeOnOutside:!1,closeOnEscape:!1,content:l,onClose:()=>{t=null}}):!c&&t?(t.update(l()),t.close(),t=null):t&&t.update(l())};return Jo(n,l=>{l.key==="Escape"&&t?.open&&r.closeOnEscape!==!1&&i()}),n.onUnmount?.(()=>{t&&t.close()}),{maskProps:s,panelProps:o,close:i,sync:a}}var Nu=I(()=>{"use strict";Eu();uu()});function Mu(n,e){let t=e,r=()=>t.id??(t.name?`wf-${t.name}`:void 0),s=()=>r()??"wf-field";return{get hasWrap(){return!!(t.label||t.error||t.hint)},get stateClass(){return t.error?` ${t.wrapErrClass??"wf-field--err"}`:""},get inputId(){return r()},inputProps(){let o={},i=r();i&&(o.id=i),t.error&&(o["aria-invalid"]=!0);let a=[];return t.error&&a.push(`${s()}-err`),t.hint&&!t.error&&a.push(`${s()}-hint`),a.length&&(o["aria-describedby"]=a.join(" ")),t.required&&(o["aria-required"]=!0),o},renderLabel(){if(t.label==null&&!t.required)return null;let o=[];return t.label!=null&&o.push(t.label),t.required&&o.push(Ge("span",{class:t.reqClass??"wf-field-req"},t.reqChar??"*")),Ge("label",{class:t.labelClass,...r()?{for:r()}:{}},o)},renderError(){return t.error?Ge("div",{class:t.errClass,id:`${s()}-err`},t.error):null},renderHint(){return t.hint&&!t.error?Ge("div",{class:t.hintClass,id:`${s()}-hint`},t.hint):null}}}var $u=I(()=>{"use strict";Cn()});function vu(n){return{useObservable(e,t,r){return dt(n,e,t,r)},useAsyncData(e,t){let r=Uf.get(t);r||(r={trigger:new Xt(void 0),state$:new Xt(ui.get(t)??null),fetcher:null,started:ui.has(t),seedHit:ui.has(t),sub:null},ui.delete(t),Uf.set(t,r)),r.fetcher=e;let s=()=>{if(r.sub||r.seedHit)return;r.started=!0;let a=r.trigger.asObservable().pipe(Qo(()=>{let l=r.fetcher;if(!l)return lr(Promise.resolve(null));let u=l();return Bf.add(u),u.finally(()=>Bf.delete(u)).catch(()=>{}),lr(u)}));r.sub=a.subscribe({next:l=>{r.state$.next(l)},error:l=>{console.error("[vdom] useAsyncData:",l),pk.next({key:t,error:l}),r.state$.next(null)}})};return s(),[dt(n,r.state$.asObservable(),null),()=>{r.seedHit&&(r.seedHit=!1),r.state$.next(null),r.sub?r.trigger.next():s()}]},useSession(e){let[t]=this.useAsyncData(async()=>{let r={},s=e?.token?.();s&&(r.Authorization=`Bearer ${s}`);let o=await fetch(e?.path??"/api/auth/me",{headers:r});if(!o.ok)throw new Error(`session \u83B7\u53D6\u5931\u8D25 HTTP ${o.status}`);return await o.json()},"wf:session");return t},useExternal(e){let t=n.getInstanceData(),r=t.get(e);if(!r){let s=e.subscribe(()=>n.requestRender());n.onUnmount(s),r={unsub:s},t.set(e,r)}return()=>e.state},signal:e=>{let t=au(e),r=t.subscribe(()=>n.requestRender());return n.onUnmount(r),t},hold:e=>n.onUnmount(e),useStableRef:(e,t)=>Mm(n,e,t),useOpen:(e,t)=>$m(n,e,t),onUnmount:e=>n.onUnmount(e),useGlobalKey:(e,t)=>Jo(n,e,t),openPopup:e=>li(n,e),usePopupPosition:e=>jm(n,e),useControlled:(e,t)=>Rf(n,e,t),useScrollPosition:e=>Tf(n,e),useInView:e=>Cf(n,e),useControlledInput:(e,t)=>Of(n,e,t),useDragDrop:e=>Nf(n,e),useMedia:e=>Cs(n,e),useBreakpoint:e=>Mf(n,e),useChat:e=>$f(n,e),useTween:(e,t)=>Df(n,e,t),useDrag:e=>jf(n,e),useVisualViewport:()=>Lf(n),useReducedMotion:()=>Au(n),useSignal:e=>Ou(n,e),useOverlay:e=>Pu(n,e),useField:e=>Mu(n,e)}}var Uf,Bf,pk,ui,ei=I(()=>{"use strict";lu();he();cr();uu();cu();Eu();Ef();Af();If();Tu();qf();Wf();Iu();Nu();$u();Uf=new Map,Bf=new Set,pk=new me,ui=new Map});var qu=I(()=>{"use strict"});var Hf=I(()=>{"use strict"});function ti(n){return Qe(n)?{kind:"hole"}:Array.isArray(n)?{kind:"array",items:n}:{kind:"vnode",v:n}}function nn(n){return n.kind==="hole"?null:n.kind==="array"?n.items:n.v}function Ct(){let n=new Map;return{get:e=>n.get(e),set:(e,t)=>{n.set(e,t)},delete:e=>{n.delete(e)},keys:()=>[...n.keys()],asyncTimeout:15e3}}function xu(n,e){let t=[...e.keys()].filter(r=>r===n||r.startsWith(n+".")).reverse();for(let r of t){let s=e.get(r);if(s){for(let o of s.onUnmounts.reverse())try{o()}catch(i){console.error("[vdom] onUnmount:",i)}e.delete(r)}}}var tt=I(()=>{"use strict";ei();gr();qu();mr();ws();Hf()});function ku(n,e,t,r){return typeof n?.type=="function"||Array.isArray(n)||pt(n)==="hole"?{parent:e,index:0}:{parent:t,index:r}}function He(n,e,t,r,s,o,i,a){let l=[];return As(n,e,t,r,s,o,i,a,l),we(l)}function As(n,e,t,r,s,o,i,a,l){let u=ae(e,t);switch(pt(n)){case"text":{let c=Xo(n);l.push({op:"createText",id:u,value:c},{op:"insert",id:u,parent:e,ref:r});break}case"hole":{gu(c=>l.push(c),u,e,r);break}case"array":{let c=n;ys(c,`\u6570\u7EC4\u5C55\u5F00\uFF08${e}\uFF09`);let d=t,p=r;for(let f of c){As(f,e,d,p,s,o,i,a,l);let w=Ie(f);p=ae(e,d+w-1),d+=w}break}case"fragment":{let c=$e(n);ys(c,`Fragment \u5C55\u5F00\uFF08${e}\uFF09`);let d=t,p=r;for(let f of c){As(f,e,d,p,s,o,i,a,l);let w=Ie(f);p=ae(e,d+w-1),d+=w}break}case"element":{let c=n;l.push({op:"create",id:u,tag:c.type,attrs:_s(c.props)});for(let[m,g]of Object.entries(c.props))m==="children"||m==="key"||m==="ref"||typeof g=="function"&&l.push({op:"setProp",id:u,key:m,value:g});l.push({op:"insert",id:u,parent:e,ref:r});let d=c.props.ref;typeof d=="function"&&l.push({op:"ref",id:u,fn:d});let p=$e(c);ys(p,`\u5143\u7D20 children\uFF08${u}\uFF09`);let f=null,w=0;for(let m of p){As(m,u,w,f,s,o,i,a,l);let g=Ie(m);f=ae(u,w+g-1),w+=g}l.push({op:"close",id:u});break}case"component":{let c=n,d=c.key!==null?it(e,c.key):u,p=i??new Map,f=p.get(d);f&&f.factory!==c.type&&(at(d,p),f=void 0),f?ct("seg:reuse",d):(f=bu(c.type,c.props,s,d,a),p.set(d,f),ct("seg:create",d));let w;try{w=_u(f,c.props)}catch(g){hs(d,g),w=null}w!==null&&tu(d),f.lastOutput=ti(w);let m=ku(w,d,e,t);if(Qe(w)){let g=ae(d,0);l.push({op:"createAnchor",id:g},{op:"insert",id:g,parent:e,ref:r},{op:"mount",compId:d});break}As(w,m.parent,m.index,r,s,o,p,a,l),l.push({op:"mount",compId:d});break}case"invalid":{console.warn(`[vdom] \u975E\u6CD5\u5B50\u8282\u70B9\u2014\u2014${fu(n)}`),gu(c=>l.push(c),u,e,r,fu(n));break}}}function vr(n,e,t,r,s){let o=e??{},i=t??Ct();return He(n,"root",0,null,o,i,r,s).pipe(mk(we([{op:"done",full:!0}])))}function we(n){return be(e=>{for(let t of n)e.next(t);return e.complete(),()=>{}})}function Ze(n){return be(e=>{let t=0,r=null,s=!1,o=!1,i=()=>{if(!(s||o)){for(o=!0;!s;){if(t>=n.length){e.complete();break}let a=n[t++],l=!1,u=!0;if(r=a.subscribe({next:c=>e.next(c),error:c=>{s||(s=!0,e.error(c))},complete:()=>{l||s||(l=!0,!u&&i())}}),u=!1,!l)break}o=!1}};return i(),()=>{s=!0,r?.unsubscribe()}})}function mk(n){return e=>Ze([e,n])}var Nn=I(()=>{"use strict";ws();tt();pr();An();Yt();en();mr();hu();en();he();Pn();tt()});var Gf={};ie(Gf,{VOID_ELEMENTS:()=>Vf,attrsToHtml:()=>Kf,commandToHtml:()=>fk,escapeHtml:()=>kr,htmlDocument:()=>gk,kebab:()=>zf});function kr(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function zf(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function Kf(n){let e=[];for(let[t,r]of Object.entries(n)){let s=bs(t,r);if(s!==null){e.push(`${t}="${s}"`);continue}if(!(r==null||r===!1))if(t==="style"&&r&&typeof r=="object"){let o=Object.entries(r).filter(([,i])=>i!=null&&i!==!1).map(([i,a])=>`${zf(i)}: ${a}`).join("; ");o&&e.push(`style="${kr(o)}"`)}else typeof r=="boolean"?e.push(`${t}=""`):e.push(`${t}="${kr(String(r))}"`)}return e.length?" "+e.join(" "):""}function fk(){let n=[];return new TransformStream({transform(e,t){switch(e.op){case"create":n.push(e.tag),t.enqueue(`<${e.tag}${Kf(e.attrs)}>`);break;case"createText":t.enqueue(kr(e.value));break;case"createAnchor":t.enqueue("<!--wf-hole-->");break;case"close":{let r=n.pop();r&&!Vf.has(r)&&t.enqueue(`</${r}>`);break}case"setText":t.enqueue(kr(e.value));break;case"insert":case"remove":case"setProp":case"ref":case"unref":case"mount":case"unmount":case"move":case"done":break}}})}function gk(n,e={}){let t=e.rootId??"root",r=e.data?`<script>window.__DATA__=${JSON.stringify(e.data).replace(/</g,"\\u003c")}</script>`:"";return`<!DOCTYPE html><html><head><meta charset="utf-8"><title>${kr(e.title??"")}</title></head><body><div id="${t}">${n}</div>${r}</body></html>`}var Vf,Qf=I(()=>{"use strict";Zo();Vf=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"])});function Jf(n){return new Promise((e,t)=>{let r=[];n.subscribe({next:s=>r.push(s),error:t,complete:()=>e(r)})})}async function Du(n,e,t){let r=t??Ct(),s=await Jf(vr(n,e,r)),{commandToHtml:o}=await Promise.resolve().then(()=>(Qf(),Gf)),a=new ReadableStream({start(u){for(let c of s)u.enqueue(c);u.close()}}).pipeThrough(o()).getReader(),l="";for(;;){let{value:u,done:c}=await a.read();if(c)break;l+=u}return l}var Sr=I(()=>{"use strict";Nn();tt();Pn()});var ju=I(()=>{"use strict";ro();xa()});var Lu=I(()=>{"use strict"});var Zf=I(()=>{"use strict";Cn()});var Xf=I(()=>{"use strict"});var Yf=I(()=>{"use strict";Xf()});var eg=I(()=>{"use strict";qu()});var Wu=I(()=>{"use strict";he();Yt()});var tg=I(()=>{"use strict";he();Yt();Pn()});var ng=I(()=>{"use strict";Yt();ws()});var Uu=I(()=>{"use strict";he();Nn();Yt();Zf();ju();Yf();Lu();Ts();tt();eg();Nn();Pn();Wu();tg();ng();ei()});var rg=I(()=>{"use strict";he();he()});var sg=I(()=>{"use strict";he()});var og=I(()=>{"use strict";he()});var ag=I(()=>{"use strict";Sr();Ts();tt();Cn();he()});var lg=I(()=>{"use strict"});var ug=I(()=>{"use strict"});var cg=I(()=>{"use strict";Cn()});var dg=I(()=>{"use strict"});var pg=I(()=>{"use strict";Cn();An();dr();ju();Lu();Uu();Uu();Iu();Nu();$u();lu();rg();sg();og();ag();Sr();Sr();Ts();tt();lg();ug();cg();dg();Nn();Pn();Wu();Sr()});import{build as bk}from"esbuild";import{readFile as gg,stat as Bu}from"node:fs/promises";import{createHash as _k}from"node:crypto";import{resolve as ci,dirname as Os,basename as vk,join as Fe,sep as kk}from"node:path";import{existsSync as Hu}from"node:fs";import{fileURLToPath as hg}from"node:url";function Sk(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function wg(n){return n==null||n===!1||n===!0?"":Array.isArray(n)?n.map(wg).join(""):n instanceof ar?n.value:Sk(String(n))}function xk(n){return new ar(n)}async function mg(n){let e={};for(let t of n)try{let r=await Bu(t);e[t]={mtimeMs:r.mtimeMs,size:r.size}}catch{e[t]={mtimeMs:-1,size:-1}}return e}async function yg(n,e=new Set){if(e.has(n))return[];e.add(n);let t;try{t=await gg(n,"utf-8")}catch{return[]}let r=Os(n),s=[];for(let o of t.matchAll(/@import\s+['"](\.[^'"]+\.css)['"]/g)){let i=ci(r,o[1]);s.push(i,...await yg(i,e))}return s}function bg(){let n=Os(hg(import.meta.url));for(;;){if(Hu(Fe(n,"package.json")))return n;let e=Os(n);if(e===n)throw new Error("[ui] \u5305\u6839\u5B9A\u4F4D\u5931\u8D25\uFF08\u5411\u4E0A\u672A\u627E\u5230 package.json\uFF09");n=e}}function _g(n){let e=Fe(bg(),"dist"),t=Ek[n];if(t)return Fe(e,t);if(n.startsWith("weifuwu/server/"))return Fe(e,"level6","server",n.slice(15),"index.js");if(n.startsWith("weifuwu/")){let r=n.slice(8);for(let s of[Fe(e,r),`${Fe(e,r)}.js`,`${Fe(e,r)}.css`,Fe(e,r,"index.js"),Fe(e,"level6",r,"index.js"),Fe(e,"level5",r,"index.js")])if(Hu(s))return s;return Fe(e,r,"index.js")}return n}function Tk(n){let e=bg();return n.startsWith(Fe(e,"src")+kk)?Fe(e,"src","level6","client","vdom"):Fe(e,"dist","level6","client","vdom")}function fg(n){if(n.startsWith(".")||n.startsWith("/"))return ci(n);if(n==="weifuwu"||n.startsWith("weifuwu/"))return _g(n);try{return hg(import.meta.resolve(n))}catch{return ci(n)}}function di(n={}){let e=n.cache!==!1,t=new Map,r=new Map,s={builds:0,hits:0,dedups:0};async function o(u){for(let[c,d]of Object.entries(u))try{let p=await Bu(c);if(p.mtimeMs!==d.mtimeMs||p.size!==d.size)return!1}catch{return!1}return!0}async function i(u,c,d){let p=`${u}:${c}`;if(e){let w=t.get(p);if(w&&await o(w.inputs))return s.hits++,w;let m=r.get(p);if(m)return s.dedups++,m}s.builds++;let f=(async()=>{let{code:w,inputs:m}=await d(),g=`"${_k("sha1").update(w).digest("hex").slice(0,20)}"`,h={code:w,etag:g,inputs:m};if(e){if(t.size>=Rk){let b=t.keys().next().value;b!==void 0&&t.delete(b)}t.set(p,h)}return h})();return e&&(r.set(p,f),f.catch(()=>{}).finally(()=>r.delete(p))),f}function a(u,c,d,p){let f={"Content-Type":p,ETag:d,"Cache-Control":"no-cache"};return u.headers.get("if-none-match")===d?new Response(null,{status:304,headers:f}):new Response(c,{headers:f})}let l=(async(u,c,d)=>{function p(f,...w){let m="";for(let g=0;g<f.length;g++)m+=f[g],g<w.length&&(m+=wg(w[g]));return new Response(m,{headers:{"Content-Type":"text/html; charset=utf-8"}})}return c.ui={html:Object.assign(p,{unsafe:xk}),async ssr(f,w){return Du(Ge(f,w??{}))},ssrData(f){let w=JSON.stringify(Object.fromEntries(f)).replace(/</g,"<");return new ar(`<script>window.__DATA__=${w};</script>`)},async js(f){let w=fg(f),{code:m,etag:g}=await i("js",w,async()=>{let h=await bk({entryPoints:[w],bundle:!0,format:"esm",platform:"browser",jsx:"automatic",jsxImportSource:Tk(w),write:!1,metafile:!0,logLevel:"silent",plugins:[{name:"weifuwu-dist-fallback",setup(k){k.onResolve({filter:/^weifuwu(\/|$)/},_=>{let v=_.resolveDir;for(;;){if(Hu(Fe(v,"tsconfig.json")))return;let S=Os(v);if(S===v)break;v=S}return{path:_g(_.path)}})}}]}),b={};for(let k of Object.keys(h.metafile?.inputs??{})){let _=ci(k);try{let v=await Bu(_);b[_]={mtimeMs:v.mtimeMs,size:v.size}}catch{b[_]={mtimeMs:-1,size:-1}}}return{code:h.outputFiles[0].text,inputs:b}});return a(u,m,g,"application/javascript")},async css(f){let w=fg(f),{code:m,etag:g}=await i("css",w,async()=>{let h=Os(w);if(vk(w)==="weifuwu-layout.css"&&await Em(h)){let _=await Tm(h);return{code:_.css,inputs:await mg(_.inputs)}}let b=await gg(w,"utf-8"),k=await mg([w,...await yg(w)]);return{code:b,inputs:k}});return a(u,m,g,"text/css; charset=utf-8")}},d(u,c)});return l.__stats=s,l}var Rk,Ek,vg=I(()=>{"use strict";Cm();Am();Sr();pg();Rk=32;Ek={weifuwu:"level6/index.js","weifuwu/client/vdom":"level6/client/vdom/index.js","weifuwu/client/vdom/jsx-runtime":"level6/client/vdom/jsx-runtime.js","weifuwu/client/vdom/testing":"level6/client/vdom/testing.js","weifuwu/client/components":"level6/client/components/index.js","weifuwu/client/layout":"level6/client/layout/index.js","weifuwu/dev":"level6/dev/index.js","weifuwu/shared/router":"level0/router/index.js"}});import{buildSchema as Ck}from"graphql";function kg(n){let e=typeof n.typeDefs=="string"?Ck(n.typeDefs):n.typeDefs,t=n.resolvers??{};for(let[r,s]of Object.entries(t)){let o=e.getType(r);if(!o||typeof o!="object"||!("getFields"in o))continue;let i=o.getFields();for(let[a,l]of Object.entries(s)){let u=i[a];u&&typeof l=="function"&&(u.resolve=l)}}return e}var Sg=I(()=>{"use strict"});import{buildSchema as Ak,graphql as Ok,validate as Ik,parse as Pk}from"graphql";function Nk(n){let e=n.searchParams.get("query");if(!e)return null;let t={},r=n.searchParams.get("variables");if(r)try{t=JSON.parse(r)}catch{return{error:"Invalid variables JSON"}}return{query:e,variables:t,operationName:n.searchParams.get("operationName")||void 0}}async function Mk(n){try{let e=await n.json();return e.query?{query:e.query,variables:e.variables||{},operationName:e.operationName}:null}catch{return null}}function $k(n){let e=new Set;for(let t of Object.values(n))for(let r of Object.values(t))typeof r=="function"&&e.add(r);return e}function qk(n,e){if(n.size!==e.size)return!1;for(let t of n)if(!e.has(t))return!1;return!0}function Eg(n,e){if(n.size>=e){let t=n.keys().next().value;t!==void 0&&n.delete(t)}}function Dk(n){if(typeof n.schema!="string")return n.schema;let e=n.resolvers;if(!e||typeof e!="object"){let i=Fu.get(n.schema);if(i)return i;let a=Ak(n.schema);return Eg(Fu,xg),Fu.set(n.schema,a),a}let t=Rg.get(e);t||(t=new Map,Rg.set(e,t));let r=$k(e),s=t.get(n.schema);if(s&&qk(s.sig,r))return s.schema;let o=kg({typeDefs:n.schema,resolvers:e});return Eg(t,xg),t.set(n.schema,{sig:r,schema:o}),o}function jk(n){let e=new Map;for(let s of n.definitions)s.kind==="FragmentDefinition"&&e.set(s.name.value,s);let t=0;function r(s,o,i){if(o>t&&(t=o),s.kind==="SelectionSet"){for(let a of s.selections)r(a,o,i);return}if(s.kind==="FragmentSpread"){let a=s.name.value;if(i.has(a))return;let l=e.get(a);if(!l)return;let u=new Set(i);u.add(a),r(l.selectionSet,o,u);return}s.selectionSet&&r(s.selectionSet,o+1,i)}for(let s of n.definitions)s.kind==="OperationDefinition"&&r(s,0,new Set);return t}function Lk(n){let e=n instanceof Error?n.message:String(n),t=n instanceof pi?n.status:500;return Response.json({errors:[{message:e}]},{status:t})}async function Tg(n,e,t,r,s){let o=t.maxDepth??10;if(o>0)try{let l=Pk(e.query),u=jk(l);if(u>o)return Response.json({errors:[{message:`Query depth ${u} exceeds limit ${o}`}]},{status:400});let c=Ik(n,l);if(c.length>0)return Response.json({errors:c.map(d=>({message:d.message}))},{status:400})}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:`Parse error: ${u}`}]},{status:400})}let i=t.timeout??3e4,a;try{a=t.context?await t.context(r,s):s}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:u}]},{status:500})}try{let l=Ok({schema:n,source:e.query,rootValue:t.rootValue,contextValue:a,variableValues:e.variables,operationName:e.operationName}),u;if(i>0){let d=null,p=new Promise((f,w)=>{d=setTimeout(()=>w(new Error("Query timeout")),i)});u=await Promise.race([l,p]),d&&clearTimeout(d)}else u=await l;let c=(u.errors??[]).some(d=>!d.path);return Response.json(u,{status:c?400:200})}catch(l){let u=l instanceof Error?l.message:String(l);return Response.json({errors:[{message:u}]},{status:500})}}function Wk(n){return`<!doctype html>
118
118
  <html lang="en">
119
119
  <head>
120
120
  <meta charset="UTF-8" />
@@ -159,47 +159,47 @@ ${s.join(`
159
159
  <body>
160
160
  <div id="graphiql">Loading\u2026</div>
161
161
  </body>
162
- </html>`}function Bk(n){let e=new lt;async function t(s,i){let o=await n(s,i),a;try{a=jk(o)}catch(l){throw new ci(500,`schema \u6784\u5EFA\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`)}return{options:o,schema:a}}async function r(s,i,o){let a;try{a=await t(s,i)}catch(l){return Wk(l)}return o(a)}return e.get("/",async(s,i)=>r(s,i,async({options:o,schema:a})=>{let l=new URL(s.url);if(o.graphiql&&!l.searchParams.has("query"))return new Response(Uk(l.pathname),{status:200,headers:{"Content-Type":"text/html"}});let u=Mk(l);return u===null?Response.json({errors:[{message:"Missing query"}]},{status:400}):"error"in u?Response.json({errors:[{message:u.error}]},{status:400}):Rg(a,u,o,s,i)})),e.post("/",async(s,i)=>r(s,i,async({options:o,schema:a})=>{if(!(s.headers.get("content-type")??"").toLowerCase().includes("application/json"))return Response.json({errors:[{message:"Unsupported Media Type: expected application/json"}]},{status:415});let u=await $k(s);return u?Rg(a,u,o,s,i):Response.json({errors:[{message:"Missing query"}]},{status:400})})),e}function di(n,e){let t=typeof n=="string"?n:"/graphql",r=typeof n=="string"?e:n;if(!r)throw new Error("graphql(): \u7F3A\u5C11 handler");let s=new lt;s.mount(t,Bk(r));let i=s.handler(),o=t.length>1&&t.endsWith("/")?t.slice(0,-1):t;return(a,l,u)=>{let c;try{c=new URL(a.url).pathname}catch{c=a.url.split("?")[0]}return(o==="/"?c==="/":c===o||c.startsWith(o+"/"))?i(a,l):u(a,l)}}var kg,Sg,Uu,ci,Eg=N(()=>{"use strict";vg();Sa();kg=64,Sg=new WeakMap,Uu=new Map;ci=class extends Error{status;constructor(e,t){super(t),this.name="GraphHttpError",this.status=e}}});function At(n,e){let t=new Uint8Array(5+e.length);t[0]=n.charCodeAt(0);let r=4+e.length;return t[1]=r>>24&255,t[2]=r>>16&255,t[3]=r>>8&255,t[4]=r&255,t.set(e,5),t}function Tg(n){let e=[];e.push(0,3,0,0);for(let[s,i]of Object.entries(n)){for(let o of ft(s))e.push(o);e.push(0);for(let o of ft(i))e.push(o);e.push(0)}e.push(0);let t=new Uint8Array(4+e.length),r=4+e.length;return t[0]=r>>24&255,t[1]=r>>16&255,t[2]=r>>8&255,t[3]=r&255,t.set(e,4),t}function fi(n){return At("Q",mi(ft(n),new Uint8Array([0])))}function Cg(n,e,t=[]){let r=mi(ft(n),new Uint8Array([0]),ft(e),new Uint8Array([0])),s=new Uint8Array(2+t.length*4);return s[0]=t.length>>8&255,s[1]=t.length&255,t.forEach((i,o)=>{let a=2+o*4;s[a]=i>>24&255,s[a+1]=i>>16&255,s[a+2]=i>>8&255,s[a+3]=i&255}),At("P",mi(r,s))}function Bu(n,e,t=[]){let r=ft(n),s=new Array(e.length),i=1+r.length+1;i+=2+t.length*2,i+=2;for(let l=0;l<e.length;l++){let u=e[l];if(i+=4,u!==null){let c=typeof u=="string"?Hk(u):u.length;s[l]=c,i+=c}}i+=2;let o=new Uint8Array(i),a=0;o[a++]=0,o.set(r,a),a+=r.length,o[a++]=0,o[a]=t.length>>8&255,o[a+1]=t.length&255,a+=2;for(let l of t)o[a]=l>>8&255,o[a+1]=l&255,a+=2;o[a]=e.length>>8&255,o[a+1]=e.length&255,a+=2;for(let l=0;l<e.length;l++){let u=e[l];if(u===null)o[a]=o[a+1]=o[a+2]=o[a+3]=255,a+=4;else{let c=s[l];o[a]=c>>24&255,o[a+1]=c>>16&255,o[a+2]=c>>8&255,o[a+3]=c&255,a+=4,typeof u=="string"?o.set(ft(u),a):o.set(u,a),a+=c}}return o[a]=0,o[a+1]=0,At("B",o)}function Hk(n){return Buffer.byteLength(n)}function Hu(n="",e=0){let t=new Uint8Array(n.length+1+4);t.set(ft(n),0),t[n.length]=0;let r=n.length+1;return t[r]=e>>24&255,t[r+1]=e>>16&255,t[r+2]=e>>8&255,t[r+3]=e&255,At("E",t)}function Cs(){return At("S",new Uint8Array(0))}function Ag(){return At("H",new Uint8Array(0))}function Og(n,e=""){return At("D",mi(ft(n),ft(e),new Uint8Array([0])))}function Ig(){return At("X",new Uint8Array(0))}function Fu(n){return At("p",ft(n))}function Pg(n){return n.type!=="R"||n.payload.length<4?-1:n.payload[0]<<24|n.payload[1]<<16|n.payload[2]<<8|n.payload[3]}function Ng(n){let e=n[0]<<8|n[1],t=[],r=2;for(let s=0;s<e;s++){let i=r;for(;n[i]!==0;)i++;let o=zu.decode(n.subarray(r,i));r=i+1,r+=6;let a=n[r]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];r+=4;let l=n[r]<<8|n[r+1];r+=2,r+=6,t.push({name:o,typeOid:a,typeLen:l})}return t}function Mg(n){let e=n[0]<<8|n[1],t=[],r=2;for(let s=0;s<e;s++){let i=n[r]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];r+=4,i===-1?t.push(null):(t.push(zu.decode(n.subarray(r,r+i))),r+=i)}return t}function Vu(n){let e={},t=0;for(;t<n.length&&n[t]!==0;){let r=String.fromCharCode(n[t]),s=t+1;for(;s<n.length&&n[s]!==0;)s++;let i=zu.decode(n.subarray(t+1,s));switch(r){case"S":e.severity=i;break;case"C":e.code=i;break;case"M":e.message=i;break;case"D":e.detail=i;break;case"H":e.hint=i;break;case"P":e.position=i;break}t=s+1}return e}function ft(n){return Fk.encode(n)}function mi(...n){let e=0;for(let s of n)e+=s.length;let t=new Uint8Array(e),r=0;for(let s of n)t.set(s,r),r+=s.length;return t}var pi,zu,Fk,$g=N(()=>{"use strict";ye();pi=class n{buf=new Uint8Array(0);off=0;static MAX_BUFFER=1<<20;push(e){this.append(e);let t=[];for(;;){let r=this.off,s=this.tryRead();if(!s){this.off=r;break}t.push(s)}return t.length>0&&this.compact(),t}append(e){if(e.length===0)return;let t=this.buf.length-this.off;if(t===0){this.buf=e,this.off=0;return}let r=t+e.length;if(r>n.MAX_BUFFER)throw new ue(`postgres: \u4E0D\u5B8C\u6574\u6D88\u606F\u8D85\u8FC7\u7F13\u51B2\u4E0A\u9650\uFF08${n.MAX_BUFFER} \u5B57\u8282\uFF09\u2014\u2014DoS \u9632\u5FA1`);if(this.buf.length>=r){this.buf.set(e,t),this.off=0;return}let s=new Uint8Array(Math.max(r,this.buf.length*2));s.set(this.buf.subarray(this.off),0),s.set(e,t),this.buf=s,this.off=0}compact(){this.off===this.buf.length?(this.buf=new Uint8Array(0),this.off=0):this.off>0&&(this.buf=this.buf.subarray(this.off),this.off=0)}tryRead(){if(this.buf.length-this.off<5)return null;let e=(this.buf[this.off+1]<<24|this.buf[this.off+2]<<16|this.buf[this.off+3]<<8|this.buf[this.off+4])>>>0;if(e===0||e>n.MAX_BUFFER||this.buf.length-this.off<1+e)return null;let t=String.fromCharCode(this.buf[this.off]),r=this.buf.subarray(this.off+5,this.off+1+e);return this.off+=1+e,{type:t,payload:r}}};zu=new TextDecoder,Fk=new TextEncoder});import Vk from"node:net";import $n from"node:crypto";function zk(n){return n.includes("cached plan must not change result type")||n.includes("cache lookup failed for type")}function Ku(n){return new TextEncoder().encode(n)}function qg(n){let e=new Uint8Array(5+n.length);e[0]=112;let t=4+n.length;return e[1]=t>>24&255,e[2]=t>>16&255,e[3]=t>>8&255,e[4]=t&255,e.set(n,5),e}function gi(n,e){return $n.createHmac("sha256",n).update(e).digest()}function Kk(n,e){let t=new Uint8Array(n.length);for(let r=0;r<n.length;r++)t[r]=n[r]^e[r];return t}function Gk(n){return n.map(e=>e==null?null:typeof e=="object"?Array.isArray(e.__pgArray)?Qk(e.__pgArray):JSON.stringify(e):String(e))}function Qk(n){return`{${n.map(t=>{if(t==null)return"NULL";let r=typeof t=="object"?JSON.stringify(t):String(t);return/^[A-Za-z0-9_+.-]*$/.test(r)?r:'"'+r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}).join(",")}}`}function Jk(n,e){if(e===null)return null;switch(n){case 114:case 3802:return JSON.parse(e);case 20:{let t=BigInt(e);return t>BigInt(Number.MAX_SAFE_INTEGER)||t<BigInt(-Number.MAX_SAFE_INTEGER)?e:Number(t)}case 21:case 23:case 26:return Number(e);case 700:case 701:case 1700:return parseFloat(e);case 16:return e==="t";case 1184:return new Date(e);default:return e}}var xr,Dg=N(()=>{"use strict";$g();ye();xr=class n{opts;timeoutSet=!1;awaitingReady=!1;pendingErrorZ=!1;socket=null;stream=new pi;status="idle";waiters=[];constructor(e={}){this.opts={host:e.host??"127.0.0.1",port:e.port??5432,user:e.user??"postgres",database:e.database??"postgres",connectTimeoutMs:e.connectTimeoutMs??1e4,statementTimeoutMs:e.statementTimeoutMs??0,password:e.password}}get connected(){return this.status==="ready"}lastUsed=0;connect(){return new Promise((e,t)=>{this.status="connecting";let r=Vk.connect(this.opts.port,this.opts.host);this.socket=r;let s=setTimeout(()=>{r.destroy(),t(new ce(`postgres: connect timeout after ${this.opts.connectTimeoutMs}ms`))},this.opts.connectTimeoutMs);r.once("connect",()=>{r.setNoDelay(!0),r.write(Tg({user:this.opts.user,database:this.opts.database}))}),r.on("data",i=>this.onData(i)),r.on("error",i=>{clearTimeout(s),this.status==="connecting"&&t(new ce(`postgres: ${i.message}`))}),r.on("close",()=>{if(clearTimeout(s),this.socket=null,this.status!=="closed"){this.status="closed";let i=this.currentQuery;this.currentQuery=null,i&&i.reject(new ce("postgres: connection closed"))}}),this.onReady=()=>{clearTimeout(s),this.status="ready",e()},this.onAuthFail=i=>{clearTimeout(s),t(i)}})}onReady=null;onAuthFail=null;expectingAuth=!0;authCtx=null;prepared=new Map;static PREPARED_MAX=128;stmtSeq=0;deallocQueue=[];awaitingDeallocZ=!1;currentQuery=null;pendingRetry=null;onData(e){let t=this.stream.push(new Uint8Array(e));for(let r of t)this.handle(r)}handle(e){if(this.expectingAuth){if(e.type==="R"){let t=Pg(e);if(t!==0){if(t===3)this.send(Fu(this.opts.password??""));else if(t===5){let r=e.payload.subarray(8,12),s=$n.createHash("md5").update(this.opts.password+this.opts.user).digest("hex"),i=$n.createHash("md5").update(s+Buffer.from(r).toString("latin1")).digest("hex");this.send(Fu(`md5${i}`))}else if(t===10){let r=$n.randomBytes(18).toString("base64url"),s=`n=,r=${r}`;this.authCtx={clientNonce:r,clientFirstBare:s,serverFirst:""};let i=Ku("SCRAM-SHA-256\0"),o=Ku(`n,,${s}`),a=new Uint8Array(i.length+4+o.length);a.set(i,0),a[i.length]=o.length>>24&255,a[i.length+1]=o.length>>16&255,a[i.length+2]=o.length>>8&255,a[i.length+3]=o.length&255,a.set(o,i.length+4),this.send(qg(a))}else if(t===11){let r=new TextDecoder().decode(e.payload.subarray(4));if(!this.authCtx){this.onAuthFail?.(new ce("postgres: unexpected SASL continue"));return}this.authCtx.serverFirst=r;let s=this.scramFinal(this.authCtx);this.send(qg(Ku(s)))}else if(t===12){let s=new TextDecoder().decode(e.payload.subarray(4)).match(/v=([A-Za-z0-9+/=]+)/);if(s&&this.authCtx){let i=this.scramServerSignature(this.authCtx);if(s[1]!==i){this.onAuthFail?.(new ce("postgres: SCRAM server signature mismatch"));return}}}}return}if(e.type==="E"){let t=Vu(e.payload);this.expectingAuth=!1,this.onAuthFail?.(new ce(`postgres: auth failed: ${t.message??"unknown"}`)),this.socket?.destroy();return}if(e.type==="Z"){if(this.expectingAuth=!1,this.opts.statementTimeoutMs>0&&!this.timeoutSet){this.timeoutSet=!0,this.awaitingReady=!0,this.socket?.write(fi(`SET statement_timeout = ${this.opts.statementTimeoutMs}`));return}this.onReady?.();return}return}switch(e.type){case"T":{if(this.currentQuery){this.currentQuery.columns=Ng(e.payload);let t=`${this.currentQuery.sql}|${this.currentQuery.params?.length??0}`,r=this.getPrepared(t);r&&(r.columns=this.currentQuery.columns)}break}case"D":{let t=Mg(e.payload);if(this.currentQuery&&this.currentQuery.columns){let r={};this.currentQuery.columns.forEach((s,i)=>{r[s.name]=Jk(s.typeOid,t[i]??null)}),this.currentQuery.rows.push(r)}break}case"C":{let t=this.currentQuery;if(t){let s=new TextDecoder().decode(e.payload).replace(/\0+$/,"").match(/^(?:INSERT|UPDATE|DELETE|MERGE)\s+(?:\d+\s+)?(\d+)$/);s&&(t.affectedRows=parseInt(s[1],10))}break}case"t":{this.currentQuery?.awaitingDescribe&&this.currentQuery.sql!==void 0&&(this.currentQuery.awaitingDescribe=!1,this.currentQuery.prepKey&&this.currentQuery.prepName&&this.setPrepared(this.currentQuery.prepKey,{name:this.currentQuery.prepName,columns:this.currentQuery.columns}),this.send(Bu(this.currentQuery.prepName??"",this.currentQuery.params??[])),this.send(Hu()),this.send(Cs()));break}case"Z":{if(this.pendingErrorZ){if(this.pendingErrorZ=!1,this.pendingRetry){let r=this.pendingRetry;this.pendingRetry=null,this.issueExtendedQuery(r.sql,r.params??[],r.resolve,r.reject,r.retried)}break}if(this.awaitingDeallocZ){this.awaitingDeallocZ=!1;break}let t=this.currentQuery;if(this.currentQuery=null,t){let r=t.rows;t.affectedRows!==void 0&&Object.defineProperty(r,"affectedRows",{value:t.affectedRows,enumerable:!1,writable:!0,configurable:!0}),t.resolve(r)}this.flushDealloc(),this.awaitingReady&&(this.awaitingReady=!1,this.onReady?.()),this.notifyIdle();break}case"E":{let t=Vu(e.payload),r=this.currentQuery;if(this.currentQuery=null,r){this.pendingErrorZ=!0;let s=new Error(t.message??"postgres query error");if(s.code=t.code,r.prepKey&&zk(t.message??"")&&(this.prepared.clear(),!r.retried)){this.pendingRetry={sql:r.sql??"",params:r.params,columns:r.columns,resolve:r.resolve,reject:r.reject,retried:!0},r.awaitingDescribe&&this.send(Cs());break}r.awaitingDescribe&&this.send(Cs()),r.reject(s)}break}case"N":break;default:break}}scramFinal(e){let t=new Map(e.serverFirst.split(",").map(f=>{let g=f.indexOf("=");return[f.slice(0,g),f.slice(g+1)]})),r=Buffer.from(t.get("s")??"","base64"),s=parseInt(t.get("i")??"4096",10),i=t.get("r")??"",o=this.opts.password??"",a=$n.pbkdf2Sync(o,r,s,32,"sha256"),l=gi(a,"Client Key"),u=$n.createHash("sha256").update(l).digest(),d=`c=biws,r=${i}`,p=`${e.clientFirstBare},${e.serverFirst},${d}`,m=gi(u,p),h=Kk(l,m);return`${d},p=${Buffer.from(h).toString("base64")}`}scramServerSignature(e){let t=new Map(e.serverFirst.split(",").map(c=>{let d=c.indexOf("=");return[c.slice(0,d),c.slice(d+1)]})),r=Buffer.from(t.get("s")??"","base64"),s=parseInt(t.get("i")??"4096",10),i=t.get("r")??"",o=$n.pbkdf2Sync(this.opts.password??"",r,s,32,"sha256"),a=gi(o,"Server Key"),l=`c=biws,r=${i}`,u=`${e.clientFirstBare},${e.serverFirst},${l}`;return Buffer.from(gi(a,u)).toString("base64")}getPrepared(e){let t=this.prepared.get(e);return t&&(this.prepared.delete(e),this.prepared.set(e,t)),t}setPrepared(e,t){if(this.prepared.delete(e),this.prepared.set(e,t),this.prepared.size>n.PREPARED_MAX){let r=this.prepared.keys().next().value;if(r!==void 0){let s=this.prepared.get(r);this.prepared.delete(r),s&&this.deallocQueue.push(s.name)}}}flushDealloc(){if(this.deallocQueue.length===0||!this.socket)return;let e=this.deallocQueue.splice(0);this.awaitingDeallocZ=!0,this.socket.write(fi(e.map(t=>`DEALLOCATE "${t}"`).join("; ")))}async transaction(e){await this.query("BEGIN");try{let t=await e({query:(r,s)=>this.query(r,s)});return await this.query("COMMIT"),t}catch(t){throw await this.query("ROLLBACK").catch(()=>{}),t}}query(e,t){return new Promise((r,s)=>{if(this.status!=="ready"||!this.socket){s(new ce("postgres: not connected"));return}if(this.currentQuery){s(new ce("postgres: query already in progress"));return}if(!t||t.length===0)this.currentQuery={columns:[],rows:[],resolve:r,reject:s},process.env.PGDBG2&&console.error("[cquery]",JSON.stringify(e.slice(0,120))),this.socket.write(fi(e));else{let i=`${e}|${t.length}`,o=this.getPrepared(i),a=Gk(t);o?(this.currentQuery={columns:[...o.columns],rows:[],resolve:r,reject:s,sql:e,params:a,awaitingDescribe:!1,prepKey:i,prepName:o.name},this.socket.write(Bu(o.name,a)),this.socket.write(Hu()),this.socket.write(Cs())):this.issueExtendedQuery(e,a,r,s)}})}issueExtendedQuery(e,t,r,s,i){let o=`wf_s${++this.stmtSeq}`;this.currentQuery={columns:[],rows:[],resolve:r,reject:s,sql:e,params:t,awaitingDescribe:!0,prepKey:`${e}|${t.length}`,prepName:o,retried:i},this.socket?.write(Cg(o,e,t.map(()=>0))),this.socket?.write(Og("S",o)),this.socket?.write(Ag())}send(e){this.socket?.write(e)}notifyIdle(){let e=this.waiters;this.waiters=[];for(let t of e)t()}waitIdle(){return this.currentQuery?new Promise(e=>this.waiters.push(e)):Promise.resolve()}async close(){let e=this.socket;this.status==="ready"&&e&&e.write(Ig()),this.status="closed",e&&e.destroy()}}});function Zk(n,e,t){if(e==null){if(n.required)throw new se(`schema: '${t}' is required`);return}switch(n.type){case"text":if(typeof e!="string")throw new se(`schema: '${t}' must be a string, got ${typeof e}`);break;case"int":if(typeof e!="number"||!Number.isInteger(e))throw new se(`schema: '${t}' must be an integer, got ${typeof e}`);break;case"jsonb":if(typeof e!="object"||e===null||Array.isArray(e))throw new se(`schema: '${t}' must be a JSON object`);break;case"enum":if(!n.values?.includes(e))throw new se(`schema: '${t}' must be one of [${n.values?.join(", ")}], got ${String(e)}`);break}}function As(n,e){for(let[t,r]of Object.entries(n))if(r.required&&(e[t]===void 0||e[t]===null))throw new se(`schema: '${t}' is required`);for(let[t,r]of Object.entries(e)){let s=n[t];s&&Zk(s,r,t)}}var jg=N(()=>{"use strict";ye()});function Gu(n,e){let t=n[0],r=[];for(let s=0;s<e.length;s++){let i=e[s]?.__fragment;if(i){let o=i.sql.replace(/\$(\d+)/g,(a,l)=>(r.push(i.params[parseInt(l,10)-1]),`$${r.length}`));t+=o+n[s+1]}else r.push(e[s]),t+=`$${r.length}`+n[s+1]}return{sql:t,params:r}}var hi,Lg=N(()=>{"use strict";Dg();ye();jg();hi=class n{all=[];available=[];waiters=[];closed=!1;opts;initPromise=null;schemas=new Map;idleTimer=null;constructor(e={}){this.opts=e}static async create(e={}){let t=new n(e);return await t.ensure(),t}readyPromise=null;ensure(){return this.readyPromise?this.readyPromise:(this.initPromise||(this.initPromise=this.init()),this.initPromise)}async init(){let e=this.opts.poolSize??5,t=await Promise.all(Array.from({length:e},async()=>{let s=new xr(this.opts);return await s.connect(),s})),r=Date.now();for(let s of t)s.lastUsed=r;this.all=t,this.available=[...t],this.readyPromise=Promise.resolve(),this.startIdleReaper()}startIdleReaper(){let e=this.opts.idleTimeoutMs??0;e<=0||this.idleTimer||(this.idleTimer=setInterval(()=>this.reapIdle(),e),this.idleTimer.unref?.())}reapIdle(){if(this.closed)return;let e=Date.now(),t=this.opts.idleTimeoutMs??0;for(let r=this.available.length-1;r>=0;r--){let s=this.available[r];if(s.lastUsed>0&&e-s.lastUsed>=t){this.available.splice(r,1);let i=this.all.indexOf(s);i>=0&&this.all.splice(i,1),s.close()}}}get open(){return this.all.length}acquire(){if(this.closed)return Promise.reject(new ce("postgres: pool is closed"));if(this.available.length>0)return Promise.resolve(this.available.pop());let e=this.opts.poolSize??5;if(this.all.length<e){let r=new xr(this.opts);return r.connect().then(()=>(this.all.push(r),r),()=>{throw setTimeout(()=>this.replenish(),500),new ce("postgres: failed to establish connection")})}let t=this.opts.acquireTimeoutMs??3e4;return new Promise((r,s)=>{let i={resolve:r,reject:s};t>0&&(i.timer=setTimeout(()=>{let o=this.waiters.indexOf(i);o>=0&&this.waiters.splice(o,1),s(new mn("postgres: pool acquire",t))},t)),this.waiters.push(i)})}release(e){if(this.closed){e.close();return}if(!e.connected){e.close(),this.replenish();return}e.lastUsed=Date.now(),this.dispatchAvailable(e)}dispatchAvailable(e){let t=this.waiters.shift();t?(t.timer&&clearTimeout(t.timer),t.resolve(e)):this.available.push(e)}replenish(){if(this.closed)return;let e=new xr(this.opts);e.connect().then(()=>{if(this.closed){e.close();return}this.all.push(e),this.dispatchAvailable(e)}).catch(()=>{setTimeout(()=>this.replenish(),500)})}async query(e,t){await this.ensure();let r=await this.acquire(),s=performance.now();try{let i=await r.query(e,t);return this.opts.onQuery?.(e,performance.now()-s,i.length),i}finally{this.release(r)}}register(e,t){this.schemas.set(e,t)}async insertMany(e,t,r={}){let s=[];if(t.length===0)return Object.defineProperty(s,"affectedRows",{value:0,enumerable:!1,writable:!0}),s;let i=this.schemas.get(e),o=Object.keys(t[0]).sort(),a=Math.max(1,r.batchSize??500),l=0,u=s;for(let c=0;c<t.length;c+=a){let d=t.slice(c,c+a);for(let g=0;g<d.length;g++){let w=d[g],y=Object.keys(w).sort();if(y.length!==o.length||y.some((k,_)=>k!==o[_]))throw new se(`schema: insertMany requires identical keys across rows (row ${c+g} has [${y}], expected [${o}])`);i&&As(i,w)}let p=d.map((g,w)=>`(${o.map((y,k)=>`$${w*o.length+k+1}`).join(", ")})`).join(", "),m=`INSERT INTO ${e} (${o.join(", ")}) VALUES ${p}`,h=d.flatMap(g=>o.map(w=>g[w])),f=await this.query(m,h);l+=f.affectedRows??d.length,f.length>0&&(u=f)}return Object.defineProperty(u,"affectedRows",{value:l,enumerable:!1,writable:!0}),u}async update(e,t,r,s={}){let i=this.schemas.get(e);i&&As(i,{...t,...r});let o=Object.keys(t);if(o.length===0)throw new se("schema: update requires at least one SET column");let a=Object.keys(r);if(a.length===0)throw new se("schema: update requires a WHERE clause (full-table update via unsafe)");let l=o.map((m,h)=>`${m} = $${h+1}`).join(", "),u=a.map((m,h)=>`${m} = $${o.length+h+1}`).join(" AND "),c=s.returning?.length?` RETURNING ${s.returning.join(", ")}`:"",d=`UPDATE ${e} SET ${l} WHERE ${u}${c}`,p=[...o.map(m=>t[m]),...a.map(m=>r[m])];return this.query(d,p)}async delete(e,t){let r=this.schemas.get(e);r&&As(r,t);let s=Object.keys(t);if(s.length===0)throw new se("schema: delete requires a WHERE clause");let i=`DELETE FROM ${e} WHERE ${s.map((o,a)=>`${o} = $${a+1}`).join(" AND ")}`;return this.query(i,s.map(o=>t[o]))}async insert(e,t){let r=this.schemas.get(e);if(!r)throw new se(`schema: table '${e}' not registered\u2014call register() first`);As(r,t);let s=Object.keys(t);if(s.length===0)throw new se("schema: insert requires at least one column");let i=s.map((a,l)=>`$${l+1}`).join(", "),o=`INSERT INTO ${e} (${s.join(", ")}) VALUES (${i})`;return this.query(o,s.map(a=>t[a]))}tag(e,...t){let{sql:r,params:s}=Gu(e,t);return this.query(r,s)}async begin(e){return await this.ensure(),this.transaction(async t=>e((s,...i)=>{let{sql:o,params:a}=Gu(s,i);return t.query(o,a)}))}frag(e,...t){let{sql:r,params:s}=Gu(e,t);return{__fragment:{sql:r,params:s}}}async unsafe(e,t){await this.ensure();let r=await this.acquire();try{return await r.query(e,t)}finally{this.release(r)}}async transaction(e){await this.ensure();let t=await this.acquire();try{await t.query("BEGIN");try{let r=await e({query:(s,i)=>t.query(s,i)});return await t.query("COMMIT"),r}catch(r){throw await t.query("ROLLBACK").catch(()=>{}),r}}finally{this.release(t)}}async close(){this.closed=!0,this.idleTimer&&(clearInterval(this.idleTimer),this.idleTimer=null),this.readyPromise=null,this.available=[],await Promise.all(this.all.map(t=>t.close())),this.all=[];let e=this.waiters;this.waiters=[];for(let t of e)t.timer&&clearTimeout(t.timer),t.reject(new ce("postgres: pool is closed"))}get size(){return this.available.length+this.waiters.length}}});import{randomUUID as Xk}from"node:crypto";function Wg(n){if(Array.isArray(n))return n;if(typeof n=="string")try{let e=JSON.parse(n);if(Array.isArray(e))return e}catch{}return n==null?[]:[n]}function Ug(n){if(Array.isArray(n))return n;if(typeof n=="string")try{let e=JSON.parse(n);if(Array.isArray(e))return e}catch{}return n==null?[]:[]}function Bg(n,e){let t=0,r=0,s=0,i=Math.min(n.length,e.length);for(let o=0;o<i;o++)t+=n[o]*e[o],r+=n[o]*n[o],s+=e[o]*e[o];return r&&s?t/(Math.sqrt(r)*Math.sqrt(s)):0}function Qu(n,e,t,r){if(typeof t!="object"||t===null)return t;let s=t;if("__jsonbAppend"in s)return[...Wg(e),...Wg(s.__jsonbAppend)];if("__inc"in s)return Number(e??0)+Number(s.__inc);if("__now"in s)return new Date().toISOString();if("__interval"in s){let[i,o]=s.__interval;return new Date(Date.now()+i*Vg(o)).toISOString()}return"__colRef"in s?r[String(s.__colRef)]:"__monthStart"in s?zg(t):t}function Yk(n){return typeof n=="object"&&n!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(e=>e in n)}function Vg(n){switch(n){case"day":return 864e5;case"hour":return 36e5;case"minute":return 6e4;default:return 1e3}}function zg(n){if(typeof n=="object"&&n!==null){if("__interval"in n){let[e,t]=n.__interval;return new Date(Date.now()+e*Vg(t)).toISOString()}if("__monthStart"in n){let e=new Date;return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),1)).toISOString()}}return n}function Rr(n,e){let t=n;return Object.defineProperty(t,"affectedRows",{value:e,enumerable:!1,writable:!0,configurable:!0}),t}function wi(n,e){let t={};for(let r of e)r in n&&(t[r]=n[r]);return t}function eS(n,e,t,r,s){for(let i of e){if(i==="*"||i===""||/^\d+$/.test(i)||!/^[\w.]+$/.test(i)||s?.has(i)||s?.has(i.slice(i.lastIndexOf(".")+1)))continue;let o=i.includes(".")?i.slice(i.lastIndexOf(".")+1):i;if(t.some(l=>l.cols.has(o)))continue;let a=[...new Set(t.flatMap(l=>[...l.cols]))].sort();throw new ue("\u672A\u77E5\u5217",`memory-sql: ${n} \u672A\u77E5\u5217 '${i}'\u2014\u2014${r} \u5408\u6CD5\u5217\uFF1A${a.join(", ")}`)}}function Ju(n){let e=[];for(let[t,r]of Object.entries(n)){if(t==="or"||t==="and"){for(let s of r)e.push(...Ju(s));continue}t!=="__raw"&&(e.push(t),typeof r=="object"&&r!==null&&!Array.isArray(r)&&"col"in r&&e.push(String(r.col)))}return e}function gt(n,e,t){if(n==null)return;if(e in n)return n[e];let r=e.indexOf(".");if(r>=0){let s=e.slice(r+1);return s in n?n[s]:void 0}for(let[s,i]of Object.entries(n))if(s.slice(s.indexOf(".")+1)===e)return i}function Er(n){let e=n.lastIndexOf(".");return e>=0?n.slice(e+1):n}function tS(n){let e={};for(let[t,r]of Object.entries(n))e[Er(t)]=r;return e}function Os(n){return typeof n=="object"&&n!==null&&"__raw"in n}function Zu(n,e="where"){if(n)for(let[t,r]of Object.entries(n)){if(r===void 0)throw new ue(`weifuwu/db: ${e}.${t} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&Zu(r,`${e}.${t}`)}}function Ot(n,e,t){for(let[r,s]of Object.entries(e)){if(r==="or"){if(!s.some(o=>Ot(n,o,t)))return!1;continue}if(r==="and"){if(!s.every(o=>Ot(n,o,t)))return!1;continue}if(typeof s=="object"&&s!==null){let i=s,o=gt(n,r,t);if(!["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"].some(u=>i[u]!==void 0)){if(!yt(o,s))return!1;continue}let l=u=>{if(typeof u=="object"&&u!==null&&("__interval"in u||"__monthStart"in u))return zg(u);if(!Os(u))return u;let c=u.__raw.trim(),d=/^now\(\)\s*-\s*interval\s*'([0-9]+)\s*(days?|hours?|minutes?)'$/i.exec(c);if(/^now\(\)$/i.test(c))return new Date().toISOString();if(d){let m=Number(d[1]),h=d[2].toLowerCase(),f=h.startsWith("day")?m*864e5:h.startsWith("hour")?m*36e5:m*6e4;return new Date(Date.now()-f).toISOString()}let p=/^date_trunc\('(month|day|week|hour|minute)',\s*now\(\)\)$/i.exec(c);if(p){let m=new Date,h=p[1].toLowerCase();return h==="month"?new Date(Date.UTC(m.getUTCFullYear(),m.getUTCMonth(),1)).toISOString():h==="day"?new Date(Date.UTC(m.getUTCFullYear(),m.getUTCMonth(),m.getUTCDate())).toISOString():h==="hour"?new Date(m.setUTCMinutes(0,0,0)).toISOString():h==="minute"?new Date(m.setUTCSeconds(0,0)).toISOString():new Date(m).toISOString()}throw new ue("WHERE \u503C\u8868\u8FBE\u5F0F",`memory-sql: WHERE \u503C\u8868\u8FBE\u5F0F\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09\uFF1A${c}`)};if(i.col!==void 0&&!yt(o,gt(n,i.col,t))||i.eq!==void 0&&!yt(o,l(i.eq))||i.gt!==void 0&&yi(o,l(i.gt))<=0||i.gte!==void 0&&yi(o,l(i.gte))<0||i.lt!==void 0&&yi(o,l(i.lt))>=0||i.lte!==void 0&&yi(o,l(i.lte))>0||i.ne!==void 0&&yt(o,l(i.ne))||i.in&&!i.in.some(u=>yt(o,l(u)))||i.notIn&&i.notIn.some(u=>yt(o,l(u)))||i.like!==void 0&&(o==null||!Hg(i.like).test(String(o)))||i.ilike!==void 0&&(o==null||!Hg(i.ilike,!0).test(String(o))))return!1;if(i.between){let[u,c]=i.between;if(!(Number(o)>=Number(u)&&Number(o)<=Number(c)))return!1}if(i.isNull!==void 0&&o==null!==i.isNull)return!1;continue}throw process.env.PGDBG2&&console.error("[mmw where]",JSON.stringify({col:r,field:s})),new ue("WHERE \u503C\u5F62\u6001",`memory-sql: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\u2014\u2014\u7528 { eq: v } / { in: [...] } / { isNull: true }\uFF09`)}return!0}function Hg(n,e=!1){let t="";for(let r=0;r<n.length;r++){let s=n[r];if(s==="\\"){let i=n[r+1];if(i==="%"||i==="_"||i==="\\"){t+=Fg(i),r++;continue}t+="\\\\";continue}if(s==="%"){t+=".*";continue}if(s==="_"){t+=".";continue}t+=Fg(s)}return new RegExp(`^${t}$`,e?"i":"")}function Fg(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function yi(n,e){if(typeof n=="number"&&typeof e=="number")return n>e?1:n<e?-1:0;let t=String(n),r=String(e);return t>r?1:t<r?-1:0}function yt(n,e){return n===e?!0:n===null||e===null?!1:typeof n=="object"&&typeof e=="object"?JSON.stringify(n)===JSON.stringify(e):!1}function Kg(n){let e=n??new qn;return{orm:_n(Yn(e)),mem:e,close:async()=>e.close()}}var qn,Xu=N(()=>{"use strict";ye();ze();Yr();er();qn=class{opts;constructor(e){this.opts=e}tables=new Map;enums=new Map;async close(){}executeQuery(e){let t;switch(e.kind){case"select":t=this.execSelect(e);break;case"insert":t=this.execInsert(e);break;case"update":t=this.execUpdate(e);break;case"delete":t=this.execDelete(e);break;case"ddl":return this.executeDdl(e)}return this.jsonDecodeRows(e.table,t)}jsonDecodeRows(e,t){if(!e||!this.tables.has(e))return t;let r=this.tables.get(e),s=r.columnTypes,i=new Set(Object.entries(s).filter(([,a])=>/^(jsonb?|vector(?:\\(\d+\\))?)$/i.test(a)).map(([a])=>a)),o=a=>{if(typeof a!="string")return!1;try{let l=JSON.parse(a);return typeof l=="object"&&l!==null}catch{return!1}};for(let a of t)if(!(typeof a!="object"||a===null))for(let l of Object.keys(a)){let u=l.includes(".")?l.slice(l.lastIndexOf(".")+1):l;if((r.state==="declared"?i.has(u):o(a[l]))&&typeof a[l]=="string")try{a[l]=JSON.parse(a[l])}catch{}}return t}tableCols(e){let t=this.table(e),r=new Set(t.columns);for(let s of t.rows)for(let i of Object.keys(s))r.add(Er(i));return r}assertKnownCols(e,t,r){if(this.opts?.validateCols===!1||r)return;let s=[{alias:t.alias??t.table,cols:this.tableCols(t.table)}];for(let a of t.joins??[])s.push({alias:a.alias??a.table,cols:this.tableCols(a.table)});let i=new Set((t.aggregate??[]).map(a=>a.as)),o=[];t.where&&o.push(...Ju(t.where));for(let a of t.joins??[])Os(a.on)||o.push(...Ju(a.on));for(let a of t.cols??[])typeof a=="string"&&o.push(a);for(let a of t.orderBy??[])i.has(a.col)||o.push(a.col);if(t.groupBy)for(let a of t.groupBy)i.has(a)||o.push(a);o.length&&eS(e,o,s,t.table,i)}execSelect(e,t){if(e.table&&(this.assertTableExists("SELECT",e.table),this.assertKnownCols("SELECT",e,t)),e.count){let u=this.table(e.table),c=e.where?u.rows.filter(p=>Ot(p,e.where,e.alias)).length:u.rows.length,d=e.cols?.[0]??"count";return Rr([{[d]:c}],1)}let r=this.table(e.table).rows,s=e.alias??e.table;for(let u of e.joins??[]){let c=this.table(u.table).rows,d=u.alias??u.table,p=u.type==="left",m=[];for(let h of r){let f=!1;for(let g of c){let w={};for(let[y,k]of Object.entries(h))w[y.includes(".")?y:`${s}.${y}`]=k;for(let[y,k]of Object.entries(g))w[`${d}.${y}`]=k;if(Os(u.on))throw new ue("raw JOIN","memory-sql: raw JOIN ON \u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");Ot(w,u.on,void 0)&&(m.push(w),f=!0)}if(!f&&p){let g={};for(let[w,y]of Object.entries(h))g[w.includes(".")?w:`${s}.${w}`]=y;m.push(g)}}r=m,s=d}let i=u=>{if(!t)return u;let c={};for(let[d,p]of Object.entries(u))c[`${e.alias??e.table}.${d}`]=p;for(let[d,p]of Object.entries(t.row))c[`${t.alias}.${d}`]=p;return c},o=e.where;Zu(o);let a=o?r.filter(u=>Ot(i(u),o,e.alias)):r;for(let u of e.sub??[])a=a.filter(c=>{let d=this.execSelect(u.query,{row:c,alias:s});if(u.type==="exists")return u.not?d.length===0:d.length>0;let p=new Set(d.map(h=>h[String(u.query.cols?.[0]??Object.keys(h)[0])])),m=gt(c,u.col,s);return u.not?!p.has(m):p.has(m)});let l;if(e.aggregate?.length){let u=new Map;for(let c of a){let d=(e.groupBy??[]).map(p=>JSON.stringify(gt(c,p,s))).join("|");u.has(d)||u.set(d,[]),u.get(d).push(c)}if(!u.size&&!e.groupBy?.length&&u.set("",[]),l=[...u.values()].map(c=>{let d={};for(let p of e.groupBy??[])d[p]=gt(c[0],p,s);for(let p of e.aggregate){let m=p.col==="*"?void 0:gt(c[0],p.col,s),h=p.filter?c.filter(g=>Ot(g,p.filter,void 0)):c,f=p.col==="*"?h:h.map(g=>gt(g,p.col,s));p.fn==="count"?d[p.as]=f.length:f.length?p.fn==="sum"?d[p.as]=f.reduce((g,w)=>g+Number(w??0),0):p.fn==="avg"?d[p.as]=f.length?f.reduce((g,w)=>g+Number(w??0),0)/f.length:0:p.fn==="min"?d[p.as]=f.reduce((g,w)=>w!==null&&(g===null||w<g)?w:g,null):p.fn==="max"&&(d[p.as]=f.reduce((g,w)=>w!==null&&(g===null||w>g)?w:g,null)):d[p.as]=null}return d}),e.having){let c=new Map;for(let p of e.aggregate??[])c.set(`${p.fn}(${p.col==="*"?"*":p.col})`,p.as);let d={};for(let[p,m]of Object.entries(e.having))d[c.get(p)??p]=m;l=l.filter(p=>Ot(p,d,void 0))}}else if(e.cols?.length){let u=new Set(this.table(e.table).columns);for(let c of e.joins??[])for(let d of this.table(c.table).columns)u.add(d);l=a.map(c=>{let d={};for(let p of e.cols){if(Os(p))throw new ue("raw \u6295\u5F71","memory-sql: raw \u6295\u5F71\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");let m=/^(.+?)\s+AS\s+([\w.]+)$/i.exec(p);if(m)d[m[2]]=gt(c,m[1].trim());else{let h=Er(p),f=gt(c,p);d[h]=f===void 0&&u.has(h)?null:f}}return e.vector&&(d[e.vector.as]=Bg(Ug(gt(c,e.vector.col,s)),e.vector.vec)),d})}else l=a.map(u=>{let c={},d=e.joins?.length?u:tS(u);for(let[p,m]of Object.entries(d))c[Er(p)]=m;return c});if(e.distinct){let u=new Set;l=l.filter(c=>{let d=JSON.stringify(c);return u.has(d)?!1:(u.add(d),!0)})}if(e.vector&&(l=l.map(u=>({r:u,sim:Bg(Ug(gt(u,e.vector.col,s)),e.vector.vec)})).sort((u,c)=>c.sim-u.sim).map(u=>u.r)),e.orderBy?.length){let u=e.orderBy;l=l.map((c,d)=>({r:c,idx:d})).sort((c,d)=>{for(let p of u){let m=c.r[Er(p.col)],h=d.r[Er(p.col)];if(m===h)continue;let f=typeof m=="number"&&typeof h=="number"?m>h?1:-1:String(m)>String(h)?1:-1;return p.dir==="desc"?-f:f}return d.idx-c.idx}).map(c=>c.r)}return e.offset!==void 0&&(l=l.slice(e.offset)),e.limit!==void 0&&(l=l.slice(0,e.limit)),Rr(l,l.length)}execInsert(e){let t=this.obtain(e.table),r=[],s=0,i=e.rows.map(o=>({...o}));for(let o of i){let a=Object.keys(o);t.pk&&!(t.pk.col in o)&&(o[t.pk.col]=t.pk.defaultUuid?Xk():`mem-${t.nextId}`);for(let u of t.defaultNow)u in o||(o[u]=new Date().toISOString());for(let[u,c]of t.defaultVals)u in o||(o[u]=c);for(let u of Object.keys(o))o[u]=Qu(u,void 0,o[u],o);let l;for(let u of t.uniques)if(u in o&&o[u]!=null){let c=t.rows.find(d=>yt(d[u],o[u]));if(c){l={u,row:c};break}}if(!l){for(let u of t.groups)if(u.every(c=>c in o&&o[c]!=null)){let c=t.rows.find(d=>u.every(p=>yt(d[p],o[p])));if(c){l={u:u.join(","),row:c};break}}}if(l){if(!e.onConflict)throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l.u}"`,409);if(e.onConflict.update){if(e.onConflict.merge)for(let[u,c]of Object.entries(e.onConflict.merge))l.row[u]=Qu(u,l.row[u],c,l.row);else{let u=Array.isArray(e.onConflict.col)?new Set(e.onConflict.col):e.onConflict.col?new Set([e.onConflict.col]):null;for(let c of a)u?.has(c)||(l.row[c]=o[c])}s++,e.returning&&r.push(e.returning==="*"?{...l.row}:wi(l.row,e.returning))}continue}t.rows.push(o),t.nextId++,s++,e.returning&&r.push(e.returning==="*"?{...o}:wi(o,e.returning))}return Rr(r,s)}execUpdate(e){let t=this.table(e.table),r=[],s=[];for(let o of t.rows)if(!e.where||Ot(o,e.where,void 0)){let a={...o};for(let[l,u]of Object.entries(e.sets))if(Yk(u))a[l]=Qu(l,a[l],u,a);else if(Os(u))if(/^now\(\)$/i.test(u.__raw.trim()))a[l]=new Date().toISOString();else throw new ue("raw SET","memory-sql: raw SET \u503C\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");else a[l]=u;s.push({row:o,next:a})}let i=new Map(s.map(o=>[o.row,o.next]));for(let{row:o,next:a}of s){for(let l of t.uniques){if(!(l in a)||a[l]==null)continue;if(t.rows.some(c=>c!==o&&yt((i.get(c)??c)[l],a[l])))throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l}"`,409)}for(let l of t.groups){if(!l.every(c=>c in a&&a[c]!=null))continue;if(t.rows.some(c=>c!==o&&l.every(d=>yt((i.get(c)??c)[d],a[d]))))throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l.join(", ")}"`,409)}}for(let{row:o,next:a}of s){for(let[l,u]of Object.entries(a))o[l]=u;e.returning&&r.push(e.returning==="*"?{...o}:wi(o,e.returning))}return Rr(r,s.length)}execDelete(e){Zu(e.where);let t=this.table(e.table),r=t.rows.length,s=[],i=[];for(let o of t.rows)!e.where||Ot(o,e.where,void 0)?e.returning&&i.push(e.returning==="*"?{...o}:wi(o,e.returning)):s.push(o);return t.rows=s,Rr(i,r-s.length)}assertTableExists(e,t){if(t&&!this.tables.has(t))throw new ue("relation",`memory-sql: ${e} \u8868 '${t}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`)}table(e){let t=this.tables.get(e);if(!t)throw new ue("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`);return t}obtain(e){let t=this.tables.get(e);return t||(t={state:"observed",rows:[],nextId:1,uniques:new Set,groups:[],defaultNow:new Set,defaultVals:new Map,columns:[],columnTypes:{}},this.tables.set(e,t)),t}toDeclared(e){let t=this.obtain(e);return t.state="declared",t}hasTable(e){return this.tables.has(e)}inspectTable(e){let t=this.tables.get(e);if(!t)throw new ue("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF0842P01\uFF09`);return{state:t.state,columns:[...t.columns],columnTypes:{...t.columnTypes},constraints:{pk:t.pk?{...t.pk}:void 0,uniques:[...t.uniques],groups:t.groups.map(r=>[...r]),defaultNow:[...t.defaultNow],defaultVals:{...t.defaultVals}}}}schemaSnapshot(){let e=[];for(let[t,r]of this.tables)e.push({name:t,columns:r.columns.map(s=>({name:s,type:(r.columnTypes[s]??"TEXT").toLowerCase()}))});return e}getColumnType(e,t){return this.tables.get(e)?.columnTypes[t]}getColumnTypes(e){return this.tables.get(e)?.columns.map(t=>this.tables.get(e).columnTypes[t]??"text")??[]}snapshot(){let e=new Map;for(let[t,r]of this.tables)e.set(t,{rows:r.rows.map(s=>({...s})),nextId:r.nextId,columns:[...r.columns],columnTypes:{...r.columnTypes},pk:r.pk?{...r.pk}:void 0,uniques:[...r.uniques],groups:r.groups.map(s=>[...s]),state:r.state,defaultNow:[...r.defaultNow],defaultVals:Object.fromEntries(r.defaultVals)});return e}restore(e){let t=new Set;for(let[r,s]of e)this.tables.set(r,{state:s.state,rows:s.rows.map(i=>({...i})),nextId:s.nextId,columns:[...s.columns],columnTypes:{...s.columnTypes},pk:s.pk?{...s.pk}:void 0,uniques:new Set(s.uniques),groups:(s.groups??[]).map(i=>[...i]),defaultNow:new Set(s.defaultNow),defaultVals:new Map(Object.entries(s.defaultVals??{}))}),t.add(r);for(let r of this.tables.keys())t.has(r)||this.tables.delete(r)}applySchema(e){for(let t of e.tables??[]){let r=this.toDeclared(t.name);r.columns=[],r.columnTypes={};for(let[s,i]of Object.entries(t.columns)){let o=i,a=o.metaInfo,l=a.column??s;r.columns.push(l),r.columnTypes[l]=(t.columnTypes?.[l]??Ut(o)).toLowerCase(),a.pk&&(r.pk={col:l,defaultUuid:a.default==="random"}),a.unique&&r.uniques.add(l),a.default==="now"?r.defaultNow.add(l):a.default!==void 0&&a.default!=="random"&&r.defaultVals.set(l,a.default)}for(let s of t.uniques??[])s.length>1&&r.groups.push(s)}}executeDdl(e){if(e.op==="createTable"&&e.table){let t=this.toDeclared(e.table),r=(e.columns??[]).filter(s=>s.type!=="table-constraint");if(t.columns.length===0){t.columns=r.map(s=>s.name);for(let s of r)t.columnTypes[s.name]=s.type.toLowerCase()}else{for(let s of r)t.columns.includes(s.name)||(t.columns.push(s.name),t.columnTypes[s.name]=s.type.toLowerCase());for(let s of t.rows)for(let i of r)!(i.name in s)&&i.defaultVal!==void 0&&(s[i.name]=i.defaultVal)}for(let s of e.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&t.groups.push(s.constraintCols);continue}s.pk&&(t.pk={col:s.name,defaultUuid:s.defaultUuid}),s.unique&&t.uniques.add(s.name),s.defaultNow&&t.defaultNow.add(s.name),s.defaultVal!==void 0&&t.defaultVals.set(s.name,s.defaultVal)}}else if(e.op==="alterAddColumn"&&e.table&&e.column){let t=this.table(e.table);if(!t.columns.includes(e.column)&&(t.columns.push(e.column),e.columnType&&(t.columnTypes[e.column]=e.columnType),e.defaultVal!==void 0)){let r=typeof e.defaultVal=="object"&&e.defaultVal!==null&&"__now"in e.defaultVal?new Date().toISOString():e.defaultVal;t.defaultVals.set(e.column,r);for(let s of t.rows)e.column in s||(s[e.column]=r)}}else if(e.op==="dropTable"&&e.table)this.tables.delete(e.table);else if(e.op==="dropEnum"&&e.table)this.enums.delete(e.table);else if(e.op==="alterEnumAddValue"&&e.table){let t=this.enums.get(e.table)??[];for(let r of e.enumValues??[])t.includes(r)||t.push(r);this.enums.set(e.table,t)}else e.op==="createEnum"&&e.table&&(this.enums.has(e.table)||this.enums.set(e.table,e.enumValues??[]));return Rr([],0)}}});import{AsyncLocalStorage as nS}from"node:async_hooks";function Tr(n){let e=typeof n=="string"?{connection:n}:n??{};if(e.memory)return rS(e);let t=e.connection??process.env.DATABASE_URL;if(!t)throw new Error("postgres: DATABASE_URL is not set. Pass a connection string or set the DATABASE_URL environment variable.");let r=new URL(t),s=new hi({host:r.hostname,port:Number(r.port||5432),user:decodeURIComponent(r.username),password:decodeURIComponent(r.password),database:r.pathname.replace(/^\//,""),poolSize:e.max??e.poolSize??10,acquireTimeoutMs:e.acquireTimeoutMs,statementTimeoutMs:e.statementTimeoutMs??e.statementTimeout,idleTimeoutMs:e.idle_timeout,onQuery:e.onQuery?(a,l,u)=>{let c=Gg.getStore();e.onQuery?.(a,l,u,c||void 0)}:void 0}),i=_n(Ro({query:(a,l)=>sS(s.query(a,l)),transaction:(a=>s.transaction(a))},dp),e.tenant),o=((a,l,u)=>(l.orm=e.tenant?i.withCtx(l):i,Gg.run(a.headers.get("x-trace-id")??"",()=>u(a,l))));return o.__meta={injects:["orm"],depends:[]},o.orm=i,o.migrate=async()=>{await s.unsafe(`
162
+ </html>`}function Uk(n){let e=new lt;async function t(s,o){let i=await n(s,o),a;try{a=Dk(i)}catch(l){throw new pi(500,`schema \u6784\u5EFA\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`)}return{options:i,schema:a}}async function r(s,o,i){let a;try{a=await t(s,o)}catch(l){return Lk(l)}return i(a)}return e.get("/",async(s,o)=>r(s,o,async({options:i,schema:a})=>{let l=new URL(s.url);if(i.graphiql&&!l.searchParams.has("query"))return new Response(Wk(l.pathname),{status:200,headers:{"Content-Type":"text/html"}});let u=Nk(l);return u===null?Response.json({errors:[{message:"Missing query"}]},{status:400}):"error"in u?Response.json({errors:[{message:u.error}]},{status:400}):Tg(a,u,i,s,o)})),e.post("/",async(s,o)=>r(s,o,async({options:i,schema:a})=>{if(!(s.headers.get("content-type")??"").toLowerCase().includes("application/json"))return Response.json({errors:[{message:"Unsupported Media Type: expected application/json"}]},{status:415});let u=await Mk(s);return u?Tg(a,u,i,s,o):Response.json({errors:[{message:"Missing query"}]},{status:400})})),e}function mi(n,e){let t=typeof n=="string"?n:"/graphql",r=typeof n=="string"?e:n;if(!r)throw new Error("graphql(): \u7F3A\u5C11 handler");let s=new lt;s.mount(t,Uk(r));let o=s.handler(),i=t.length>1&&t.endsWith("/")?t.slice(0,-1):t;return(a,l,u)=>{let c;try{c=new URL(a.url).pathname}catch{c=a.url.split("?")[0]}return(i==="/"?c==="/":c===i||c.startsWith(i+"/"))?o(a,l):u(a,l)}}var xg,Rg,Fu,pi,Cg=I(()=>{"use strict";Sg();Ea();xg=64,Rg=new WeakMap,Fu=new Map;pi=class extends Error{status;constructor(e,t){super(t),this.name="GraphHttpError",this.status=e}}});function At(n,e){let t=new Uint8Array(5+e.length);t[0]=n.charCodeAt(0);let r=4+e.length;return t[1]=r>>24&255,t[2]=r>>16&255,t[3]=r>>8&255,t[4]=r&255,t.set(e,5),t}function Ag(n){let e=[];e.push(0,3,0,0);for(let[s,o]of Object.entries(n)){for(let i of ft(s))e.push(i);e.push(0);for(let i of ft(o))e.push(i);e.push(0)}e.push(0);let t=new Uint8Array(4+e.length),r=4+e.length;return t[0]=r>>24&255,t[1]=r>>16&255,t[2]=r>>8&255,t[3]=r&255,t.set(e,4),t}function hi(n){return At("Q",gi(ft(n),new Uint8Array([0])))}function Og(n,e,t=[]){let r=gi(ft(n),new Uint8Array([0]),ft(e),new Uint8Array([0])),s=new Uint8Array(2+t.length*4);return s[0]=t.length>>8&255,s[1]=t.length&255,t.forEach((o,i)=>{let a=2+i*4;s[a]=o>>24&255,s[a+1]=o>>16&255,s[a+2]=o>>8&255,s[a+3]=o&255}),At("P",gi(r,s))}function Vu(n,e,t=[]){let r=ft(n),s=new Array(e.length),o=1+r.length+1;o+=2+t.length*2,o+=2;for(let l=0;l<e.length;l++){let u=e[l];if(o+=4,u!==null){let c=typeof u=="string"?Bk(u):u.length;s[l]=c,o+=c}}o+=2;let i=new Uint8Array(o),a=0;i[a++]=0,i.set(r,a),a+=r.length,i[a++]=0,i[a]=t.length>>8&255,i[a+1]=t.length&255,a+=2;for(let l of t)i[a]=l>>8&255,i[a+1]=l&255,a+=2;i[a]=e.length>>8&255,i[a+1]=e.length&255,a+=2;for(let l=0;l<e.length;l++){let u=e[l];if(u===null)i[a]=i[a+1]=i[a+2]=i[a+3]=255,a+=4;else{let c=s[l];i[a]=c>>24&255,i[a+1]=c>>16&255,i[a+2]=c>>8&255,i[a+3]=c&255,a+=4,typeof u=="string"?i.set(ft(u),a):i.set(u,a),a+=c}}return i[a]=0,i[a+1]=0,At("B",i)}function Bk(n){return Buffer.byteLength(n)}function zu(n="",e=0){let t=new Uint8Array(n.length+1+4);t.set(ft(n),0),t[n.length]=0;let r=n.length+1;return t[r]=e>>24&255,t[r+1]=e>>16&255,t[r+2]=e>>8&255,t[r+3]=e&255,At("E",t)}function Is(){return At("S",new Uint8Array(0))}function Ig(){return At("H",new Uint8Array(0))}function Pg(n,e=""){return At("D",gi(ft(n),ft(e),new Uint8Array([0])))}function Ng(){return At("X",new Uint8Array(0))}function Ku(n){return At("p",ft(n))}function Mg(n){return n.type!=="R"||n.payload.length<4?-1:n.payload[0]<<24|n.payload[1]<<16|n.payload[2]<<8|n.payload[3]}function $g(n){let e=n[0]<<8|n[1],t=[],r=2;for(let s=0;s<e;s++){let o=r;for(;n[o]!==0;)o++;let i=Qu.decode(n.subarray(r,o));r=o+1,r+=6;let a=n[r]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];r+=4;let l=n[r]<<8|n[r+1];r+=2,r+=6,t.push({name:i,typeOid:a,typeLen:l})}return t}function qg(n){let e=n[0]<<8|n[1],t=[],r=2;for(let s=0;s<e;s++){let o=n[r]<<24|n[r+1]<<16|n[r+2]<<8|n[r+3];r+=4,o===-1?t.push(null):(t.push(Qu.decode(n.subarray(r,r+o))),r+=o)}return t}function Gu(n){let e={},t=0;for(;t<n.length&&n[t]!==0;){let r=String.fromCharCode(n[t]),s=t+1;for(;s<n.length&&n[s]!==0;)s++;let o=Qu.decode(n.subarray(t+1,s));switch(r){case"S":e.severity=o;break;case"C":e.code=o;break;case"M":e.message=o;break;case"D":e.detail=o;break;case"H":e.hint=o;break;case"P":e.position=o;break}t=s+1}return e}function ft(n){return Hk.encode(n)}function gi(...n){let e=0;for(let s of n)e+=s.length;let t=new Uint8Array(e),r=0;for(let s of n)t.set(s,r),r+=s.length;return t}var fi,Qu,Hk,Dg=I(()=>{"use strict";ye();fi=class n{buf=new Uint8Array(0);off=0;static MAX_BUFFER=1<<20;push(e){this.append(e);let t=[];for(;;){let r=this.off,s=this.tryRead();if(!s){this.off=r;break}t.push(s)}return t.length>0&&this.compact(),t}append(e){if(e.length===0)return;let t=this.buf.length-this.off;if(t===0){this.buf=e,this.off=0;return}let r=t+e.length;if(r>n.MAX_BUFFER)throw new ue(`postgres: \u4E0D\u5B8C\u6574\u6D88\u606F\u8D85\u8FC7\u7F13\u51B2\u4E0A\u9650\uFF08${n.MAX_BUFFER} \u5B57\u8282\uFF09\u2014\u2014DoS \u9632\u5FA1`);if(this.buf.length>=r){this.buf.set(e,t),this.off=0;return}let s=new Uint8Array(Math.max(r,this.buf.length*2));s.set(this.buf.subarray(this.off),0),s.set(e,t),this.buf=s,this.off=0}compact(){this.off===this.buf.length?(this.buf=new Uint8Array(0),this.off=0):this.off>0&&(this.buf=this.buf.subarray(this.off),this.off=0)}tryRead(){if(this.buf.length-this.off<5)return null;let e=(this.buf[this.off+1]<<24|this.buf[this.off+2]<<16|this.buf[this.off+3]<<8|this.buf[this.off+4])>>>0;if(e===0||e>n.MAX_BUFFER||this.buf.length-this.off<1+e)return null;let t=String.fromCharCode(this.buf[this.off]),r=this.buf.subarray(this.off+5,this.off+1+e);return this.off+=1+e,{type:t,payload:r}}};Qu=new TextDecoder,Hk=new TextEncoder});import Fk from"node:net";import $n from"node:crypto";function Vk(n){return n.includes("cached plan must not change result type")||n.includes("cache lookup failed for type")}function Ju(n){return new TextEncoder().encode(n)}function jg(n){let e=new Uint8Array(5+n.length);e[0]=112;let t=4+n.length;return e[1]=t>>24&255,e[2]=t>>16&255,e[3]=t>>8&255,e[4]=t&255,e.set(n,5),e}function wi(n,e){return $n.createHmac("sha256",n).update(e).digest()}function zk(n,e){let t=new Uint8Array(n.length);for(let r=0;r<n.length;r++)t[r]=n[r]^e[r];return t}function Kk(n){return n.map(e=>e==null?null:typeof e=="object"?Array.isArray(e.__pgArray)?Gk(e.__pgArray):JSON.stringify(e):String(e))}function Gk(n){return`{${n.map(t=>{if(t==null)return"NULL";let r=typeof t=="object"?JSON.stringify(t):String(t);return/^[A-Za-z0-9_+.-]*$/.test(r)?r:'"'+r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}).join(",")}}`}function Qk(n,e){if(e===null)return null;switch(n){case 114:case 3802:return JSON.parse(e);case 20:{let t=BigInt(e);return t>BigInt(Number.MAX_SAFE_INTEGER)||t<BigInt(-Number.MAX_SAFE_INTEGER)?e:Number(t)}case 21:case 23:case 26:return Number(e);case 700:case 701:case 1700:return parseFloat(e);case 16:return e==="t";case 1184:return new Date(e);default:return e}}var xr,Lg=I(()=>{"use strict";Dg();ye();xr=class n{opts;timeoutSet=!1;awaitingReady=!1;pendingErrorZ=!1;socket=null;stream=new fi;status="idle";waiters=[];constructor(e={}){this.opts={host:e.host??"127.0.0.1",port:e.port??5432,user:e.user??"postgres",database:e.database??"postgres",connectTimeoutMs:e.connectTimeoutMs??1e4,statementTimeoutMs:e.statementTimeoutMs??0,password:e.password}}get connected(){return this.status==="ready"}lastUsed=0;connect(){return new Promise((e,t)=>{this.status="connecting";let r=Fk.connect(this.opts.port,this.opts.host);this.socket=r;let s=setTimeout(()=>{r.destroy(),t(new ce(`postgres: connect timeout after ${this.opts.connectTimeoutMs}ms`))},this.opts.connectTimeoutMs);r.once("connect",()=>{r.setNoDelay(!0),r.write(Ag({user:this.opts.user,database:this.opts.database}))}),r.on("data",o=>this.onData(o)),r.on("error",o=>{clearTimeout(s),this.status==="connecting"&&t(new ce(`postgres: ${o.message}`))}),r.on("close",()=>{if(clearTimeout(s),this.socket=null,this.status!=="closed"){this.status="closed";let o=this.currentQuery;this.currentQuery=null,o&&o.reject(new ce("postgres: connection closed"))}}),this.onReady=()=>{clearTimeout(s),this.status="ready",e()},this.onAuthFail=o=>{clearTimeout(s),t(o)}})}onReady=null;onAuthFail=null;expectingAuth=!0;authCtx=null;prepared=new Map;static PREPARED_MAX=128;stmtSeq=0;deallocQueue=[];awaitingDeallocZ=!1;currentQuery=null;pendingRetry=null;onData(e){let t=this.stream.push(new Uint8Array(e));for(let r of t)this.handle(r)}handle(e){if(this.expectingAuth){if(e.type==="R"){let t=Mg(e);if(t!==0){if(t===3)this.send(Ku(this.opts.password??""));else if(t===5){let r=e.payload.subarray(8,12),s=$n.createHash("md5").update(this.opts.password+this.opts.user).digest("hex"),o=$n.createHash("md5").update(s+Buffer.from(r).toString("latin1")).digest("hex");this.send(Ku(`md5${o}`))}else if(t===10){let r=$n.randomBytes(18).toString("base64url"),s=`n=,r=${r}`;this.authCtx={clientNonce:r,clientFirstBare:s,serverFirst:""};let o=Ju("SCRAM-SHA-256\0"),i=Ju(`n,,${s}`),a=new Uint8Array(o.length+4+i.length);a.set(o,0),a[o.length]=i.length>>24&255,a[o.length+1]=i.length>>16&255,a[o.length+2]=i.length>>8&255,a[o.length+3]=i.length&255,a.set(i,o.length+4),this.send(jg(a))}else if(t===11){let r=new TextDecoder().decode(e.payload.subarray(4));if(!this.authCtx){this.onAuthFail?.(new ce("postgres: unexpected SASL continue"));return}this.authCtx.serverFirst=r;let s=this.scramFinal(this.authCtx);this.send(jg(Ju(s)))}else if(t===12){let s=new TextDecoder().decode(e.payload.subarray(4)).match(/v=([A-Za-z0-9+/=]+)/);if(s&&this.authCtx){let o=this.scramServerSignature(this.authCtx);if(s[1]!==o){this.onAuthFail?.(new ce("postgres: SCRAM server signature mismatch"));return}}}}return}if(e.type==="E"){let t=Gu(e.payload);this.expectingAuth=!1,this.onAuthFail?.(new ce(`postgres: auth failed: ${t.message??"unknown"}`)),this.socket?.destroy();return}if(e.type==="Z"){if(this.expectingAuth=!1,this.opts.statementTimeoutMs>0&&!this.timeoutSet){this.timeoutSet=!0,this.awaitingReady=!0,this.socket?.write(hi(`SET statement_timeout = ${this.opts.statementTimeoutMs}`));return}this.onReady?.();return}return}switch(e.type){case"T":{if(this.currentQuery){this.currentQuery.columns=$g(e.payload);let t=`${this.currentQuery.sql}|${this.currentQuery.params?.length??0}`,r=this.getPrepared(t);r&&(r.columns=this.currentQuery.columns)}break}case"D":{let t=qg(e.payload);if(this.currentQuery&&this.currentQuery.columns){let r={};this.currentQuery.columns.forEach((s,o)=>{r[s.name]=Qk(s.typeOid,t[o]??null)}),this.currentQuery.rows.push(r)}break}case"C":{let t=this.currentQuery;if(t){let s=new TextDecoder().decode(e.payload).replace(/\0+$/,"").match(/^(?:INSERT|UPDATE|DELETE|MERGE)\s+(?:\d+\s+)?(\d+)$/);s&&(t.affectedRows=parseInt(s[1],10))}break}case"t":{this.currentQuery?.awaitingDescribe&&this.currentQuery.sql!==void 0&&(this.currentQuery.awaitingDescribe=!1,this.currentQuery.prepKey&&this.currentQuery.prepName&&this.setPrepared(this.currentQuery.prepKey,{name:this.currentQuery.prepName,columns:this.currentQuery.columns}),this.send(Vu(this.currentQuery.prepName??"",this.currentQuery.params??[])),this.send(zu()),this.send(Is()));break}case"Z":{if(this.pendingErrorZ){if(this.pendingErrorZ=!1,this.pendingRetry){let r=this.pendingRetry;this.pendingRetry=null,this.issueExtendedQuery(r.sql,r.params??[],r.resolve,r.reject,r.retried)}break}if(this.awaitingDeallocZ){this.awaitingDeallocZ=!1;break}let t=this.currentQuery;if(this.currentQuery=null,t){let r=t.rows;t.affectedRows!==void 0&&Object.defineProperty(r,"affectedRows",{value:t.affectedRows,enumerable:!1,writable:!0,configurable:!0}),t.resolve(r)}this.flushDealloc(),this.awaitingReady&&(this.awaitingReady=!1,this.onReady?.()),this.notifyIdle();break}case"E":{let t=Gu(e.payload),r=this.currentQuery;if(this.currentQuery=null,r){this.pendingErrorZ=!0;let s=new Error(t.message??"postgres query error");if(s.code=t.code,r.prepKey&&Vk(t.message??"")&&(this.prepared.clear(),!r.retried)){this.pendingRetry={sql:r.sql??"",params:r.params,columns:r.columns,resolve:r.resolve,reject:r.reject,retried:!0},r.awaitingDescribe&&this.send(Is());break}r.awaitingDescribe&&this.send(Is()),r.reject(s)}break}case"N":break;default:break}}scramFinal(e){let t=new Map(e.serverFirst.split(",").map(m=>{let g=m.indexOf("=");return[m.slice(0,g),m.slice(g+1)]})),r=Buffer.from(t.get("s")??"","base64"),s=parseInt(t.get("i")??"4096",10),o=t.get("r")??"",i=this.opts.password??"",a=$n.pbkdf2Sync(i,r,s,32,"sha256"),l=wi(a,"Client Key"),u=$n.createHash("sha256").update(l).digest(),d=`c=biws,r=${o}`,p=`${e.clientFirstBare},${e.serverFirst},${d}`,f=wi(u,p),w=zk(l,f);return`${d},p=${Buffer.from(w).toString("base64")}`}scramServerSignature(e){let t=new Map(e.serverFirst.split(",").map(c=>{let d=c.indexOf("=");return[c.slice(0,d),c.slice(d+1)]})),r=Buffer.from(t.get("s")??"","base64"),s=parseInt(t.get("i")??"4096",10),o=t.get("r")??"",i=$n.pbkdf2Sync(this.opts.password??"",r,s,32,"sha256"),a=wi(i,"Server Key"),l=`c=biws,r=${o}`,u=`${e.clientFirstBare},${e.serverFirst},${l}`;return Buffer.from(wi(a,u)).toString("base64")}getPrepared(e){let t=this.prepared.get(e);return t&&(this.prepared.delete(e),this.prepared.set(e,t)),t}setPrepared(e,t){if(this.prepared.delete(e),this.prepared.set(e,t),this.prepared.size>n.PREPARED_MAX){let r=this.prepared.keys().next().value;if(r!==void 0){let s=this.prepared.get(r);this.prepared.delete(r),s&&this.deallocQueue.push(s.name)}}}flushDealloc(){if(this.deallocQueue.length===0||!this.socket)return;let e=this.deallocQueue.splice(0);this.awaitingDeallocZ=!0,this.socket.write(hi(e.map(t=>`DEALLOCATE "${t}"`).join("; ")))}async transaction(e){await this.query("BEGIN");try{let t=await e({query:(r,s)=>this.query(r,s)});return await this.query("COMMIT"),t}catch(t){throw await this.query("ROLLBACK").catch(()=>{}),t}}query(e,t){return new Promise((r,s)=>{if(this.status!=="ready"||!this.socket){s(new ce("postgres: not connected"));return}if(this.currentQuery){s(new ce("postgres: query already in progress"));return}if(!t||t.length===0)this.currentQuery={columns:[],rows:[],resolve:r,reject:s},process.env.PGDBG2&&console.error("[cquery]",JSON.stringify(e.slice(0,120))),this.socket.write(hi(e));else{let o=`${e}|${t.length}`,i=this.getPrepared(o),a=Kk(t);i?(this.currentQuery={columns:[...i.columns],rows:[],resolve:r,reject:s,sql:e,params:a,awaitingDescribe:!1,prepKey:o,prepName:i.name},this.socket.write(Vu(i.name,a)),this.socket.write(zu()),this.socket.write(Is())):this.issueExtendedQuery(e,a,r,s)}})}issueExtendedQuery(e,t,r,s,o){let i=`wf_s${++this.stmtSeq}`;this.currentQuery={columns:[],rows:[],resolve:r,reject:s,sql:e,params:t,awaitingDescribe:!0,prepKey:`${e}|${t.length}`,prepName:i,retried:o},this.socket?.write(Og(i,e,t.map(()=>0))),this.socket?.write(Pg("S",i)),this.socket?.write(Ig())}send(e){this.socket?.write(e)}notifyIdle(){let e=this.waiters;this.waiters=[];for(let t of e)t()}waitIdle(){return this.currentQuery?new Promise(e=>this.waiters.push(e)):Promise.resolve()}async close(){let e=this.socket;this.status==="ready"&&e&&e.write(Ng()),this.status="closed",e&&e.destroy()}}});function Jk(n,e,t){if(e==null){if(n.required)throw new se(`schema: '${t}' is required`);return}switch(n.type){case"text":if(typeof e!="string")throw new se(`schema: '${t}' must be a string, got ${typeof e}`);break;case"int":if(typeof e!="number"||!Number.isInteger(e))throw new se(`schema: '${t}' must be an integer, got ${typeof e}`);break;case"jsonb":if(typeof e!="object"||e===null||Array.isArray(e))throw new se(`schema: '${t}' must be a JSON object`);break;case"enum":if(!n.values?.includes(e))throw new se(`schema: '${t}' must be one of [${n.values?.join(", ")}], got ${String(e)}`);break}}function Ps(n,e){for(let[t,r]of Object.entries(n))if(r.required&&(e[t]===void 0||e[t]===null))throw new se(`schema: '${t}' is required`);for(let[t,r]of Object.entries(e)){let s=n[t];s&&Jk(s,r,t)}}var Wg=I(()=>{"use strict";ye()});function Zu(n,e){let t=n[0],r=[];for(let s=0;s<e.length;s++){let o=e[s]?.__fragment;if(o){let i=o.sql.replace(/\$(\d+)/g,(a,l)=>(r.push(o.params[parseInt(l,10)-1]),`$${r.length}`));t+=i+n[s+1]}else r.push(e[s]),t+=`$${r.length}`+n[s+1]}return{sql:t,params:r}}var yi,Ug=I(()=>{"use strict";Lg();ye();Wg();yi=class n{all=[];available=[];waiters=[];closed=!1;opts;initPromise=null;schemas=new Map;idleTimer=null;constructor(e={}){this.opts=e}static async create(e={}){let t=new n(e);return await t.ensure(),t}readyPromise=null;ensure(){return this.readyPromise?this.readyPromise:(this.initPromise||(this.initPromise=this.init()),this.initPromise)}async init(){let e=this.opts.poolSize??5,t=await Promise.all(Array.from({length:e},async()=>{let s=new xr(this.opts);return await s.connect(),s})),r=Date.now();for(let s of t)s.lastUsed=r;this.all=t,this.available=[...t],this.readyPromise=Promise.resolve(),this.startIdleReaper()}startIdleReaper(){let e=this.opts.idleTimeoutMs??0;e<=0||this.idleTimer||(this.idleTimer=setInterval(()=>this.reapIdle(),e),this.idleTimer.unref?.())}reapIdle(){if(this.closed)return;let e=Date.now(),t=this.opts.idleTimeoutMs??0;for(let r=this.available.length-1;r>=0;r--){let s=this.available[r];if(s.lastUsed>0&&e-s.lastUsed>=t){this.available.splice(r,1);let o=this.all.indexOf(s);o>=0&&this.all.splice(o,1),s.close()}}}get open(){return this.all.length}acquire(){if(this.closed)return Promise.reject(new ce("postgres: pool is closed"));if(this.available.length>0)return Promise.resolve(this.available.pop());let e=this.opts.poolSize??5;if(this.all.length<e){let r=new xr(this.opts);return r.connect().then(()=>(this.all.push(r),r),()=>{throw setTimeout(()=>this.replenish(),500),new ce("postgres: failed to establish connection")})}let t=this.opts.acquireTimeoutMs??3e4;return new Promise((r,s)=>{let o={resolve:r,reject:s};t>0&&(o.timer=setTimeout(()=>{let i=this.waiters.indexOf(o);i>=0&&this.waiters.splice(i,1),s(new mn("postgres: pool acquire",t))},t)),this.waiters.push(o)})}release(e){if(this.closed){e.close();return}if(!e.connected){e.close(),this.replenish();return}e.lastUsed=Date.now(),this.dispatchAvailable(e)}dispatchAvailable(e){let t=this.waiters.shift();t?(t.timer&&clearTimeout(t.timer),t.resolve(e)):this.available.push(e)}replenish(){if(this.closed)return;let e=new xr(this.opts);e.connect().then(()=>{if(this.closed){e.close();return}this.all.push(e),this.dispatchAvailable(e)}).catch(()=>{setTimeout(()=>this.replenish(),500)})}async query(e,t){await this.ensure();let r=await this.acquire(),s=performance.now();try{let o=await r.query(e,t);return this.opts.onQuery?.(e,performance.now()-s,o.length),o}finally{this.release(r)}}register(e,t){this.schemas.set(e,t)}async insertMany(e,t,r={}){let s=[];if(t.length===0)return Object.defineProperty(s,"affectedRows",{value:0,enumerable:!1,writable:!0}),s;let o=this.schemas.get(e),i=Object.keys(t[0]).sort(),a=Math.max(1,r.batchSize??500),l=0,u=s;for(let c=0;c<t.length;c+=a){let d=t.slice(c,c+a);for(let g=0;g<d.length;g++){let h=d[g],b=Object.keys(h).sort();if(b.length!==i.length||b.some((k,_)=>k!==i[_]))throw new se(`schema: insertMany requires identical keys across rows (row ${c+g} has [${b}], expected [${i}])`);o&&Ps(o,h)}let p=d.map((g,h)=>`(${i.map((b,k)=>`$${h*i.length+k+1}`).join(", ")})`).join(", "),f=`INSERT INTO ${e} (${i.join(", ")}) VALUES ${p}`,w=d.flatMap(g=>i.map(h=>g[h])),m=await this.query(f,w);l+=m.affectedRows??d.length,m.length>0&&(u=m)}return Object.defineProperty(u,"affectedRows",{value:l,enumerable:!1,writable:!0}),u}async update(e,t,r,s={}){let o=this.schemas.get(e);o&&Ps(o,{...t,...r});let i=Object.keys(t);if(i.length===0)throw new se("schema: update requires at least one SET column");let a=Object.keys(r);if(a.length===0)throw new se("schema: update requires a WHERE clause (full-table update via unsafe)");let l=i.map((f,w)=>`${f} = $${w+1}`).join(", "),u=a.map((f,w)=>`${f} = $${i.length+w+1}`).join(" AND "),c=s.returning?.length?` RETURNING ${s.returning.join(", ")}`:"",d=`UPDATE ${e} SET ${l} WHERE ${u}${c}`,p=[...i.map(f=>t[f]),...a.map(f=>r[f])];return this.query(d,p)}async delete(e,t){let r=this.schemas.get(e);r&&Ps(r,t);let s=Object.keys(t);if(s.length===0)throw new se("schema: delete requires a WHERE clause");let o=`DELETE FROM ${e} WHERE ${s.map((i,a)=>`${i} = $${a+1}`).join(" AND ")}`;return this.query(o,s.map(i=>t[i]))}async insert(e,t){let r=this.schemas.get(e);if(!r)throw new se(`schema: table '${e}' not registered\u2014call register() first`);Ps(r,t);let s=Object.keys(t);if(s.length===0)throw new se("schema: insert requires at least one column");let o=s.map((a,l)=>`$${l+1}`).join(", "),i=`INSERT INTO ${e} (${s.join(", ")}) VALUES (${o})`;return this.query(i,s.map(a=>t[a]))}tag(e,...t){let{sql:r,params:s}=Zu(e,t);return this.query(r,s)}async begin(e){return await this.ensure(),this.transaction(async t=>e((s,...o)=>{let{sql:i,params:a}=Zu(s,o);return t.query(i,a)}))}frag(e,...t){let{sql:r,params:s}=Zu(e,t);return{__fragment:{sql:r,params:s}}}async unsafe(e,t){await this.ensure();let r=await this.acquire();try{return await r.query(e,t)}finally{this.release(r)}}async transaction(e){await this.ensure();let t=await this.acquire();try{await t.query("BEGIN");try{let r=await e({query:(s,o)=>t.query(s,o)});return await t.query("COMMIT"),r}catch(r){throw await t.query("ROLLBACK").catch(()=>{}),r}}finally{this.release(t)}}async close(){this.closed=!0,this.idleTimer&&(clearInterval(this.idleTimer),this.idleTimer=null),this.readyPromise=null,this.available=[],await Promise.all(this.all.map(t=>t.close())),this.all=[];let e=this.waiters;this.waiters=[];for(let t of e)t.timer&&clearTimeout(t.timer),t.reject(new ce("postgres: pool is closed"))}get size(){return this.available.length+this.waiters.length}}});import{randomUUID as Zk}from"node:crypto";function Bg(n){if(Array.isArray(n))return n;if(typeof n=="string")try{let e=JSON.parse(n);if(Array.isArray(e))return e}catch{}return n==null?[]:[n]}function Hg(n){if(Array.isArray(n))return n;if(typeof n=="string")try{let e=JSON.parse(n);if(Array.isArray(e))return e}catch{}return n==null?[]:[]}function Fg(n,e){let t=0,r=0,s=0,o=Math.min(n.length,e.length);for(let i=0;i<o;i++)t+=n[i]*e[i],r+=n[i]*n[i],s+=e[i]*e[i];return r&&s?t/(Math.sqrt(r)*Math.sqrt(s)):0}function Xu(n,e,t,r){if(typeof t!="object"||t===null)return t;let s=t;if("__jsonbAppend"in s)return[...Bg(e),...Bg(s.__jsonbAppend)];if("__inc"in s)return Number(e??0)+Number(s.__inc);if("__now"in s)return new Date().toISOString();if("__interval"in s){let[o,i]=s.__interval;return new Date(Date.now()+o*Kg(i)).toISOString()}return"__colRef"in s?r[String(s.__colRef)]:"__monthStart"in s?Gg(t):t}function Xk(n){return typeof n=="object"&&n!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(e=>e in n)}function Kg(n){switch(n){case"day":return 864e5;case"hour":return 36e5;case"minute":return 6e4;default:return 1e3}}function Gg(n){if(typeof n=="object"&&n!==null){if("__interval"in n){let[e,t]=n.__interval;return new Date(Date.now()+e*Kg(t)).toISOString()}if("__monthStart"in n){let e=new Date;return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),1)).toISOString()}}return n}function Rr(n,e){let t=n;return Object.defineProperty(t,"affectedRows",{value:e,enumerable:!1,writable:!0,configurable:!0}),t}function bi(n,e){let t={};for(let r of e)r in n&&(t[r]=n[r]);return t}function Yk(n,e,t,r,s){for(let o of e){if(o==="*"||o===""||/^\d+$/.test(o)||!/^[\w.]+$/.test(o)||s?.has(o)||s?.has(o.slice(o.lastIndexOf(".")+1)))continue;let i=o.includes(".")?o.slice(o.lastIndexOf(".")+1):o;if(t.some(l=>l.cols.has(i)))continue;let a=[...new Set(t.flatMap(l=>[...l.cols]))].sort();throw new ue("\u672A\u77E5\u5217",`memory-sql: ${n} \u672A\u77E5\u5217 '${o}'\u2014\u2014${r} \u5408\u6CD5\u5217\uFF1A${a.join(", ")}`)}}function Yu(n){let e=[];for(let[t,r]of Object.entries(n)){if(t==="or"||t==="and"){for(let s of r)e.push(...Yu(s));continue}t!=="__raw"&&(e.push(t),typeof r=="object"&&r!==null&&!Array.isArray(r)&&"col"in r&&e.push(String(r.col)))}return e}function gt(n,e,t){if(n==null)return;if(e in n)return n[e];let r=e.indexOf(".");if(r>=0){let s=e.slice(r+1);return s in n?n[s]:void 0}for(let[s,o]of Object.entries(n))if(s.slice(s.indexOf(".")+1)===e)return o}function Er(n){let e=n.lastIndexOf(".");return e>=0?n.slice(e+1):n}function eS(n){let e={};for(let[t,r]of Object.entries(n))e[Er(t)]=r;return e}function Ns(n){return typeof n=="object"&&n!==null&&"__raw"in n}function ec(n,e="where"){if(n)for(let[t,r]of Object.entries(n)){if(r===void 0)throw new ue(`weifuwu/db: ${e}.${t} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&ec(r,`${e}.${t}`)}}function Ot(n,e,t){for(let[r,s]of Object.entries(e)){if(r==="or"){if(!s.some(i=>Ot(n,i,t)))return!1;continue}if(r==="and"){if(!s.every(i=>Ot(n,i,t)))return!1;continue}if(typeof s=="object"&&s!==null){let o=s,i=gt(n,r,t);if(!["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"].some(u=>o[u]!==void 0)){if(!yt(i,s))return!1;continue}let l=u=>{if(typeof u=="object"&&u!==null&&("__interval"in u||"__monthStart"in u))return Gg(u);if(!Ns(u))return u;let c=u.__raw.trim(),d=/^now\(\)\s*-\s*interval\s*'([0-9]+)\s*(days?|hours?|minutes?)'$/i.exec(c);if(/^now\(\)$/i.test(c))return new Date().toISOString();if(d){let f=Number(d[1]),w=d[2].toLowerCase(),m=w.startsWith("day")?f*864e5:w.startsWith("hour")?f*36e5:f*6e4;return new Date(Date.now()-m).toISOString()}let p=/^date_trunc\('(month|day|week|hour|minute)',\s*now\(\)\)$/i.exec(c);if(p){let f=new Date,w=p[1].toLowerCase();return w==="month"?new Date(Date.UTC(f.getUTCFullYear(),f.getUTCMonth(),1)).toISOString():w==="day"?new Date(Date.UTC(f.getUTCFullYear(),f.getUTCMonth(),f.getUTCDate())).toISOString():w==="hour"?new Date(f.setUTCMinutes(0,0,0)).toISOString():w==="minute"?new Date(f.setUTCSeconds(0,0)).toISOString():new Date(f).toISOString()}throw new ue("WHERE \u503C\u8868\u8FBE\u5F0F",`memory-sql: WHERE \u503C\u8868\u8FBE\u5F0F\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09\uFF1A${c}`)};if(o.col!==void 0&&!yt(i,gt(n,o.col,t))||o.eq!==void 0&&!yt(i,l(o.eq))||o.gt!==void 0&&_i(i,l(o.gt))<=0||o.gte!==void 0&&_i(i,l(o.gte))<0||o.lt!==void 0&&_i(i,l(o.lt))>=0||o.lte!==void 0&&_i(i,l(o.lte))>0||o.ne!==void 0&&yt(i,l(o.ne))||o.in&&!o.in.some(u=>yt(i,l(u)))||o.notIn&&o.notIn.some(u=>yt(i,l(u)))||o.like!==void 0&&(i==null||!Vg(o.like).test(String(i)))||o.ilike!==void 0&&(i==null||!Vg(o.ilike,!0).test(String(i))))return!1;if(o.between){let[u,c]=o.between;if(!(Number(i)>=Number(u)&&Number(i)<=Number(c)))return!1}if(o.isNull!==void 0&&i==null!==o.isNull)return!1;continue}throw process.env.PGDBG2&&console.error("[mmw where]",JSON.stringify({col:r,field:s})),new ue("WHERE \u503C\u5F62\u6001",`memory-sql: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\u2014\u2014\u7528 { eq: v } / { in: [...] } / { isNull: true }\uFF09`)}return!0}function Vg(n,e=!1){let t="";for(let r=0;r<n.length;r++){let s=n[r];if(s==="\\"){let o=n[r+1];if(o==="%"||o==="_"||o==="\\"){t+=zg(o),r++;continue}t+="\\\\";continue}if(s==="%"){t+=".*";continue}if(s==="_"){t+=".";continue}t+=zg(s)}return new RegExp(`^${t}$`,e?"i":"")}function zg(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _i(n,e){if(typeof n=="number"&&typeof e=="number")return n>e?1:n<e?-1:0;let t=String(n),r=String(e);return t>r?1:t<r?-1:0}function yt(n,e){return n===e?!0:n===null||e===null?!1:typeof n=="object"&&typeof e=="object"?JSON.stringify(n)===JSON.stringify(e):!1}function Qg(n){let e=n??new qn;return{orm:_n(Yn(e)),mem:e,close:async()=>e.close()}}var qn,tc=I(()=>{"use strict";ye();Ke();ns();er();qn=class{opts;constructor(e){this.opts=e}tables=new Map;enums=new Map;async close(){}executeQuery(e){let t;switch(e.kind){case"select":t=this.execSelect(e);break;case"insert":t=this.execInsert(e);break;case"update":t=this.execUpdate(e);break;case"delete":t=this.execDelete(e);break;case"ddl":return this.executeDdl(e)}return this.jsonDecodeRows(e.table,t)}jsonDecodeRows(e,t){if(!e||!this.tables.has(e))return t;let r=this.tables.get(e),s=r.columnTypes,o=new Set(Object.entries(s).filter(([,a])=>/^(jsonb?|vector(?:\\(\d+\\))?)$/i.test(a)).map(([a])=>a)),i=a=>{if(typeof a!="string")return!1;try{let l=JSON.parse(a);return typeof l=="object"&&l!==null}catch{return!1}};for(let a of t)if(!(typeof a!="object"||a===null))for(let l of Object.keys(a)){let u=l.includes(".")?l.slice(l.lastIndexOf(".")+1):l;if((r.state==="declared"?o.has(u):i(a[l]))&&typeof a[l]=="string")try{a[l]=JSON.parse(a[l])}catch{}}return t}tableCols(e){let t=this.table(e),r=new Set(t.columns);for(let s of t.rows)for(let o of Object.keys(s))r.add(Er(o));return r}assertKnownCols(e,t,r){if(this.opts?.validateCols===!1||r)return;let s=[{alias:t.alias??t.table,cols:this.tableCols(t.table)}];for(let a of t.joins??[])s.push({alias:a.alias??a.table,cols:this.tableCols(a.table)});let o=new Set((t.aggregate??[]).map(a=>a.as)),i=[];t.where&&i.push(...Yu(t.where));for(let a of t.joins??[])Ns(a.on)||i.push(...Yu(a.on));for(let a of t.cols??[])typeof a=="string"&&i.push(a);for(let a of t.orderBy??[])o.has(a.col)||i.push(a.col);if(t.groupBy)for(let a of t.groupBy)o.has(a)||i.push(a);i.length&&Yk(e,i,s,t.table,o)}execSelect(e,t){if(e.table&&(this.assertTableExists("SELECT",e.table),this.assertKnownCols("SELECT",e,t)),e.count){let u=this.table(e.table),c=e.where?u.rows.filter(p=>Ot(p,e.where,e.alias)).length:u.rows.length,d=e.cols?.[0]??"count";return Rr([{[d]:c}],1)}let r=this.table(e.table).rows,s=e.alias??e.table;for(let u of e.joins??[]){let c=this.table(u.table).rows,d=u.alias??u.table,p=u.type==="left",f=[];for(let w of r){let m=!1;for(let g of c){let h={};for(let[b,k]of Object.entries(w))h[b.includes(".")?b:`${s}.${b}`]=k;for(let[b,k]of Object.entries(g))h[`${d}.${b}`]=k;if(Ns(u.on))throw new ue("raw JOIN","memory-sql: raw JOIN ON \u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");Ot(h,u.on,void 0)&&(f.push(h),m=!0)}if(!m&&p){let g={};for(let[h,b]of Object.entries(w))g[h.includes(".")?h:`${s}.${h}`]=b;f.push(g)}}r=f,s=d}let o=u=>{if(!t)return u;let c={};for(let[d,p]of Object.entries(u))c[`${e.alias??e.table}.${d}`]=p;for(let[d,p]of Object.entries(t.row))c[`${t.alias}.${d}`]=p;return c},i=e.where;ec(i);let a=i?r.filter(u=>Ot(o(u),i,e.alias)):r;for(let u of e.sub??[])a=a.filter(c=>{let d=this.execSelect(u.query,{row:c,alias:s});if(u.type==="exists")return u.not?d.length===0:d.length>0;let p=new Set(d.map(w=>w[String(u.query.cols?.[0]??Object.keys(w)[0])])),f=gt(c,u.col,s);return u.not?!p.has(f):p.has(f)});let l;if(e.aggregate?.length){let u=new Map;for(let c of a){let d=(e.groupBy??[]).map(p=>JSON.stringify(gt(c,p,s))).join("|");u.has(d)||u.set(d,[]),u.get(d).push(c)}if(!u.size&&!e.groupBy?.length&&u.set("",[]),l=[...u.values()].map(c=>{let d={};for(let p of e.groupBy??[])d[p]=gt(c[0],p,s);for(let p of e.aggregate){let f=p.col==="*"?void 0:gt(c[0],p.col,s),w=p.filter?c.filter(g=>Ot(g,p.filter,void 0)):c,m=p.col==="*"?w:w.map(g=>gt(g,p.col,s));p.fn==="count"?d[p.as]=m.length:m.length?p.fn==="sum"?d[p.as]=m.reduce((g,h)=>g+Number(h??0),0):p.fn==="avg"?d[p.as]=m.length?m.reduce((g,h)=>g+Number(h??0),0)/m.length:0:p.fn==="min"?d[p.as]=m.reduce((g,h)=>h!==null&&(g===null||h<g)?h:g,null):p.fn==="max"&&(d[p.as]=m.reduce((g,h)=>h!==null&&(g===null||h>g)?h:g,null)):d[p.as]=null}return d}),e.having){let c=new Map;for(let p of e.aggregate??[])c.set(`${p.fn}(${p.col==="*"?"*":p.col})`,p.as);let d={};for(let[p,f]of Object.entries(e.having))d[c.get(p)??p]=f;l=l.filter(p=>Ot(p,d,void 0))}}else if(e.cols?.length){let u=new Set(this.table(e.table).columns);for(let c of e.joins??[])for(let d of this.table(c.table).columns)u.add(d);l=a.map(c=>{let d={};for(let p of e.cols){if(Ns(p))throw new ue("raw \u6295\u5F71","memory-sql: raw \u6295\u5F71\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");let f=/^(.+?)\s+AS\s+([\w.]+)$/i.exec(p);if(f)d[f[2]]=gt(c,f[1].trim());else{let w=Er(p),m=gt(c,p);d[w]=m===void 0&&u.has(w)?null:m}}return e.vector&&(d[e.vector.as]=Fg(Hg(gt(c,e.vector.col,s)),e.vector.vec)),d})}else l=a.map(u=>{let c={},d=e.joins?.length?u:eS(u);for(let[p,f]of Object.entries(d))c[Er(p)]=f;return c});if(e.distinct){let u=new Set;l=l.filter(c=>{let d=JSON.stringify(c);return u.has(d)?!1:(u.add(d),!0)})}if(e.vector&&(l=l.map(u=>({r:u,sim:Fg(Hg(gt(u,e.vector.col,s)),e.vector.vec)})).sort((u,c)=>c.sim-u.sim).map(u=>u.r)),e.orderBy?.length){let u=e.orderBy;l=l.map((c,d)=>({r:c,idx:d})).sort((c,d)=>{for(let p of u){let f=c.r[Er(p.col)],w=d.r[Er(p.col)];if(f===w)continue;let m=typeof f=="number"&&typeof w=="number"?f>w?1:-1:String(f)>String(w)?1:-1;return p.dir==="desc"?-m:m}return d.idx-c.idx}).map(c=>c.r)}return e.offset!==void 0&&(l=l.slice(e.offset)),e.limit!==void 0&&(l=l.slice(0,e.limit)),Rr(l,l.length)}execInsert(e){let t=this.obtain(e.table),r=[],s=0,o=e.rows.map(i=>({...i}));for(let i of o){let a=Object.keys(i);t.pk&&!(t.pk.col in i)&&(i[t.pk.col]=t.pk.defaultUuid?Zk():`mem-${t.nextId}`);for(let u of t.defaultNow)u in i||(i[u]=new Date().toISOString());for(let[u,c]of t.defaultVals)u in i||(i[u]=c);for(let u of Object.keys(i))i[u]=Xu(u,void 0,i[u],i);let l;for(let u of t.uniques)if(u in i&&i[u]!=null){let c=t.rows.find(d=>yt(d[u],i[u]));if(c){l={u,row:c};break}}if(!l){for(let u of t.groups)if(u.every(c=>c in i&&i[c]!=null)){let c=t.rows.find(d=>u.every(p=>yt(d[p],i[p])));if(c){l={u:u.join(","),row:c};break}}}if(l){if(!e.onConflict)throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l.u}"`,409);if(e.onConflict.update){if(e.onConflict.merge)for(let[u,c]of Object.entries(e.onConflict.merge))l.row[u]=Xu(u,l.row[u],c,l.row);else{let u=Array.isArray(e.onConflict.col)?new Set(e.onConflict.col):e.onConflict.col?new Set([e.onConflict.col]):null;for(let c of a)u?.has(c)||(l.row[c]=i[c])}s++,e.returning&&r.push(e.returning==="*"?{...l.row}:bi(l.row,e.returning))}continue}t.rows.push(i),t.nextId++,s++,e.returning&&r.push(e.returning==="*"?{...i}:bi(i,e.returning))}return Rr(r,s)}execUpdate(e){let t=this.table(e.table),r=[],s=[];for(let i of t.rows)if(!e.where||Ot(i,e.where,void 0)){let a={...i};for(let[l,u]of Object.entries(e.sets))if(Xk(u))a[l]=Xu(l,a[l],u,a);else if(Ns(u))if(/^now\(\)$/i.test(u.__raw.trim()))a[l]=new Date().toISOString();else throw new ue("raw SET","memory-sql: raw SET \u503C\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");else a[l]=u;s.push({row:i,next:a})}let o=new Map(s.map(i=>[i.row,i.next]));for(let{row:i,next:a}of s){for(let l of t.uniques){if(!(l in a)||a[l]==null)continue;if(t.rows.some(c=>c!==i&&yt((o.get(c)??c)[l],a[l])))throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l}"`,409)}for(let l of t.groups){if(!l.every(c=>c in a&&a[c]!=null))continue;if(t.rows.some(c=>c!==i&&l.every(d=>yt((o.get(c)??c)[d],a[d]))))throw new T(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${l.join(", ")}"`,409)}}for(let{row:i,next:a}of s){for(let[l,u]of Object.entries(a))i[l]=u;e.returning&&r.push(e.returning==="*"?{...i}:bi(i,e.returning))}return Rr(r,s.length)}execDelete(e){ec(e.where);let t=this.table(e.table),r=t.rows.length,s=[],o=[];for(let i of t.rows)!e.where||Ot(i,e.where,void 0)?e.returning&&o.push(e.returning==="*"?{...i}:bi(i,e.returning)):s.push(i);return t.rows=s,Rr(o,r-s.length)}assertTableExists(e,t){if(t&&!this.tables.has(t))throw new ue("relation",`memory-sql: ${e} \u8868 '${t}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`)}table(e){let t=this.tables.get(e);if(!t)throw new ue("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`);return t}obtain(e){let t=this.tables.get(e);return t||(t={state:"observed",rows:[],nextId:1,uniques:new Set,groups:[],defaultNow:new Set,defaultVals:new Map,columns:[],columnTypes:{}},this.tables.set(e,t)),t}toDeclared(e){let t=this.obtain(e);return t.state="declared",t}hasTable(e){return this.tables.has(e)}inspectTable(e){let t=this.tables.get(e);if(!t)throw new ue("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF0842P01\uFF09`);return{state:t.state,columns:[...t.columns],columnTypes:{...t.columnTypes},constraints:{pk:t.pk?{...t.pk}:void 0,uniques:[...t.uniques],groups:t.groups.map(r=>[...r]),defaultNow:[...t.defaultNow],defaultVals:{...t.defaultVals}}}}schemaSnapshot(){let e=[];for(let[t,r]of this.tables)e.push({name:t,columns:r.columns.map(s=>({name:s,type:(r.columnTypes[s]??"TEXT").toLowerCase()}))});return e}getColumnType(e,t){return this.tables.get(e)?.columnTypes[t]}getColumnTypes(e){return this.tables.get(e)?.columns.map(t=>this.tables.get(e).columnTypes[t]??"text")??[]}snapshot(){let e=new Map;for(let[t,r]of this.tables)e.set(t,{rows:r.rows.map(s=>({...s})),nextId:r.nextId,columns:[...r.columns],columnTypes:{...r.columnTypes},pk:r.pk?{...r.pk}:void 0,uniques:[...r.uniques],groups:r.groups.map(s=>[...s]),state:r.state,defaultNow:[...r.defaultNow],defaultVals:Object.fromEntries(r.defaultVals)});return e}restore(e){let t=new Set;for(let[r,s]of e)this.tables.set(r,{state:s.state,rows:s.rows.map(o=>({...o})),nextId:s.nextId,columns:[...s.columns],columnTypes:{...s.columnTypes},pk:s.pk?{...s.pk}:void 0,uniques:new Set(s.uniques),groups:(s.groups??[]).map(o=>[...o]),defaultNow:new Set(s.defaultNow),defaultVals:new Map(Object.entries(s.defaultVals??{}))}),t.add(r);for(let r of this.tables.keys())t.has(r)||this.tables.delete(r)}applySchema(e){for(let t of e.tables??[]){let r=this.toDeclared(t.name);r.columns=[],r.columnTypes={};for(let[s,o]of Object.entries(t.columns)){let i=o,a=i.metaInfo,l=a.column??s;r.columns.push(l),r.columnTypes[l]=(t.columnTypes?.[l]??Ut(i)).toLowerCase(),a.pk&&(r.pk={col:l,defaultUuid:a.default==="random"}),a.unique&&r.uniques.add(l),a.default==="now"?r.defaultNow.add(l):a.default!==void 0&&a.default!=="random"&&r.defaultVals.set(l,a.default)}for(let s of t.uniques??[])s.length>1&&r.groups.push(s)}}executeDdl(e){if(e.op==="createTable"&&e.table){let t=this.toDeclared(e.table),r=(e.columns??[]).filter(s=>s.type!=="table-constraint");if(t.columns.length===0){t.columns=r.map(s=>s.name);for(let s of r)t.columnTypes[s.name]=s.type.toLowerCase()}else{for(let s of r)t.columns.includes(s.name)||(t.columns.push(s.name),t.columnTypes[s.name]=s.type.toLowerCase());for(let s of t.rows)for(let o of r)!(o.name in s)&&o.defaultVal!==void 0&&(s[o.name]=o.defaultVal)}for(let s of e.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&t.groups.push(s.constraintCols);continue}s.pk&&(t.pk={col:s.name,defaultUuid:s.defaultUuid}),s.unique&&t.uniques.add(s.name),s.defaultNow&&t.defaultNow.add(s.name),s.defaultVal!==void 0&&t.defaultVals.set(s.name,s.defaultVal)}}else if(e.op==="alterAddColumn"&&e.table&&e.column){let t=this.table(e.table);if(!t.columns.includes(e.column)&&(t.columns.push(e.column),e.columnType&&(t.columnTypes[e.column]=e.columnType),e.defaultVal!==void 0)){let r=typeof e.defaultVal=="object"&&e.defaultVal!==null&&"__now"in e.defaultVal?new Date().toISOString():e.defaultVal;t.defaultVals.set(e.column,r);for(let s of t.rows)e.column in s||(s[e.column]=r)}}else if(e.op==="dropTable"&&e.table)this.tables.delete(e.table);else if(e.op==="dropEnum"&&e.table)this.enums.delete(e.table);else if(e.op==="alterEnumAddValue"&&e.table){let t=this.enums.get(e.table)??[];for(let r of e.enumValues??[])t.includes(r)||t.push(r);this.enums.set(e.table,t)}else e.op==="createEnum"&&e.table&&(this.enums.has(e.table)||this.enums.set(e.table,e.enumValues??[]));return Rr([],0)}}});import{AsyncLocalStorage as tS}from"node:async_hooks";function Tr(n){let e=typeof n=="string"?{connection:n}:n??{};if(e.memory)return nS(e);let t=e.connection??process.env.DATABASE_URL;if(!t)throw new Error("postgres: DATABASE_URL is not set. Pass a connection string or set the DATABASE_URL environment variable.");let r=new URL(t),s=new yi({host:r.hostname,port:Number(r.port||5432),user:decodeURIComponent(r.username),password:decodeURIComponent(r.password),database:r.pathname.replace(/^\//,""),poolSize:e.max??e.poolSize??10,acquireTimeoutMs:e.acquireTimeoutMs,statementTimeoutMs:e.statementTimeoutMs??e.statementTimeout,idleTimeoutMs:e.idle_timeout,onQuery:e.onQuery?(a,l,u)=>{let c=Jg.getStore();e.onQuery?.(a,l,u,c||void 0)}:void 0}),o=_n(To({query:(a,l)=>rS(s.query(a,l)),transaction:(a=>s.transaction(a))},mp),e.tenant),i=((a,l,u)=>(l.orm=e.tenant?o.withCtx(l):o,Jg.run(a.headers.get("x-trace-id")??"",()=>u(a,l))));return i.__meta={injects:["orm"],depends:[]},i.orm=o,i.migrate=async()=>{await s.unsafe(`
163
163
  CREATE TABLE IF NOT EXISTS "_weifuwu_migrations" (
164
164
  name TEXT PRIMARY KEY,
165
165
  applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
166
166
  )
167
- `)},o.markMigrated=async a=>{await s.unsafe('INSERT INTO "_weifuwu_migrations" (name) VALUES ($1) ON CONFLICT DO NOTHING',[a])},o.isMigrated=async a=>(await s.unsafe('SELECT 1 FROM "_weifuwu_migrations" WHERE name = $1',[a])).length>0,o.runMigration=async(a,l)=>{await o.isMigrated(a)||(await s.unsafe(l),await o.markMigrated(a))},o.migrateModule=async(a,l)=>{await o.runMigration(a,vo(Xr(l)))},o.transaction=i.transaction,o.poolStats=()=>({active:0,idle:s.size,waiting:0,max:s.size}),o.checkConsistency=async()=>{let a=await s.unsafe(`
167
+ `)},i.markMigrated=async a=>{await s.unsafe('INSERT INTO "_weifuwu_migrations" (name) VALUES ($1) ON CONFLICT DO NOTHING',[a])},i.isMigrated=async a=>(await s.unsafe('SELECT 1 FROM "_weifuwu_migrations" WHERE name = $1',[a])).length>0,i.runMigration=async(a,l)=>{await i.isMigrated(a)||(await s.unsafe(l),await i.markMigrated(a))},i.migrateModule=async(a,l)=>{await i.runMigration(a,So(ts(l)))},i.transaction=o.transaction,i.poolStats=()=>({active:0,idle:s.size,waiting:0,max:s.size}),i.checkConsistency=async()=>{let a=await s.unsafe(`
168
168
  SELECT table_name AS tbl, column_name AS col, data_type AS dt
169
169
  FROM information_schema.columns WHERE table_schema = current_schema()
170
- `),l=new Map;for(let u of a){let c=u.tbl;l.has(c)||l.set(c,{name:c,columns:[]}),l.get(c).columns.push({name:u.col,type:u.dt})}return es(i.tables(),[...l.values()])},o.close=()=>s.close(),o}function rS(n={}){let e=new qn,t=_n(Yn(e),n.tenant),r=new Set,s=((i,o,a)=>(o.orm=n.tenant?t.withCtx(o):t,a(i,o)));return s.__meta={injects:["orm"],depends:[]},s.orm=t,s.migrate=async()=>{e.executeQuery({kind:"ddl",op:"createTable",table:"_weifuwu_migrations",ifNotExists:!0,columns:[{name:"name",type:"TEXT",pk:!0,unique:!1,defaultNow:!1,defaultUuid:!1,nullable:!1},{name:"applied_at",type:"TIMESTAMPTZ",pk:!1,unique:!1,defaultNow:!0,defaultUuid:!1,nullable:!1}]})},s.markMigrated=async i=>{r.add(i)},s.isMigrated=async i=>{if(r.has(i))return!0;try{return e.executeQuery({kind:"select",table:"_weifuwu_migrations",cols:["name"],where:{name:{eq:i}}}).length>0}catch{return!1}},s.migrateModule=async(i,o)=>{for(let a of Xr(o))e.executeQuery(a);await s.isMigrated(i)||await s.markMigrated(i)},s.transaction=t.transaction,s.poolStats=()=>({active:0,idle:0,waiting:0,max:1}),s.checkConsistency=async()=>es(t.tables(),e.schemaSnapshot()),s.close=async()=>{},s}function sS(n){return n.catch(e=>{let t=e?.code;throw t&&Qg[t]?new T(`\u6570\u636E\u5E93\u9519\u8BEF: ${e.message}`,Qg[t]):e})}var Yu,Gg,Qg,Jg=N(()=>{"use strict";Lg();ze();Va();Yr();Ua();er();Xu();Yu="_weifuwu_migrations",Gg=new nS;Qg={23505:409,23503:400,23502:400,23514:400,"22P02":400,22003:400}});var Zg=N(()=>{"use strict";Jg()});function Is(n,e){return n instanceof Uint8Array?e?Yg.decode(n):n:Array.isArray(n)?n.map(t=>Is(t,e)):n}function _i(n){let e=new Array(n.length),t=Xg(n.length);for(let o=0;o<n.length;o++){let a=n[o],l=typeof a=="string"?Buffer.byteLength(a):a instanceof Buffer?a.length:String(a).length;e[o]=l,t+=Xg(l)+l+2}let r=new Uint8Array(t),s=0,i=`*${n.length}\r
171
- `;r.set(bi.encode(i),0),s=i.length;for(let o=0;o<n.length;o++){let a=n[o],l=e[o],u=`$${l}\r
172
- `;r.set(bi.encode(u),s),s+=u.length,typeof a=="string"?r.set(bi.encode(a),s):a instanceof Buffer?r.set(a,s):r.set(bi.encode(String(a)),s),s+=l,r[s]=13,r[s+1]=10,s+=2}return r}function Xg(n){return n<10?4:n<100?5:n<1e3?6:n<1e4?7:8}function oS(n,e=0){let t=n.indexOf(13,e);for(;t!==-1;){if(t+1<n.length&&n[t+1]===10)return t;t=n.indexOf(13,t+1)}return-1}var bt,Yg,bi,Cr,vi=N(()=>{"use strict";ye();ye();bt=class extends Error{constructor(){super("incomplete RESP message"),this.name="IncompleteError"}};Yg=new TextDecoder,bi=new TextEncoder,Cr=class{buf=new Uint8Array(0);off=0;push(e){this.append(e);let t=this.off;try{let r=this.parseValue();return this.compact(),{value:r,incomplete:!1}}catch(r){if(this.off=t,r instanceof bt)return{value:null,incomplete:!0};throw r}}pushAll(e){this.append(e);let t=[];for(;;){let r=this.off;try{t.push(this.parseValue())}catch(s){if(this.off=r,s instanceof bt)break;throw s}}return t.length>0&&this.compact(),t}append(e){if(e.length===0)return;let t=this.buf.length-this.off;if(t===0){this.buf=e,this.off=0;return}let r=new Uint8Array(t+e.length);r.set(this.buf.subarray(this.off),0),r.set(e,t),this.buf=r,this.off=0}compact(){this.off===this.buf.length?(this.buf=new Uint8Array(0),this.off=0):this.off>0&&(this.buf=this.buf.subarray(this.off),this.off=0)}parseValue(){if(this.buf.length-this.off<3)throw new bt;let e=String.fromCharCode(this.buf[this.off]);switch(this.off++,e){case"+":return this.readLine();case"-":{let t=this.readLine();return new fn(t)}case":":return this.readInt();case"$":{let t=this.readInt();return t===-1?null:this.readBulkBytes(t)}case"*":{let t=this.readInt();if(t===-1)return null;let r=[];for(let s=0;s<t;s++)r.push(this.parseValue());return r}default:throw new Le("protocol",`unknown RESP type byte: ${e}`,{code:"RESP"})}}readInt(){let e=this.buf,t=this.off,r=!1;t<e.length&&e[t]===45&&(r=!0,t++);let s=0;for(;t<e.length&&e[t]>=48&&e[t]<=57;)s=s*10+(e[t]-48),t++;if(t+1<e.length&&e[t]===13&&e[t+1]===10)return this.off=t+2,r?-s:s;throw new bt}readLine(){let e=oS(this.buf,this.off);if(e===-1)throw new bt;let t=Yg.decode(this.buf.subarray(this.off,e));return this.off=e+2,t}readBulkBytes(e){if(this.buf.length-this.off<e+2)throw new bt;let t=this.buf.subarray(this.off,this.off+e);return this.off+=e+2,t}}});import iS from"node:net";var aS,lS,rn,ki=N(()=>{"use strict";vi();ye();aS=new Set(["message","pmessage"]),lS=new Set(["BLPOP","BRPOP","BLMPOP","BRPOPLPUSH","BZPOPMIN","BZPOPMAX","WAIT","XREAD","XREADGROUP"]),rn=class{ready=!1;opts;socket=null;parser=new Cr;pending=[];pendingHead=0;offlineQueue=[];subs=new Map;psubs=new Map;status="idle";retries=0;reconnectTimer=null;socketTimeoutTimer=null;connectPromise=null;closed=!1;connectedOnce=!1;constructor(e={}){this.opts={host:e.host??"127.0.0.1",port:e.port??6379,retryDelayMs:e.retryDelayMs??100,maxRetries:e.maxRetries??10,enableOfflineQueue:e.enableOfflineQueue??!0,maxOfflineQueue:e.maxOfflineQueue??5e3,commandTimeoutMs:e.commandTimeoutMs??0,socketTimeoutMs:e.socketTimeoutMs??0,onCommand:e.onCommand}}connect(){return this.connectPromise?this.connectPromise:(this.closed=!1,this.connectPromise=new Promise((e,t)=>{this.openSocket(),this.onceReady=()=>e(),this.onceFailed=r=>t(r)}).finally(()=>{this.connectPromise=null,this.onceReady=void 0,this.onceFailed=void 0}),this.connectPromise)}onceReady;onceFailed;openSocket(){this.status="connecting";let e=iS.connect(this.opts.port,this.opts.host);this.socket=e,e.on("connect",()=>{if(e.setNoDelay(!0),this.status="ready",this.retries=0,this.connectedOnce){for(let t of this.subs.keys())this.sendNow("SUBSCRIBE",[t]);for(let t of this.psubs.keys())this.sendNow("PSUBSCRIBE",[t])}this.connectedOnce=!0,this.flushOffline(),this.onceReady?.()}),e.on("data",t=>this.onData(new Uint8Array(t))),e.on("error",t=>{this.status==="connecting"&&this.handleDisconnect(t)}),e.on("close",()=>{this.socket=null,this.status!=="closed"&&this.status!=="idle"&&this.handleDisconnect(new ce("redis: socket closed"))})}handleDisconnect(e){let t=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of t)s.reject(e);if(this.clearSocketTimeout(),this.closed||this.status==="closed")return;if(this.retries++,this.status="connecting",this.opts.maxRetries>0&&this.retries>this.opts.maxRetries){this.status="closed";let s=e instanceof ce?e:new ce(`redis: connect to ${this.opts.host}:${this.opts.port} failed`,this.retries,e);this.onceFailed?.(s);return}let r=Math.min(this.opts.retryDelayMs*2**(this.retries-1),5e3);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.openSocket()},r)}onData(e){try{let t=this.parser.pushAll(e);for(let r of t){let s=Array.isArray(r)&&r.length>0?Is(r[0],!0):void 0;if(typeof s=="string"&&aS.has(s)){this.dispatchSubscribe(Is(r,!0));continue}let i=this.pending[this.pendingHead++];if(!i)break;i.timedOut||(r instanceof fn?i.reject(r):i.resolve(Is(r,!i.asBuffer)))}this.pendingHead>64&&this.pendingHead*2>this.pending.length&&(this.pending=this.pending.slice(this.pendingHead),this.pendingHead=0),this.opts.socketTimeoutMs>0&&(this.pendingHead<this.pending.length?this.armSocketTimeout():this.clearSocketTimeout())}catch(t){let r=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of r)s.reject(t);this.socket?.destroy()}}command(e,...t){let r=t[t.length-1],s=typeof r=="object"&&r!==null&&!(r instanceof Uint8Array)?t.pop():void 0;return this.status==="ready"&&this.socket&&!this.socket.destroyed?this.sendNow(e,t,s?.asBuffer):this.closed||this.status==="closed"||!this.opts.enableOfflineQueue?Promise.reject(new ce("redis: not connected")):this.offlineQueue.length>=this.opts.maxOfflineQueue?Promise.reject(new ce(`redis: offline queue full (${this.opts.maxOfflineQueue})`)):new Promise((i,o)=>{this.offlineQueue.push({name:e,args:t,resolve:i,reject:o,asBuffer:s?.asBuffer})})}sendNow(e,t,r){let s=performance.now();return new Promise((i,o)=>{let a={resolve:i,reject:o,asBuffer:r,blocking:lS.has(e.toUpperCase())};this.armTimeout(a),this.pending.push(a),this.armSocketTimeout(),this.socket.write(_i([e,...t]),l=>{if(l){let u=this.pending.indexOf(a);u>=0&&this.pending.splice(u,1),a.reject(l instanceof Error?l:new ce("redis: socket write failed"))}})}).then(i=>(this.opts.onCommand&&this.opts.onCommand(e,t,performance.now()-s),i),i=>{throw this.opts.onCommand&&this.opts.onCommand(e,t,performance.now()-s),i})}armTimeout(e){let t=this.opts.commandTimeoutMs;t<=0||(e.timer=setTimeout(()=>{e.timedOut=!0,e.blocking?e.resolve(null):e.reject(new mn("redis: command timeout",t))},t))}armSocketTimeout(){let e=this.opts.socketTimeoutMs;e<=0||(this.clearSocketTimeout(),this.socketTimeoutTimer=setTimeout(()=>{this.socketTimeoutTimer=null;let t=new ce(`redis: socket timeout (no data in ${e}ms)`),r=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of r)s.reject(t);this.clearSocketTimeout(),this.socket?.destroy()},e))}clearSocketTimeout(){this.socketTimeoutTimer&&(clearTimeout(this.socketTimeoutTimer),this.socketTimeoutTimer=null)}flushOffline(){let e=this.offlineQueue;this.offlineQueue=[];for(let t of e)this.sendNow(t.name,t.args,t.asBuffer).then(t.resolve,t.reject)}batch(e,t){return this.status!=="ready"||!this.socket?Promise.reject(new ce("redis: not connected")):new Promise((r,s)=>{let i=[],o=[],a=!1,l=()=>{a||i.length===t&&(a=!0,u&&clearTimeout(u),r(i))};for(let d=0;d<t;d++){let p={resolve:m=>{i.push(m),l()},reject:m=>{i.push(m),l()}};o.push(p),this.pending.push(p)}let u,c=this.opts.commandTimeoutMs;c>0&&(u=setTimeout(()=>{a=!0;for(let d of o)d.timedOut=!0;s(new mn("redis: batch timeout",c))},c)),this.socket.write(e),this.armSocketTimeout()})}async subscribe(e,t){this.subs.set(e,t),await this.command("SUBSCRIBE",e)}async psubscribe(e,t){this.psubs.set(e,t),await this.command("PSUBSCRIBE",e)}dispatchSubscribe(e){let[t,r,s]=e;t==="message"?this.subs.get(r)?.(r,s):t==="pmessage"&&this.psubs.get(r)?.(s,e[3]??"")}async close(){this.closed=!0,this.status="closed",this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.clearSocketTimeout();let e=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of e)s.reject(new ce("redis: connection closed"));let t=this.offlineQueue;this.offlineQueue=[];for(let s of t)s.reject(new ce("redis: connection closed"));let r=this.socket;this.socket=null,r?.destroy()}get connected(){return this.status==="ready"}}});var Si,eh=N(()=>{"use strict";vi();Si=class{cmds=[];conn;constructor(e){this.conn=e}set(e,t,r){return this.cmds.push(r!==void 0?{name:"SET",args:[e,t,"EX",r]}:{name:"SET",args:[e,t]}),this}get(e){return this.cmds.push({name:"GET",args:[e]}),this}del(...e){return this.cmds.push({name:"DEL",args:e}),this}incr(e){return this.cmds.push({name:"INCR",args:[e]}),this}expire(e,t){return this.cmds.push({name:"EXPIRE",args:[e,t]}),this}ttl(e){return this.cmds.push({name:"TTL",args:[e]}),this}raw(e,...t){return this.cmds.push({name:e,args:t}),this}async exec(){let e=this.cmds;if(this.cmds=[],e.length===0)return[];let t=Buffer.concat(e.map(r=>Buffer.from(_i([r.name,...r.args]))));return this.conn.batch(t,e.length)}}});var Ps,th=N(()=>{"use strict";ki();eh();ye();Ps=class n{conn;constructor(e){this.conn=e}static async connect(e={}){let t=new rn(e);return await t.connect(),new n(t)}command(e,...t){return this.conn.command(e,...t)}get connected(){return this.conn.connected}async get(e){let t=await this.conn.command("GET",e);return t===null?null:String(t)}async getBuffer(e){let t=await this.conn.command("GET",e,{asBuffer:!0});return t===null?null:t instanceof Uint8Array?t:new TextEncoder().encode(String(t))}async set(e,t,r){let s=r!==void 0?await this.conn.command("SET",e,t,"EX",r):await this.conn.command("SET",e,t);return String(s)}async del(...e){let t=await this.conn.command("DEL",...e);return Number(t)}async incr(e){return Number(await this.conn.command("INCR",e))}async expire(e,t){return Number(await this.conn.command("EXPIRE",e,t))}async ttl(e){return Number(await this.conn.command("TTL",e))}async mget(...e){return(await this.conn.command("MGET",...e)).map(r=>r===null?null:String(r))}async mset(...e){let t=await this.conn.command("MSET",...e);return String(t)}async exists(...e){return Number(await this.conn.command("EXISTS",...e))}async setnx(e,t){return Number(await this.conn.command("SETNX",e,t))}async incrby(e,t){return Number(await this.conn.command("INCRBY",e,t))}async hset(e,t,r){return Number(await this.conn.command("HSET",e,t,r))}async hget(e,t){let r=await this.conn.command("HGET",e,t);return r===null?null:String(r)}async hgetall(e){let r=await this.conn.command("HGETALL",e),s={};for(let i=0;i+1<r.length;i+=2)s[String(r[i])]=String(r[i+1]);return s}async hdel(e,...t){return Number(await this.conn.command("HDEL",e,...t))}async lpush(e,...t){return Number(await this.conn.command("LPUSH",e,...t))}async rpush(e,...t){return Number(await this.conn.command("RPUSH",e,...t))}async lpop(e){let t=await this.conn.command("LPOP",e);return t===null?null:String(t)}async rpop(e){let t=await this.conn.command("RPOP",e);return t===null?null:String(t)}async lrange(e,t,r){return(await this.conn.command("LRANGE",e,t,r)).map(String)}async sadd(e,...t){return Number(await this.conn.command("SADD",e,...t))}async srem(e,...t){return Number(await this.conn.command("SREM",e,...t))}async smembers(e){return(await this.conn.command("SMEMBERS",e)).map(String)}async zadd(e,t,r){return Number(await this.conn.command("ZADD",e,t,r))}async zrange(e,t,r){return(await this.conn.command("ZRANGE",e,t,r)).map(String)}pipeline(){return new Si(this.conn)}async jsonGet(e){let t=await this.conn.command("GET",e);if(t===null)return null;try{return JSON.parse(String(t))}catch{throw new se(`redis: value of key '${e}' is not valid JSON`)}}async jsonSet(e,t,r){return this.set(e,JSON.stringify(t),r)}async cache(e,t,r){let s=await this.jsonGet(e);if(s!==null)return s;let i=await t();return i!==null&&await this.jsonSet(e,i,r),i}async close(){await this.conn.close()}}});var xi,nh=N(()=>{"use strict";ki();xi=class{conn;constructor(e={}){this.conn=new rn(e)}async connect(){await this.conn.connect()}subscribe(e,t){return this.conn.subscribe(e,t)}psubscribe(e,t){return this.conn.psubscribe(e,t)}async close(){await this.conn.close()}}});var Ri,rh=N(()=>{"use strict";th();ki();nh();ye();Ri=class n{clients=[];rr=0;replenishWaiters=[];closed=!1;keyPrefix;opts;initPromise=null;constructor(e={}){this.keyPrefix=e.keyPrefix??"",this.opts=e}static async create(e={}){let t=new n(e);return await t.ensure(),t}readyPromise=null;ensure(){return this.readyPromise?this.readyPromise:(this.initPromise||(this.initPromise=this.init()),this.initPromise)}async init(){let e=this.opts.poolSize??5;this.clients=await Promise.all(Array.from({length:e},()=>Ps.connect(this.opts))),this.readyPromise=Promise.resolve()}k(e){return this.keyPrefix+e}async acquireHealthy(){if(this.closed)throw new ce("redis: pool is closed");for(;this.clients.length>0;){let e=this.rr%this.clients.length;this.rr++;let t=this.clients[e];if(t.connected)return t;this.clients.splice(e,1),t.close().catch(()=>{}),this.replenish()}return new Promise((e,t)=>{let r=()=>{this.clients.length>0&&this.clients[0].connected?e(this.clients[0]):t(new ce("redis: pool exhausted after reconnect wait"))};this.replenishWaiters.push(r),setTimeout(()=>{let s=this.replenishWaiters.indexOf(r);s>=0&&this.replenishWaiters.splice(s,1),t(new ce("redis: no healthy connection available"))},1e3)})}replenish(){this.closed||Ps.connect(this.opts).then(e=>{if(this.closed){e.close();return}this.clients.push(e);let t=this.replenishWaiters;this.replenishWaiters=[];for(let r of t)r()}).catch(()=>{setTimeout(()=>this.replenish(),500)})}async createConnection(){await this.ensure();let e=new rn(this.opts);return await e.connect(),e}async command(e,...t){return await this.ensure(),(await this.acquireHealthy()).command(e,...t)}async get(e){return await this.ensure(),(await this.acquireHealthy()).get(this.k(e))}async getBuffer(e){return await this.ensure(),(await this.acquireHealthy()).getBuffer(this.k(e))}async set(e,t,r){return await this.ensure(),(await this.acquireHealthy()).set(this.k(e),t,r)}async del(...e){return await this.ensure(),(await this.acquireHealthy()).del(...e.map(r=>this.k(r)))}async incr(e){return await this.ensure(),(await this.acquireHealthy()).incr(this.k(e))}async expire(e,t){return await this.ensure(),(await this.acquireHealthy()).expire(this.k(e),t)}async ttl(e){return await this.ensure(),(await this.acquireHealthy()).ttl(this.k(e))}async jsonGet(e){return await this.ensure(),(await this.acquireHealthy()).jsonGet(this.k(e))}async jsonSet(e,t,r){return await this.ensure(),(await this.acquireHealthy()).jsonSet(this.k(e),t,r)}async cache(e,t,r){return await this.ensure(),(await this.acquireHealthy()).cache(this.k(e),t,r)}async mget(...e){return await this.ensure(),(await this.acquireHealthy()).mget(...e.map(r=>this.k(r)))}async mset(...e){await this.ensure();let t=await this.acquireHealthy(),r=e.map((s,i)=>i%2===0?this.k(String(s)):s);return t.mset(...r)}async exists(...e){return await this.ensure(),(await this.acquireHealthy()).exists(...e.map(r=>this.k(r)))}async setnx(e,t){return await this.ensure(),(await this.acquireHealthy()).setnx(this.k(e),t)}async incrby(e,t){return await this.ensure(),(await this.acquireHealthy()).incrby(this.k(e),t)}async hset(e,t,r){return await this.ensure(),(await this.acquireHealthy()).hset(this.k(e),t,r)}async hget(e,t){return await this.ensure(),(await this.acquireHealthy()).hget(this.k(e),t)}async hgetall(e){return await this.ensure(),(await this.acquireHealthy()).hgetall(this.k(e))}async hdel(e,...t){return await this.ensure(),(await this.acquireHealthy()).hdel(this.k(e),...t)}async lpush(e,...t){return await this.ensure(),(await this.acquireHealthy()).lpush(this.k(e),...t)}async rpush(e,...t){return await this.ensure(),(await this.acquireHealthy()).rpush(this.k(e),...t)}async lpop(e){return await this.ensure(),(await this.acquireHealthy()).lpop(this.k(e))}async rpop(e){return await this.ensure(),(await this.acquireHealthy()).rpop(this.k(e))}async lrange(e,t,r){return await this.ensure(),(await this.acquireHealthy()).lrange(this.k(e),t,r)}async sadd(e,...t){return await this.ensure(),(await this.acquireHealthy()).sadd(this.k(e),...t)}async srem(e,...t){return await this.ensure(),(await this.acquireHealthy()).srem(this.k(e),...t)}async smembers(e){return await this.ensure(),(await this.acquireHealthy()).smembers(this.k(e))}async zadd(e,t,r){return await this.ensure(),(await this.acquireHealthy()).zadd(this.k(e),t,r)}async zrange(e,t,r){return await this.ensure(),(await this.acquireHealthy()).zrange(this.k(e),t,r)}async pipeline(){return await this.ensure(),(await this.acquireHealthy()).pipeline()}async publish(e,t){await this.ensure();let r=await this.acquireHealthy();return Number(await r.command("PUBLISH",e,t))}createSubscriber(){return new xi({...this.opts})}async flushdb(){await this.ensure();let t=await(await this.acquireHealthy()).command("FLUSHDB");return String(t)}async close(){this.closed=!0,this.readyPromise=null,await Promise.all(this.clients.map(e=>e.close())),this.clients=[]}get size(){return this.clients.length}}});function Ei(n){let e=n.name.toUpperCase(),t=cS.get(e);if(!t)throw new ue(`ERR unknown command '${e}'`);if(n.args.length<t.minArity)throw new ue(`ERR wrong number of arguments for '${e}' command`);if(t.maxArity!==void 0&&n.args.length>t.maxArity)throw new ue(`ERR wrong number of arguments for '${e}' command`);return{def:t,parsed:t.parse?t.parse(n.args):{args:n.args}}}var uS,cS,ec=N(()=>{"use strict";ye();uS=[{name:"GET",minArity:1,maxArity:1},{name:"KEYS",minArity:1,maxArity:1},{name:"SET",minArity:2,maxArity:5,parse(n){let[e,t,...r]=n,s,i=!1;for(let a=0;a<r.length;a+=2){let l=String(r[a]).toUpperCase(),u=r[a+1];if(l==="EX"&&u!==void 0)s=Number(u)*1e3;else if(l==="PX"&&u!==void 0)s=Number(u);else if(l==="KEEPTTL")i=!0;else throw new ue(`ERR syntax error: SET \u9009\u9879 ${l} \u4E0D\u652F\u6301`)}if(s!==void 0&&!Number.isFinite(s))throw new ue("ERR value is not an integer or out of range");let o={keepTtl:i};return s!==void 0&&(o.ttl=s),{args:[String(e),String(t)],meta:o}}},{name:"EXISTS",minArity:1},{name:"DEL",minArity:1},{name:"EXPIRE",minArity:2,maxArity:3,parse(n){return{args:[String(n[0]),String(n[1])],meta:{ttlMs:Number(n[1])*1e3}}}},{name:"PEXPIRE",minArity:2,maxArity:3,parse(n){return{args:[String(n[0]),String(n[1])],meta:{ttlMs:Number(n[1])}}}},{name:"TTL",minArity:1,maxArity:1},{name:"INCR",minArity:1,maxArity:1},{name:"INCRBY",minArity:2,maxArity:2},{name:"STRLEN",minArity:1,maxArity:1},{name:"APPEND",minArity:2,maxArity:2},{name:"MGET",minArity:1},{name:"MSET",minArity:2},{name:"HSET",minArity:3},{name:"HGET",minArity:2,maxArity:2},{name:"HDEL",minArity:2},{name:"HGETALL",minArity:1,maxArity:1},{name:"HEXISTS",minArity:2,maxArity:2},{name:"HLEN",minArity:1,maxArity:1},{name:"HKEYS",minArity:1,maxArity:1},{name:"HVALS",minArity:1,maxArity:1},{name:"HINCRBY",minArity:3,maxArity:3},{name:"LPUSH",minArity:2},{name:"RPUSH",minArity:2},{name:"LPOP",minArity:1,maxArity:2},{name:"RPOP",minArity:1,maxArity:2},{name:"LLEN",minArity:1,maxArity:1},{name:"LRANGE",minArity:3,maxArity:3},{name:"LSET",minArity:3,maxArity:3},{name:"LINDEX",minArity:2,maxArity:2},{name:"BLPOP",minArity:2,parse(n){let e=Number(n[n.length-1]);if(!Number.isFinite(e))throw new ue("ERR timeout is not a float");return{args:n.map(String),meta:{timeoutMs:e*1e3}}}},{name:"SADD",minArity:2},{name:"SREM",minArity:2},{name:"SMEMBERS",minArity:1,maxArity:1},{name:"SISMEMBER",minArity:2,maxArity:2},{name:"SCARD",minArity:1,maxArity:1},{name:"ZADD",minArity:3},{name:"ZREM",minArity:2},{name:"ZRANGE",minArity:3},{name:"ZRANGEBYSCORE",minArity:3},{name:"ZREMRANGEBYSCORE",minArity:3,maxArity:3},{name:"ZCARD",minArity:1,maxArity:1},{name:"ZSCORE",minArity:2,maxArity:2},{name:"XADD",minArity:4},{name:"XREADGROUP",minArity:5},{name:"XACK",minArity:3},{name:"XPENDING",minArity:2},{name:"XAUTOCLAIM",minArity:5},{name:"XGROUP",minArity:3},{name:"XLEN",minArity:1,maxArity:1},{name:"XRANGE",minArity:3},{name:"XDEL",minArity:2},{name:"SUBSCRIBE",minArity:1},{name:"UNSUBSCRIBE",minArity:0},{name:"PSUBSCRIBE",minArity:1},{name:"PUNSUBSCRIBE",minArity:0},{name:"PUBLISH",minArity:2,maxArity:2},{name:"PING",minArity:0},{name:"ECHO",minArity:1,maxArity:1},{name:"SELECT",minArity:1,maxArity:1},{name:"FLUSHALL",minArity:0},{name:"FLUSHDB",minArity:0},{name:"CLIENT",minArity:1},{name:"INFO",minArity:0},{name:"TIME",minArity:0},{name:"DBSIZE",minArity:0},{name:"AUTH",minArity:1,maxArity:2},{name:"QUIT",minArity:0}],cS=new Map(uS.map(n=>[n.name,n]))});function Ti(n){let e=[];for(let[t,r]of Object.entries(n))e.push(t,r);return e}var tc,nc,sn,Ci=N(()=>{"use strict";ye();ec();tc=class{cmds=[];redis;constructor(e){this.redis=e}set(e,t,r){return this.cmds.push(r!==void 0?{name:"SET",args:[e,t,"EX",r]}:{name:"SET",args:[e,t]}),this}get(e){return this.cmds.push({name:"GET",args:[e]}),this}del(...e){return this.cmds.push({name:"DEL",args:e}),this}incr(e){return this.cmds.push({name:"INCR",args:[e]}),this}expire(e,t){return this.cmds.push({name:"EXPIRE",args:[e,t]}),this}ttl(e){return this.cmds.push({name:"TTL",args:[e]}),this}raw(e,...t){return this.cmds.push({name:e,args:t}),this}async exec(){let e=this.cmds;this.cmds=[];let t=[];for(let r of e)try{t.push(await this.redis.command(r.name,...r.args))}catch(s){t.push(s)}return t}},nc=class{subs=new Map;connected=!1;redis;constructor(e){this.redis=e,e._registerSubscriber(this)}async connect(){this.connected=!0}async subscribe(e,t){this.subs.set(`s:${e}`,t)}async psubscribe(e,t){this.subs.set(`p:${e}`,t)}async close(){this.redis._unregisterSubscriber(this),this.subs.clear()}_dispatch(e,t){if(!this.connected)return!1;let r=!1;for(let[s,i]of this.subs)if(s.startsWith("s:"))s.slice(2)===e&&(i(e,t),r=!0);else{let o=s.slice(2);new RegExp("^"+o.split("*").map(l=>l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join(".*")+"$").test(e)&&(i(e,t),r=!0)}return r}},sn=class{strings=new Map;hashes=new Map;lists=new Map;sets=new Map;zsets=new Map;streams=new Map;subscribers=new Set;seq=0;closed=!1;_registerSubscriber(e){this.subscribers.add(e)}_unregisterSubscriber(e){this.subscribers.delete(e)}expired(e){let t=this.strings.get(e);return!t||t.expiresAt===null?!1:t.expiresAt<=Date.now()?(this.strings.delete(e),!0):!1}async get(e){return this.assertOpen(),this.expired(e)?null:this.strings.get(e)?.value??null}async getBuffer(e){let t=await this.get(e);return t===null?null:new TextEncoder().encode(t)}async set(e,t,r){return this.assertOpen(),this.strings.set(e,{value:String(t),expiresAt:r?Date.now()+r*1e3:null}),"OK"}async del(...e){this.assertOpen();let t=0;for(let r of e)this.strings.delete(r)&&t++,this.hashes.delete(r)&&t++,this.lists.delete(r)&&t++,this.sets.delete(r)&&t++,this.zsets.delete(r)&&t++,this.streams.delete(r)&&t++;return t}async incr(e){this.assertOpen();let t=this.strings.get(e);t&&t.expiresAt!==null&&t.expiresAt<=Date.now()&&this.strings.delete(e);let r=Number(this.strings.get(e)?.value??"0");if(!Number.isInteger(r))throw new ue("ERR value is not an integer or out of range");let s=r+1;return this.strings.set(e,{value:String(s),expiresAt:this.strings.get(e)?.expiresAt??null}),s}async incrby(e,t){this.assertOpen();let r=this.strings.get(e);r&&r.expiresAt!==null&&r.expiresAt<=Date.now()&&this.strings.delete(e);let s=Number(this.strings.get(e)?.value??"0");if(!Number.isInteger(s)||!Number.isInteger(t))throw new ue("ERR value is not an integer or out of range");let i=s+t;return this.strings.set(e,{value:String(i),expiresAt:this.strings.get(e)?.expiresAt??null}),i}async expire(e,t){this.assertOpen();let r=this.strings.get(e);return r?(r.expiresAt=Date.now()+t*1e3,1):0}async ttl(e){this.assertOpen();let t=this.strings.get(e);if(!t)return-2;if(t.expiresAt===null)return-1;let r=t.expiresAt-Date.now();return Math.max(0,Math.ceil(r/1e3))}async mget(...e){return Promise.all(e.map(t=>this.get(t)))}async mset(...e){this.assertOpen();for(let t=0;t<e.length;t+=2)this.strings.set(String(e[t]),{value:String(e[t+1]),expiresAt:null});return"OK"}async exists(...e){this.assertOpen();let t=0;for(let r of e)await this.get(r)!==null&&t++;return t}async setnx(e,t){this.assertOpen();let r=this.strings.get(e);return r&&r.expiresAt!==null&&r.expiresAt<=Date.now()&&this.strings.delete(e),this.strings.has(e)?0:(this.strings.set(e,{value:String(t),expiresAt:null}),1)}async jsonGet(e){let t=await this.get(e);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}async jsonSet(e,t,r){return this.set(e,JSON.stringify(t),r)}async cache(e,t,r){let s=await this.get(e);if(s!==null)try{return JSON.parse(s)}catch{return s}let i=await t();return i!==null&&await this.jsonSet(e,i,r),i}async hset(e,t,r){this.assertOpen();let s=this.hashes.get(e);s||(s=new Map,this.hashes.set(e,s));let i=!s.has(t);return s.set(t,String(r)),i?1:0}async hget(e,t){return this.assertOpen(),this.hashes.get(e)?.get(t)??null}async hgetall(e){this.assertOpen();let t=this.hashes.get(e);return t?Object.fromEntries(t):{}}async hdel(e,...t){this.assertOpen();let r=this.hashes.get(e);if(!r)return 0;let s=0;for(let i of t)r.delete(i)&&s++;return r.size===0&&this.hashes.delete(e),s}list(e){let t=this.lists.get(e);return t||(t=[],this.lists.set(e,t)),t}async lpush(e,...t){this.assertOpen();let r=this.list(e);for(let s of t)r.unshift(String(s));return r.length}async rpush(e,...t){this.assertOpen();let r=this.list(e);for(let s of t)r.push(String(s));return r.length}async lpop(e){this.assertOpen();let t=this.lists.get(e);if(!t||t.length===0)return null;let r=t.shift();return t.length===0&&this.lists.delete(e),r}async rpop(e){this.assertOpen();let t=this.lists.get(e);if(!t||t.length===0)return null;let r=t.pop();return t.length===0&&this.lists.delete(e),r}async lrange(e,t,r){this.assertOpen();let s=this.lists.get(e)??[],i=t<0?Math.max(0,s.length+t):t,o=r<0?s.length+r:Math.min(s.length-1,r);return i>o?[]:s.slice(i,o+1)}async sadd(e,...t){this.assertOpen();let r=this.sets.get(e);r||(r=new Set,this.sets.set(e,r));let s=0;for(let i of t){let o=String(i);r.has(o)||(r.add(o),s++)}return s}async srem(e,...t){this.assertOpen();let r=this.sets.get(e);if(!r)return 0;let s=0;for(let i of t)r.delete(String(i))&&s++;return r.size===0&&this.sets.delete(e),s}async smembers(e){return this.assertOpen(),[...this.sets.get(e)??[]]}async zadd(e,t,r){this.assertOpen();let s=this.zsets.get(e);s||(s=new Map,this.zsets.set(e,s));let i=String(r),o=!s.has(i);return s.set(i,t),o?1:0}async zrange(e,t,r){this.assertOpen();let s=this.zsets.get(e);if(!s)return[];let i=[...s.entries()].sort((l,u)=>l[1]-u[1]).map(([l])=>l),o=t<0?Math.max(0,i.length+t):t,a=r<0?i.length+r:Math.min(i.length-1,r);return o>a?[]:i.slice(o,a+1)}async publish(e,t){this.assertOpen();let r=String(t),s=0;for(let i of this.subscribers)i._dispatch(e,r)&&s++;return s}async pipeline(){return new tc(this)}createSubscriber(){return new nc(this)}async createConnection(){this.assertOpen();let e=this;return{get connected(){return!e.closed},command:(t,...r)=>e.command(t,...r),close:async()=>{}}}async flushdb(){return this.assertOpen(),this.strings.clear(),this.hashes.clear(),this.lists.clear(),this.sets.clear(),this.zsets.clear(),this.streams.clear(),"OK"}async close(){this.closed=!0;for(let e of this.subscribers)e.close().catch(()=>{});this.subscribers.clear()}assertOpen(){if(this.closed)throw new ue("memory-redis: instance is closed")}async command(e,...t){this.assertOpen(),Ei({name:e,args:t});let[r,s,i,o,a]=t;switch(e.toUpperCase()){case"GET":return this.get(String(r));case"LPUSH":return this.lpush(String(r),...t.slice(1));case"RPUSH":return this.rpush(String(r),...t.slice(1));case"LPOP":return this.lpop(String(r));case"RPOP":return this.rpop(String(r));case"LLEN":return this.lists.get(String(r))?.length??0;case"LRANGE":return this.lrange(String(r),Number(s),Number(i));case"SET":return this.set(String(r),String(s),i!==void 0?Number(i==="EX"?o:i):void 0);case"DEL":return this.del(...t.map(String));case"INCR":return this.incr(String(r));case"EXPIRE":return this.expire(String(r),Number(s));case"PEXPIRE":{let l=this.strings.get(String(r));return l?(l.expiresAt=Date.now()+Number(s),1):0}case"TTL":return this.ttl(String(r));case"FLUSHDB":return this.flushdb();case"ZADD":return this.zadd(String(r),Number(s),String(i));case"ZRANGEBYSCORE":{let l=this.zsets.get(String(r));if(!l)return[];let u=Number(s),c=Number(i);return[...l.entries()].filter(([,d])=>d>=u&&d<=c).sort((d,p)=>d[1]-p[1]).map(([d])=>d)}case"ZREM":return this.zrem(String(r),String(s));case"ZCARD":return this.zsets.get(String(r))?.size??0;case"ZREMRANGEBYSCORE":return this.zremrangebyscore(String(r),Number(s),Number(i));case"XADD":return this.xadd(String(r),String(s),t.slice(2));case"XLEN":return this.streams.get(String(r))?.entries.length??0;case"XGROUP":return String(r).toUpperCase()==="DESTROY"?this.xgroupDestroy(String(s),String(i)):this.xgroup(String(s),String(i),String(o));case"XREADGROUP":return this.xreadgroup(String(r),String(s),String(i),t);case"XACK":return this.xack(String(r),String(s),String(i));case"XAUTOCLAIM":return this.xautoclaim(String(r),String(s),String(i),Number(o),t);case"XPENDING":return this.xpending(String(r),String(s));default:throw new ue(`memory-redis: command '${e}' unsupported (\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u9700\u771F\u5E93/\u8865\u5B9E\u73B0)`)}}async zrem(e,t){let r=this.zsets.get(e);if(!r)return 0;let s=r.delete(t)?1:0;return r.size===0&&this.zsets.delete(e),s}async zremrangebyscore(e,t,r){let s=this.zsets.get(e);if(!s)return 0;let i=0;for(let[o,a]of[...s.entries()])a>=t&&a<=r&&(s.delete(o),i++);return s.size===0&&this.zsets.delete(e),i}stream(e){let t=this.streams.get(e);return t||(t={entries:[],lastDelivered:new Map},this.streams.set(e,t)),t}async xadd(e,t,r){let s=this.stream(e);t==="*"&&(t=`${Date.now()}-${this.seq++}`);let i={};for(let o=0;o<r.length;o+=2)i[String(r[o])]=String(r[o+1]);return s.entries.push({id:t,fields:i,pending:null}),t}async xgroup(e,t,r){if(this.strings.has(e)&&!this.streams.has(e))throw new Error("WRONGTYPE Operation against a key holding the wrong kind of value");let s=this.stream(e);if(s.lastDelivered.has(t))throw new Error(`BUSYGROUP Consumer Group name already exists: ${t}`);return s.lastDelivered.set(t,r==="$"?s.entries.length:0),"OK"}async xgroupDestroy(e,t){let r=this.streams.get(e);return r&&r.lastDelivered.delete(t)?1:0}async xreadgroup(e,t,r,s){let i=s.indexOf("STREAMS"),o=String(s[i+1]),a=this.stream(o),l=s.indexOf("COUNT"),u=l>=0?Number(s[l+1]):1,c=s.indexOf("BLOCK"),d=c>=0?Number(s[c+1]):0,p=String(s[i+2]),m=a.lastDelivered.get(t);if(p===">"){let f=typeof m=="number"?m:0,g=a.entries.slice(f).filter(y=>!y.pending);if(g.length===0){if(d>0){await new Promise(S=>setTimeout(S,d));let y=a.lastDelivered.get(t),k=typeof y=="number"?y:0,_=a.entries.slice(k).filter(S=>!S.pending);if(_.length===0)return null;let v=_.slice(0,u);for(let S of v)S.pending={consumer:r,idleSince:Date.now()};return a.lastDelivered.set(t,k+v.length),[[o,v.map(S=>[S.id,Ti(S.fields)])]]}return null}let w=g.slice(0,u);for(let y of w)y.pending={consumer:r,idleSince:Date.now()};return a.lastDelivered.set(t,f+w.length),[[o,w.map(y=>[y.id,Ti(y.fields)])]]}let h=a.entries.filter(f=>f.pending?.consumer===r);return[[o,h.slice(0,u).map(f=>[f.id,Ti(f.fields)])]]}async xack(e,t,...r){let s=this.streams.get(e);if(!s)return 0;let i=0;for(let o of r){let a=s.entries.find(l=>l.id===o);a?.pending&&(a.pending=null,i++)}return i}async xautoclaim(e,t,r,s,i){let o=this.streams.get(e);if(!o)return["0-0",[]];let a=i.indexOf("COUNT"),l=a>=0?Number(i[a+1]):1,u=Date.now(),d=o.entries.filter(p=>p.pending&&u-p.pending.idleSince>=s).slice(0,l);for(let p of d)p.pending={consumer:r,idleSince:u};return["0-0",d.map(p=>[p.id,Ti(p.fields)])]}async xpending(e,t){let r=this.streams.get(e);if(!r)return[0,"0-0","0-0",[]];let s=r.entries.filter(o=>o.pending);if(s.length===0)return[0,"0-0","0-0",[]];let i=new Map;for(let o of s){let a=o.pending.consumer;i.set(a,(i.get(a)??0)+1)}return[s.length,s[0].id,s[s.length-1].id,[...i.entries()].map(([o,a])=>[o,a])]}}});import{AsyncLocalStorage as dS}from"node:async_hooks";function Ns(n){let e=typeof n=="string"?{url:n}:n??{};if(e.memory)return i();let t=e.url??process.env.REDIS_URL;if(!t)throw new Error("redis: REDIS_URL is not set. Pass a URL or set the REDIS_URL environment variable.");let r=new URL(t),s=new Ri({host:r.hostname,port:Number(r.port||6379),poolSize:e.poolSize,keyPrefix:e.keyPrefix,enableOfflineQueue:e.enableOfflineQueue,commandTimeoutMs:e.commandTimeoutMs,socketTimeoutMs:e.socketTimeoutMs,onCommand:e.onCommand?(a,l,u)=>{let c=sh.getStore();e.onCommand?.(a,l,u,c||void 0)}:void 0});function i(){let a=new sn,l=((u,c,d)=>(c.redis=a,d(u,c)));return l.__meta={injects:["redis"],depends:[]},l.redis=a,l.close=async()=>{await a.flushdb()},l}let o=(async(a,l,u)=>(l.redis=s,sh.run(a.headers.get("x-trace-id")??"",()=>u(a,l))));return o.__meta={injects:["redis"],depends:[]},o.redis=s,o.close=()=>s.close(),o}var sh,oh=N(()=>{"use strict";rh();Ci();sh=new dS});var ih=N(()=>{"use strict";oh()});import pS from"node:net";function Dn(n){if(n===null)return Oe.encode(`$-1\r
173
- `);if(typeof n=="number")return Oe.encode(`:${n}\r
174
- `);if(typeof n=="string"){let t=Oe.encode(n),r=`$${t.length}\r
175
- `,s=new Uint8Array(r.length+t.length+2);return s.set(Oe.encode(r),0),s.set(t,r.length),s[s.length-2]=13,s[s.length-1]=10,s}if(Array.isArray(n)){let t=[Oe.encode(`*${n.length}\r
176
- `)],r=t[0].length;for(let o of n){let a=Dn(o);t.push(a),r+=a.length}let s=new Uint8Array(r),i=0;for(let o of t)s.set(o,i),i+=o.length;return s}if(n instanceof Uint8Array){let t=`$${n.length}\r
177
- `,r=new Uint8Array(t.length+n.length+2);return r.set(Oe.encode(t),0),r.set(n,t.length),r[r.length-2]=13,r[r.length-1]=10,r}let e=n instanceof Error?n.message:String(n);return Oe.encode(`-${e}\r
178
- `)}function on(n){return Oe.encode(`-${n}\r
179
- `)}function mS(n){return Array.isArray(n)?n.map(e=>e instanceof Uint8Array?new TextDecoder().decode(e):e===null?"":String(e)):null}var Oe,Ai,ah=N(()=>{"use strict";Ci();vi();ec();Oe=new TextEncoder;Ai=class{port=0;url="";server=null;engine=new sn;conns=new Map;blpopWaiters=[];nextId=1;opts;closed=!1;constructor(e={}){this.opts={port:e.port??0,password:e.password??""}}async start(){this.server||await new Promise(e=>{this.server=pS.createServer(t=>this.handleSocket(t)),this.server.listen(this.opts.port,"127.0.0.1",()=>{let t=this.server.address();this.port=t.port,this.url=`redis://127.0.0.1:${t.port}`,e()})})}async close(){if(!this.closed){this.closed=!0;for(let e of this.conns.values())this.releaseWaiters(e.id),e.sock.destroy();this.conns.clear(),await new Promise(e=>{if(!this.server)return e();this.server.close(()=>e()),this.server=null})}}releaseWaiters(e){this.blpopWaiters=this.blpopWaiters.filter(t=>t.owner!==e?!0:(t.timer&&clearTimeout(t.timer),t.resolve(null),!1))}killSocket(e){this.conns.get(e)?.sock.destroy()}get connectionCount(){return this.conns.size}handleSocket(e){let t=this.nextId++,r={id:t,sock:e,authed:this.opts.password==="",subscribed:new Set};this.conns.set(t,r);let s=new Cr,i=()=>{this.conns.delete(t),this.releaseWaiters(t)};e.on("close",i),e.on("error",i),e.on("data",o=>{try{let a=s.pushAll(Buffer.from(o));for(let l of a){let u=mS(l);if(u===null)continue;let[c,...d]=u;this.dispatch(r,c,d).then(p=>{p&&e.write(p)}).catch(p=>{e.write(on(p instanceof Error?p.message:String(p)))})}}catch(a){if(a instanceof bt)return;e.write(on(`ERR ${a instanceof Error?a.message:String(a)}`))}})}async dispatch(e,t,r){let s=t.toUpperCase();if(s==="AUTH")return this.opts.password===""?on("ERR Client sent AUTH, but no password is set"):r[0]!==this.opts.password?on("WRONGPASS invalid username-password pair"):(e.authed=!0,Oe.encode(`+OK\r
180
- `));if(!e.authed)return on("NOAUTH Authentication required.");if(s==="SUBSCRIBE"||s==="PSUBSCRIBE"){for(let o of r)e.subscribed.add(o);let i=r.map(o=>["subscribe",o,e.subscribed.size]);return Dn(i)}if(s==="UNSUBSCRIBE"){let i=r.length?r:[...e.subscribed];for(let a of i)e.subscribed.delete(a);let o=i.map(a=>["unsubscribe",a,e.subscribed.size]);return Dn(o)}if(s==="BLPOP"){let i=Number(r[r.length-1]),o=r.slice(0,-1).map(String);if(o.length===0||!Number.isFinite(i)||i<0)return on("ERR wrong number of arguments for 'blpop' command or timeout is negative");for(let a of o){let l=await this.engine.command("LPOP",a);if(l!=null)return Dn([a,l])}return await new Promise(a=>{let l={keys:o,resolve:a,timer:null,owner:e.id};this.blpopWaiters.push(l),i>0&&(l.timer=setTimeout(()=>{let u=this.blpopWaiters.indexOf(l);u>=0&&this.blpopWaiters.splice(u,1),a(Dn(null))},i*1e3))})}if(s==="LPUSH"||s==="RPUSH"){let i=String(r[0]),o=await this.engine.command(s,...r);for(;;){let a=this.blpopWaiters.find(c=>c.keys.includes(i));if(!a)break;let l=await this.engine.command("LPOP",i);if(l==null)break;let u=this.blpopWaiters.indexOf(a);this.blpopWaiters.splice(u,1),a.timer&&clearTimeout(a.timer),a.resolve(Dn([i,l]))}return Oe.encode(`:${o}\r
181
- `)}if(s==="PUBLISH"){let i=r[0],o=r[1]??"";return await this.engine.publish(i,o),this.pushToSubscribers(i,o),Oe.encode(`:0\r
182
- `)}if(s==="PING")return Oe.encode(`+PONG\r
183
- `);if(s==="CLIENT"){if(r[0]?.toUpperCase()==="ID")return Oe.encode(`:${e.id}\r
184
- `);if(r[0]?.toUpperCase()==="KILL"){let i=r.indexOf("ID"),o=i>=0?Number(r[i+1]):NaN;if(!Number.isNaN(o)&&this.conns.has(o))return this.conns.get(o)?.sock.destroy(),Oe.encode(`+OK\r
185
- `);let a=r.indexOf("ADDR");if(a>=0){let[l,u]=String(r[a+1]).split(":");for(let c of this.conns.values())if(c.sock.remoteAddress===l&&c.sock.remotePort===Number(u))return c.sock.destroy(),Oe.encode(`+OK\r
186
- `)}return Oe.encode(`:0\r
187
- `)}return on("ERR unknown subcommand")}try{Ei({name:t,args:r});let i=await this.engine.command(t,...r);return i==="OK"?Oe.encode(`+OK\r
188
- `):Dn(i)}catch(i){return on(i instanceof Error?i.message:String(i))}}pushToSubscribers(e,t){let r=`*3\r
170
+ `),l=new Map;for(let u of a){let c=u.tbl;l.has(c)||l.set(c,{name:c,columns:[]}),l.get(c).columns.push({name:u.col,type:u.dt})}return rs(o.tables(),[...l.values()])},i.close=()=>s.close(),i}function nS(n={}){let e=new qn,t=_n(Yn(e),n.tenant),r=new Set,s=((o,i,a)=>(i.orm=n.tenant?t.withCtx(i):t,a(o,i)));return s.__meta={injects:["orm"],depends:[]},s.orm=t,s.migrate=async()=>{e.executeQuery({kind:"ddl",op:"createTable",table:"_weifuwu_migrations",ifNotExists:!0,columns:[{name:"name",type:"TEXT",pk:!0,unique:!1,defaultNow:!1,defaultUuid:!1,nullable:!1},{name:"applied_at",type:"TIMESTAMPTZ",pk:!1,unique:!1,defaultNow:!0,defaultUuid:!1,nullable:!1}]})},s.markMigrated=async o=>{r.add(o)},s.isMigrated=async o=>{if(r.has(o))return!0;try{return e.executeQuery({kind:"select",table:"_weifuwu_migrations",cols:["name"],where:{name:{eq:o}}}).length>0}catch{return!1}},s.migrateModule=async(o,i)=>{for(let a of ts(i))e.executeQuery(a);await s.isMigrated(o)||await s.markMigrated(o)},s.transaction=t.transaction,s.poolStats=()=>({active:0,idle:0,waiting:0,max:1}),s.checkConsistency=async()=>rs(t.tables(),e.schemaSnapshot()),s.close=async()=>{},s}function rS(n){return n.catch(e=>{let t=e?.code;throw t&&Zg[t]?new T(`\u6570\u636E\u5E93\u9519\u8BEF: ${e.message}`,Zg[t]):e})}var nc,Jg,Zg,Xg=I(()=>{"use strict";Ug();Ke();Ga();ns();Fa();er();tc();nc="_weifuwu_migrations",Jg=new tS;Zg={23505:409,23503:400,23502:400,23514:400,"22P02":400,22003:400}});var Yg=I(()=>{"use strict";Xg()});function Ms(n,e){return n instanceof Uint8Array?e?th.decode(n):n:Array.isArray(n)?n.map(t=>Ms(t,e)):n}function ki(n){let e=new Array(n.length),t=eh(n.length);for(let i=0;i<n.length;i++){let a=n[i],l=typeof a=="string"?Buffer.byteLength(a):a instanceof Buffer?a.length:String(a).length;e[i]=l,t+=eh(l)+l+2}let r=new Uint8Array(t),s=0,o=`*${n.length}\r
171
+ `;r.set(vi.encode(o),0),s=o.length;for(let i=0;i<n.length;i++){let a=n[i],l=e[i],u=`$${l}\r
172
+ `;r.set(vi.encode(u),s),s+=u.length,typeof a=="string"?r.set(vi.encode(a),s):a instanceof Buffer?r.set(a,s):r.set(vi.encode(String(a)),s),s+=l,r[s]=13,r[s+1]=10,s+=2}return r}function eh(n){return n<10?4:n<100?5:n<1e3?6:n<1e4?7:8}function sS(n,e=0){let t=n.indexOf(13,e);for(;t!==-1;){if(t+1<n.length&&n[t+1]===10)return t;t=n.indexOf(13,t+1)}return-1}var bt,th,vi,Cr,Si=I(()=>{"use strict";ye();ye();bt=class extends Error{constructor(){super("incomplete RESP message"),this.name="IncompleteError"}};th=new TextDecoder,vi=new TextEncoder,Cr=class{buf=new Uint8Array(0);off=0;push(e){this.append(e);let t=this.off;try{let r=this.parseValue();return this.compact(),{value:r,incomplete:!1}}catch(r){if(this.off=t,r instanceof bt)return{value:null,incomplete:!0};throw r}}pushAll(e){this.append(e);let t=[];for(;;){let r=this.off;try{t.push(this.parseValue())}catch(s){if(this.off=r,s instanceof bt)break;throw s}}return t.length>0&&this.compact(),t}append(e){if(e.length===0)return;let t=this.buf.length-this.off;if(t===0){this.buf=e,this.off=0;return}let r=new Uint8Array(t+e.length);r.set(this.buf.subarray(this.off),0),r.set(e,t),this.buf=r,this.off=0}compact(){this.off===this.buf.length?(this.buf=new Uint8Array(0),this.off=0):this.off>0&&(this.buf=this.buf.subarray(this.off),this.off=0)}parseValue(){if(this.buf.length-this.off<3)throw new bt;let e=String.fromCharCode(this.buf[this.off]);switch(this.off++,e){case"+":return this.readLine();case"-":{let t=this.readLine();return new fn(t)}case":":return this.readInt();case"$":{let t=this.readInt();return t===-1?null:this.readBulkBytes(t)}case"*":{let t=this.readInt();if(t===-1)return null;let r=[];for(let s=0;s<t;s++)r.push(this.parseValue());return r}default:throw new We("protocol",`unknown RESP type byte: ${e}`,{code:"RESP"})}}readInt(){let e=this.buf,t=this.off,r=!1;t<e.length&&e[t]===45&&(r=!0,t++);let s=0;for(;t<e.length&&e[t]>=48&&e[t]<=57;)s=s*10+(e[t]-48),t++;if(t+1<e.length&&e[t]===13&&e[t+1]===10)return this.off=t+2,r?-s:s;throw new bt}readLine(){let e=sS(this.buf,this.off);if(e===-1)throw new bt;let t=th.decode(this.buf.subarray(this.off,e));return this.off=e+2,t}readBulkBytes(e){if(this.buf.length-this.off<e+2)throw new bt;let t=this.buf.subarray(this.off,this.off+e);return this.off+=e+2,t}}});import oS from"node:net";var iS,aS,rn,xi=I(()=>{"use strict";Si();ye();iS=new Set(["message","pmessage"]),aS=new Set(["BLPOP","BRPOP","BLMPOP","BRPOPLPUSH","BZPOPMIN","BZPOPMAX","WAIT","XREAD","XREADGROUP"]),rn=class{ready=!1;opts;socket=null;parser=new Cr;pending=[];pendingHead=0;offlineQueue=[];subs=new Map;psubs=new Map;status="idle";retries=0;reconnectTimer=null;socketTimeoutTimer=null;connectPromise=null;closed=!1;connectedOnce=!1;constructor(e={}){this.opts={host:e.host??"127.0.0.1",port:e.port??6379,retryDelayMs:e.retryDelayMs??100,maxRetries:e.maxRetries??10,enableOfflineQueue:e.enableOfflineQueue??!0,maxOfflineQueue:e.maxOfflineQueue??5e3,commandTimeoutMs:e.commandTimeoutMs??0,socketTimeoutMs:e.socketTimeoutMs??0,onCommand:e.onCommand}}connect(){return this.connectPromise?this.connectPromise:(this.closed=!1,this.connectPromise=new Promise((e,t)=>{this.openSocket(),this.onceReady=()=>e(),this.onceFailed=r=>t(r)}).finally(()=>{this.connectPromise=null,this.onceReady=void 0,this.onceFailed=void 0}),this.connectPromise)}onceReady;onceFailed;openSocket(){this.status="connecting";let e=oS.connect(this.opts.port,this.opts.host);this.socket=e,e.on("connect",()=>{if(e.setNoDelay(!0),this.status="ready",this.retries=0,this.connectedOnce){for(let t of this.subs.keys())this.sendNow("SUBSCRIBE",[t]);for(let t of this.psubs.keys())this.sendNow("PSUBSCRIBE",[t])}this.connectedOnce=!0,this.flushOffline(),this.onceReady?.()}),e.on("data",t=>this.onData(new Uint8Array(t))),e.on("error",t=>{this.status==="connecting"&&this.handleDisconnect(t)}),e.on("close",()=>{this.socket=null,this.status!=="closed"&&this.status!=="idle"&&this.handleDisconnect(new ce("redis: socket closed"))})}handleDisconnect(e){let t=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of t)s.reject(e);if(this.clearSocketTimeout(),this.closed||this.status==="closed")return;if(this.retries++,this.status="connecting",this.opts.maxRetries>0&&this.retries>this.opts.maxRetries){this.status="closed";let s=e instanceof ce?e:new ce(`redis: connect to ${this.opts.host}:${this.opts.port} failed`,this.retries,e);this.onceFailed?.(s);return}let r=Math.min(this.opts.retryDelayMs*2**(this.retries-1),5e3);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.openSocket()},r)}onData(e){try{let t=this.parser.pushAll(e);for(let r of t){let s=Array.isArray(r)&&r.length>0?Ms(r[0],!0):void 0;if(typeof s=="string"&&iS.has(s)){this.dispatchSubscribe(Ms(r,!0));continue}let o=this.pending[this.pendingHead++];if(!o)break;o.timedOut||(r instanceof fn?o.reject(r):o.resolve(Ms(r,!o.asBuffer)))}this.pendingHead>64&&this.pendingHead*2>this.pending.length&&(this.pending=this.pending.slice(this.pendingHead),this.pendingHead=0),this.opts.socketTimeoutMs>0&&(this.pendingHead<this.pending.length?this.armSocketTimeout():this.clearSocketTimeout())}catch(t){let r=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of r)s.reject(t);this.socket?.destroy()}}command(e,...t){let r=t[t.length-1],s=typeof r=="object"&&r!==null&&!(r instanceof Uint8Array)?t.pop():void 0;return this.status==="ready"&&this.socket&&!this.socket.destroyed?this.sendNow(e,t,s?.asBuffer):this.closed||this.status==="closed"||!this.opts.enableOfflineQueue?Promise.reject(new ce("redis: not connected")):this.offlineQueue.length>=this.opts.maxOfflineQueue?Promise.reject(new ce(`redis: offline queue full (${this.opts.maxOfflineQueue})`)):new Promise((o,i)=>{this.offlineQueue.push({name:e,args:t,resolve:o,reject:i,asBuffer:s?.asBuffer})})}sendNow(e,t,r){let s=performance.now();return new Promise((o,i)=>{let a={resolve:o,reject:i,asBuffer:r,blocking:aS.has(e.toUpperCase())};this.armTimeout(a),this.pending.push(a),this.armSocketTimeout(),this.socket.write(ki([e,...t]),l=>{if(l){let u=this.pending.indexOf(a);u>=0&&this.pending.splice(u,1),a.reject(l instanceof Error?l:new ce("redis: socket write failed"))}})}).then(o=>(this.opts.onCommand&&this.opts.onCommand(e,t,performance.now()-s),o),o=>{throw this.opts.onCommand&&this.opts.onCommand(e,t,performance.now()-s),o})}armTimeout(e){let t=this.opts.commandTimeoutMs;t<=0||(e.timer=setTimeout(()=>{e.timedOut=!0,e.blocking?e.resolve(null):e.reject(new mn("redis: command timeout",t))},t))}armSocketTimeout(){let e=this.opts.socketTimeoutMs;e<=0||(this.clearSocketTimeout(),this.socketTimeoutTimer=setTimeout(()=>{this.socketTimeoutTimer=null;let t=new ce(`redis: socket timeout (no data in ${e}ms)`),r=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of r)s.reject(t);this.clearSocketTimeout(),this.socket?.destroy()},e))}clearSocketTimeout(){this.socketTimeoutTimer&&(clearTimeout(this.socketTimeoutTimer),this.socketTimeoutTimer=null)}flushOffline(){let e=this.offlineQueue;this.offlineQueue=[];for(let t of e)this.sendNow(t.name,t.args,t.asBuffer).then(t.resolve,t.reject)}batch(e,t){return this.status!=="ready"||!this.socket?Promise.reject(new ce("redis: not connected")):new Promise((r,s)=>{let o=[],i=[],a=!1,l=()=>{a||o.length===t&&(a=!0,u&&clearTimeout(u),r(o))};for(let d=0;d<t;d++){let p={resolve:f=>{o.push(f),l()},reject:f=>{o.push(f),l()}};i.push(p),this.pending.push(p)}let u,c=this.opts.commandTimeoutMs;c>0&&(u=setTimeout(()=>{a=!0;for(let d of i)d.timedOut=!0;s(new mn("redis: batch timeout",c))},c)),this.socket.write(e),this.armSocketTimeout()})}async subscribe(e,t){this.subs.set(e,t),await this.command("SUBSCRIBE",e)}async psubscribe(e,t){this.psubs.set(e,t),await this.command("PSUBSCRIBE",e)}dispatchSubscribe(e){let[t,r,s]=e;t==="message"?this.subs.get(r)?.(r,s):t==="pmessage"&&this.psubs.get(r)?.(s,e[3]??"")}async close(){this.closed=!0,this.status="closed",this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.clearSocketTimeout();let e=this.pending.slice(this.pendingHead);this.pending=[],this.pendingHead=0;for(let s of e)s.reject(new ce("redis: connection closed"));let t=this.offlineQueue;this.offlineQueue=[];for(let s of t)s.reject(new ce("redis: connection closed"));let r=this.socket;this.socket=null,r?.destroy()}get connected(){return this.status==="ready"}}});var Ri,nh=I(()=>{"use strict";Si();Ri=class{cmds=[];conn;constructor(e){this.conn=e}set(e,t,r){return this.cmds.push(r!==void 0?{name:"SET",args:[e,t,"EX",r]}:{name:"SET",args:[e,t]}),this}get(e){return this.cmds.push({name:"GET",args:[e]}),this}del(...e){return this.cmds.push({name:"DEL",args:e}),this}incr(e){return this.cmds.push({name:"INCR",args:[e]}),this}expire(e,t){return this.cmds.push({name:"EXPIRE",args:[e,t]}),this}ttl(e){return this.cmds.push({name:"TTL",args:[e]}),this}raw(e,...t){return this.cmds.push({name:e,args:t}),this}async exec(){let e=this.cmds;if(this.cmds=[],e.length===0)return[];let t=Buffer.concat(e.map(r=>Buffer.from(ki([r.name,...r.args]))));return this.conn.batch(t,e.length)}}});var $s,rh=I(()=>{"use strict";xi();nh();ye();$s=class n{conn;constructor(e){this.conn=e}static async connect(e={}){let t=new rn(e);return await t.connect(),new n(t)}command(e,...t){return this.conn.command(e,...t)}get connected(){return this.conn.connected}async get(e){let t=await this.conn.command("GET",e);return t===null?null:String(t)}async getBuffer(e){let t=await this.conn.command("GET",e,{asBuffer:!0});return t===null?null:t instanceof Uint8Array?t:new TextEncoder().encode(String(t))}async set(e,t,r){let s=r!==void 0?await this.conn.command("SET",e,t,"EX",r):await this.conn.command("SET",e,t);return String(s)}async del(...e){let t=await this.conn.command("DEL",...e);return Number(t)}async incr(e){return Number(await this.conn.command("INCR",e))}async expire(e,t){return Number(await this.conn.command("EXPIRE",e,t))}async ttl(e){return Number(await this.conn.command("TTL",e))}async mget(...e){return(await this.conn.command("MGET",...e)).map(r=>r===null?null:String(r))}async mset(...e){let t=await this.conn.command("MSET",...e);return String(t)}async exists(...e){return Number(await this.conn.command("EXISTS",...e))}async setnx(e,t){return Number(await this.conn.command("SETNX",e,t))}async incrby(e,t){return Number(await this.conn.command("INCRBY",e,t))}async hset(e,t,r){return Number(await this.conn.command("HSET",e,t,r))}async hget(e,t){let r=await this.conn.command("HGET",e,t);return r===null?null:String(r)}async hgetall(e){let r=await this.conn.command("HGETALL",e),s={};for(let o=0;o+1<r.length;o+=2)s[String(r[o])]=String(r[o+1]);return s}async hdel(e,...t){return Number(await this.conn.command("HDEL",e,...t))}async lpush(e,...t){return Number(await this.conn.command("LPUSH",e,...t))}async rpush(e,...t){return Number(await this.conn.command("RPUSH",e,...t))}async lpop(e){let t=await this.conn.command("LPOP",e);return t===null?null:String(t)}async rpop(e){let t=await this.conn.command("RPOP",e);return t===null?null:String(t)}async lrange(e,t,r){return(await this.conn.command("LRANGE",e,t,r)).map(String)}async sadd(e,...t){return Number(await this.conn.command("SADD",e,...t))}async srem(e,...t){return Number(await this.conn.command("SREM",e,...t))}async smembers(e){return(await this.conn.command("SMEMBERS",e)).map(String)}async zadd(e,t,r){return Number(await this.conn.command("ZADD",e,t,r))}async zrange(e,t,r){return(await this.conn.command("ZRANGE",e,t,r)).map(String)}pipeline(){return new Ri(this.conn)}async jsonGet(e){let t=await this.conn.command("GET",e);if(t===null)return null;try{return JSON.parse(String(t))}catch{throw new se(`redis: value of key '${e}' is not valid JSON`)}}async jsonSet(e,t,r){return this.set(e,JSON.stringify(t),r)}async cache(e,t,r){let s=await this.jsonGet(e);if(s!==null)return s;let o=await t();return o!==null&&await this.jsonSet(e,o,r),o}async close(){await this.conn.close()}}});var Ei,sh=I(()=>{"use strict";xi();Ei=class{conn;constructor(e={}){this.conn=new rn(e)}async connect(){await this.conn.connect()}subscribe(e,t){return this.conn.subscribe(e,t)}psubscribe(e,t){return this.conn.psubscribe(e,t)}async close(){await this.conn.close()}}});var Ti,oh=I(()=>{"use strict";rh();xi();sh();ye();Ti=class n{clients=[];rr=0;replenishWaiters=[];closed=!1;keyPrefix;opts;initPromise=null;constructor(e={}){this.keyPrefix=e.keyPrefix??"",this.opts=e}static async create(e={}){let t=new n(e);return await t.ensure(),t}readyPromise=null;ensure(){return this.readyPromise?this.readyPromise:(this.initPromise||(this.initPromise=this.init()),this.initPromise)}async init(){let e=this.opts.poolSize??5;this.clients=await Promise.all(Array.from({length:e},()=>$s.connect(this.opts))),this.readyPromise=Promise.resolve()}k(e){return this.keyPrefix+e}async acquireHealthy(){if(this.closed)throw new ce("redis: pool is closed");for(;this.clients.length>0;){let e=this.rr%this.clients.length;this.rr++;let t=this.clients[e];if(t.connected)return t;this.clients.splice(e,1),t.close().catch(()=>{}),this.replenish()}return new Promise((e,t)=>{let r=()=>{this.clients.length>0&&this.clients[0].connected?e(this.clients[0]):t(new ce("redis: pool exhausted after reconnect wait"))};this.replenishWaiters.push(r),setTimeout(()=>{let s=this.replenishWaiters.indexOf(r);s>=0&&this.replenishWaiters.splice(s,1),t(new ce("redis: no healthy connection available"))},1e3)})}replenish(){this.closed||$s.connect(this.opts).then(e=>{if(this.closed){e.close();return}this.clients.push(e);let t=this.replenishWaiters;this.replenishWaiters=[];for(let r of t)r()}).catch(()=>{setTimeout(()=>this.replenish(),500)})}async createConnection(){await this.ensure();let e=new rn(this.opts);return await e.connect(),e}async command(e,...t){return await this.ensure(),(await this.acquireHealthy()).command(e,...t)}async get(e){return await this.ensure(),(await this.acquireHealthy()).get(this.k(e))}async getBuffer(e){return await this.ensure(),(await this.acquireHealthy()).getBuffer(this.k(e))}async set(e,t,r){return await this.ensure(),(await this.acquireHealthy()).set(this.k(e),t,r)}async del(...e){return await this.ensure(),(await this.acquireHealthy()).del(...e.map(r=>this.k(r)))}async incr(e){return await this.ensure(),(await this.acquireHealthy()).incr(this.k(e))}async expire(e,t){return await this.ensure(),(await this.acquireHealthy()).expire(this.k(e),t)}async ttl(e){return await this.ensure(),(await this.acquireHealthy()).ttl(this.k(e))}async jsonGet(e){return await this.ensure(),(await this.acquireHealthy()).jsonGet(this.k(e))}async jsonSet(e,t,r){return await this.ensure(),(await this.acquireHealthy()).jsonSet(this.k(e),t,r)}async cache(e,t,r){return await this.ensure(),(await this.acquireHealthy()).cache(this.k(e),t,r)}async mget(...e){return await this.ensure(),(await this.acquireHealthy()).mget(...e.map(r=>this.k(r)))}async mset(...e){await this.ensure();let t=await this.acquireHealthy(),r=e.map((s,o)=>o%2===0?this.k(String(s)):s);return t.mset(...r)}async exists(...e){return await this.ensure(),(await this.acquireHealthy()).exists(...e.map(r=>this.k(r)))}async setnx(e,t){return await this.ensure(),(await this.acquireHealthy()).setnx(this.k(e),t)}async incrby(e,t){return await this.ensure(),(await this.acquireHealthy()).incrby(this.k(e),t)}async hset(e,t,r){return await this.ensure(),(await this.acquireHealthy()).hset(this.k(e),t,r)}async hget(e,t){return await this.ensure(),(await this.acquireHealthy()).hget(this.k(e),t)}async hgetall(e){return await this.ensure(),(await this.acquireHealthy()).hgetall(this.k(e))}async hdel(e,...t){return await this.ensure(),(await this.acquireHealthy()).hdel(this.k(e),...t)}async lpush(e,...t){return await this.ensure(),(await this.acquireHealthy()).lpush(this.k(e),...t)}async rpush(e,...t){return await this.ensure(),(await this.acquireHealthy()).rpush(this.k(e),...t)}async lpop(e){return await this.ensure(),(await this.acquireHealthy()).lpop(this.k(e))}async rpop(e){return await this.ensure(),(await this.acquireHealthy()).rpop(this.k(e))}async lrange(e,t,r){return await this.ensure(),(await this.acquireHealthy()).lrange(this.k(e),t,r)}async sadd(e,...t){return await this.ensure(),(await this.acquireHealthy()).sadd(this.k(e),...t)}async srem(e,...t){return await this.ensure(),(await this.acquireHealthy()).srem(this.k(e),...t)}async smembers(e){return await this.ensure(),(await this.acquireHealthy()).smembers(this.k(e))}async zadd(e,t,r){return await this.ensure(),(await this.acquireHealthy()).zadd(this.k(e),t,r)}async zrange(e,t,r){return await this.ensure(),(await this.acquireHealthy()).zrange(this.k(e),t,r)}async pipeline(){return await this.ensure(),(await this.acquireHealthy()).pipeline()}async publish(e,t){await this.ensure();let r=await this.acquireHealthy();return Number(await r.command("PUBLISH",e,t))}createSubscriber(){return new Ei({...this.opts})}async flushdb(){await this.ensure();let t=await(await this.acquireHealthy()).command("FLUSHDB");return String(t)}async close(){this.closed=!0,this.readyPromise=null,await Promise.all(this.clients.map(e=>e.close())),this.clients=[]}get size(){return this.clients.length}}});function Ci(n){let e=n.name.toUpperCase(),t=uS.get(e);if(!t)throw new ue(`ERR unknown command '${e}'`);if(n.args.length<t.minArity)throw new ue(`ERR wrong number of arguments for '${e}' command`);if(t.maxArity!==void 0&&n.args.length>t.maxArity)throw new ue(`ERR wrong number of arguments for '${e}' command`);return{def:t,parsed:t.parse?t.parse(n.args):{args:n.args}}}var lS,uS,rc=I(()=>{"use strict";ye();lS=[{name:"GET",minArity:1,maxArity:1},{name:"KEYS",minArity:1,maxArity:1},{name:"SET",minArity:2,maxArity:5,parse(n){let[e,t,...r]=n,s,o=!1;for(let a=0;a<r.length;a+=2){let l=String(r[a]).toUpperCase(),u=r[a+1];if(l==="EX"&&u!==void 0)s=Number(u)*1e3;else if(l==="PX"&&u!==void 0)s=Number(u);else if(l==="KEEPTTL")o=!0;else throw new ue(`ERR syntax error: SET \u9009\u9879 ${l} \u4E0D\u652F\u6301`)}if(s!==void 0&&!Number.isFinite(s))throw new ue("ERR value is not an integer or out of range");let i={keepTtl:o};return s!==void 0&&(i.ttl=s),{args:[String(e),String(t)],meta:i}}},{name:"EXISTS",minArity:1},{name:"DEL",minArity:1},{name:"EXPIRE",minArity:2,maxArity:3,parse(n){return{args:[String(n[0]),String(n[1])],meta:{ttlMs:Number(n[1])*1e3}}}},{name:"PEXPIRE",minArity:2,maxArity:3,parse(n){return{args:[String(n[0]),String(n[1])],meta:{ttlMs:Number(n[1])}}}},{name:"TTL",minArity:1,maxArity:1},{name:"INCR",minArity:1,maxArity:1},{name:"INCRBY",minArity:2,maxArity:2},{name:"STRLEN",minArity:1,maxArity:1},{name:"APPEND",minArity:2,maxArity:2},{name:"MGET",minArity:1},{name:"MSET",minArity:2},{name:"HSET",minArity:3},{name:"HGET",minArity:2,maxArity:2},{name:"HDEL",minArity:2},{name:"HGETALL",minArity:1,maxArity:1},{name:"HEXISTS",minArity:2,maxArity:2},{name:"HLEN",minArity:1,maxArity:1},{name:"HKEYS",minArity:1,maxArity:1},{name:"HVALS",minArity:1,maxArity:1},{name:"HINCRBY",minArity:3,maxArity:3},{name:"LPUSH",minArity:2},{name:"RPUSH",minArity:2},{name:"LPOP",minArity:1,maxArity:2},{name:"RPOP",minArity:1,maxArity:2},{name:"LLEN",minArity:1,maxArity:1},{name:"LRANGE",minArity:3,maxArity:3},{name:"LSET",minArity:3,maxArity:3},{name:"LINDEX",minArity:2,maxArity:2},{name:"BLPOP",minArity:2,parse(n){let e=Number(n[n.length-1]);if(!Number.isFinite(e))throw new ue("ERR timeout is not a float");return{args:n.map(String),meta:{timeoutMs:e*1e3}}}},{name:"SADD",minArity:2},{name:"SREM",minArity:2},{name:"SMEMBERS",minArity:1,maxArity:1},{name:"SISMEMBER",minArity:2,maxArity:2},{name:"SCARD",minArity:1,maxArity:1},{name:"ZADD",minArity:3},{name:"ZREM",minArity:2},{name:"ZRANGE",minArity:3},{name:"ZRANGEBYSCORE",minArity:3},{name:"ZREMRANGEBYSCORE",minArity:3,maxArity:3},{name:"ZCARD",minArity:1,maxArity:1},{name:"ZSCORE",minArity:2,maxArity:2},{name:"XADD",minArity:4},{name:"XREADGROUP",minArity:5},{name:"XACK",minArity:3},{name:"XPENDING",minArity:2},{name:"XAUTOCLAIM",minArity:5},{name:"XGROUP",minArity:3},{name:"XLEN",minArity:1,maxArity:1},{name:"XRANGE",minArity:3},{name:"XDEL",minArity:2},{name:"SUBSCRIBE",minArity:1},{name:"UNSUBSCRIBE",minArity:0},{name:"PSUBSCRIBE",minArity:1},{name:"PUNSUBSCRIBE",minArity:0},{name:"PUBLISH",minArity:2,maxArity:2},{name:"PING",minArity:0},{name:"ECHO",minArity:1,maxArity:1},{name:"SELECT",minArity:1,maxArity:1},{name:"FLUSHALL",minArity:0},{name:"FLUSHDB",minArity:0},{name:"CLIENT",minArity:1},{name:"INFO",minArity:0},{name:"TIME",minArity:0},{name:"DBSIZE",minArity:0},{name:"AUTH",minArity:1,maxArity:2},{name:"QUIT",minArity:0}],uS=new Map(lS.map(n=>[n.name,n]))});function Ai(n){let e=[];for(let[t,r]of Object.entries(n))e.push(t,r);return e}var sc,oc,sn,Oi=I(()=>{"use strict";ye();rc();sc=class{cmds=[];redis;constructor(e){this.redis=e}set(e,t,r){return this.cmds.push(r!==void 0?{name:"SET",args:[e,t,"EX",r]}:{name:"SET",args:[e,t]}),this}get(e){return this.cmds.push({name:"GET",args:[e]}),this}del(...e){return this.cmds.push({name:"DEL",args:e}),this}incr(e){return this.cmds.push({name:"INCR",args:[e]}),this}expire(e,t){return this.cmds.push({name:"EXPIRE",args:[e,t]}),this}ttl(e){return this.cmds.push({name:"TTL",args:[e]}),this}raw(e,...t){return this.cmds.push({name:e,args:t}),this}async exec(){let e=this.cmds;this.cmds=[];let t=[];for(let r of e)try{t.push(await this.redis.command(r.name,...r.args))}catch(s){t.push(s)}return t}},oc=class{subs=new Map;connected=!1;redis;constructor(e){this.redis=e,e._registerSubscriber(this)}async connect(){this.connected=!0}async subscribe(e,t){this.subs.set(`s:${e}`,t)}async psubscribe(e,t){this.subs.set(`p:${e}`,t)}async close(){this.redis._unregisterSubscriber(this),this.subs.clear()}_dispatch(e,t){if(!this.connected)return!1;let r=!1;for(let[s,o]of this.subs)if(s.startsWith("s:"))s.slice(2)===e&&(o(e,t),r=!0);else{let i=s.slice(2);new RegExp("^"+i.split("*").map(l=>l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join(".*")+"$").test(e)&&(o(e,t),r=!0)}return r}},sn=class{strings=new Map;hashes=new Map;lists=new Map;sets=new Map;zsets=new Map;streams=new Map;subscribers=new Set;seq=0;closed=!1;_registerSubscriber(e){this.subscribers.add(e)}_unregisterSubscriber(e){this.subscribers.delete(e)}expired(e){let t=this.strings.get(e);return!t||t.expiresAt===null?!1:t.expiresAt<=Date.now()?(this.strings.delete(e),!0):!1}async get(e){return this.assertOpen(),this.expired(e)?null:this.strings.get(e)?.value??null}async getBuffer(e){let t=await this.get(e);return t===null?null:new TextEncoder().encode(t)}async set(e,t,r){return this.assertOpen(),this.strings.set(e,{value:String(t),expiresAt:r?Date.now()+r*1e3:null}),"OK"}async del(...e){this.assertOpen();let t=0;for(let r of e)this.strings.delete(r)&&t++,this.hashes.delete(r)&&t++,this.lists.delete(r)&&t++,this.sets.delete(r)&&t++,this.zsets.delete(r)&&t++,this.streams.delete(r)&&t++;return t}async incr(e){this.assertOpen();let t=this.strings.get(e);t&&t.expiresAt!==null&&t.expiresAt<=Date.now()&&this.strings.delete(e);let r=Number(this.strings.get(e)?.value??"0");if(!Number.isInteger(r))throw new ue("ERR value is not an integer or out of range");let s=r+1;return this.strings.set(e,{value:String(s),expiresAt:this.strings.get(e)?.expiresAt??null}),s}async incrby(e,t){this.assertOpen();let r=this.strings.get(e);r&&r.expiresAt!==null&&r.expiresAt<=Date.now()&&this.strings.delete(e);let s=Number(this.strings.get(e)?.value??"0");if(!Number.isInteger(s)||!Number.isInteger(t))throw new ue("ERR value is not an integer or out of range");let o=s+t;return this.strings.set(e,{value:String(o),expiresAt:this.strings.get(e)?.expiresAt??null}),o}async expire(e,t){this.assertOpen();let r=this.strings.get(e);return r?(r.expiresAt=Date.now()+t*1e3,1):0}async ttl(e){this.assertOpen();let t=this.strings.get(e);if(!t)return-2;if(t.expiresAt===null)return-1;let r=t.expiresAt-Date.now();return Math.max(0,Math.ceil(r/1e3))}async mget(...e){return Promise.all(e.map(t=>this.get(t)))}async mset(...e){this.assertOpen();for(let t=0;t<e.length;t+=2)this.strings.set(String(e[t]),{value:String(e[t+1]),expiresAt:null});return"OK"}async exists(...e){this.assertOpen();let t=0;for(let r of e)await this.get(r)!==null&&t++;return t}async setnx(e,t){this.assertOpen();let r=this.strings.get(e);return r&&r.expiresAt!==null&&r.expiresAt<=Date.now()&&this.strings.delete(e),this.strings.has(e)?0:(this.strings.set(e,{value:String(t),expiresAt:null}),1)}async jsonGet(e){let t=await this.get(e);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}async jsonSet(e,t,r){return this.set(e,JSON.stringify(t),r)}async cache(e,t,r){let s=await this.get(e);if(s!==null)try{return JSON.parse(s)}catch{return s}let o=await t();return o!==null&&await this.jsonSet(e,o,r),o}async hset(e,t,r){this.assertOpen();let s=this.hashes.get(e);s||(s=new Map,this.hashes.set(e,s));let o=!s.has(t);return s.set(t,String(r)),o?1:0}async hget(e,t){return this.assertOpen(),this.hashes.get(e)?.get(t)??null}async hgetall(e){this.assertOpen();let t=this.hashes.get(e);return t?Object.fromEntries(t):{}}async hdel(e,...t){this.assertOpen();let r=this.hashes.get(e);if(!r)return 0;let s=0;for(let o of t)r.delete(o)&&s++;return r.size===0&&this.hashes.delete(e),s}list(e){let t=this.lists.get(e);return t||(t=[],this.lists.set(e,t)),t}async lpush(e,...t){this.assertOpen();let r=this.list(e);for(let s of t)r.unshift(String(s));return r.length}async rpush(e,...t){this.assertOpen();let r=this.list(e);for(let s of t)r.push(String(s));return r.length}async lpop(e){this.assertOpen();let t=this.lists.get(e);if(!t||t.length===0)return null;let r=t.shift();return t.length===0&&this.lists.delete(e),r}async rpop(e){this.assertOpen();let t=this.lists.get(e);if(!t||t.length===0)return null;let r=t.pop();return t.length===0&&this.lists.delete(e),r}async lrange(e,t,r){this.assertOpen();let s=this.lists.get(e)??[],o=t<0?Math.max(0,s.length+t):t,i=r<0?s.length+r:Math.min(s.length-1,r);return o>i?[]:s.slice(o,i+1)}async sadd(e,...t){this.assertOpen();let r=this.sets.get(e);r||(r=new Set,this.sets.set(e,r));let s=0;for(let o of t){let i=String(o);r.has(i)||(r.add(i),s++)}return s}async srem(e,...t){this.assertOpen();let r=this.sets.get(e);if(!r)return 0;let s=0;for(let o of t)r.delete(String(o))&&s++;return r.size===0&&this.sets.delete(e),s}async smembers(e){return this.assertOpen(),[...this.sets.get(e)??[]]}async zadd(e,t,r){this.assertOpen();let s=this.zsets.get(e);s||(s=new Map,this.zsets.set(e,s));let o=String(r),i=!s.has(o);return s.set(o,t),i?1:0}async zrange(e,t,r){this.assertOpen();let s=this.zsets.get(e);if(!s)return[];let o=[...s.entries()].sort((l,u)=>l[1]-u[1]).map(([l])=>l),i=t<0?Math.max(0,o.length+t):t,a=r<0?o.length+r:Math.min(o.length-1,r);return i>a?[]:o.slice(i,a+1)}async publish(e,t){this.assertOpen();let r=String(t),s=0;for(let o of this.subscribers)o._dispatch(e,r)&&s++;return s}async pipeline(){return new sc(this)}createSubscriber(){return new oc(this)}async createConnection(){this.assertOpen();let e=this;return{get connected(){return!e.closed},command:(t,...r)=>e.command(t,...r),close:async()=>{}}}async flushdb(){return this.assertOpen(),this.strings.clear(),this.hashes.clear(),this.lists.clear(),this.sets.clear(),this.zsets.clear(),this.streams.clear(),"OK"}async close(){this.closed=!0;for(let e of this.subscribers)e.close().catch(()=>{});this.subscribers.clear()}assertOpen(){if(this.closed)throw new ue("memory-redis: instance is closed")}async command(e,...t){this.assertOpen(),Ci({name:e,args:t});let[r,s,o,i,a]=t;switch(e.toUpperCase()){case"GET":return this.get(String(r));case"LPUSH":return this.lpush(String(r),...t.slice(1));case"RPUSH":return this.rpush(String(r),...t.slice(1));case"LPOP":return this.lpop(String(r));case"RPOP":return this.rpop(String(r));case"LLEN":return this.lists.get(String(r))?.length??0;case"LRANGE":return this.lrange(String(r),Number(s),Number(o));case"SET":return this.set(String(r),String(s),o!==void 0?Number(o==="EX"?i:o):void 0);case"DEL":return this.del(...t.map(String));case"INCR":return this.incr(String(r));case"EXPIRE":return this.expire(String(r),Number(s));case"PEXPIRE":{let l=this.strings.get(String(r));return l?(l.expiresAt=Date.now()+Number(s),1):0}case"TTL":return this.ttl(String(r));case"FLUSHDB":return this.flushdb();case"ZADD":return this.zadd(String(r),Number(s),String(o));case"ZRANGEBYSCORE":{let l=this.zsets.get(String(r));if(!l)return[];let u=Number(s),c=Number(o);return[...l.entries()].filter(([,d])=>d>=u&&d<=c).sort((d,p)=>d[1]-p[1]).map(([d])=>d)}case"ZREM":return this.zrem(String(r),String(s));case"ZCARD":return this.zsets.get(String(r))?.size??0;case"ZREMRANGEBYSCORE":return this.zremrangebyscore(String(r),Number(s),Number(o));case"XADD":return this.xadd(String(r),String(s),t.slice(2));case"XLEN":return this.streams.get(String(r))?.entries.length??0;case"XGROUP":return String(r).toUpperCase()==="DESTROY"?this.xgroupDestroy(String(s),String(o)):this.xgroup(String(s),String(o),String(i));case"XREADGROUP":return this.xreadgroup(String(r),String(s),String(o),t);case"XACK":return this.xack(String(r),String(s),String(o));case"XAUTOCLAIM":return this.xautoclaim(String(r),String(s),String(o),Number(i),t);case"XPENDING":return this.xpending(String(r),String(s));default:throw new ue(`memory-redis: command '${e}' unsupported (\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u9700\u771F\u5E93/\u8865\u5B9E\u73B0)`)}}async zrem(e,t){let r=this.zsets.get(e);if(!r)return 0;let s=r.delete(t)?1:0;return r.size===0&&this.zsets.delete(e),s}async zremrangebyscore(e,t,r){let s=this.zsets.get(e);if(!s)return 0;let o=0;for(let[i,a]of[...s.entries()])a>=t&&a<=r&&(s.delete(i),o++);return s.size===0&&this.zsets.delete(e),o}stream(e){let t=this.streams.get(e);return t||(t={entries:[],lastDelivered:new Map},this.streams.set(e,t)),t}async xadd(e,t,r){let s=this.stream(e);t==="*"&&(t=`${Date.now()}-${this.seq++}`);let o={};for(let i=0;i<r.length;i+=2)o[String(r[i])]=String(r[i+1]);return s.entries.push({id:t,fields:o,pending:null}),t}async xgroup(e,t,r){if(this.strings.has(e)&&!this.streams.has(e))throw new Error("WRONGTYPE Operation against a key holding the wrong kind of value");let s=this.stream(e);if(s.lastDelivered.has(t))throw new Error(`BUSYGROUP Consumer Group name already exists: ${t}`);return s.lastDelivered.set(t,r==="$"?s.entries.length:0),"OK"}async xgroupDestroy(e,t){let r=this.streams.get(e);return r&&r.lastDelivered.delete(t)?1:0}async xreadgroup(e,t,r,s){let o=s.indexOf("STREAMS"),i=String(s[o+1]),a=this.stream(i),l=s.indexOf("COUNT"),u=l>=0?Number(s[l+1]):1,c=s.indexOf("BLOCK"),d=c>=0?Number(s[c+1]):0,p=String(s[o+2]),f=a.lastDelivered.get(t);if(p===">"){let m=typeof f=="number"?f:0,g=a.entries.slice(m).filter(b=>!b.pending);if(g.length===0){if(d>0){await new Promise(S=>setTimeout(S,d));let b=a.lastDelivered.get(t),k=typeof b=="number"?b:0,_=a.entries.slice(k).filter(S=>!S.pending);if(_.length===0)return null;let v=_.slice(0,u);for(let S of v)S.pending={consumer:r,idleSince:Date.now()};return a.lastDelivered.set(t,k+v.length),[[i,v.map(S=>[S.id,Ai(S.fields)])]]}return null}let h=g.slice(0,u);for(let b of h)b.pending={consumer:r,idleSince:Date.now()};return a.lastDelivered.set(t,m+h.length),[[i,h.map(b=>[b.id,Ai(b.fields)])]]}let w=a.entries.filter(m=>m.pending?.consumer===r);return[[i,w.slice(0,u).map(m=>[m.id,Ai(m.fields)])]]}async xack(e,t,...r){let s=this.streams.get(e);if(!s)return 0;let o=0;for(let i of r){let a=s.entries.find(l=>l.id===i);a?.pending&&(a.pending=null,o++)}return o}async xautoclaim(e,t,r,s,o){let i=this.streams.get(e);if(!i)return["0-0",[]];let a=o.indexOf("COUNT"),l=a>=0?Number(o[a+1]):1,u=Date.now(),d=i.entries.filter(p=>p.pending&&u-p.pending.idleSince>=s).slice(0,l);for(let p of d)p.pending={consumer:r,idleSince:u};return["0-0",d.map(p=>[p.id,Ai(p.fields)])]}async xpending(e,t){let r=this.streams.get(e);if(!r)return[0,"0-0","0-0",[]];let s=r.entries.filter(i=>i.pending);if(s.length===0)return[0,"0-0","0-0",[]];let o=new Map;for(let i of s){let a=i.pending.consumer;o.set(a,(o.get(a)??0)+1)}return[s.length,s[0].id,s[s.length-1].id,[...o.entries()].map(([i,a])=>[i,a])]}}});import{AsyncLocalStorage as cS}from"node:async_hooks";function qs(n){let e=typeof n=="string"?{url:n}:n??{};if(e.memory)return o();let t=e.url??process.env.REDIS_URL;if(!t)throw new Error("redis: REDIS_URL is not set. Pass a URL or set the REDIS_URL environment variable.");let r=new URL(t),s=new Ti({host:r.hostname,port:Number(r.port||6379),poolSize:e.poolSize,keyPrefix:e.keyPrefix,enableOfflineQueue:e.enableOfflineQueue,commandTimeoutMs:e.commandTimeoutMs,socketTimeoutMs:e.socketTimeoutMs,onCommand:e.onCommand?(a,l,u)=>{let c=ih.getStore();e.onCommand?.(a,l,u,c||void 0)}:void 0});function o(){let a=new sn,l=((u,c,d)=>(c.redis=a,d(u,c)));return l.__meta={injects:["redis"],depends:[]},l.redis=a,l.close=async()=>{await a.flushdb()},l}let i=(async(a,l,u)=>(l.redis=s,ih.run(a.headers.get("x-trace-id")??"",()=>u(a,l))));return i.__meta={injects:["redis"],depends:[]},i.redis=s,i.close=()=>s.close(),i}var ih,ah=I(()=>{"use strict";oh();Oi();ih=new cS});var lh=I(()=>{"use strict";ah()});import dS from"node:net";function Dn(n){if(n===null)return Pe.encode(`$-1\r
173
+ `);if(typeof n=="number")return Pe.encode(`:${n}\r
174
+ `);if(typeof n=="string"){let t=Pe.encode(n),r=`$${t.length}\r
175
+ `,s=new Uint8Array(r.length+t.length+2);return s.set(Pe.encode(r),0),s.set(t,r.length),s[s.length-2]=13,s[s.length-1]=10,s}if(Array.isArray(n)){let t=[Pe.encode(`*${n.length}\r
176
+ `)],r=t[0].length;for(let i of n){let a=Dn(i);t.push(a),r+=a.length}let s=new Uint8Array(r),o=0;for(let i of t)s.set(i,o),o+=i.length;return s}if(n instanceof Uint8Array){let t=`$${n.length}\r
177
+ `,r=new Uint8Array(t.length+n.length+2);return r.set(Pe.encode(t),0),r.set(n,t.length),r[r.length-2]=13,r[r.length-1]=10,r}let e=n instanceof Error?n.message:String(n);return Pe.encode(`-${e}\r
178
+ `)}function on(n){return Pe.encode(`-${n}\r
179
+ `)}function pS(n){return Array.isArray(n)?n.map(e=>e instanceof Uint8Array?new TextDecoder().decode(e):e===null?"":String(e)):null}var Pe,Ii,uh=I(()=>{"use strict";Oi();Si();rc();Pe=new TextEncoder;Ii=class{port=0;url="";server=null;engine=new sn;conns=new Map;blpopWaiters=[];nextId=1;opts;closed=!1;constructor(e={}){this.opts={port:e.port??0,password:e.password??""}}async start(){this.server||await new Promise(e=>{this.server=dS.createServer(t=>this.handleSocket(t)),this.server.listen(this.opts.port,"127.0.0.1",()=>{let t=this.server.address();this.port=t.port,this.url=`redis://127.0.0.1:${t.port}`,e()})})}async close(){if(!this.closed){this.closed=!0;for(let e of this.conns.values())this.releaseWaiters(e.id),e.sock.destroy();this.conns.clear(),await new Promise(e=>{if(!this.server)return e();this.server.close(()=>e()),this.server=null})}}releaseWaiters(e){this.blpopWaiters=this.blpopWaiters.filter(t=>t.owner!==e?!0:(t.timer&&clearTimeout(t.timer),t.resolve(null),!1))}killSocket(e){this.conns.get(e)?.sock.destroy()}get connectionCount(){return this.conns.size}handleSocket(e){let t=this.nextId++,r={id:t,sock:e,authed:this.opts.password==="",subscribed:new Set};this.conns.set(t,r);let s=new Cr,o=()=>{this.conns.delete(t),this.releaseWaiters(t)};e.on("close",o),e.on("error",o),e.on("data",i=>{try{let a=s.pushAll(Buffer.from(i));for(let l of a){let u=pS(l);if(u===null)continue;let[c,...d]=u;this.dispatch(r,c,d).then(p=>{p&&e.write(p)}).catch(p=>{e.write(on(p instanceof Error?p.message:String(p)))})}}catch(a){if(a instanceof bt)return;e.write(on(`ERR ${a instanceof Error?a.message:String(a)}`))}})}async dispatch(e,t,r){let s=t.toUpperCase();if(s==="AUTH")return this.opts.password===""?on("ERR Client sent AUTH, but no password is set"):r[0]!==this.opts.password?on("WRONGPASS invalid username-password pair"):(e.authed=!0,Pe.encode(`+OK\r
180
+ `));if(!e.authed)return on("NOAUTH Authentication required.");if(s==="SUBSCRIBE"||s==="PSUBSCRIBE"){for(let i of r)e.subscribed.add(i);let o=r.map(i=>["subscribe",i,e.subscribed.size]);return Dn(o)}if(s==="UNSUBSCRIBE"){let o=r.length?r:[...e.subscribed];for(let a of o)e.subscribed.delete(a);let i=o.map(a=>["unsubscribe",a,e.subscribed.size]);return Dn(i)}if(s==="BLPOP"){let o=Number(r[r.length-1]),i=r.slice(0,-1).map(String);if(i.length===0||!Number.isFinite(o)||o<0)return on("ERR wrong number of arguments for 'blpop' command or timeout is negative");for(let a of i){let l=await this.engine.command("LPOP",a);if(l!=null)return Dn([a,l])}return await new Promise(a=>{let l={keys:i,resolve:a,timer:null,owner:e.id};this.blpopWaiters.push(l),o>0&&(l.timer=setTimeout(()=>{let u=this.blpopWaiters.indexOf(l);u>=0&&this.blpopWaiters.splice(u,1),a(Dn(null))},o*1e3))})}if(s==="LPUSH"||s==="RPUSH"){let o=String(r[0]),i=await this.engine.command(s,...r);for(;;){let a=this.blpopWaiters.find(c=>c.keys.includes(o));if(!a)break;let l=await this.engine.command("LPOP",o);if(l==null)break;let u=this.blpopWaiters.indexOf(a);this.blpopWaiters.splice(u,1),a.timer&&clearTimeout(a.timer),a.resolve(Dn([o,l]))}return Pe.encode(`:${i}\r
181
+ `)}if(s==="PUBLISH"){let o=r[0],i=r[1]??"";return await this.engine.publish(o,i),this.pushToSubscribers(o,i),Pe.encode(`:0\r
182
+ `)}if(s==="PING")return Pe.encode(`+PONG\r
183
+ `);if(s==="CLIENT"){if(r[0]?.toUpperCase()==="ID")return Pe.encode(`:${e.id}\r
184
+ `);if(r[0]?.toUpperCase()==="KILL"){let o=r.indexOf("ID"),i=o>=0?Number(r[o+1]):NaN;if(!Number.isNaN(i)&&this.conns.has(i))return this.conns.get(i)?.sock.destroy(),Pe.encode(`+OK\r
185
+ `);let a=r.indexOf("ADDR");if(a>=0){let[l,u]=String(r[a+1]).split(":");for(let c of this.conns.values())if(c.sock.remoteAddress===l&&c.sock.remotePort===Number(u))return c.sock.destroy(),Pe.encode(`+OK\r
186
+ `)}return Pe.encode(`:0\r
187
+ `)}return on("ERR unknown subcommand")}try{Ci({name:t,args:r});let o=await this.engine.command(t,...r);return o==="OK"?Pe.encode(`+OK\r
188
+ `):Dn(o)}catch(o){return on(o instanceof Error?o.message:String(o))}}pushToSubscribers(e,t){let r=`*3\r
189
189
  $7\r
190
190
  message\r
191
191
  $${Buffer.byteLength(e)}\r
192
192
  ${e}\r
193
193
  $${Buffer.byteLength(t)}\r
194
194
  ${t}\r
195
- `;for(let s of this.conns.values())s.subscribed.has(e)&&s.sock.write(r)}}});async function lh(n){if(n.method==="GET"||n.method==="HEAD")return{};try{return await n.json()}catch{throw new T("Invalid JSON body",400)}}var uh=N(()=>{"use strict";ze()});var Oi={};ie(Oi,{BUILTIN_APP_ID:()=>Ke,DEFAULT_MAX_BODY:()=>aa,HttpError:()=>T,MIGRATIONS_TABLE:()=>Yu,MemoryAi:()=>Uo,MemoryAiServer:()=>Ql,MemoryEmail:()=>Vn,MemoryEmailServer:()=>ao,MemoryRedis:()=>sn,MemoryRedisServer:()=>Ai,MemorySql:()=>qn,OpenAi:()=>cs,Router:()=>lt,WEIFUWU_MESSAGER_SCHEMA:()=>Co,WEIFUWU_USER_SCHEMA:()=>yo,WEIFUWU_WORKFLOW_SCHEMA:()=>$o,and:()=>F,appAuth:()=>ip,badRequest:()=>We,between:()=>il,bodyOf:()=>Wt,buildQuery:()=>mp,cols:()=>Ya,compileSchemaDDL:()=>up,compileSchemaDdl:()=>Xr,compress:()=>Fd,conflict:()=>Rd,contains:()=>ul,cors:()=>ro,createMemoryAi:()=>ds,createMemoryAiServer:()=>hm,createMemoryEmail:()=>Ca,createMemoryEmailServer:()=>Oa,createMemoryOrm:()=>Kg,createMiddleware:()=>yd,createOrm:()=>_n,createQueryBuilder:()=>ns,createTypedQuery:()=>os,created:()=>et,ddlToSql:()=>vo,diffConsistency:()=>es,email:()=>lo,endsWith:()=>dl,eq:()=>L,eqCol:()=>pl,errorResponse:()=>Te,f:()=>R,forbidden:()=>Sd,generateRefreshToken:()=>mo,gqlFromShape:()=>Za,graphql:()=>di,gt:()=>el,gte:()=>tl,hashPassword:()=>vt,ilike:()=>ll,inArray:()=>sl,isNotNull:()=>ss,isNull:()=>ml,like:()=>al,listQuery:()=>Xn,lt:()=>nl,lte:()=>rl,memoryAdapter:()=>Yn,messager:()=>To,ne:()=>rs,noContent:()=>gn,normalizeType:()=>ko,not:()=>gl,notFound:()=>xd,notInArray:()=>ol,ok:()=>Ne,ops:()=>G,or:()=>fl,parseBody:()=>lh,postgres:()=>Tr,postgresAdapter:()=>Ro,queue:()=>qo,rateLimit:()=>oo,redirect:()=>Ad,redis:()=>Ns,restFromShape:()=>Xa,scheduler:()=>nm,serve:()=>rc,serveStatic:()=>zd,serverError:()=>Cd,shape:()=>co,signToken:()=>Zn,startsWith:()=>cl,tooManyRequests:()=>Td,ui:()=>ui,unauthorized:()=>kd,unprocessable:()=>Ed,userSystem:()=>wo,verifyPassword:()=>Dt,verifyToken:()=>jt,workflow:()=>Po,workflowSystem:()=>Mo,z:()=>b});function rc(n,e){let t=e?.wsAdapter!==void 0?e:{...e,wsAdapter:ma};return bd(n,t)}var re=N(()=>{"use strict";la();vd();ze();la();Sa();Bd();Vd();Kd();Gd();Ia();Ia();op();ap();bn();Jn();lp();La();Ua();Yr();er();wp();yp();wl();_p();za();wl();qa();go();vp();Zp();Yp();rm();gm();wm();bg();Eg();Zg();ih();Ci();Xu();ah();No();Hn();uh()});var X,J,de,$e,Xe,oe,sc,ne,fS,gS,hS,wS,yS,bS,_S,vS,kS,SS,xS,RS,ES,TS,CS,AS,OS,IS,PS,NS,MS,$S,qS,DS,jS,LS,WS,US,BS,He,Ar=N(()=>{"use strict";re();X=()=>b.uuid(),J=()=>b.string(),de=()=>b.number().int(),$e=()=>b.boolean(),Xe=()=>b.json(),oe=()=>b.date(),sc=["ai","user","webhook","knowledge_base","department"],ne=R.dflt,fS={id:R.pk(X()),app_id:R.req(X()),type:R.req(b.enum(sc)),name:R.req(J()),avatar_url:J().nullable(),description:J().nullable(),role_label:J().nullable(),expertise:J().nullable(),model:J().nullable(),system_prompt:J().nullable(),temperature:b.number().nullable(),max_tokens:de().nullable(),human_in_the_loop:$e().nullable(),user_id:X().nullable(),webhook_url:J().nullable(),webhook_secret:J().nullable(),webhook_retry_count:de().nullable(),im_bind_dept:X().nullable(),chunk_size:de().nullable(),chunk_overlap:de().nullable(),tools:Xe().nullable(),department_id:X().nullable(),monthly_token_quota:ne(R.req(de()),0),is_active:ne(R.req($e()),!0),created_at:R.now(oe()),updated_at:R.now(oe()),workspace_path:J().nullable(),allow_file_tools:ne(R.req($e()),!1),allow_command_exec:ne(R.req($e()),!1),allow_network:ne(R.req($e()),!0),template_slug:J().nullable(),kb_id:X().nullable(),approval_policy:Xe().nullable(),webhook_platform:ne(R.req(J()),"generic"),risk_policy:ne(R.req(J()),"auto"),light_model:J().nullable()},gS={id:R.pk(X()),app_id:R.req(X()),name:R.req(J()),is_dm:ne(R.req($e()),!1),workspace_path:J().nullable(),artifact_review:ne(R.req($e()),!1),created_at:R.now(oe()),updated_at:R.now(oe())},hS={department_id:R.req(X()),agent_id:R.req(X()),role:ne(R.req(J()),"member"),joined_at:R.now(oe())},wS={id:R.pk(X()),department_id:R.req(X()),sender_id:R.req(X()),content:R.req(J()),msg_type:ne(R.req(J()),"text"),ai_draft:J().nullable(),ai_approved:$e().nullable(),ai_step:Xe().nullable(),reply_to:X().nullable(),attachments:Xe().nullable(),routed_to:J().nullable(),created_at:R.now(oe()),feedback:J().nullable(),quick_replies:Xe().nullable()},yS={id:R.pk(X()),agent_id:R.req(X()),filename:R.req(J()),content:R.req(J()),chunk_count:ne(R.req(de()),0),created_at:R.now(oe())},bS={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),department_id:X().nullable(),messages_count:ne(R.req(de()),0),steps_count:ne(R.req(de()),0),tokens_prompt:ne(R.req(de()),0),tokens_completion:ne(R.req(de()),0),tokens_total:ne(R.req(de()),0),elapsed_ms:ne(R.req(de()),0),success:ne(R.req($e()),!0),created_at:R.now(oe())},_S={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),orchestrator_id:X().nullable(),parent_run_id:X().nullable(),kind:ne(R.req(J()),"orchestration"),plan_json:Xe().nullable(),worker_results:Xe().nullable(),status:ne(R.req(J()),"planned"),request_id:J().nullable(),created_at:R.now(oe()),updated_at:R.now(oe())},vS={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),request_body:J().nullable(),response_body:J().nullable(),response_status:de().nullable(),elapsed_ms:ne(R.req(de()),0),success:ne(R.req($e()),!0),created_at:R.now(oe())},kS={id:R.pk(X()),agent_id:R.req(X()),conversation_id:R.req(J()),role:R.req(J()),content:R.req(J()),created_at:R.now(oe())},SS={id:R.pk(X()),document_id:R.req(X()),agent_id:R.req(X()),content:R.req(J()),chunk_index:R.req(de()),embedding:Xe().nullable(),created_at:R.now(oe())},xS={id:R.pk(X()),agent_id:R.req(X()),skill_name:R.req(J()),skill_dir:R.req(J()),enabled:ne(R.req($e()),!0),created_at:R.now(oe())},RS={id:R.pk(X()),name:R.req(J()),slug:R.req(J()).meta({unique:!0}),description:J().nullable(),icon:J().nullable(),category:ne(R.req(J()),"general"),default_system_prompt:J().nullable(),default_model:J().nullable(),default_temperature:b.number().nullable(),default_max_tokens:de().nullable(),default_allow_file_tools:$e().nullable(),default_allow_command_exec:$e().nullable(),default_workspace_hint:J().nullable(),default_skills:Xe().nullable(),sort_order:de().nullable(),is_active:ne(R.req($e()),!0),created_at:R.now(oe())},ES={id:R.pk(X()),app_id:R.req(X()),event:R.req(J()),created_at:R.now(oe())},TS={id:R.pk(X()),app_id:R.req(X()),user_id:X().nullable(),action:R.req(J()),target_type:J().nullable(),target_id:X().nullable(),detail:Xe().nullable(),created_at:R.now(oe())},CS={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),version:R.req(de()),snapshot:R.req(Xe()),note:J().nullable(),created_at:R.now(oe())},AS={department_id:R.req(X()).meta({pk:!0}),summary:J().nullable(),msg_count:ne(R.req(de()),0),updated_at:R.now(oe())},OS={id:R.pk(X()),app_id:R.req(X()),question:R.req(J()),answer:R.req(J()),hits:ne(R.req(de()),0),created_at:R.now(oe()),updated_at:R.now(oe())},IS={id:R.pk(X()),skill_dir:R.req(J()),app_id:R.req(X()),liked:R.req($e()),created_at:R.now(oe())},PS={message_id:R.req(X()).meta({pk:!0}),agent_id:R.req(X()),department_id:R.req(X()),app_id:R.req(X()),steps:ne(R.req(Xe()),[]),status:ne(R.req(J()),"running"),updated_at:R.now(oe())},NS={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),name:R.req(J()),status:ne(R.req(J()),"requested"),mode:ne(R.req(J()),"persistent"),image:ne(R.req(J()),"ap-sandbox:latest"),network:ne(R.req($e()),!0),memory_mb:ne(R.req(de()),1024),cpus:ne(R.req(de()),1),error:J().nullable(),workspace:J().nullable(),created_at:R.now(oe()),last_used_at:oe().nullable(),expires_at:oe().nullable(),terminated_at:oe().nullable(),updated_at:R.now(oe())},MS={id:R.pk(b.number().int()),sandbox_id:R.req(X()),app_id:X().nullable(),type:R.req(J()),detail:J().nullable(),created_at:R.now(oe())},$S={id:R.pk(X()),app_id:R.req(X()),total:R.req(de()),concurrency:R.req(de()),url:ne(R.req(J()),""),retry:ne(R.req(de()),2),status:ne(R.req(J()),"running"),completed:ne(R.req(de()),0),failed:ne(R.req(de()),0),created_at:R.now(oe()),updated_at:R.now(oe())},qS={id:R.pk(X()),campaign_id:R.req(X()),agent_id:R.req(X()),agent_name:R.req(J()),dept_id:R.req(X()),status:ne(R.req(J()),"queued"),attempts:ne(R.req(de()),0),started_at:oe().nullable(),finished_at:oe().nullable(),error:J().nullable()},DS={id:R.req(J()).meta({pk:!0}),source:R.req(J()),age:J().nullable(),industry:J().nullable(),rating:de().nullable(),focus:Xe().nullable(),feedback:J().nullable(),submitted_at:R.now(oe()),campaign_id:J().nullable()},jS={id:R.req(de()).meta({pk:!0}),source:R.req(J()),question:J().nullable(),answer:J().nullable(),created_at:R.now(oe()),campaign_id:J().nullable()},LS={agent_id:R.req(X()).meta({pk:!0}),content:R.req(J()),updated_at:R.now(oe())},WS={id:R.pk(X()),name:R.req(J()),owner_user_id:X().nullable(),created_at:R.now(oe())},US={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),agent_id:X().nullable(),task_id:R.req(J()),prompt:R.req(J()),status:ne(R.req(J()),"pending"),filename:R.req(J()),path:J().nullable(),error:J().nullable(),params:Xe().nullable(),created_at:R.now(oe()),updated_at:R.now(oe())},BS={app_id:R.req(X()).meta({pk:!0}),base_url:J().nullable(),api_key:J().nullable(),model:J().nullable(),updated_at:R.now(oe())},He={agents:fS,departments:gS,department_members:hS,messages:wS,kb_documents:yS,agent_logs:bS,agent_runs:_S,webhook_logs:vS,webhook_conversations:kS,kb_chunks:SS,agent_skills:xS,role_templates:RS,events:ES,audit_logs:TS,agent_versions:CS,group_memories:AS,answer_cache:OS,skill_ratings:IS,agent_run_states:PS,sandboxes:NS,sandbox_events:MS,survey_campaigns:$S,survey_campaign_runs:qS,survey_submissions:DS,survey_answers:jS,agent_memories:LS,enterprises:WS,app_ai_configs:BS,video_tasks:US}});function fh(n){for(let[e,t]of Object.entries(n))mh.set(e,t)}function gh(n){return mh.get(n)}var mh,oc=N(()=>{"use strict";mh=new Map});var hh={};ie(hh,{searchKnowledgeBase:()=>VS});function HS(n){return!Array.isArray(n)||n.length===0?!0:Math.sqrt(n.reduce((t,r)=>t+r*r,0))>5}async function FS(n,e){if(!n)return null;try{let t=Array.isArray(e)?await n.embedMany(e):await n.embed(e);return Array.isArray(t)&&Array.isArray(t[0])?t[0]:t}catch{try{let t=Array.isArray(e)?await n.embedMany(e):await n.embed(e);return Array.isArray(t)&&Array.isArray(t[0])?t[0]:t}catch{return null}}}async function VS(n,e,t=5,r){let s=n.orm;if(!e)return"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD";r=r??null;let i=[];if(r)try{let[d]=await s.query.from("agents a").join("agents kb",{"kb.id":{col:"a.kb_id"}},{type:"left"}).select("a.kb_id","kb.name as kb_name").where({"a.id":r,"a.app_id":String(n.appId)}).limit(1).run();d?.kb_id&&d.kb_name&&(i=[{id:d.kb_id,name:d.kb_name}])}catch{}if(i.length===0)try{i=await s.query.from("agents").select("id","name").where({app_id:String(n.appId),type:"knowledge_base",is_active:!0}).limit(5).run()}catch{}if(i.length===0)return"\u6CA1\u6709\u627E\u5230\u5DF2\u6FC0\u6D3B\u7684\u77E5\u8BC6\u5E93\u3002\u8BF7\u5148\u521B\u5EFA knowledge_base \u7C7B\u578B\u7684 Agent \u5E76\u4E0A\u4F20\u6587\u6863\u3002";let o=await FS(n.ai,e);if(!o)return"\u77E5\u8BC6\u5E93\u68C0\u7D22\u6682\u4E0D\u53EF\u7528\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF0C\u5DF2\u91CD\u8BD5\u4ECD\u5931\u8D25\uFF09\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u76F4\u63A5\u63CF\u8FF0\u4F60\u7684\u9700\u6C42\u3002";let a=[],l=!1;for(let d of i){let p;try{p=await s.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.content","kd.filename","kc.embedding").vectorScore("kc.embedding",o,"similarity").where({"kc.agent_id":{eq:String(d.id)}}).limit(3).run()}catch{continue}for(let m of p){try{let h=JSON.parse(m.embedding);HS(h)&&(l=!0)}catch{}a.push({filename:m.filename,content:m.content,similarity:Number(m.similarity)})}}if(l)return"\u77E5\u8BC6\u5E93\u5411\u91CF\u7D22\u5F15\u5F02\u5E38\uFF08\u68C0\u6D4B\u5230\u672A\u521D\u59CB\u5316\u7684\u5411\u91CF\u6570\u636E\u2014\u2014\u53EF\u80FD\u662F\u4E0A\u4F20\u65F6 Embedding \u670D\u52A1\u4E0D\u53EF\u7528\uFF09\u3002\u8BF7\u5BF9\u77E5\u8BC6\u5E93\u6267\u884C\u300C\u91CD\u65B0\u7D22\u5F15\u300D\u540E\u518D\u68C0\u7D22\uFF0C\u6216\u7528\u5176\u4ED6\u65B9\u5F0F\u56DE\u7B54\u3002";a.sort((d,p)=>p.similarity-d.similarity);let c=a.slice(0,t).filter(d=>d.similarity>.05);return c.length===0?"\u77E5\u8BC6\u5E93\u4E2D\u6CA1\u6709\u627E\u5230\u4E0E\u95EE\u9898\u76F8\u5173\u7684\u4FE1\u606F\uFF08\u8BED\u4E49\u76F8\u4F3C\u5EA6\u4F4E\u4E8E\u53EF\u7528\u9608\u503C\uFF09\u3002":c.map((d,p)=>`[${p+1}] \u6765\u81EA "${d.filename}" (\u76F8\u4F3C\u5EA6: ${(d.similarity*100).toFixed(1)}%)
195
+ `;for(let s of this.conns.values())s.subscribed.has(e)&&s.sock.write(r)}}});async function ch(n){if(n.method==="GET"||n.method==="HEAD")return{};try{return await n.json()}catch{throw new T("Invalid JSON body",400)}}var dh=I(()=>{"use strict";Ke()});var Pi={};ie(Pi,{BUILTIN_APP_ID:()=>Be,DEFAULT_MAX_BODY:()=>ca,HttpError:()=>T,MIGRATIONS_TABLE:()=>nc,MemoryAi:()=>Ho,MemoryAiServer:()=>Xl,MemoryEmail:()=>Vn,MemoryEmailServer:()=>uo,MemoryRedis:()=>sn,MemoryRedisServer:()=>Ii,MemorySql:()=>qn,OpenAi:()=>ms,Router:()=>lt,WEIFUWU_MESSAGER_SCHEMA:()=>Oo,WEIFUWU_USER_SCHEMA:()=>_o,WEIFUWU_WORKFLOW_SCHEMA:()=>Do,and:()=>V,appAuth:()=>lp,badRequest:()=>Ue,between:()=>ul,bodyOf:()=>Wt,buildQuery:()=>gp,cols:()=>nl,compileSchemaDDL:()=>dp,compileSchemaDdl:()=>ts,compress:()=>zd,conflict:()=>Td,contains:()=>pl,cors:()=>oo,createMemoryAi:()=>fs,createMemoryAiServer:()=>ym,createMemoryEmail:()=>Ia,createMemoryEmailServer:()=>Na,createMemoryOrm:()=>Qg,createMiddleware:()=>_d,createOrm:()=>_n,createQueryBuilder:()=>os,createTypedQuery:()=>ls,created:()=>et,ddlToSql:()=>So,diffConsistency:()=>rs,email:()=>co,endsWith:()=>fl,eq:()=>L,eqCol:()=>gl,errorResponse:()=>Ae,f:()=>R,forbidden:()=>Rd,generateRefreshToken:()=>go,gqlFromShape:()=>el,graphql:()=>mi,gt:()=>rl,gte:()=>sl,hashPassword:()=>vt,ilike:()=>dl,inArray:()=>al,isNotNull:()=>as,isNull:()=>hl,like:()=>cl,listQuery:()=>Xn,lt:()=>ol,lte:()=>il,memoryAdapter:()=>Yn,messager:()=>Ao,ne:()=>is,noContent:()=>gn,normalizeType:()=>xo,not:()=>yl,notFound:()=>Ed,notInArray:()=>ll,ok:()=>Me,ops:()=>Q,or:()=>wl,parseBody:()=>ch,postgres:()=>Tr,postgresAdapter:()=>To,queue:()=>jo,rateLimit:()=>ao,redirect:()=>Id,redis:()=>qs,restFromShape:()=>tl,scheduler:()=>sm,serve:()=>ic,serveStatic:()=>Gd,serverError:()=>Od,shape:()=>mo,signToken:()=>Zn,startsWith:()=>ml,tooManyRequests:()=>Ad,ui:()=>di,unauthorized:()=>xd,unprocessable:()=>Cd,userSystem:()=>bo,verifyPassword:()=>Dt,verifyToken:()=>jt,workflow:()=>Mo,workflowSystem:()=>qo,z:()=>y});function ic(n,e){let t=e?.wsAdapter!==void 0?e:{...e,wsAdapter:ha};return vd(n,t)}var re=I(()=>{"use strict";da();Sd();Ke();da();Ea();Fd();Kd();Qd();Jd();Ma();Ma();ap();up();bn();Jn();cp();Ba();Fa();ns();er();bp();_p();_l();kp();Qa();_l();La();wo();Sp();Yp();tm();om();wm();bm();vg();Cg();Yg();lh();Oi();tc();uh();$o();Hn();dh()});var X,J,de,qe,Xe,oe,ac,ne,mS,fS,gS,hS,wS,yS,bS,_S,vS,kS,SS,xS,RS,ES,TS,CS,AS,OS,IS,PS,NS,MS,$S,qS,DS,jS,LS,WS,US,Ve,Ar=I(()=>{"use strict";re();X=()=>y.uuid(),J=()=>y.string(),de=()=>y.number().int(),qe=()=>y.boolean(),Xe=()=>y.json(),oe=()=>y.date(),ac=["ai","user","webhook","knowledge_base","department"],ne=R.dflt,mS={id:R.pk(X()),app_id:R.req(X()),type:R.req(y.enum(ac)),name:R.req(J()),avatar_url:J().nullable(),description:J().nullable(),role_label:J().nullable(),expertise:J().nullable(),model:J().nullable(),system_prompt:J().nullable(),temperature:y.number().nullable(),max_tokens:de().nullable(),human_in_the_loop:qe().nullable(),user_id:X().nullable(),webhook_url:J().nullable(),webhook_secret:J().nullable(),webhook_retry_count:de().nullable(),im_bind_dept:X().nullable(),chunk_size:de().nullable(),chunk_overlap:de().nullable(),tools:Xe().nullable(),department_id:X().nullable(),monthly_token_quota:ne(R.req(de()),0),is_active:ne(R.req(qe()),!0),created_at:R.now(oe()),updated_at:R.now(oe()),workspace_path:J().nullable(),allow_file_tools:ne(R.req(qe()),!1),allow_command_exec:ne(R.req(qe()),!1),allow_network:ne(R.req(qe()),!0),template_slug:J().nullable(),kb_id:X().nullable(),approval_policy:Xe().nullable(),webhook_platform:ne(R.req(J()),"generic"),risk_policy:ne(R.req(J()),"auto"),light_model:J().nullable()},fS={id:R.pk(X()),app_id:R.req(X()),name:R.req(J()),is_dm:ne(R.req(qe()),!1),workspace_path:J().nullable(),artifact_review:ne(R.req(qe()),!1),created_at:R.now(oe()),updated_at:R.now(oe())},gS={department_id:R.req(X()),agent_id:R.req(X()),role:ne(R.req(J()),"member"),joined_at:R.now(oe())},hS={id:R.pk(X()),department_id:R.req(X()),sender_id:R.req(X()),content:R.req(J()),msg_type:ne(R.req(J()),"text"),ai_draft:J().nullable(),ai_approved:qe().nullable(),ai_step:Xe().nullable(),reply_to:X().nullable(),attachments:Xe().nullable(),routed_to:J().nullable(),created_at:R.now(oe()),feedback:J().nullable(),quick_replies:Xe().nullable()},wS={id:R.pk(X()),agent_id:R.req(X()),filename:R.req(J()),content:R.req(J()),chunk_count:ne(R.req(de()),0),created_at:R.now(oe())},yS={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),department_id:X().nullable(),messages_count:ne(R.req(de()),0),steps_count:ne(R.req(de()),0),tokens_prompt:ne(R.req(de()),0),tokens_completion:ne(R.req(de()),0),tokens_total:ne(R.req(de()),0),elapsed_ms:ne(R.req(de()),0),success:ne(R.req(qe()),!0),created_at:R.now(oe())},bS={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),orchestrator_id:X().nullable(),parent_run_id:X().nullable(),kind:ne(R.req(J()),"orchestration"),plan_json:Xe().nullable(),worker_results:Xe().nullable(),status:ne(R.req(J()),"planned"),request_id:J().nullable(),created_at:R.now(oe()),updated_at:R.now(oe())},_S={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),request_body:J().nullable(),response_body:J().nullable(),response_status:de().nullable(),elapsed_ms:ne(R.req(de()),0),success:ne(R.req(qe()),!0),created_at:R.now(oe())},vS={id:R.pk(X()),agent_id:R.req(X()),conversation_id:R.req(J()),role:R.req(J()),content:R.req(J()),created_at:R.now(oe())},kS={id:R.pk(X()),document_id:R.req(X()),agent_id:R.req(X()),content:R.req(J()),chunk_index:R.req(de()),embedding:Xe().nullable(),created_at:R.now(oe())},SS={id:R.pk(X()),agent_id:R.req(X()),skill_name:R.req(J()),skill_dir:R.req(J()),enabled:ne(R.req(qe()),!0),created_at:R.now(oe())},xS={id:R.pk(X()),name:R.req(J()),slug:R.req(J()).meta({unique:!0}),description:J().nullable(),icon:J().nullable(),category:ne(R.req(J()),"general"),default_system_prompt:J().nullable(),default_model:J().nullable(),default_temperature:y.number().nullable(),default_max_tokens:de().nullable(),default_allow_file_tools:qe().nullable(),default_allow_command_exec:qe().nullable(),default_workspace_hint:J().nullable(),default_skills:Xe().nullable(),sort_order:de().nullable(),is_active:ne(R.req(qe()),!0),created_at:R.now(oe())},RS={id:R.pk(X()),app_id:R.req(X()),event:R.req(J()),created_at:R.now(oe())},ES={id:R.pk(X()),app_id:R.req(X()),user_id:X().nullable(),action:R.req(J()),target_type:J().nullable(),target_id:X().nullable(),detail:Xe().nullable(),created_at:R.now(oe())},TS={id:R.pk(X()),agent_id:R.req(X()),app_id:R.req(X()),version:R.req(de()),snapshot:R.req(Xe()),note:J().nullable(),created_at:R.now(oe())},CS={department_id:R.req(X()).meta({pk:!0}),summary:J().nullable(),msg_count:ne(R.req(de()),0),updated_at:R.now(oe())},AS={id:R.pk(X()),app_id:R.req(X()),question:R.req(J()),answer:R.req(J()),hits:ne(R.req(de()),0),created_at:R.now(oe()),updated_at:R.now(oe())},OS={id:R.pk(X()),skill_dir:R.req(J()),app_id:R.req(X()),liked:R.req(qe()),created_at:R.now(oe())},IS={message_id:R.req(X()).meta({pk:!0}),agent_id:R.req(X()),department_id:R.req(X()),app_id:R.req(X()),steps:ne(R.req(Xe()),[]),status:ne(R.req(J()),"running"),updated_at:R.now(oe())},PS={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),name:R.req(J()),status:ne(R.req(J()),"requested"),mode:ne(R.req(J()),"persistent"),image:ne(R.req(J()),"ap-sandbox:latest"),network:ne(R.req(qe()),!0),memory_mb:ne(R.req(de()),1024),cpus:ne(R.req(de()),1),error:J().nullable(),workspace:J().nullable(),created_at:R.now(oe()),last_used_at:oe().nullable(),expires_at:oe().nullable(),terminated_at:oe().nullable(),updated_at:R.now(oe())},NS={id:R.pk(y.number().int()),sandbox_id:R.req(X()),app_id:X().nullable(),type:R.req(J()),detail:J().nullable(),created_at:R.now(oe())},MS={id:R.pk(X()),app_id:R.req(X()),total:R.req(de()),concurrency:R.req(de()),url:ne(R.req(J()),""),retry:ne(R.req(de()),2),status:ne(R.req(J()),"running"),completed:ne(R.req(de()),0),failed:ne(R.req(de()),0),created_at:R.now(oe()),updated_at:R.now(oe())},$S={id:R.pk(X()),campaign_id:R.req(X()),agent_id:R.req(X()),agent_name:R.req(J()),dept_id:R.req(X()),status:ne(R.req(J()),"queued"),attempts:ne(R.req(de()),0),started_at:oe().nullable(),finished_at:oe().nullable(),error:J().nullable()},qS={id:R.req(J()).meta({pk:!0}),source:R.req(J()),age:J().nullable(),industry:J().nullable(),rating:de().nullable(),focus:Xe().nullable(),feedback:J().nullable(),submitted_at:R.now(oe()),campaign_id:J().nullable()},DS={id:R.req(de()).meta({pk:!0}),source:R.req(J()),question:J().nullable(),answer:J().nullable(),created_at:R.now(oe()),campaign_id:J().nullable()},jS={agent_id:R.req(X()).meta({pk:!0}),content:R.req(J()),updated_at:R.now(oe())},LS={id:R.pk(X()),name:R.req(J()),owner_user_id:X().nullable(),created_at:R.now(oe())},WS={id:R.pk(X()),app_id:R.req(X()),department_id:X().nullable(),agent_id:X().nullable(),task_id:R.req(J()),prompt:R.req(J()),status:ne(R.req(J()),"pending"),filename:R.req(J()),path:J().nullable(),error:J().nullable(),params:Xe().nullable(),created_at:R.now(oe()),updated_at:R.now(oe())},US={app_id:R.req(X()).meta({pk:!0}),base_url:J().nullable(),api_key:J().nullable(),model:J().nullable(),updated_at:R.now(oe())},Ve={agents:mS,departments:fS,department_members:gS,messages:hS,kb_documents:wS,agent_logs:yS,agent_runs:bS,webhook_logs:_S,webhook_conversations:vS,kb_chunks:kS,agent_skills:SS,role_templates:xS,events:RS,audit_logs:ES,agent_versions:TS,group_memories:CS,answer_cache:AS,skill_ratings:OS,agent_run_states:IS,sandboxes:PS,sandbox_events:NS,survey_campaigns:MS,survey_campaign_runs:$S,survey_submissions:qS,survey_answers:DS,agent_memories:jS,enterprises:LS,app_ai_configs:US,video_tasks:WS}});function hh(n){for(let[e,t]of Object.entries(n))gh.set(e,t)}function wh(n){return gh.get(n)}var gh,lc=I(()=>{"use strict";gh=new Map});var yh={};ie(yh,{searchKnowledgeBase:()=>FS});function BS(n){return!Array.isArray(n)||n.length===0?!0:Math.sqrt(n.reduce((t,r)=>t+r*r,0))>5}async function HS(n,e){if(!n)return null;try{let t=Array.isArray(e)?await n.embedMany(e):await n.embed(e);return Array.isArray(t)&&Array.isArray(t[0])?t[0]:t}catch{try{let t=Array.isArray(e)?await n.embedMany(e):await n.embed(e);return Array.isArray(t)&&Array.isArray(t[0])?t[0]:t}catch{return null}}}async function FS(n,e,t=5,r){let s=n.orm;if(!e)return"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD";r=r??null;let o=[];if(r)try{let[d]=await s.query.from("agents a").join("agents kb",{"kb.id":{col:"a.kb_id"}},{type:"left"}).select("a.kb_id","kb.name as kb_name").where({"a.id":r,"a.app_id":String(n.appId)}).limit(1).run();d?.kb_id&&d.kb_name&&(o=[{id:d.kb_id,name:d.kb_name}])}catch{}if(o.length===0)try{o=await s.query.from("agents").select("id","name").where({app_id:String(n.appId),type:"knowledge_base",is_active:!0}).limit(5).run()}catch{}if(o.length===0)return"\u6CA1\u6709\u627E\u5230\u5DF2\u6FC0\u6D3B\u7684\u77E5\u8BC6\u5E93\u3002\u8BF7\u5148\u521B\u5EFA knowledge_base \u7C7B\u578B\u7684 Agent \u5E76\u4E0A\u4F20\u6587\u6863\u3002";let i=await HS(n.ai,e);if(!i)return"\u77E5\u8BC6\u5E93\u68C0\u7D22\u6682\u4E0D\u53EF\u7528\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF0C\u5DF2\u91CD\u8BD5\u4ECD\u5931\u8D25\uFF09\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF0C\u6216\u76F4\u63A5\u63CF\u8FF0\u4F60\u7684\u9700\u6C42\u3002";let a=[],l=!1;for(let d of o){let p;try{p=await s.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.content","kd.filename","kc.embedding").vectorScore("kc.embedding",i,"similarity").where({"kc.agent_id":{eq:String(d.id)}}).limit(3).run()}catch{continue}for(let f of p){try{let w=JSON.parse(f.embedding);BS(w)&&(l=!0)}catch{}a.push({filename:f.filename,content:f.content,similarity:Number(f.similarity)})}}if(l)return"\u77E5\u8BC6\u5E93\u5411\u91CF\u7D22\u5F15\u5F02\u5E38\uFF08\u68C0\u6D4B\u5230\u672A\u521D\u59CB\u5316\u7684\u5411\u91CF\u6570\u636E\u2014\u2014\u53EF\u80FD\u662F\u4E0A\u4F20\u65F6 Embedding \u670D\u52A1\u4E0D\u53EF\u7528\uFF09\u3002\u8BF7\u5BF9\u77E5\u8BC6\u5E93\u6267\u884C\u300C\u91CD\u65B0\u7D22\u5F15\u300D\u540E\u518D\u68C0\u7D22\uFF0C\u6216\u7528\u5176\u4ED6\u65B9\u5F0F\u56DE\u7B54\u3002";a.sort((d,p)=>p.similarity-d.similarity);let c=a.slice(0,t).filter(d=>d.similarity>.05);return c.length===0?"\u77E5\u8BC6\u5E93\u4E2D\u6CA1\u6709\u627E\u5230\u4E0E\u95EE\u9898\u76F8\u5173\u7684\u4FE1\u606F\uFF08\u8BED\u4E49\u76F8\u4F3C\u5EA6\u4F4E\u4E8E\u53EF\u7528\u9608\u503C\uFF09\u3002":c.map((d,p)=>`[${p+1}] \u6765\u81EA "${d.filename}" (\u76F8\u4F3C\u5EA6: ${(d.similarity*100).toFixed(1)}%)
196
196
  ${d.content}`).join(`
197
197
 
198
- `)}var wh=N(()=>{"use strict"});var qe={};ie(qe,{getDefaultWorkspaceRoot:()=>KS,resolveDepartmentWorkspace:()=>ac,workspace:()=>GS});import{resolve as ic,join as zS}from"node:path";import{mkdir as yh}from"node:fs/promises";async function ac(n,e,t){if(!t||!n)return null;if(e){let s=ic(e);return await yh(s,{recursive:!0}),s}let r=zS(bh,n);return await yh(r,{recursive:!0}),r}function KS(){return bh}function GS(){let n=(e,t,r)=>r(e,t);return n.__meta={injects:["workspace"],depends:["ai"]},n}var bh,Ie=N(()=>{"use strict";bh=(()=>{let n=process.env.AGENT_WORKSPACE_ROOT;return n?ic(n):ic(process.cwd(),"data","workspaces")})()});var _h={};ie(_h,{generateImage:()=>ZS});import{randomUUID as QS}from"node:crypto";async function JS(n){if(n.startsWith("data:image"))return Buffer.from(n.slice(n.indexOf(",")+1),"base64");let e=await fetch(n);if(!e.ok)throw new Error(`\u56FE\u7247\u4E0B\u8F7D\u5931\u8D25 HTTP ${e.status}`);return Buffer.from(await e.arrayBuffer())}async function ZS(n,e){let t=n.ai;if(!t)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u751F\u6210\u56FE\u7247");let r=String(e.prompt??"").trim();if(!r)throw new Error("prompt \u4E3A\u5FC5\u586B\u2014\u2014\u63CF\u8FF0\u4F60\u60F3\u751F\u6210\u7684\u753B\u9762");let s=/^\d{2,4}\*\d{2,4}$/.test(e.size??"")?e.size:"1024*1024",i=await t.generateImage({prompt:r,size:s}),o=i.url??i.dataUrl;if(!o)throw new Error("\u56FE\u50CF\u751F\u6210\u5931\u8D25\uFF1Aprovider \u65E0\u56FE\u7247\u8FD4\u56DE");let a=await JS(o),[l,u]=s.split("*").map(Number),c=(e.filename??"").replace(/[^\w.\-\u4e00-\u9fa5]/g,"").slice(0,80)||`ai-image-${Date.now()}-${QS().slice(0,8)}.png`;if(!e.departmentId)return`\u5DF2\u751F\u6210\u56FE\u7247\uFF08${l}\xD7${u}\uFF09\u2014\u2014\u4F46\u5F53\u524D\u65E0\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0A\u4E0B\u6587\uFF08\u672A\u4FDD\u5B58\uFF09\u2014\u2014\u56FE\u7247 URL\uFF1A${o}`;let{resolveDepartmentWorkspace:d}=await Promise.resolve().then(()=>(Ie(),qe)),{writeFile:p}=await import("node:fs/promises"),{join:m}=await import("node:path"),h=await d(e.departmentId,null,!0);if(!h)throw new Error("\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u56FE\u7247");return await p(m(h,c),a),`\u5DF2\u751F\u6210\u56FE\u7247\u5E76\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF1A/ws/${c}\uFF08${l}\xD7${u}\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`}var vh=N(()=>{"use strict"});var Pi={};ie(Pi,{VIDEO_POLL_QUEUE:()=>Ms,createVideoPollWorker:()=>ix,createVideoTask:()=>tx,describeVideoTask:()=>ux,ensureVideoTasksTable:()=>Ii,getVideoTask:()=>lx,handleVideoPoll:()=>Sh,pollIntervalMs:()=>kh,requeuePendingVideoTasks:()=>ax});import{randomUUID as XS}from"node:crypto";function kh(){let n=Number(process.env.VIDEO_POLL_INTERVAL_MS);return Number.isFinite(n)&&n>=0?n:YS}async function Ii(n){ex=!0}async function tx(n,e){let t=n.ai;if(!t)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u751F\u6210\u89C6\u9891");let r=n.queue;if(!r)throw new Error("\u672A\u542F\u7528\u540E\u53F0\u4EFB\u52A1\u961F\u5217\uFF08\u9700\u8981 REDIS_URL\uFF09\u2014\u2014\u89C6\u9891\u751F\u6210\u4E3A\u5F02\u6B65\u4EFB\u52A1\uFF081-5 \u5206\u949F\uFF09");let s=String(e.prompt??"").trim();if(!s)throw new Error("prompt \u4E3A\u5FC5\u586B\u2014\u2014\u63CF\u8FF0\u4F60\u60F3\u751F\u6210\u7684\u89C6\u9891\u753B\u9762");if(!e.departmentId)throw new Error("\u65E0\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0A\u4E0B\u6587\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u751F\u6210\u89C6\u9891\u2014\u2014\u8BF7\u901A\u8FC7\u90E8\u95E8 Agent \u8C03\u7528");let{taskId:i}=await t.createVideoTask({prompt:s,resolution:e.resolution,ratio:e.ratio,duration:e.duration,watermark:e.watermark}),o=nx(e.filename);await Ii(n.orm);let[a]=await n.orm.query.insert("video_tasks").values({app_id:String(n.appId),department_id:e.departmentId,task_id:i,prompt:s,status:"pending",filename:o,params:{resolution:e.resolution,ratio:e.ratio,duration:e.duration,watermark:e.watermark}}).returning("*").run(),l={rowId:String(a.id),appId:n.appId,taskId:i,prompt:s,filename:o,departmentId:e.departmentId,agentId:e.agentId??""};return await r.add(Ms,l,{attempts:5}),{taskId:i,rowId:String(a.id)}}function nx(n){let e=(n??"").replace(/[^\w.\-\u4e00-\u9fa5]/g,"").slice(0,80)||`ai-video-${Date.now()}-${XS().slice(0,8)}.mp4`;return/\.mp4$/i.test(e)?e:`${e}.mp4`}async function Sh(n,e,t){let r=e.ai;if(!r)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u67E5\u8BE2\u89C6\u9891\u4EFB\u52A1");let s=e.orm,i=await r.videoStatus(n.taskId);if(i.status==="pending"||i.status==="running"){await s.query.update("video_tasks").set({status:i.status,updated_at:G.now()}).where({id:{eq:n.rowId}}).run(),await ox(kh()),await t.add(Ms,n,{attempts:5});return}if(i.status==="done"){let o=await rx(i.url),{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ie(),qe)),{writeFile:l}=await import("node:fs/promises"),{join:u}=await import("node:path"),c=await a(n.departmentId,null,!0);if(!c){await s.query.update("video_tasks").set({status:"failed",error:"\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u89C6\u9891",updated_at:G.now()}).where({id:{eq:n.rowId}}).run();return}let d=u(c,n.filename);await l(d,o),await s.query.update("video_tasks").set({status:"succeeded",path:d,updated_at:G.now()}).where({id:{eq:n.rowId}}).run(),console.log(`[video-gen] task ${n.taskId} \u5DF2\u751F\u6210\u5E76\u4FDD\u5B58 ${d}`);try{await sx(e,n)}catch(p){console.error(`[video-gen] \u5B8C\u6210\u901A\u77E5\u5931\u8D25\uFF08task ${n.taskId}\uFF09:`,p?.message??p)}return}await s.query.update("video_tasks").set({status:"failed",error:i.error??null,updated_at:G.now()}).where({id:{eq:n.rowId}}).run()}async function rx(n){if(n.startsWith("data:"))return Buffer.from(n.slice(n.indexOf(",")+1),"base64");if(n.startsWith("memory://"))return Buffer.from(`memory-video:${n}`);let e=await fetch(n);if(!e.ok)throw new Error(`\u89C6\u9891\u4E0B\u8F7D\u5931\u8D25 HTTP ${e.status}`);return Buffer.from(await e.arrayBuffer())}async function sx(n,e){if(!e.agentId||!e.departmentId||!e.filename)return;let[t]=await n.orm.query.from("agents").select("name").where({id:{eq:String(e.agentId)},app_id:{eq:String(e.appId)}}).limit(1).run(),r=String(t?.name??"AI"),s=`\u{1F3AC} \u89C6\u9891\u751F\u6210\u5B8C\u6210\uFF1A/ws/${e.filename}\u2014\u2014\u5DF2\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`,[i]=await n.orm.query.insert("messages").values({department_id:e.departmentId,sender_id:String(e.agentId),content:s,msg_type:"text",ai_approved:!0}).returning("id","created_at").run();n.msg?.broadcast?.(String(e.departmentId),{type:"new_message",message:{id:String(i.id),departmentId:e.departmentId,sender_id:e.agentId,sender_name:r,sender_type:"ai",content:s,msg_type:"text",created_at:i.created_at}})}function ix(n,e){return n.worker(Ms,async t=>{await Sh(t.data,e(),n)},{concurrency:1,visibilityTimeout:6e4})}async function ax(n,e){await Ii(n);let t=await n.query.from("video_tasks").select().where({status:{in:["pending","running"]}}).run(),r=0;for(let s of t??[])await e.add(Ms,{rowId:String(s.id),appId:String(s.app_id),taskId:String(s.task_id),prompt:String(s.prompt),filename:String(s.filename??""),departmentId:String(s.department_id??""),agentId:String(s.agent_id??"")},{attempts:5}),r++;return r}async function lx(n,e){await Ii(n.orm);let[t]=await n.orm.table("video_tasks",He.video_tasks).select().where({task_id:{eq:e},app_id:{eq:String(n.appId)}}).limit(1).run();return t??null}function ux(n){let e=n.task_id;switch(n.status){case"pending":return`\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u6392\u961F\u4E2D\uFF08task_id=${e}\uFF09\u2014\u2014\u9884\u8BA1 1-5 \u5206\u949F\u2014\u2014\u8BF7\u7A0D\u540E\u7528 video_generation_status \u67E5\u8BE2`;case"running":return`\u89C6\u9891\u751F\u6210\u4E2D\uFF08task_id=${e}\uFF09\u2014\u2014\u901A\u5E38 1-5 \u5206\u949F\u2014\u2014\u8BF7\u7A0D\u540E\u8FDB\u884C\u67E5\u8BE2`;case"succeeded":return`\u2705 \u89C6\u9891\u5DF2\u751F\u6210\u5E76\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF1A/ws/${n.filename}\uFF08\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`;case"failed":return`\u274C \u89C6\u9891\u751F\u6210\u5931\u8D25\uFF08task_id=${e}\uFF09\uFF1A${n.error??"\u672A\u77E5\u539F\u56E0"}\u2014\u2014\u53EF\u91CD\u65B0\u63D0\u4EA4 generate_video`;case"canceled":return`\u89C6\u9891\u4EFB\u52A1\u5DF2\u53D6\u6D88\uFF08task_id=${e}\uFF09\u2014\u2014\u5982\u9700\u751F\u6210\u8BF7\u91CD\u65B0\u63D0\u4EA4`;case"unknown":return`\u89C6\u9891\u4EFB\u52A1\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF08task_id=${e}\u2014\u2014\u67E5\u8BE2\u6709\u6548\u671F 24 \u5C0F\u65F6\uFF09\u2014\u2014\u5982\u9700\u751F\u6210\u8BF7\u91CD\u65B0\u63D0\u4EA4`;default:return`\u89C6\u9891\u4EFB\u52A1\u72B6\u6001\u672A\u77E5\uFF08task_id=${e}\uFF0Cstatus=${n.status}\uFF09`}}var Ms,YS,ex,ox,Ni=N(()=>{"use strict";Ar();re();Ms="video-task.poll",YS=15e3;ex=!1;ox=n=>new Promise(e=>setTimeout(e,n))});var lc={};ie(lc,{createOrchestrationRun:()=>cx,createWorkerRun:()=>dx,finishOrchestrationRun:()=>px,finishWorkerRun:()=>mx});async function cx(n,e){let[t]=await n.orm.query.insert("agent_runs").values({app_id:e.appId,department_id:e.departmentId||null,orchestrator_id:e.orchestratorId,kind:"orchestration",plan_json:e.plan,status:"running",request_id:e.requestId??null}).returning("id").run();return String(t.id)}async function dx(n,e){let[t]=await n.orm.query.insert("agent_runs").values({app_id:e.appId,department_id:e.departmentId||null,orchestrator_id:e.agentId,parent_run_id:e.parentRunId,kind:"worker",plan_json:{message:e.message},status:"running"}).returning("id").run();return String(t.id)}async function px(n,e){await n.orm.query.update("agent_runs").set({status:e.status,worker_results:e.workers,updated_at:G.now()}).where({id:{eq:e.runId}}).run()}async function mx(n,e){await n.orm.query.update("agent_runs").set({status:e.status,worker_results:{result:e.result??null,error:e.error??null},updated_at:G.now()}).where({id:{eq:e.runId}}).run()}var uc=N(()=>{"use strict";re()});function Z(n){let e={};for(let[t,r]of Object.entries(He))e[t]=n.table(t,r);return e}var cc,nt=N(()=>{"use strict";re();Ar();cc={app_id:R.req(b.uuid()),user_id:R.req(b.uuid()),role:R.req(b.string()),invited_by:b.uuid().nullable(),joined_at:R.now(b.date()),source:b.string().nullable(),last_login_at:b.date().nullable()}});var Ln={};ie(Ln,{clusterEvents:()=>xh,hostEventIngest:()=>gx,resetSandboxEvents:()=>fx,sandboxEmit:()=>le,sandboxEvents:()=>It,subscribeSandboxEvents:()=>jn});function le(n,e,t){let r={entity:"sandbox",action:n,ts:Date.now()};e!=null&&(r.target=e),t!=null&&(r.payload=t),Ir<5e3?(dc[(Or+Ir)%5e3]=r,Ir++):(dc[Or]=r,Or=(Or+1)%5e3);for(let s of pc)try{s(r)}catch{}}function jn(n){return pc.add(n),()=>{pc.delete(n)}}function It(n=100,e){let t=new Array(Ir);for(let s=0;s<Ir;s++)t[s]=dc[(Or+s)%5e3];let r=t.slice(-n);return e?r.filter(s=>!(e.sandboxId&&s.target!==e.sandboxId||e.action&&s.action!==e.action)):r}function fx(){Or=0,Ir=0}function gx(n){let e={...n,ts:Date.now()};Pr<Mi?(mc[($s+Pr)%Mi]=e,Pr++):(mc[$s]=e,$s=($s+1)%Mi)}function xh(n=100,e){let t=It(1e3,{sandboxId:e?.sandboxId,action:e?.action}),r=e?.hostId?t.filter(o=>o.payload?.hostId===e.hostId||e.hostId==="local"&&!o.payload?.hostId):t,s=new Array(Pr);for(let o=0;o<Pr;o++)s[o]=mc[($s+o)%Mi];let i=Pr>0?s.filter(o=>!(e?.hostId&&o.payload?.hostId!==e.hostId||e?.sandboxId&&o.target!==e.sandboxId||e?.action&&o.action!==e.action)):[];return[...r,...i].slice(-n)}var dc,Or,Ir,pc,Mi,mc,$s,Pr,Ye=N(()=>{"use strict";dc=[],Or=0,Ir=0,pc=new Set;Mi=2e4,mc=[],$s=0,Pr=0;if(typeof globalThis<"u"){let n=globalThis;n.__sandbox_events||(n.__sandbox_events=(e=100,t)=>It(e,t),n.__sandbox_tail=(e=50)=>It(e),n.__cluster_events=(e=100,t)=>xh(e,t))}});var gc={};ie(gc,{HOST_ID:()=>ke,hostCapacity:()=>fc});function fc(){let n=Number(process.env.SANDBOX_POOL_BUDGET_MB??0),e=Number(process.env.SANDBOX_CPU_LIMIT??1);return{hostId:ke,memoryMb:n,cpus:e,containers:0}}var ke,an=N(()=>{"use strict";ke=process.env.SANDBOX_HOST_ID??"local"});var Fe={};ie(Fe,{DockerSandbox:()=>$i,sandbox:()=>hc});import{execFile as hx,spawn as wx}from"node:child_process";import{resolve as yx,dirname as bx}from"node:path";import{fileURLToPath as _x}from"node:url";import{randomUUID as Rh}from"node:crypto";function qs(n){return ln+n}function ge(n,e){return new Promise(t=>{hx("docker",n,{timeout:e??15e3,maxBuffer:10*1024*1024},(r,s,i)=>{let o=r?r.code??1:0;t({stdout:s??"",stderr:i??"",exitCode:o})})})}var vx,kx,ln,$i,hc,De=N(()=>{"use strict";Ye();an();vx=bx(_x(import.meta.url)),kx={image:process.env.SANDBOX_IMAGE??"ap-sandbox:latest",execTimeoutMs:35e3,enabled:process.env.SANDBOX_DISABLE!=="1",agentPath:yx(vx,"../../dist/sandbox/sandbox-agent")},ln="ap-sandbox-";$i=class{hostId=ke;opts;busy=new Set;inflightEnsure=new Map;execChains=new Map;availability=null;availCache=null;readyCache=new Map;execStats={execCount:0,execTimeouts:0,execErrors:0};runningExecs=new Map;onExecEvent=null;agentToken=new Map;agentPort=new Map;constructor(e){this.opts={...kx,...e}}async probe(){if(!this.opts.enabled)return this.availability={dockerOk:!1,imageOk:!1},this.availability;if(this.availCache){let s=this.availCache.value.dockerOk?6e4:1e4;if(Date.now()-this.availCache.at<s)return this.availability=this.availCache.value,this.availCache.value}let t=(await ge(["version","--format","{{.Server.Version}}"],1e4)).exitCode===0,r=!1;return t&&(r=(await ge(["image","inspect",this.opts.image,"--format","{{.Id}}"],1e4)).exitCode===0),this.availCache={at:Date.now(),value:{dockerOk:t,imageOk:r}},this.availability={dockerOk:t,imageOk:r},this.availability}async ensureImage(){let e=await this.probe();return e.dockerOk?e.imageOk?!0:(await ge(["pull",this.opts.image],12e4)).exitCode===0?(this.availability={dockerOk:!0,imageOk:!0},!0):!1:!1}isBusy(e){return this.busy.has(e)}async ensure(e,t){if(!this.opts.enabled)return!1;let r=this.inflightEnsure.get(e);if(r)return r;let s=this.doEnsure(e,t);this.inflightEnsure.set(e,s);try{return await s}finally{this.inflightEnsure.delete(e)}}async doEnsure(e,t){let r=`${t.ws}|${t.image??this.opts.image}|${t.network?"bridge":"none"}|${t.memoryMb??512}|${t.cpus??1}`,s=this.readyCache.get(e);if(s&&s.fingerprint===r&&Date.now()-s.at<3e4)return le("ensure:cache-hit",e,{fingerprint:r,hostId:this.hostId}),!0;let i=await this.probe();if(!i.dockerOk)return!1;let o=t.image??this.opts.image;if(o!==this.opts.image){if((await ge(["image","inspect",o,"--format","{{.Id}}"],1e4)).exitCode!==0&&(le("image:pull",e,{image:o}),(await ge(["pull",o],12e4)).exitCode!==0))return!1}else if(!i.imageOk&&!await this.ensureImage())return!1;let a=qs(e),l=await this.inspectState(a);if(l){let d=await this.specDrift(a,t,o);if(l.running&&!d)return await this.agentHealthy(a)?(this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0):(this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0);if(!l.running&&!d){if((await ge(["start",a],15e3)).exitCode===0)return this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0;await ge(["rm","-f",a])}else await ge(["rm","-f",a])}let u=this.runArgs(e,t,o),c=await ge(u,3e4);if(c.exitCode!==0)if(c.stderr.includes("Conflict")){if(await ge(["rm","-f",a]),(await ge(u,3e4)).exitCode!==0)return!1}else return!1;return this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0}async inspectState(e){let t=await ge(["ps","-a","--filter",`name=^${e}$`,"--format","{{.Names}}"],1e4);if(t.exitCode!==0||!t.stdout.trim())return null;let r=await ge(["inspect",e,"--format","{{.State.Running}}"],1e4);return{running:r.exitCode===0&&r.stdout.trim()==="true"}}async agentHealthy(e){let t=await this.dockerExec(e,["wget","-qO-","http://127.0.0.1:5711/healthz"],"");if(t.exitCode!==0||t.timedOut)return!1;try{return JSON.parse(t.output)?.ok===!0}catch{return!1}}async specDrift(e,t,r){let s=await ge(["inspect",e,"--format","{{ range .Mounts }}{{ .Source }}={{ .Destination }};{{ end }}|{{.Config.Image}}|{{.HostConfig.NetworkMode}}"],1e4);if(s.exitCode!==0)return!0;let[i,o,a]=s.stdout.split("|");if(!i||!i.includes(`${t.ws}=/ws`)||!i.includes("/opt/sandbox/sandbox-agent")||o!==r)return!0;let l=t.network?"bridge":"none";return a!==l}runArgs(e,t,r){let s=(t.memoryMb??512)*1024*1024,i=t.cpus??1;return le("mount:bind",e,{hostPath:t.ws,containerPath:"/ws",mode:"rw",hostId:this.hostId}),["run","-d","--name",qs(e),"-v",`${t.ws}:/ws`,"-v",`${this.opts.agentPath}:/opt/sandbox/sandbox-agent:ro`,"--entrypoint","/opt/sandbox/sandbox-agent","-e",`SANDBOX_AGENT_TOKEN=${this.agentToken.get(e)??(this.agentToken.set(e,Rh()),this.agentToken.get(e))}`,"-p","127.0.0.1::5711","-w","/ws","--network",t.network?"bridge":"none",...t.network?["--add-host","host.docker.internal:host-gateway"]:[],"-m",`${s}`,"--memory-swap",`${s}`,"--cpus",String(i),"--pids-limit","256","--cap-drop","ALL","--security-opt","no-new-privileges","--ulimit","nofile=1024:1024","--user","node",r]}async dispose(e){this.agentToken.delete(e),this.agentPort.delete(e),await ge(["rm","-f",qs(e)])}async runOnce(e,t,r,s,i){if(!this.opts.enabled)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\uFF08SANDBOX_DISABLE\uFF09\u2014\u2014\u5DE5\u5177\u5DF2\u7981\u7528"};let o=i?.execTimeoutMs??this.opts.execTimeoutMs;if(!(await this.probe()).dockerOk)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u547D\u4EE4\u6267\u884C\u5DF2\u7981\u7528\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"};let l=t.image??this.opts.image;if((await ge(["image","inspect",l,"--format","{{.Id}}"],1e4)).exitCode!==0&&(await ge(["pull",l],12e4)).exitCode!==0)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u955C\u50CF\u7F3A\u5931"};let c=ln+"e-"+e.slice(0,8)+"-"+Math.random().toString(36).slice(2,8),d=(t.memoryMb??512)*1024*1024,p=["run","-d","--name",c,"-v",`${t.ws}:/ws`,"-v",`${this.opts.agentPath}:/opt/sandbox/sandbox-agent:ro`,"--entrypoint","/opt/sandbox/sandbox-agent","-e",`SANDBOX_AGENT_TOKEN=${this.agentToken.get(e)??(this.agentToken.set(e,Rh()),this.agentToken.get(e))}`,"-p","127.0.0.1::5711","-w","/ws","--network",t.network?"bridge":"none",...t.network?["--add-host","host.docker.internal:host-gateway"]:[],"-m",`${d}`,"--memory-swap",`${d}`,"--cpus",String(t.cpus??1),"--pids-limit","256","--cap-drop","ALL","--security-opt","no-new-privileges","--ulimit","nofile=1024:1024","--user","node",l],m=await ge(p,3e4);if(m.exitCode!==0)return{ok:!1,error:`\u4E00\u6B21\u6027\u5BB9\u5668\u521B\u5EFA\u5931\u8D25: ${m.stderr.trim()||"unknown"}`};try{let h=JSON.stringify({tool:r,args:s}),f=Math.max(3,Math.floor(o/1e3)),g=await this.dockerExec(c,["-e",`SANDBOX_EXEC_TIMEOUT_SECS=${f}`,"timeout","-s","KILL",String(f),"/opt/sandbox/sandbox-agent","exec"],h);if(g.timedOut)return{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${f}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0};if(g.exitCode!==0)return g.exitCode===124||g.exitCode===137?{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${f}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0}:{ok:!1,error:`\u5BB9\u5668\u6267\u884C\u5931\u8D25 (exit ${g.exitCode}): ${g.output||"unknown"}`,exitCode:g.exitCode};try{let w=JSON.parse(g.output);return w.ok?{ok:!0,output:String(w.output??"")}:{ok:!1,error:String(w.error??"unknown")}}catch{return{ok:!0,output:g.output}}}finally{await ge(["rm","-f",c]).catch(()=>{})}}async runTool(e,t,r,s,i){if(!this.opts.enabled)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\uFF08SANDBOX_DISABLE\uFF09\u2014\u2014\u5DE5\u5177\u5DF2\u7981\u7528"};if(!await this.ensure(e,t))return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u547D\u4EE4\u6267\u884C\u5DF2\u7981\u7528\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"};le("exec:queued",e,{tool:r,hostId:this.hostId});let a=Date.now(),u=(this.execChains.get(e)??Promise.resolve()).then(()=>this.execOnce(e,r,s,i?.execTimeoutMs));this.execChains.set(e,u.catch(()=>{}));let c=await u,d=Date.now()-a;if(!c.ok&&!c.timedOut&&c.error&&c.error.includes("not running")&&(this.readyCache.delete(e),await this.ensure(e,t))){let h=(this.execChains.get(e)??Promise.resolve()).then(()=>this.execOnce(e,r,s));return this.execChains.set(e,h.catch(()=>{})),h}return c}async execOnce(e,t,r,s){this.busy.add(e),this.execStats.execCount++;let i=s??this.opts.execTimeoutMs;this.runningExecs.set(e,{tool:t,startedAt:Date.now(),timeoutMs:i}),this.onExecEvent?.(e,"exec_start",t);try{let o=JSON.stringify({tool:t,args:r}),a=Math.max(3,Math.floor(i/1e3)),l=null,u=this.agentToken.get(e),c=u?await this.agentHostPort(e):null;if(u&&c){let d=await this.httpExec(c,u,o,i);d.failed||(l={output:d.output,exitCode:d.exitCode,timedOut:d.timedOut})}if(l===null&&(l=await this.dockerExec(qs(e),["-e",`SANDBOX_EXEC_TIMEOUT_SECS=${a}`,"timeout","-s","KILL",String(a),"/opt/sandbox/sandbox-agent","exec"],o)),l.timedOut)return this.execStats.execTimeouts++,this.onExecEvent?.(e,"exec_timeout",`${t} ${a}s`),{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${a}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0};if(l.exitCode!==0)return l.exitCode===124||l.exitCode===137||l.timedOut?(this.execStats.execTimeouts++,this.onExecEvent?.(e,"exec_timeout",`${t} ${a}s`),{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${a}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0}):(this.readyCache.delete(e),this.execStats.execErrors++,this.onExecEvent?.(e,"exec_error",`${t}: ${l.output?.slice(0,200)??""}`),{ok:!1,error:`\u5BB9\u5668\u6267\u884C\u5931\u8D25 (exit ${l.exitCode}): ${l.output||"unknown"}`,exitCode:l.exitCode});try{let d=JSON.parse(l.output);return d.ok?{ok:!0,output:String(d.output??"")}:{ok:!1,error:String(d.error??"unknown")}}catch{return{ok:!0,output:l.output}}}finally{this.busy.delete(e),this.runningExecs.delete(e),this.onExecEvent?.(e,"exec_done",t)}}async agentHostPort(e){let t=this.agentPort.get(e);if(t)return t;let r=qs(e),s=await ge(["inspect",r,"--format",'{{(index (index .NetworkSettings.Ports "5711/tcp") 0).HostPort}}'],1e4);return s.exitCode!==0||!s.stdout.trim()?null:(this.agentPort.set(e,s.stdout.trim()),s.stdout.trim())}async httpExec(e,t,r,s){let i=new AbortController,o=setTimeout(()=>i.abort(),s+5e3);try{let a=await fetch(`http://127.0.0.1:${e}/exec`,{method:"POST",headers:{"content-type":"application/json","x-sandbox-token":t,"x-sandbox-timeout":String(Math.max(3,Math.floor(s/1e3)))},body:r,signal:i.signal}),l=await a.text(),u=!a.ok;return{output:l,exitCode:u?1:0,timedOut:!1,failed:u}}catch(a){let l=a?.name==="AbortError";return{output:"",exitCode:l?-1:1,timedOut:l,failed:!0}}finally{clearTimeout(o)}}async dockerExec(e,t,r){return new Promise(s=>{let i=t.findIndex(p=>p==="-e"),o=i>=0?t.slice(i,i+2):[],a=i>=0?[...t.slice(0,i),...t.slice(i+2)]:t,l=wx("docker",["exec","-i",...o,e,...a],{stdio:["pipe","pipe","pipe"]}),u="",c="",d=setTimeout(()=>{l.kill("SIGKILL"),s({output:(u+c).trim()||`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${Math.floor(this.opts.execTimeoutMs/1e3)}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,exitCode:-1,timedOut:!0})},this.opts.execTimeoutMs+5e3);l.stdout.on("data",p=>{u+=p}),l.stderr.on("data",p=>{c+=p}),l.on("error",()=>{clearTimeout(d),s({output:"docker exec \u5931\u8D25\uFF08\u5BB9\u5668\u53EF\u80FD\u5DF2\u88AB\u56DE\u6536\uFF09",exitCode:1,timedOut:!1})}),l.on("close",p=>{clearTimeout(d),s({output:(u+c).trim(),exitCode:p??1,timedOut:!1})}),r&&l.stdin.write(r),l.stdin.end()})}async listContainers(){let e=await ge(["ps","-a","--filter",`name=${ln}`,"--format","{{.Names}} {{.Status}} {{.Image}} {{.CreatedAt}}"],1e4);return e.exitCode!==0?[]:e.stdout.trim().split(`
199
- `).filter(Boolean).map(t=>{let[r,s,i,o]=t.split(" ");return{name:r??"",status:s??"",image:i??"",createdAt:o??""}})}async containerStats(e){if(!e.startsWith(ln))return null;let t=await ge(["stats","--no-stream","--format","{{.CPUPerc}} {{.MemUsage}} {{.MemPerc}} {{.PIDs}} {{.NetIO}}",e],15e3);if(t.exitCode!==0)return null;let[r,s,i,o,a]=t.stdout.trim().split(" ");return{cpu:r??"-",mem:s??"-",memPct:i??"-",pids:o??"-",net:a??"-"}}async containerProcesses(e){if(!e.startsWith(ln))return[];let t=await ge(["top",e],1e4);if(t.exitCode!==0)return[];let r=t.stdout.trim().split(`
200
- `).filter(Boolean);if(r.length<=1)return[];let s=r[0].split(/\s+/);return r.slice(1).map(i=>{let o=i.split(/\s+/),a={};return s.forEach((l,u)=>{a[l]=o[u]??""}),a})}async containerAction(e,t){if(!e.startsWith(ln))return{ok:!1,message:"\u975E\u6CD5\u5BB9\u5668\u540D"};let r=t==="rm"?["rm","-f",e]:t==="stop"?["stop","-t","2",e]:[t,e];le(`container:${t}`,e.replace(ln,""),{name:e});let s=await ge(r,3e4);return s.exitCode===0?{ok:!0,message:`${t} ${e} \u6210\u529F`}:{ok:!1,message:s.stderr.trim()||`${t} \u5931\u8D25`}}async status(){let e=this.availability??await this.probe(),t=await ge(["ps","--filter",`name=${ln}`,"--format","{{.Names}}"],1e4),r=t.exitCode===0&&t.stdout.trim()?t.stdout.trim().split(`
201
- `).length:0;return{available:this.opts.enabled&&e.dockerOk&&e.imageOk,enabled:this.opts.enabled,imageReady:e.imageOk,mode:process.env.SANDBOX_MODE??"persistent",poolSize:r,maxContainers:0}}},hc=new $i});function Sx(){let n=It(2e3),e=new Map,t=r=>{let s=e.get(r);return s||(s={hostId:r,activeExecs:0,lastExecAt:0,memoryMb:0,cpus:0,load:0},e.set(r,s)),s};for(let r of n){let s=String(r.payload?.hostId??ke),i=t(s);if(r.action==="host:register"){let o=r.payload?.capacity??r.payload;i.memoryMb=Number(o?.memoryMb??0),i.cpus=Number(o?.cpus??1)}else r.action==="exec:start"?(i.activeExecs++,i.lastExecAt=Math.max(i.lastExecAt,r.ts)):(r.action==="exec:end"||r.action==="exec:timeout"||r.action==="exec:error")&&(i.activeExecs=Math.max(0,i.activeExecs-1))}for(let r of e.values()){let s=Date.now()-r.lastExecAt<3e4?.5:0;r.load=r.activeExecs+s}if(!e.has(ke)){let r=t(ke);r.memoryMb=Number(process.env.SANDBOX_POOL_BUDGET_MB??0)}return[...e.values()]}function xx(){let n=Sx(),e=n.length>0?n:[{hostId:ke,activeExecs:0,lastExecAt:0,memoryMb:Number(process.env.SANDBOX_POOL_BUDGET_MB??0),cpus:1,load:0}];return e.sort((t,r)=>t.load-r.load||r.memoryMb-t.memoryMb),{hostId:e[0].hostId,candidates:e}}function Eh(n,e,t){let{hostId:r,candidates:s}=xx();le("route",n,{selectedHost:r,candidates:s.map(i=>({hostId:i.hostId,load:i.load,activeExecs:i.activeExecs})),departmentId:e,memoryMb:t,at:new Date().toISOString()})}var Th=N(()=>{"use strict";Ye();an()});var Ee={};ie(Ee,{SandboxManager:()=>qi,manager:()=>wc});var Rx,Nr,Ex,Tx,qi,wc,Se=N(()=>{"use strict";re();Ar();De();Ye();an();Th();Rx={idleTimeoutMs:Number(process.env.SANDBOX_IDLE_TIMEOUT??600)*1e3,stopTimeoutMs:Number(process.env.SANDBOX_STOP_TIMEOUT??86400)*1e3,maxLifetimeMs:Number(process.env.SANDBOX_MAX_LIFETIME??86400)*1e3,reconcileIntervalMs:6e4,historyRetentionDays:30},Nr=Number(process.env.SANDBOX_MEMORY_LIMIT??512),Ex=Number(process.env.SANDBOX_CPU_LIMIT??1),Tx=Number(process.env.SANDBOX_POOL_BUDGET_MB??10240),qi=class{orm=null;eventsOrm=null;_eventsUnsub=null;exe;opts;timer=null;reconciling=!1;constructor(e=hc,t){this.exe=e,this.opts={...Rx,...t}}init(e,t){this.orm=e,this.eventsOrm=t??e,this.exe.onExecEvent=(r,s,i)=>this.logEvent(r,null,s,i),this._eventsUnsub?.(),this._eventsUnsub=jn(r=>{/exec:end|exec:timeout|exec:error|create|status|stop|reconcile:drift|reconcile:idle-stop|evict|queue:rejected|quota:rejected|container:/.test(r.action)&&this.logEvent(r.target??"",null,r.action,JSON.stringify(r.payload??{}).slice(0,300))})}logEvent(e,t,r,s){let i=this.eventsOrm??this.orm;i&&i.query.insert("sandbox_events").values({sandbox_id:e,app_id:t??null,type:r,detail:s??null}).run().catch(()=>{})}async eventHistory(e,t=30){if(!this.orm)return[];try{return(await this.orm.query.from("sandbox_events").select("type","detail","created_at").where({sandbox_id:{eq:e}}).orderBy("created_at","desc").limit(t).run()??[]).map(s=>({type:String(s.type),detail:s.detail?String(s.detail):null,created_at:String(s.created_at)}))}catch{return[]}}counters={created:0,terminated:0,evicted:0,idleStopped:0,autoStarted:0,orphansCleaned:0,execCount:0,execErrors:0,execTimeouts:0};async list(e,t){if(!this.orm)return[];let r=["requested","running","stopped","terminated","error"].includes(t?.status??"")?t.status:null,s={app_id:{eq:e}};return r&&(s.status={eq:r}),t?.department_id&&(s.department_id={eq:t.department_id}),await this.orm.table("sandboxes",He.sandboxes).select().where(s).orderBy("created_at","desc").run()}async get(e,t){return this.orm?(await this.orm.table("sandboxes",He.sandboxes).select().where({id:{eq:String(e)},app_id:{eq:String(t)}}).limit(1).run())?.[0]??null:null}async byDepartment(e){return this.orm?(await this.orm.table("sandboxes",He.sandboxes).select().where({department_id:{eq:e},status:{ne:"terminated"}}).limit(1).run())?.[0]??null:null}async runTool(e,t,r,s,i){if(!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let o=await this.byDepartment(e);if(!o){let[m]=await this.orm.query.from("departments").select("name","app_id").where({id:{eq:e}}).limit(1).run();if(!m)return{ok:!1,error:"\u90E8\u95E8\u4E0D\u5B58\u5728\u2014\u2014\u65E0\u6CD5\u521B\u5EFA\u5DE5\u4F5C\u73AF\u5883"};try{o=await this.create({appId:String(m.app_id),departmentId:e,name:String(m.name??"\u5DE5\u4F5C\u73AF\u5883"),workspace:t,network:i?.network})}catch(h){return{ok:!1,error:`\u6C99\u76D2\u521B\u5EFA\u5931\u8D25: ${h?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}if(o.status==="terminated"||!o.workspace)return{ok:!1,error:"\u6C99\u76D2\u5DF2\u7EC8\u6B62\u2014\u2014\u8BF7\u91CD\u65B0\u521B\u5EFA"};let a={ws:t||o.workspace,image:o.image,network:i?.network??o.network,memoryMb:o.memory_mb,cpus:o.cpus};this.counters.execCount++;let l=globalThis.__platform_metrics;l&&l.sandboxCalls++,le("exec:start",o.id,{departmentId:e,tool:r,mode:o.mode,hostId:ke});let u=Date.now(),c=o.mode==="ephemeral"?await this.exe.runOnce(o.id,a,r,s,{execTimeoutMs:i?.execTimeoutMs}):await this.exe.runTool(o.id,a,r,s,{execTimeoutMs:i?.execTimeoutMs}),d=Date.now()-u;c.ok||(c.timedOut?this.counters.execTimeouts++:this.counters.execErrors++),le(c.ok?"exec:end":c.timedOut?"exec:timeout":"exec:error",o.id,{departmentId:e,tool:r,ms:d,error:c.error?.slice(0,200),code:c.ok?void 0:c.timedOut?"timeout":"exec_error",hostId:ke});let p=c.ok?"running":c.error?.includes("\u6C99\u76D2\u4E0D\u53EF\u7528")||c.error?.includes("docker")||c.error?.includes("\u955C\u50CF")?"error":null;return await this.touch(o.id,p,p==="error"?c.error?.slice(0,500)??"\u672A\u77E5\u9519\u8BEF":null).catch(()=>{}),c}async touch(e,t,r){this.orm&&(t&&le("status",e,{status:t,error:r?.slice(0,200)}),await this.orm.query.update("sandboxes").set({last_used_at:G.now(),error:r??null,updated_at:G.now(),...t?{status:t}:{}}).where({id:{eq:String(e)}}).run())}async create(e){if(!this.orm)throw new Error("\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");let[t]=await this.orm.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:e.appId}}).limit(1).run(),r=Number(t?.sandbox_quota??5),[s]=await this.orm.query.from("sandboxes").count("*","n").where({app_id:{eq:e.appId},status:{in:["requested","running"]}}).run();if(Number(s?.n??0)>=r)throw this.logEvent("quota",String(e.appId),"quota_rejected",`quota=${r} name=${e.name}`),le("quota:rejected",void 0,{appId:e.appId,quota:r,name:e.name}),new Error(`\u6C99\u76D2\u914D\u989D\u5DF2\u6EE1\uFF08${r} \u4E2A\uFF09\u2014\u2014\u8BF7\u5148\u7EC8\u6B62\u4E0D\u7528\u7684\u6C99\u76D2`);let i=e.memoryMb??Nr;if(await this.ensurePoolBudget(i),e.departmentId){let o=await this.byDepartment(e.departmentId);if(o)return o}try{let o=new Date(Date.now()+this.opts.maxLifetimeMs).toISOString(),a=await this.orm.query.insert("sandboxes").values({app_id:e.appId,department_id:e.departmentId??null,name:e.name,status:"requested",mode:e.mode??"persistent",image:e.image??"ap-sandbox:latest",network:e.network??!0,memory_mb:e.memoryMb??Nr,cpus:e.cpus??Ex,workspace:e.workspace??null,expires_at:o}).returning("*").run();return this.counters.created++,this.logEvent(String(a[0].id),String(e.appId),"created",`name=${e.name}`),le("create",String(a[0].id),{appId:e.appId,departmentId:e.departmentId,name:e.name,memoryMb:e.memoryMb??Nr,hostId:ke}),le("host:register",void 0,{...fc(),at:new Date().toISOString()}),Eh(String(a[0].id),e.departmentId??null,e.memoryMb??Nr),a[0]}catch(o){if(String(o?.code??"")==="23505"||/duplicate key/.test(String(o?.message??""))){let a=await this.byDepartment(String(e.departmentId??""));if(a)return a}throw o}}async ensurePoolBudget(e){let t=this.opts.poolBudgetMb??Tx;if(!this.orm||t<=0)return;let[r]=await this.orm.query.from("sandboxes").sum("memory_mb","used").where({status:{in:["requested","running","error"]}}).run(),s=Number(r?.used??0);if(s+e<=t)return;let i=await this.orm.table("sandboxes",He.sandboxes).select().where({status:{ne:"terminated"}}).orderBy("last_used_at","asc").orderBy("created_at","asc").run();for(let o of i){if(s+e<=t)break;this.exe.isBusy(o.id)||(le("evict",o.id,{reason:"pool-budget",detail:`LRU \u9A71\u9010\uFF08\u9884\u7B97 ${t}MB\u2014\u2014\u91CA\u653E ${o.memory_mb??Nr}MB\uFF09`}),await this.exe.dispose(o.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:G.now(),updated_at:G.now()}).where({id:{eq:o.id}}).run(),s-=Number(o.memory_mb??Nr),this.counters.evicted++)}if(s+e>t)throw le("queue:rejected",void 0,{reason:"pool-budget",detail:`\u9884\u7B97 ${t}MB\u2014\u2014\u9700\u8981 ${e}MB`}),new Error(`\u6C99\u76D2\u6C60\u5185\u5B58\u4E0D\u8DB3\uFF08\u9884\u7B97 ${t}MB\uFF09\u2014\u2014\u8BF7\u7EC8\u6B62\u4E0D\u7528\u7684\u6C99\u76D2\u6216\u63D0\u5347 SANDBOX_POOL_BUDGET_MB`)}async statusCounts(){if(!this.orm)return{};try{let e=await this.orm.query.from("sandboxes").select("status").count("*","n").groupBy("status").run(),t={};for(let r of e??[])t[String(r.status)]=Number(r.n??0);return t}catch{return{}}}async terminate(e,t){if(!this.orm)return;let r=await this.get(e,t);!r||r.status==="terminated"||(await this.exe.dispose(r.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:G.now(),error:null,updated_at:G.now()}).where({id:{eq:String(e)}}).run(),this.counters.terminated++,this.logEvent(e,t,"terminated"))}async start(e,t){if(!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let r=await this.get(e,t);if(!r)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u5B58\u5728"};if(!r.workspace)return{ok:!1,error:"\u6C99\u76D2\u65E0\u5DE5\u4F5C\u76EE\u5F55\u2014\u2014\u65E0\u6CD5\u542F\u52A8"};let s={ws:r.workspace,image:r.image,network:r.network,memoryMb:r.memory_mb,cpus:r.cpus};return await this.exe.ensure(r.id,s)?(await this.orm.query.update("sandboxes").set({status:"running",error:null,last_used_at:G.now(),updated_at:G.now()}).where({id:{eq:r.id}}).run(),this.logEvent(String(r.id),String(t),"started"),{ok:!0}):(await this.orm.query.update("sandboxes").set({status:"error",error:"\u5BB9\u5668\u542F\u52A8\u5931\u8D25\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09",updated_at:G.now()}).where({id:{eq:r.id}}).run(),{ok:!1,error:"\u5BB9\u5668\u542F\u52A8\u5931\u8D25\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"})}async stop(e,t){if(le("stop",e,{appId:t}),!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let r=await this.get(e,t);if(!r)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u5B58\u5728"};if(this.exe.isBusy(r.id))return{ok:!1,error:"\u6C99\u76D2\u6B63\u5728\u6267\u884C\u4EFB\u52A1\u2014\u2014\u4E0D\u80FD\u505C\u6B62"};let s=await this.exe.containerAction(`ap-sandbox-${r.id}`,"stop");return s.ok?(await this.orm.query.update("sandboxes").set({status:"stopped",updated_at:G.now()}).where({id:{eq:r.id}}).run(),this.logEvent(String(r.id),String(t),"stopped"),{ok:!0}):{ok:!1,error:s.message}}async restart(e,t){let r=await this.stop(e,t);return r.ok?this.start(e,t):r}async updateConfig(e,t,r){if(!this.orm)return;let s={updated_at:G.now()};r.image!==void 0&&(s.image=r.image),r.network!==void 0&&(s.network=r.network),r.memoryMb!==void 0&&(s.memory_mb=r.memoryMb),r.cpus!==void 0&&(s.cpus=r.cpus),await this.orm.query.update("sandboxes").set(s).where({id:{eq:String(e)},app_id:{eq:String(t)}}).run()}async terminateByDepartment(e){if(!this.orm)return;let t=await this.orm.table("sandboxes",He.sandboxes).select().where({department_id:{eq:e},status:{ne:"terminated"}}).run();for(let r of t??[])await this.terminate(String(r.id),String(r.app_id))}startReaper(){this.timer||!this.orm||(this.timer=setInterval(()=>{this.reconcile()},this.opts.reconcileIntervalMs),this.timer.unref?.())}async stopReaper(){this.timer&&(clearInterval(this.timer),this.timer=null)}async reconcile(){le("reconcile:start",void 0,{});let e={created:0,started:0,stopped:0,terminated:0,orphans:0,error:0};if(!this.orm||this.reconciling)return le("reconcile:skip",void 0,{reason:this.reconciling?"already-running":"no-db"}),e;this.reconciling=!0;try{let t=Date.now(),r=await this.orm.query.from("sandboxes").select().where({status:{in:["requested","running","stopped","error"]}}).run(),s=await this.exe.listContainers(),i=new Map;for(let a of s){let l=String(a.name??"").replace("ap-sandbox-","");i.set(l,{running:String(a.status??"").startsWith("Up"),name:String(a.name)})}let o=new Set(r.map(a=>a.id));for(let[a,l]of i)o.has(a)||(le("reconcile:drift",a,{reason:"orphan",detail:"\u5BB9\u5668\u5B58\u5728\u4F46 DB \u65E0\u8BB0\u5F55\uFF08\u7ED5\u8FC7\u70B9\u2014\u2014\u5916\u90E8\u521B\u5EFA\u65E0\u4E8B\u4EF6\uFF09",action:"rm"}),await this.exe.containerAction(l.name,"rm").catch(()=>{}),e.orphans++,this.counters.orphansCleaned++);for(let a of r){let l=i.get(a.id);if(this.exe.isBusy(a.id))continue;let u=a.last_used_at?new Date(a.last_used_at).getTime():new Date(a.created_at).getTime();if(a.status==="running"||a.status==="error"||a.status==="requested"){a.status==="error"&&e.error++;let c=new Date(a.created_at).getTime();if(a.status==="running"&&this.opts.maxLifetimeMs>0&&t-c>this.opts.maxLifetimeMs&&a.mode!=="ephemeral"){le("reconcile:drift",a.id,{reason:"expired",detail:`\u8D85\u9F84\u91CD\u5EFA\uFF08${Math.round((t-c)/6e4)}min\uFF09`,action:"recreate"}),await this.exe.dispose(a.id).catch(()=>{}),e.terminated++;continue}if(a.status==="running"&&t-u>this.opts.idleTimeoutMs&&a.mode!=="ephemeral"){le("reconcile:idle-stop",a.id,{idleMs:t-u}),await this.exe.containerAction(`ap-sandbox-${a.id}`,"stop").catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"stopped",updated_at:G.now()}).where({id:{eq:a.id}}).run(),e.stopped++,this.counters.idleStopped++;continue}if(a.status!=="requested"&&(!l||!l.running)&&(le("reconcile:drift",a.id,{reason:l?"container-stopped":"container-missing",detail:`\u671F\u671B ${a.status} \u4F46\u5BB9\u5668${l?"\u5DF2\u505C\u6B62":"\u7F3A\u5931"}\uFF08\u5916\u90E8\u64CD\u4F5C\u65E0\u4E8B\u4EF6\uFF1F\uFF09`,action:"restart"}),a.workspace)){let d={ws:a.workspace,image:a.image,network:a.network,memoryMb:a.memory_mb,cpus:a.cpus};await this.exe.ensure(a.id,d)&&(e.started++,this.counters.autoStarted++,a.status==="error"&&await this.orm.query.update("sandboxes").set({status:"running",error:null,updated_at:G.now()}).where({id:{eq:a.id}}).run())}}else if(a.status==="stopped"){let c=a.updated_at?new Date(a.updated_at).getTime():t;t-c>this.opts.stopTimeoutMs&&a.mode!=="ephemeral"&&(await this.exe.dispose(a.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:G.now(),updated_at:G.now()}).where({id:{eq:a.id}}).run(),e.terminated++)}}await this.orm.query.delete("sandboxes").where({status:{eq:"terminated"},terminated_at:{lt:new Date(Date.now()-this.opts.historyRetentionDays*864e5).toISOString()}}).run().catch(()=>{})}finally{this.reconciling=!1}e.error>0&&console.warn(`[agent-platform] \u6C99\u76D2 reconcile\uFF1A${e.error} \u4E2A\u73AF\u5883\u5904\u4E8E error \u72B6\u6001`);try{let t=Number(process.env.SANDBOX_EVENT_RETENTION??7);await this.orm.query.delete("sandbox_events").where({created_at:{lt:new Date(Date.now()-t*864e5).toISOString()}}).run()}catch{}return le("reconcile:end",void 0,{...e}),e}},wc=new qi});var _c={};ie(_c,{SkillRegistry:()=>Mr,buildSkillMeta:()=>bc,detectSkill:()=>Oh,discoverSkills:()=>Ox,loadSkill:()=>js,parseSkillFrontmatter:()=>yc});import{readFileSync as Ch}from"node:fs";import{readdir as Cx,access as Ah}from"node:fs/promises";import{join as Ds,resolve as Ax}from"node:path";function yc(n){let e={},t=n.match(/^---\n([\s\S]*?)\n---/);if(!t)return e;let r=t[1];for(let s of r.split(`
202
- `)){let i=s.indexOf(":");if(i===-1)continue;let o=s.slice(0,i).trim(),a=s.slice(i+1).trim();o&&a&&(e[o]=a)}return e}function bc(n){let e=n.name?.trim(),t=n.description?.trim();return!e||!t?null:{name:e.slice(0,64),description:t.slice(0,1024),version:n.version?.trim()}}async function Oh(n){try{return await Ah(Ds(n,"SKILL.md")),!0}catch{return!1}}async function Ox(n){let e=[];try{let t=await Cx(n,{withFileTypes:!0});for(let r of t){if(!r.isDirectory())continue;let s=Ds(n,r.name);if(await Oh(s)){let i=Ds(s,"SKILL.md"),o=Ch(i,"utf-8"),a=yc(o),l=bc(a);l&&e.push({meta:l,dir:s})}}}catch{}return e}async function js(n,e){let t=Ds(n,"SKILL.md"),r=Ch(t,"utf-8"),s=yc(r),i=bc(s);if(!i)throw new Error(`Skill at ${n} \u7F3A\u5C11 name \u6216 description`);let o=Ds(n,"tools.ts");try{await Ah(o)}catch{throw new Error(`Skill "${i.name}" \u7F3A\u5C11 tools.ts`)}let l=await import(Ax(o)),u=l.tools??[],c=l.createHandlers?.(e)??{};if(u.length===0)throw new Error(`Skill "${i.name}" \u7684 tools.ts \u672A\u5BFC\u51FA tools[]`);return{dir:n,meta:i,tools:u,handlers:c}}var Mr,Ls=N(()=>{"use strict";Mr=class{skills=new Map;agentId;constructor(e){this.agentId=e}getAgentId(){return this.agentId}getLoadedSkillNames(){return[...this.skills.keys()]}getSkillDescriptors(){return[...this.skills.values()].map(e=>({meta:e.meta,dir:e.dir}))}async loadSkill(e,t){let r=await js(e,t);return this.skills.set(r.meta.name,r),r}registerSkill(e){this.skills.set(e.meta.name,e)}unloadSkill(e){return this.skills.delete(e)}getTools(){let e=[];for(let t of this.skills.values())e.push(...t.tools);return e}async executeTool(e,t,r){for(let s of this.skills.values()){let i=s.handlers[e];if(i){let o=await i(t,r);return typeof o=="string"?o:JSON.stringify(o)}}throw new Error(`tool "${e}" not registered in any loaded skill`)}hasTool(e){for(let t of this.skills.values())if(t.handlers[e])return!0;return!1}clear(){this.skills.clear()}get size(){return this.skills.size}}});var Ih,Ph=N(()=>{"use strict";Ih=`
198
+ `)}var bh=I(()=>{"use strict"});var De={};ie(De,{getDefaultWorkspaceRoot:()=>zS,resolveDepartmentWorkspace:()=>cc,workspace:()=>KS});import{resolve as uc,join as VS}from"node:path";import{mkdir as _h}from"node:fs/promises";async function cc(n,e,t){if(!t||!n)return null;if(e){let s=uc(e);return await _h(s,{recursive:!0}),s}let r=VS(vh,n);return await _h(r,{recursive:!0}),r}function zS(){return vh}function KS(){let n=(e,t,r)=>r(e,t);return n.__meta={injects:["workspace"],depends:["ai"]},n}var vh,Ne=I(()=>{"use strict";vh=(()=>{let n=process.env.AGENT_WORKSPACE_ROOT;return n?uc(n):uc(process.cwd(),"data","workspaces")})()});var kh={};ie(kh,{generateImage:()=>JS});import{randomUUID as GS}from"node:crypto";async function QS(n){if(n.startsWith("data:image"))return Buffer.from(n.slice(n.indexOf(",")+1),"base64");let e=await fetch(n);if(!e.ok)throw new Error(`\u56FE\u7247\u4E0B\u8F7D\u5931\u8D25 HTTP ${e.status}`);return Buffer.from(await e.arrayBuffer())}async function JS(n,e){let t=n.ai;if(!t)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u751F\u6210\u56FE\u7247");let r=String(e.prompt??"").trim();if(!r)throw new Error("prompt \u4E3A\u5FC5\u586B\u2014\u2014\u63CF\u8FF0\u4F60\u60F3\u751F\u6210\u7684\u753B\u9762");let s=/^\d{2,4}\*\d{2,4}$/.test(e.size??"")?e.size:"1024*1024",o=await t.generateImage({prompt:r,size:s}),i=o.url??o.dataUrl;if(!i)throw new Error("\u56FE\u50CF\u751F\u6210\u5931\u8D25\uFF1Aprovider \u65E0\u56FE\u7247\u8FD4\u56DE");let a=await QS(i),[l,u]=s.split("*").map(Number),c=(e.filename??"").replace(/[^\w.\-\u4e00-\u9fa5]/g,"").slice(0,80)||`ai-image-${Date.now()}-${GS().slice(0,8)}.png`;if(!e.departmentId)return`\u5DF2\u751F\u6210\u56FE\u7247\uFF08${l}\xD7${u}\uFF09\u2014\u2014\u4F46\u5F53\u524D\u65E0\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0A\u4E0B\u6587\uFF08\u672A\u4FDD\u5B58\uFF09\u2014\u2014\u56FE\u7247 URL\uFF1A${i}`;let{resolveDepartmentWorkspace:d}=await Promise.resolve().then(()=>(Ne(),De)),{writeFile:p}=await import("node:fs/promises"),{join:f}=await import("node:path"),w=await d(e.departmentId,null,!0);if(!w)throw new Error("\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u56FE\u7247");return await p(f(w,c),a),`\u5DF2\u751F\u6210\u56FE\u7247\u5E76\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF1A/ws/${c}\uFF08${l}\xD7${u}\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`}var Sh=I(()=>{"use strict"});var Mi={};ie(Mi,{VIDEO_POLL_QUEUE:()=>Ds,createVideoPollWorker:()=>ox,createVideoTask:()=>ex,describeVideoTask:()=>lx,ensureVideoTasksTable:()=>Ni,getVideoTask:()=>ax,handleVideoPoll:()=>Rh,pollIntervalMs:()=>xh,requeuePendingVideoTasks:()=>ix});import{randomUUID as ZS}from"node:crypto";function xh(){let n=Number(process.env.VIDEO_POLL_INTERVAL_MS);return Number.isFinite(n)&&n>=0?n:XS}async function Ni(n){YS=!0}async function ex(n,e){let t=n.ai;if(!t)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u751F\u6210\u89C6\u9891");let r=n.queue;if(!r)throw new Error("\u672A\u542F\u7528\u540E\u53F0\u4EFB\u52A1\u961F\u5217\uFF08\u9700\u8981 REDIS_URL\uFF09\u2014\u2014\u89C6\u9891\u751F\u6210\u4E3A\u5F02\u6B65\u4EFB\u52A1\uFF081-5 \u5206\u949F\uFF09");let s=String(e.prompt??"").trim();if(!s)throw new Error("prompt \u4E3A\u5FC5\u586B\u2014\u2014\u63CF\u8FF0\u4F60\u60F3\u751F\u6210\u7684\u89C6\u9891\u753B\u9762");if(!e.departmentId)throw new Error("\u65E0\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0A\u4E0B\u6587\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u751F\u6210\u89C6\u9891\u2014\u2014\u8BF7\u901A\u8FC7\u90E8\u95E8 Agent \u8C03\u7528");let{taskId:o}=await t.createVideoTask({prompt:s,resolution:e.resolution,ratio:e.ratio,duration:e.duration,watermark:e.watermark}),i=tx(e.filename);await Ni(n.orm);let[a]=await n.orm.query.insert("video_tasks").values({app_id:String(n.appId),department_id:e.departmentId,task_id:o,prompt:s,status:"pending",filename:i,params:{resolution:e.resolution,ratio:e.ratio,duration:e.duration,watermark:e.watermark}}).returning("*").run(),l={rowId:String(a.id),appId:n.appId,taskId:o,prompt:s,filename:i,departmentId:e.departmentId,agentId:e.agentId??""};return await r.add(Ds,l,{attempts:5}),{taskId:o,rowId:String(a.id)}}function tx(n){let e=(n??"").replace(/[^\w.\-\u4e00-\u9fa5]/g,"").slice(0,80)||`ai-video-${Date.now()}-${ZS().slice(0,8)}.mp4`;return/\.mp4$/i.test(e)?e:`${e}.mp4`}async function Rh(n,e,t){let r=e.ai;if(!r)throw new Error("AI \u4E2D\u95F4\u4EF6\u672A\u6CE8\u5165\uFF08ctx.ai\uFF09\u2014\u2014\u65E0\u6CD5\u67E5\u8BE2\u89C6\u9891\u4EFB\u52A1");let s=e.orm,o=await r.videoStatus(n.taskId);if(o.status==="pending"||o.status==="running"){await s.query.update("video_tasks").set({status:o.status,updated_at:Q.now()}).where({id:{eq:n.rowId}}).run(),await sx(xh()),await t.add(Ds,n,{attempts:5});return}if(o.status==="done"){let i=await nx(o.url),{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ne(),De)),{writeFile:l}=await import("node:fs/promises"),{join:u}=await import("node:path"),c=await a(n.departmentId,null,!0);if(!c){await s.query.update("video_tasks").set({status:"failed",error:"\u90E8\u95E8\u5DE5\u4F5C\u533A\u4E0D\u53EF\u7528\u2014\u2014\u65E0\u6CD5\u4FDD\u5B58\u89C6\u9891",updated_at:Q.now()}).where({id:{eq:n.rowId}}).run();return}let d=u(c,n.filename);await l(d,i),await s.query.update("video_tasks").set({status:"succeeded",path:d,updated_at:Q.now()}).where({id:{eq:n.rowId}}).run(),console.log(`[video-gen] task ${n.taskId} \u5DF2\u751F\u6210\u5E76\u4FDD\u5B58 ${d}`);try{await rx(e,n)}catch(p){console.error(`[video-gen] \u5B8C\u6210\u901A\u77E5\u5931\u8D25\uFF08task ${n.taskId}\uFF09:`,p?.message??p)}return}await s.query.update("video_tasks").set({status:"failed",error:o.error??null,updated_at:Q.now()}).where({id:{eq:n.rowId}}).run()}async function nx(n){if(n.startsWith("data:"))return Buffer.from(n.slice(n.indexOf(",")+1),"base64");if(n.startsWith("memory://"))return Buffer.from(`memory-video:${n}`);let e=await fetch(n);if(!e.ok)throw new Error(`\u89C6\u9891\u4E0B\u8F7D\u5931\u8D25 HTTP ${e.status}`);return Buffer.from(await e.arrayBuffer())}async function rx(n,e){if(!e.agentId||!e.departmentId||!e.filename)return;let[t]=await n.orm.query.from("agents").select("name").where({id:{eq:String(e.agentId)},app_id:{eq:String(e.appId)}}).limit(1).run(),r=String(t?.name??"AI"),s=`\u{1F3AC} \u89C6\u9891\u751F\u6210\u5B8C\u6210\uFF1A/ws/${e.filename}\u2014\u2014\u5DF2\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`,[o]=await n.orm.query.insert("messages").values({department_id:e.departmentId,sender_id:String(e.agentId),content:s,msg_type:"text",ai_approved:!0}).returning("id","created_at").run();n.msg?.broadcast?.(String(e.departmentId),{type:"new_message",message:{id:String(o.id),departmentId:e.departmentId,sender_id:e.agentId,sender_name:r,sender_type:"ai",content:s,msg_type:"text",created_at:o.created_at}})}function ox(n,e){return n.worker(Ds,async t=>{await Rh(t.data,e(),n)},{concurrency:1,visibilityTimeout:6e4})}async function ix(n,e){await Ni(n);let t=await n.query.from("video_tasks").select().where({status:{in:["pending","running"]}}).run(),r=0;for(let s of t??[])await e.add(Ds,{rowId:String(s.id),appId:String(s.app_id),taskId:String(s.task_id),prompt:String(s.prompt),filename:String(s.filename??""),departmentId:String(s.department_id??""),agentId:String(s.agent_id??"")},{attempts:5}),r++;return r}async function ax(n,e){await Ni(n.orm);let[t]=await n.orm.table("video_tasks",Ve.video_tasks).select().where({task_id:{eq:e},app_id:{eq:String(n.appId)}}).limit(1).run();return t??null}function lx(n){let e=n.task_id;switch(n.status){case"pending":return`\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u6392\u961F\u4E2D\uFF08task_id=${e}\uFF09\u2014\u2014\u9884\u8BA1 1-5 \u5206\u949F\u2014\u2014\u8BF7\u7A0D\u540E\u7528 video_generation_status \u67E5\u8BE2`;case"running":return`\u89C6\u9891\u751F\u6210\u4E2D\uFF08task_id=${e}\uFF09\u2014\u2014\u901A\u5E38 1-5 \u5206\u949F\u2014\u2014\u8BF7\u7A0D\u540E\u8FDB\u884C\u67E5\u8BE2`;case"succeeded":return`\u2705 \u89C6\u9891\u5DF2\u751F\u6210\u5E76\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF1A/ws/${n.filename}\uFF08\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09`;case"failed":return`\u274C \u89C6\u9891\u751F\u6210\u5931\u8D25\uFF08task_id=${e}\uFF09\uFF1A${n.error??"\u672A\u77E5\u539F\u56E0"}\u2014\u2014\u53EF\u91CD\u65B0\u63D0\u4EA4 generate_video`;case"canceled":return`\u89C6\u9891\u4EFB\u52A1\u5DF2\u53D6\u6D88\uFF08task_id=${e}\uFF09\u2014\u2014\u5982\u9700\u751F\u6210\u8BF7\u91CD\u65B0\u63D0\u4EA4`;case"unknown":return`\u89C6\u9891\u4EFB\u52A1\u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F\uFF08task_id=${e}\u2014\u2014\u67E5\u8BE2\u6709\u6548\u671F 24 \u5C0F\u65F6\uFF09\u2014\u2014\u5982\u9700\u751F\u6210\u8BF7\u91CD\u65B0\u63D0\u4EA4`;default:return`\u89C6\u9891\u4EFB\u52A1\u72B6\u6001\u672A\u77E5\uFF08task_id=${e}\uFF0Cstatus=${n.status}\uFF09`}}var Ds,XS,YS,sx,$i=I(()=>{"use strict";Ar();re();Ds="video-task.poll",XS=15e3;YS=!1;sx=n=>new Promise(e=>setTimeout(e,n))});var dc={};ie(dc,{createOrchestrationRun:()=>ux,createWorkerRun:()=>cx,finishOrchestrationRun:()=>dx,finishWorkerRun:()=>px});async function ux(n,e){let[t]=await n.orm.query.insert("agent_runs").values({app_id:e.appId,department_id:e.departmentId||null,orchestrator_id:e.orchestratorId,kind:"orchestration",plan_json:e.plan,status:"running",request_id:e.requestId??null}).returning("id").run();return String(t.id)}async function cx(n,e){let[t]=await n.orm.query.insert("agent_runs").values({app_id:e.appId,department_id:e.departmentId||null,orchestrator_id:e.agentId,parent_run_id:e.parentRunId,kind:"worker",plan_json:{message:e.message},status:"running"}).returning("id").run();return String(t.id)}async function dx(n,e){await n.orm.query.update("agent_runs").set({status:e.status,worker_results:e.workers,updated_at:Q.now()}).where({id:{eq:e.runId}}).run()}async function px(n,e){await n.orm.query.update("agent_runs").set({status:e.status,worker_results:{result:e.result??null,error:e.error??null},updated_at:Q.now()}).where({id:{eq:e.runId}}).run()}var pc=I(()=>{"use strict";re()});function Z(n){let e={};for(let[t,r]of Object.entries(Ve))e[t]=n.table(t,r);return e}var mc,nt=I(()=>{"use strict";re();Ar();mc={app_id:R.req(y.uuid()),user_id:R.req(y.uuid()),role:R.req(y.string()),invited_by:y.uuid().nullable(),joined_at:R.now(y.date()),source:y.string().nullable(),last_login_at:y.date().nullable()}});import{dirname as mx}from"node:path";import{fileURLToPath as fx}from"node:url";var je,Or=I(()=>{"use strict";je=mx(fx(import.meta.url))});var Ln={};ie(Ln,{clusterEvents:()=>Eh,hostEventIngest:()=>hx,resetSandboxEvents:()=>gx,sandboxEmit:()=>le,sandboxEvents:()=>It,subscribeSandboxEvents:()=>jn});function le(n,e,t){let r={entity:"sandbox",action:n,ts:Date.now()};e!=null&&(r.target=e),t!=null&&(r.payload=t),Pr<5e3?(fc[(Ir+Pr)%5e3]=r,Pr++):(fc[Ir]=r,Ir=(Ir+1)%5e3);for(let s of gc)try{s(r)}catch{}}function jn(n){return gc.add(n),()=>{gc.delete(n)}}function It(n=100,e){let t=new Array(Pr);for(let s=0;s<Pr;s++)t[s]=fc[(Ir+s)%5e3];let r=t.slice(-n);return e?r.filter(s=>!(e.sandboxId&&s.target!==e.sandboxId||e.action&&s.action!==e.action)):r}function gx(){Ir=0,Pr=0}function hx(n){let e={...n,ts:Date.now()};Nr<qi?(hc[(js+Nr)%qi]=e,Nr++):(hc[js]=e,js=(js+1)%qi)}function Eh(n=100,e){let t=It(1e3,{sandboxId:e?.sandboxId,action:e?.action}),r=e?.hostId?t.filter(i=>i.payload?.hostId===e.hostId||e.hostId==="local"&&!i.payload?.hostId):t,s=new Array(Nr);for(let i=0;i<Nr;i++)s[i]=hc[(js+i)%qi];let o=Nr>0?s.filter(i=>!(e?.hostId&&i.payload?.hostId!==e.hostId||e?.sandboxId&&i.target!==e.sandboxId||e?.action&&i.action!==e.action)):[];return[...r,...o].slice(-n)}var fc,Ir,Pr,gc,qi,hc,js,Nr,Ye=I(()=>{"use strict";fc=[],Ir=0,Pr=0,gc=new Set;qi=2e4,hc=[],js=0,Nr=0;if(typeof globalThis<"u"){let n=globalThis;n.__sandbox_events||(n.__sandbox_events=(e=100,t)=>It(e,t),n.__sandbox_tail=(e=50)=>It(e),n.__cluster_events=(e=100,t)=>Eh(e,t))}});var yc={};ie(yc,{HOST_ID:()=>ke,hostCapacity:()=>wc});function wc(){let n=Number(process.env.SANDBOX_POOL_BUDGET_MB??0),e=Number(process.env.SANDBOX_CPU_LIMIT??1);return{hostId:ke,memoryMb:n,cpus:e,containers:0}}var ke,an=I(()=>{"use strict";ke=process.env.SANDBOX_HOST_ID??"local"});var ze={};ie(ze,{DockerSandbox:()=>Di,sandbox:()=>bc});import{execFile as wx,spawn as yx}from"node:child_process";import{resolve as bx}from"node:path";import{randomUUID as Th}from"node:crypto";function Ls(n){return ln+n}function fe(n,e){return new Promise(t=>{wx("docker",n,{timeout:e??15e3,maxBuffer:10*1024*1024},(r,s,o)=>{let i=r?r.code??1:0;t({stdout:s??"",stderr:o??"",exitCode:i})})})}var _x,ln,Di,bc,Le=I(()=>{"use strict";Or();Ye();an();_x={image:process.env.SANDBOX_IMAGE??"ap-sandbox:latest",execTimeoutMs:35e3,enabled:process.env.SANDBOX_DISABLE!=="1",agentPath:bx(je,"dist","sandbox","sandbox-agent")},ln="ap-sandbox-";Di=class{hostId=ke;opts;busy=new Set;inflightEnsure=new Map;execChains=new Map;availability=null;availCache=null;readyCache=new Map;execStats={execCount:0,execTimeouts:0,execErrors:0};runningExecs=new Map;onExecEvent=null;agentToken=new Map;agentPort=new Map;constructor(e){this.opts={..._x,...e}}async probe(){if(!this.opts.enabled)return this.availability={dockerOk:!1,imageOk:!1},this.availability;if(this.availCache){let s=this.availCache.value.dockerOk?6e4:1e4;if(Date.now()-this.availCache.at<s)return this.availability=this.availCache.value,this.availCache.value}let t=(await fe(["version","--format","{{.Server.Version}}"],1e4)).exitCode===0,r=!1;return t&&(r=(await fe(["image","inspect",this.opts.image,"--format","{{.Id}}"],1e4)).exitCode===0),this.availCache={at:Date.now(),value:{dockerOk:t,imageOk:r}},this.availability={dockerOk:t,imageOk:r},this.availability}async ensureImage(){let e=await this.probe();return e.dockerOk?e.imageOk?!0:(await fe(["pull",this.opts.image],12e4)).exitCode===0?(this.availability={dockerOk:!0,imageOk:!0},!0):!1:!1}isBusy(e){return this.busy.has(e)}async ensure(e,t){if(!this.opts.enabled)return!1;let r=this.inflightEnsure.get(e);if(r)return r;let s=this.doEnsure(e,t);this.inflightEnsure.set(e,s);try{return await s}finally{this.inflightEnsure.delete(e)}}async doEnsure(e,t){let r=`${t.ws}|${t.image??this.opts.image}|${t.network?"bridge":"none"}|${t.memoryMb??512}|${t.cpus??1}`,s=this.readyCache.get(e);if(s&&s.fingerprint===r&&Date.now()-s.at<3e4)return le("ensure:cache-hit",e,{fingerprint:r,hostId:this.hostId}),!0;let o=await this.probe();if(!o.dockerOk)return!1;let i=t.image??this.opts.image;if(i!==this.opts.image){if((await fe(["image","inspect",i,"--format","{{.Id}}"],1e4)).exitCode!==0&&(le("image:pull",e,{image:i}),(await fe(["pull",i],12e4)).exitCode!==0))return!1}else if(!o.imageOk&&!await this.ensureImage())return!1;let a=Ls(e),l=await this.inspectState(a);if(l){let d=await this.specDrift(a,t,i);if(l.running&&!d)return await this.agentHealthy(a)?(this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0):(this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0);if(!l.running&&!d){if((await fe(["start",a],15e3)).exitCode===0)return this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0;await fe(["rm","-f",a])}else await fe(["rm","-f",a])}let u=this.runArgs(e,t,i),c=await fe(u,3e4);if(c.exitCode!==0)if(c.stderr.includes("Conflict")){if(await fe(["rm","-f",a]),(await fe(u,3e4)).exitCode!==0)return!1}else return!1;return this.readyCache.set(e,{at:Date.now(),fingerprint:r}),!0}async inspectState(e){let t=await fe(["ps","-a","--filter",`name=^${e}$`,"--format","{{.Names}}"],1e4);if(t.exitCode!==0||!t.stdout.trim())return null;let r=await fe(["inspect",e,"--format","{{.State.Running}}"],1e4);return{running:r.exitCode===0&&r.stdout.trim()==="true"}}async agentHealthy(e){let t=await this.dockerExec(e,["wget","-qO-","http://127.0.0.1:5711/healthz"],"");if(t.exitCode!==0||t.timedOut)return!1;try{return JSON.parse(t.output)?.ok===!0}catch{return!1}}async specDrift(e,t,r){let s=await fe(["inspect",e,"--format","{{ range .Mounts }}{{ .Source }}={{ .Destination }};{{ end }}|{{.Config.Image}}|{{.HostConfig.NetworkMode}}"],1e4);if(s.exitCode!==0)return!0;let[o,i,a]=s.stdout.split("|");if(!o||!o.includes(`${t.ws}=/ws`)||!o.includes("/opt/sandbox/sandbox-agent")||i!==r)return!0;let l=t.network?"bridge":"none";return a!==l}runArgs(e,t,r){let s=(t.memoryMb??512)*1024*1024,o=t.cpus??1;return le("mount:bind",e,{hostPath:t.ws,containerPath:"/ws",mode:"rw",hostId:this.hostId}),["run","-d","--name",Ls(e),"-v",`${t.ws}:/ws`,"-v",`${this.opts.agentPath}:/opt/sandbox/sandbox-agent:ro`,"--entrypoint","/opt/sandbox/sandbox-agent","-e",`SANDBOX_AGENT_TOKEN=${this.agentToken.get(e)??(this.agentToken.set(e,Th()),this.agentToken.get(e))}`,"-p","127.0.0.1::5711","-w","/ws","--network",t.network?"bridge":"none",...t.network?["--add-host","host.docker.internal:host-gateway"]:[],"-m",`${s}`,"--memory-swap",`${s}`,"--cpus",String(o),"--pids-limit","256","--cap-drop","ALL","--security-opt","no-new-privileges","--ulimit","nofile=1024:1024","--user","node",r]}async dispose(e){this.agentToken.delete(e),this.agentPort.delete(e),await fe(["rm","-f",Ls(e)])}async runOnce(e,t,r,s,o){if(!this.opts.enabled)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\uFF08SANDBOX_DISABLE\uFF09\u2014\u2014\u5DE5\u5177\u5DF2\u7981\u7528"};let i=o?.execTimeoutMs??this.opts.execTimeoutMs;if(!(await this.probe()).dockerOk)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u547D\u4EE4\u6267\u884C\u5DF2\u7981\u7528\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"};let l=t.image??this.opts.image;if((await fe(["image","inspect",l,"--format","{{.Id}}"],1e4)).exitCode!==0&&(await fe(["pull",l],12e4)).exitCode!==0)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u955C\u50CF\u7F3A\u5931"};let c=ln+"e-"+e.slice(0,8)+"-"+Math.random().toString(36).slice(2,8),d=(t.memoryMb??512)*1024*1024,p=["run","-d","--name",c,"-v",`${t.ws}:/ws`,"-v",`${this.opts.agentPath}:/opt/sandbox/sandbox-agent:ro`,"--entrypoint","/opt/sandbox/sandbox-agent","-e",`SANDBOX_AGENT_TOKEN=${this.agentToken.get(e)??(this.agentToken.set(e,Th()),this.agentToken.get(e))}`,"-p","127.0.0.1::5711","-w","/ws","--network",t.network?"bridge":"none",...t.network?["--add-host","host.docker.internal:host-gateway"]:[],"-m",`${d}`,"--memory-swap",`${d}`,"--cpus",String(t.cpus??1),"--pids-limit","256","--cap-drop","ALL","--security-opt","no-new-privileges","--ulimit","nofile=1024:1024","--user","node",l],f=await fe(p,3e4);if(f.exitCode!==0)return{ok:!1,error:`\u4E00\u6B21\u6027\u5BB9\u5668\u521B\u5EFA\u5931\u8D25: ${f.stderr.trim()||"unknown"}`};try{let w=JSON.stringify({tool:r,args:s}),m=Math.max(3,Math.floor(i/1e3)),g=await this.dockerExec(c,["-e",`SANDBOX_EXEC_TIMEOUT_SECS=${m}`,"timeout","-s","KILL",String(m),"/opt/sandbox/sandbox-agent","exec"],w);if(g.timedOut)return{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${m}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0};if(g.exitCode!==0)return g.exitCode===124||g.exitCode===137?{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${m}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0}:{ok:!1,error:`\u5BB9\u5668\u6267\u884C\u5931\u8D25 (exit ${g.exitCode}): ${g.output||"unknown"}`,exitCode:g.exitCode};try{let h=JSON.parse(g.output);return h.ok?{ok:!0,output:String(h.output??"")}:{ok:!1,error:String(h.error??"unknown")}}catch{return{ok:!0,output:g.output}}}finally{await fe(["rm","-f",c]).catch(()=>{})}}async runTool(e,t,r,s,o){if(!this.opts.enabled)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\uFF08SANDBOX_DISABLE\uFF09\u2014\u2014\u5DE5\u5177\u5DF2\u7981\u7528"};if(!await this.ensure(e,t))return{ok:!1,error:"\u6C99\u76D2\u4E0D\u53EF\u7528\u2014\u2014\u547D\u4EE4\u6267\u884C\u5DF2\u7981\u7528\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"};le("exec:queued",e,{tool:r,hostId:this.hostId});let a=Date.now(),u=(this.execChains.get(e)??Promise.resolve()).then(()=>this.execOnce(e,r,s,o?.execTimeoutMs));this.execChains.set(e,u.catch(()=>{}));let c=await u,d=Date.now()-a;if(!c.ok&&!c.timedOut&&c.error&&c.error.includes("not running")&&(this.readyCache.delete(e),await this.ensure(e,t))){let w=(this.execChains.get(e)??Promise.resolve()).then(()=>this.execOnce(e,r,s));return this.execChains.set(e,w.catch(()=>{})),w}return c}async execOnce(e,t,r,s){this.busy.add(e),this.execStats.execCount++;let o=s??this.opts.execTimeoutMs;this.runningExecs.set(e,{tool:t,startedAt:Date.now(),timeoutMs:o}),this.onExecEvent?.(e,"exec_start",t);try{let i=JSON.stringify({tool:t,args:r}),a=Math.max(3,Math.floor(o/1e3)),l=null,u=this.agentToken.get(e),c=u?await this.agentHostPort(e):null;if(u&&c){let d=await this.httpExec(c,u,i,o);d.failed||(l={output:d.output,exitCode:d.exitCode,timedOut:d.timedOut})}if(l===null&&(l=await this.dockerExec(Ls(e),["-e",`SANDBOX_EXEC_TIMEOUT_SECS=${a}`,"timeout","-s","KILL",String(a),"/opt/sandbox/sandbox-agent","exec"],i)),l.timedOut)return this.execStats.execTimeouts++,this.onExecEvent?.(e,"exec_timeout",`${t} ${a}s`),{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${a}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0};if(l.exitCode!==0)return l.exitCode===124||l.exitCode===137||l.timedOut?(this.execStats.execTimeouts++,this.onExecEvent?.(e,"exec_timeout",`${t} ${a}s`),{ok:!1,error:`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${a}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,timedOut:!0}):(this.readyCache.delete(e),this.execStats.execErrors++,this.onExecEvent?.(e,"exec_error",`${t}: ${l.output?.slice(0,200)??""}`),{ok:!1,error:`\u5BB9\u5668\u6267\u884C\u5931\u8D25 (exit ${l.exitCode}): ${l.output||"unknown"}`,exitCode:l.exitCode});try{let d=JSON.parse(l.output);return d.ok?{ok:!0,output:String(d.output??"")}:{ok:!1,error:String(d.error??"unknown")}}catch{return{ok:!0,output:l.output}}}finally{this.busy.delete(e),this.runningExecs.delete(e),this.onExecEvent?.(e,"exec_done",t)}}async agentHostPort(e){let t=this.agentPort.get(e);if(t)return t;let r=Ls(e),s=await fe(["inspect",r,"--format",'{{(index (index .NetworkSettings.Ports "5711/tcp") 0).HostPort}}'],1e4);return s.exitCode!==0||!s.stdout.trim()?null:(this.agentPort.set(e,s.stdout.trim()),s.stdout.trim())}async httpExec(e,t,r,s){let o=new AbortController,i=setTimeout(()=>o.abort(),s+5e3);try{let a=await fetch(`http://127.0.0.1:${e}/exec`,{method:"POST",headers:{"content-type":"application/json","x-sandbox-token":t,"x-sandbox-timeout":String(Math.max(3,Math.floor(s/1e3)))},body:r,signal:o.signal}),l=await a.text(),u=!a.ok;return{output:l,exitCode:u?1:0,timedOut:!1,failed:u}}catch(a){let l=a?.name==="AbortError";return{output:"",exitCode:l?-1:1,timedOut:l,failed:!0}}finally{clearTimeout(i)}}async dockerExec(e,t,r){return new Promise(s=>{let o=t.findIndex(p=>p==="-e"),i=o>=0?t.slice(o,o+2):[],a=o>=0?[...t.slice(0,o),...t.slice(o+2)]:t,l=yx("docker",["exec","-i",...i,e,...a],{stdio:["pipe","pipe","pipe"]}),u="",c="",d=setTimeout(()=>{l.kill("SIGKILL"),s({output:(u+c).trim()||`\u547D\u4EE4\u6267\u884C\u8D85\u65F6\uFF08${Math.floor(this.opts.execTimeoutMs/1e3)}s\uFF09\u2014\u2014\u6C99\u76D2\u5DF2\u7EC8\u6B62\u8BE5\u547D\u4EE4`,exitCode:-1,timedOut:!0})},this.opts.execTimeoutMs+5e3);l.stdout.on("data",p=>{u+=p}),l.stderr.on("data",p=>{c+=p}),l.on("error",()=>{clearTimeout(d),s({output:"docker exec \u5931\u8D25\uFF08\u5BB9\u5668\u53EF\u80FD\u5DF2\u88AB\u56DE\u6536\uFF09",exitCode:1,timedOut:!1})}),l.on("close",p=>{clearTimeout(d),s({output:(u+c).trim(),exitCode:p??1,timedOut:!1})}),r&&l.stdin.write(r),l.stdin.end()})}async listContainers(){let e=await fe(["ps","-a","--filter",`name=${ln}`,"--format","{{.Names}} {{.Status}} {{.Image}} {{.CreatedAt}}"],1e4);return e.exitCode!==0?[]:e.stdout.trim().split(`
199
+ `).filter(Boolean).map(t=>{let[r,s,o,i]=t.split(" ");return{name:r??"",status:s??"",image:o??"",createdAt:i??""}})}async containerStats(e){if(!e.startsWith(ln))return null;let t=await fe(["stats","--no-stream","--format","{{.CPUPerc}} {{.MemUsage}} {{.MemPerc}} {{.PIDs}} {{.NetIO}}",e],15e3);if(t.exitCode!==0)return null;let[r,s,o,i,a]=t.stdout.trim().split(" ");return{cpu:r??"-",mem:s??"-",memPct:o??"-",pids:i??"-",net:a??"-"}}async containerProcesses(e){if(!e.startsWith(ln))return[];let t=await fe(["top",e],1e4);if(t.exitCode!==0)return[];let r=t.stdout.trim().split(`
200
+ `).filter(Boolean);if(r.length<=1)return[];let s=r[0].split(/\s+/);return r.slice(1).map(o=>{let i=o.split(/\s+/),a={};return s.forEach((l,u)=>{a[l]=i[u]??""}),a})}async containerAction(e,t){if(!e.startsWith(ln))return{ok:!1,message:"\u975E\u6CD5\u5BB9\u5668\u540D"};let r=t==="rm"?["rm","-f",e]:t==="stop"?["stop","-t","2",e]:[t,e];le(`container:${t}`,e.replace(ln,""),{name:e});let s=await fe(r,3e4);return s.exitCode===0?{ok:!0,message:`${t} ${e} \u6210\u529F`}:{ok:!1,message:s.stderr.trim()||`${t} \u5931\u8D25`}}async status(){let e=this.availability??await this.probe(),t=await fe(["ps","--filter",`name=${ln}`,"--format","{{.Names}}"],1e4),r=t.exitCode===0&&t.stdout.trim()?t.stdout.trim().split(`
201
+ `).length:0;return{available:this.opts.enabled&&e.dockerOk&&e.imageOk,enabled:this.opts.enabled,imageReady:e.imageOk,mode:process.env.SANDBOX_MODE??"persistent",poolSize:r,maxContainers:0}}},bc=new Di});function vx(){let n=It(2e3),e=new Map,t=r=>{let s=e.get(r);return s||(s={hostId:r,activeExecs:0,lastExecAt:0,memoryMb:0,cpus:0,load:0},e.set(r,s)),s};for(let r of n){let s=String(r.payload?.hostId??ke),o=t(s);if(r.action==="host:register"){let i=r.payload?.capacity??r.payload;o.memoryMb=Number(i?.memoryMb??0),o.cpus=Number(i?.cpus??1)}else r.action==="exec:start"?(o.activeExecs++,o.lastExecAt=Math.max(o.lastExecAt,r.ts)):(r.action==="exec:end"||r.action==="exec:timeout"||r.action==="exec:error")&&(o.activeExecs=Math.max(0,o.activeExecs-1))}for(let r of e.values()){let s=Date.now()-r.lastExecAt<3e4?.5:0;r.load=r.activeExecs+s}if(!e.has(ke)){let r=t(ke);r.memoryMb=Number(process.env.SANDBOX_POOL_BUDGET_MB??0)}return[...e.values()]}function kx(){let n=vx(),e=n.length>0?n:[{hostId:ke,activeExecs:0,lastExecAt:0,memoryMb:Number(process.env.SANDBOX_POOL_BUDGET_MB??0),cpus:1,load:0}];return e.sort((t,r)=>t.load-r.load||r.memoryMb-t.memoryMb),{hostId:e[0].hostId,candidates:e}}function Ch(n,e,t){let{hostId:r,candidates:s}=kx();le("route",n,{selectedHost:r,candidates:s.map(o=>({hostId:o.hostId,load:o.load,activeExecs:o.activeExecs})),departmentId:e,memoryMb:t,at:new Date().toISOString()})}var Ah=I(()=>{"use strict";Ye();an()});var Te={};ie(Te,{SandboxManager:()=>ji,manager:()=>_c});var Sx,Mr,xx,Rx,ji,_c,Se=I(()=>{"use strict";re();Ar();Le();Ye();an();Ah();Sx={idleTimeoutMs:Number(process.env.SANDBOX_IDLE_TIMEOUT??600)*1e3,stopTimeoutMs:Number(process.env.SANDBOX_STOP_TIMEOUT??86400)*1e3,maxLifetimeMs:Number(process.env.SANDBOX_MAX_LIFETIME??86400)*1e3,reconcileIntervalMs:6e4,historyRetentionDays:30},Mr=Number(process.env.SANDBOX_MEMORY_LIMIT??512),xx=Number(process.env.SANDBOX_CPU_LIMIT??1),Rx=Number(process.env.SANDBOX_POOL_BUDGET_MB??10240),ji=class{orm=null;eventsOrm=null;_eventsUnsub=null;exe;opts;timer=null;reconciling=!1;constructor(e=bc,t){this.exe=e,this.opts={...Sx,...t}}init(e,t){this.orm=e,this.eventsOrm=t??e,this.exe.onExecEvent=(r,s,o)=>this.logEvent(r,null,s,o),this._eventsUnsub?.(),this._eventsUnsub=jn(r=>{/exec:end|exec:timeout|exec:error|create|status|stop|reconcile:drift|reconcile:idle-stop|evict|queue:rejected|quota:rejected|container:/.test(r.action)&&this.logEvent(r.target??"",null,r.action,JSON.stringify(r.payload??{}).slice(0,300))})}logEvent(e,t,r,s){let o=this.eventsOrm??this.orm;o&&o.query.insert("sandbox_events").values({sandbox_id:e,app_id:t??null,type:r,detail:s??null}).run().catch(()=>{})}async eventHistory(e,t=30){if(!this.orm)return[];try{return(await this.orm.query.from("sandbox_events").select("type","detail","created_at").where({sandbox_id:{eq:e}}).orderBy("created_at","desc").limit(t).run()??[]).map(s=>({type:String(s.type),detail:s.detail?String(s.detail):null,created_at:String(s.created_at)}))}catch{return[]}}counters={created:0,terminated:0,evicted:0,idleStopped:0,autoStarted:0,orphansCleaned:0,execCount:0,execErrors:0,execTimeouts:0};async list(e,t){if(!this.orm)return[];let r=["requested","running","stopped","terminated","error"].includes(t?.status??"")?t.status:null,s={app_id:{eq:e}};return r&&(s.status={eq:r}),t?.department_id&&(s.department_id={eq:t.department_id}),await this.orm.table("sandboxes",Ve.sandboxes).select().where(s).orderBy("created_at","desc").run()}async get(e,t){return this.orm?(await this.orm.table("sandboxes",Ve.sandboxes).select().where({id:{eq:String(e)},app_id:{eq:String(t)}}).limit(1).run())?.[0]??null:null}async byDepartment(e){return this.orm?(await this.orm.table("sandboxes",Ve.sandboxes).select().where({department_id:{eq:e},status:{ne:"terminated"}}).limit(1).run())?.[0]??null:null}async runTool(e,t,r,s,o){if(!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let i=await this.byDepartment(e);if(!i){let[f]=await this.orm.query.from("departments").select("name","app_id").where({id:{eq:e}}).limit(1).run();if(!f)return{ok:!1,error:"\u90E8\u95E8\u4E0D\u5B58\u5728\u2014\u2014\u65E0\u6CD5\u521B\u5EFA\u5DE5\u4F5C\u73AF\u5883"};try{i=await this.create({appId:String(f.app_id),departmentId:e,name:String(f.name??"\u5DE5\u4F5C\u73AF\u5883"),workspace:t,network:o?.network})}catch(w){return{ok:!1,error:`\u6C99\u76D2\u521B\u5EFA\u5931\u8D25: ${w?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}if(i.status==="terminated"||!i.workspace)return{ok:!1,error:"\u6C99\u76D2\u5DF2\u7EC8\u6B62\u2014\u2014\u8BF7\u91CD\u65B0\u521B\u5EFA"};let a={ws:t||i.workspace,image:i.image,network:o?.network??i.network,memoryMb:i.memory_mb,cpus:i.cpus};this.counters.execCount++;let l=globalThis.__platform_metrics;l&&l.sandboxCalls++,le("exec:start",i.id,{departmentId:e,tool:r,mode:i.mode,hostId:ke});let u=Date.now(),c=i.mode==="ephemeral"?await this.exe.runOnce(i.id,a,r,s,{execTimeoutMs:o?.execTimeoutMs}):await this.exe.runTool(i.id,a,r,s,{execTimeoutMs:o?.execTimeoutMs}),d=Date.now()-u;c.ok||(c.timedOut?this.counters.execTimeouts++:this.counters.execErrors++),le(c.ok?"exec:end":c.timedOut?"exec:timeout":"exec:error",i.id,{departmentId:e,tool:r,ms:d,error:c.error?.slice(0,200),code:c.ok?void 0:c.timedOut?"timeout":"exec_error",hostId:ke});let p=c.ok?"running":c.error?.includes("\u6C99\u76D2\u4E0D\u53EF\u7528")||c.error?.includes("docker")||c.error?.includes("\u955C\u50CF")?"error":null;return await this.touch(i.id,p,p==="error"?c.error?.slice(0,500)??"\u672A\u77E5\u9519\u8BEF":null).catch(()=>{}),c}async touch(e,t,r){this.orm&&(t&&le("status",e,{status:t,error:r?.slice(0,200)}),await this.orm.query.update("sandboxes").set({last_used_at:Q.now(),error:r??null,updated_at:Q.now(),...t?{status:t}:{}}).where({id:{eq:String(e)}}).run())}async create(e){if(!this.orm)throw new Error("\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316");let[t]=await this.orm.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:e.appId}}).limit(1).run(),r=Number(t?.sandbox_quota??5),[s]=await this.orm.query.from("sandboxes").count("*","n").where({app_id:{eq:e.appId},status:{in:["requested","running"]}}).run();if(Number(s?.n??0)>=r)throw this.logEvent("quota",String(e.appId),"quota_rejected",`quota=${r} name=${e.name}`),le("quota:rejected",void 0,{appId:e.appId,quota:r,name:e.name}),new Error(`\u6C99\u76D2\u914D\u989D\u5DF2\u6EE1\uFF08${r} \u4E2A\uFF09\u2014\u2014\u8BF7\u5148\u7EC8\u6B62\u4E0D\u7528\u7684\u6C99\u76D2`);let o=e.memoryMb??Mr;if(await this.ensurePoolBudget(o),e.departmentId){let i=await this.byDepartment(e.departmentId);if(i)return i}try{let i=new Date(Date.now()+this.opts.maxLifetimeMs).toISOString(),a=await this.orm.query.insert("sandboxes").values({app_id:e.appId,department_id:e.departmentId??null,name:e.name,status:"requested",mode:e.mode??"persistent",image:e.image??"ap-sandbox:latest",network:e.network??!0,memory_mb:e.memoryMb??Mr,cpus:e.cpus??xx,workspace:e.workspace??null,expires_at:i}).returning("*").run();return this.counters.created++,this.logEvent(String(a[0].id),String(e.appId),"created",`name=${e.name}`),le("create",String(a[0].id),{appId:e.appId,departmentId:e.departmentId,name:e.name,memoryMb:e.memoryMb??Mr,hostId:ke}),le("host:register",void 0,{...wc(),at:new Date().toISOString()}),Ch(String(a[0].id),e.departmentId??null,e.memoryMb??Mr),a[0]}catch(i){if(String(i?.code??"")==="23505"||/duplicate key/.test(String(i?.message??""))){let a=await this.byDepartment(String(e.departmentId??""));if(a)return a}throw i}}async ensurePoolBudget(e){let t=this.opts.poolBudgetMb??Rx;if(!this.orm||t<=0)return;let[r]=await this.orm.query.from("sandboxes").sum("memory_mb","used").where({status:{in:["requested","running","error"]}}).run(),s=Number(r?.used??0);if(s+e<=t)return;let o=await this.orm.table("sandboxes",Ve.sandboxes).select().where({status:{ne:"terminated"}}).orderBy("last_used_at","asc").orderBy("created_at","asc").run();for(let i of o){if(s+e<=t)break;this.exe.isBusy(i.id)||(le("evict",i.id,{reason:"pool-budget",detail:`LRU \u9A71\u9010\uFF08\u9884\u7B97 ${t}MB\u2014\u2014\u91CA\u653E ${i.memory_mb??Mr}MB\uFF09`}),await this.exe.dispose(i.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:Q.now(),updated_at:Q.now()}).where({id:{eq:i.id}}).run(),s-=Number(i.memory_mb??Mr),this.counters.evicted++)}if(s+e>t)throw le("queue:rejected",void 0,{reason:"pool-budget",detail:`\u9884\u7B97 ${t}MB\u2014\u2014\u9700\u8981 ${e}MB`}),new Error(`\u6C99\u76D2\u6C60\u5185\u5B58\u4E0D\u8DB3\uFF08\u9884\u7B97 ${t}MB\uFF09\u2014\u2014\u8BF7\u7EC8\u6B62\u4E0D\u7528\u7684\u6C99\u76D2\u6216\u63D0\u5347 SANDBOX_POOL_BUDGET_MB`)}async statusCounts(){if(!this.orm)return{};try{let e=await this.orm.query.from("sandboxes").select("status").count("*","n").groupBy("status").run(),t={};for(let r of e??[])t[String(r.status)]=Number(r.n??0);return t}catch{return{}}}async terminate(e,t){if(!this.orm)return;let r=await this.get(e,t);!r||r.status==="terminated"||(await this.exe.dispose(r.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:Q.now(),error:null,updated_at:Q.now()}).where({id:{eq:String(e)}}).run(),this.counters.terminated++,this.logEvent(e,t,"terminated"))}async start(e,t){if(!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let r=await this.get(e,t);if(!r)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u5B58\u5728"};if(!r.workspace)return{ok:!1,error:"\u6C99\u76D2\u65E0\u5DE5\u4F5C\u76EE\u5F55\u2014\u2014\u65E0\u6CD5\u542F\u52A8"};let s={ws:r.workspace,image:r.image,network:r.network,memoryMb:r.memory_mb,cpus:r.cpus};return await this.exe.ensure(r.id,s)?(await this.orm.query.update("sandboxes").set({status:"running",error:null,last_used_at:Q.now(),updated_at:Q.now()}).where({id:{eq:r.id}}).run(),this.logEvent(String(r.id),String(t),"started"),{ok:!0}):(await this.orm.query.update("sandboxes").set({status:"error",error:"\u5BB9\u5668\u542F\u52A8\u5931\u8D25\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09",updated_at:Q.now()}).where({id:{eq:r.id}}).run(),{ok:!1,error:"\u5BB9\u5668\u542F\u52A8\u5931\u8D25\uFF08docker \u4E0D\u53EF\u7528\u6216\u955C\u50CF\u7F3A\u5931\uFF09"})}async stop(e,t){if(le("stop",e,{appId:t}),!this.orm)return{ok:!1,error:"\u6C99\u76D2\u7BA1\u7406\u5668\u672A\u521D\u59CB\u5316"};let r=await this.get(e,t);if(!r)return{ok:!1,error:"\u6C99\u76D2\u4E0D\u5B58\u5728"};if(this.exe.isBusy(r.id))return{ok:!1,error:"\u6C99\u76D2\u6B63\u5728\u6267\u884C\u4EFB\u52A1\u2014\u2014\u4E0D\u80FD\u505C\u6B62"};let s=await this.exe.containerAction(`ap-sandbox-${r.id}`,"stop");return s.ok?(await this.orm.query.update("sandboxes").set({status:"stopped",updated_at:Q.now()}).where({id:{eq:r.id}}).run(),this.logEvent(String(r.id),String(t),"stopped"),{ok:!0}):{ok:!1,error:s.message}}async restart(e,t){let r=await this.stop(e,t);return r.ok?this.start(e,t):r}async updateConfig(e,t,r){if(!this.orm)return;let s={updated_at:Q.now()};r.image!==void 0&&(s.image=r.image),r.network!==void 0&&(s.network=r.network),r.memoryMb!==void 0&&(s.memory_mb=r.memoryMb),r.cpus!==void 0&&(s.cpus=r.cpus),await this.orm.query.update("sandboxes").set(s).where({id:{eq:String(e)},app_id:{eq:String(t)}}).run()}async terminateByDepartment(e){if(!this.orm)return;let t=await this.orm.table("sandboxes",Ve.sandboxes).select().where({department_id:{eq:e},status:{ne:"terminated"}}).run();for(let r of t??[])await this.terminate(String(r.id),String(r.app_id))}startReaper(){this.timer||!this.orm||(this.timer=setInterval(()=>{this.reconcile()},this.opts.reconcileIntervalMs),this.timer.unref?.())}async stopReaper(){this.timer&&(clearInterval(this.timer),this.timer=null)}async reconcile(){le("reconcile:start",void 0,{});let e={created:0,started:0,stopped:0,terminated:0,orphans:0,error:0};if(!this.orm||this.reconciling)return le("reconcile:skip",void 0,{reason:this.reconciling?"already-running":"no-db"}),e;this.reconciling=!0;try{let t=Date.now(),r=await this.orm.query.from("sandboxes").select().where({status:{in:["requested","running","stopped","error"]}}).run(),s=await this.exe.listContainers(),o=new Map;for(let a of s){let l=String(a.name??"").replace("ap-sandbox-","");o.set(l,{running:String(a.status??"").startsWith("Up"),name:String(a.name)})}let i=new Set(r.map(a=>a.id));for(let[a,l]of o)i.has(a)||(le("reconcile:drift",a,{reason:"orphan",detail:"\u5BB9\u5668\u5B58\u5728\u4F46 DB \u65E0\u8BB0\u5F55\uFF08\u7ED5\u8FC7\u70B9\u2014\u2014\u5916\u90E8\u521B\u5EFA\u65E0\u4E8B\u4EF6\uFF09",action:"rm"}),await this.exe.containerAction(l.name,"rm").catch(()=>{}),e.orphans++,this.counters.orphansCleaned++);for(let a of r){let l=o.get(a.id);if(this.exe.isBusy(a.id))continue;let u=a.last_used_at?new Date(a.last_used_at).getTime():new Date(a.created_at).getTime();if(a.status==="running"||a.status==="error"||a.status==="requested"){a.status==="error"&&e.error++;let c=new Date(a.created_at).getTime();if(a.status==="running"&&this.opts.maxLifetimeMs>0&&t-c>this.opts.maxLifetimeMs&&a.mode!=="ephemeral"){le("reconcile:drift",a.id,{reason:"expired",detail:`\u8D85\u9F84\u91CD\u5EFA\uFF08${Math.round((t-c)/6e4)}min\uFF09`,action:"recreate"}),await this.exe.dispose(a.id).catch(()=>{}),e.terminated++;continue}if(a.status==="running"&&t-u>this.opts.idleTimeoutMs&&a.mode!=="ephemeral"){le("reconcile:idle-stop",a.id,{idleMs:t-u}),await this.exe.containerAction(`ap-sandbox-${a.id}`,"stop").catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"stopped",updated_at:Q.now()}).where({id:{eq:a.id}}).run(),e.stopped++,this.counters.idleStopped++;continue}if(a.status!=="requested"&&(!l||!l.running)&&(le("reconcile:drift",a.id,{reason:l?"container-stopped":"container-missing",detail:`\u671F\u671B ${a.status} \u4F46\u5BB9\u5668${l?"\u5DF2\u505C\u6B62":"\u7F3A\u5931"}\uFF08\u5916\u90E8\u64CD\u4F5C\u65E0\u4E8B\u4EF6\uFF1F\uFF09`,action:"restart"}),a.workspace)){let d={ws:a.workspace,image:a.image,network:a.network,memoryMb:a.memory_mb,cpus:a.cpus};await this.exe.ensure(a.id,d)&&(e.started++,this.counters.autoStarted++,a.status==="error"&&await this.orm.query.update("sandboxes").set({status:"running",error:null,updated_at:Q.now()}).where({id:{eq:a.id}}).run())}}else if(a.status==="stopped"){let c=a.updated_at?new Date(a.updated_at).getTime():t;t-c>this.opts.stopTimeoutMs&&a.mode!=="ephemeral"&&(await this.exe.dispose(a.id).catch(()=>{}),await this.orm.query.update("sandboxes").set({status:"terminated",terminated_at:Q.now(),updated_at:Q.now()}).where({id:{eq:a.id}}).run(),e.terminated++)}}await this.orm.query.delete("sandboxes").where({status:{eq:"terminated"},terminated_at:{lt:new Date(Date.now()-this.opts.historyRetentionDays*864e5).toISOString()}}).run().catch(()=>{})}finally{this.reconciling=!1}e.error>0&&console.warn(`[agent-platform] \u6C99\u76D2 reconcile\uFF1A${e.error} \u4E2A\u73AF\u5883\u5904\u4E8E error \u72B6\u6001`);try{let t=Number(process.env.SANDBOX_EVENT_RETENTION??7);await this.orm.query.delete("sandbox_events").where({created_at:{lt:new Date(Date.now()-t*864e5).toISOString()}}).run()}catch{}return le("reconcile:end",void 0,{...e}),e}},_c=new ji});var Sc={};ie(Sc,{SkillRegistry:()=>$r,buildSkillMeta:()=>kc,detectSkill:()=>Ph,discoverSkills:()=>Cx,loadSkill:()=>Us,parseSkillFrontmatter:()=>vc});import{readFileSync as Oh}from"node:fs";import{readdir as Ex,access as Ih}from"node:fs/promises";import{join as Ws,resolve as Tx}from"node:path";function vc(n){let e={},t=n.match(/^---\n([\s\S]*?)\n---/);if(!t)return e;let r=t[1];for(let s of r.split(`
202
+ `)){let o=s.indexOf(":");if(o===-1)continue;let i=s.slice(0,o).trim(),a=s.slice(o+1).trim();i&&a&&(e[i]=a)}return e}function kc(n){let e=n.name?.trim(),t=n.description?.trim();return!e||!t?null:{name:e.slice(0,64),description:t.slice(0,1024),version:n.version?.trim()}}async function Ph(n){try{return await Ih(Ws(n,"SKILL.md")),!0}catch{return!1}}async function Cx(n){let e=[];try{let t=await Ex(n,{withFileTypes:!0});for(let r of t){if(!r.isDirectory())continue;let s=Ws(n,r.name);if(await Ph(s)){let o=Ws(s,"SKILL.md"),i=Oh(o,"utf-8"),a=vc(i),l=kc(a);l&&e.push({meta:l,dir:s})}}}catch{}return e}async function Us(n,e){let t=Ws(n,"SKILL.md"),r=Oh(t,"utf-8"),s=vc(r),o=kc(s);if(!o)throw new Error(`Skill at ${n} \u7F3A\u5C11 name \u6216 description`);let i=Ws(n,"tools.ts");try{await Ih(i)}catch{throw new Error(`Skill "${o.name}" \u7F3A\u5C11 tools.ts`)}let l=await import(Tx(i)),u=l.tools??[],c=l.createHandlers?.(e)??{};if(u.length===0)throw new Error(`Skill "${o.name}" \u7684 tools.ts \u672A\u5BFC\u51FA tools[]`);return{dir:n,meta:o,tools:u,handlers:c}}var $r,Bs=I(()=>{"use strict";$r=class{skills=new Map;agentId;constructor(e){this.agentId=e}getAgentId(){return this.agentId}getLoadedSkillNames(){return[...this.skills.keys()]}getSkillDescriptors(){return[...this.skills.values()].map(e=>({meta:e.meta,dir:e.dir}))}async loadSkill(e,t){let r=await Us(e,t);return this.skills.set(r.meta.name,r),r}registerSkill(e){this.skills.set(e.meta.name,e)}unloadSkill(e){return this.skills.delete(e)}getTools(){let e=[];for(let t of this.skills.values())e.push(...t.tools);return e}async executeTool(e,t,r){for(let s of this.skills.values()){let o=s.handlers[e];if(o){let i=await o(t,r);return typeof i=="string"?i:JSON.stringify(i)}}throw new Error(`tool "${e}" not registered in any loaded skill`)}hasTool(e){for(let t of this.skills.values())if(t.handlers[e])return!0;return!1}clear(){this.skills.clear()}get size(){return this.skills.size}}});var Nh,Mh=I(()=>{"use strict";Nh=`
203
203
  \u3010\u6C99\u76D2\u73AF\u5883\u3011
204
204
  - python3 \u53EF\u7528\uFF0C\u9884\u88C5\u5E93\uFF1Aopenpyxl(Excel xlsx)/pandas(\u6570\u636E\u5206\u6790)/pypdf(PDF)/
205
205
  python-docx(Word)/python-pptx(PPT)
@@ -229,15 +229,15 @@ ${d.content}`).join(`
229
229
  - \u26A0\uFE0F \u672A\u5B8C\u6210\uFF1A\u5217\u51FA\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u53CA\u539F\u56E0\uFF08\u6CA1\u6709\u5219\u7701\u7565\uFF09
230
230
  - \u{1F4E6} \u4EA7\u7269\uFF1A\u751F\u6210\u7684\u6587\u4EF6/\u7ED3\u679C\u4F4D\u7F6E\uFF08\u6CA1\u6709\u5219\u7701\u7565\uFF09
231
231
  3. \u5982\u679C\u7528\u6237\u76EE\u6807\u4E0D\u660E\u786E\uFF0C\u5148\u8BF4\u660E\u4F60\u7684\u7406\u89E3\u518D\u6267\u884C\u3002
232
- 4. \u5DE5\u5177\u5DF2\u8FD4\u56DE\u7ED3\u679C\u65F6\uFF0C\u76F4\u63A5\u57FA\u4E8E\u7ED3\u679C\u56DE\u7B54\u7528\u6237\u2014\u2014\u4E0D\u8981\u91CD\u590D\u8C03\u7528\u540C\u4E00\u5DE5\u5177\uFF0C\u4E5F\u4E0D\u8981\u518D\u6B21\u8BF7\u6C42\u5DE5\u5177\uFF08\u9664\u786E\u9700\u8865\u5145\u4FE1\u606F\u5916\uFF09\u3002`});import{resolve as Ix}from"node:path";function Nh(n,e,t,r){let s=Ix(n),i=async(a,l)=>{let u=a.includes("agent-browser")||a.includes("browser")||a.includes("ab_"),c=await wc.runTool(t,s,a,l,{network:r,execTimeoutMs:u?12e4:void 0});if(c.ok)return c.output??"";throw new Error(c.error??`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${a}`)},o={read:a=>i("read",a),write:a=>i("write",a),edit:a=>i("edit",a),grep:a=>i("grep",a),list_files:a=>i("list_files",a)};return e&&(o.bash=a=>i("bash",a)),o}function Mh(n){let e=[...Px];return n&&e.push(Nx),e}var vc,Px,Nx,$h=N(()=>{"use strict";Se();vc="\u5DE5\u4F5C\u76EE\u5F55\u4E3A /ws\uFF08\u6C99\u76D2\u5377\u6302\u8F7D\uFF09\u2014\u2014\u6240\u6709\u6587\u4EF6/\u4F9D\u8D56\u653E\u8FD9\u91CC\uFF08\u5BB9\u5668\u91CD\u5EFA\u540E\u4FDD\u7559\uFF09\uFF1B\u5BB9\u5668\u6839\u76EE\u5F55\u4E3A\u77AC\u6001\u4E0D\u4FDD\u7559\u3002",Px=[{type:"function",function:{name:"read",description:`\u8BFB\u53D6\u6587\u4EF6\u5185\u5BB9\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55 /ws\uFF09\u3002${vc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"}},required:["path"]}}},{type:"function",function:{name:"write",description:`\u5199\u5165\u6216\u521B\u5EFA\u6587\u4EF6\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55 /ws\uFF09\u3002${vc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"},content:{type:"string",description:"\u6587\u4EF6\u5185\u5BB9"}},required:["path","content"]}}},{type:"function",function:{name:"edit",description:`\u5BF9\u6587\u4EF6\u8FDB\u884C\u7CBE\u786E\u6587\u672C\u66FF\u6362\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002${vc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"},oldText:{type:"string",description:"\u88AB\u66FF\u6362\u7684\u7CBE\u786E\u6587\u672C\u6BB5"},newText:{type:"string",description:"\u66FF\u6362\u540E\u7684\u65B0\u6587\u672C"}},required:["path","oldText","newText"]}}},{type:"function",function:{name:"grep",description:"\u5728\u6587\u4EF6\u4E2D\u641C\u7D22\u6587\u672C\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002\u652F\u6301\u6309\u76EE\u5F55\u9012\u5F52\u641C\u7D22\u3002",parameters:{type:"object",properties:{pattern:{type:"string",description:"\u641C\u7D22\u6A21\u5F0F\uFF08\u666E\u901A\u6587\u672C\uFF0C\u975E\u6B63\u5219\uFF09"},path:{type:"string",description:"\u6587\u4EF6\u6216\u76EE\u5F55\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09\uFF0C\u9ED8\u8BA4\u641C\u7D22\u5168\u90E8"}},required:["pattern"]}}},{type:"function",function:{name:"list_files",description:"\u5217\u51FA\u76EE\u5F55\u5185\u5BB9\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u76EE\u5F55\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09\uFF0C\u9ED8\u8BA4\u6839\u76EE\u5F55"}}}}}],Nx={type:"function",function:{name:"bash",description:"\u5728\u5DE5\u4F5C\u7A7A\u95F4\u76EE\u5F55 /ws \u4E2D\u6267\u884C shell \u547D\u4EE4\u3002\u652F\u6301\u8FD0\u884C\u811A\u672C\u3001\u7F16\u8BD1\u3001\u6D4B\u8BD5\u7B49\u3002\u8D85\u65F6 30 \u79D2\uFF0C\u8F93\u51FA\u4E0A\u9650 100KB\u3002\u6C99\u76D2\u9ED8\u8BA4\u65E0\u7F51\u7EDC\uFF08--network none\uFF09\u2014\u2014npm install/curl \u7B49\u7F51\u7EDC\u547D\u4EE4\u4F1A\u5931\u8D25\uFF1B\u5982\u9700\u7F51\u7EDC\u8BF7\u7BA1\u7406\u5458\u5728 Agent \u914D\u7F6E\u5F00\u542F allow_network\u3002\u6240\u6709\u6587\u4EF6/\u4F9D\u8D56\u653E /ws\uFF08\u5BB9\u5668\u91CD\u5EFA\u540E\u4FDD\u7559\uFF09\uFF1B\u5BB9\u5668\u6839\u76EE\u5F55\u4E3A\u77AC\u6001\u4E0D\u4FDD\u7559\u3002",parameters:{type:"object",properties:{command:{type:"string",description:"\u8981\u6267\u884C\u7684 shell \u547D\u4EE4\uFF08\u5DE5\u4F5C\u76EE\u5F55 /ws\uFF09"},description:{type:"string",description:"\u547D\u4EE4\u7684\u76EE\u7684\u8BF4\u660E\uFF08\u4EC5\u7528\u4E8E\u65E5\u5FD7\uFF09"}},required:["command"]}}}});var Dh={};ie(Dh,{byokParamsOf:()=>Di,getByokConfig:()=>qh});async function qh(n,e){let r=(await n.query.from("app_ai_configs").select("base_url","api_key","model").where({app_id:e}).limit(1).run())[0];return!r||!r.base_url&&!r.api_key?null:r}async function Di(n,e){let t=await qh(n,e);return t?{...t.api_key?{apiKey:t.api_key}:{},...t.base_url?{baseUrl:t.base_url}:{},...t.model?{model:t.model}:{}}:{}}var kc=N(()=>{"use strict"});var Cc={};ie(Cc,{aiActionFromWf:()=>Tc,aiEmit:()=>ji,aiEvents:()=>Rc,resetAiEvents:()=>$x,subscribeAiEvents:()=>Ec});function ji(n,e,t){let r={entity:"ai",action:n,ts:Date.now()};e!=null&&(r.target=e),t!=null&&(r.payload=t),t?.messageId&&(r.session=String(t.messageId)),qr<5e3?(Sc[($r+qr)%5e3]=r,qr++):(Sc[$r]=r,$r=($r+1)%5e3);for(let s of xc)try{s(r)}catch{}}function Ec(n){return xc.add(n),()=>{xc.delete(n)}}function Rc(n=100,e){return Mx(n,e)}function Mx(n,e){let t=new Array(qr);for(let s=0;s<qr;s++)t[s]=Sc[($r+s)%5e3];let r=t.slice(-n);return e?r.filter(s=>!(e.agentId&&s.target!==e.agentId||e.action&&s.action!==e.action||e.messageId&&s.payload?.messageId!==e.messageId)):r}function $x(){$r=0,qr=0}function Tc(n){switch(n){case"wf:token":return"token";case"wf:step":return"step";case"wf:tool_call":return"tool:call";case"wf:tool_result":return"tool:result";case"wf:done":return"done";case"wf:error":return"error";case"wf:usage":return"usage";case"wf:verify":return"verify";default:return n.replace("wf:","")}}function qx(){let n=globalThis.__sandbox_events;return{sandboxEvents:e=>typeof n=="function"?n(e):[]}}var Sc,$r,qr,xc,Ws=N(()=>{"use strict";Sc=[],$r=0,qr=0,xc=new Set;if(typeof globalThis<"u"){let n=globalThis;n.__ai_events||(n.__ai_events=(e=100,t)=>Rc(e,t)),n.__events_timeline||(n.__events_timeline=e=>{let{sandboxEvents:t}=qx(),r=Rc(2e3).filter(o=>o.payload?.requestId===e),s=t(2e3).filter(o=>o.payload?.requestId===e);return[...r.map(o=>({tier:"ai",action:o.action,target:o.target,payload:o.payload,ts:o.ts})),...s.map(o=>({tier:"sandbox",action:o.action,target:o.target,payload:o.payload,ts:o.ts}))].sort((o,a)=>o.ts-a.ts)})}});var Ac={};ie(Ac,{needsApproval:()=>Lx,riskOf:()=>jh});function jh(n,e){let t=Object.values(e??{}).map(String).join(" ");return Dx.some(r=>r.test(t))?"high":jx.some(r=>r.test(t))?"medium":"low"}function Lx(n,e,t){return n==="off"?!1:n==="strict"?!0:jh(e,t)!=="low"}var Dx,jx,Oc=N(()=>{"use strict";Dx=[/\brm\b/i,/\bdelete\b/i,/\bremove\b/i,/\bdrop\b/i,/\btruncate\b/i,/\bunlink\b/i,/\bformat\b/i,/\bshutdown\b/i,/\breboot\b/i,/--force\b/i,/-rf\b/i,/agent-browser[^\n]*(click|type|fill|press|submit|keyboard)/i],jx=[/\bwrite\b/i,/\bedit\b/i,/\bsave\b/i,/\bmv\b/i,/\brename\b/i,/\bmkdir\b/i,/\bexec\b/i,/\bbash\b/i,/\bcommand\b/i,/\bshell\b/i,/\bhttp\b/i,/\bpost\b/i,/\bfetch\b/i,/\brequest\b/i,/\bnetwork\b/i,/\bcurl\b/i,/agent-browser[^\n]*(open|read|snapshot|screenshot)/i]});var Fh={};ie(Fh,{runAgent:()=>Li,streamAgent:()=>Nc,streamAgentPreview:()=>Pc});function Lh(n){let e=0;for(let t of n)/[\u4e00-\u9fff\u3400-\u4dbf]/.test(t)?e+=1.5:e+=.25;return Math.ceil(e)}function Wh(n){let e=0;for(let t of n)if(e+=Lh(t.content),t.tool_calls)for(let r of t.tool_calls)e+=Lh(r.function.name+r.function.arguments);return e+=n.length*4,{prompt:e,completion:0,total:e}}function Wx(n,e){if(Wh(n).total<=e)return n;let r=n.filter(o=>o.role==="system"),i=[...n.filter(o=>o.role!=="system")];for(;i.length>1&&Wh([...r,...i]).total>e;)i.shift();return[...r,...i]}async function Ic(n,e){let t=[],r=new Set,s=a=>{for(let l of a){let u=l.function?.name??l.name;!u||r.has(u)||(r.add(u),t.push(l))}};try{let{BUILTIN_TOOL_DEFS:a}=await Promise.resolve().then(()=>(Us(),Vh));s(a)}catch{}s(e.tools);let i;if(e.preloadedSkills&&e.preloadedSkills.length>0){i=new Mr(e.agentId);for(let a of e.preloadedSkills)i.registerSkill(a),s(a.tools)}if(e.allowFileTools&&e.departmentId){let a=null,l=e.departmentId;try{let[u]=await n.orm.query.from("agents").select("type","department_id").where({id:{eq:String(e.agentId)}}).limit(1).run();u?.department_id&&(l=String(u.department_id))}catch{}try{let[u]=await n.orm.query.from("departments").select("is_dm","workspace_path","artifact_review").where({id:{eq:l}}).limit(1).run();if(u&&(a=await ac(l,u.workspace_path,!0),a&&u.artifact_review)){let{join:c}=await import("node:path"),{mkdir:d}=await import("node:fs/promises"),p=c(a,".pending");await d(p,{recursive:!0}).catch(()=>{}),a=p}}catch(u){console.warn(`[agent-runner] \u90E8\u95E8\u5DE5\u4F5C\u7A7A\u95F4\u67E5\u8BE2\u5931\u8D25: ${u?.message??""}`)}if(a){let u=Mh(e.allowCommandExec??!1);s(u);try{let c=Nh(a,e.allowCommandExec??!1,e.departmentId,e.allowNetwork);i||(i=new Mr(e.agentId)),i.registerSkill({dir:a,meta:{name:"__workspace__",description:"\u5DE5\u4F5C\u7A7A\u95F4\u6587\u4EF6\u5DE5\u5177"},tools:u,handlers:c})}catch(c){console.warn(`[agent-runner] \u5DE5\u4F5C\u7A7A\u95F4\u521D\u59CB\u5316\u5931\u8D25: ${c.message}`)}}}return{tools:t.map(a=>({name:a.function.name,description:a.function.description,parameters:a.function.parameters,run:async l=>{let u={...e.toolContext??{},agentId:e.agentId,departmentId:e.departmentId};if(i?.hasTool(a.function.name))return await i.executeTool(a.function.name,l,u);let c=gh(a.function.name);if(!c)return`Error: tool handler for "${a.function.name}" not registered`;let d=await c(l,u);return typeof d=="string"?d:JSON.stringify(d)}})),skillRegistry:i}}async function Uh(n,e){try{let[t]=await n.orm.query.from("agent_memories").select("content").where({agent_id:{eq:e}}).limit(1).run();return t&&String(t.content??"").trim()?String(t.content).slice(0,1500):""}catch{return""}}function Bh(n,e){return n+(e?`
232
+ 4. \u5DE5\u5177\u5DF2\u8FD4\u56DE\u7ED3\u679C\u65F6\uFF0C\u76F4\u63A5\u57FA\u4E8E\u7ED3\u679C\u56DE\u7B54\u7528\u6237\u2014\u2014\u4E0D\u8981\u91CD\u590D\u8C03\u7528\u540C\u4E00\u5DE5\u5177\uFF0C\u4E5F\u4E0D\u8981\u518D\u6B21\u8BF7\u6C42\u5DE5\u5177\uFF08\u9664\u786E\u9700\u8865\u5145\u4FE1\u606F\u5916\uFF09\u3002`});import{resolve as Ax}from"node:path";function $h(n,e,t,r){let s=Ax(n),o=async(a,l)=>{let u=a.includes("agent-browser")||a.includes("browser")||a.includes("ab_"),c=await _c.runTool(t,s,a,l,{network:r,execTimeoutMs:u?12e4:void 0});if(c.ok)return c.output??"";throw new Error(c.error??`\u5DE5\u5177\u6267\u884C\u5931\u8D25: ${a}`)},i={read:a=>o("read",a),write:a=>o("write",a),edit:a=>o("edit",a),grep:a=>o("grep",a),list_files:a=>o("list_files",a)};return e&&(i.bash=a=>o("bash",a)),i}function qh(n){let e=[...Ox];return n&&e.push(Ix),e}var xc,Ox,Ix,Dh=I(()=>{"use strict";Se();xc="\u5DE5\u4F5C\u76EE\u5F55\u4E3A /ws\uFF08\u6C99\u76D2\u5377\u6302\u8F7D\uFF09\u2014\u2014\u6240\u6709\u6587\u4EF6/\u4F9D\u8D56\u653E\u8FD9\u91CC\uFF08\u5BB9\u5668\u91CD\u5EFA\u540E\u4FDD\u7559\uFF09\uFF1B\u5BB9\u5668\u6839\u76EE\u5F55\u4E3A\u77AC\u6001\u4E0D\u4FDD\u7559\u3002",Ox=[{type:"function",function:{name:"read",description:`\u8BFB\u53D6\u6587\u4EF6\u5185\u5BB9\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55 /ws\uFF09\u3002${xc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"}},required:["path"]}}},{type:"function",function:{name:"write",description:`\u5199\u5165\u6216\u521B\u5EFA\u6587\u4EF6\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55 /ws\uFF09\u3002${xc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"},content:{type:"string",description:"\u6587\u4EF6\u5185\u5BB9"}},required:["path","content"]}}},{type:"function",function:{name:"edit",description:`\u5BF9\u6587\u4EF6\u8FDB\u884C\u7CBE\u786E\u6587\u672C\u66FF\u6362\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002${xc}`,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09"},oldText:{type:"string",description:"\u88AB\u66FF\u6362\u7684\u7CBE\u786E\u6587\u672C\u6BB5"},newText:{type:"string",description:"\u66FF\u6362\u540E\u7684\u65B0\u6587\u672C"}},required:["path","oldText","newText"]}}},{type:"function",function:{name:"grep",description:"\u5728\u6587\u4EF6\u4E2D\u641C\u7D22\u6587\u672C\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002\u652F\u6301\u6309\u76EE\u5F55\u9012\u5F52\u641C\u7D22\u3002",parameters:{type:"object",properties:{pattern:{type:"string",description:"\u641C\u7D22\u6A21\u5F0F\uFF08\u666E\u901A\u6587\u672C\uFF0C\u975E\u6B63\u5219\uFF09"},path:{type:"string",description:"\u6587\u4EF6\u6216\u76EE\u5F55\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09\uFF0C\u9ED8\u8BA4\u641C\u7D22\u5168\u90E8"}},required:["pattern"]}}},{type:"function",function:{name:"list_files",description:"\u5217\u51FA\u76EE\u5F55\u5185\u5BB9\u3002\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u76EE\u5F55\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u7A7A\u95F4\u6839\u76EE\u5F55\uFF09\uFF0C\u9ED8\u8BA4\u6839\u76EE\u5F55"}}}}}],Ix={type:"function",function:{name:"bash",description:"\u5728\u5DE5\u4F5C\u7A7A\u95F4\u76EE\u5F55 /ws \u4E2D\u6267\u884C shell \u547D\u4EE4\u3002\u652F\u6301\u8FD0\u884C\u811A\u672C\u3001\u7F16\u8BD1\u3001\u6D4B\u8BD5\u7B49\u3002\u8D85\u65F6 30 \u79D2\uFF0C\u8F93\u51FA\u4E0A\u9650 100KB\u3002\u6C99\u76D2\u9ED8\u8BA4\u65E0\u7F51\u7EDC\uFF08--network none\uFF09\u2014\u2014npm install/curl \u7B49\u7F51\u7EDC\u547D\u4EE4\u4F1A\u5931\u8D25\uFF1B\u5982\u9700\u7F51\u7EDC\u8BF7\u7BA1\u7406\u5458\u5728 Agent \u914D\u7F6E\u5F00\u542F allow_network\u3002\u6240\u6709\u6587\u4EF6/\u4F9D\u8D56\u653E /ws\uFF08\u5BB9\u5668\u91CD\u5EFA\u540E\u4FDD\u7559\uFF09\uFF1B\u5BB9\u5668\u6839\u76EE\u5F55\u4E3A\u77AC\u6001\u4E0D\u4FDD\u7559\u3002",parameters:{type:"object",properties:{command:{type:"string",description:"\u8981\u6267\u884C\u7684 shell \u547D\u4EE4\uFF08\u5DE5\u4F5C\u76EE\u5F55 /ws\uFF09"},description:{type:"string",description:"\u547D\u4EE4\u7684\u76EE\u7684\u8BF4\u660E\uFF08\u4EC5\u7528\u4E8E\u65E5\u5FD7\uFF09"}},required:["command"]}}}});var Lh={};ie(Lh,{byokParamsOf:()=>Li,getByokConfig:()=>jh});async function jh(n,e){let r=(await n.query.from("app_ai_configs").select("base_url","api_key","model").where({app_id:e}).limit(1).run())[0];return!r||!r.base_url&&!r.api_key?null:r}async function Li(n,e){let t=await jh(n,e);return t?{...t.api_key?{apiKey:t.api_key}:{},...t.base_url?{baseUrl:t.base_url}:{},...t.model?{model:t.model}:{}}:{}}var Rc=I(()=>{"use strict"});var Ic={};ie(Ic,{aiActionFromWf:()=>Oc,aiEmit:()=>Wi,aiEvents:()=>Cc,resetAiEvents:()=>Nx,subscribeAiEvents:()=>Ac});function Wi(n,e,t){let r={entity:"ai",action:n,ts:Date.now()};e!=null&&(r.target=e),t!=null&&(r.payload=t),t?.messageId&&(r.session=String(t.messageId)),Dr<5e3?(Ec[(qr+Dr)%5e3]=r,Dr++):(Ec[qr]=r,qr=(qr+1)%5e3);for(let s of Tc)try{s(r)}catch{}}function Ac(n){return Tc.add(n),()=>{Tc.delete(n)}}function Cc(n=100,e){return Px(n,e)}function Px(n,e){let t=new Array(Dr);for(let s=0;s<Dr;s++)t[s]=Ec[(qr+s)%5e3];let r=t.slice(-n);return e?r.filter(s=>!(e.agentId&&s.target!==e.agentId||e.action&&s.action!==e.action||e.messageId&&s.payload?.messageId!==e.messageId)):r}function Nx(){qr=0,Dr=0}function Oc(n){switch(n){case"wf:token":return"token";case"wf:step":return"step";case"wf:tool_call":return"tool:call";case"wf:tool_result":return"tool:result";case"wf:done":return"done";case"wf:error":return"error";case"wf:usage":return"usage";case"wf:verify":return"verify";default:return n.replace("wf:","")}}function Mx(){let n=globalThis.__sandbox_events;return{sandboxEvents:e=>typeof n=="function"?n(e):[]}}var Ec,qr,Dr,Tc,Hs=I(()=>{"use strict";Ec=[],qr=0,Dr=0,Tc=new Set;if(typeof globalThis<"u"){let n=globalThis;n.__ai_events||(n.__ai_events=(e=100,t)=>Cc(e,t)),n.__events_timeline||(n.__events_timeline=e=>{let{sandboxEvents:t}=Mx(),r=Cc(2e3).filter(i=>i.payload?.requestId===e),s=t(2e3).filter(i=>i.payload?.requestId===e);return[...r.map(i=>({tier:"ai",action:i.action,target:i.target,payload:i.payload,ts:i.ts})),...s.map(i=>({tier:"sandbox",action:i.action,target:i.target,payload:i.payload,ts:i.ts}))].sort((i,a)=>i.ts-a.ts)})}});var Pc={};ie(Pc,{needsApproval:()=>Dx,riskOf:()=>Wh});function Wh(n,e){let t=Object.values(e??{}).map(String).join(" ");return $x.some(r=>r.test(t))?"high":qx.some(r=>r.test(t))?"medium":"low"}function Dx(n,e,t){return n==="off"?!1:n==="strict"?!0:Wh(e,t)!=="low"}var $x,qx,Nc=I(()=>{"use strict";$x=[/\brm\b/i,/\bdelete\b/i,/\bremove\b/i,/\bdrop\b/i,/\btruncate\b/i,/\bunlink\b/i,/\bformat\b/i,/\bshutdown\b/i,/\breboot\b/i,/--force\b/i,/-rf\b/i,/agent-browser[^\n]*(click|type|fill|press|submit|keyboard)/i],qx=[/\bwrite\b/i,/\bedit\b/i,/\bsave\b/i,/\bmv\b/i,/\brename\b/i,/\bmkdir\b/i,/\bexec\b/i,/\bbash\b/i,/\bcommand\b/i,/\bshell\b/i,/\bhttp\b/i,/\bpost\b/i,/\bfetch\b/i,/\brequest\b/i,/\bnetwork\b/i,/\bcurl\b/i,/agent-browser[^\n]*(open|read|snapshot|screenshot)/i]});var zh={};ie(zh,{runAgent:()=>Ui,streamAgent:()=>qc,streamAgentPreview:()=>$c});function Uh(n){let e=0;for(let t of n)/[\u4e00-\u9fff\u3400-\u4dbf]/.test(t)?e+=1.5:e+=.25;return Math.ceil(e)}function Bh(n){let e=0;for(let t of n)if(e+=Uh(t.content),t.tool_calls)for(let r of t.tool_calls)e+=Uh(r.function.name+r.function.arguments);return e+=n.length*4,{prompt:e,completion:0,total:e}}function jx(n,e){if(Bh(n).total<=e)return n;let r=n.filter(i=>i.role==="system"),o=[...n.filter(i=>i.role!=="system")];for(;o.length>1&&Bh([...r,...o]).total>e;)o.shift();return[...r,...o]}async function Mc(n,e){let t=[],r=new Set,s=a=>{for(let l of a){let u=l.function?.name??l.name;!u||r.has(u)||(r.add(u),t.push(l))}};try{let{BUILTIN_TOOL_DEFS:a}=await Promise.resolve().then(()=>(Fs(),Kh));s(a)}catch{}s(e.tools);let o;if(e.preloadedSkills&&e.preloadedSkills.length>0){o=new $r(e.agentId);for(let a of e.preloadedSkills)o.registerSkill(a),s(a.tools)}if(e.allowFileTools&&e.departmentId){let a=null,l=e.departmentId;try{let[u]=await n.orm.query.from("agents").select("type","department_id").where({id:{eq:String(e.agentId)}}).limit(1).run();u?.department_id&&(l=String(u.department_id))}catch{}try{let[u]=await n.orm.query.from("departments").select("is_dm","workspace_path","artifact_review").where({id:{eq:l}}).limit(1).run();if(u&&(a=await cc(l,u.workspace_path,!0),a&&u.artifact_review)){let{join:c}=await import("node:path"),{mkdir:d}=await import("node:fs/promises"),p=c(a,".pending");await d(p,{recursive:!0}).catch(()=>{}),a=p}}catch(u){console.warn(`[agent-runner] \u90E8\u95E8\u5DE5\u4F5C\u7A7A\u95F4\u67E5\u8BE2\u5931\u8D25: ${u?.message??""}`)}if(a){let u=qh(e.allowCommandExec??!1);s(u);try{let c=$h(a,e.allowCommandExec??!1,e.departmentId,e.allowNetwork);o||(o=new $r(e.agentId)),o.registerSkill({dir:a,meta:{name:"__workspace__",description:"\u5DE5\u4F5C\u7A7A\u95F4\u6587\u4EF6\u5DE5\u5177"},tools:u,handlers:c})}catch(c){console.warn(`[agent-runner] \u5DE5\u4F5C\u7A7A\u95F4\u521D\u59CB\u5316\u5931\u8D25: ${c.message}`)}}}return{tools:t.map(a=>({name:a.function.name,description:a.function.description,parameters:a.function.parameters,run:async l=>{let u={...e.toolContext??{},agentId:e.agentId,departmentId:e.departmentId};if(o?.hasTool(a.function.name))return await o.executeTool(a.function.name,l,u);let c=wh(a.function.name);if(!c)return`Error: tool handler for "${a.function.name}" not registered`;let d=await c(l,u);return typeof d=="string"?d:JSON.stringify(d)}})),skillRegistry:o}}async function Hh(n,e){try{let[t]=await n.orm.query.from("agent_memories").select("content").where({agent_id:{eq:e}}).limit(1).run();return t&&String(t.content??"").trim()?String(t.content).slice(0,1500):""}catch{return""}}function Fh(n,e){return n+(e?`
233
233
  \u3010\u5386\u53F2\u8BB0\u5FC6\u3011${e}
234
- `:"")+Ih}async function Hh(n,e,t,r,s,i,o,a){try{let l=[...s].reverse().find(d=>d.role==="user");if(!l)return;let u=await e.chat({model:a??t.model,apiKey:t.apiKey,baseUrl:t.baseUrl,messages:[{role:"system",content:"\u4ECE\u5BF9\u8BDD\u4E2D\u63D0\u53D6\u503C\u5F97\u957F\u671F\u8BB0\u4F4F\u7684\u7528\u6237\u504F\u597D\u6216\u9879\u76EE\u7EA6\u5B9A\uFF08\u5982\uFF1A\u7528\u6237\u559C\u6B22\u7B80\u6D01\u56DE\u590D/\u9879\u76EE\u4F7F\u7528 TypeScript\uFF09\u3002\u6CA1\u6709\u503C\u5F97\u8BB0\u4F4F\u7684\u5219\u8F93\u51FA\u7A7A\u5B57\u7B26\u4E32\u3002\u53EA\u8F93\u51FA\u8BB0\u5FC6\u5185\u5BB9\uFF0C\u6700\u591A 100 \u5B57\u3002"},{role:"user",content:`\u7528\u6237\uFF1A${String(l.content??"").slice(0,800)}
235
- \u52A9\u624B\uFF1A${String(i).slice(0,800)}`}],max_tokens:120}),c=String(u?.choices?.[0]?.message?.content??"").trim();if(c&&c.length>3){let d=o?`${o}
236
- - ${c.slice(0,500)}`.slice(0,2e3):c.slice(0,500);await n.orm.query.insert("agent_memories").values({agent_id:r,content:d,updated_at:G.now()}).onConflict("agent_id",!0).run()}}catch{}}async function Li(n,e,t){let{ai:r}=n,s=Wx([{role:"system",content:e.systemPrompt},...t],8e3),{tools:i}=await Ic(n,e),o=Date.now(),a=await Di(n.orm,e.appId).catch(()=>({})),{needsApproval:l,riskOf:u}=await Promise.resolve().then(()=>(Oc(),Ac)),c="auto";try{let[w]=await n.orm.query.from("agents").select("risk_policy").where({id:{eq:String(e.agentId)}}).limit(1).run();c=String(w?.risk_policy??"auto")}catch{}let d=e.humanInTheLoop?w=>l(c,w.name,w.args):void 0,p=await Uh(n,e.agentId),m;try{let[w]=await n.orm.query.from("agents").select("light_model").where({id:{eq:String(e.agentId)}}).limit(1).run();m=w?.light_model?String(w.light_model):void 0}catch{}let f=await r.agent({model:a.model??e.model,apiKey:a.apiKey,baseUrl:a.baseUrl,systemPrompt:Bh(e.systemPrompt,p),tools:i,maxSteps:e.maxSteps??10,humanInTheLoop:d,parallelTools:!0,toolContext:e.toolContext}).runToResult(s.slice(1));if(e.selfCheck!==!1&&f.content)try{let w=[...t].reverse().find(y=>y.role==="user");if(w){let y=await r.chat({model:a.model??e.model,apiKey:a.apiKey,baseUrl:a.baseUrl,messages:[{role:"system",content:'\u4F60\u662F\u4EFB\u52A1\u8D28\u68C0\u5458\u3002\u68C0\u67E5\u52A9\u624B\u662F\u5426\u5B8C\u6574\u5B8C\u6210\u4E86\u7528\u6237\u76EE\u6807\u3002\u53EA\u8F93\u51FA JSON\uFF1A{"complete":true|false,"missing":"\u672A\u5B8C\u6210\u90E8\u5206\u6458\u8981\u6216\u7A7A\u5B57\u7B26\u4E32"}'},{role:"user",content:`\u7528\u6237\u76EE\u6807\uFF1A${String(w.content??"").slice(0,2e3)}
234
+ `:"")+Nh}async function Vh(n,e,t,r,s,o,i,a){try{let l=[...s].reverse().find(d=>d.role==="user");if(!l)return;let u=await e.chat({model:a??t.model,apiKey:t.apiKey,baseUrl:t.baseUrl,messages:[{role:"system",content:"\u4ECE\u5BF9\u8BDD\u4E2D\u63D0\u53D6\u503C\u5F97\u957F\u671F\u8BB0\u4F4F\u7684\u7528\u6237\u504F\u597D\u6216\u9879\u76EE\u7EA6\u5B9A\uFF08\u5982\uFF1A\u7528\u6237\u559C\u6B22\u7B80\u6D01\u56DE\u590D/\u9879\u76EE\u4F7F\u7528 TypeScript\uFF09\u3002\u6CA1\u6709\u503C\u5F97\u8BB0\u4F4F\u7684\u5219\u8F93\u51FA\u7A7A\u5B57\u7B26\u4E32\u3002\u53EA\u8F93\u51FA\u8BB0\u5FC6\u5185\u5BB9\uFF0C\u6700\u591A 100 \u5B57\u3002"},{role:"user",content:`\u7528\u6237\uFF1A${String(l.content??"").slice(0,800)}
235
+ \u52A9\u624B\uFF1A${String(o).slice(0,800)}`}],max_tokens:120}),c=String(u?.choices?.[0]?.message?.content??"").trim();if(c&&c.length>3){let d=i?`${i}
236
+ - ${c.slice(0,500)}`.slice(0,2e3):c.slice(0,500);await n.orm.query.insert("agent_memories").values({agent_id:r,content:d,updated_at:Q.now()}).onConflict("agent_id",!0).run()}}catch{}}async function Ui(n,e,t){let{ai:r}=n,s=jx([{role:"system",content:e.systemPrompt},...t],8e3),{tools:o}=await Mc(n,e),i=Date.now(),a=await Li(n.orm,e.appId).catch(()=>({})),{needsApproval:l,riskOf:u}=await Promise.resolve().then(()=>(Nc(),Pc)),c="auto";try{let[h]=await n.orm.query.from("agents").select("risk_policy").where({id:{eq:String(e.agentId)}}).limit(1).run();c=String(h?.risk_policy??"auto")}catch{}let d=e.humanInTheLoop?h=>l(c,h.name,h.args):void 0,p=await Hh(n,e.agentId),f;try{let[h]=await n.orm.query.from("agents").select("light_model").where({id:{eq:String(e.agentId)}}).limit(1).run();f=h?.light_model?String(h.light_model):void 0}catch{}let m=await r.agent({model:a.model??e.model,apiKey:a.apiKey,baseUrl:a.baseUrl,systemPrompt:Fh(e.systemPrompt,p),tools:o,maxSteps:e.maxSteps??10,humanInTheLoop:d,parallelTools:!0,toolContext:e.toolContext}).runToResult(s.slice(1));if(e.selfCheck!==!1&&m.content)try{let h=[...t].reverse().find(b=>b.role==="user");if(h){let b=await r.chat({model:a.model??e.model,apiKey:a.apiKey,baseUrl:a.baseUrl,messages:[{role:"system",content:'\u4F60\u662F\u4EFB\u52A1\u8D28\u68C0\u5458\u3002\u68C0\u67E5\u52A9\u624B\u662F\u5426\u5B8C\u6574\u5B8C\u6210\u4E86\u7528\u6237\u76EE\u6807\u3002\u53EA\u8F93\u51FA JSON\uFF1A{"complete":true|false,"missing":"\u672A\u5B8C\u6210\u90E8\u5206\u6458\u8981\u6216\u7A7A\u5B57\u7B26\u4E32"}'},{role:"user",content:`\u7528\u6237\u76EE\u6807\uFF1A${String(h.content??"").slice(0,2e3)}
237
237
 
238
- \u52A9\u624B\u7ED3\u679C\uFF1A${String(f.content).slice(0,4e3)}`}],max_tokens:150}),_=String(y?.choices?.[0]?.message?.content??"").trim().match(/\{[\s\S]*\}/);if(_){let v=JSON.parse(_[0]);v.complete===!1&&v.missing&&(f.content=`${String(f.content)}
238
+ \u52A9\u624B\u7ED3\u679C\uFF1A${String(m.content).slice(0,4e3)}`}],max_tokens:150}),_=String(b?.choices?.[0]?.message?.content??"").trim().match(/\{[\s\S]*\}/);if(_){let v=JSON.parse(_[0]);v.complete===!1&&v.missing&&(m.content=`${String(m.content)}
239
239
 
240
- \u26A0\uFE0F \u81EA\u67E5\uFF1A\u4EE5\u4E0B\u90E8\u5206\u53EF\u80FD\u672A\u5B8C\u6210\u2014\u2014${String(v.missing).slice(0,300)}`)}}}catch{}f.content&&await Hh(n,r,a,e.agentId,t,String(f.content),p,m);let g=Date.now()-o;try{let w=n.orm;w&&await w.query.insert("agent_logs").values({agent_id:e.agentId,app_id:e.appId,department_id:e.departmentId||null,messages_count:t.length,steps_count:f.steps?.length??0,tokens_prompt:f.usage?.prompt_tokens??0,tokens_completion:f.usage?.completion_tokens??0,tokens_total:f.usage?.total_tokens??0,elapsed_ms:g,success:!0}).run()}catch{}return f}async function Pc(n,e,t,r){let{ai:s,sql:i}=n,o=e.tools??[],a=await Ux(n.orm,e.id,n),l={agentId:e.id,appId:n.appId,departmentId:"",systemPrompt:e.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002",model:e.model,tools:o,maxSteps:e.max_tokens?Math.min(e.max_tokens,20):10,humanInTheLoop:!1,preloadedSkills:a,workspacePath:e.workspace_path,allowFileTools:e.allow_file_tools,allowCommandExec:e.allow_command_exec,allowNetwork:e.allow_network},{tools:u}=await Ic(n,l);await s.agent({model:l.model,systemPrompt:l.systemPrompt,tools:u,maxSteps:l.maxSteps??10,humanInTheLoop:!1,toolContext:l.toolContext}).stream([{role:"user",content:t}],{emit:(d,p)=>{d==="wf:token"?r(`event: wf:token
240
+ \u26A0\uFE0F \u81EA\u67E5\uFF1A\u4EE5\u4E0B\u90E8\u5206\u53EF\u80FD\u672A\u5B8C\u6210\u2014\u2014${String(v.missing).slice(0,300)}`)}}}catch{}m.content&&await Vh(n,r,a,e.agentId,t,String(m.content),p,f);let g=Date.now()-i;try{let h=n.orm;h&&await h.query.insert("agent_logs").values({agent_id:e.agentId,app_id:e.appId,department_id:e.departmentId||null,messages_count:t.length,steps_count:m.steps?.length??0,tokens_prompt:m.usage?.prompt_tokens??0,tokens_completion:m.usage?.completion_tokens??0,tokens_total:m.usage?.total_tokens??0,elapsed_ms:g,success:!0}).run()}catch{}return m}async function $c(n,e,t,r){let{ai:s,sql:o}=n,i=e.tools??[],a=await Lx(n.orm,e.id,n),l={agentId:e.id,appId:n.appId,departmentId:"",systemPrompt:e.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002",model:e.model,tools:i,maxSteps:e.max_tokens?Math.min(e.max_tokens,20):10,humanInTheLoop:!1,preloadedSkills:a,workspacePath:e.workspace_path,allowFileTools:e.allow_file_tools,allowCommandExec:e.allow_command_exec,allowNetwork:e.allow_network},{tools:u}=await Mc(n,l);await s.agent({model:l.model,systemPrompt:l.systemPrompt,tools:u,maxSteps:l.maxSteps??10,humanInTheLoop:!1,toolContext:l.toolContext}).stream([{role:"user",content:t}],{emit:(d,p)=>{d==="wf:token"?r(`event: wf:token
241
241
  data: ${JSON.stringify({text:p.text})}
242
242
 
243
243
  `):d==="wf:tool_call"?r(`event: wf:tool_call
@@ -249,12 +249,12 @@ data: ${JSON.stringify({content:p.content})}
249
249
  `):d==="wf:error"&&r(`event: wf:error
250
250
  data: ${JSON.stringify(p.message??"")}
251
251
 
252
- `)}})}async function Ux(n,e,t){try{let r=await n.query.from("agent_skills").select("skill_dir","skill_name").where({agent_id:e,enabled:{eq:!0}}).run(),s=[];for(let i of r)try{let{loadSkill:o}=await Promise.resolve().then(()=>(Ls(),_c));s.push(await o(i.skill_dir,()=>t))}catch{}return s}catch{return[]}}async function Nc(n,e,t,r){let{ai:s}=n,{tools:i}=await Ic(n,e),o=await Di(n.orm,e.appId).catch(()=>({})),{needsApproval:a,riskOf:l}=await Promise.resolve().then(()=>(Oc(),Ac)),u="auto";try{let[S]=await n.orm.query.from("agents").select("risk_policy").where({id:{eq:String(e.agentId)}}).limit(1).run();u=String(S?.risk_policy??"auto")}catch{}let c=e.humanInTheLoop?S=>a(u,S.name,S.args):void 0,d=await Uh(n,e.agentId),p;try{let[S]=await n.orm.query.from("agents").select("light_model").where({id:{eq:String(e.agentId)}}).limit(1).run();p=S?.light_model?String(S.light_model):void 0}catch{}let m=s.agent({model:o.model??e.model,apiKey:o.apiKey,baseUrl:o.baseUrl,systemPrompt:Bh(e.systemPrompt,d),tools:i,maxSteps:e.maxSteps??10,humanInTheLoop:c,parallelTools:!0,toolContext:e.toolContext}),h="",f,g="",w=!1,y=Promise.resolve(),k="",_=Date.now(),v=(S,A)=>{let C={...A??{}};S==="wf:done"&&(C.ms=Date.now()-_);try{let j=Tc(S);if(e.runMessageId&&(C.messageId=e.runMessageId),e.departmentId&&(C.departmentId=e.departmentId),e.requestId&&(C.requestId=e.requestId),S==="wf:token"){let K=String(A.text??""),U=k==="";k=K,U&&(C.text=K,ji(j,e.agentId,C))}else ji(j,e.agentId,C)}catch{}if(S==="wf:done"&&!w&&(w=!0,Hh(n,s,o,e.agentId,t,h,d,p)),S==="wf:token"){let j=A.text;h+=j,r.onChunk(j)}else if(S==="wf:step"){let j=A;j.type==="tool"&&j.name&&(g=j.name,r.onToolCall?.({name:j.name,args:j.args??""}),e.runMessageId&&(y=y,y=y.then(()=>n.orm.query.insert("agent_run_states").values({message_id:e.runMessageId??"",agent_id:String(e.agentId),department_id:e.departmentId,app_id:String(e.appId),steps:[{tool:j.name,args:j.args??"",at:new Date().toISOString()}],status:"running"}).onConflict("message_id",!0,{steps:G.mergeAppend([{tool:j.name,args:j.args??"",at:new Date().toISOString()}]),status:"running",updated_at:G.mergeNow()}).run()).catch(()=>{})))}else if(S==="wf:tool_result"){let j=A,K=j.ok,U=K?void 0:j.error?.message??"unknown",H=K?typeof j.output=="string"?j.output:JSON.stringify(j.output??""):`Error: ${U}`;r.onToolResult?.({name:g,result:H,ok:K,error:U}),e.runMessageId&&(y=y,y=y.then(()=>n.orm.query.update("agent_run_states").set({steps:G.mergeAppend([{tool:g,result:H.slice(0,200),ok:j.ok,at:new Date().toISOString()}]),updated_at:G.mergeNow()}).where({message_id:{eq:e.runMessageId??""}}).run()).catch(()=>{}))}else S==="wf:usage"?f=A:S==="wf:done"&&r.onFinish?.({content:h})};await m.stream(t,{emit:v}),await y.catch(()=>{});try{await n.orm.query.update("agent_run_states").set({status:"done",updated_at:G.now()}).where({message_id:{eq:e.runMessageId??""},status:{eq:"running"}}).run()}catch{}return f}var Wi=N(()=>{"use strict";re();Ls();Ph();Ie();$h();oc();kc();Ws()});function Hx(n){return Bx[n]??n}function Bs(n,e){return`\u3010\u672C\u90E8\u95E8\u6210\u5458\u3011
253
- ${n.map(r=>{let s=[Hx(r.type),r.role==="admin"?"\u7BA1\u7406\u5458":""].filter(Boolean).join("\xB7"),i=r.role_label?`\xB7${r.role_label}`:"",o=r.expertise?`\u2014\u2014${r.expertise}`:"",a=r.id===e?" \u2190 \u4F60":"";return`- ${r.name}\uFF08${s}${i}\uFF09${o}${a}`}).join(`
254
- `)}`}function Mc(n){let e=`[${n.senderName}]`;if(n.replyTo){let t=n.replyTo.content.length>80?`${n.replyTo.content.slice(0,80)}\u2026`:n.replyTo.content;return`${e}\uFF08\u56DE\u590D [${n.replyTo.senderName}] "${t}"\uFF09${n.content}`}return`${e} ${n.content}`}function zh(n){let e=n.filter(r=>r.path&&!Fx.test(r.path));return e.length===0?"":`\u3010\u5DE5\u4F5C\u7A7A\u95F4\u6587\u4EF6\u3011
252
+ `)}})}async function Lx(n,e,t){try{let r=await n.query.from("agent_skills").select("skill_dir","skill_name").where({agent_id:e,enabled:{eq:!0}}).run(),s=[];for(let o of r)try{let{loadSkill:i}=await Promise.resolve().then(()=>(Bs(),Sc));s.push(await i(o.skill_dir,()=>t))}catch{}return s}catch{return[]}}async function qc(n,e,t,r){let{ai:s}=n,{tools:o}=await Mc(n,e),i=await Li(n.orm,e.appId).catch(()=>({})),{needsApproval:a,riskOf:l}=await Promise.resolve().then(()=>(Nc(),Pc)),u="auto";try{let[S]=await n.orm.query.from("agents").select("risk_policy").where({id:{eq:String(e.agentId)}}).limit(1).run();u=String(S?.risk_policy??"auto")}catch{}let c=e.humanInTheLoop?S=>a(u,S.name,S.args):void 0,d=await Hh(n,e.agentId),p;try{let[S]=await n.orm.query.from("agents").select("light_model").where({id:{eq:String(e.agentId)}}).limit(1).run();p=S?.light_model?String(S.light_model):void 0}catch{}let f=s.agent({model:i.model??e.model,apiKey:i.apiKey,baseUrl:i.baseUrl,systemPrompt:Fh(e.systemPrompt,d),tools:o,maxSteps:e.maxSteps??10,humanInTheLoop:c,parallelTools:!0,toolContext:e.toolContext}),w="",m,g="",h=!1,b=Promise.resolve(),k="",_=Date.now(),v=(S,A)=>{let C={...A??{}};S==="wf:done"&&(C.ms=Date.now()-_);try{let W=Oc(S);if(e.runMessageId&&(C.messageId=e.runMessageId),e.departmentId&&(C.departmentId=e.departmentId),e.requestId&&(C.requestId=e.requestId),S==="wf:token"){let G=String(A.text??""),U=k==="";k=G,U&&(C.text=G,Wi(W,e.agentId,C))}else Wi(W,e.agentId,C)}catch{}if(S==="wf:done"&&!h&&(h=!0,Vh(n,s,i,e.agentId,t,w,d,p)),S==="wf:token"){let W=A.text;w+=W,r.onChunk(W)}else if(S==="wf:step"){let W=A;W.type==="tool"&&W.name&&(g=W.name,r.onToolCall?.({name:W.name,args:W.args??""}),e.runMessageId&&(b=b,b=b.then(()=>n.orm.query.insert("agent_run_states").values({message_id:e.runMessageId??"",agent_id:String(e.agentId),department_id:e.departmentId,app_id:String(e.appId),steps:[{tool:W.name,args:W.args??"",at:new Date().toISOString()}],status:"running"}).onConflict("message_id",!0,{steps:Q.mergeAppend([{tool:W.name,args:W.args??"",at:new Date().toISOString()}]),status:"running",updated_at:Q.mergeNow()}).run()).catch(()=>{})))}else if(S==="wf:tool_result"){let W=A,G=W.ok,U=G?void 0:W.error?.message??"unknown",F=G?typeof W.output=="string"?W.output:JSON.stringify(W.output??""):`Error: ${U}`;r.onToolResult?.({name:g,result:F,ok:G,error:U}),e.runMessageId&&(b=b,b=b.then(()=>n.orm.query.update("agent_run_states").set({steps:Q.mergeAppend([{tool:g,result:F.slice(0,200),ok:W.ok,at:new Date().toISOString()}]),updated_at:Q.mergeNow()}).where({message_id:{eq:e.runMessageId??""}}).run()).catch(()=>{}))}else S==="wf:usage"?m=A:S==="wf:done"&&r.onFinish?.({content:w})};await f.stream(t,{emit:v}),await b.catch(()=>{});try{await n.orm.query.update("agent_run_states").set({status:"done",updated_at:Q.now()}).where({message_id:{eq:e.runMessageId??""},status:{eq:"running"}}).run()}catch{}return m}var Bi=I(()=>{"use strict";re();Bs();Mh();Ne();Dh();lc();Rc();Hs()});function Ux(n){return Wx[n]??n}function Vs(n,e){return`\u3010\u672C\u90E8\u95E8\u6210\u5458\u3011
253
+ ${n.map(r=>{let s=[Ux(r.type),r.role==="admin"?"\u7BA1\u7406\u5458":""].filter(Boolean).join("\xB7"),o=r.role_label?`\xB7${r.role_label}`:"",i=r.expertise?`\u2014\u2014${r.expertise}`:"",a=r.id===e?" \u2190 \u4F60":"";return`- ${r.name}\uFF08${s}${o}\uFF09${i}${a}`}).join(`
254
+ `)}`}function Dc(n){let e=`[${n.senderName}]`;if(n.replyTo){let t=n.replyTo.content.length>80?`${n.replyTo.content.slice(0,80)}\u2026`:n.replyTo.content;return`${e}\uFF08\u56DE\u590D [${n.replyTo.senderName}] "${t}"\uFF09${n.content}`}return`${e} ${n.content}`}function Gh(n){let e=n.filter(r=>r.path&&!Bx.test(r.path));return e.length===0?"":`\u3010\u5DE5\u4F5C\u7A7A\u95F4\u6587\u4EF6\u3011
255
255
  ${e.map(r=>{let s=r.size>=1024?`${(r.size/1024).toFixed(1)}KB`:`${r.size}B`;return`- ${r.path}\uFF08${s}\uFF09`}).join(`
256
256
  `)}
257
- \u9700\u8981\u8BFB\u53D6\u65F6\u76F4\u63A5\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839 /ws\uFF09\uFF0C\u65E0\u9700 list_files\u3002`}function Ui(n){return`${n.rosterText}
257
+ \u9700\u8981\u8BFB\u53D6\u65F6\u76F4\u63A5\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9\u4E8E\u5DE5\u4F5C\u7A7A\u95F4\u6839 /ws\uFF09\uFF0C\u65E0\u9700 list_files\u3002`}function Hi(n){return`${n.rosterText}
258
258
 
259
259
  \u3010\u534F\u4F5C\u65B9\u5F0F\u3011\u4F60\u662F\u672C\u7FA4\u6210\u5458\uFF0C\u50CF\u771F\u4EBA\u540C\u4E8B\u4E00\u6837\u534F\u4F5C\uFF1A
260
260
  1. \u88AB @ \u65F6\u5FC5\u987B\u54CD\u5E94\uFF1B\u770B\u5230\u9700\u8981\u4F60\u4E13\u4E1A\u80FD\u529B\u7684\u95EE\u9898\u53EF\u4EE5\u4E3B\u52A8\u53C2\u4E0E
@@ -263,69 +263,69 @@ ${e.map(r=>{let s=r.size>=1024?`${(r.size/1024).toFixed(1)}KB`:`${r.size}B`;retu
263
263
  4. \u770B\u5230\u5176\u4ED6\u6210\u5458\u56DE\u590D\u4E0E\u4F60\u7684\u8BA4\u77E5\u4E0D\u4E00\u81F4\u65F6\uFF0C\u663E\u5F0F\u8BF4\u660E\u5206\u6B67\u70B9\uFF08\u7ED9\u7406\u7531\uFF0C\u4E0D\u7A7A\u5BF9\u7A7A\uFF09
264
264
  5. \u79F0\u547C\u3001\u81F4\u8C22\u3001\u9053\u6B49\u2014\u2014\u50CF\u771F\u4EBA\u540C\u4E8B\u4E00\u6837\u81EA\u7136\uFF1B**\u7981\u6B62\u79F0\u5BF9\u65B9\u4E3A'\u7528\u6237'\u6216'\u8BE5\u7528\u6237'**\u2014\u2014\u7528'\u4F60/\u60A8'\u6216\u5BF9\u65B9\u540D\u5B57
265
265
 
266
- \u3010\u7EC4\u7EC7\u89D2\u8272\u3011\u540D\u5355\u4E2D\u6807"\u7BA1\u7406\u5458"\u7684\u6210\u5458\u662F\u7FA4\u8D1F\u8D23\u4EBA/\u51B3\u7B56\u4EBA\uFF1A\u91CD\u8981\u7ED3\u8BBA\u5411\u4ED6\u6C47\u62A5\uFF0C\u9700\u8981\u62CD\u677F\u7684\u4E8B\u9879\u4EA4\u7ED9\u4ED6\uFF1B\u4F60\u662F\u6267\u884C\u8005\u2014\u2014\u63D0\u65B9\u6848\u3001\u7ED9\u5EFA\u8BAE\uFF0C\u4F46\u6700\u7EC8\u51B3\u5B9A\u6743\u5728\u8D1F\u8D23\u4EBA`}var Bx,Fx,$c,Kh=N(()=>{"use strict";Bx={user:"\u4EBA",ai:"AI",knowledge_base:"\u77E5\u8BC6\u5E93",webhook:"Webhook"};Fx=/(^|\/)(node_modules|\.git|\.next|dist|__pycache__)(\/|$)|(^|\/)\.[^\/]*$/;$c=`
267
- \u3010\u5FEB\u6377\u786E\u8BA4\u3011\u5F53\u4F60\u9700\u8981\u7528\u6237\u786E\u8BA4/\u62CD\u677F\u65F6\uFF08\u5982\u300C\u8BF7\u786E\u8BA4\u6E05\u7406\u8303\u56F4\u300D\u300C\u8981\u4E0D\u8981\u7EE7\u7EED\u300D\uFF09\uFF0C\u5728\u56DE\u590D\u672B\u5C3E\u5355\u72EC\u4E00\u884C\u8F93\u51FA\u9009\u9879\u6807\u8BB0\uFF0C\u683C\u5F0F\uFF1A[[choices:\u9009\u98791|\u9009\u98792|\u9009\u98793]]\uFF08\u6700\u591A 4 \u4E2A\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 10 \u5B57\uFF0C\u5982 [[choices:\u6E05\u7406 30 \u5929\u524D\u5907\u4EFD|\u5168\u90E8\u6E05\u7406|\u6682\u4E0D\u6E05\u7406]]\uFF09\u2014\u2014\u7528\u6237\u4F1A\u770B\u5230\u53EF\u70B9\u51FB\u6309\u94AE\u76F4\u63A5\u56DE\u590D\uFF1B\u65E0\u9700\u786E\u8BA4\u65F6\u4E0D\u8981\u8F93\u51FA\u8BE5\u6807\u8BB0`});function zx(n,e=Vx){return n>0&&n%e===0}function Qh(n){return!n||!n.trim()?"":`\u3010\u7FA4\u5171\u8BC6\u8BB0\u5FC6\u3011\u8FD9\u662F\u7FA4\u91CC\u6B64\u524D\u8BA8\u8BBA\u7684\u7ED3\u8BBA\u2014\u2014\u4F18\u5148\u9075\u5B88\uFF1A
268
- ${n.trim().slice(0,Gh)}`}async function Jh(n,e){try{let t=n.orm,[r]=await t.query.insert("group_memories").values({department_id:e,msg_count:1}).onConflict("department_id",!0,{msg_count:G.mergeInc(1)}).returning("msg_count").run(),s=Number(r?.msg_count??0);if(!zx(s))return;let i=await t.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("a.name as sender_name","m.content").where({"m.department_id":e,"m.ai_approved":{ne:!1}}).orderBy("m.created_at","desc").limit(30).run();if(i.length===0)return;let o=i.reverse().map(d=>`[${String(d.sender_name??"\u672A\u77E5")}] ${String(d.content??"").slice(0,200)}`).join(`
269
- `).slice(0,6e3),a;try{let[d]=await t.query.from("agents").select("light_model").where({app_id:String(n.appId),light_model:{ne:null}}).limit(1).run();a=d?.light_model?String(d.light_model):void 0}catch{}let u=await n.ai.chat({model:a,messages:[{role:"system",content:Kx},{role:"user",content:o}],max_tokens:200}),c=String(u?.choices?.[0]?.message?.content??"").trim();c&&c.length>10&&await t.query.insert("group_memories").values({department_id:e,summary:c.slice(0,Gh),updated_at:G.now()}).onConflict("department_id",!0).run()}catch{}}var Vx,Gh,Kx,Zh=N(()=>{"use strict";re();Vx=20,Gh=500;Kx=`\u4ECE\u7FA4\u804A\u6D88\u606F\u4E2D\u63D0\u53D6\u7FA4\u5171\u8BC6\uFF0C\u683C\u5F0F\uFF1A
266
+ \u3010\u7EC4\u7EC7\u89D2\u8272\u3011\u540D\u5355\u4E2D\u6807"\u7BA1\u7406\u5458"\u7684\u6210\u5458\u662F\u7FA4\u8D1F\u8D23\u4EBA/\u51B3\u7B56\u4EBA\uFF1A\u91CD\u8981\u7ED3\u8BBA\u5411\u4ED6\u6C47\u62A5\uFF0C\u9700\u8981\u62CD\u677F\u7684\u4E8B\u9879\u4EA4\u7ED9\u4ED6\uFF1B\u4F60\u662F\u6267\u884C\u8005\u2014\u2014\u63D0\u65B9\u6848\u3001\u7ED9\u5EFA\u8BAE\uFF0C\u4F46\u6700\u7EC8\u51B3\u5B9A\u6743\u5728\u8D1F\u8D23\u4EBA`}var Wx,Bx,jc,Qh=I(()=>{"use strict";Wx={user:"\u4EBA",ai:"AI",knowledge_base:"\u77E5\u8BC6\u5E93",webhook:"Webhook"};Bx=/(^|\/)(node_modules|\.git|\.next|dist|__pycache__)(\/|$)|(^|\/)\.[^\/]*$/;jc=`
267
+ \u3010\u5FEB\u6377\u786E\u8BA4\u3011\u5F53\u4F60\u9700\u8981\u7528\u6237\u786E\u8BA4/\u62CD\u677F\u65F6\uFF08\u5982\u300C\u8BF7\u786E\u8BA4\u6E05\u7406\u8303\u56F4\u300D\u300C\u8981\u4E0D\u8981\u7EE7\u7EED\u300D\uFF09\uFF0C\u5728\u56DE\u590D\u672B\u5C3E\u5355\u72EC\u4E00\u884C\u8F93\u51FA\u9009\u9879\u6807\u8BB0\uFF0C\u683C\u5F0F\uFF1A[[choices:\u9009\u98791|\u9009\u98792|\u9009\u98793]]\uFF08\u6700\u591A 4 \u4E2A\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 10 \u5B57\uFF0C\u5982 [[choices:\u6E05\u7406 30 \u5929\u524D\u5907\u4EFD|\u5168\u90E8\u6E05\u7406|\u6682\u4E0D\u6E05\u7406]]\uFF09\u2014\u2014\u7528\u6237\u4F1A\u770B\u5230\u53EF\u70B9\u51FB\u6309\u94AE\u76F4\u63A5\u56DE\u590D\uFF1B\u65E0\u9700\u786E\u8BA4\u65F6\u4E0D\u8981\u8F93\u51FA\u8BE5\u6807\u8BB0`});function Fx(n,e=Hx){return n>0&&n%e===0}function Zh(n){return!n||!n.trim()?"":`\u3010\u7FA4\u5171\u8BC6\u8BB0\u5FC6\u3011\u8FD9\u662F\u7FA4\u91CC\u6B64\u524D\u8BA8\u8BBA\u7684\u7ED3\u8BBA\u2014\u2014\u4F18\u5148\u9075\u5B88\uFF1A
268
+ ${n.trim().slice(0,Jh)}`}async function Xh(n,e){try{let t=n.orm,[r]=await t.query.insert("group_memories").values({department_id:e,msg_count:1}).onConflict("department_id",!0,{msg_count:Q.mergeInc(1)}).returning("msg_count").run(),s=Number(r?.msg_count??0);if(!Fx(s))return;let o=await t.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("a.name as sender_name","m.content").where({"m.department_id":e,"m.ai_approved":{ne:!1}}).orderBy("m.created_at","desc").limit(30).run();if(o.length===0)return;let i=o.reverse().map(d=>`[${String(d.sender_name??"\u672A\u77E5")}] ${String(d.content??"").slice(0,200)}`).join(`
269
+ `).slice(0,6e3),a;try{let[d]=await t.query.from("agents").select("light_model").where({app_id:String(n.appId),light_model:{ne:null}}).limit(1).run();a=d?.light_model?String(d.light_model):void 0}catch{}let u=await n.ai.chat({model:a,messages:[{role:"system",content:Vx},{role:"user",content:i}],max_tokens:200}),c=String(u?.choices?.[0]?.message?.content??"").trim();c&&c.length>10&&await t.query.insert("group_memories").values({department_id:e,summary:c.slice(0,Jh),updated_at:Q.now()}).onConflict("department_id",!0).run()}catch{}}var Hx,Jh,Vx,Yh=I(()=>{"use strict";re();Hx=20,Jh=500;Vx=`\u4ECE\u7FA4\u804A\u6D88\u606F\u4E2D\u63D0\u53D6\u7FA4\u5171\u8BC6\uFF0C\u683C\u5F0F\uFF1A
270
270
  \u3010\u5DF2\u51B3\u5B9A\u3011\u7FA4\u91CC\u6572\u5B9A\u7684\u4E8B\u9879
271
271
  \u3010\u8FDB\u884C\u4E2D\u3011\u6B63\u5728\u505A\u7684\u4E8B
272
272
  \u3010\u5F85\u529E\u3011\u7B54\u5E94\u8981\u505A\u8FD8\u6CA1\u505A\u7684
273
273
  \u3010\u80CC\u666F\u3011\u53CD\u590D\u51FA\u73B0\u7684\u80CC\u666F\u4FE1\u606F
274
- \u6CA1\u6709\u7684\u6BB5\u843D\u7701\u7565\u3002\u53EA\u8F93\u51FA\u6458\u8981\u672C\u8EAB\uFF0C\u6700\u591A 150 \u5B57\u3002`});function Xh(n){let e=new Set,t=String(n??"").replace(/\s+/g,"").toLowerCase();for(let r=0;r<t.length;r++)e.add(`1:${t[r]}`),r<t.length-1&&e.add(`2:${t.slice(r,r+2)}`);return e}function Gx(n,e){let t=Xh(n),r=Xh(e);if(t.size===0&&r.size===0)return 1;let s=0;for(let o of t)r.has(o)&&s++;let i=t.size+r.size-s;return i===0?0:s/i}function Yh(n){let e=String(n??"");return!!(e.trim().length<10||Xx.test(e))}function qc(n){return Yx.test(String(n??""))}function Dc(n){let e=String(n??"");return Qx.test(e)||Jx.test(e)||e.includes("@")||Zx.test(e)?!1:e.length>=4}function ew(n,e){let t=null,r=0;for(let s of e){let i=Gx(n,s.question);i>r&&(r=i,t=s)}return t&&r>=.7?t:null}function jc(n,e){return`${n}
274
+ \u6CA1\u6709\u7684\u6BB5\u843D\u7701\u7565\u3002\u53EA\u8F93\u51FA\u6458\u8981\u672C\u8EAB\uFF0C\u6700\u591A 150 \u5B57\u3002`});function ew(n){let e=new Set,t=String(n??"").replace(/\s+/g,"").toLowerCase();for(let r=0;r<t.length;r++)e.add(`1:${t[r]}`),r<t.length-1&&e.add(`2:${t.slice(r,r+2)}`);return e}function zx(n,e){let t=ew(n),r=ew(e);if(t.size===0&&r.size===0)return 1;let s=0;for(let i of t)r.has(i)&&s++;let o=t.size+r.size-s;return o===0?0:s/o}function tw(n){let e=String(n??"");return!!(e.trim().length<10||Jx.test(e))}function Lc(n){return Zx.test(String(n??""))}function Wc(n){let e=String(n??"");return Kx.test(e)||Gx.test(e)||e.includes("@")||Qx.test(e)?!1:e.length>=4}function nw(n,e){let t=null,r=0;for(let s of e){let o=zx(n,s.question);o>r&&(r=o,t=s)}return t&&r>=.7?t:null}function Uc(n,e){return`${n}
275
275
 
276
- \uFF08\u6765\u81EA\u76F8\u4F3C\u95EE\u9898\u7684\u5FEB\u901F\u56DE\u590D\u2014\u2014\u6B64\u524D\u5DF2\u56DE\u590D ${e} \u6B21\uFF1B\u5982\u9700\u6700\u65B0\u4FE1\u606F\u8BF7\u91CD\u65B0\u63D0\u95EE\uFF09`}var Qx,Jx,Zx,Xx,Yx,tw=N(()=>{"use strict";Qx=/我的[^,。!?\s]{0,8}(订单|余额|账户|信息|数据|文件|密码|记录|资料|位置|状态|名字|号码|聊天|对话)/,Jx=/(今天|明天|昨天|现在|几号|几点|天气|新闻|最新|当前|最新消息)/,Zx=/[\w\u4e00-\u9fa5-]+\.(csv|xlsx?|json|txt|md|pptx?|docx?|pdf|png|jpg)\b|(多少条|几行|几列|多少行|数量是多少|有几天)/,Xx=/(抱歉|未能|无法|失败|报错|Error|错误|不可用|不能|超时|拒绝|被拒)/i;Yx=/\/ws\/[^\s"'()<>,。]+?\.(?:png|jpe?g|webp|gif|pdf|docx?|xlsx?|csv|txt|md)\b/i});var Hs={};ie(Hs,{PLANS:()=>Dr,getAppPlan:()=>nw,planBlockReason:()=>e0,planStatusOf:()=>rw});async function nw(n,e){let r=(await n.query.from("_weifuwu_apps").select("plan","trial_ends_at","monthly_token_limit").where({id:{eq:e}}).limit(1).run())[0];return r?{plan:r.plan==="pro"?"pro":"free",trial_ends_at:r.trial_ends_at,monthly_token_limit:Number(r.monthly_token_limit??(r.plan==="pro"?Dr.pro.monthlyTokenLimit:Dr.free.monthlyTokenLimit))}:{plan:"free",trial_ends_at:null,monthly_token_limit:Dr.free.monthlyTokenLimit}}function rw(n,e){let t=n.trial_ends_at,r=n.plan==="free"&&!!t&&new Date(t).getTime()<Date.now();return{plan:n.plan,label:n.plan==="pro"?Dr.pro.label:Dr.free.label,trialEndsAt:t,trialExpired:r,monthlyTokenLimit:n.monthly_token_limit,usedThisMonth:e}}async function e0(n,e){let t=await nw(n,e);if(rw(t).trialExpired)return"\u26A0\uFE0F \u514D\u8D39\u7248\u8BD5\u7528\u5DF2\u5230\u671F\uFF0CAI \u56DE\u590D\u5DF2\u6682\u505C\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u5F00\u901A Pro \u7EE7\u7EED\u4F7F\u7528\u3002";if(t.monthly_token_limit>0){let[s]=await n.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:e},created_at:{gte:G.monthStart()}}).run();if(Number(s?.used??0)>=t.monthly_token_limit)return`\u26A0\uFE0F \u672C\u6708 token \u914D\u989D\uFF08${t.monthly_token_limit.toLocaleString()}\uFF09\u5DF2\u7528\u5C3D\uFF0CAI \u56DE\u590D\u5DF2\u6682\u505C\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u6216\u4E0B\u6708\u6062\u590D\u3002`}return null}var Dr,Fs=N(()=>{"use strict";re();Dr={free:{trialDays:14,monthlyTokenLimit:5e4,label:"\u514D\u8D39\u7248"},pro:{monthlyTokenLimit:1e6,label:"Pro"}}});var iw={};ie(iw,{ROUTE_THRESHOLD:()=>t0,abilityTextOf:()=>sw,cosine:()=>ow,routeIntent:()=>n0});function sw(n){return[n.name,n.role_label??"",n.expertise??""].filter(Boolean).join(" ")}function ow(n,e){let t=0,r=0,s=0,i=Math.min(n.length,e.length);for(let o=0;o<i;o++)t+=n[o]*e[o],r+=n[o]*n[o],s+=e[o]*e[o];return r===0||s===0?0:t/(Math.sqrt(r)*Math.sqrt(s))}async function n0(n,e,t,r){if(r.length===0)return{kind:"fallback"};try{let s=await n.ai.embed(String(t).slice(0,500)),i=[];for(let a of r){let l=await n.ai.embed(sw(a).slice(0,300));i.push({agent:a,similarity:ow(s,l)})}i.sort((a,l)=>l.similarity-a.similarity);let o=i[0];return o&&o.similarity>=.55?{kind:"routed",agent:o.agent,similarity:o.similarity}:{kind:"fallback",similarity:o?.similarity}}catch{return{kind:"fallback"}}}var t0,aw=N(()=>{"use strict";t0=.55});var Lc={};ie(Lc,{buildVerifyMark:()=>i0,extractArtifactPaths:()=>s0,verifyArtifacts:()=>o0});function s0(n){let e=new Set,t=String(n??"");for(let r of t.matchAll(r0)){let s=String(r[1]).trim();s.startsWith("/ws/")&&(s=s.slice(4)),!(s.length>200||s.includes("node_modules"))&&e.add(s)}return[...e].slice(0,5)}async function o0(n,e,t,r){let s=[],i=[],o=[];if(t.length===0)return{verified:s,missing:i,stale:o};try{let{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ie(),qe)),[l]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),u=await a(e,l?.workspace_path,!0);if(!u)return{verified:s,missing:i,stale:o};let{access:c,stat:d}=await import("node:fs/promises"),{join:p,resolve:m}=await import("node:path"),h=m(u);for(let f of t){let g=m(p(u,f));if(!(g!==h&&!g.startsWith(h+"/")))try{let w=await d(g);r&&w.mtimeMs<r?o.push(f):s.push(f)}catch{i.push(f)}}}catch{}return{verified:s,missing:i,stale:o}}function i0(n,e,t=[]){let r=[];return n.length>0&&r.push(`\u2705 \u4EA7\u7269\u5DF2\u9A8C\u8BC1\uFF1A${n.join("\u3001")}`),t.length>0&&r.push(`\u26A0\uFE0F \u58F0\u79F0\u7684\u4EA7\u7269\u662F\u65E7\u6587\u4EF6\uFF08\u672C\u8F6E\u672A\u66F4\u65B0\uFF09\uFF1A${t.join("\u3001")}\u2014\u2014\u8BF7\u786E\u8BA4\u662F\u5426\u5B9E\u9645\u91CD\u65B0\u751F\u6210`),e.length>0&&r.push(`\u26A0\uFE0F \u58F0\u79F0\u7684\u4EA7\u7269\u672A\u627E\u5230\uFF1A${e.join("\u3001")}\u2014\u2014\u8BF7\u786E\u8BA4\u662F\u5426\u5B9E\u9645\u751F\u6210`),r.length>0?`
276
+ \uFF08\u6765\u81EA\u76F8\u4F3C\u95EE\u9898\u7684\u5FEB\u901F\u56DE\u590D\u2014\u2014\u6B64\u524D\u5DF2\u56DE\u590D ${e} \u6B21\uFF1B\u5982\u9700\u6700\u65B0\u4FE1\u606F\u8BF7\u91CD\u65B0\u63D0\u95EE\uFF09`}var Kx,Gx,Qx,Jx,Zx,rw=I(()=>{"use strict";Kx=/我的[^,。!?\s]{0,8}(订单|余额|账户|信息|数据|文件|密码|记录|资料|位置|状态|名字|号码|聊天|对话)/,Gx=/(今天|明天|昨天|现在|几号|几点|天气|新闻|最新|当前|最新消息)/,Qx=/[\w\u4e00-\u9fa5-]+\.(csv|xlsx?|json|txt|md|pptx?|docx?|pdf|png|jpg)\b|(多少条|几行|几列|多少行|数量是多少|有几天)/,Jx=/(抱歉|未能|无法|失败|报错|Error|错误|不可用|不能|超时|拒绝|被拒)/i;Zx=/\/ws\/[^\s"'()<>,。]+?\.(?:png|jpe?g|webp|gif|pdf|docx?|xlsx?|csv|txt|md)\b/i});var zs={};ie(zs,{PLANS:()=>jr,getAppPlan:()=>sw,planBlockReason:()=>Xx,planStatusOf:()=>ow});async function sw(n,e){let r=(await n.query.from("_weifuwu_apps").select("plan","trial_ends_at","monthly_token_limit").where({id:{eq:e}}).limit(1).run())[0];return r?{plan:r.plan==="pro"?"pro":"free",trial_ends_at:r.trial_ends_at,monthly_token_limit:Number(r.monthly_token_limit??(r.plan==="pro"?jr.pro.monthlyTokenLimit:jr.free.monthlyTokenLimit))}:{plan:"free",trial_ends_at:null,monthly_token_limit:jr.free.monthlyTokenLimit}}function ow(n,e){let t=n.trial_ends_at,r=n.plan==="free"&&!!t&&new Date(t).getTime()<Date.now();return{plan:n.plan,label:n.plan==="pro"?jr.pro.label:jr.free.label,trialEndsAt:t,trialExpired:r,monthlyTokenLimit:n.monthly_token_limit,usedThisMonth:e}}async function Xx(n,e){let t=await sw(n,e);if(ow(t).trialExpired)return"\u26A0\uFE0F \u514D\u8D39\u7248\u8BD5\u7528\u5DF2\u5230\u671F\uFF0CAI \u56DE\u590D\u5DF2\u6682\u505C\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u5F00\u901A Pro \u7EE7\u7EED\u4F7F\u7528\u3002";if(t.monthly_token_limit>0){let[s]=await n.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:e},created_at:{gte:Q.monthStart()}}).run();if(Number(s?.used??0)>=t.monthly_token_limit)return`\u26A0\uFE0F \u672C\u6708 token \u914D\u989D\uFF08${t.monthly_token_limit.toLocaleString()}\uFF09\u5DF2\u7528\u5C3D\uFF0CAI \u56DE\u590D\u5DF2\u6682\u505C\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u6216\u4E0B\u6708\u6062\u590D\u3002`}return null}var jr,Ks=I(()=>{"use strict";re();jr={free:{trialDays:14,monthlyTokenLimit:5e4,label:"\u514D\u8D39\u7248"},pro:{monthlyTokenLimit:1e6,label:"Pro"}}});var lw={};ie(lw,{ROUTE_THRESHOLD:()=>Yx,abilityTextOf:()=>iw,cosine:()=>aw,routeIntent:()=>e0});function iw(n){return[n.name,n.role_label??"",n.expertise??""].filter(Boolean).join(" ")}function aw(n,e){let t=0,r=0,s=0,o=Math.min(n.length,e.length);for(let i=0;i<o;i++)t+=n[i]*e[i],r+=n[i]*n[i],s+=e[i]*e[i];return r===0||s===0?0:t/(Math.sqrt(r)*Math.sqrt(s))}async function e0(n,e,t,r){if(r.length===0)return{kind:"fallback"};try{let s=await n.ai.embed(String(t).slice(0,500)),o=[];for(let a of r){let l=await n.ai.embed(iw(a).slice(0,300));o.push({agent:a,similarity:aw(s,l)})}o.sort((a,l)=>l.similarity-a.similarity);let i=o[0];return i&&i.similarity>=.55?{kind:"routed",agent:i.agent,similarity:i.similarity}:{kind:"fallback",similarity:i?.similarity}}catch{return{kind:"fallback"}}}var Yx,uw=I(()=>{"use strict";Yx=.55});var Bc={};ie(Bc,{buildVerifyMark:()=>s0,extractArtifactPaths:()=>n0,verifyArtifacts:()=>r0});function n0(n){let e=new Set,t=String(n??"");for(let r of t.matchAll(t0)){let s=String(r[1]).trim();s.startsWith("/ws/")&&(s=s.slice(4)),!(s.length>200||s.includes("node_modules"))&&e.add(s)}return[...e].slice(0,5)}async function r0(n,e,t,r){let s=[],o=[],i=[];if(t.length===0)return{verified:s,missing:o,stale:i};try{let{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ne(),De)),[l]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),u=await a(e,l?.workspace_path,!0);if(!u)return{verified:s,missing:o,stale:i};let{access:c,stat:d}=await import("node:fs/promises"),{join:p,resolve:f}=await import("node:path"),w=f(u);for(let m of t){let g=f(p(u,m));if(!(g!==w&&!g.startsWith(w+"/")))try{let h=await d(g);r&&h.mtimeMs<r?i.push(m):s.push(m)}catch{o.push(m)}}}catch{}return{verified:s,missing:o,stale:i}}function s0(n,e,t=[]){let r=[];return n.length>0&&r.push(`\u2705 \u4EA7\u7269\u5DF2\u9A8C\u8BC1\uFF1A${n.join("\u3001")}`),t.length>0&&r.push(`\u26A0\uFE0F \u58F0\u79F0\u7684\u4EA7\u7269\u662F\u65E7\u6587\u4EF6\uFF08\u672C\u8F6E\u672A\u66F4\u65B0\uFF09\uFF1A${t.join("\u3001")}\u2014\u2014\u8BF7\u786E\u8BA4\u662F\u5426\u5B9E\u9645\u91CD\u65B0\u751F\u6210`),e.length>0&&r.push(`\u26A0\uFE0F \u58F0\u79F0\u7684\u4EA7\u7269\u672A\u627E\u5230\uFF1A${e.join("\u3001")}\u2014\u2014\u8BF7\u786E\u8BA4\u662F\u5426\u5B9E\u9645\u751F\u6210`),r.length>0?`
277
277
 
278
278
  ---
279
279
  ${r.join(`
280
- `)}`:""}var r0,Wc=N(()=>{"use strict";r0=/(?:\/ws\/)?([\w\u4e00-\u9fa5][\w\u4e00-\u9fa5./()()_-]*?\.(?:md|txt|xlsx|xls|csv|json|py|ts|js|tsx|jsx|html|htm|pdf|docx|pptx|log|xml|yaml|yml|sql|sh|png|jpg|jpeg|svg|zip))(?:[\s"'`,,。;;::))\]}]|$)/g});var lw={};ie(lw,{maybeAlertQuota:()=>a0});async function a0(n,e){try{let t=n.orm,[r]=await t.query.from("_weifuwu_apps").select("monthly_token_limit","last_quota_alert_at").where({id:{eq:e}}).limit(1).run(),s=Number(r?.monthly_token_limit??0);if(s<=0)return;let i=r?.last_quota_alert_at?new Date(String(r.last_quota_alert_at)):null;if(i&&Date.now()-i.getTime()<24*3600*1e3)return;let[o]=await t.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:e},created_at:{gte:G.monthStart()}}).run(),a=Number(o?.used??0);if(a<s*.8)return;let l=await t.query.from("_weifuwu_app_members m").join("_weifuwu_users u",{"u.id":{col:"m.user_id"}}).select("u.email").where({"m.app_id":{eq:e},"m.role":{eq:"owner"}}).run();for(let u of l)u.email&&await n.email?.send?.({to:u.email,subject:`[Agent Platform] \u672C\u6708\u914D\u989D\u5DF2\u7528 ${Math.round(a/s*100)}%`,text:`\u672C\u6708 token \u7528\u91CF ${a.toLocaleString()} / ${s.toLocaleString()}\uFF08${Math.round(a/s*100)}%\uFF09\u3002\u8D85\u8FC7 100% \u540E AI \u56DE\u590D\u5C06\u6682\u505C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u3002`,html:`<p>\u672C\u6708 token \u7528\u91CF <b>${a.toLocaleString()} / ${s.toLocaleString()}</b>\uFF08${Math.round(a/s*100)}%\uFF09\u3002</p><p>\u8D85\u8FC7 100% \u540E AI \u56DE\u590D\u5C06\u6682\u505C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u3002</p>`});await t.query.update("_weifuwu_apps").set({last_quota_alert_at:G.now()}).where({id:{eq:e}}).run()}catch{}}var uw=N(()=>{"use strict";re()});var Bi={};ie(Bi,{ALLOWED_EXTENSIONS:()=>Uc,MAX_UPLOAD_BYTES:()=>l0,buildAttachmentLayer:()=>c0,validateUploadFile:()=>u0});function u0(n){if(!n?.name||!n.data)throw new Error("\u9644\u4EF6\u7F3A\u5C11 name \u6216 data");let e=String(n.name).split(/[\\/]/).pop()??"",t=e.replace(/[\u0000-\u001f\u007f]/g,"").trim();if(!t)throw new Error("\u6587\u4EF6\u540D\u65E0\u6548");let r=t.lastIndexOf(".");if(r<=0)throw new Error(`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B\uFF1A${t}\uFF08\u9700\u5E26\u6269\u5C55\u540D\uFF09`);let s=t.slice(r+1).toLowerCase();if(!Uc.includes(s))throw new Error(`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B .${s}\u2014\u2014\u5141\u8BB8\uFF1A${Uc.join("/")}`);if(Number(n.size??0)>20971520)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08\u4E0A\u9650 ${Math.round(20971520/1024/1024)}MB\uFF09`);let o;try{o=Buffer.from(n.data,"base64")}catch{throw new Error("\u9644\u4EF6\u5185\u5BB9\u4E0D\u662F\u6709\u6548\u7684 base64")}if(o.length>20971520)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08\u5B9E\u9645 ${Math.round(o.length/1024/1024)}MB\uFF0C\u4E0A\u9650 ${Math.round(20971520/1024/1024)}MB\uFF09`);if(o.length===0)throw new Error("\u9644\u4EF6\u5185\u5BB9\u4E3A\u7A7A");return{safeName:t,originalName:e,ext:s,buffer:o,size:o.length}}function c0(n){if(n.length===0)return"";let e=r=>{let s=r.split(".").pop()?.toLowerCase()??"";return["csv","txt","md","json","log"].includes(s)?"\u6587\u672C\u2014\u2014\u7528 read \u5DE5\u5177\u8BFB\u53D6":["xlsx","xls"].includes(s)?"Excel\u2014\u2014\u7528 bash+python\uFF08pandas/openpyxl\uFF09\u8BFB\u53D6":s==="pdf"?"PDF\u2014\u2014\u7528 bash+python\uFF08pypdf\uFF09\u8BFB\u53D6":["docx","pptx"].includes(s)?"Office \u6587\u6863\u2014\u2014\u7528 bash+python\uFF08python-docx/python-pptx\uFF09\u8BFB\u53D6":["png","jpg","jpeg","gif"].includes(s)?"\u56FE\u7247\u2014\u2014\u65E0\u89C6\u89C9\u6A21\u578B\uFF0C\u8BF7\u8BF4\u660E\u56FE\u7247\u5185\u5BB9\u6216\u8DF3\u8FC7":"\u6587\u4EF6\u2014\u2014\u5148 list_files \u786E\u8BA4\u540E\u9009\u62E9\u8BFB\u53D6\u65B9\u5F0F"};return`\u3010\u7528\u6237\u9644\u4EF6\u3011
280
+ `)}`:""}var t0,Hc=I(()=>{"use strict";t0=/(?:\/ws\/)?([\w\u4e00-\u9fa5][\w\u4e00-\u9fa5./()()_-]*?\.(?:md|txt|xlsx|xls|csv|json|py|ts|js|tsx|jsx|html|htm|pdf|docx|pptx|log|xml|yaml|yml|sql|sh|png|jpg|jpeg|svg|zip))(?:[\s"'`,,。;;::))\]}]|$)/g});var cw={};ie(cw,{maybeAlertQuota:()=>o0});async function o0(n,e){try{let t=n.orm,[r]=await t.query.from("_weifuwu_apps").select("monthly_token_limit","last_quota_alert_at").where({id:{eq:e}}).limit(1).run(),s=Number(r?.monthly_token_limit??0);if(s<=0)return;let o=r?.last_quota_alert_at?new Date(String(r.last_quota_alert_at)):null;if(o&&Date.now()-o.getTime()<24*3600*1e3)return;let[i]=await t.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:e},created_at:{gte:Q.monthStart()}}).run(),a=Number(i?.used??0);if(a<s*.8)return;let l=await t.query.from("_weifuwu_app_members m").join("_weifuwu_users u",{"u.id":{col:"m.user_id"}}).select("u.email").where({"m.app_id":{eq:e},"m.role":{eq:"owner"}}).run();for(let u of l)u.email&&await n.email?.send?.({to:u.email,subject:`[Agent Platform] \u672C\u6708\u914D\u989D\u5DF2\u7528 ${Math.round(a/s*100)}%`,text:`\u672C\u6708 token \u7528\u91CF ${a.toLocaleString()} / ${s.toLocaleString()}\uFF08${Math.round(a/s*100)}%\uFF09\u3002\u8D85\u8FC7 100% \u540E AI \u56DE\u590D\u5C06\u6682\u505C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u3002`,html:`<p>\u672C\u6708 token \u7528\u91CF <b>${a.toLocaleString()} / ${s.toLocaleString()}</b>\uFF08${Math.round(a/s*100)}%\uFF09\u3002</p><p>\u8D85\u8FC7 100% \u540E AI \u56DE\u590D\u5C06\u6682\u505C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u8C03\u6574\u914D\u989D\u3002</p>`});await t.query.update("_weifuwu_apps").set({last_quota_alert_at:Q.now()}).where({id:{eq:e}}).run()}catch{}}var dw=I(()=>{"use strict";re()});var Fi={};ie(Fi,{ALLOWED_EXTENSIONS:()=>Fc,MAX_UPLOAD_BYTES:()=>i0,buildAttachmentLayer:()=>l0,validateUploadFile:()=>a0});function a0(n){if(!n?.name||!n.data)throw new Error("\u9644\u4EF6\u7F3A\u5C11 name \u6216 data");let e=String(n.name).split(/[\\/]/).pop()??"",t=e.replace(/[\u0000-\u001f\u007f]/g,"").trim();if(!t)throw new Error("\u6587\u4EF6\u540D\u65E0\u6548");let r=t.lastIndexOf(".");if(r<=0)throw new Error(`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B\uFF1A${t}\uFF08\u9700\u5E26\u6269\u5C55\u540D\uFF09`);let s=t.slice(r+1).toLowerCase();if(!Fc.includes(s))throw new Error(`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B .${s}\u2014\u2014\u5141\u8BB8\uFF1A${Fc.join("/")}`);if(Number(n.size??0)>20971520)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08\u4E0A\u9650 ${Math.round(20971520/1024/1024)}MB\uFF09`);let i;try{i=Buffer.from(n.data,"base64")}catch{throw new Error("\u9644\u4EF6\u5185\u5BB9\u4E0D\u662F\u6709\u6548\u7684 base64")}if(i.length>20971520)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08\u5B9E\u9645 ${Math.round(i.length/1024/1024)}MB\uFF0C\u4E0A\u9650 ${Math.round(20971520/1024/1024)}MB\uFF09`);if(i.length===0)throw new Error("\u9644\u4EF6\u5185\u5BB9\u4E3A\u7A7A");return{safeName:t,originalName:e,ext:s,buffer:i,size:i.length}}function l0(n){if(n.length===0)return"";let e=r=>{let s=r.split(".").pop()?.toLowerCase()??"";return["csv","txt","md","json","log"].includes(s)?"\u6587\u672C\u2014\u2014\u7528 read \u5DE5\u5177\u8BFB\u53D6":["xlsx","xls"].includes(s)?"Excel\u2014\u2014\u7528 bash+python\uFF08pandas/openpyxl\uFF09\u8BFB\u53D6":s==="pdf"?"PDF\u2014\u2014\u7528 bash+python\uFF08pypdf\uFF09\u8BFB\u53D6":["docx","pptx"].includes(s)?"Office \u6587\u6863\u2014\u2014\u7528 bash+python\uFF08python-docx/python-pptx\uFF09\u8BFB\u53D6":["png","jpg","jpeg","gif"].includes(s)?"\u56FE\u7247\u2014\u2014\u65E0\u89C6\u89C9\u6A21\u578B\uFF0C\u8BF7\u8BF4\u660E\u56FE\u7247\u5185\u5BB9\u6216\u8DF3\u8FC7":"\u6587\u4EF6\u2014\u2014\u5148 list_files \u786E\u8BA4\u540E\u9009\u62E9\u8BFB\u53D6\u65B9\u5F0F"};return`\u3010\u7528\u6237\u9644\u4EF6\u3011
281
281
  ${n.map(r=>{let s=r.size>=1024?`${Math.round(r.size/1024)}KB`:`${r.size}B`;return`- ${r.name}\uFF08${s}\uFF09\u2014\u2014${r.path}\uFF5C${e(r.name)}`}).join(`
282
282
  `)}
283
- \u5904\u7406\u6B65\u9AA4\uFF1A1) \u5148 list_files \u786E\u8BA4\u6587\u4EF6\u5B58\u5728\uFF1B2) \u6309\u7C7B\u578B\u8BFB\u53D6\uFF1B3) \u76F4\u63A5\u57FA\u4E8E\u5185\u5BB9\u56DE\u7B54\uFF0C\u4E0D\u8981\u731C\u6D4B\u6587\u4EF6\u5185\u5BB9\u3002`}var Uc,l0,Hi=N(()=>{"use strict";Uc=["csv","xlsx","xls","pdf","docx","pptx","txt","md","json","log","png","jpg","jpeg","gif"],l0=20971520});var jr={};ie(jr,{createSseEmitter:()=>m0,createWsEmitter:()=>p0,handleNewMessage:()=>f0,handleNewMessageStream:()=>Fi,handleNewMessageStreamSSE:()=>Bc,parseQuickReplies:()=>dw});function dw(n){let e=[...n.matchAll(/\[\[choices:([^\]]*)\]\]/g)];if(e.length===0)return{content:n,quickReplies:[]};let r=e[e.length-1][1].split("|").map(i=>i.trim()).filter(Boolean).slice(0,4).map(i=>i.length>20?i.slice(0,20):i);return{content:n.replace(/\s*\[\[choices:[^\]]*\]\]/g,"").trimEnd(),quickReplies:r}}function d0(n){let e=cw.get(n);return!e||Date.now()-e.at>10*6e4?(cw.set(n,{count:0,at:Date.now()}),!0):e.count>=1?!1:(e.count++,!0)}function p0(n,e){return{emit(t){n.broadcast(String(e),t)}}}function m0(n){return{emit(e){n(`event: ${e.type}
283
+ \u5904\u7406\u6B65\u9AA4\uFF1A1) \u5148 list_files \u786E\u8BA4\u6587\u4EF6\u5B58\u5728\uFF1B2) \u6309\u7C7B\u578B\u8BFB\u53D6\uFF1B3) \u76F4\u63A5\u57FA\u4E8E\u5185\u5BB9\u56DE\u7B54\uFF0C\u4E0D\u8981\u731C\u6D4B\u6587\u4EF6\u5185\u5BB9\u3002`}var Fc,i0,Vi=I(()=>{"use strict";Fc=["csv","xlsx","xls","pdf","docx","pptx","txt","md","json","log","png","jpg","jpeg","gif"],i0=20971520});var Lr={};ie(Lr,{createSseEmitter:()=>d0,createWsEmitter:()=>c0,handleNewMessage:()=>p0,handleNewMessageStream:()=>zi,handleNewMessageStreamSSE:()=>Vc,parseQuickReplies:()=>mw});function mw(n){let e=[...n.matchAll(/\[\[choices:([^\]]*)\]\]/g)];if(e.length===0)return{content:n,quickReplies:[]};let r=e[e.length-1][1].split("|").map(o=>o.trim()).filter(Boolean).slice(0,4).map(o=>o.length>20?o.slice(0,20):o);return{content:n.replace(/\s*\[\[choices:[^\]]*\]\]/g,"").trimEnd(),quickReplies:r}}function u0(n){let e=pw.get(n);return!e||Date.now()-e.at>10*6e4?(pw.set(n,{count:0,at:Date.now()}),!0):e.count>=1?!1:(e.count++,!0)}function c0(n,e){return{emit(t){n.broadcast(String(e),t)}}}function d0(n){return{emit(e){n(`event: ${e.type}
284
284
  `),n(`data: ${JSON.stringify(e)}
285
285
 
286
- `)}}}async function pw(n,e){return await n.orm.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name").where(F({"dm.department_id":{eq:e}},{"a.type":{eq:"knowledge_base"}},{"a.is_active":{eq:!0}})).run()}async function mw(n,e,t,r){try{let{sql:s}=n,{planBlockReason:i}=await Promise.resolve().then(()=>(Fs(),Hs)),o=await i(n.orm,n.appId);if(o)return o;let a=await n.ai.embed(t),u=(await n.orm.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.content","kd.filename").vectorScore("kc.embedding",a,"similarity").where({"kc.agent_id":{eq:String(e.id)}}).limit(3).run()).filter(c=>Number(c.similarity)>.1);if(u.length===0)return null;try{await Z(n.orm).agent_logs.insert({agent_id:String(e.id),app_id:String(n.appId),department_id:r,messages_count:1,steps_count:0,tokens_prompt:0,tokens_completion:0,tokens_total:0,elapsed_ms:50,success:!0}).run()}catch{}return`\u{1F4DA} \u77E5\u8BC6\u5E93\u68C0\u7D22\u7ED3\u679C\uFF08${e.name}\uFF09\uFF1A
286
+ `)}}}async function fw(n,e){return await n.orm.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name").where(V({"dm.department_id":{eq:e}},{"a.type":{eq:"knowledge_base"}},{"a.is_active":{eq:!0}})).run()}async function gw(n,e,t,r){try{let{sql:s}=n,{planBlockReason:o}=await Promise.resolve().then(()=>(Ks(),zs)),i=await o(n.orm,n.appId);if(i)return i;let a=await n.ai.embed(t),u=(await n.orm.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.content","kd.filename").vectorScore("kc.embedding",a,"similarity").where({"kc.agent_id":{eq:String(e.id)}}).limit(3).run()).filter(c=>Number(c.similarity)>.1);if(u.length===0)return null;try{await Z(n.orm).agent_logs.insert({agent_id:String(e.id),app_id:String(n.appId),department_id:r,messages_count:1,steps_count:0,tokens_prompt:0,tokens_completion:0,tokens_total:0,elapsed_ms:50,success:!0}).run()}catch{}return`\u{1F4DA} \u77E5\u8BC6\u5E93\u68C0\u7D22\u7ED3\u679C\uFF08${e.name}\uFF09\uFF1A
287
287
 
288
288
  `+u.map(c=>`\u3010${c.filename}\u3011${String(c.content).slice(0,400)}`).join(`
289
289
 
290
- `)}catch{return null}}async function fw(n,e,t,r){let s=Z(n.orm);try{let[i]=await s.messages.insert({department_id:e,sender_id:String(t.id),content:r,msg_type:"text",ai_approved:!0}).returning("id","created_at").run();n.msg.broadcast(String(e),{type:"ai_reply",message:{id:i.id,agentId:t.id,agentName:t.name,content:r,departmentId:e,createdAt:i.created_at}})}catch{}}async function f0(n,e,t,r){let{sql:s,orm:i}=n,o=await i.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.system_prompt","a.model","a.tools","a.human_in_the_loop","a.max_tokens").where(F({"dm.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"a.is_active":{eq:!0}})).run(),a={};for(let f of r.matchAll(/@([\u4e00-\u9fa5\w\-]+)/g))a[f[1]]=f[1];let l=o,u=null;if(Object.keys(a).length===0&&o.length>1&&process.env.INTENT_ROUTE!=="off")try{let{routeIntent:f}=await Promise.resolve().then(()=>(aw(),iw)),g=await f(n,e,r,o.map(w=>({id:String(w.id),name:String(w.name??""),role_label:w.role_label??null,expertise:w.expertise??null})));g.kind==="routed"&&g.agent&&(l=o.filter(w=>String(w.id)===String(g.agent.id)),u=String(g.agent.name))}catch{}if(Object.keys(a).length>0){let f=o.filter(g=>a[String(g.name).trim()]);if(f.length>0)l=f;else{let w=(await pw(n,e)).filter(y=>a[String(y.name).trim()]);if(w.length>0){for(let y of w){let k=await mw(n,y,r,e);k&&await fw(n,e,y,k)}return}}}if(o.length===0){try{let f=Z(n.orm),[g]=await f.messages.insert({department_id:e,sender_id:t,content:"\u8BE5\u7FA4\u7EC4\u6682\u65E0 AI \u6210\u5458\uFF0C\u6D88\u606F\u4E0D\u4F1A\u5F97\u5230\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5230\u90E8\u95E8\u8BE6\u60C5\u6DFB\u52A0 AI \u673A\u5668\u4EBA\u3002",msg_type:"system"}).returning("id","created_at").run(),w=g;n.msg.broadcast(String(e),{type:"new_message",message:{id:w.id,departmentId:e,sender_id:t,sender_name:"\u7CFB\u7EDF",sender_type:"system",content:"\u8BE5\u7FA4\u7EC4\u6682\u65E0 AI \u6210\u5458\uFF0C\u6D88\u606F\u4E0D\u4F1A\u5F97\u5230\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5230\u90E8\u95E8\u8BE6\u60C5\u6DFB\u52A0 AI \u673A\u5668\u4EBA\u3002",msg_type:"system",created_at:w.created_at}})}catch{}return}let c=process.env.DEEPSEEK_API_KEY;if(!c||c===""||c==="sk-your-deepseek-api-key"){console.warn("[chat] DEEPSEEK_API_KEY \u672A\u914D\u7F6E\uFF0C\u8DF3\u8FC7 AI \u81EA\u52A8\u56DE\u590D");return}let d=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.content","m.created_at","a.name as sender_name","a.type as sender_type","m.reply_to","r.content as reply_content","ra.name as reply_sender_name").where(F({"m.department_id":{eq:e}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(20).run(),p=[];for(let f of d.reverse())(f.sender_type==="user"||f.sender_type==="ai")&&p.push({role:f.sender_type==="ai"?"assistant":"user",content:Mc({content:f.content,senderName:String(f.sender_name??"\u672A\u77E5"),replyTo:f.reply_to?{senderName:String(f.reply_sender_name??"\u672A\u77E5"),content:String(f.reply_content??"")}:void 0})});p.push({role:"user",content:r});let h=await os(i,{department_members:He.department_members,agents:He.agents}).from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.type","a.name","dm.role","a.role_label","a.expertise").where({"dm.department_id":{eq:e}}).run();for(let f of l)try{let g=(f.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
290
+ `)}catch{return null}}async function hw(n,e,t,r){let s=Z(n.orm);try{let[o]=await s.messages.insert({department_id:e,sender_id:String(t.id),content:r,msg_type:"text",ai_approved:!0}).returning("id","created_at").run();n.msg.broadcast(String(e),{type:"ai_reply",message:{id:o.id,agentId:t.id,agentName:t.name,content:r,departmentId:e,createdAt:o.created_at}})}catch{}}async function p0(n,e,t,r){let{sql:s,orm:o}=n,i=await o.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.system_prompt","a.model","a.tools","a.human_in_the_loop","a.max_tokens").where(V({"dm.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"a.is_active":{eq:!0}})).run(),a={};for(let m of r.matchAll(/@([\u4e00-\u9fa5\w\-]+)/g))a[m[1]]=m[1];let l=i,u=null;if(Object.keys(a).length===0&&i.length>1&&process.env.INTENT_ROUTE!=="off")try{let{routeIntent:m}=await Promise.resolve().then(()=>(uw(),lw)),g=await m(n,e,r,i.map(h=>({id:String(h.id),name:String(h.name??""),role_label:h.role_label??null,expertise:h.expertise??null})));g.kind==="routed"&&g.agent&&(l=i.filter(h=>String(h.id)===String(g.agent.id)),u=String(g.agent.name))}catch{}if(Object.keys(a).length>0){let m=i.filter(g=>a[String(g.name).trim()]);if(m.length>0)l=m;else{let h=(await fw(n,e)).filter(b=>a[String(b.name).trim()]);if(h.length>0){for(let b of h){let k=await gw(n,b,r,e);k&&await hw(n,e,b,k)}return}}}if(i.length===0){try{let m=Z(n.orm),[g]=await m.messages.insert({department_id:e,sender_id:t,content:"\u8BE5\u7FA4\u7EC4\u6682\u65E0 AI \u6210\u5458\uFF0C\u6D88\u606F\u4E0D\u4F1A\u5F97\u5230\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5230\u90E8\u95E8\u8BE6\u60C5\u6DFB\u52A0 AI \u673A\u5668\u4EBA\u3002",msg_type:"system"}).returning("id","created_at").run(),h=g;n.msg.broadcast(String(e),{type:"new_message",message:{id:h.id,departmentId:e,sender_id:t,sender_name:"\u7CFB\u7EDF",sender_type:"system",content:"\u8BE5\u7FA4\u7EC4\u6682\u65E0 AI \u6210\u5458\uFF0C\u6D88\u606F\u4E0D\u4F1A\u5F97\u5230\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5230\u90E8\u95E8\u8BE6\u60C5\u6DFB\u52A0 AI \u673A\u5668\u4EBA\u3002",msg_type:"system",created_at:h.created_at}})}catch{}return}let c=process.env.DEEPSEEK_API_KEY;if(!c||c===""||c==="sk-your-deepseek-api-key"){console.warn("[chat] DEEPSEEK_API_KEY \u672A\u914D\u7F6E\uFF0C\u8DF3\u8FC7 AI \u81EA\u52A8\u56DE\u590D");return}let d=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.content","m.created_at","a.name as sender_name","a.type as sender_type","m.reply_to","r.content as reply_content","ra.name as reply_sender_name").where(V({"m.department_id":{eq:e}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(20).run(),p=[];for(let m of d.reverse())(m.sender_type==="user"||m.sender_type==="ai")&&p.push({role:m.sender_type==="ai"?"assistant":"user",content:Dc({content:m.content,senderName:String(m.sender_name??"\u672A\u77E5"),replyTo:m.reply_to?{senderName:String(m.reply_sender_name??"\u672A\u77E5"),content:String(m.reply_content??"")}:void 0})});p.push({role:"user",content:r});let w=await ls(o,{department_members:Ve.department_members,agents:Ve.agents}).from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.type","a.name","dm.role","a.role_label","a.expertise").where({"dm.department_id":{eq:e}}).run();for(let m of l)try{let g=(m.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
291
291
 
292
- `+Ui({rosterText:Bs(h,String(f.id)),selfName:String(f.name)}),w=f.tools??[],y=[];try{let A=Z(n.orm),C=await A.agent_skills.select("skill_dir","skill_name").where(F(L(A.agent_skills.c.agent_id,f.id),L(A.agent_skills.c.enabled,!0))).run();for(let j of C)try{let K=await js(j.skill_dir,()=>n);y.push(K)}catch(K){console.warn(`[chat] \u52A0\u8F7D\u6280\u80FD ${j.skill_name} \u5931\u8D25:`,K)}}catch{}let k=await Li(n,{agentId:f.id,appId:n.appId,departmentId:e,systemPrompt:g,model:f.model,tools:w,maxSteps:f.max_tokens?Math.min(f.max_tokens,20):10,humanInTheLoop:f.human_in_the_loop??!1,preloadedSkills:y,workspacePath:f.workspace_path,allowFileTools:f.allow_file_tools,allowCommandExec:f.allow_command_exec,allowNetwork:f.allow_network},p),_=k.content;if(!_)continue;let v=Date.now(),S=_;try{let{extractArtifactPaths:A,verifyArtifacts:C,buildVerifyMark:j}=await Promise.resolve().then(()=>(Wc(),Lc)),K=A(_),U=String(e);try{let H=Z(n.orm),[V]=await H.agents.select("department_id").where(L(H.agents.c.id,f.id)).run();V?.department_id&&(U=String(V.department_id))}catch{}if(K.length>0){let{verified:H,missing:V,stale:Q}=await C(i,U,K,v);(H.length>0||V.length>0||Q.length>0)&&(S=_+j(H,V,Q))}}catch{}if(f.human_in_the_loop){let A=Z(n.orm),[C]=await A.messages.insert({department_id:e,sender_id:String(f.id),content:"[AI \u751F\u6210\u4E2D...]",msg_type:"text",ai_draft:S,ai_approved:null,ai_step:{steps:k.steps}}).returning("id","content","created_at").run();n.msg.broadcast(String(e),{type:"ai_draft",message:{id:C.id,agentId:f.id,agentName:f.name,draft:S,departmentId:e,createdAt:C.created_at}});try{let j=await i.query.from("_weifuwu_app_members m").join("_weifuwu_users u",{"u.id":{col:"m.user_id"}}).select("u.email","u.name").where(F({"m.app_id":{eq:String(n.appId)}},{"m.role":{eq:"owner"}})).run();for(let K of j){if(!K.email)continue;await n.email?.send?.({to:K.email,subject:`[Agent Platform] \u5BA1\u6279\u8BF7\u6C42\uFF1A${f.name??"AI Agent"} \u9700\u8981\u60A8\u7684\u786E\u8BA4`,text:`${f.name??"AI Agent"} \u5728\u90E8\u95E8\u5BF9\u8BDD\u4E2D\u8BF7\u6C42\u5BA1\u6279\u4EE5\u4E0B\u5185\u5BB9\uFF1A
292
+ `+Hi({rosterText:Vs(w,String(m.id)),selfName:String(m.name)}),h=m.tools??[],b=[];try{let A=Z(n.orm),C=await A.agent_skills.select("skill_dir","skill_name").where(V(L(A.agent_skills.c.agent_id,m.id),L(A.agent_skills.c.enabled,!0))).run();for(let W of C)try{let G=await Us(W.skill_dir,()=>n);b.push(G)}catch(G){console.warn(`[chat] \u52A0\u8F7D\u6280\u80FD ${W.skill_name} \u5931\u8D25:`,G)}}catch{}let k=await Ui(n,{agentId:m.id,appId:n.appId,departmentId:e,systemPrompt:g,model:m.model,tools:h,maxSteps:m.max_tokens?Math.min(m.max_tokens,20):10,humanInTheLoop:m.human_in_the_loop??!1,preloadedSkills:b,workspacePath:m.workspace_path,allowFileTools:m.allow_file_tools,allowCommandExec:m.allow_command_exec,allowNetwork:m.allow_network},p),_=k.content;if(!_)continue;let v=Date.now(),S=_;try{let{extractArtifactPaths:A,verifyArtifacts:C,buildVerifyMark:W}=await Promise.resolve().then(()=>(Hc(),Bc)),G=A(_),U=String(e);try{let F=Z(n.orm),[K]=await F.agents.select("department_id").where(L(F.agents.c.id,m.id)).run();K?.department_id&&(U=String(K.department_id))}catch{}if(G.length>0){let{verified:F,missing:K,stale:M}=await C(o,U,G,v);(F.length>0||K.length>0||M.length>0)&&(S=_+W(F,K,M))}}catch{}if(m.human_in_the_loop){let A=Z(n.orm),[C]=await A.messages.insert({department_id:e,sender_id:String(m.id),content:"[AI \u751F\u6210\u4E2D...]",msg_type:"text",ai_draft:S,ai_approved:null,ai_step:{steps:k.steps}}).returning("id","content","created_at").run();n.msg.broadcast(String(e),{type:"ai_draft",message:{id:C.id,agentId:m.id,agentName:m.name,draft:S,departmentId:e,createdAt:C.created_at}});try{let W=await o.query.from("_weifuwu_app_members m").join("_weifuwu_users u",{"u.id":{col:"m.user_id"}}).select("u.email","u.name").where(V({"m.app_id":{eq:String(n.appId)}},{"m.role":{eq:"owner"}})).run();for(let G of W){if(!G.email)continue;await n.email?.send?.({to:G.email,subject:`[Agent Platform] \u5BA1\u6279\u8BF7\u6C42\uFF1A${m.name??"AI Agent"} \u9700\u8981\u60A8\u7684\u786E\u8BA4`,text:`${m.name??"AI Agent"} \u5728\u90E8\u95E8\u5BF9\u8BDD\u4E2D\u8BF7\u6C42\u5BA1\u6279\u4EE5\u4E0B\u5185\u5BB9\uFF1A
293
293
 
294
294
  ${_.slice(0,200)}${_.length>200?"\u2026":""}
295
295
 
296
- \u8BF7\u767B\u5F55\u5E73\u53F0\u5904\u7406\uFF1A${process.env.PUBLIC_BASE_URL??"https://localhost:3000"}/approvals`,html:`<p><b>${f.name??"AI Agent"}</b> \u5728\u90E8\u95E8\u5BF9\u8BDD\u4E2D\u8BF7\u6C42\u5BA1\u6279\uFF1A</p><blockquote style="border-left:3px solid #4f6ef7;padding-left:12px;color:#555">${_.slice(0,200)}${_.length>200?"\u2026":""}</blockquote><p><a href="${process.env.PUBLIC_BASE_URL??"https://localhost:3000"}/approvals">\u524D\u5F80\u5BA1\u6279 \u2192</a></p>`})}}catch{}}else{let A=Z(n.orm),[C]=await A.messages.insert({department_id:e,sender_id:String(f.id),content:_,msg_type:"text",ai_approved:!0,routed_to:u,ai_step:{steps:k.steps}}).returning("id","content","created_at").run();try{let{maybeAlertQuota:j}=await Promise.resolve().then(()=>(uw(),lw));j(n,n.appId)}catch{}n.msg.broadcast(String(e),{type:"ai_reply",message:{id:C.id,agentId:f.id,agentName:f.name,content:_,departmentId:e,createdAt:C.created_at},routedTo:u??void 0})}}catch(g){console.error(`[chat] Agent ${f.id} error:`,g)}}async function g0(n,e,t,r,s,i,o="",a,l=[],u="",c="",d="",p=""){let{sql:m,orm:h}=n,f=Z(h),g=!!s,w=Date.now(),y=0,k=new Map,_=U=>k.get(U)??null,v=(t.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
296
+ \u8BF7\u767B\u5F55\u5E73\u53F0\u5904\u7406\uFF1A${process.env.PUBLIC_BASE_URL??"https://localhost:3000"}/approvals`,html:`<p><b>${m.name??"AI Agent"}</b> \u5728\u90E8\u95E8\u5BF9\u8BDD\u4E2D\u8BF7\u6C42\u5BA1\u6279\uFF1A</p><blockquote style="border-left:3px solid #4f6ef7;padding-left:12px;color:#555">${_.slice(0,200)}${_.length>200?"\u2026":""}</blockquote><p><a href="${process.env.PUBLIC_BASE_URL??"https://localhost:3000"}/approvals">\u524D\u5F80\u5BA1\u6279 \u2192</a></p>`})}}catch{}}else{let A=Z(n.orm),[C]=await A.messages.insert({department_id:e,sender_id:String(m.id),content:_,msg_type:"text",ai_approved:!0,routed_to:u,ai_step:{steps:k.steps}}).returning("id","content","created_at").run();try{let{maybeAlertQuota:W}=await Promise.resolve().then(()=>(dw(),cw));W(n,n.appId)}catch{}n.msg.broadcast(String(e),{type:"ai_reply",message:{id:C.id,agentId:m.id,agentName:m.name,content:_,departmentId:e,createdAt:C.created_at},routedTo:u??void 0})}}catch(g){console.error(`[chat] Agent ${m.id} error:`,g)}}async function m0(n,e,t,r,s,o,i="",a,l=[],u="",c="",d="",p=""){let{sql:f,orm:w}=n,m=Z(w),g=!!s,h=Date.now(),b=0,k=new Map,_=U=>k.get(U)??null,v=(t.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
297
297
 
298
- `+Ui({rosterText:Bs(l,String(t.id)),selfName:String(t.name)})+$c+(c?`
298
+ `+Hi({rosterText:Vs(l,String(t.id)),selfName:String(t.name)})+jc+(c?`
299
299
 
300
300
  `+c:"")+(p?`
301
301
 
302
302
  `+p:"")+(u?`
303
303
 
304
- `+u:""),S=t.tools??[],A=await hw(n,String(t.id)),C=s,j=U=>{a.emit({agentId:t.id,agentName:t.name,...U})};try{if(!C){let[x]=await f.messages.insert({department_id:e,sender_id:String(t.id),content:"",msg_type:"text",ai_approved:!0}).returning("id").run();C=String(x.id)}j({type:"wf:step",messageId:C,stepType:"llm"});try{let{planBlockReason:x}=await Promise.resolve().then(()=>(Fs(),Hs)),O=await x(n.orm,n.appId);if(O){j({type:"wf:done",messageId:C,content:O});return}}catch{}try{let x=Number(t.monthly_token_quota??0);if(x>0){let[O]=await h.query.from("agent_logs").sum("tokens_total","used").where({agent_id:{eq:String(t.id)},created_at:{gte:G.monthStart()}}).run();if(Number(O?.used??0)>=x){j({type:"wf:done",messageId:C,content:`\u26A0\uFE0F \u8BE5 Agent \u672C\u6708 token \u914D\u989D\uFF08${x.toLocaleString()}\uFF09\u5DF2\u7528\u5C3D\uFF0C\u6682\u505C\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5728 Agent \u8BE6\u60C5\u8C03\u6574\u914D\u989D\u6216\u4E0B\u6708\u6062\u590D\u3002`});return}}}catch{}let U="",H=!1,V=!1,Q,P=[],E=Promise.resolve();try{Q=await Nc(n,{requestId:o,agentId:t.id,appId:n.appId,departmentId:e,runMessageId:d,systemPrompt:v,model:t.model,tools:S,maxSteps:t.max_tokens?Math.min(t.max_tokens,20):10,humanInTheLoop:!1,preloadedSkills:A,allowFileTools:t.allow_file_tools,allowCommandExec:t.allow_command_exec,allowNetwork:t.allow_network},r,{onChunk:x=>{U+=x,j({type:"wf:token",messageId:C,text:x}),E=E.then(()=>f.messages.update({content:U}).where(L(f.messages.c.id,C)).run())},onToolCall:x=>{j({type:"wf:step",messageId:C,stepType:"tool",name:x.name,args:x.args}),y++,P.push({tool:x.name,args:x.args,at:new Date().toISOString()});try{k.set(String(x.name),JSON.parse(String(x.args??"{}")))}catch{}},onToolResult:x=>{j({type:"wf:tool_result",messageId:C,name:x.name,result:x.result,ok:x.ok,error:x.error});for(let O=P.length-1;O>=0;O--)if(P[O].tool===x.name&&P[O].result===void 0){P[O].result=x.result,P[O].ok=x.ok;break}try{if((x.name==="write"||x.name==="edit")&&!String(x.result??"").startsWith("\u5199\u5165\u5931\u8D25")&&!String(x.result??"").startsWith("\u7F16\u8F91\u5931\u8D25")&&!String(x.result??"").includes("\u672A\u627E\u5230\u5339\u914D")){let O=_(String(x.name)),I=O?.path?String(O.path):"";if(I&&!I.startsWith(".."))try{n.msg?.broadcast&&f.departments.select("artifact_review").where(L(f.departments.c.id,e)).run().then($=>{let M=!!$?.[0]?.artifact_review;n.msg?.broadcast&&n.msg.broadcast(String(e),{type:"file_updated",file:I,agentId:t.id,agentName:t.name,pending:M})}).catch(()=>{n.msg?.broadcast&&n.msg.broadcast(String(e),{type:"file_updated",file:I,agentId:t.id,agentName:t.name,pending:!1})})}catch{}}}catch{}},onFinish:()=>{}})}catch(x){H=!0,console.error(`[chat] streamAgent ${t.id} error:`,x)}if(H)U||await f.messages.delete().where(F(L(f.messages.c.id,C),L(f.messages.c.content,""))).run(),j({type:"wf:error",messageId:C,code:"provider_error",message:"AI \u56DE\u590D\u5931\u8D25"});else{let x=function($){return/问卷|填写|任务|执行|处理|完成|汇总|打开|整理|分析|生成|创建|修改|提交|回复|总结|调研|统计|重试/.test($)};var K=x;if(Q){let $=globalThis.__platform_metrics;$&&($.aiCalls++,$.aiTokens+=Q.total_tokens??0);try{await f.agent_logs.insert({agent_id:String(t.id),app_id:String(n.appId),department_id:e,messages_count:r.length,steps_count:1,tokens_prompt:Q.prompt_tokens??0,tokens_completion:Q.completion_tokens??0,tokens_total:Q.total_tokens??0,elapsed_ms:0,success:!0}).run()}catch{}}try{let{extractArtifactPaths:$,verifyArtifacts:M,buildVerifyMark:W}=await Promise.resolve().then(()=>(Wc(),Lc)),q=$(U),D=String(e);try{let[B]=await f.agents.select("department_id").where(L(f.agents.c.id,t.id)).run();B?.department_id&&(D=String(B.department_id))}catch{}if(q.length>0){let{verified:B,missing:z,stale:Y}=await M(h,D,q,w);if(B.length>0||z.length>0||Y.length>0){let te=W(B,z,Y);U=U+te,j({type:"wf:verify",messageId:C,verified:B,missing:z,stale:Y}),await f.messages.update({content:U}).where(L(f.messages.c.id,C)).run().catch(()=>{})}}}catch{}if(P.length>0)try{await f.messages.update({ai_step:{steps:P}}).where(L(f.messages.c.id,C)).run()}catch{}if(y===0&&U.trim()&&!H&&x(i))try{if(d0(String(t.id))){let[$]=await f.agents.select("id").where(F(L(f.agents.c.app_id,n.appId),L(f.agents.c.type,"user"))).limit(1).run(),M=$?String($.id):"system",W=`@${t.name} \u3010\u7CFB\u7EDF\u81EA\u52A8\u91CD\u8BD5\u3011\u4F60\u4E0A\u4E00\u8F6E\u53EA\u56DE\u590D\u4E86\u8BA1\u5212\u3001\u6CA1\u6709\u5B9E\u9645\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\u6267\u884C\u3002\u8BF7\u7ACB\u5373\u5B9E\u9645\u6267\u884C\u4EFB\u52A1\uFF08\u8C03\u7528\u5DE5\u5177\u5B8C\u6210\uFF09\uFF0C\u4E0D\u8981\u53EA\u56DE\u590D\u8BA1\u5212\u3002`,{handleNewMessageStream:q}=await Promise.resolve().then(()=>(Wn(),jr));await f.messages.insert({department_id:e,sender_id:M,content:W,msg_type:"system",ai_approved:!0}).run(),console.warn(`[chat] ${t.name} \u60F0\u6027\u56DE\u590D\uFF080 \u5DE5\u5177\u8C03\u7528\uFF09\u2014\u2014\u81EA\u52A8\u91CD\u8BD5`),q(n,String(e),M,W,"").catch(()=>{})}}catch{}let O=U,I=[];try{let $=dw(U);O=$.content,I=$.quickReplies}catch{}if(I.length>0)try{await f.messages.update({content:O,quick_replies:I}).where(L(f.messages.c.id,C)).run()}catch{}j({type:"wf:done",messageId:C,content:O,usage:Q,quickReplies:I})}}catch(U){let H=U instanceof Error?U.message:String(U);console.error(`[chat] runAgentStreamForAgent ${t.id} error:`,H);try{C?j({type:"wf:error",messageId:C,code:"internal_error",message:H.slice(0,200)}):console.error(`[chat] msgId \u672A\u77E5\u2014\u2014\u65E0\u6CD5\u53D1 wf:error\uFF1A${H}`)}catch{}}}async function gw(n,e,t,r,s="",i=[],o="",a){let{sql:l}=n,u=null;try{let _=Z(n.orm),[v]=await _.departments.select("is_dm","workspace_path").where(L(_.departments.c.id,e)).run();v&&(u={is_dm:!!v.is_dm,workspace_path:v.workspace_path?String(v.workspace_path):null})}catch{}let c=process.env.DEEPSEEK_API_KEY;if(!c||c===""||c==="sk-your-deepseek-api-key"||c.startsWith("sk-your-")){console.warn("[chat] DEEPSEEK_API_KEY \u672A\u914D\u7F6E\uFF0C\u8DF3\u8FC7 AI \u81EA\u52A8\u56DE\u590D");return}let d=await n.orm.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.system_prompt","a.model","a.tools","a.human_in_the_loop","a.max_tokens","a.workspace_path","a.allow_file_tools","a.allow_command_exec","a.allow_network").where(F({"dm.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"a.is_active":{eq:!0}})).run();if(d.length===0)return;let p=d,m=new Set;for(let _ of t.matchAll(/@([\u4e00-\u9fa5\w\-]+)/g))m.add(_[1]);if(m.size>0)if(m.has("all")||m.has("\u6240\u6709\u4EBA")||m.has("everyone")||m.has("\u5168\u5458"))p=d;else{let _=d.filter(v=>m.has(String(v.name).trim()));if(_.length>0)p=_;else{let v=await pw(n,e);if(i.length>0)return;let S=v.filter(A=>m.has(String(A.name).trim()));if(S.length>0){for(let A of S){let C=await mw(n,A,t,e);C&&await fw(n,e,A,C)}return}return}}let h=o.startsWith("campaign-")?[]:await n.orm.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.content","m.created_at","a.name as sender_name","a.type as sender_type","m.reply_to","r.content as reply_content","ra.name as reply_sender_name").where(F({"m.department_id":{eq:e}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(20).run(),f=[];for(let _ of h.reverse())(_.sender_type==="user"||_.sender_type==="ai")&&f.push({role:_.sender_type==="ai"?"assistant":"user",content:Mc({content:_.content,senderName:String(_.sender_name??"\u672A\u77E5"),replyTo:_.reply_to?{senderName:String(_.reply_sender_name??"\u672A\u77E5"),content:String(_.reply_content??"")}:void 0})});f.push({role:"user",content:t});let w=await os(n.orm,{department_members:He.department_members,agents:He.agents}).from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.type","a.name","dm.role","a.role_label","a.expertise").where({"dm.department_id":{eq:e}}).run(),y=Bs(w,""),k="";try{let _=Z(n.orm),[v]=await _.group_memories.select("summary").where(L(_.group_memories.c.department_id,e)).run();v?.summary&&(k=Qh(String(v.summary)))}catch{}for(let _=0;_<p.length;_++){let v=p[_],S=r[_]??"",A=a(v,S),C="",j="";if(i.length>0&&v.allow_file_tools&&u){let{buildAttachmentLayer:K}=await Promise.resolve().then(()=>(Hi(),Bi)),{resolveDepartmentWorkspace:U}=await Promise.resolve().then(()=>(Ie(),qe)),H=await import("node:fs/promises"),V=await import("node:path"),Q=await U(e,u.workspace_path,!0);if(Q){let P=V.join(Q,"uploads",o),E=V.join(process.cwd(),"data","uploads",String(n.appId),String(e)),x=[];for(let O of i){let I=V.join(E,o,O.name);try{let $=await H.readFile(I);await H.mkdir(P,{recursive:!0}),await H.writeFile(V.join(P,O.name),$),x.push({name:O.name,size:O.size??$.length,path:`uploads/${o}/${O.name}`})}catch($){console.warn(`[chat] \u9644\u4EF6\u62F7\u8D1D\u5931\u8D25 ${O.name}: ${$?.message??""}`)}}C=K(x);try{let O=[],I=async($,M,W)=>{if(W>2)return;let q=await H.readdir($,{withFileTypes:!0}).catch(()=>[]);for(let D of q){let B=M?`${M}/${D.name}`:D.name;if(D.isDirectory())await I(V.join($,D.name),B,W+1);else{let z=await H.stat(V.join($,D.name)).catch(()=>null);O.push({path:B,size:z?.size??0,mtime:z?.mtime?.toISOString()??""})}}};await I(Q,"",0),O.sort(($,M)=>$.path.localeCompare(M.path)),j=zh(O);try{let{readFileSync:$}=await import("node:fs"),{resolve:M}=await import("node:path"),W=JSON.parse($(M(process.cwd(),"src","sandbox","capabilities.json"),"utf-8"));(Array.isArray(W?.tools)||Array.isArray(W?.runtime))&&(j+=`
304
+ `+u:""),S=t.tools??[],A=await yw(n,String(t.id)),C=s,W=U=>{a.emit({agentId:t.id,agentName:t.name,...U})};try{if(!C){let[x]=await m.messages.insert({department_id:e,sender_id:String(t.id),content:"",msg_type:"text",ai_approved:!0}).returning("id").run();C=String(x.id)}W({type:"wf:step",messageId:C,stepType:"llm"});try{let{planBlockReason:x}=await Promise.resolve().then(()=>(Ks(),zs)),P=await x(n.orm,n.appId);if(P){W({type:"wf:done",messageId:C,content:P});return}}catch{}try{let x=Number(t.monthly_token_quota??0);if(x>0){let[P]=await w.query.from("agent_logs").sum("tokens_total","used").where({agent_id:{eq:String(t.id)},created_at:{gte:Q.monthStart()}}).run();if(Number(P?.used??0)>=x){W({type:"wf:done",messageId:C,content:`\u26A0\uFE0F \u8BE5 Agent \u672C\u6708 token \u914D\u989D\uFF08${x.toLocaleString()}\uFF09\u5DF2\u7528\u5C3D\uFF0C\u6682\u505C\u81EA\u52A8\u56DE\u590D\u3002\u8BF7\u5728 Agent \u8BE6\u60C5\u8C03\u6574\u914D\u989D\u6216\u4E0B\u6708\u6062\u590D\u3002`});return}}}catch{}let U="",F=!1,K=!1,M,O=[],E=Promise.resolve();try{M=await qc(n,{requestId:i,agentId:t.id,appId:n.appId,departmentId:e,runMessageId:d,systemPrompt:v,model:t.model,tools:S,maxSteps:t.max_tokens?Math.min(t.max_tokens,20):10,humanInTheLoop:!1,preloadedSkills:A,allowFileTools:t.allow_file_tools,allowCommandExec:t.allow_command_exec,allowNetwork:t.allow_network},r,{onChunk:x=>{U+=x,W({type:"wf:token",messageId:C,text:x}),E=E.then(()=>m.messages.update({content:U}).where(L(m.messages.c.id,C)).run())},onToolCall:x=>{W({type:"wf:step",messageId:C,stepType:"tool",name:x.name,args:x.args}),b++,O.push({tool:x.name,args:x.args,at:new Date().toISOString()});try{k.set(String(x.name),JSON.parse(String(x.args??"{}")))}catch{}},onToolResult:x=>{W({type:"wf:tool_result",messageId:C,name:x.name,result:x.result,ok:x.ok,error:x.error});for(let P=O.length-1;P>=0;P--)if(O[P].tool===x.name&&O[P].result===void 0){O[P].result=x.result,O[P].ok=x.ok;break}try{if((x.name==="write"||x.name==="edit")&&!String(x.result??"").startsWith("\u5199\u5165\u5931\u8D25")&&!String(x.result??"").startsWith("\u7F16\u8F91\u5931\u8D25")&&!String(x.result??"").includes("\u672A\u627E\u5230\u5339\u914D")){let P=_(String(x.name)),N=P?.path?String(P.path):"";if(N&&!N.startsWith(".."))try{n.msg?.broadcast&&m.departments.select("artifact_review").where(L(m.departments.c.id,e)).run().then(D=>{let q=!!D?.[0]?.artifact_review;n.msg?.broadcast&&n.msg.broadcast(String(e),{type:"file_updated",file:N,agentId:t.id,agentName:t.name,pending:q})}).catch(()=>{n.msg?.broadcast&&n.msg.broadcast(String(e),{type:"file_updated",file:N,agentId:t.id,agentName:t.name,pending:!1})})}catch{}}}catch{}},onFinish:()=>{}})}catch(x){F=!0,console.error(`[chat] streamAgent ${t.id} error:`,x)}if(F)U||await m.messages.delete().where(V(L(m.messages.c.id,C),L(m.messages.c.content,""))).run(),W({type:"wf:error",messageId:C,code:"provider_error",message:"AI \u56DE\u590D\u5931\u8D25"});else{let x=function(D){return/问卷|填写|任务|执行|处理|完成|汇总|打开|整理|分析|生成|创建|修改|提交|回复|总结|调研|统计|重试/.test(D)};var G=x;if(M){let D=globalThis.__platform_metrics;D&&(D.aiCalls++,D.aiTokens+=M.total_tokens??0);try{await m.agent_logs.insert({agent_id:String(t.id),app_id:String(n.appId),department_id:e,messages_count:r.length,steps_count:1,tokens_prompt:M.prompt_tokens??0,tokens_completion:M.completion_tokens??0,tokens_total:M.total_tokens??0,elapsed_ms:0,success:!0}).run()}catch{}}try{let{extractArtifactPaths:D,verifyArtifacts:q,buildVerifyMark:B}=await Promise.resolve().then(()=>(Hc(),Bc)),$=D(U),j=String(e);try{let[H]=await m.agents.select("department_id").where(L(m.agents.c.id,t.id)).run();H?.department_id&&(j=String(H.department_id))}catch{}if($.length>0){let{verified:H,missing:z,stale:Y}=await q(w,j,$,h);if(H.length>0||z.length>0||Y.length>0){let ee=B(H,z,Y);U=U+ee,W({type:"wf:verify",messageId:C,verified:H,missing:z,stale:Y}),await m.messages.update({content:U}).where(L(m.messages.c.id,C)).run().catch(()=>{})}}}catch{}if(O.length>0)try{await m.messages.update({ai_step:{steps:O}}).where(L(m.messages.c.id,C)).run()}catch{}if(b===0&&U.trim()&&!F&&x(o))try{if(u0(String(t.id))){let[D]=await m.agents.select("id").where(V(L(m.agents.c.app_id,n.appId),L(m.agents.c.type,"user"))).limit(1).run(),q=D?String(D.id):"system",B=`@${t.name} \u3010\u7CFB\u7EDF\u81EA\u52A8\u91CD\u8BD5\u3011\u4F60\u4E0A\u4E00\u8F6E\u53EA\u56DE\u590D\u4E86\u8BA1\u5212\u3001\u6CA1\u6709\u5B9E\u9645\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\u6267\u884C\u3002\u8BF7\u7ACB\u5373\u5B9E\u9645\u6267\u884C\u4EFB\u52A1\uFF08\u8C03\u7528\u5DE5\u5177\u5B8C\u6210\uFF09\uFF0C\u4E0D\u8981\u53EA\u56DE\u590D\u8BA1\u5212\u3002`,{handleNewMessageStream:$}=await Promise.resolve().then(()=>(Wn(),Lr));await m.messages.insert({department_id:e,sender_id:q,content:B,msg_type:"system",ai_approved:!0}).run(),console.warn(`[chat] ${t.name} \u60F0\u6027\u56DE\u590D\uFF080 \u5DE5\u5177\u8C03\u7528\uFF09\u2014\u2014\u81EA\u52A8\u91CD\u8BD5`),$(n,String(e),q,B,"").catch(()=>{})}}catch{}let P=U,N=[];try{let D=mw(U);P=D.content,N=D.quickReplies}catch{}if(N.length>0)try{await m.messages.update({content:P,quick_replies:N}).where(L(m.messages.c.id,C)).run()}catch{}W({type:"wf:done",messageId:C,content:P,usage:M,quickReplies:N})}}catch(U){let F=U instanceof Error?U.message:String(U);console.error(`[chat] runAgentStreamForAgent ${t.id} error:`,F);try{C?W({type:"wf:error",messageId:C,code:"internal_error",message:F.slice(0,200)}):console.error(`[chat] msgId \u672A\u77E5\u2014\u2014\u65E0\u6CD5\u53D1 wf:error\uFF1A${F}`)}catch{}}}async function ww(n,e,t,r,s="",o=[],i="",a){let{sql:l}=n,u=null;try{let _=Z(n.orm),[v]=await _.departments.select("is_dm","workspace_path").where(L(_.departments.c.id,e)).run();v&&(u={is_dm:!!v.is_dm,workspace_path:v.workspace_path?String(v.workspace_path):null})}catch{}let c=process.env.DEEPSEEK_API_KEY;if(!c||c===""||c==="sk-your-deepseek-api-key"||c.startsWith("sk-your-")){console.warn("[chat] DEEPSEEK_API_KEY \u672A\u914D\u7F6E\uFF0C\u8DF3\u8FC7 AI \u81EA\u52A8\u56DE\u590D");return}let d=await n.orm.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.system_prompt","a.model","a.tools","a.human_in_the_loop","a.max_tokens","a.workspace_path","a.allow_file_tools","a.allow_command_exec","a.allow_network").where(V({"dm.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"a.is_active":{eq:!0}})).run();if(d.length===0)return;let p=d,f=new Set;for(let _ of t.matchAll(/@([\u4e00-\u9fa5\w\-]+)/g))f.add(_[1]);if(f.size>0)if(f.has("all")||f.has("\u6240\u6709\u4EBA")||f.has("everyone")||f.has("\u5168\u5458"))p=d;else{let _=d.filter(v=>f.has(String(v.name).trim()));if(_.length>0)p=_;else{let v=await fw(n,e);if(o.length>0)return;let S=v.filter(A=>f.has(String(A.name).trim()));if(S.length>0){for(let A of S){let C=await gw(n,A,t,e);C&&await hw(n,e,A,C)}return}return}}let w=i.startsWith("campaign-")?[]:await n.orm.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.content","m.created_at","a.name as sender_name","a.type as sender_type","m.reply_to","r.content as reply_content","ra.name as reply_sender_name").where(V({"m.department_id":{eq:e}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(20).run(),m=[];for(let _ of w.reverse())(_.sender_type==="user"||_.sender_type==="ai")&&m.push({role:_.sender_type==="ai"?"assistant":"user",content:Dc({content:_.content,senderName:String(_.sender_name??"\u672A\u77E5"),replyTo:_.reply_to?{senderName:String(_.reply_sender_name??"\u672A\u77E5"),content:String(_.reply_content??"")}:void 0})});m.push({role:"user",content:t});let h=await ls(n.orm,{department_members:Ve.department_members,agents:Ve.agents}).from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.type","a.name","dm.role","a.role_label","a.expertise").where({"dm.department_id":{eq:e}}).run(),b=Vs(h,""),k="";try{let _=Z(n.orm),[v]=await _.group_memories.select("summary").where(L(_.group_memories.c.department_id,e)).run();v?.summary&&(k=Zh(String(v.summary)))}catch{}for(let _=0;_<p.length;_++){let v=p[_],S=r[_]??"",A=a(v,S),C="",W="";if(o.length>0&&v.allow_file_tools&&u){let{buildAttachmentLayer:G}=await Promise.resolve().then(()=>(Vi(),Fi)),{resolveDepartmentWorkspace:U}=await Promise.resolve().then(()=>(Ne(),De)),F=await import("node:fs/promises"),K=await import("node:path"),M=await U(e,u.workspace_path,!0);if(M){let O=K.join(M,"uploads",i),E=K.join(process.cwd(),"data","uploads",String(n.appId),String(e)),x=[];for(let P of o){let N=K.join(E,i,P.name);try{let D=await F.readFile(N);await F.mkdir(O,{recursive:!0}),await F.writeFile(K.join(O,P.name),D),x.push({name:P.name,size:P.size??D.length,path:`uploads/${i}/${P.name}`})}catch(D){console.warn(`[chat] \u9644\u4EF6\u62F7\u8D1D\u5931\u8D25 ${P.name}: ${D?.message??""}`)}}C=G(x);try{let P=[],N=async(D,q,B)=>{if(B>2)return;let $=await F.readdir(D,{withFileTypes:!0}).catch(()=>[]);for(let j of $){let H=q?`${q}/${j.name}`:j.name;if(j.isDirectory())await N(K.join(D,j.name),H,B+1);else{let z=await F.stat(K.join(D,j.name)).catch(()=>null);P.push({path:H,size:z?.size??0,mtime:z?.mtime?.toISOString()??""})}}};await N(M,"",0),P.sort((D,q)=>D.path.localeCompare(q.path)),W=Gh(P);try{let{readFileSync:D}=await import("node:fs"),{resolve:q}=await import("node:path"),B=JSON.parse(D(q(process.cwd(),"src","sandbox","capabilities.json"),"utf-8"));(Array.isArray(B?.tools)||Array.isArray(B?.runtime))&&(W+=`
305
305
 
306
- \u3010\u6C99\u76D2\u73AF\u5883\u80FD\u529B\u3011\u955C\u50CF ${String(W.label??W.image??"?")}\uFF1A\u8FD0\u884C\u65F6 ${(W.runtime??[]).join(" / ")}\uFF1B`,Array.isArray(W.office)&&W.office.length>0&&(j+=`Office \u5E93\u5DF2\u88C5\uFF08${W.office.join("\u3001")}\uFF09\u2014\u2014\u751F\u6210\u6587\u6863/\u8868\u683C/PPT \u76F4\u63A5\u7528 python \u811A\u672C\uFF0C\u65E0\u9700\u5B89\u88C5\uFF1B`),j+="\u5148\u67E5\u5DF2\u88C5\u80FD\u529B\u518D\u5F00\u5DE5\uFF08\u52FF\u91CD\u590D\u5B89\u88C5/\u8BD5\u9519\uFF09\u3002")}catch{}}catch{}}}if(v.human_in_the_loop){let K=await Li(n,{agentId:v.id,appId:n.appId,departmentId:e,systemPrompt:(v.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
306
+ \u3010\u6C99\u76D2\u73AF\u5883\u80FD\u529B\u3011\u955C\u50CF ${String(B.label??B.image??"?")}\uFF1A\u8FD0\u884C\u65F6 ${(B.runtime??[]).join(" / ")}\uFF1B`,Array.isArray(B.office)&&B.office.length>0&&(W+=`Office \u5E93\u5DF2\u88C5\uFF08${B.office.join("\u3001")}\uFF09\u2014\u2014\u751F\u6210\u6587\u6863/\u8868\u683C/PPT \u76F4\u63A5\u7528 python \u811A\u672C\uFF0C\u65E0\u9700\u5B89\u88C5\uFF1B`),W+="\u5148\u67E5\u5DF2\u88C5\u80FD\u529B\u518D\u5F00\u5DE5\uFF08\u52FF\u91CD\u590D\u5B89\u88C5/\u8BD5\u9519\uFF09\u3002")}catch{}}catch{}}}if(v.human_in_the_loop){let G=await Ui(n,{agentId:v.id,appId:n.appId,departmentId:e,systemPrompt:(v.system_prompt??"\u4F60\u662F\u4E00\u4E2A\u6709\u5E2E\u52A9\u7684 AI \u52A9\u624B\u3002")+`
307
307
 
308
- `+Ui({rosterText:Bs(w,String(v.id)),selfName:String(v.name)})+$c+(k?`
308
+ `+Hi({rosterText:Vs(h,String(v.id)),selfName:String(v.name)})+jc+(k?`
309
309
 
310
- `+k:"")+(j?`
310
+ `+k:"")+(W?`
311
311
 
312
- `+j:"")+(C?`
312
+ `+W:"")+(C?`
313
313
 
314
- `+C:""),model:v.model,tools:v.tools??[],maxSteps:v.max_tokens?Math.min(v.max_tokens,20):10,humanInTheLoop:!0,preloadedSkills:await hw(n,String(v.id)),allowFileTools:v.allow_file_tools,allowCommandExec:v.allow_command_exec,allowNetwork:v.allow_network},f),U=K.content;if(!U)continue;let H=Z(n.orm),[V]=await H.messages.insert({department_id:e,sender_id:String(v.id),content:"[AI \u751F\u6210\u4E2D...]",msg_type:"text",ai_draft:U,ai_approved:null,ai_step:{steps:K.steps}}).returning("id").run();A.emit({type:"ai_draft",message:{id:V.id,agentId:v.id,agentName:v.name,draft:U,departmentId:e,createdAt:new Date().toISOString()}});continue}await g0(n,e,v,f,S,t,s,A,w,C,k,o,j)}(async()=>{try{if(!Dc(t))return;let _=Z(n.orm),S=(await n.orm.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.content").where(F({"m.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"m.content":{ne:""}})).orderBy("m.created_at","desc").limit(20).run()).find(C=>!String(C.content??"").includes("\u6765\u81EA\u76F8\u4F3C\u95EE\u9898\u7684\u5FEB\u901F\u56DE\u590D")),A=String(S?.content??"").trim();if(A.length<10||Yh(A)||qc(A))return;await _.answer_cache.insert({app_id:String(n.appId),question:t.slice(0,200),answer:A.slice(0,2e3)}).run()}catch{}})()}async function Fi(n,e,t,r,s,i=""){let o=[];try{let a=Z(n.orm),l=await a.messages.select("attachments").where(L(a.messages.c.id,s)).run();l[0]?.attachments&&(o=typeof l[0].attachments=="string"?JSON.parse(l[0].attachments):l[0].attachments)}catch{}Jh(n,e).catch(()=>{});try{if(!o.length&&Dc(r)){let a=await n.orm.query.from("answer_cache").select("question","answer","hits").where({app_id:{eq:String(n.appId)}}).orderBy("updated_at","desc").limit(200).run(),l=ew(r,a),u=l&&!qc(l.answer)?l:null;if(u){await n.orm.query.update("answer_cache").set({hits:G.mergeInc(1),updated_at:G.mergeNow()}).where({app_id:{eq:String(n.appId)},question:{eq:u.question}}).run();let c=Z(n.orm),[d]=await c.agents.select("id").where(F(L(c.agents.c.app_id,n.appId),L(c.agents.c.type,"ai"),L(c.agents.c.is_active,!0))).limit(1).run();if(d){let[p]=await c.messages.insert({department_id:e,sender_id:String(d.id),content:jc(u.answer,u.hits+1),msg_type:"text",ai_approved:!0}).returning("id").run(),m={type:"wf:done",messageId:String(p.id),content:jc(u.answer,u.hits+1)};n.msg.broadcast(String(e),m)}return}}}catch{}await gw(n,e,r,[],i,o,s,(a,l)=>({emit(u){if(n.msg.broadcast(String(e),u),u.type==="wf:done"&&u.content){let c=Z(n.orm);c.messages.update({content:u.content}).where(F(L(c.messages.c.id,u.messageId),L(c.messages.c.content,""))).run().catch(()=>{})}}}))}async function Bc(n,e,t,r="",s){let i=[];try{let a=Z(n.orm),l=await a.messages.select("attachments").where(F(L(a.messages.c.department_id,e),ss(a.messages.c.sender_id))).orderBy("created_at","desc").limit(1).run();l[0]?.attachments&&(i=typeof l[0].attachments=="string"?JSON.parse(l[0].attachments):l[0].attachments)}catch{}let o={emit(a){s(`event: ${a.type}
314
+ `+C:""),model:v.model,tools:v.tools??[],maxSteps:v.max_tokens?Math.min(v.max_tokens,20):10,humanInTheLoop:!0,preloadedSkills:await yw(n,String(v.id)),allowFileTools:v.allow_file_tools,allowCommandExec:v.allow_command_exec,allowNetwork:v.allow_network},m),U=G.content;if(!U)continue;let F=Z(n.orm),[K]=await F.messages.insert({department_id:e,sender_id:String(v.id),content:"[AI \u751F\u6210\u4E2D...]",msg_type:"text",ai_draft:U,ai_approved:null,ai_step:{steps:G.steps}}).returning("id").run();A.emit({type:"ai_draft",message:{id:K.id,agentId:v.id,agentName:v.name,draft:U,departmentId:e,createdAt:new Date().toISOString()}});continue}await m0(n,e,v,m,S,t,s,A,h,C,k,i,W)}(async()=>{try{if(!Wc(t))return;let _=Z(n.orm),S=(await n.orm.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.content").where(V({"m.department_id":{eq:e}},{"a.type":{in:["ai","department"]}},{"m.content":{ne:""}})).orderBy("m.created_at","desc").limit(20).run()).find(C=>!String(C.content??"").includes("\u6765\u81EA\u76F8\u4F3C\u95EE\u9898\u7684\u5FEB\u901F\u56DE\u590D")),A=String(S?.content??"").trim();if(A.length<10||tw(A)||Lc(A))return;await _.answer_cache.insert({app_id:String(n.appId),question:t.slice(0,200),answer:A.slice(0,2e3)}).run()}catch{}})()}async function zi(n,e,t,r,s,o=""){let i=[];try{let a=Z(n.orm),l=await a.messages.select("attachments").where(L(a.messages.c.id,s)).run();l[0]?.attachments&&(i=typeof l[0].attachments=="string"?JSON.parse(l[0].attachments):l[0].attachments)}catch{}Xh(n,e).catch(()=>{});try{if(!i.length&&Wc(r)){let a=await n.orm.query.from("answer_cache").select("question","answer","hits").where({app_id:{eq:String(n.appId)}}).orderBy("updated_at","desc").limit(200).run(),l=nw(r,a),u=l&&!Lc(l.answer)?l:null;if(u){await n.orm.query.update("answer_cache").set({hits:Q.mergeInc(1),updated_at:Q.mergeNow()}).where({app_id:{eq:String(n.appId)},question:{eq:u.question}}).run();let c=Z(n.orm),[d]=await c.agents.select("id").where(V(L(c.agents.c.app_id,n.appId),L(c.agents.c.type,"ai"),L(c.agents.c.is_active,!0))).limit(1).run();if(d){let[p]=await c.messages.insert({department_id:e,sender_id:String(d.id),content:Uc(u.answer,u.hits+1),msg_type:"text",ai_approved:!0}).returning("id").run(),f={type:"wf:done",messageId:String(p.id),content:Uc(u.answer,u.hits+1)};n.msg.broadcast(String(e),f)}return}}}catch{}await ww(n,e,r,[],o,i,s,(a,l)=>({emit(u){if(n.msg.broadcast(String(e),u),u.type==="wf:done"&&u.content){let c=Z(n.orm);c.messages.update({content:u.content}).where(V(L(c.messages.c.id,u.messageId),L(c.messages.c.content,""))).run().catch(()=>{})}}}))}async function Vc(n,e,t,r="",s){let o=[];try{let a=Z(n.orm),l=await a.messages.select("attachments").where(V(L(a.messages.c.department_id,e),as(a.messages.c.sender_id))).orderBy("created_at","desc").limit(1).run();l[0]?.attachments&&(o=typeof l[0].attachments=="string"?JSON.parse(l[0].attachments):l[0].attachments)}catch{}let i={emit(a){s(`event: ${a.type}
315
315
  `),s(`data: ${JSON.stringify(a)}
316
316
 
317
- `)}};await gw(n,e,t,[],r,i,"",(a,l)=>({emit(u){o.emit(u)}}))}async function hw(n,e){let t=[];try{let r=Z(n.orm),s=await r.agent_skills.select("skill_dir","skill_name").where(F(L(r.agent_skills.c.agent_id,e),L(r.agent_skills.c.enabled,!0))).run();for(let i of s)try{let o=await js(i.skill_dir,()=>n);t.push(o)}catch(o){console.warn(`[chat] \u52A0\u8F7D\u6280\u80FD ${i.skill_name} \u5931\u8D25:`,o)}}catch{}return t}var cw,Wn=N(()=>{"use strict";re();Wi();re();Ar();Kh();nt();Zh();tw();Ls();cw=new Map});var Pt={};ie(Pt,{MAX_CAMPAIGN_CONCURRENCY:()=>zc,cancelCampaign:()=>b0,clampConcurrency:()=>kw,createCampaign:()=>Kc,getCampaign:()=>w0,isCampaignFinished:()=>vw,markInterrupted:()=>v0,pickToDispatch:()=>yw,retryCampaign:()=>y0,startCampaignLoop:()=>Gc,tickOnce:()=>Sw,tickTimeouts:()=>bw});function yw(n,e){let t=n.filter(s=>s.status==="running").length,r=Math.max(0,e-t);return r===0?[]:n.filter(s=>s.status==="queued").slice(0,r)}function bw(n,e,t,r=Date.now()){let s=[],i=[];for(let o of n)o.status!=="running"||!o.started_at||r-new Date(o.started_at).getTime()<t||(o.attempts<e?s.push(o):i.push(o));return{requeue:s,failed:i}}function vw(n,e=0){return e===0&&n.completed+n.failed>=n.total}function kw(n,e=5){let t=Number(n);return!Number.isFinite(t)||t<=0?Math.min(zc,Math.max(1,Math.floor(e))):Math.min(zc,t)}async function Kc(n,e){let t=n.orm,r=n.appId,s=Math.max(1,Number(e.total??0)||10),i=kw(Number(e.concurrency??0)),o=Math.max(0,Number(e.retry??_w)||0),a=e.rolePrefix??"\u95EE\u5377-",u=(await t.query.from("agents").select("id","name","department_id").where({app_id:{eq:String(r)},type:{eq:"ai"},is_active:{eq:!0},name:{like:a+"%"},department_id:{ne:null}}).orderBy("name","asc").run()??[]).filter(m=>!(e.excludeNames??[]).includes(String(m.name)));if(u.length===0)throw new Error(`\u672A\u627E\u5230\u95EE\u5377\u89D2\u8272\uFF08rolePrefix=${a}\uFF09\u2014\u2014\u5148\u8DD1 seed-survey-agents.mjs`);let c=u.slice(0,s),{campaign:d,runs:p}=await n.orm.transaction(async m=>{let h=Z(m),[f]=await h.survey_campaigns.insert({app_id:String(r),total:c.length,concurrency:i,url:e.url??"",retry:o,status:"running"}).returning("*").run(),g=[];for(let w of c){let[y]=await h.survey_campaign_runs.insert({campaign_id:String(f.id),agent_id:String(w.id),agent_name:String(w.name),dept_id:String(w.department_id),status:"queued"}).returning("*").run();g.push(y)}return{campaign:f,runs:g}});return Gc(n,d.id),{campaign:d,runs:p}}async function w0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)return null;let s=await t.survey_campaign_runs.select().where({campaign_id:{eq:e}}).orderBy("agent_name","asc").run();return{campaign:r,runs:s??[]}}async function y0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)throw new Error("campaign \u4E0D\u5B58\u5728");if(r.status!=="done"&&r.status!=="failed"&&r.status!=="interrupted")throw new Error(`campaign \u72B6\u6001 ${r.status}\u2014\u2014\u4EC5 done/failed/interrupted \u53EF\u91CD\u8DD1`);await t.survey_campaign_runs.update({status:"queued",attempts:0,error:null,started_at:null,finished_at:null}).where({campaign_id:{eq:e},status:{eq:"failed"}}).run();let[s]=await n.orm.query.from("survey_campaign_runs").count("*","n").where({campaign_id:{eq:e},status:{eq:"done"}}).run();await t.survey_campaigns.update({status:"running",completed:Number(s?.n??0),failed:0,updated_at:G.now()}).where({id:{eq:String(e)}}).run(),Gc(n,e)}async function b0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)throw new Error("campaign \u4E0D\u5B58\u5728");if(r.status==="done"||r.status==="cancelled")throw new Error(`campaign \u5DF2${r.status}`);await t.survey_campaign_runs.update({status:"cancelled"}).where({campaign_id:{eq:String(e)},status:{in:["queued","running"]}}).run(),await t.survey_campaigns.update({status:"cancelled",updated_at:G.now()}).where({id:{eq:String(e)}}).run()}function Hc(n,e,t){setTimeout(()=>{(async()=>{try{let{manager:s}=await Promise.resolve().then(()=>(Se(),Ee)),[i]=await n.query.from("sandboxes").select("id","app_id").where({department_id:{eq:e},status:{eq:"running"}}).limit(1).run();i&&await s.stop(String(i.id),String(i.app_id)).catch(()=>{})}catch{}})()},t).unref?.()}function Gc(n,e){Fc.has(e)||(Fc.add(e),console.log(`[campaign ${e}] \u8C03\u5EA6\u5FAA\u73AF\u542F\u52A8\uFF08tick ${ww}ms\uFF09`),(async()=>{let t=setInterval(async()=>{try{console.log(`[campaign ${e}] tick @${new Date().toISOString().slice(11,19)}`),await Sw(n,e)&&(console.log(`[campaign ${e}] tick \u5FAA\u73AF\u505C\u6B62\uFF08return true\uFF09`),clearInterval(t),Fc.delete(e))}catch(r){console.error(`[campaign ${e}] tick \u5931\u8D25:`,r?.message??r),console.error(`[campaign ${e}] tick stack:`,String(r?.stack??"").slice(0,600))}},ww);t.unref?.()})())}async function Sw(n,e){if(Vc.has(e))return console.log(`[campaign ${e}] tick \u88AB\u53E0\u52A0\u95E8\u8DF3\u8FC7\uFF08\u4E0A\u4E00 tick \u672A\u5B8C\u6210\u2014\u2014ticking \u6302\uFF09`),!1;Vc.add(e);try{return await _0(n,e)}finally{Vc.delete(e)}}async function _0(n,e){let t=n.orm,r=Z(t),s=null;try{[s]=await r.survey_campaigns.select().where({id:{eq:e}}).limit(1).run()}catch(w){throw console.error(`[campaign ${e}] phase\u2460 campaign \u67E5\u8BE2\u5931\u8D25\uFF08campaignId=${JSON.stringify(e)} type=${typeof e}\uFF09:`,w?.message??w),w}if(!s||s.status!=="running")return console.log(`[campaign ${e}] tick \u505C\u6B62\u5224\u5B9A\uFF1Acampaign=${s?s.status:"\u67E5\u8BE2\u7A7A!"}`),!0;let i=[];try{i=await r.survey_campaign_runs.select().where({campaign_id:{eq:e}}).run()??[]}catch(w){throw console.error(`[campaign ${e}] phase\u2460 runs \u67E5\u8BE2\u5931\u8D25:`,w?.message??w),w}let o=i,{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ie(),qe)),{access:l}=await import("node:fs/promises"),u=Number(s.completed??0),c=Number(s.failed??0);for(let w of o){if(w.status!=="running"||!await a(w.dept_id,null,!0).catch(()=>null))continue;let k=null;try{k=(await r.survey_submissions.select("campaign_id").where({campaign_id:{eq:e},source:{eq:w.agent_name}}).limit(1).run())[0]}catch(_){throw console.error(`[campaign ${e}] \u5B8C\u6210\u626B\u63CF SQL \u5931\u8D25\uFF08agent=${w.agent_name}\uFF09:`,_?.message??_),_}k&&(await r.survey_campaign_runs.update({status:"done",finished_at:G.now(),error:null}).where({id:{eq:String(w.id)}}).run(),u++,Hc(t,w.dept_id,6e4))}let d=Number(process.env.SURVEY_CAMPAIGN_TIMEOUT_MS??h0),p=Number(s.retry??_w),{requeue:m,failed:h}=bw(o,p,d);for(let w of m){try{await r.survey_campaign_runs.update({status:"queued",attempts:Number(w.attempts??0)+1,started_at:null}).where({id:{eq:String(w.id)}}).run()}catch(y){throw console.error(`[campaign ${e}] phase\u2461 requeue \u5931\u8D25\uFF08run=${w.id}\uFF09:`,y?.message??y),y}Hc(t,w.dept_id,3e4)}for(let w of h){try{let y=`\u8D85\u65F6\uFF08${Math.round(d/1e3)}s \u672A\u5B8C\u6210\uFF09`;await r.survey_campaign_runs.update({status:"failed",finished_at:G.now(),error:y}).where({id:{eq:String(w.id)}}).run()}catch(y){throw console.error(`[campaign ${e}] phase\u2461 failed \u6807\u8BB0\u5931\u8D25\uFF08run=${w.id}\uFF09:`,y?.message??y),y}c++,Hc(t,w.dept_id,3e4)}try{let w=await r.survey_campaign_runs.select("dept_id").where({campaign_id:{eq:e},status:{eq:"running"}}).run();w.length>0&&await t.query.update("sandboxes").set({last_used_at:G.now()}).where({status:{eq:"running"},department_id:{in:w.map(y=>String(y.dept_id))}}).run()}catch{}let f=await r.survey_campaign_runs.select().where({campaign_id:{eq:e}}).run()??[],g=yw(f,Number(s.concurrency));if(g.length>0){let w=null;try{[w]=await r.agents.select("id").where({app_id:{eq:String(n.appId)},type:{eq:"user"}}).orderBy("created_at","asc").limit(1).run()}catch(k){throw console.error(`[campaign ${e}] \u6D3E\u5355 sender \u67E5\u8BE2\u5931\u8D25:`,k?.message??k),k}let y=w?String(w.id):"system";for(let k of g){let _=typeof process.env.SURVEY_CONTAINER_URL=="string"&&process.env.SURVEY_CONTAINER_URL||`http://host.docker.internal:${process.env.PORT??3e3}`,v=s.url||_+"/demo-survey";try{let{resolveDepartmentWorkspace:A}=await Promise.resolve().then(()=>(Ie(),qe)),C=await A(k.dept_id,null,!0).catch(()=>null);if(C){let{rm:j}=await import("node:fs/promises");await j(`${C}/survey-result.json`,{force:!0}).catch(()=>{})}}catch{}let S=`@${k.agent_name} \u3010\u95EE\u5377\u4EFB\u52A1\u3011\u8BF7\u7528 agent-browser CLI \u6253\u5F00\u95EE\u5377\u5E76\u771F\u5B9E\u586B\u5199\u63D0\u4EA4\uFF08\u6BCF\u4E00\u6B65\u5FC5\u987B\u5B9E\u9645\u6267\u884C\u2014\u2014\u7981\u6B62\u4EC5\u63CF\u8FF0\uFF09\uFF1A
317
+ `)}};await ww(n,e,t,[],r,o,"",(a,l)=>({emit(u){i.emit(u)}}))}async function yw(n,e){let t=[];try{let r=Z(n.orm),s=await r.agent_skills.select("skill_dir","skill_name").where(V(L(r.agent_skills.c.agent_id,e),L(r.agent_skills.c.enabled,!0))).run();for(let o of s)try{let i=await Us(o.skill_dir,()=>n);t.push(i)}catch(i){console.warn(`[chat] \u52A0\u8F7D\u6280\u80FD ${o.skill_name} \u5931\u8D25:`,i)}}catch{}return t}var pw,Wn=I(()=>{"use strict";re();Bi();re();Ar();Qh();nt();Yh();rw();Bs();pw=new Map});var Pt={};ie(Pt,{MAX_CAMPAIGN_CONCURRENCY:()=>Qc,cancelCampaign:()=>w0,clampConcurrency:()=>xw,createCampaign:()=>Jc,getCampaign:()=>g0,isCampaignFinished:()=>Sw,markInterrupted:()=>b0,pickToDispatch:()=>_w,retryCampaign:()=>h0,startCampaignLoop:()=>Zc,tickOnce:()=>Rw,tickTimeouts:()=>vw});function _w(n,e){let t=n.filter(s=>s.status==="running").length,r=Math.max(0,e-t);return r===0?[]:n.filter(s=>s.status==="queued").slice(0,r)}function vw(n,e,t,r=Date.now()){let s=[],o=[];for(let i of n)i.status!=="running"||!i.started_at||r-new Date(i.started_at).getTime()<t||(i.attempts<e?s.push(i):o.push(i));return{requeue:s,failed:o}}function Sw(n,e=0){return e===0&&n.completed+n.failed>=n.total}function xw(n,e=5){let t=Number(n);return!Number.isFinite(t)||t<=0?Math.min(Qc,Math.max(1,Math.floor(e))):Math.min(Qc,t)}async function Jc(n,e){let t=n.orm,r=n.appId,s=Math.max(1,Number(e.total??0)||10),o=xw(Number(e.concurrency??0)),i=Math.max(0,Number(e.retry??kw)||0),a=e.rolePrefix??"\u95EE\u5377-",u=(await t.query.from("agents").select("id","name","department_id").where({app_id:{eq:String(r)},type:{eq:"ai"},is_active:{eq:!0},name:{like:a+"%"},department_id:{ne:null}}).orderBy("name","asc").run()??[]).filter(f=>!(e.excludeNames??[]).includes(String(f.name)));if(u.length===0)throw new Error(`\u672A\u627E\u5230\u95EE\u5377\u89D2\u8272\uFF08rolePrefix=${a}\uFF09\u2014\u2014\u5148\u8DD1 seed-survey-agents.mjs`);let c=u.slice(0,s),{campaign:d,runs:p}=await n.orm.transaction(async f=>{let w=Z(f),[m]=await w.survey_campaigns.insert({app_id:String(r),total:c.length,concurrency:o,url:e.url??"",retry:i,status:"running"}).returning("*").run(),g=[];for(let h of c){let[b]=await w.survey_campaign_runs.insert({campaign_id:String(m.id),agent_id:String(h.id),agent_name:String(h.name),dept_id:String(h.department_id),status:"queued"}).returning("*").run();g.push(b)}return{campaign:m,runs:g}});return Zc(n,d.id),{campaign:d,runs:p}}async function g0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)return null;let s=await t.survey_campaign_runs.select().where({campaign_id:{eq:e}}).orderBy("agent_name","asc").run();return{campaign:r,runs:s??[]}}async function h0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)throw new Error("campaign \u4E0D\u5B58\u5728");if(r.status!=="done"&&r.status!=="failed"&&r.status!=="interrupted")throw new Error(`campaign \u72B6\u6001 ${r.status}\u2014\u2014\u4EC5 done/failed/interrupted \u53EF\u91CD\u8DD1`);await t.survey_campaign_runs.update({status:"queued",attempts:0,error:null,started_at:null,finished_at:null}).where({campaign_id:{eq:e},status:{eq:"failed"}}).run();let[s]=await n.orm.query.from("survey_campaign_runs").count("*","n").where({campaign_id:{eq:e},status:{eq:"done"}}).run();await t.survey_campaigns.update({status:"running",completed:Number(s?.n??0),failed:0,updated_at:Q.now()}).where({id:{eq:String(e)}}).run(),Zc(n,e)}async function w0(n,e){let t=Z(n.orm),[r]=await t.survey_campaigns.select().where({id:{eq:String(e)},app_id:{eq:String(n.appId)}}).limit(1).run();if(!r)throw new Error("campaign \u4E0D\u5B58\u5728");if(r.status==="done"||r.status==="cancelled")throw new Error(`campaign \u5DF2${r.status}`);await t.survey_campaign_runs.update({status:"cancelled"}).where({campaign_id:{eq:String(e)},status:{in:["queued","running"]}}).run(),await t.survey_campaigns.update({status:"cancelled",updated_at:Q.now()}).where({id:{eq:String(e)}}).run()}function zc(n,e,t){setTimeout(()=>{(async()=>{try{let{manager:s}=await Promise.resolve().then(()=>(Se(),Te)),[o]=await n.query.from("sandboxes").select("id","app_id").where({department_id:{eq:e},status:{eq:"running"}}).limit(1).run();o&&await s.stop(String(o.id),String(o.app_id)).catch(()=>{})}catch{}})()},t).unref?.()}function Zc(n,e){Kc.has(e)||(Kc.add(e),console.log(`[campaign ${e}] \u8C03\u5EA6\u5FAA\u73AF\u542F\u52A8\uFF08tick ${bw}ms\uFF09`),(async()=>{let t=setInterval(async()=>{try{console.log(`[campaign ${e}] tick @${new Date().toISOString().slice(11,19)}`),await Rw(n,e)&&(console.log(`[campaign ${e}] tick \u5FAA\u73AF\u505C\u6B62\uFF08return true\uFF09`),clearInterval(t),Kc.delete(e))}catch(r){console.error(`[campaign ${e}] tick \u5931\u8D25:`,r?.message??r),console.error(`[campaign ${e}] tick stack:`,String(r?.stack??"").slice(0,600))}},bw);t.unref?.()})())}async function Rw(n,e){if(Gc.has(e))return console.log(`[campaign ${e}] tick \u88AB\u53E0\u52A0\u95E8\u8DF3\u8FC7\uFF08\u4E0A\u4E00 tick \u672A\u5B8C\u6210\u2014\u2014ticking \u6302\uFF09`),!1;Gc.add(e);try{return await y0(n,e)}finally{Gc.delete(e)}}async function y0(n,e){let t=n.orm,r=Z(t),s=null;try{[s]=await r.survey_campaigns.select().where({id:{eq:e}}).limit(1).run()}catch(h){throw console.error(`[campaign ${e}] phase\u2460 campaign \u67E5\u8BE2\u5931\u8D25\uFF08campaignId=${JSON.stringify(e)} type=${typeof e}\uFF09:`,h?.message??h),h}if(!s||s.status!=="running")return console.log(`[campaign ${e}] tick \u505C\u6B62\u5224\u5B9A\uFF1Acampaign=${s?s.status:"\u67E5\u8BE2\u7A7A!"}`),!0;let o=[];try{o=await r.survey_campaign_runs.select().where({campaign_id:{eq:e}}).run()??[]}catch(h){throw console.error(`[campaign ${e}] phase\u2460 runs \u67E5\u8BE2\u5931\u8D25:`,h?.message??h),h}let i=o,{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ne(),De)),{access:l}=await import("node:fs/promises"),u=Number(s.completed??0),c=Number(s.failed??0);for(let h of i){if(h.status!=="running"||!await a(h.dept_id,null,!0).catch(()=>null))continue;let k=null;try{k=(await r.survey_submissions.select("campaign_id").where({campaign_id:{eq:e},source:{eq:h.agent_name}}).limit(1).run())[0]}catch(_){throw console.error(`[campaign ${e}] \u5B8C\u6210\u626B\u63CF SQL \u5931\u8D25\uFF08agent=${h.agent_name}\uFF09:`,_?.message??_),_}k&&(await r.survey_campaign_runs.update({status:"done",finished_at:Q.now(),error:null}).where({id:{eq:String(h.id)}}).run(),u++,zc(t,h.dept_id,6e4))}let d=Number(process.env.SURVEY_CAMPAIGN_TIMEOUT_MS??f0),p=Number(s.retry??kw),{requeue:f,failed:w}=vw(i,p,d);for(let h of f){try{await r.survey_campaign_runs.update({status:"queued",attempts:Number(h.attempts??0)+1,started_at:null}).where({id:{eq:String(h.id)}}).run()}catch(b){throw console.error(`[campaign ${e}] phase\u2461 requeue \u5931\u8D25\uFF08run=${h.id}\uFF09:`,b?.message??b),b}zc(t,h.dept_id,3e4)}for(let h of w){try{let b=`\u8D85\u65F6\uFF08${Math.round(d/1e3)}s \u672A\u5B8C\u6210\uFF09`;await r.survey_campaign_runs.update({status:"failed",finished_at:Q.now(),error:b}).where({id:{eq:String(h.id)}}).run()}catch(b){throw console.error(`[campaign ${e}] phase\u2461 failed \u6807\u8BB0\u5931\u8D25\uFF08run=${h.id}\uFF09:`,b?.message??b),b}c++,zc(t,h.dept_id,3e4)}try{let h=await r.survey_campaign_runs.select("dept_id").where({campaign_id:{eq:e},status:{eq:"running"}}).run();h.length>0&&await t.query.update("sandboxes").set({last_used_at:Q.now()}).where({status:{eq:"running"},department_id:{in:h.map(b=>String(b.dept_id))}}).run()}catch{}let m=await r.survey_campaign_runs.select().where({campaign_id:{eq:e}}).run()??[],g=_w(m,Number(s.concurrency));if(g.length>0){let h=null;try{[h]=await r.agents.select("id").where({app_id:{eq:String(n.appId)},type:{eq:"user"}}).orderBy("created_at","asc").limit(1).run()}catch(k){throw console.error(`[campaign ${e}] \u6D3E\u5355 sender \u67E5\u8BE2\u5931\u8D25:`,k?.message??k),k}let b=h?String(h.id):"system";for(let k of g){let _=typeof process.env.SURVEY_CONTAINER_URL=="string"&&process.env.SURVEY_CONTAINER_URL||`http://host.docker.internal:${process.env.PORT??3e3}`,v=s.url||_+"/demo-survey";try{let{resolveDepartmentWorkspace:A}=await Promise.resolve().then(()=>(Ne(),De)),C=await A(k.dept_id,null,!0).catch(()=>null);if(C){let{rm:W}=await import("node:fs/promises");await W(`${C}/survey-result.json`,{force:!0}).catch(()=>{})}}catch{}let S=`@${k.agent_name} \u3010\u95EE\u5377\u4EFB\u52A1\u3011\u8BF7\u7528 agent-browser CLI \u6253\u5F00\u95EE\u5377\u5E76\u771F\u5B9E\u586B\u5199\u63D0\u4EA4\uFF08\u6BCF\u4E00\u6B65\u5FC5\u987B\u5B9E\u9645\u6267\u884C\u2014\u2014\u7981\u6B62\u4EC5\u63CF\u8FF0\uFF09\uFF1A
318
318
  1. agent-browser open "${v}?s=${encodeURIComponent(k.agent_name)}&c=${e}"\uFF08\u9875\u9762\u4E0E WS \u6B63\u5E38\u65F6\u663E\u793A\u300C\u5DF2\u8FDE\u63A5\u300D\uFF09
319
319
  2. agent-browser snapshot\uFF08\u8BFB\u53D6\u9898\u76EE\u4E0E\u63A7\u4EF6 ref\u2014\u20145 \u9898\uFF1A\u5E74\u9F84/\u884C\u4E1A/\u5173\u6CE8\u80FD\u529B/\u8BC4\u5206/\u53CD\u9988\uFF09
320
320
  3. \u9010\u9879\u771F\u5B9E\u70B9\u51FB/\u8F93\u5165\uFF1Aagent-browser click "@eXX"\uFF08\u5E74\u9F84/\u5173\u6CE8/\u8BC4\u5206\uFF09+ type\uFF08\u53CD\u9988\u6587\u672C\u6846\uFF09
321
321
  4. agent-browser click \u63D0\u4EA4\u6309\u94AE\u2014\u2014\u9875\u9762\u663E\u793A\u300C\u5DF2\u63D0\u4EA4\u2014\u2014\u4E0D\u53EF\u4FEE\u6539\u300D\u9501\u5B9A\u6001
322
322
  5. agent-browser read/snapshot \u9A8C\u8BC1\u9501\u5B9A\u6001\u4E0E\u63D0\u4EA4\u7F16\u53F7
323
323
  6. \u628A\u4F5C\u7B54\u7ED3\u679C\u5199\u5165\u5DE5\u4F5C\u76EE\u5F55 survey-result.json\uFF08\u8986\u76D6\u65E7\u6587\u4EF6\uFF09\uFF0C\u6267\u884C agent-browser close
324
- \u6CE8\u610F\uFF1A\u53EA\u6709\u9875\u9762\u51FA\u73B0\u300C\u5DF2\u63D0\u4EA4\u300D\u9501\u5B9A\u6001\u624D\u7B97\u5B8C\u6210\u2014\u2014\u63D0\u4EA4\u6210\u529F\u524D\u4E0D\u5F97\u62A5\u544A\u5B8C\u6210\u3002`;(async()=>{try{let{handleNewMessageStream:A}=await Promise.resolve().then(()=>(Wn(),jr));await A(n,k.dept_id,y,S,`campaign-${e}-${k.agent_id}`)}catch(A){console.error(`[campaign ${e}] \u6D3E\u5355\u5931\u8D25 ${k.agent_name}:`,A?.message??A),await r.survey_campaign_runs.update({status:"failed",finished_at:G.now(),error:String(A?.message??"\u6D3E\u5355\u5931\u8D25").slice(0,300)}).where({id:{eq:String(k.id)}}).run().catch(()=>{})}})();try{await r.survey_campaign_runs.update({status:"running",started_at:G.now()}).where({id:{eq:String(k.id)}}).run()}catch(A){throw console.error(`[campaign ${e}] phase\u2462 \u6807 running \u5931\u8D25\uFF08run=${k.id}\uFF09:`,A?.message??A),A}}}try{await r.survey_campaigns.update({completed:Math.min(u,Number(s.total)),failed:Math.min(c,Number(s.total)),updated_at:G.now()}).where({id:{eq:e}}).run()}catch(w){throw console.error(`[campaign ${e}] phase\u2463 \u8BB0\u8D26\u5931\u8D25\uFF08completed=${u} failed=${c}\uFF09:`,w?.message??w),w}if(vw({total:Number(s.total),completed:u,failed:c},f.filter(w=>w.status==="running").length)){try{await r.survey_campaigns.update({status:"done",updated_at:G.now()}).where({id:{eq:e}}).run()}catch(w){throw console.error(`[campaign ${e}] phase\u2463 done \u6807\u8BB0\u5931\u8D25:`,w?.message??w),w}return console.log(`[campaign ${e}] \u5B8C\u6210\uFF1A${u} \u6210\u529F / ${c} \u5931\u8D25\uFF08\u5171 ${s.total}\uFF09`),(async()=>{try{let{manager:w}=await Promise.resolve().then(()=>(Se(),Ee)),y=0;for(let k of f){let[_]=await t.query.from("sandboxes").select("id","app_id").where({department_id:{eq:k.dept_id},status:{eq:"running"}}).limit(1).run();_&&(await w.stop(String(_.id),String(_.app_id)).catch(()=>({ok:!1})))?.ok&&y++}console.log(`[campaign ${e}] \u6279\u6536\u5C3E\uFF1A${y} \u4E2A\u89D2\u8272\u6C99\u76D2\u5DF2\u505C\u6B62\uFF08\u8D44\u6E90\u91CA\u653E\uFF09`)}catch{}})(),!0}return!1}async function v0(n){return(await n.orm.query.update("survey_campaigns").set({status:"interrupted",updated_at:G.now()}).where({status:{eq:"running"}}).returning("id").run()??[]).length}var ww,h0,_w,zc,Fc,Vc,_t=N(()=>{"use strict";re();nt();ww=5e3,h0=18e4,_w=2,zc=10;Fc=new Set;Vc=new Set});var Vh={};ie(Vh,{BUILTIN_TOOL_DEFS:()=>un,registerBuiltinTools:()=>Zc});function Zc(n){fh({search_knowledge_base:async(e,t)=>{let r=n(),s=String(e.query??""),i=Math.min(20,Math.max(1,Number(e.top_k??5)));if(!s)return"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD";let{searchKnowledgeBase:o}=await Promise.resolve().then(()=>(wh(),hh));return o(r,s,i,t?.agentId!=null?String(t.agentId):null)},generate_image:async(e,t)=>{let r=n(),{generateImage:s}=await Promise.resolve().then(()=>(vh(),_h));return s(r,{prompt:String(e.prompt??""),size:e.size!=null?String(e.size):void 0,filename:e.filename!=null?String(e.filename):void 0,departmentId:t?.departmentId!=null?String(t.departmentId):void 0})},generate_video:async(e,t)=>{let r=n(),{createVideoTask:s}=await Promise.resolve().then(()=>(Ni(),Pi));return`\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u5DF2\u63D0\u4EA4\uFF08task_id=${(await s(r,{prompt:String(e.prompt??""),resolution:e.resolution!=null?String(e.resolution):void 0,ratio:e.ratio!=null?String(e.ratio):void 0,duration:e.duration!=null?Number(e.duration):void 0,watermark:e.watermark!=null?e.watermark===!0:void 0,filename:e.filename!=null?String(e.filename):void 0,departmentId:t?.departmentId!=null?String(t.departmentId):void 0,agentId:t?.agentId!=null?String(t.agentId):void 0})).taskId}\uFF09\u2014\u2014\u751F\u6210\u4E2D\u7EA6 1-5 \u5206\u949F\u2014\u2014\u5B8C\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\u3002\u7528 video_generation_status \u67E5\u8BE2\u8FDB\u5EA6`},video_generation_status:async e=>{let t=n(),r=String(e.task_id??"");if(!r)return"Error: task_id \u5FC5\u586B";let{getVideoTask:s,describeVideoTask:i}=await Promise.resolve().then(()=>(Ni(),Pi)),o=await s(t,r);return o?i(o):`Error: \u89C6\u9891\u4EFB\u52A1 ${r} \u4E0D\u5B58\u5728\u6216\u65E0\u6743\u9650\u8BBF\u95EE`},get_current_time:async e=>new Date().toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",year:"numeric",month:"long",day:"numeric",weekday:"long",hour:"2-digit",minute:"2-digit",second:"2-digit"}),call_agent:async(e,t)=>{let r=n(),s=String(e.agent??""),i=String(e.message??"");return!s||!i?"Error: call_agent \u9700\u8981 agent \u548C message \u53C2\u6570":Jc(r,s,i,t)},plan_tasks:async(e,t)=>{let r=n(),s=Array.isArray(e.tasks)?e.tasks:[];if(s.length===0)return"Error: plan_tasks \u9700\u8981 tasks \u6570\u7EC4\uFF08\u81F3\u5C11 1 \u4E2A\u5B50\u4EFB\u52A1\uFF09";let o=s.slice(0,3).filter(p=>{let m=p;return String(m.agent??"")&&String(m.message??"")});if(o.length===0)return"Error: \u5B50\u4EFB\u52A1\u5FC5\u987B\u5305\u542B agent \u548C message \u5B57\u6BB5";let a="";try{let{createOrchestrationRun:p}=await Promise.resolve().then(()=>(uc(),lc));a=await p(r,{appId:r.appId,departmentId:String(t?.departmentId??""),orchestratorId:String(t?.agentId??""),plan:o.map(m=>{let h=m;return{agent:String(h.agent),message:String(h.message).slice(0,500)}}),requestId:r.requestId})}catch{}let l=p=>p.startsWith("Error:")&&(p.includes("\u8C03\u7528 Agent")||p.includes("\u6267\u884C\u5F02\u5E38")),u=async p=>{let m=await Jc(r,p.agent,p.message,t);return l(m)&&(m=await Jc(r,p.agent,p.message,t)),m},c=await Promise.allSettled(o.map(p=>{let m=p;return u({agent:String(m.agent),message:String(m.message)})})),d=c.map((p,m)=>{let h=o[m],f=String(h.agent??"\u5B50\u4EFB\u52A1");if(p.status==="fulfilled"){let g=String(p.value??"");return g.startsWith("Error:")?{agent:f,status:"error",error:g.slice(0,300)}:{agent:f,status:"ok",result:g.slice(0,500)}}return{agent:f,status:"error",error:String(p.reason?.message??"\u672A\u77E5").slice(0,300)}});if(a)try{let{finishOrchestrationRun:p}=await Promise.resolve().then(()=>(uc(),lc)),m=d.filter(h=>h.status==="error").length;await p(r,{runId:a,status:m===0?"done":m===d.length?"failed":"partial",workers:d})}catch{}return c.map((p,m)=>{let h=o[m],f=String(h.agent??"\u5B50\u4EFB\u52A1");return p.status==="fulfilled"?p.value:`Error: \u5B50\u4EFB\u52A1\u300C${f}\u300D\u6267\u884C\u5F02\u5E38: ${String(p.reason?.message??"\u672A\u77E5\u9519\u8BEF")}`}).join(`
324
+ \u6CE8\u610F\uFF1A\u53EA\u6709\u9875\u9762\u51FA\u73B0\u300C\u5DF2\u63D0\u4EA4\u300D\u9501\u5B9A\u6001\u624D\u7B97\u5B8C\u6210\u2014\u2014\u63D0\u4EA4\u6210\u529F\u524D\u4E0D\u5F97\u62A5\u544A\u5B8C\u6210\u3002`;(async()=>{try{let{handleNewMessageStream:A}=await Promise.resolve().then(()=>(Wn(),Lr));await A(n,k.dept_id,b,S,`campaign-${e}-${k.agent_id}`)}catch(A){console.error(`[campaign ${e}] \u6D3E\u5355\u5931\u8D25 ${k.agent_name}:`,A?.message??A),await r.survey_campaign_runs.update({status:"failed",finished_at:Q.now(),error:String(A?.message??"\u6D3E\u5355\u5931\u8D25").slice(0,300)}).where({id:{eq:String(k.id)}}).run().catch(()=>{})}})();try{await r.survey_campaign_runs.update({status:"running",started_at:Q.now()}).where({id:{eq:String(k.id)}}).run()}catch(A){throw console.error(`[campaign ${e}] phase\u2462 \u6807 running \u5931\u8D25\uFF08run=${k.id}\uFF09:`,A?.message??A),A}}}try{await r.survey_campaigns.update({completed:Math.min(u,Number(s.total)),failed:Math.min(c,Number(s.total)),updated_at:Q.now()}).where({id:{eq:e}}).run()}catch(h){throw console.error(`[campaign ${e}] phase\u2463 \u8BB0\u8D26\u5931\u8D25\uFF08completed=${u} failed=${c}\uFF09:`,h?.message??h),h}if(Sw({total:Number(s.total),completed:u,failed:c},m.filter(h=>h.status==="running").length)){try{await r.survey_campaigns.update({status:"done",updated_at:Q.now()}).where({id:{eq:e}}).run()}catch(h){throw console.error(`[campaign ${e}] phase\u2463 done \u6807\u8BB0\u5931\u8D25:`,h?.message??h),h}return console.log(`[campaign ${e}] \u5B8C\u6210\uFF1A${u} \u6210\u529F / ${c} \u5931\u8D25\uFF08\u5171 ${s.total}\uFF09`),(async()=>{try{let{manager:h}=await Promise.resolve().then(()=>(Se(),Te)),b=0;for(let k of m){let[_]=await t.query.from("sandboxes").select("id","app_id").where({department_id:{eq:k.dept_id},status:{eq:"running"}}).limit(1).run();_&&(await h.stop(String(_.id),String(_.app_id)).catch(()=>({ok:!1})))?.ok&&b++}console.log(`[campaign ${e}] \u6279\u6536\u5C3E\uFF1A${b} \u4E2A\u89D2\u8272\u6C99\u76D2\u5DF2\u505C\u6B62\uFF08\u8D44\u6E90\u91CA\u653E\uFF09`)}catch{}})(),!0}return!1}async function b0(n){return(await n.orm.query.update("survey_campaigns").set({status:"interrupted",updated_at:Q.now()}).where({status:{eq:"running"}}).returning("id").run()??[]).length}var bw,f0,kw,Qc,Kc,Gc,_t=I(()=>{"use strict";re();nt();bw=5e3,f0=18e4,kw=2,Qc=10;Kc=new Set;Gc=new Set});var Kh={};ie(Kh,{BUILTIN_TOOL_DEFS:()=>un,registerBuiltinTools:()=>ed});function ed(n){hh({search_knowledge_base:async(e,t)=>{let r=n(),s=String(e.query??""),o=Math.min(20,Math.max(1,Number(e.top_k??5)));if(!s)return"\u8BF7\u63D0\u4F9B\u641C\u7D22\u5173\u952E\u8BCD";let{searchKnowledgeBase:i}=await Promise.resolve().then(()=>(bh(),yh));return i(r,s,o,t?.agentId!=null?String(t.agentId):null)},generate_image:async(e,t)=>{let r=n(),{generateImage:s}=await Promise.resolve().then(()=>(Sh(),kh));return s(r,{prompt:String(e.prompt??""),size:e.size!=null?String(e.size):void 0,filename:e.filename!=null?String(e.filename):void 0,departmentId:t?.departmentId!=null?String(t.departmentId):void 0})},generate_video:async(e,t)=>{let r=n(),{createVideoTask:s}=await Promise.resolve().then(()=>($i(),Mi));return`\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u5DF2\u63D0\u4EA4\uFF08task_id=${(await s(r,{prompt:String(e.prompt??""),resolution:e.resolution!=null?String(e.resolution):void 0,ratio:e.ratio!=null?String(e.ratio):void 0,duration:e.duration!=null?Number(e.duration):void 0,watermark:e.watermark!=null?e.watermark===!0:void 0,filename:e.filename!=null?String(e.filename):void 0,departmentId:t?.departmentId!=null?String(t.departmentId):void 0,agentId:t?.agentId!=null?String(t.agentId):void 0})).taskId}\uFF09\u2014\u2014\u751F\u6210\u4E2D\u7EA6 1-5 \u5206\u949F\u2014\u2014\u5B8C\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\u3002\u7528 video_generation_status \u67E5\u8BE2\u8FDB\u5EA6`},video_generation_status:async e=>{let t=n(),r=String(e.task_id??"");if(!r)return"Error: task_id \u5FC5\u586B";let{getVideoTask:s,describeVideoTask:o}=await Promise.resolve().then(()=>($i(),Mi)),i=await s(t,r);return i?o(i):`Error: \u89C6\u9891\u4EFB\u52A1 ${r} \u4E0D\u5B58\u5728\u6216\u65E0\u6743\u9650\u8BBF\u95EE`},get_current_time:async e=>new Date().toLocaleString("zh-CN",{timeZone:"Asia/Shanghai",year:"numeric",month:"long",day:"numeric",weekday:"long",hour:"2-digit",minute:"2-digit",second:"2-digit"}),call_agent:async(e,t)=>{let r=n(),s=String(e.agent??""),o=String(e.message??"");return!s||!o?"Error: call_agent \u9700\u8981 agent \u548C message \u53C2\u6570":Yc(r,s,o,t)},plan_tasks:async(e,t)=>{let r=n(),s=Array.isArray(e.tasks)?e.tasks:[];if(s.length===0)return"Error: plan_tasks \u9700\u8981 tasks \u6570\u7EC4\uFF08\u81F3\u5C11 1 \u4E2A\u5B50\u4EFB\u52A1\uFF09";let i=s.slice(0,3).filter(p=>{let f=p;return String(f.agent??"")&&String(f.message??"")});if(i.length===0)return"Error: \u5B50\u4EFB\u52A1\u5FC5\u987B\u5305\u542B agent \u548C message \u5B57\u6BB5";let a="";try{let{createOrchestrationRun:p}=await Promise.resolve().then(()=>(pc(),dc));a=await p(r,{appId:r.appId,departmentId:String(t?.departmentId??""),orchestratorId:String(t?.agentId??""),plan:i.map(f=>{let w=f;return{agent:String(w.agent),message:String(w.message).slice(0,500)}}),requestId:r.requestId})}catch{}let l=p=>p.startsWith("Error:")&&(p.includes("\u8C03\u7528 Agent")||p.includes("\u6267\u884C\u5F02\u5E38")),u=async p=>{let f=await Yc(r,p.agent,p.message,t);return l(f)&&(f=await Yc(r,p.agent,p.message,t)),f},c=await Promise.allSettled(i.map(p=>{let f=p;return u({agent:String(f.agent),message:String(f.message)})})),d=c.map((p,f)=>{let w=i[f],m=String(w.agent??"\u5B50\u4EFB\u52A1");if(p.status==="fulfilled"){let g=String(p.value??"");return g.startsWith("Error:")?{agent:m,status:"error",error:g.slice(0,300)}:{agent:m,status:"ok",result:g.slice(0,500)}}return{agent:m,status:"error",error:String(p.reason?.message??"\u672A\u77E5").slice(0,300)}});if(a)try{let{finishOrchestrationRun:p}=await Promise.resolve().then(()=>(pc(),dc)),f=d.filter(w=>w.status==="error").length;await p(r,{runId:a,status:f===0?"done":f===d.length?"failed":"partial",workers:d})}catch{}return c.map((p,f)=>{let w=i[f],m=String(w.agent??"\u5B50\u4EFB\u52A1");return p.status==="fulfilled"?p.value:`Error: \u5B50\u4EFB\u52A1\u300C${m}\u300D\u6267\u884C\u5F02\u5E38: ${String(p.reason?.message??"\u672A\u77E5\u9519\u8BEF")}`}).join(`
325
325
 
326
- `)},survey_campaign_start:async e=>{let t=n(),r=Math.max(1,Number(e.total??0)||10),s=Math.max(1,Number(e.concurrency??0)||5),i=e.url?String(e.url):"",o=Number(e.retry??0),{createCampaign:a}=await Promise.resolve().then(()=>(_t(),Pt)),l=await a(t,{total:r,concurrency:s,url:i,retry:o||void 0});return`\u95EE\u5377\u4EFB\u52A1\u5DF2\u542F\u52A8\uFF08id=${l.campaign.id}\uFF09\u2014\u2014\u603B\u91CF ${l.campaign.total} \xB7 \u5E76\u53D1 ${l.campaign.concurrency}\u3002\u7528 survey_campaign_status \u67E5\u8BE2\u8FDB\u5EA6\uFF1B\u5B8C\u6210\u540E\u53EF\u7528 survey_campaign_retry \u91CD\u8DD1\u5931\u8D25\u89D2\u8272\u3002`},survey_campaign_status:async e=>{let t=n(),r=String(e.campaign_id??"");if(!r)return"Error: campaign_id \u5FC5\u586B";let{getCampaign:s}=await Promise.resolve().then(()=>(_t(),Pt)),i=await s(t,r);if(!i)return`Error: campaign ${r} \u4E0D\u5B58\u5728`;let{campaign:o,runs:a}=i,l=a.filter(u=>u.status==="failed");return`\u95EE\u5377\u4EFB\u52A1 ${r.slice(0,8)}\uFF1A\u72B6\u6001 ${o.status} \xB7 \u5B8C\u6210 ${o.completed}/${o.total} \xB7 \u5931\u8D25 ${o.failed} \xB7 \u5728\u7EBF ${a.filter(u=>u.status==="running").length} \xB7 \u6392\u961F ${a.filter(u=>u.status==="queued").length}`+(l.length>0?`
327
- \u5931\u8D25\u6E05\u5355\uFF1A${l.map(u=>`${u.agent_name}\uFF08${u.error??"\u8D85\u65F6"}\uFF09`).join("\uFF1B")}\u2014\u2014\u53EF survey_campaign_retry \u91CD\u8DD1`:"")},survey_campaign_retry:async e=>{let t=n(),r=String(e.campaign_id??"");if(!r)return"Error: campaign_id \u5FC5\u586B";let{retryCampaign:s,getCampaign:i}=await Promise.resolve().then(()=>(_t(),Pt)),o=await i(t,r);return o?(await s(t,r),`\u5DF2\u91CD\u8DD1\u5931\u8D25\u89D2\u8272\uFF08campaign ${r.slice(0,8)}\u2014\u2014\u5931\u8D25 ${o.campaign.failed} \u4E2A\u5DF2\u91CD\u65B0\u6392\u961F\uFF09\u2014\u2014\u7528 survey_campaign_status \u8DDF\u8E2A`):`Error: campaign ${r} \u4E0D\u5B58\u5728`},create_workflow:async(e,t)=>{let r=n(),s=String(e.name??"").trim(),i=String(e.wfjs??"").trim();if(!s||!i)return"Error: create_workflow \u9700\u8981 name \u548C wfjs \u53C2\u6570";let o=await Qc(r,t);if(!o)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09\u2014\u2014\u8BF7\u5728\u4E0E\u5E94\u7528\u7ED1\u5B9A\u7684\u5BF9\u8BDD\u4E2D\u521B\u5EFA";try{let a=r.wf;if(!a?.crud)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316\uFF08wf \u672A\u6CE8\u5165\u2014\u2014ctx keys: "+Object.keys(r??{}).join(",")+"\uFF09";let l=await a.crud.create(o,{name:s,description:e.description?String(e.description).trim():"",wfjs:i});return JSON.stringify({id:l.id,name:l.name,status:l.status,wfjs:a.defToWfjs(l.def_json)})}catch(a){return`Error: \u5DE5\u4F5C\u6D41\u521B\u5EFA\u5931\u8D25\u2014\u2014${String(a?.message??a).slice(0,400)}\uFF08wfjs \u8BED\u6CD5\u9519\u8BEF\u53EF\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF09`}},list_workflows:async(e,t)=>{let r=n(),s=await Qc(r,t);if(!s)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09";try{let i=r.wf;if(!i?.crud)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316";let o=await i.crud.list(s,{limit:Math.min(50,Number(e.limit??20)||20)});return o.length===0?"\u5F53\u524D\u5E94\u7528\u6682\u65E0\u5DE5\u4F5C\u6D41\u2014\u2014\u53EF\u7528 create_workflow \u521B\u5EFA":JSON.stringify(o.map(a=>({id:a.id,name:a.name,status:a.status,updatedAt:a.updated_at})))}catch(i){return`Error: ${String(i?.message??i).slice(0,300)}`}},run_workflow:async(e,t)=>{let r=n(),s=String(e.workflow_id??"").trim();if(!s)return"Error: run_workflow \u9700\u8981 workflow_id";let i={},o=String(e.args??"").trim();if(o&&o!=="{}")try{i=JSON.parse(o)}catch{return"Error: args \u4E0D\u662F\u5408\u6CD5 JSON \u5BF9\u8C61"}let a=await Qc(r,t);if(!a)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09";try{let l=r.wf;if(!l?.execute)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316";let u=await l.execute(a,s,i,"chat");return JSON.stringify({status:u.status,error:u.error,result:(typeof u.result_json=="object",u.result_json)}).slice(0,3e3)}catch(l){return`Error: \u6267\u884C\u5931\u8D25\u2014\u2014${String(l?.message??l).slice(0,400)}`}}})}async function Qc(n,e){let t=e?.agentId!=null?String(e.agentId):null;if(t)try{let[r]=await n.orm.query.from("agents").select("app_id").where({id:t}).limit(1).run();if(r?.app_id)return String(r.app_id)}catch{}return String(n.auth?.appId??n.appId??"")}async function Jc(n,e,t,r){if(!e||!t)return"Error: \u59D4\u6258\u9700\u8981 agent \u548C message \u53C2\u6570";let s=String(r?.agentId??""),i="\u672A\u77E5\u540C\u4E8B";if(s){let h=await n.orm.query.from("agents").select("name").where({id:{eq:s}}).limit(1).run();h[0]&&(i=String(h[0].name))}let o=`[\u6765\u81EA ${i} \u7684\u59D4\u6258] ${t}`,a=Number(n._agentDepth??0),l=2;if(a>=l)return`Error: Agent \u534F\u4F5C\u6DF1\u5EA6\u8D85\u9650\uFF08\u6700\u591A ${l} \u5C42\uFF09\u2014\u2014\u8BF7\u76F4\u63A5\u56DE\u7B54\u800C\u975E\u7EE7\u7EED\u59D4\u6258`;let c=(await n.orm.query.from("agents").select().where({app_id:{eq:String(n.appId)},type:{in:["ai","department"]},is_active:{eq:!0}}).run()).find(h=>String(h.name)===String(e)||String(h.id)===String(e));if(!c)return`Error: \u627E\u4E0D\u5230\u53EF\u8C03\u7528\u7684 AI Agent\u300C${e}\u300D\uFF08\u9700\u540C\u79DF\u6237\u4E14\u5DF2\u6FC0\u6D3B\uFF09`;let d=c;if(String(d.id)===String(r?.agentId??""))return"Error: \u4E0D\u80FD\u8C03\u7528\u81EA\u5DF1\uFF08\u5FAA\u73AF\uFF09";let p=String(r?.departmentId??"");try{let[h]=await n.orm.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where({"dm.agent_id":d.id,"d.is_dm":{eq:!1}}).limit(1).run();h?.department_id&&(p=String(h.department_id))}catch{}let{runAgent:m}=await Promise.resolve().then(()=>(Wi(),Fh));n._agentDepth=a+1;try{let h=await m(n,{agentId:String(d.id),appId:n.appId,departmentId:p,systemPrompt:String(d.system_prompt??"\u4F60\u662F\u4E00\u4E2A AI \u52A9\u624B"),model:d.model?String(d.model):void 0,tools:d.tools??[],maxSteps:3,humanInTheLoop:!!d.human_in_the_loop,workspacePath:d.workspace_path?String(d.workspace_path):void 0,allowFileTools:!!d.allow_file_tools,allowCommandExec:!!d.allow_command_exec,allowNetwork:!!d.allow_network},[{role:"user",content:o}]);return`[${String(d.name)} \u7684\u56DE\u590D]
328
- ${h.content}`}catch(h){return`Error: \u8C03\u7528 Agent\u300C${String(d.name)}\u300D\u5931\u8D25: ${h?.message??"\u672A\u77E5\u9519\u8BEF"}`}finally{n._agentDepth=a}}var un,Us=N(()=>{"use strict";oc();un=[{type:"function",function:{name:"search_knowledge_base",description:"\u4ECE Agent \u7ED1\u5B9A\u7684\u77E5\u8BC6\u5E93\u4E2D\u68C0\u7D22\u76F8\u5173\u4FE1\u606F\u3002\u5F53\u7528\u6237\u95EE\u9898\u6D89\u53CA\u6587\u6863\u3001\u4EA7\u54C1\u624B\u518C\u3001FAQ \u7B49\u5185\u5BB9\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{query:{type:"string",description:"\u641C\u7D22\u5173\u952E\u8BCD\u6216\u95EE\u9898\u63CF\u8FF0"},top_k:{type:"number",description:"\u8FD4\u56DE\u7ED3\u679C\u6570\u91CF\uFF0C\u9ED8\u8BA4 5"}},required:["query"]}}},{type:"function",function:{name:"generate_image",description:"\u6839\u636E\u6587\u5B57\u63CF\u8FF0\u751F\u6210\u56FE\u7247\uFF08z-image-turbo \u6587\u751F\u56FE\u6A21\u578B\uFF09\u3002\u751F\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08/ws\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09\u3002\u7528\u6237\u8981\u6C42\u753B\u56FE/\u914D\u56FE/\u6D77\u62A5\u7075\u611F\u7B49\u573A\u666F\u4F7F\u7528\u3002",parameters:{type:"object",properties:{prompt:{type:"string",description:"\u56FE\u7247\u8BE6\u7EC6\u63CF\u8FF0\u2014\u2014\u4E3B\u4F53/\u98CE\u683C/\u6784\u56FE/\u5149\u7EBF/\u989C\u8272\uFF08\u8D8A\u5177\u4F53\u6548\u679C\u8D8A\u597D\uFF09"},size:{type:"string",description:'\u5C3A\u5BF8 "\u5BBD*\u9AD8"\uFF0C\u9ED8\u8BA4 "1024*1024"'},filename:{type:"string",description:"\u4FDD\u5B58\u6587\u4EF6\u540D\uFF08\u5982 logo.png\uFF09\u2014\u2014\u7559\u7A7A\u81EA\u52A8\u547D\u540D"}},required:["prompt"]}}},{type:"function",function:{name:"generate_video",description:"\u6839\u636E\u6587\u5B57\u63CF\u8FF0\u751F\u6210\u89C6\u9891\uFF08HappyHorse \u6587\u751F\u89C6\u9891\u6A21\u578B\u2014\u2014\u963F\u91CC\u4E91\u767E\u70BC\u5F02\u6B65\u4EFB\u52A1\uFF09\u3002\u63D0\u4EA4\u540E\u7EA6 1-5 \u5206\u949F\u751F\u6210\u5B8C\u6210\uFF0C\u5B8C\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08/ws\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09\u3002\u63D0\u4EA4\u7ACB\u5373\u8FD4\u56DE\u4EFB\u52A1 ID\u2014\u2014\u7528 video_generation_status \u67E5\u8BE2\u8FDB\u5C55\u3002\u7528\u6237\u8981\u6C42\u751F\u6210\u89C6\u9891/\u5BA3\u4F20\u7247/\u52A8\u753B/\u52A8\u6001\u753B\u9762\u7B49\u573A\u666F\u4F7F\u7528\u3002",parameters:{type:"object",properties:{prompt:{type:"string",description:"\u89C6\u9891\u5185\u5BB9\u8BE6\u7EC6\u63CF\u8FF0\u2014\u2014\u4E3B\u4F53/\u573A\u666F/\u8FD0\u52A8/\u98CE\u683C/\u955C\u5934\uFF08\u8D8A\u5177\u4F53\u6548\u679C\u8D8A\u597D\uFF0C\u22645000 \u5B57\u7B26\uFF09"},resolution:{type:"string",description:"\u5206\u8FA8\u7387\uFF1A480P/720P/1080P\uFF08\u9ED8\u8BA4 1080P\uFF09"},ratio:{type:"string",description:"\u5BBD\u9AD8\u6BD4\uFF1A16:9\uFF08\u9ED8\u8BA4\uFF09/9:16/1:1/4:3/3:4/4:5/5:4/9:21/21:9"},duration:{type:"number",description:"\u89C6\u9891\u65F6\u957F\uFF08\u79D2\uFF0C3-15\uFF0C\u9ED8\u8BA4 5\uFF09"},filename:{type:"string",description:"\u4FDD\u5B58\u6587\u4EF6\u540D\uFF08\u5982 promo.mp4\uFF09\u2014\u2014\u7559\u7A7A\u81EA\u52A8\u547D\u540D"}},required:["prompt"]}}},{type:"function",function:{name:"video_generation_status",description:"\u67E5\u8BE2\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u8FDB\u5EA6\uFF08generate_video \u8FD4\u56DE\u7684 task_id\uFF09\u3002\u751F\u6210\u5B8C\u6210\u8FD4\u56DE\u5DF2\u4FDD\u5B58\u5230 /ws \u7684\u8DEF\u5F84\uFF1B\u5931\u8D25\u8FD4\u56DE\u539F\u56E0\u3002\u7528\u6237\u5728\u8BE2\u95EE\u300C\u89C6\u9891\u751F\u6210\u597D\u4E86\u5417/\u8FDB\u5EA6\u5982\u4F55\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{task_id:{type:"string",description:"generate_video \u8FD4\u56DE\u7684\u4EFB\u52A1 ID"}},required:["task_id"]}}},{type:"function",function:{name:"get_current_time",description:"\u83B7\u53D6\u5F53\u524D\u65E5\u671F\u548C\u65F6\u95F4\uFF0C\u5F53\u7528\u6237\u8BE2\u95EE\u65F6\u95F4\u65F6\u4F7F\u7528",parameters:{type:"object",properties:{}}}},{type:"function",function:{name:"call_agent",description:"\u8C03\u7528\u540C\u79DF\u6237\u7684\u53E6\u4E00\u4E2A AI Agent \u5904\u7406\u4EFB\u52A1\uFF08\u4F20\u5165\u5176\u540D\u79F0\u6216 ID + \u4EFB\u52A1\u63CF\u8FF0\uFF09\uFF0C\u8FD4\u56DE\u8BE5 Agent \u7684\u56DE\u590D\u3002\u7528\u4E8E\u4E13\u4E1A\u5206\u5DE5\uFF1A\u628A\u5B50\u4EFB\u52A1\u59D4\u6258\u7ED9\u64C5\u957F\u8BE5\u9886\u57DF\u7684 Agent\uFF08\u5982\u6570\u636E\u5206\u6790/\u5BA2\u670D\uFF09\u3002",parameters:{type:"object",properties:{agent:{type:"string",description:"\u76EE\u6807 Agent \u540D\u79F0\u6216 ID\uFF08\u540C\u79DF\u6237\u7684 ai \u7C7B\u578B Agent\uFF09"},message:{type:"string",description:"\u59D4\u6258\u7ED9\u8BE5 Agent \u7684\u4EFB\u52A1\u63CF\u8FF0"}},required:["agent","message"]}}},{type:"function",function:{name:"plan_tasks",description:"\u5C06\u590D\u6742\u4EFB\u52A1\u62C6\u89E3\u4E3A\u6700\u591A 3 \u4E2A\u5B50\u4EFB\u52A1\u5E76\u5E76\u884C\u5206\u6D3E\u7ED9\u4E13\u4E1A Agent \u6267\u884C\u2014\u2014\u6BCF\u4E2A\u5B50\u4EFB\u52A1\u6307\u5B9A\u76EE\u6807 Agent\uFF08\u540D\u79F0\u6216 ID\uFF09+ \u53EF\u6267\u884C\u4EFB\u52A1\u63CF\u8FF0\u3002\u9002\u5408\u591A\u76EE\u6807/\u591A\u6587\u4EF6\u4EA7\u51FA/\u591A\u6B65\u8C03\u7814\u7C7B\u4EFB\u52A1\uFF08\u5982\u300C\u5206\u6790\u6570\u636E\u5E76\u5199\u62A5\u544A\u300D\uFF09\uFF1B\u7B80\u5355\u4EFB\u52A1\u4E0D\u8981\u7528\uFF08\u76F4\u63A5\u56DE\u7B54\u2014\u2014\u62C6\u89E3\u6D6A\u8D39 token \u4E0E\u5EF6\u8FDF\uFF09\u3002\u8FD4\u56DE\u5404\u5B50\u4EFB\u52A1\u7684\u56DE\u590D\uFF08\u5E26\u6765\u6E90\u6807\u6CE8\uFF09\u3002",parameters:{type:"object",properties:{tasks:{type:"array",description:"\u5B50\u4EFB\u52A1\u6E05\u5355\uFF08\u6700\u591A 3 \u4E2A\u2014\u2014\u8D85\u51FA\u622A\u65AD\uFF09",items:{type:"object",properties:{agent:{type:"string",description:"\u76EE\u6807 Agent \u540D\u79F0\u6216 ID\uFF08\u540C\u79DF\u6237 ai \u7C7B\u578B\u2014\u2014\u4E13\u4E1A\u5206\u5DE5\uFF1A\u6570\u636E\u5206\u6790/\u5BA2\u670D/\u6587\u6863\u7B49\uFF09"},message:{type:"string",description:"\u5B50\u4EFB\u52A1\u63CF\u8FF0\uFF08\u5177\u4F53\u5230\u53EF\u6267\u884C\u2014\u2014\u542B\u5FC5\u8981\u4E0A\u4E0B\u6587\u2014\u2014\u62C6\u89E3\u8D28\u91CF\u51B3\u5B9A\u7ED3\u679C\u8D28\u91CF\uFF09"}},required:["agent","message"]}}},required:["tasks"]}}},{type:"function",function:{name:"survey_campaign_start",description:"\u542F\u52A8\u6279\u91CF\u95EE\u5377\u586B\u5199\u4EFB\u52A1\uFF08Campaign\uFF09\u2014\u2014\u6309\u4EBA\u8BBE\u89D2\u8272\u6C60\u6279\u91CF\u6D3E\u5355 AI \u586B\u5199\u95EE\u5377\uFF08\u6C34\u4F4D\u5E76\u53D1\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u72EC\u7ACB\u6C99\u76D2\uFF09\u3002\u5F53\u7528\u6237\u8981\u6C42\u300C\u8BA9 N \u4E2A/\u4E00\u6279 AI \u673A\u5668\u4EBA\u586B\u5199\u95EE\u5377\u300D\u300C\u6A21\u62DF N \u4EBA\u586B\u95EE\u5377\u300D\u65F6\u4F7F\u7528\u3002\u603B\u91CF\u4E0E\u5E76\u53D1\u53EF\u914D\u7F6E\u3002",parameters:{type:"object",properties:{total:{type:"number",description:"\u586B\u5199\u603B\u91CF\uFF08\u89D2\u8272\u6570\u2014\u2014\u5982 1000\uFF09"},concurrency:{type:"number",description:"\u540C\u65F6\u5728\u7EBF\u586B\u5199\u6570\uFF08\u5E76\u53D1\u4E0A\u9650\u2014\u2014\u9ED8\u8BA4 5\u2014\u2014\u670D\u52A1\u5C42\u786C\u4E0A\u9650 10\uFF082027-09 \u5B9A\u53C2\uFF1A\u8BD5\u70B9 100 @10 \u5DF2\u5B9E\u6D4B 0 \u5931\u8D25\u2014\u201420 \u5224\u8D1F\u4E0D\u505A\uFF09\uFF09"},url:{type:"string",description:"\u95EE\u5377 URL\uFF08\u7F3A\u7701\u7528\u5E73\u53F0\u9ED8\u8BA4\u95EE\u5377\u9875\uFF09"},retry:{type:"number",description:"\u5931\u8D25\u91CD\u8BD5\u6B21\u6570\uFF08\u9ED8\u8BA4 2\uFF09"}},required:["total","concurrency"]}}},{type:"function",function:{name:"survey_campaign_status",description:"\u67E5\u770B\u6279\u91CF\u95EE\u5377\u4EFB\u52A1\u8FDB\u5EA6\uFF08\u5B8C\u6210\u6570/\u5931\u8D25\u6570/\u5728\u7EBF/\u5931\u8D25\u6E05\u5355\uFF09\u3002\u7528\u6237\u5728\u8BE2\u95EE\u300C\u586B\u5230\u54EA\u4E86/\u8FDB\u5EA6\u5982\u4F55/\u5B8C\u6210\u4E86\u5417\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{campaign_id:{type:"string",description:"\u4EFB\u52A1 ID\uFF08\u542F\u52A8\u65F6\u8FD4\u56DE\uFF09"}},required:["campaign_id"]}}},{type:"function",function:{name:"survey_campaign_retry",description:"\u91CD\u8DD1\u6279\u91CF\u95EE\u5377\u4EFB\u52A1\u7684\u5931\u8D25\u89D2\u8272\uFF08\u91CD\u65B0\u6D3E\u5355\u2014\u2014attempts \u6E05\u96F6\uFF09\u3002\u7528\u6237\u8BF4\u300C\u91CD\u8DD1\u5931\u8D25\u7684/\u5931\u8D25\u7684\u518D\u586B\u4E00\u6B21\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{campaign_id:{type:"string",description:"\u4EFB\u52A1 ID"}},required:["campaign_id"]}}},{type:"function",function:{name:"create_workflow",description:"\u7528 wfjs \u8BED\u8A00\u521B\u5EFA\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\uFF08\u58F0\u660E\u5F0F\u6B65\u9AA4\u5E8F\u5217\u2014\u2014HTTP \u8BF7\u6C42/\u65E5\u5FD7/\u6761\u4EF6\u5206\u652F/\u5FAA\u73AF\uFF09\u3002\u521B\u5EFA\u5373\u7F16\u8BD1\u6821\u9A8C\u2014\u2014\u8BED\u6CD5\u9519\u8BEF\u4F1A\u8FD4\u56DE\u9519\u8BEF\uFF08\u53EF\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF09\u3002wfjs \u4E0E JS \u8BED\u6CD5\u5BF9\u9F50\uFF1Aconst \u540D = await http({ url: 'https://\u2026' }) \u53D1\u8BF7\u6C42\uFF1Bconst \u540D = \u8868\u8FBE\u5F0F\uFF08\u53EF\u8BFB\u54CD\u5E94\u5B57\u6BB5 res.json.x\uFF09\uFF1Bif (\u6761\u4EF6) { await log({ message: `\u6587\u672C ${\u53D8\u91CF} \u4EF6` }) }\uFF1Bfor (const \u9879 of \u5217\u8868) {}\uFF1B\u53D8\u91CF\u7528 let \u58F0\u660E\u3002\u7528\u6237\u8981\u6C42\u300C\u521B\u5EFA\u5DE5\u4F5C\u6D41/\u81EA\u52A8\u5316\u6D41\u7A0B/\u5B9A\u65F6\u76D1\u63A7/\u81EA\u52A8\u68C0\u67E5\u300D\u65F6\u4F7F\u7528\u2014\u2014\u521B\u5EFA\u540E\u53EF\u7528 run_workflow \u6267\u884C\u9A8C\u8BC1\u3002\u6CE8\u610F\uFF1A\u672C\u73AF\u5883\u63D0\u4F9B\u6F14\u793A\u63A5\u53E3 GET /api/demo/stock?stock=N\uFF08\u8FD4\u56DE { items: [...] }\u2014\u2014items \u662F\u6570\u7EC4\u2014\u2014\u957F\u5EA6\u5373\u7F3A\u8D27\u5546\u54C1\u6570\uFF1BN=0 \u65E0\u7F3A\u8D27\u3001N>0 \u6709 N \u4E2A\uFF09\u2014\u2014\u6F14\u793A/\u6D4B\u8BD5\u5DE5\u4F5C\u6D41\u8BF7\u7528\u5B83\uFF0C\u4E0D\u8981\u7528\u65E0\u6CD5\u8BBF\u95EE\u7684\u793A\u4F8B\u57DF\u540D\u3002",parameters:{type:"object",properties:{name:{type:"string",description:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u2014\u2014\u7B80\u77ED\uFF08\u5982 \u5E93\u5B58\u544A\u8B66\uFF09"},description:{type:"string",description:"\u7528\u9014\u8BF4\u660E\uFF08\u53EF\u9009\u2014\u2014\u5982 \u6BCF\u5C0F\u65F6\u68C0\u67E5\u5E93\u5B58\u5E76\u544A\u8B66\uFF09"},wfjs:{type:"string",description:"wfjs \u6E90\u7801\u2014\u2014\u53C2\u8003\u6A21\u677F\uFF1A\nconst res = await http({ url: 'https://api.example.com/items' })\nconst count = res.json.items.length\nif (count > 0) { await log({ message: `\u7F3A\u8D27 ${count} \u4EF6` }) }"}},required:["name","wfjs"]}}},{type:"function",function:{name:"list_workflows",description:"\u5217\u51FA\u5F53\u524D\u5E94\u7528\u4E0B\u7684\u5DE5\u4F5C\u6D41\uFF08\u540D\u79F0/\u72B6\u6001/\u66F4\u65B0\u65F6\u95F4\uFF09\u3002\u7528\u6237\u95EE\u300C\u6709\u54EA\u4E9B\u5DE5\u4F5C\u6D41/\u81EA\u52A8\u5316\u6D41\u7A0B\u300D\u65F6\u4F7F\u7528\u2014\u2014\u5148\u5217\u51FA\u518D\u6309\u9700 run_workflow\u3002",parameters:{type:"object",properties:{limit:{type:"number",description:"\u8FD4\u56DE\u6761\u6570\uFF08\u9ED8\u8BA4 20\uFF09"}}}}},{type:"function",function:{name:"run_workflow",description:"\u6267\u884C\u5DE5\u4F5C\u6D41\uFF08\u540C\u6B65\u2014\u2014\u8FD4\u56DE\u6BCF\u6B65\u6267\u884C\u7ED3\u679C\uFF1Aexecuted \u987A\u5E8F + stepResults \u503C\uFF09\u3002\u7528\u6237\u8BF4\u300C\u8FD0\u884C/\u6267\u884C/\u8DD1\u4E00\u4E0B\u300D\u67D0\u4E2A\u5DE5\u4F5C\u6D41\u65F6\u4F7F\u7528\uFF1B\u4E5F\u53EF\u5728 create_workflow \u540E\u7ACB\u5373\u6267\u884C\u9A8C\u8BC1\u3002",parameters:{type:"object",properties:{workflow_id:{type:"string",description:"\u5DE5\u4F5C\u6D41 ID\uFF08create_workflow \u8FD4\u56DE\u6216 list_workflows \u67E5\u8BE2\uFF09"},args:{type:"string",description:'\u6267\u884C\u53C2\u6570 JSON \u5BF9\u8C61\u5B57\u7B26\u4E32\uFF08\u5982 {"stock": 3}\uFF09\u2014\u2014\u5DE5\u4F5C\u6D41\u7528 vars.\u53C2\u6570\u540D \u8BFB\u53D6\uFF1B\u65E0\u53C2\u6570\u4F20 {}'}},required:["workflow_id"]}}}]});function Rw(n,e){return n?k0[e].includes(n):!1}var k0,Ew=N(()=>{"use strict";k0={write:["owner","admin","member"],manage:["owner","admin"],tenant:["owner"]}});var cn={};ie(cn,{appRoleOf:()=>Tw,requireDeptManager:()=>x0,requireWriter:()=>S0});async function Tw(n,e){let t=e??n.auth?.userId;if(!t)return null;let r=await n.orm.query.from("_weifuwu_app_members").select("role").where({app_id:{eq:String(n.appId)},user_id:{eq:t}}).limit(1).run();return r[0]?.role?String(r[0].role):null}async function S0(n){let e=await Tw(n);if(!Rw(e,"write")){let t=new Error("\u53EA\u8BFB\u6210\u5458\u65E0\u6743\u6267\u884C\u6B64\u64CD\u4F5C");throw t.status=403,t}}async function x0(n,e){let{auth:t}=n,[r]=await n.orm.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where({"dm.department_id":{eq:e},"ua.user_id":{eq:String(t.userId)}}).limit(1).run(),[s]=await n.orm.query.from("_weifuwu_app_members").select("role").where({app_id:{eq:String(n.appId)},user_id:{eq:String(t.userId)}}).limit(1).run();if((!r||r.role!=="admin")&&s?.role!=="owner"){let i=new Error("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u6267\u884C\u6B64\u64CD\u4F5C");throw i.status=403,i}}var dn=N(()=>{"use strict";Ew()});var rt={};ie(rt,{listAudit:()=>E0,writeAudit:()=>R0});async function R0(n,e){try{await n.orm.query.insert("audit_logs").values({app_id:String(n.appId),user_id:n.user?.id??null,action:e.action,target_type:e.target_type??null,target_id:e.target_id??null,detail:e.detail??null}).run()}catch{}}async function E0(n,e){let t=n.orm,r=Math.min(e.limit??50,100),s=e.offset??0,i={};e.from&&(i.gte=e.from),e.to&&(i.lte=e.to);let o={app_id:{eq:String(n.appId)},...e.action?{action:{eq:e.action}}:{},...Object.keys(i).length?{created_at:i}:{}},a=await t.query.from("audit_logs").select("user_id","action","target_type","target_id","detail","created_at").where(o).orderBy("created_at","desc").limit(r).offset(s).run(),l=[...new Set(a.map(m=>m.user_id?String(m.user_id):"").filter(Boolean))],u=l.length?await t.query.from("_weifuwu_users").select("id","name").where({id:{in:l}}).run():[],c=new Map(u.map(m=>[String(m.id),String(m.name??"")])),d=(a??[]).map(m=>({...m,user_name:m.user_id?c.get(String(m.user_id))??"system":"system"})),[p]=await t.query.from("audit_logs").count("*","total").where(o).run();return{entries:d,total:Number(p?.total??0)}}var st=N(()=>{"use strict"});var Lr={};ie(Lr,{refreshManagerPrompt:()=>C0});function T0(n,e){return`\u4F60\u662F\u300C${n}\u300D\u7684\u90E8\u95E8\u7ECF\u7406\uFF0C\u4EE3\u8868\u8BE5\u90E8\u95E8\u53C2\u4E0E\u534F\u4F5C\u3002
326
+ `)},survey_campaign_start:async e=>{let t=n(),r=Math.max(1,Number(e.total??0)||10),s=Math.max(1,Number(e.concurrency??0)||5),o=e.url?String(e.url):"",i=Number(e.retry??0),{createCampaign:a}=await Promise.resolve().then(()=>(_t(),Pt)),l=await a(t,{total:r,concurrency:s,url:o,retry:i||void 0});return`\u95EE\u5377\u4EFB\u52A1\u5DF2\u542F\u52A8\uFF08id=${l.campaign.id}\uFF09\u2014\u2014\u603B\u91CF ${l.campaign.total} \xB7 \u5E76\u53D1 ${l.campaign.concurrency}\u3002\u7528 survey_campaign_status \u67E5\u8BE2\u8FDB\u5EA6\uFF1B\u5B8C\u6210\u540E\u53EF\u7528 survey_campaign_retry \u91CD\u8DD1\u5931\u8D25\u89D2\u8272\u3002`},survey_campaign_status:async e=>{let t=n(),r=String(e.campaign_id??"");if(!r)return"Error: campaign_id \u5FC5\u586B";let{getCampaign:s}=await Promise.resolve().then(()=>(_t(),Pt)),o=await s(t,r);if(!o)return`Error: campaign ${r} \u4E0D\u5B58\u5728`;let{campaign:i,runs:a}=o,l=a.filter(u=>u.status==="failed");return`\u95EE\u5377\u4EFB\u52A1 ${r.slice(0,8)}\uFF1A\u72B6\u6001 ${i.status} \xB7 \u5B8C\u6210 ${i.completed}/${i.total} \xB7 \u5931\u8D25 ${i.failed} \xB7 \u5728\u7EBF ${a.filter(u=>u.status==="running").length} \xB7 \u6392\u961F ${a.filter(u=>u.status==="queued").length}`+(l.length>0?`
327
+ \u5931\u8D25\u6E05\u5355\uFF1A${l.map(u=>`${u.agent_name}\uFF08${u.error??"\u8D85\u65F6"}\uFF09`).join("\uFF1B")}\u2014\u2014\u53EF survey_campaign_retry \u91CD\u8DD1`:"")},survey_campaign_retry:async e=>{let t=n(),r=String(e.campaign_id??"");if(!r)return"Error: campaign_id \u5FC5\u586B";let{retryCampaign:s,getCampaign:o}=await Promise.resolve().then(()=>(_t(),Pt)),i=await o(t,r);return i?(await s(t,r),`\u5DF2\u91CD\u8DD1\u5931\u8D25\u89D2\u8272\uFF08campaign ${r.slice(0,8)}\u2014\u2014\u5931\u8D25 ${i.campaign.failed} \u4E2A\u5DF2\u91CD\u65B0\u6392\u961F\uFF09\u2014\u2014\u7528 survey_campaign_status \u8DDF\u8E2A`):`Error: campaign ${r} \u4E0D\u5B58\u5728`},create_workflow:async(e,t)=>{let r=n(),s=String(e.name??"").trim(),o=String(e.wfjs??"").trim();if(!s||!o)return"Error: create_workflow \u9700\u8981 name \u548C wfjs \u53C2\u6570";let i=await Xc(r,t);if(!i)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09\u2014\u2014\u8BF7\u5728\u4E0E\u5E94\u7528\u7ED1\u5B9A\u7684\u5BF9\u8BDD\u4E2D\u521B\u5EFA";try{let a=r.wf;if(!a?.crud)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316\uFF08wf \u672A\u6CE8\u5165\u2014\u2014ctx keys: "+Object.keys(r??{}).join(",")+"\uFF09";let l=await a.crud.create(i,{name:s,description:e.description?String(e.description).trim():"",wfjs:o});return JSON.stringify({id:l.id,name:l.name,status:l.status,wfjs:a.defToWfjs(l.def_json)})}catch(a){return`Error: \u5DE5\u4F5C\u6D41\u521B\u5EFA\u5931\u8D25\u2014\u2014${String(a?.message??a).slice(0,400)}\uFF08wfjs \u8BED\u6CD5\u9519\u8BEF\u53EF\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF09`}},list_workflows:async(e,t)=>{let r=n(),s=await Xc(r,t);if(!s)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09";try{let o=r.wf;if(!o?.crud)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316";let i=await o.crud.list(s,{limit:Math.min(50,Number(e.limit??20)||20)});return i.length===0?"\u5F53\u524D\u5E94\u7528\u6682\u65E0\u5DE5\u4F5C\u6D41\u2014\u2014\u53EF\u7528 create_workflow \u521B\u5EFA":JSON.stringify(i.map(a=>({id:a.id,name:a.name,status:a.status,updatedAt:a.updated_at})))}catch(o){return`Error: ${String(o?.message??o).slice(0,300)}`}},run_workflow:async(e,t)=>{let r=n(),s=String(e.workflow_id??"").trim();if(!s)return"Error: run_workflow \u9700\u8981 workflow_id";let o={},i=String(e.args??"").trim();if(i&&i!=="{}")try{o=JSON.parse(i)}catch{return"Error: args \u4E0D\u662F\u5408\u6CD5 JSON \u5BF9\u8C61"}let a=await Xc(r,t);if(!a)return"Error: \u65E0\u6CD5\u786E\u5B9A\u5E94\u7528\u4E0A\u4E0B\u6587\uFF08appId\uFF09";try{let l=r.wf;if(!l?.execute)return"Error: \u5DE5\u4F5C\u6D41\u7CFB\u7EDF\u672A\u521D\u59CB\u5316";let u=await l.execute(a,s,o,"chat");return JSON.stringify({status:u.status,error:u.error,result:(typeof u.result_json=="object",u.result_json)}).slice(0,3e3)}catch(l){return`Error: \u6267\u884C\u5931\u8D25\u2014\u2014${String(l?.message??l).slice(0,400)}`}}})}async function Xc(n,e){let t=e?.agentId!=null?String(e.agentId):null;if(t)try{let[r]=await n.orm.query.from("agents").select("app_id").where({id:t}).limit(1).run();if(r?.app_id)return String(r.app_id)}catch{}return String(n.auth?.appId??n.appId??"")}async function Yc(n,e,t,r){if(!e||!t)return"Error: \u59D4\u6258\u9700\u8981 agent \u548C message \u53C2\u6570";let s=String(r?.agentId??""),o="\u672A\u77E5\u540C\u4E8B";if(s){let w=await n.orm.query.from("agents").select("name").where({id:{eq:s}}).limit(1).run();w[0]&&(o=String(w[0].name))}let i=`[\u6765\u81EA ${o} \u7684\u59D4\u6258] ${t}`,a=Number(n._agentDepth??0),l=2;if(a>=l)return`Error: Agent \u534F\u4F5C\u6DF1\u5EA6\u8D85\u9650\uFF08\u6700\u591A ${l} \u5C42\uFF09\u2014\u2014\u8BF7\u76F4\u63A5\u56DE\u7B54\u800C\u975E\u7EE7\u7EED\u59D4\u6258`;let c=(await n.orm.query.from("agents").select().where({app_id:{eq:String(n.appId)},type:{in:["ai","department"]},is_active:{eq:!0}}).run()).find(w=>String(w.name)===String(e)||String(w.id)===String(e));if(!c)return`Error: \u627E\u4E0D\u5230\u53EF\u8C03\u7528\u7684 AI Agent\u300C${e}\u300D\uFF08\u9700\u540C\u79DF\u6237\u4E14\u5DF2\u6FC0\u6D3B\uFF09`;let d=c;if(String(d.id)===String(r?.agentId??""))return"Error: \u4E0D\u80FD\u8C03\u7528\u81EA\u5DF1\uFF08\u5FAA\u73AF\uFF09";let p=String(r?.departmentId??"");try{let[w]=await n.orm.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where({"dm.agent_id":d.id,"d.is_dm":{eq:!1}}).limit(1).run();w?.department_id&&(p=String(w.department_id))}catch{}let{runAgent:f}=await Promise.resolve().then(()=>(Bi(),zh));n._agentDepth=a+1;try{let w=await f(n,{agentId:String(d.id),appId:n.appId,departmentId:p,systemPrompt:String(d.system_prompt??"\u4F60\u662F\u4E00\u4E2A AI \u52A9\u624B"),model:d.model?String(d.model):void 0,tools:d.tools??[],maxSteps:3,humanInTheLoop:!!d.human_in_the_loop,workspacePath:d.workspace_path?String(d.workspace_path):void 0,allowFileTools:!!d.allow_file_tools,allowCommandExec:!!d.allow_command_exec,allowNetwork:!!d.allow_network},[{role:"user",content:i}]);return`[${String(d.name)} \u7684\u56DE\u590D]
328
+ ${w.content}`}catch(w){return`Error: \u8C03\u7528 Agent\u300C${String(d.name)}\u300D\u5931\u8D25: ${w?.message??"\u672A\u77E5\u9519\u8BEF"}`}finally{n._agentDepth=a}}var un,Fs=I(()=>{"use strict";lc();un=[{type:"function",function:{name:"search_knowledge_base",description:"\u4ECE Agent \u7ED1\u5B9A\u7684\u77E5\u8BC6\u5E93\u4E2D\u68C0\u7D22\u76F8\u5173\u4FE1\u606F\u3002\u5F53\u7528\u6237\u95EE\u9898\u6D89\u53CA\u6587\u6863\u3001\u4EA7\u54C1\u624B\u518C\u3001FAQ \u7B49\u5185\u5BB9\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{query:{type:"string",description:"\u641C\u7D22\u5173\u952E\u8BCD\u6216\u95EE\u9898\u63CF\u8FF0"},top_k:{type:"number",description:"\u8FD4\u56DE\u7ED3\u679C\u6570\u91CF\uFF0C\u9ED8\u8BA4 5"}},required:["query"]}}},{type:"function",function:{name:"generate_image",description:"\u6839\u636E\u6587\u5B57\u63CF\u8FF0\u751F\u6210\u56FE\u7247\uFF08z-image-turbo \u6587\u751F\u56FE\u6A21\u578B\uFF09\u3002\u751F\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08/ws\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09\u3002\u7528\u6237\u8981\u6C42\u753B\u56FE/\u914D\u56FE/\u6D77\u62A5\u7075\u611F\u7B49\u573A\u666F\u4F7F\u7528\u3002",parameters:{type:"object",properties:{prompt:{type:"string",description:"\u56FE\u7247\u8BE6\u7EC6\u63CF\u8FF0\u2014\u2014\u4E3B\u4F53/\u98CE\u683C/\u6784\u56FE/\u5149\u7EBF/\u989C\u8272\uFF08\u8D8A\u5177\u4F53\u6548\u679C\u8D8A\u597D\uFF09"},size:{type:"string",description:'\u5C3A\u5BF8 "\u5BBD*\u9AD8"\uFF0C\u9ED8\u8BA4 "1024*1024"'},filename:{type:"string",description:"\u4FDD\u5B58\u6587\u4EF6\u540D\uFF08\u5982 logo.png\uFF09\u2014\u2014\u7559\u7A7A\u81EA\u52A8\u547D\u540D"}},required:["prompt"]}}},{type:"function",function:{name:"generate_video",description:"\u6839\u636E\u6587\u5B57\u63CF\u8FF0\u751F\u6210\u89C6\u9891\uFF08HappyHorse \u6587\u751F\u89C6\u9891\u6A21\u578B\u2014\u2014\u963F\u91CC\u4E91\u767E\u70BC\u5F02\u6B65\u4EFB\u52A1\uFF09\u3002\u63D0\u4EA4\u540E\u7EA6 1-5 \u5206\u949F\u751F\u6210\u5B8C\u6210\uFF0C\u5B8C\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u5230\u90E8\u95E8\u5171\u4EAB\u76EE\u5F55\uFF08/ws\u2014\u2014\u4EA4\u4ED8\u7269\u4E2D\u5FC3\u53EF\u89C1\uFF09\u3002\u63D0\u4EA4\u7ACB\u5373\u8FD4\u56DE\u4EFB\u52A1 ID\u2014\u2014\u7528 video_generation_status \u67E5\u8BE2\u8FDB\u5C55\u3002\u7528\u6237\u8981\u6C42\u751F\u6210\u89C6\u9891/\u5BA3\u4F20\u7247/\u52A8\u753B/\u52A8\u6001\u753B\u9762\u7B49\u573A\u666F\u4F7F\u7528\u3002",parameters:{type:"object",properties:{prompt:{type:"string",description:"\u89C6\u9891\u5185\u5BB9\u8BE6\u7EC6\u63CF\u8FF0\u2014\u2014\u4E3B\u4F53/\u573A\u666F/\u8FD0\u52A8/\u98CE\u683C/\u955C\u5934\uFF08\u8D8A\u5177\u4F53\u6548\u679C\u8D8A\u597D\uFF0C\u22645000 \u5B57\u7B26\uFF09"},resolution:{type:"string",description:"\u5206\u8FA8\u7387\uFF1A480P/720P/1080P\uFF08\u9ED8\u8BA4 1080P\uFF09"},ratio:{type:"string",description:"\u5BBD\u9AD8\u6BD4\uFF1A16:9\uFF08\u9ED8\u8BA4\uFF09/9:16/1:1/4:3/3:4/4:5/5:4/9:21/21:9"},duration:{type:"number",description:"\u89C6\u9891\u65F6\u957F\uFF08\u79D2\uFF0C3-15\uFF0C\u9ED8\u8BA4 5\uFF09"},filename:{type:"string",description:"\u4FDD\u5B58\u6587\u4EF6\u540D\uFF08\u5982 promo.mp4\uFF09\u2014\u2014\u7559\u7A7A\u81EA\u52A8\u547D\u540D"}},required:["prompt"]}}},{type:"function",function:{name:"video_generation_status",description:"\u67E5\u8BE2\u89C6\u9891\u751F\u6210\u4EFB\u52A1\u8FDB\u5EA6\uFF08generate_video \u8FD4\u56DE\u7684 task_id\uFF09\u3002\u751F\u6210\u5B8C\u6210\u8FD4\u56DE\u5DF2\u4FDD\u5B58\u5230 /ws \u7684\u8DEF\u5F84\uFF1B\u5931\u8D25\u8FD4\u56DE\u539F\u56E0\u3002\u7528\u6237\u5728\u8BE2\u95EE\u300C\u89C6\u9891\u751F\u6210\u597D\u4E86\u5417/\u8FDB\u5EA6\u5982\u4F55\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{task_id:{type:"string",description:"generate_video \u8FD4\u56DE\u7684\u4EFB\u52A1 ID"}},required:["task_id"]}}},{type:"function",function:{name:"get_current_time",description:"\u83B7\u53D6\u5F53\u524D\u65E5\u671F\u548C\u65F6\u95F4\uFF0C\u5F53\u7528\u6237\u8BE2\u95EE\u65F6\u95F4\u65F6\u4F7F\u7528",parameters:{type:"object",properties:{}}}},{type:"function",function:{name:"call_agent",description:"\u8C03\u7528\u540C\u79DF\u6237\u7684\u53E6\u4E00\u4E2A AI Agent \u5904\u7406\u4EFB\u52A1\uFF08\u4F20\u5165\u5176\u540D\u79F0\u6216 ID + \u4EFB\u52A1\u63CF\u8FF0\uFF09\uFF0C\u8FD4\u56DE\u8BE5 Agent \u7684\u56DE\u590D\u3002\u7528\u4E8E\u4E13\u4E1A\u5206\u5DE5\uFF1A\u628A\u5B50\u4EFB\u52A1\u59D4\u6258\u7ED9\u64C5\u957F\u8BE5\u9886\u57DF\u7684 Agent\uFF08\u5982\u6570\u636E\u5206\u6790/\u5BA2\u670D\uFF09\u3002",parameters:{type:"object",properties:{agent:{type:"string",description:"\u76EE\u6807 Agent \u540D\u79F0\u6216 ID\uFF08\u540C\u79DF\u6237\u7684 ai \u7C7B\u578B Agent\uFF09"},message:{type:"string",description:"\u59D4\u6258\u7ED9\u8BE5 Agent \u7684\u4EFB\u52A1\u63CF\u8FF0"}},required:["agent","message"]}}},{type:"function",function:{name:"plan_tasks",description:"\u5C06\u590D\u6742\u4EFB\u52A1\u62C6\u89E3\u4E3A\u6700\u591A 3 \u4E2A\u5B50\u4EFB\u52A1\u5E76\u5E76\u884C\u5206\u6D3E\u7ED9\u4E13\u4E1A Agent \u6267\u884C\u2014\u2014\u6BCF\u4E2A\u5B50\u4EFB\u52A1\u6307\u5B9A\u76EE\u6807 Agent\uFF08\u540D\u79F0\u6216 ID\uFF09+ \u53EF\u6267\u884C\u4EFB\u52A1\u63CF\u8FF0\u3002\u9002\u5408\u591A\u76EE\u6807/\u591A\u6587\u4EF6\u4EA7\u51FA/\u591A\u6B65\u8C03\u7814\u7C7B\u4EFB\u52A1\uFF08\u5982\u300C\u5206\u6790\u6570\u636E\u5E76\u5199\u62A5\u544A\u300D\uFF09\uFF1B\u7B80\u5355\u4EFB\u52A1\u4E0D\u8981\u7528\uFF08\u76F4\u63A5\u56DE\u7B54\u2014\u2014\u62C6\u89E3\u6D6A\u8D39 token \u4E0E\u5EF6\u8FDF\uFF09\u3002\u8FD4\u56DE\u5404\u5B50\u4EFB\u52A1\u7684\u56DE\u590D\uFF08\u5E26\u6765\u6E90\u6807\u6CE8\uFF09\u3002",parameters:{type:"object",properties:{tasks:{type:"array",description:"\u5B50\u4EFB\u52A1\u6E05\u5355\uFF08\u6700\u591A 3 \u4E2A\u2014\u2014\u8D85\u51FA\u622A\u65AD\uFF09",items:{type:"object",properties:{agent:{type:"string",description:"\u76EE\u6807 Agent \u540D\u79F0\u6216 ID\uFF08\u540C\u79DF\u6237 ai \u7C7B\u578B\u2014\u2014\u4E13\u4E1A\u5206\u5DE5\uFF1A\u6570\u636E\u5206\u6790/\u5BA2\u670D/\u6587\u6863\u7B49\uFF09"},message:{type:"string",description:"\u5B50\u4EFB\u52A1\u63CF\u8FF0\uFF08\u5177\u4F53\u5230\u53EF\u6267\u884C\u2014\u2014\u542B\u5FC5\u8981\u4E0A\u4E0B\u6587\u2014\u2014\u62C6\u89E3\u8D28\u91CF\u51B3\u5B9A\u7ED3\u679C\u8D28\u91CF\uFF09"}},required:["agent","message"]}}},required:["tasks"]}}},{type:"function",function:{name:"survey_campaign_start",description:"\u542F\u52A8\u6279\u91CF\u95EE\u5377\u586B\u5199\u4EFB\u52A1\uFF08Campaign\uFF09\u2014\u2014\u6309\u4EBA\u8BBE\u89D2\u8272\u6C60\u6279\u91CF\u6D3E\u5355 AI \u586B\u5199\u95EE\u5377\uFF08\u6C34\u4F4D\u5E76\u53D1\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u72EC\u7ACB\u6C99\u76D2\uFF09\u3002\u5F53\u7528\u6237\u8981\u6C42\u300C\u8BA9 N \u4E2A/\u4E00\u6279 AI \u673A\u5668\u4EBA\u586B\u5199\u95EE\u5377\u300D\u300C\u6A21\u62DF N \u4EBA\u586B\u95EE\u5377\u300D\u65F6\u4F7F\u7528\u3002\u603B\u91CF\u4E0E\u5E76\u53D1\u53EF\u914D\u7F6E\u3002",parameters:{type:"object",properties:{total:{type:"number",description:"\u586B\u5199\u603B\u91CF\uFF08\u89D2\u8272\u6570\u2014\u2014\u5982 1000\uFF09"},concurrency:{type:"number",description:"\u540C\u65F6\u5728\u7EBF\u586B\u5199\u6570\uFF08\u5E76\u53D1\u4E0A\u9650\u2014\u2014\u9ED8\u8BA4 5\u2014\u2014\u670D\u52A1\u5C42\u786C\u4E0A\u9650 10\uFF082027-09 \u5B9A\u53C2\uFF1A\u8BD5\u70B9 100 @10 \u5DF2\u5B9E\u6D4B 0 \u5931\u8D25\u2014\u201420 \u5224\u8D1F\u4E0D\u505A\uFF09\uFF09"},url:{type:"string",description:"\u95EE\u5377 URL\uFF08\u7F3A\u7701\u7528\u5E73\u53F0\u9ED8\u8BA4\u95EE\u5377\u9875\uFF09"},retry:{type:"number",description:"\u5931\u8D25\u91CD\u8BD5\u6B21\u6570\uFF08\u9ED8\u8BA4 2\uFF09"}},required:["total","concurrency"]}}},{type:"function",function:{name:"survey_campaign_status",description:"\u67E5\u770B\u6279\u91CF\u95EE\u5377\u4EFB\u52A1\u8FDB\u5EA6\uFF08\u5B8C\u6210\u6570/\u5931\u8D25\u6570/\u5728\u7EBF/\u5931\u8D25\u6E05\u5355\uFF09\u3002\u7528\u6237\u5728\u8BE2\u95EE\u300C\u586B\u5230\u54EA\u4E86/\u8FDB\u5EA6\u5982\u4F55/\u5B8C\u6210\u4E86\u5417\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{campaign_id:{type:"string",description:"\u4EFB\u52A1 ID\uFF08\u542F\u52A8\u65F6\u8FD4\u56DE\uFF09"}},required:["campaign_id"]}}},{type:"function",function:{name:"survey_campaign_retry",description:"\u91CD\u8DD1\u6279\u91CF\u95EE\u5377\u4EFB\u52A1\u7684\u5931\u8D25\u89D2\u8272\uFF08\u91CD\u65B0\u6D3E\u5355\u2014\u2014attempts \u6E05\u96F6\uFF09\u3002\u7528\u6237\u8BF4\u300C\u91CD\u8DD1\u5931\u8D25\u7684/\u5931\u8D25\u7684\u518D\u586B\u4E00\u6B21\u300D\u65F6\u4F7F\u7528\u3002",parameters:{type:"object",properties:{campaign_id:{type:"string",description:"\u4EFB\u52A1 ID"}},required:["campaign_id"]}}},{type:"function",function:{name:"create_workflow",description:"\u7528 wfjs \u8BED\u8A00\u521B\u5EFA\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\uFF08\u58F0\u660E\u5F0F\u6B65\u9AA4\u5E8F\u5217\u2014\u2014HTTP \u8BF7\u6C42/\u65E5\u5FD7/\u6761\u4EF6\u5206\u652F/\u5FAA\u73AF\uFF09\u3002\u521B\u5EFA\u5373\u7F16\u8BD1\u6821\u9A8C\u2014\u2014\u8BED\u6CD5\u9519\u8BEF\u4F1A\u8FD4\u56DE\u9519\u8BEF\uFF08\u53EF\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF09\u3002wfjs \u4E0E JS \u8BED\u6CD5\u5BF9\u9F50\uFF1Aconst \u540D = await http({ url: 'https://\u2026' }) \u53D1\u8BF7\u6C42\uFF1Bconst \u540D = \u8868\u8FBE\u5F0F\uFF08\u53EF\u8BFB\u54CD\u5E94\u5B57\u6BB5 res.json.x\uFF09\uFF1Bif (\u6761\u4EF6) { await log({ message: `\u6587\u672C ${\u53D8\u91CF} \u4EF6` }) }\uFF1Bfor (const \u9879 of \u5217\u8868) {}\uFF1B\u53D8\u91CF\u7528 let \u58F0\u660E\u3002\u7528\u6237\u8981\u6C42\u300C\u521B\u5EFA\u5DE5\u4F5C\u6D41/\u81EA\u52A8\u5316\u6D41\u7A0B/\u5B9A\u65F6\u76D1\u63A7/\u81EA\u52A8\u68C0\u67E5\u300D\u65F6\u4F7F\u7528\u2014\u2014\u521B\u5EFA\u540E\u53EF\u7528 run_workflow \u6267\u884C\u9A8C\u8BC1\u3002\u6CE8\u610F\uFF1A\u672C\u73AF\u5883\u63D0\u4F9B\u6F14\u793A\u63A5\u53E3 GET /api/demo/stock?stock=N\uFF08\u8FD4\u56DE { items: [...] }\u2014\u2014items \u662F\u6570\u7EC4\u2014\u2014\u957F\u5EA6\u5373\u7F3A\u8D27\u5546\u54C1\u6570\uFF1BN=0 \u65E0\u7F3A\u8D27\u3001N>0 \u6709 N \u4E2A\uFF09\u2014\u2014\u6F14\u793A/\u6D4B\u8BD5\u5DE5\u4F5C\u6D41\u8BF7\u7528\u5B83\uFF0C\u4E0D\u8981\u7528\u65E0\u6CD5\u8BBF\u95EE\u7684\u793A\u4F8B\u57DF\u540D\u3002",parameters:{type:"object",properties:{name:{type:"string",description:"\u5DE5\u4F5C\u6D41\u540D\u79F0\u2014\u2014\u7B80\u77ED\uFF08\u5982 \u5E93\u5B58\u544A\u8B66\uFF09"},description:{type:"string",description:"\u7528\u9014\u8BF4\u660E\uFF08\u53EF\u9009\u2014\u2014\u5982 \u6BCF\u5C0F\u65F6\u68C0\u67E5\u5E93\u5B58\u5E76\u544A\u8B66\uFF09"},wfjs:{type:"string",description:"wfjs \u6E90\u7801\u2014\u2014\u53C2\u8003\u6A21\u677F\uFF1A\nconst res = await http({ url: 'https://api.example.com/items' })\nconst count = res.json.items.length\nif (count > 0) { await log({ message: `\u7F3A\u8D27 ${count} \u4EF6` }) }"}},required:["name","wfjs"]}}},{type:"function",function:{name:"list_workflows",description:"\u5217\u51FA\u5F53\u524D\u5E94\u7528\u4E0B\u7684\u5DE5\u4F5C\u6D41\uFF08\u540D\u79F0/\u72B6\u6001/\u66F4\u65B0\u65F6\u95F4\uFF09\u3002\u7528\u6237\u95EE\u300C\u6709\u54EA\u4E9B\u5DE5\u4F5C\u6D41/\u81EA\u52A8\u5316\u6D41\u7A0B\u300D\u65F6\u4F7F\u7528\u2014\u2014\u5148\u5217\u51FA\u518D\u6309\u9700 run_workflow\u3002",parameters:{type:"object",properties:{limit:{type:"number",description:"\u8FD4\u56DE\u6761\u6570\uFF08\u9ED8\u8BA4 20\uFF09"}}}}},{type:"function",function:{name:"run_workflow",description:"\u6267\u884C\u5DE5\u4F5C\u6D41\uFF08\u540C\u6B65\u2014\u2014\u8FD4\u56DE\u6BCF\u6B65\u6267\u884C\u7ED3\u679C\uFF1Aexecuted \u987A\u5E8F + stepResults \u503C\uFF09\u3002\u7528\u6237\u8BF4\u300C\u8FD0\u884C/\u6267\u884C/\u8DD1\u4E00\u4E0B\u300D\u67D0\u4E2A\u5DE5\u4F5C\u6D41\u65F6\u4F7F\u7528\uFF1B\u4E5F\u53EF\u5728 create_workflow \u540E\u7ACB\u5373\u6267\u884C\u9A8C\u8BC1\u3002",parameters:{type:"object",properties:{workflow_id:{type:"string",description:"\u5DE5\u4F5C\u6D41 ID\uFF08create_workflow \u8FD4\u56DE\u6216 list_workflows \u67E5\u8BE2\uFF09"},args:{type:"string",description:'\u6267\u884C\u53C2\u6570 JSON \u5BF9\u8C61\u5B57\u7B26\u4E32\uFF08\u5982 {"stock": 3}\uFF09\u2014\u2014\u5DE5\u4F5C\u6D41\u7528 vars.\u53C2\u6570\u540D \u8BFB\u53D6\uFF1B\u65E0\u53C2\u6570\u4F20 {}'}},required:["workflow_id"]}}}]});function Tw(n,e){return n?_0[e].includes(n):!1}var _0,Cw=I(()=>{"use strict";_0={write:["owner","admin","member"],manage:["owner","admin"],tenant:["owner"]}});var cn={};ie(cn,{appRoleOf:()=>Aw,requireDeptManager:()=>k0,requireWriter:()=>v0});async function Aw(n,e){let t=e??n.auth?.userId;if(!t)return null;let r=await n.orm.query.from("_weifuwu_app_members").select("role").where({app_id:{eq:String(n.appId)},user_id:{eq:t}}).limit(1).run();return r[0]?.role?String(r[0].role):null}async function v0(n){let e=await Aw(n);if(!Tw(e,"write")){let t=new Error("\u53EA\u8BFB\u6210\u5458\u65E0\u6743\u6267\u884C\u6B64\u64CD\u4F5C");throw t.status=403,t}}async function k0(n,e){let{auth:t}=n,[r]=await n.orm.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where({"dm.department_id":{eq:e},"ua.user_id":{eq:String(t.userId)}}).limit(1).run(),[s]=await n.orm.query.from("_weifuwu_app_members").select("role").where({app_id:{eq:String(n.appId)},user_id:{eq:String(t.userId)}}).limit(1).run();if((!r||r.role!=="admin")&&s?.role!=="owner"){let o=new Error("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u6267\u884C\u6B64\u64CD\u4F5C");throw o.status=403,o}}var dn=I(()=>{"use strict";Cw()});var rt={};ie(rt,{listAudit:()=>x0,writeAudit:()=>S0});async function S0(n,e){try{await n.orm.query.insert("audit_logs").values({app_id:String(n.appId),user_id:n.user?.id??null,action:e.action,target_type:e.target_type??null,target_id:e.target_id??null,detail:e.detail??null}).run()}catch{}}async function x0(n,e){let t=n.orm,r=Math.min(e.limit??50,100),s=e.offset??0,o={};e.from&&(o.gte=e.from),e.to&&(o.lte=e.to);let i={app_id:{eq:String(n.appId)},...e.action?{action:{eq:e.action}}:{},...Object.keys(o).length?{created_at:o}:{}},a=await t.query.from("audit_logs").select("user_id","action","target_type","target_id","detail","created_at").where(i).orderBy("created_at","desc").limit(r).offset(s).run(),l=[...new Set(a.map(f=>f.user_id?String(f.user_id):"").filter(Boolean))],u=l.length?await t.query.from("_weifuwu_users").select("id","name").where({id:{in:l}}).run():[],c=new Map(u.map(f=>[String(f.id),String(f.name??"")])),d=(a??[]).map(f=>({...f,user_name:f.user_id?c.get(String(f.user_id))??"system":"system"})),[p]=await t.query.from("audit_logs").count("*","total").where(i).run();return{entries:d,total:Number(p?.total??0)}}var st=I(()=>{"use strict"});var Wr={};ie(Wr,{refreshManagerPrompt:()=>E0});function R0(n,e){return`\u4F60\u662F\u300C${n}\u300D\u7684\u90E8\u95E8\u7ECF\u7406\uFF0C\u4EE3\u8868\u8BE5\u90E8\u95E8\u53C2\u4E0E\u534F\u4F5C\u3002
329
329
 
330
330
  \u4F60\u7684\u804C\u8D23\uFF1A
331
331
  1. \u4F5C\u4E3A\u90E8\u95E8\u4EE3\u8868\u56DE\u7B54\u4E0E\u5176\u4ED6\u90E8\u95E8\u7684\u534F\u4F5C\u8BF7\u6C42
@@ -337,11 +337,11 @@ ${h.content}`}catch(h){return`Error: \u8C03\u7528 Agent\u300C${String(d.name)}\u
337
337
  \u4EFB\u52A1\u5B8C\u6210\u540E\u6309\u4EE5\u4E0B\u7ED3\u6784\u6C47\u62A5\uFF1A
338
338
  - \u2705 \u5DF2\u5B8C\u6210\uFF1A\u5217\u51FA\u5B8C\u6210\u7684\u4E8B\u9879
339
339
  - \u26A0\uFE0F \u672A\u5B8C\u6210\uFF1A\u5217\u51FA\u672A\u5B8C\u6210\u7684\u4E8B\u9879\u53CA\u539F\u56E0\uFF08\u6CA1\u6709\u5219\u7701\u7565\uFF09
340
- - \u{1F4E6} \u4EA7\u7269\uFF1A\u751F\u6210\u7684\u6587\u4EF6/\u7ED3\u679C\u4F4D\u7F6E\uFF08\u6CA1\u6709\u5219\u7701\u7565\uFF09`}async function C0(n,e,t){try{let r=Z(n),[s]=await r.agents.select("id").where(F(L(r.agents.c.department_id,t),L(r.agents.c.type,"department"),L(r.agents.c.is_active,!0))).run();if(!s)return;let[i]=await r.departments.select("name").where(F(L(r.departments.c.id,t),L(r.departments.c.app_id,e))).run();if(!i)return;let a=(await n.query.from("department_members dm").select("a.name").join("agents a",{"a.id":{col:"dm.agent_id"}}).where(F({"dm.department_id":{eq:t}},{"a.type":{in:["ai","knowledge_base"]}},{"a.id":{ne:String(s.id)}})).run()??[]).map(l=>String(l.name)).join("\u3001");await r.agents.update({system_prompt:T0(String(i.name),String(a))}).where(L(r.agents.c.id,String(s.id))).run()}catch{}}var Wr=N(()=>{"use strict";re();nt()});var Vi={};ie(Vi,{listVersions:()=>O0,rollbackVersion:()=>I0,saveVersion:()=>A0});async function A0(n,e,t){let r=Z(n.orm),[s]=await r.agents.select("name","description","system_prompt","model","temperature","max_tokens","tools","workspace_path","allow_file_tools","allow_command_exec","allow_network","monthly_token_quota").where(F(L(r.agents.c.id,e),L(r.agents.c.app_id,n.appId))).run();if(!s)return null;let i={name:s.name,description:s.description,system_prompt:s.system_prompt,model:s.model,temperature:s.temperature,max_tokens:s.max_tokens,tools:s.tools,workspace_path:s.workspace_path,allow_file_tools:s.allow_file_tools,allow_command_exec:s.allow_command_exec,allow_network:s.allow_network,monthly_token_quota:s.monthly_token_quota},[o]=await r.agent_versions.select("version").where(L(r.agent_versions.c.agent_id,e)).orderBy("version","desc").limit(1).run(),a=Number(o?.version??0)+1,[l]=await r.agent_versions.insert({agent_id:e,app_id:n.appId,version:a,snapshot:i,note:t??`\u7248\u672C ${a}`}).returning("id","version").run();return{id:String(l.id),version:a}}async function O0(n,e){let t=Z(n.orm);return await t.agent_versions.select("id","version","note","snapshot","created_at").where(F(L(t.agent_versions.c.agent_id,e),L(t.agent_versions.c.app_id,n.appId))).orderBy("version","desc").limit(30).run()??[]}async function I0(n,e,t){let r=Z(n.orm),[s]=await r.agent_versions.select("snapshot","version").where(F(L(r.agent_versions.c.id,t),L(r.agent_versions.c.agent_id,e),L(r.agent_versions.c.app_id,n.appId))).run();if(!s)return{ok:!1,note:"\u7248\u672C\u4E0D\u5B58\u5728"};let i=s.snapshot,o=["name","description","system_prompt","model","temperature","max_tokens","tools","workspace_path","allow_file_tools","allow_command_exec","allow_network","monthly_token_quota"],a={updated_at:G.now()};for(let l of o)i[l]!==void 0&&(a[l]=i[l]);return await r.agents.update(a).where(F(L(r.agents.c.id,e),L(r.agents.c.app_id,n.appId))).run(),{ok:!0,note:`\u5DF2\u56DE\u6EDA\u5230\u7248\u672C ${s.version}`}}var zi=N(()=>{"use strict";re();nt()});function Aw(n){n.get("/api/agents/builtin-tools",async(e,t)=>Response.json({tools:Cw})),n.get("/api/agents",async(e,t)=>{let{orm:r,appId:s}=t,i=new URL(e.url),{filter:o,limit:a,offset:l}=Xn(i,Z(r).agents,{defaultLimit:50}),u=await r.ctxTable("agents").paginate({filter:o,sort:[{field:"created_at",dir:"desc"}],limit:a,offset:l}),c=u.rows,d=u.total,p=[];for(let m of c)if(m.type==="ai"){let[h]=await r.query.from("agent_logs").sum("tokens_total","total_tokens").sum("tokens_prompt","total_prompt").sum("tokens_completion","total_completion").count("*","run_count").where({agent_id:{eq:m.id}}).run();p.push({...m,token_usage:h})}else p.push(m);return Response.json({agents:p,total:d})}),n.post("/api/agents",async(e,t)=>{try{let{requireWriter:o}=await Promise.resolve().then(()=>(dn(),cn));await o(t)}catch(o){return Response.json({error:o?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(o?.status)??403})}let{orm:r,appId:s}=t,i=Z(r);try{let o=await Wt(e,i.agents,{variant:"insert",omit:["app_id"]});if(o.type==="user"&&!o.user_id)throw new T("user \u7C7B\u578B\u5FC5\u987B\u7ED1\u5B9A\u7528\u6237\u8D26\u53F7\uFF08\u7531\u6CE8\u518C\u6D41\u7A0B\u521B\u5EFA\uFF09",400);let a=null;if(o.type==="department"){if(!o.department_id)throw new T("\u90E8\u95E8\u7ECF\u7406\u5FC5\u987B\u7ED1\u5B9A\u90E8\u95E8\uFF08department_id\uFF09",400);let u=Z(r),[c]=await u.departments.select("id","name").where(F(L(u.departments.c.id,o.department_id),L(u.departments.c.app_id,s))).run();if(!c)throw new T("\u7ED1\u5B9A\u7684\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[d]=await u.agents.select("id").where(F(L(u.agents.c.department_id,o.department_id),L(u.agents.c.type,"department"),L(u.agents.c.is_active,!0))).run();if(d)throw new T("\u8BE5\u90E8\u95E8\u5DF2\u6709\u7ECF\u7406\uFF081 \u90E8\u95E8 1 \u7ECF\u7406\uFF09",409);a=o.system_prompt??null}let[l]=await i.agents.insert({app_id:s,type:o.type,name:o.name,avatar_url:o.avatar_url??null,description:o.description??null,model:o.model??null,system_prompt:a??o.system_prompt??null,temperature:o.temperature??.7,max_tokens:o.max_tokens??2048,human_in_the_loop:o.human_in_the_loop??!1,user_id:o.user_id??null,webhook_url:o.webhook_url??null,webhook_secret:o.webhook_secret??null,webhook_retry_count:o.webhook_retry_count??3,chunk_size:o.chunk_size??500,chunk_overlap:o.chunk_overlap??50,tools:typeof o.tools=="string"?JSON.parse(o.tools):o.tools??[],workspace_path:o.workspace_path??null,allow_file_tools:o.allow_file_tools??!1,allow_command_exec:o.allow_command_exec??!1,allow_network:o.allow_network??!1,kb_id:o.kb_id??null,department_id:o.department_id??null}).returning("id","type","name","created_at").run();try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_create",target_type:"agent",target_id:String(l.id),detail:{name:String(l.name??""),type:String(l.type??"")}})}catch{}if(o.type==="department"&&o.department_id&&(await i.department_members.insert({department_id:o.department_id,agent_id:String(l.id),role:"manager"}).onConflict().run().catch(()=>{}),!o.system_prompt))try{let{refreshManagerPrompt:u}=await Promise.resolve().then(()=>(Wr(),Lr));await u(r,s,String(o.department_id))}catch{}return Response.json({agent:l},{status:201})}catch(o){return Te(o)}}),n.get("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=await r.query.from("agents a").select("a.id","a.app_id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","a.model","a.system_prompt","a.temperature","a.max_tokens","a.human_in_the_loop","a.user_id","a.webhook_url","a.webhook_secret","a.webhook_retry_count","a.im_bind_dept","a.chunk_size","a.chunk_overlap","a.tools","a.department_id","a.monthly_token_quota","a.is_active","a.created_at","a.updated_at","a.workspace_path","a.allow_file_tools","a.allow_command_exec","a.allow_network","a.template_slug","a.kb_id","a.approval_policy","a.webhook_platform","a.risk_policy","a.light_model","u.email as bound_email","u.name as bound_user_name").join("_weifuwu_users u",{"u.id":{col:"a.user_id"}},{type:"left"}).where(F({"a.id":{eq:i.id}},{"a.app_id":{eq:s}})).one();if(!o)throw new T("Agent \u4E0D\u5B58\u5728",404);let a=0;try{let[l]=await r.query.from("agent_logs").sum("tokens_total","used").where({agent_id:{eq:i.id},created_at:{gte:G.monthStart()}}).run();a=Number(l?.used??0)}catch{}return Response.json({agent:{...o,quota_used:a}})}),n.put("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=await e.json(),a=["name","avatar_url","description","role_label","expertise","model","system_prompt","temperature","max_tokens","human_in_the_loop","webhook_url","webhook_secret","webhook_retry_count","im_bind_dept","chunk_size","chunk_overlap","tools","is_active","workspace_path","allow_file_tools","allow_command_exec","allow_network","kb_id","monthly_token_quota","department_id"],l={updated_at:G.now()};for(let d of a)o[d]!==void 0&&(l[d]=o[d]);if(Object.keys(l).length<=1)throw new T("\u6CA1\u6709\u53EF\u66F4\u65B0\u7684\u5B57\u6BB5",400);let u=Z(r),[c]=await u.agents.update(l).where(F(L(u.agents.c.id,i.id),L(u.agents.c.app_id,s))).returning("id","name","type","updated_at").run();if(!c)throw new T("Agent \u4E0D\u5B58\u5728",404);try{let{writeAudit:d}=await Promise.resolve().then(()=>(st(),rt));await d(t,{action:"agent_update",target_type:"agent",target_id:String(c.id),detail:{name:String(c.name??"")}})}catch{}return o.type==="department"&&o.department_id&&await u.department_members.insert({department_id:String(o.department_id),agent_id:String(c.id),role:"manager"}).onConflict().run().catch(()=>{}),Response.json({agent:c})}),n.delete("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:i,auth:o}=t;if(o.role!=="owner")throw new T("\u4EC5\u7BA1\u7406\u5458\u53EF\u5220\u9664 Agent",403);let a=Z(r);if((await a.agents.delete().where(F(L(a.agents.c.id,i.id),L(a.agents.c.app_id,s))).run()).length===0)throw new T("Agent \u4E0D\u5B58\u5728",404);try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_delete",target_type:"agent",target_id:i.id})}catch{}return Response.json({success:!0})}),n.get("/api/agents/:id/quality",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let[l]=await o.agent_logs.select().count("*","runs").count("*","ok_runs",{success:{eq:!0}}).where(L(o.agent_logs.c.agent_id,i.id)).run(),[u]=await o.messages.select().count("*","likes",{feedback:{eq:"like"}}).count("*","dislikes",{feedback:{eq:"dislike"}}).where(F(L(o.messages.c.sender_id,i.id),{feedback:{isNull:!1}})).run(),c=Number(l?.runs??0);return Response.json({toolSuccessRate:c>0?Math.round(Number(l?.ok_runs??0)/c*100):null,runs:c,likes:Number(u?.likes??0),dislikes:Number(u?.dislikes??0)})}),n.get("/api/agents/:id/memory",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let[l]=await o.agent_memories.select("content","updated_at").where(L(o.agent_memories.c.agent_id,i.id)).run();return Response.json({memory:l?String(l.content??""):"",updatedAt:l?l.updated_at:null})}),n.delete("/api/agents/:id/memory",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);return await o.agent_memories.delete().where(L(o.agent_memories.c.agent_id,i.id)).run(),Response.json({success:!0})}),n.post("/api/agents/:id/preview",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.agents.select().where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s),L(o.agents.c.type,"ai"))).run();if(!a)throw new T("AI Agent \u4E0D\u5B58\u5728",404);let l=await e.json().catch(()=>({content:""})),u=String(l.content??"").slice(0,2e3);if(!u.trim())throw new T("content \u4E3A\u5FC5\u586B",400);let c=new ReadableStream({async start(d){let p=new TextEncoder,m=h=>d.enqueue(p.encode(h));try{await Pc(t,a,u,m)}catch(h){m(`event: wf:error
341
- data: ${JSON.stringify({message:h instanceof Error?h.message:String(h)})}
340
+ - \u{1F4E6} \u4EA7\u7269\uFF1A\u751F\u6210\u7684\u6587\u4EF6/\u7ED3\u679C\u4F4D\u7F6E\uFF08\u6CA1\u6709\u5219\u7701\u7565\uFF09`}async function E0(n,e,t){try{let r=Z(n),[s]=await r.agents.select("id").where(V(L(r.agents.c.department_id,t),L(r.agents.c.type,"department"),L(r.agents.c.is_active,!0))).run();if(!s)return;let[o]=await r.departments.select("name").where(V(L(r.departments.c.id,t),L(r.departments.c.app_id,e))).run();if(!o)return;let a=(await n.query.from("department_members dm").select("a.name").join("agents a",{"a.id":{col:"dm.agent_id"}}).where(V({"dm.department_id":{eq:t}},{"a.type":{in:["ai","knowledge_base"]}},{"a.id":{ne:String(s.id)}})).run()??[]).map(l=>String(l.name)).join("\u3001");await r.agents.update({system_prompt:R0(String(o.name),String(a))}).where(L(r.agents.c.id,String(s.id))).run()}catch{}}var Ur=I(()=>{"use strict";re();nt()});var Ki={};ie(Ki,{listVersions:()=>C0,rollbackVersion:()=>A0,saveVersion:()=>T0});async function T0(n,e,t){let r=Z(n.orm),[s]=await r.agents.select("name","description","system_prompt","model","temperature","max_tokens","tools","workspace_path","allow_file_tools","allow_command_exec","allow_network","monthly_token_quota").where(V(L(r.agents.c.id,e),L(r.agents.c.app_id,n.appId))).run();if(!s)return null;let o={name:s.name,description:s.description,system_prompt:s.system_prompt,model:s.model,temperature:s.temperature,max_tokens:s.max_tokens,tools:s.tools,workspace_path:s.workspace_path,allow_file_tools:s.allow_file_tools,allow_command_exec:s.allow_command_exec,allow_network:s.allow_network,monthly_token_quota:s.monthly_token_quota},[i]=await r.agent_versions.select("version").where(L(r.agent_versions.c.agent_id,e)).orderBy("version","desc").limit(1).run(),a=Number(i?.version??0)+1,[l]=await r.agent_versions.insert({agent_id:e,app_id:n.appId,version:a,snapshot:o,note:t??`\u7248\u672C ${a}`}).returning("id","version").run();return{id:String(l.id),version:a}}async function C0(n,e){let t=Z(n.orm);return await t.agent_versions.select("id","version","note","snapshot","created_at").where(V(L(t.agent_versions.c.agent_id,e),L(t.agent_versions.c.app_id,n.appId))).orderBy("version","desc").limit(30).run()??[]}async function A0(n,e,t){let r=Z(n.orm),[s]=await r.agent_versions.select("snapshot","version").where(V(L(r.agent_versions.c.id,t),L(r.agent_versions.c.agent_id,e),L(r.agent_versions.c.app_id,n.appId))).run();if(!s)return{ok:!1,note:"\u7248\u672C\u4E0D\u5B58\u5728"};let o=s.snapshot,i=["name","description","system_prompt","model","temperature","max_tokens","tools","workspace_path","allow_file_tools","allow_command_exec","allow_network","monthly_token_quota"],a={updated_at:Q.now()};for(let l of i)o[l]!==void 0&&(a[l]=o[l]);return await r.agents.update(a).where(V(L(r.agents.c.id,e),L(r.agents.c.app_id,n.appId))).run(),{ok:!0,note:`\u5DF2\u56DE\u6EDA\u5230\u7248\u672C ${s.version}`}}var Gi=I(()=>{"use strict";re();nt()});function Iw(n){n.get("/api/agents/builtin-tools",async(e,t)=>Response.json({tools:Ow})),n.get("/api/agents",async(e,t)=>{let{orm:r,appId:s}=t,o=new URL(e.url),{filter:i,limit:a,offset:l}=Xn(o,Z(r).agents,{defaultLimit:50}),u=await r.ctxTable("agents").paginate({filter:i,sort:[{field:"created_at",dir:"desc"}],limit:a,offset:l}),c=u.rows,d=u.total,p=[];for(let f of c)if(f.type==="ai"){let[w]=await r.query.from("agent_logs").sum("tokens_total","total_tokens").sum("tokens_prompt","total_prompt").sum("tokens_completion","total_completion").count("*","run_count").where({agent_id:{eq:f.id}}).run();p.push({...f,token_usage:w})}else p.push(f);return Response.json({agents:p,total:d})}),n.post("/api/agents",async(e,t)=>{try{let{requireWriter:i}=await Promise.resolve().then(()=>(dn(),cn));await i(t)}catch(i){return Response.json({error:i?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(i?.status)??403})}let{orm:r,appId:s}=t,o=Z(r);try{let i=await Wt(e,o.agents,{variant:"insert",omit:["app_id"]});if(i.type==="user"&&!i.user_id)throw new T("user \u7C7B\u578B\u5FC5\u987B\u7ED1\u5B9A\u7528\u6237\u8D26\u53F7\uFF08\u7531\u6CE8\u518C\u6D41\u7A0B\u521B\u5EFA\uFF09",400);let a=null;if(i.type==="department"){if(!i.department_id)throw new T("\u90E8\u95E8\u7ECF\u7406\u5FC5\u987B\u7ED1\u5B9A\u90E8\u95E8\uFF08department_id\uFF09",400);let u=Z(r),[c]=await u.departments.select("id","name").where(V(L(u.departments.c.id,i.department_id),L(u.departments.c.app_id,s))).run();if(!c)throw new T("\u7ED1\u5B9A\u7684\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[d]=await u.agents.select("id").where(V(L(u.agents.c.department_id,i.department_id),L(u.agents.c.type,"department"),L(u.agents.c.is_active,!0))).run();if(d)throw new T("\u8BE5\u90E8\u95E8\u5DF2\u6709\u7ECF\u7406\uFF081 \u90E8\u95E8 1 \u7ECF\u7406\uFF09",409);a=i.system_prompt??null}let[l]=await o.agents.insert({app_id:s,type:i.type,name:i.name,avatar_url:i.avatar_url??null,description:i.description??null,model:i.model??null,system_prompt:a??i.system_prompt??null,temperature:i.temperature??.7,max_tokens:i.max_tokens??2048,human_in_the_loop:i.human_in_the_loop??!1,user_id:i.user_id??null,webhook_url:i.webhook_url??null,webhook_secret:i.webhook_secret??null,webhook_retry_count:i.webhook_retry_count??3,chunk_size:i.chunk_size??500,chunk_overlap:i.chunk_overlap??50,tools:typeof i.tools=="string"?JSON.parse(i.tools):i.tools??[],workspace_path:i.workspace_path??null,allow_file_tools:i.allow_file_tools??!1,allow_command_exec:i.allow_command_exec??!1,allow_network:i.allow_network??!1,kb_id:i.kb_id??null,department_id:i.department_id??null}).returning("id","type","name","created_at").run();try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_create",target_type:"agent",target_id:String(l.id),detail:{name:String(l.name??""),type:String(l.type??"")}})}catch{}if(i.type==="department"&&i.department_id&&(await o.department_members.insert({department_id:i.department_id,agent_id:String(l.id),role:"manager"}).onConflict().run().catch(()=>{}),!i.system_prompt))try{let{refreshManagerPrompt:u}=await Promise.resolve().then(()=>(Ur(),Wr));await u(r,s,String(i.department_id))}catch{}return Response.json({agent:l},{status:201})}catch(i){return Ae(i)}}),n.get("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=await r.query.from("agents a").select("a.id","a.app_id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","a.model","a.system_prompt","a.temperature","a.max_tokens","a.human_in_the_loop","a.user_id","a.webhook_url","a.webhook_secret","a.webhook_retry_count","a.im_bind_dept","a.chunk_size","a.chunk_overlap","a.tools","a.department_id","a.monthly_token_quota","a.is_active","a.created_at","a.updated_at","a.workspace_path","a.allow_file_tools","a.allow_command_exec","a.allow_network","a.template_slug","a.kb_id","a.approval_policy","a.webhook_platform","a.risk_policy","a.light_model","u.email as bound_email","u.name as bound_user_name").join("_weifuwu_users u",{"u.id":{col:"a.user_id"}},{type:"left"}).where(V({"a.id":{eq:o.id}},{"a.app_id":{eq:s}})).one();if(!i)throw new T("Agent \u4E0D\u5B58\u5728",404);let a=0;try{let[l]=await r.query.from("agent_logs").sum("tokens_total","used").where({agent_id:{eq:o.id},created_at:{gte:Q.monthStart()}}).run();a=Number(l?.used??0)}catch{}return Response.json({agent:{...i,quota_used:a}})}),n.put("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=await e.json(),a=["name","avatar_url","description","role_label","expertise","model","system_prompt","temperature","max_tokens","human_in_the_loop","webhook_url","webhook_secret","webhook_retry_count","im_bind_dept","chunk_size","chunk_overlap","tools","is_active","workspace_path","allow_file_tools","allow_command_exec","allow_network","kb_id","monthly_token_quota","department_id"],l={updated_at:Q.now()};for(let d of a)i[d]!==void 0&&(l[d]=i[d]);if(Object.keys(l).length<=1)throw new T("\u6CA1\u6709\u53EF\u66F4\u65B0\u7684\u5B57\u6BB5",400);let u=Z(r),[c]=await u.agents.update(l).where(V(L(u.agents.c.id,o.id),L(u.agents.c.app_id,s))).returning("id","name","type","updated_at").run();if(!c)throw new T("Agent \u4E0D\u5B58\u5728",404);try{let{writeAudit:d}=await Promise.resolve().then(()=>(st(),rt));await d(t,{action:"agent_update",target_type:"agent",target_id:String(c.id),detail:{name:String(c.name??"")}})}catch{}return i.type==="department"&&i.department_id&&await u.department_members.insert({department_id:String(i.department_id),agent_id:String(c.id),role:"manager"}).onConflict().run().catch(()=>{}),Response.json({agent:c})}),n.delete("/api/agents/:id",async(e,t)=>{let{orm:r,appId:s,params:o,auth:i}=t;if(i.role!=="owner")throw new T("\u4EC5\u7BA1\u7406\u5458\u53EF\u5220\u9664 Agent",403);let a=Z(r);if((await a.agents.delete().where(V(L(a.agents.c.id,o.id),L(a.agents.c.app_id,s))).run()).length===0)throw new T("Agent \u4E0D\u5B58\u5728",404);try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_delete",target_type:"agent",target_id:o.id})}catch{}return Response.json({success:!0})}),n.get("/api/agents/:id/quality",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let[l]=await i.agent_logs.select().count("*","runs").count("*","ok_runs",{success:{eq:!0}}).where(L(i.agent_logs.c.agent_id,o.id)).run(),[u]=await i.messages.select().count("*","likes",{feedback:{eq:"like"}}).count("*","dislikes",{feedback:{eq:"dislike"}}).where(V(L(i.messages.c.sender_id,o.id),{feedback:{isNull:!1}})).run(),c=Number(l?.runs??0);return Response.json({toolSuccessRate:c>0?Math.round(Number(l?.ok_runs??0)/c*100):null,runs:c,likes:Number(u?.likes??0),dislikes:Number(u?.dislikes??0)})}),n.get("/api/agents/:id/memory",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let[l]=await i.agent_memories.select("content","updated_at").where(L(i.agent_memories.c.agent_id,o.id)).run();return Response.json({memory:l?String(l.content??""):"",updatedAt:l?l.updated_at:null})}),n.delete("/api/agents/:id/memory",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);return await i.agent_memories.delete().where(L(i.agent_memories.c.agent_id,o.id)).run(),Response.json({success:!0})}),n.post("/api/agents/:id/preview",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.agents.select().where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s),L(i.agents.c.type,"ai"))).run();if(!a)throw new T("AI Agent \u4E0D\u5B58\u5728",404);let l=await e.json().catch(()=>({content:""})),u=String(l.content??"").slice(0,2e3);if(!u.trim())throw new T("content \u4E3A\u5FC5\u586B",400);let c=new ReadableStream({async start(d){let p=new TextEncoder,f=w=>d.enqueue(p.encode(w));try{await $c(t,a,u,f)}catch(w){f(`event: wf:error
341
+ data: ${JSON.stringify({message:w instanceof Error?w.message:String(w)})}
342
342
 
343
- `)}d.close()}});return new Response(c,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}),n.get("/api/agents/:id/versions",async(e,t)=>{let{listVersions:r}=await Promise.resolve().then(()=>(zi(),Vi)),s=await r(t,String(t.params.id));return Response.json({versions:s})}),n.post("/api/agents/:id/versions",async(e,t)=>{let{saveVersion:r}=await Promise.resolve().then(()=>(zi(),Vi)),s=await e.json().catch(()=>({})),i=await r(t,String(t.params.id),s.note);if(!i)throw new T("Agent \u4E0D\u5B58\u5728",404);return Response.json({version:i},{status:201})}),n.post("/api/agents/:id/versions/:versionId/rollback",async(e,t)=>{let{rollbackVersion:r}=await Promise.resolve().then(()=>(zi(),Vi)),s=await r(t,String(t.params.id),String(t.params.versionId));return s.ok?Response.json({ok:!0,note:s.note}):Response.json({error:s.note},{status:404})})}var Cw,Yj,Xc=N(()=>{"use strict";re();re();Wi();nt();Us();Us();Cw=un,Yj=Cw.map(n=>n.function.name)});var ed={};ie(ed,{getRoleTemplates:()=>P0,registerRoleTemplateRoutes:()=>Yc});function P0(){return[...Ow].sort((n,e)=>(e.usage_count??0)-(n.usage_count??0))}function Yc(n){n.post("/api/agents/from-template",async(e,t)=>{let{sql:r,appId:s}=t,i=await e.json(),o=Ow.find(u=>u.slug===i.template_slug);if(!o)return Response.json({error:`\u6A21\u677F "${i.template_slug}" \u4E0D\u5B58\u5728`},{status:400});if(!i.name?.trim())throw new T("name \u4E3A\u5FC5\u586B",400);let[a]=await t.orm.query.insert("agents").values({app_id:s,type:"ai",name:i.name.trim(),description:i.description??o.description,model:i.model??o.default_model,system_prompt:i.system_prompt??o.default_system_prompt,temperature:i.temperature??o.default_temperature,max_tokens:i.max_tokens??o.default_max_tokens,workspace_path:i.workspace_path??o.default_workspace_hint??null,allow_file_tools:i.allow_file_tools??o.default_allow_file_tools,allow_command_exec:i.allow_command_exec??o.default_allow_command_exec,tools:(o.default_skills??[]).map(u=>un.find(c=>c.function.name===u)).filter(Boolean),human_in_the_loop:!1,template_slug:o.slug}).returning("id","name","type","created_at").run();o.usage_count=(o.usage_count??0)+1;let l=o.default_skills??[];for(let u of l)try{let{resolve:c,dirname:d}=await import("node:path"),{fileURLToPath:p}=await import("node:url"),m=d(p(import.meta.url)),h=c(m,"..","..","skills","builtin",u);await t.orm.query.insert("agent_skills").values({agent_id:String(a.id),skill_name:u,skill_dir:h}).onConflict(["agent_id","skill_name"]).run()}catch{console.warn(`[role-templates] \u7ED1\u5B9A\u6280\u80FD ${u} \u5931\u8D25`)}try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_create",target_type:"agent",target_id:String(a.id),detail:{name:String(a.name??""),source:"template"}})}catch{}return Response.json({agent:a},{status:201})})}var Ow,Ki=N(()=>{"use strict";re();Xc();Ow=[{slug:"developer",name:"\u5F00\u53D1\u52A9\u624B",icon:"\u{1F468}\u200D\u{1F4BB}",category:"engineering",description:"\u8F85\u52A9\u4EE3\u7801\u7F16\u5199\u3001\u91CD\u6784\u3001Debug\u3001Code Review\u3002\u9700\u8981\u9879\u76EE\u5DE5\u4F5C\u76EE\u5F55\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u8D44\u6DF1\u8F6F\u4EF6\u5F00\u53D1\u5DE5\u7A0B\u5E08\u3002\u5E2E\u52A9\u5206\u6790\u4EE3\u7801\u3001\u7F16\u5199\u4EE3\u7801\u3001\u8C03\u8BD5\u95EE\u9898\u3002\u4F7F\u7528 read \u5DE5\u5177\u4E86\u89E3\u9879\u76EE\u7ED3\u6784\uFF0Cwrite/edit \u5DE5\u5177\u4FEE\u6539\u4EE3\u7801\uFF0Cbash \u5DE5\u5177\u8FD0\u884C\u6D4B\u8BD5\u3002",default_model:null,default_temperature:.7,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u9879\u76EE\u6839\u76EE\u5F55\u8DEF\u5F84\uFF08\u5982 /data/projects/my-app\uFF09",default_skills:["search-knowledge-base","get-current-time"]},{slug:"customer-support",name:"\u667A\u80FD\u5BA2\u670D",icon:"\u{1F3A7}",category:"support",description:"\u81EA\u52A8\u56DE\u590D\u7528\u6237\u95EE\u9898\uFF0C\u652F\u6301\u77E5\u8BC6\u5E93\u68C0\u7D22\u548C\u4EBA\u5DE5\u5BA1\u6279\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u5BA2\u670D\u52A9\u624B\u3002\u6839\u636E\u77E5\u8BC6\u5E93\u51C6\u786E\u56DE\u7B54\u7528\u6237\u95EE\u9898\u3002\u5982\u679C\u65E0\u6CD5\u786E\u5B9A\uFF0C\u8BF7\u793C\u8C8C\u5730\u8F6C\u63A5\u4EBA\u5DE5\u5BA2\u670D\u3002",default_model:null,default_temperature:.5,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"product-manager",name:"\u4EA7\u54C1\u7ECF\u7406\u52A9\u624B",icon:"\u{1F4CB}",category:"product",description:"\u64B0\u5199 PRD\u3001\u5206\u6790\u9700\u6C42\u3001\u7BA1\u7406 Roadmap\u3001\u7ADE\u54C1\u5206\u6790\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u8D44\u6DF1\u4EA7\u54C1\u7ECF\u7406\u3002\u5E2E\u52A9\u64B0\u5199\u4EA7\u54C1\u6587\u6863\u3001\u5206\u6790\u7528\u6237\u9700\u6C42\u3001\u68B3\u7406 Roadmap\u3002\u8F93\u51FA\u6587\u6863\u4FDD\u5B58\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E2D\u3002",default_model:null,default_temperature:.8,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!1,default_workspace_hint:"\u6587\u6863\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u5982 /data/docs/products\uFF09",default_skills:["search-knowledge-base"]},{slug:"data-analyst",name:"\u6570\u636E\u5206\u6790\u5E08",icon:"\u{1F4CA}",category:"data",description:"SQL \u67E5\u8BE2\u3001\u6570\u636E\u53EF\u89C6\u5316\u3001\u62A5\u8868\u751F\u6210\u3002\u9700\u8981\u547D\u4EE4\u6267\u884C\u6743\u9650\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u6570\u636E\u5206\u6790\u5E08\u3002\u4F7F\u7528 SQL \u67E5\u8BE2\u6570\u636E\u3001\u7F16\u5199\u811A\u672C\u5904\u7406\u6570\u636E\u3001\u751F\u6210\u56FE\u8868\u3001\u64B0\u5199\u5206\u6790\u62A5\u544A\u3002",default_model:null,default_temperature:.6,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u5206\u6790\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u5982 /data/analytics\uFF09",default_skills:["search-knowledge-base"]},{slug:"hr-assistant",name:"HR \u52A9\u624B",icon:"\u{1F3E2}",category:"operations",description:"\u5458\u5DE5\u653F\u7B56\u95EE\u7B54\u3001\u5165\u804C\u6D41\u7A0B\u3001\u62DB\u8058\u8DDF\u8FDB\u3002",default_system_prompt:"\u4F60\u662F HR \u52A9\u624B\u3002\u6839\u636E\u516C\u53F8\u653F\u7B56\u6587\u6863\u56DE\u7B54\u5458\u5DE5\u95EE\u9898\uFF0C\u534F\u52A9\u5904\u7406\u5165\u804C\u3001\u4F11\u5047\u7B49\u6D41\u7A0B\u3002\u5BF9\u6240\u6709\u4EBA\u4E8B\u76F8\u5173\u7684\u8F93\u51FA\u4FDD\u6301\u4E13\u4E1A\u548C\u4FDD\u5BC6\u3002",default_model:null,default_temperature:.5,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"ops-bot",name:"\u8FD0\u7EF4\u673A\u5668\u4EBA",icon:"\u{1F527}",category:"engineering",description:"\u7CFB\u7EDF\u76D1\u63A7\u3001\u544A\u8B66\u54CD\u5E94\u3001\u81EA\u52A8\u5316\u8FD0\u7EF4\u3002\u9700\u547D\u4EE4\u6267\u884C\u6743\u9650\uFF0C\u9AD8\u5371\u64CD\u4F5C\u9700\u5BA1\u6279\u3002",default_system_prompt:"\u4F60\u662F\u8FD0\u7EF4\u5DE5\u7A0B\u5E08\u3002\u54CD\u5E94\u544A\u8B66\u3001\u6392\u67E5\u6545\u969C\u3001\u6267\u884C\u7EF4\u62A4\u64CD\u4F5C\u3002\u9AD8\u5371\u64CD\u4F5C\uFF08rm\u3001drop\u3001deploy \u7B49\uFF09\u9700\u8981\u4EBA\u5DE5\u5BA1\u6279\u3002\u6240\u6709\u64CD\u4F5C\u8BB0\u5F55\u65E5\u5FD7\u3002",default_model:null,default_temperature:.3,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u8FD0\u7EF4\u811A\u672C\u76EE\u5F55\uFF08\u5982 /data/ops/scripts\uFF09",default_skills:["search-knowledge-base","get-current-time"]},{slug:"sales-assistant",name:"\u9500\u552E\u52A9\u624B",icon:"\u{1F4C8}",category:"business",description:"\u65B9\u6848\u64B0\u5199\u3001\u62A5\u4EF7\u7BA1\u7406\u3001Pipeline \u8DDF\u8E2A\u3002",default_system_prompt:"\u4F60\u662F\u9500\u552E\u52A9\u624B\u3002\u5E2E\u52A9\u64B0\u5199\u65B9\u6848\u4E66\u3001\u8DDF\u8FDB\u7EBF\u7D22\u3001\u7BA1\u7406 Pipeline\u3002\u8F93\u51FA\u6587\u6863\u4FDD\u5B58\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E2D\u3002",default_model:null,default_temperature:.7,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!1,default_workspace_hint:"\u9500\u552E\u6587\u6863\u76EE\u5F55\uFF08\u5982 /data/sales/proposals\uFF09",default_skills:["search-knowledge-base"]},{slug:"executive-assistant",name:"\u9AD8\u7BA1\u52A9\u7406",icon:"\u{1F454}",category:"management",description:"\u6570\u636E\u6C47\u603B\u3001\u62A5\u544A\u751F\u6210\u3001\u8DE8\u90E8\u95E8\u534F\u8C03\u3002",default_system_prompt:"\u4F60\u662F\u9AD8\u7BA1\u52A9\u7406\u3002\u6C47\u603B\u591A\u90E8\u95E8\u6570\u636E\u3001\u751F\u6210\u62A5\u544A\u3001\u534F\u8C03\u8DE8\u90E8\u95E8\u5DE5\u4F5C\u3002\u5BF9\u5916\u8F93\u51FA\u9700\u8981\u76F8\u5173\u65B9\u786E\u8BA4\u3002",default_model:null,default_temperature:.6,default_max_tokens:4096,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"general",name:"\u901A\u7528\u52A9\u624B",icon:"\u{1F916}",category:"general",description:"\u901A\u7528 AI \u52A9\u624B\uFF0C\u65E0\u7279\u6B8A\u6743\u9650\u3002\u9002\u5408\u7B80\u5355\u95EE\u7B54\u573A\u666F\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u6709\u7528\u7684 AI \u52A9\u624B\u3002",default_model:null,default_temperature:.7,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:[]}]});var td={};ie(td,{getLicenseInfo:()=>N0,getWhiteLabelInfo:()=>M0});function N0(){let n=process.env.LICENSE_KEY?.trim()??"",e=process.env.LICENSE_TO?.trim()??null,t=!!e&&new Date(e+"T23:59:59").getTime()<Date.now();return{key:n?n.slice(0,8)+"\u2026":"",edition:n?"licensed":"community",expiresAt:e,expired:t}}function M0(){return{name:process.env.WHITE_LABEL_NAME?.trim()||"Agent Platform",logo:process.env.WHITE_LABEL_LOGO?.trim()||"A",brand:process.env.WHITE_LABEL_BRAND?.trim()||""}}var nd=N(()=>{"use strict"});var rd={};ie(rd,{formatOutboundBody:()=>D0});function D0(n,e,t){let r=Mw[n]??Mw.generic,s=e.length>r?e.slice(0,r-1)+"\u2026":e;switch(n){case"wecom":return JSON.stringify({msgtype:"text",text:{content:s}});case"dingtalk":return JSON.stringify({msgtype:"text",text:{content:s}});case"feishu":return JSON.stringify({msg_type:"text",content:{text:s}});default:return JSON.stringify({reply:s,conversation_id:t??null,timestamp:Date.now()})}}var Mw,sd=N(()=>{"use strict";Mw={wecom:2048,dingtalk:2e4,feishu:15e4,generic:1e5}});var ad={};ie(ad,{checkNonce:()=>Lw,handleWebhookMessage:()=>id,planBlockForApp:()=>B0,verifyDingtalkSign:()=>U0,verifySignature:()=>jw});import{createHmac as od,timingSafeEqual as Dw}from"node:crypto";function j0(n,e,t){return od("sha256",e).update(`${t}.${n}`).digest("hex")}async function L0(n){if(process.env.WEBHOOK_SSRF_ALLOW_PRIVATE==="1")return!0;try{let e=new URL(n);if(e.protocol!=="http:"&&e.protocol!=="https:")return!1;let t=e.hostname;if(t==="localhost"||t==="0.0.0.0"||t==="::1"||t==="127.0.0.1")return!1;let r=o=>{let a=o.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);if(!a)return o.includes(":");let[l,u]=a.slice(1).map(Number);return l===0||l===10||l===127||l===169&&u===254||l===172&&u>=16&&u<=31||l===192&&u===168};if(r(t))return!1;let{lookup:s}=await import("node:dns/promises"),i=await s(t).catch(()=>[]);if(!Array.isArray(i)||i.length===0)return!1;for(let o of i)if(r(o.address))return!1;return!0}catch{return!1}}async function W0(n,e,t){let r=n?.webhook_url?String(n.webhook_url):"";if(!r)return!0;if(!await L0(r))return!1;let s=n?.webhook_secret?String(n.webhook_secret):"",i=Math.max(1,Number(n?.webhook_retry_count??3)),{formatOutboundBody:o}=await Promise.resolve().then(()=>(sd(),rd)),a=o(String(n?.webhook_platform??"generic"),e,t);for(let l=0;l<i;l++)try{let u=String(Date.now()),c={"Content-Type":"application/json","X-Timestamp":u};if(s&&(c["X-Signature"]=j0(a,s,u)),(await fetch(r,{method:"POST",headers:c,body:a})).ok)return!0;l<i-1&&await new Promise(p=>setTimeout(p,200*(l+1)))}catch{l<i-1&&await new Promise(u=>setTimeout(u,200*(l+1)))}return!1}function jw(n,e,t,r){try{let s=r?`${r}.${n}`:n,i=od("sha256",t).update(s).digest("hex"),o=e.toLowerCase(),a=Buffer.from(i,"hex"),l=Buffer.from(o,"hex");return a.length!==l.length?!1:Dw(a,l)}catch{return!1}}function U0(n,e,t,r){try{let s=`${e}
344
- ${r}`,i=od("sha256",r).update(s).digest("base64"),o=Buffer.from(i),a=Buffer.from(t);return o.length!==a.length?!1:Dw(o,a)}catch{return!1}}function Lw(n,e){if(!n||!e)return!0;let t=Number(e);if(!Number.isFinite(t)||Math.abs(Date.now()-t)>5*6e4)return!1;let r=Date.now();for(let[s,i]of Gi)r-i>5*6e4&&Gi.delete(s);return Gi.has(n)?!1:(Gi.set(n,r),!0)}async function B0(n,e){try{let{planBlockReason:t}=await Promise.resolve().then(()=>(Fs(),Hs));return await t(n.orm,e)}catch{return null}}async function id(n,e,t,r,s,i,o){let{ai:a}=n,l=Date.now(),u=(await n.orm.query.from("agents").select("id","system_prompt","model","tools","temperature","max_tokens","webhook_secret","webhook_retry_count","webhook_url","app_id").where({id:{eq:e},type:{eq:"webhook"},is_active:{eq:!0},...r?{app_id:{eq:String(r)}}:{}}).limit(1).run())[0];if(!u)throw new Error("Webhook Bot not found or inactive");if(u.webhook_secret){if(!s)throw await Ur(n,e,u.app_id,JSON.stringify(t),null,401,Date.now()-l,!1),new Error("Missing X-Signature header");let f=JSON.stringify(t);if(!jw(f,s,u.webhook_secret,i))throw await Ur(n,e,u.app_id,f,null,403,Date.now()-l,!1),new Error("Invalid signature");if(!Lw(o,i))throw await Ur(n,e,u.app_id,f,null,403,Date.now()-l,!1),new Error("Replay detected or stale timestamp")}let c=u.system_prompt??"\u4F60\u662F\u4E00\u4E2A Webhook Bot\u3002",d=u.tools??[],p=u.webhook_retry_count??3,m=await H0(n,e,t.conversation_id,10),h=a.agent({model:u.model,systemPrompt:c,tools:d,maxSteps:d.length>0?5:1});try{let f=await h.runToResult([...m,{role:"user",content:t.content}]);await $w(n,e,t.conversation_id,"user",t.content),await $w(n,e,t.conversation_id,"assistant",f.content);let g=Date.now()-l;if(await Ur(n,e,u.app_id,JSON.stringify(t),f.content,200,g,!0),await qw(n,e),u.webhook_url){let w=await W0(u,f.content,t.conversation_id);await Ur(n,e,u.app_id,`OUTBOUND \u2192 ${String(u.webhook_url)}`,f.content,w?200:502,Date.now()-l,w)}return{reply:f.content,conversation_id:t.conversation_id}}catch(f){let g=Date.now()-l,w=f instanceof Error?f.message:String(f);throw await Ur(n,e,u.app_id,JSON.stringify(t),w,500,g,!1),await qw(n,e),f}}async function H0(n,e,t,r){if(!t)return[];try{let s=n.orm;if(!s)return[];let i=await s.query.from("webhook_conversations").select("role","content").where({agent_id:e,conversation_id:t}).orderBy("created_at","asc").limit(r*2).run(),o=Array.isArray(i)?i:[i],a=Math.floor(o.length/2),l=Math.min(a,r);return o.slice(o.length-l*2).map(c=>({role:c.role,content:String(c.content??"")}))}catch{return[]}}async function $w(n,e,t,r,s){if(t)try{let i=n.orm;if(!i)return;await i.query.insert("webhook_conversations").values({agent_id:e,conversation_id:t,role:r,content:s}).run()}catch{}}async function qw(n,e){try{let t=n.orm;if(!t)return;let s=(await t.query.from("webhook_logs").select("id").where({agent_id:e}).orderBy("created_at","desc").limit(500).run()).map(i=>String(i.id));await t.query.delete("webhook_logs").where({agent_id:e,...s.length?{id:{notIn:s}}:{}}).run()}catch{}}async function Ur(n,e,t,r,s,i,o,a){try{let l=n.orm;l&&await l.query.insert("webhook_logs").values({agent_id:e,app_id:t,request_body:r,response_body:s,response_status:i,elapsed_ms:o,success:a}).run()}catch{}}var Gi,Qi=N(()=>{"use strict";Gi=new Map});var Xi={};ie(Xi,{approveArtifact:()=>zw,flushPendingArtifacts:()=>Z0,listPendingArtifacts:()=>Vw,pendingDirOf:()=>Vs,rejectArtifact:()=>J0});async function Vs(n,e){try{let{resolveDepartmentWorkspace:t}=await Promise.resolve().then(()=>(Ie(),qe)),[r]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),s=await t(e,r?.workspace_path,!0);if(!s)return null;let{join:i}=await import("node:path"),{mkdir:o}=await import("node:fs/promises"),a=i(s,".pending");return await o(a,{recursive:!0}),a}catch{return null}}async function Vw(n,e){let t=await Vs(n,e);if(!t)return[];try{let{readdir:r,stat:s}=await import("node:fs/promises"),{join:i}=await import("node:path"),o=await r(t,{withFileTypes:!0}),a=[];for(let l of o){if(l.name.startsWith("."))continue;let u=i(t,l.name);try{let c=await s(u);if(l.isDirectory()){let d=await r(u,{withFileTypes:!0});for(let p of d){if(p.name.startsWith("."))continue;let m=i(u,p.name);try{let h=await s(m);p.isFile()&&a.push({path:`${l.name}/${p.name}`,size:h.size,mtime:h.mtime.toISOString()})}catch{}}}else a.push({path:l.name,size:c.size,mtime:c.mtime.toISOString()})}catch{}}return a.sort((l,u)=>l.path.localeCompare(u.path)),a}catch{return[]}}async function zw(n,e,t){let r=await Vs(n,e);if(!r)return{ok:!1,error:"\u5F85\u5BA1\u533A\u4E0D\u53EF\u7528"};if(!t||t.includes("..")||t.startsWith("/"))return{ok:!1,error:"\u975E\u6CD5\u8DEF\u5F84"};try{let{resolveDepartmentWorkspace:s}=await Promise.resolve().then(()=>(Ie(),qe)),[i]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),o=await s(e,i?.workspace_path,!0);if(!o)return{ok:!1,error:"\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528"};let{rename:a,mkdir:l,access:u}=await import("node:fs/promises"),{join:c,dirname:d}=await import("node:path"),p=c(r,t),m=c(o,t);try{await u(p)}catch{return{ok:!0,error:"\u5F85\u5BA1\u6587\u4EF6\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u5904\u7406\uFF09"}}return await l(d(m),{recursive:!0}),await a(p,m),{ok:!0}}catch(s){return{ok:!1,error:`\u53D1\u5E03\u5931\u8D25: ${s?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}async function J0(n,e,t){let r=await Vs(n,e);if(!r)return{ok:!1,error:"\u5F85\u5BA1\u533A\u4E0D\u53EF\u7528"};if(!t||t.includes("..")||t.startsWith("/"))return{ok:!1,error:"\u975E\u6CD5\u8DEF\u5F84"};try{let{rm:s,access:i}=await import("node:fs/promises"),{join:o}=await import("node:path"),a=o(r,t);try{await i(a)}catch{return{ok:!0,error:"\u5F85\u5BA1\u6587\u4EF6\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u5904\u7406\uFF09"}}return await s(a,{recursive:!0,force:!0}),{ok:!0}}catch(s){return{ok:!1,error:`\u5220\u9664\u5931\u8D25: ${s?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}async function Z0(n,e){let t=await Vs(n,e);if(!t)return 0;let r=await Vw(n,e),s=0;for(let i of r)(await zw(n,e,i.path)).ok&&s++;try{let{readdir:i,rm:o}=await import("node:fs/promises"),{join:a}=await import("node:path");for(let l of await i(t))l.startsWith(".")||await o(a(t,l),{recursive:!0,force:!0})}catch{}return s}var Yi=N(()=>{"use strict"});var ty={};ie(ty,{setupSurveyRoster:()=>Y0,surveyContract:()=>ey});function ey(n,e){return`${n}
343
+ `)}d.close()}});return new Response(c,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}),n.get("/api/agents/:id/versions",async(e,t)=>{let{listVersions:r}=await Promise.resolve().then(()=>(Gi(),Ki)),s=await r(t,String(t.params.id));return Response.json({versions:s})}),n.post("/api/agents/:id/versions",async(e,t)=>{let{saveVersion:r}=await Promise.resolve().then(()=>(Gi(),Ki)),s=await e.json().catch(()=>({})),o=await r(t,String(t.params.id),s.note);if(!o)throw new T("Agent \u4E0D\u5B58\u5728",404);return Response.json({version:o},{status:201})}),n.post("/api/agents/:id/versions/:versionId/rollback",async(e,t)=>{let{rollbackVersion:r}=await Promise.resolve().then(()=>(Gi(),Ki)),s=await r(t,String(t.params.id),String(t.params.versionId));return s.ok?Response.json({ok:!0,note:s.note}):Response.json({error:s.note},{status:404})})}var Ow,Xj,td=I(()=>{"use strict";re();re();Bi();nt();Fs();Fs();Ow=un,Xj=Ow.map(n=>n.function.name)});var rd={};ie(rd,{getRoleTemplates:()=>I0,registerRoleTemplateRoutes:()=>nd});import{resolve as O0}from"node:path";function I0(){return[...Pw].sort((n,e)=>(e.usage_count??0)-(n.usage_count??0))}function nd(n){n.post("/api/agents/from-template",async(e,t)=>{let{sql:r,appId:s}=t,o=await e.json(),i=Pw.find(u=>u.slug===o.template_slug);if(!i)return Response.json({error:`\u6A21\u677F "${o.template_slug}" \u4E0D\u5B58\u5728`},{status:400});if(!o.name?.trim())throw new T("name \u4E3A\u5FC5\u586B",400);let[a]=await t.orm.query.insert("agents").values({app_id:s,type:"ai",name:o.name.trim(),description:o.description??i.description,model:o.model??i.default_model,system_prompt:o.system_prompt??i.default_system_prompt,temperature:o.temperature??i.default_temperature,max_tokens:o.max_tokens??i.default_max_tokens,workspace_path:o.workspace_path??i.default_workspace_hint??null,allow_file_tools:o.allow_file_tools??i.default_allow_file_tools,allow_command_exec:o.allow_command_exec??i.default_allow_command_exec,tools:(i.default_skills??[]).map(u=>un.find(c=>c.function.name===u)).filter(Boolean),human_in_the_loop:!1,template_slug:i.slug}).returning("id","name","type","created_at").run();i.usage_count=(i.usage_count??0)+1;let l=i.default_skills??[];for(let u of l)try{let c=O0(je,"skills","builtin",u);await t.orm.query.insert("agent_skills").values({agent_id:String(a.id),skill_name:u,skill_dir:c}).onConflict(["agent_id","skill_name"]).run()}catch{console.warn(`[role-templates] \u7ED1\u5B9A\u6280\u80FD ${u} \u5931\u8D25`)}try{let{writeAudit:u}=await Promise.resolve().then(()=>(st(),rt));await u(t,{action:"agent_create",target_type:"agent",target_id:String(a.id),detail:{name:String(a.name??""),source:"template"}})}catch{}return Response.json({agent:a},{status:201})})}var Pw,Qi=I(()=>{"use strict";re();Or();td();Pw=[{slug:"developer",name:"\u5F00\u53D1\u52A9\u624B",icon:"\u{1F468}\u200D\u{1F4BB}",category:"engineering",description:"\u8F85\u52A9\u4EE3\u7801\u7F16\u5199\u3001\u91CD\u6784\u3001Debug\u3001Code Review\u3002\u9700\u8981\u9879\u76EE\u5DE5\u4F5C\u76EE\u5F55\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u8D44\u6DF1\u8F6F\u4EF6\u5F00\u53D1\u5DE5\u7A0B\u5E08\u3002\u5E2E\u52A9\u5206\u6790\u4EE3\u7801\u3001\u7F16\u5199\u4EE3\u7801\u3001\u8C03\u8BD5\u95EE\u9898\u3002\u4F7F\u7528 read \u5DE5\u5177\u4E86\u89E3\u9879\u76EE\u7ED3\u6784\uFF0Cwrite/edit \u5DE5\u5177\u4FEE\u6539\u4EE3\u7801\uFF0Cbash \u5DE5\u5177\u8FD0\u884C\u6D4B\u8BD5\u3002",default_model:null,default_temperature:.7,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u9879\u76EE\u6839\u76EE\u5F55\u8DEF\u5F84\uFF08\u5982 /data/projects/my-app\uFF09",default_skills:["search-knowledge-base","get-current-time"]},{slug:"customer-support",name:"\u667A\u80FD\u5BA2\u670D",icon:"\u{1F3A7}",category:"support",description:"\u81EA\u52A8\u56DE\u590D\u7528\u6237\u95EE\u9898\uFF0C\u652F\u6301\u77E5\u8BC6\u5E93\u68C0\u7D22\u548C\u4EBA\u5DE5\u5BA1\u6279\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u5BA2\u670D\u52A9\u624B\u3002\u6839\u636E\u77E5\u8BC6\u5E93\u51C6\u786E\u56DE\u7B54\u7528\u6237\u95EE\u9898\u3002\u5982\u679C\u65E0\u6CD5\u786E\u5B9A\uFF0C\u8BF7\u793C\u8C8C\u5730\u8F6C\u63A5\u4EBA\u5DE5\u5BA2\u670D\u3002",default_model:null,default_temperature:.5,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"product-manager",name:"\u4EA7\u54C1\u7ECF\u7406\u52A9\u624B",icon:"\u{1F4CB}",category:"product",description:"\u64B0\u5199 PRD\u3001\u5206\u6790\u9700\u6C42\u3001\u7BA1\u7406 Roadmap\u3001\u7ADE\u54C1\u5206\u6790\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u8D44\u6DF1\u4EA7\u54C1\u7ECF\u7406\u3002\u5E2E\u52A9\u64B0\u5199\u4EA7\u54C1\u6587\u6863\u3001\u5206\u6790\u7528\u6237\u9700\u6C42\u3001\u68B3\u7406 Roadmap\u3002\u8F93\u51FA\u6587\u6863\u4FDD\u5B58\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E2D\u3002",default_model:null,default_temperature:.8,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!1,default_workspace_hint:"\u6587\u6863\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u5982 /data/docs/products\uFF09",default_skills:["search-knowledge-base"]},{slug:"data-analyst",name:"\u6570\u636E\u5206\u6790\u5E08",icon:"\u{1F4CA}",category:"data",description:"SQL \u67E5\u8BE2\u3001\u6570\u636E\u53EF\u89C6\u5316\u3001\u62A5\u8868\u751F\u6210\u3002\u9700\u8981\u547D\u4EE4\u6267\u884C\u6743\u9650\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u6570\u636E\u5206\u6790\u5E08\u3002\u4F7F\u7528 SQL \u67E5\u8BE2\u6570\u636E\u3001\u7F16\u5199\u811A\u672C\u5904\u7406\u6570\u636E\u3001\u751F\u6210\u56FE\u8868\u3001\u64B0\u5199\u5206\u6790\u62A5\u544A\u3002",default_model:null,default_temperature:.6,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u5206\u6790\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF08\u5982 /data/analytics\uFF09",default_skills:["search-knowledge-base"]},{slug:"hr-assistant",name:"HR \u52A9\u624B",icon:"\u{1F3E2}",category:"operations",description:"\u5458\u5DE5\u653F\u7B56\u95EE\u7B54\u3001\u5165\u804C\u6D41\u7A0B\u3001\u62DB\u8058\u8DDF\u8FDB\u3002",default_system_prompt:"\u4F60\u662F HR \u52A9\u624B\u3002\u6839\u636E\u516C\u53F8\u653F\u7B56\u6587\u6863\u56DE\u7B54\u5458\u5DE5\u95EE\u9898\uFF0C\u534F\u52A9\u5904\u7406\u5165\u804C\u3001\u4F11\u5047\u7B49\u6D41\u7A0B\u3002\u5BF9\u6240\u6709\u4EBA\u4E8B\u76F8\u5173\u7684\u8F93\u51FA\u4FDD\u6301\u4E13\u4E1A\u548C\u4FDD\u5BC6\u3002",default_model:null,default_temperature:.5,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"ops-bot",name:"\u8FD0\u7EF4\u673A\u5668\u4EBA",icon:"\u{1F527}",category:"engineering",description:"\u7CFB\u7EDF\u76D1\u63A7\u3001\u544A\u8B66\u54CD\u5E94\u3001\u81EA\u52A8\u5316\u8FD0\u7EF4\u3002\u9700\u547D\u4EE4\u6267\u884C\u6743\u9650\uFF0C\u9AD8\u5371\u64CD\u4F5C\u9700\u5BA1\u6279\u3002",default_system_prompt:"\u4F60\u662F\u8FD0\u7EF4\u5DE5\u7A0B\u5E08\u3002\u54CD\u5E94\u544A\u8B66\u3001\u6392\u67E5\u6545\u969C\u3001\u6267\u884C\u7EF4\u62A4\u64CD\u4F5C\u3002\u9AD8\u5371\u64CD\u4F5C\uFF08rm\u3001drop\u3001deploy \u7B49\uFF09\u9700\u8981\u4EBA\u5DE5\u5BA1\u6279\u3002\u6240\u6709\u64CD\u4F5C\u8BB0\u5F55\u65E5\u5FD7\u3002",default_model:null,default_temperature:.3,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!0,default_workspace_hint:"\u8FD0\u7EF4\u811A\u672C\u76EE\u5F55\uFF08\u5982 /data/ops/scripts\uFF09",default_skills:["search-knowledge-base","get-current-time"]},{slug:"sales-assistant",name:"\u9500\u552E\u52A9\u624B",icon:"\u{1F4C8}",category:"business",description:"\u65B9\u6848\u64B0\u5199\u3001\u62A5\u4EF7\u7BA1\u7406\u3001Pipeline \u8DDF\u8E2A\u3002",default_system_prompt:"\u4F60\u662F\u9500\u552E\u52A9\u624B\u3002\u5E2E\u52A9\u64B0\u5199\u65B9\u6848\u4E66\u3001\u8DDF\u8FDB\u7EBF\u7D22\u3001\u7BA1\u7406 Pipeline\u3002\u8F93\u51FA\u6587\u6863\u4FDD\u5B58\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E2D\u3002",default_model:null,default_temperature:.7,default_max_tokens:4096,default_allow_file_tools:!0,default_allow_command_exec:!1,default_workspace_hint:"\u9500\u552E\u6587\u6863\u76EE\u5F55\uFF08\u5982 /data/sales/proposals\uFF09",default_skills:["search-knowledge-base"]},{slug:"executive-assistant",name:"\u9AD8\u7BA1\u52A9\u7406",icon:"\u{1F454}",category:"management",description:"\u6570\u636E\u6C47\u603B\u3001\u62A5\u544A\u751F\u6210\u3001\u8DE8\u90E8\u95E8\u534F\u8C03\u3002",default_system_prompt:"\u4F60\u662F\u9AD8\u7BA1\u52A9\u7406\u3002\u6C47\u603B\u591A\u90E8\u95E8\u6570\u636E\u3001\u751F\u6210\u62A5\u544A\u3001\u534F\u8C03\u8DE8\u90E8\u95E8\u5DE5\u4F5C\u3002\u5BF9\u5916\u8F93\u51FA\u9700\u8981\u76F8\u5173\u65B9\u786E\u8BA4\u3002",default_model:null,default_temperature:.6,default_max_tokens:4096,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:["search-knowledge-base"]},{slug:"general",name:"\u901A\u7528\u52A9\u624B",icon:"\u{1F916}",category:"general",description:"\u901A\u7528 AI \u52A9\u624B\uFF0C\u65E0\u7279\u6B8A\u6743\u9650\u3002\u9002\u5408\u7B80\u5355\u95EE\u7B54\u573A\u666F\u3002",default_system_prompt:"\u4F60\u662F\u4E00\u4E2A\u6709\u7528\u7684 AI \u52A9\u624B\u3002",default_model:null,default_temperature:.7,default_max_tokens:2048,default_allow_file_tools:!1,default_allow_command_exec:!1,default_workspace_hint:null,default_skills:[]}]});var sd={};ie(sd,{getLicenseInfo:()=>P0,getWhiteLabelInfo:()=>N0});function P0(){let n=process.env.LICENSE_KEY?.trim()??"",e=process.env.LICENSE_TO?.trim()??null,t=!!e&&new Date(e+"T23:59:59").getTime()<Date.now();return{key:n?n.slice(0,8)+"\u2026":"",edition:n?"licensed":"community",expiresAt:e,expired:t}}function N0(){return{name:process.env.WHITE_LABEL_NAME?.trim()||"Agent Platform",logo:process.env.WHITE_LABEL_LOGO?.trim()||"A",brand:process.env.WHITE_LABEL_BRAND?.trim()||""}}var od=I(()=>{"use strict"});var id={};ie(id,{formatOutboundBody:()=>D0});function D0(n,e,t){let r=Mw[n]??Mw.generic,s=e.length>r?e.slice(0,r-1)+"\u2026":e;switch(n){case"wecom":return JSON.stringify({msgtype:"text",text:{content:s}});case"dingtalk":return JSON.stringify({msgtype:"text",text:{content:s}});case"feishu":return JSON.stringify({msg_type:"text",content:{text:s}});default:return JSON.stringify({reply:s,conversation_id:t??null,timestamp:Date.now()})}}var Mw,ad=I(()=>{"use strict";Mw={wecom:2048,dingtalk:2e4,feishu:15e4,generic:1e5}});var cd={};ie(cd,{checkNonce:()=>Lw,handleWebhookMessage:()=>ud,planBlockForApp:()=>B0,verifyDingtalkSign:()=>U0,verifySignature:()=>jw});import{createHmac as ld,timingSafeEqual as Dw}from"node:crypto";function j0(n,e,t){return ld("sha256",e).update(`${t}.${n}`).digest("hex")}async function L0(n){if(process.env.WEBHOOK_SSRF_ALLOW_PRIVATE==="1")return!0;try{let e=new URL(n);if(e.protocol!=="http:"&&e.protocol!=="https:")return!1;let t=e.hostname;if(t==="localhost"||t==="0.0.0.0"||t==="::1"||t==="127.0.0.1")return!1;let r=i=>{let a=i.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);if(!a)return i.includes(":");let[l,u]=a.slice(1).map(Number);return l===0||l===10||l===127||l===169&&u===254||l===172&&u>=16&&u<=31||l===192&&u===168};if(r(t))return!1;let{lookup:s}=await import("node:dns/promises"),o=await s(t).catch(()=>[]);if(!Array.isArray(o)||o.length===0)return!1;for(let i of o)if(r(i.address))return!1;return!0}catch{return!1}}async function W0(n,e,t){let r=n?.webhook_url?String(n.webhook_url):"";if(!r)return!0;if(!await L0(r))return!1;let s=n?.webhook_secret?String(n.webhook_secret):"",o=Math.max(1,Number(n?.webhook_retry_count??3)),{formatOutboundBody:i}=await Promise.resolve().then(()=>(ad(),id)),a=i(String(n?.webhook_platform??"generic"),e,t);for(let l=0;l<o;l++)try{let u=String(Date.now()),c={"Content-Type":"application/json","X-Timestamp":u};if(s&&(c["X-Signature"]=j0(a,s,u)),(await fetch(r,{method:"POST",headers:c,body:a})).ok)return!0;l<o-1&&await new Promise(p=>setTimeout(p,200*(l+1)))}catch{l<o-1&&await new Promise(u=>setTimeout(u,200*(l+1)))}return!1}function jw(n,e,t,r){try{let s=r?`${r}.${n}`:n,o=ld("sha256",t).update(s).digest("hex"),i=e.toLowerCase(),a=Buffer.from(o,"hex"),l=Buffer.from(i,"hex");return a.length!==l.length?!1:Dw(a,l)}catch{return!1}}function U0(n,e,t,r){try{let s=`${e}
344
+ ${r}`,o=ld("sha256",r).update(s).digest("base64"),i=Buffer.from(o),a=Buffer.from(t);return i.length!==a.length?!1:Dw(i,a)}catch{return!1}}function Lw(n,e){if(!n||!e)return!0;let t=Number(e);if(!Number.isFinite(t)||Math.abs(Date.now()-t)>5*6e4)return!1;let r=Date.now();for(let[s,o]of Ji)r-o>5*6e4&&Ji.delete(s);return Ji.has(n)?!1:(Ji.set(n,r),!0)}async function B0(n,e){try{let{planBlockReason:t}=await Promise.resolve().then(()=>(Ks(),zs));return await t(n.orm,e)}catch{return null}}async function ud(n,e,t,r,s,o,i){let{ai:a}=n,l=Date.now(),u=(await n.orm.query.from("agents").select("id","system_prompt","model","tools","temperature","max_tokens","webhook_secret","webhook_retry_count","webhook_url","app_id").where({id:{eq:e},type:{eq:"webhook"},is_active:{eq:!0},...r?{app_id:{eq:String(r)}}:{}}).limit(1).run())[0];if(!u)throw new Error("Webhook Bot not found or inactive");if(u.webhook_secret){if(!s)throw await Br(n,e,u.app_id,JSON.stringify(t),null,401,Date.now()-l,!1),new Error("Missing X-Signature header");let m=JSON.stringify(t);if(!jw(m,s,u.webhook_secret,o))throw await Br(n,e,u.app_id,m,null,403,Date.now()-l,!1),new Error("Invalid signature");if(!Lw(i,o))throw await Br(n,e,u.app_id,m,null,403,Date.now()-l,!1),new Error("Replay detected or stale timestamp")}let c=u.system_prompt??"\u4F60\u662F\u4E00\u4E2A Webhook Bot\u3002",d=u.tools??[],p=u.webhook_retry_count??3,f=await H0(n,e,t.conversation_id,10),w=a.agent({model:u.model,systemPrompt:c,tools:d,maxSteps:d.length>0?5:1});try{let m=await w.runToResult([...f,{role:"user",content:t.content}]);await $w(n,e,t.conversation_id,"user",t.content),await $w(n,e,t.conversation_id,"assistant",m.content);let g=Date.now()-l;if(await Br(n,e,u.app_id,JSON.stringify(t),m.content,200,g,!0),await qw(n,e),u.webhook_url){let h=await W0(u,m.content,t.conversation_id);await Br(n,e,u.app_id,`OUTBOUND \u2192 ${String(u.webhook_url)}`,m.content,h?200:502,Date.now()-l,h)}return{reply:m.content,conversation_id:t.conversation_id}}catch(m){let g=Date.now()-l,h=m instanceof Error?m.message:String(m);throw await Br(n,e,u.app_id,JSON.stringify(t),h,500,g,!1),await qw(n,e),m}}async function H0(n,e,t,r){if(!t)return[];try{let s=n.orm;if(!s)return[];let o=await s.query.from("webhook_conversations").select("role","content").where({agent_id:e,conversation_id:t}).orderBy("created_at","asc").limit(r*2).run(),i=Array.isArray(o)?o:[o],a=Math.floor(i.length/2),l=Math.min(a,r);return i.slice(i.length-l*2).map(c=>({role:c.role,content:String(c.content??"")}))}catch{return[]}}async function $w(n,e,t,r,s){if(t)try{let o=n.orm;if(!o)return;await o.query.insert("webhook_conversations").values({agent_id:e,conversation_id:t,role:r,content:s}).run()}catch{}}async function qw(n,e){try{let t=n.orm;if(!t)return;let s=(await t.query.from("webhook_logs").select("id").where({agent_id:e}).orderBy("created_at","desc").limit(500).run()).map(o=>String(o.id));await t.query.delete("webhook_logs").where({agent_id:e,...s.length?{id:{notIn:s}}:{}}).run()}catch{}}async function Br(n,e,t,r,s,o,i,a){try{let l=n.orm;l&&await l.query.insert("webhook_logs").values({agent_id:e,app_id:t,request_body:r,response_body:s,response_status:o,elapsed_ms:i,success:a}).run()}catch{}}var Ji,Zi=I(()=>{"use strict";Ji=new Map});var ea={};ie(ea,{approveArtifact:()=>zw,flushPendingArtifacts:()=>Z0,listPendingArtifacts:()=>Vw,pendingDirOf:()=>Gs,rejectArtifact:()=>J0});async function Gs(n,e){try{let{resolveDepartmentWorkspace:t}=await Promise.resolve().then(()=>(Ne(),De)),[r]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),s=await t(e,r?.workspace_path,!0);if(!s)return null;let{join:o}=await import("node:path"),{mkdir:i}=await import("node:fs/promises"),a=o(s,".pending");return await i(a,{recursive:!0}),a}catch{return null}}async function Vw(n,e){let t=await Gs(n,e);if(!t)return[];try{let{readdir:r,stat:s}=await import("node:fs/promises"),{join:o}=await import("node:path"),i=await r(t,{withFileTypes:!0}),a=[];for(let l of i){if(l.name.startsWith("."))continue;let u=o(t,l.name);try{let c=await s(u);if(l.isDirectory()){let d=await r(u,{withFileTypes:!0});for(let p of d){if(p.name.startsWith("."))continue;let f=o(u,p.name);try{let w=await s(f);p.isFile()&&a.push({path:`${l.name}/${p.name}`,size:w.size,mtime:w.mtime.toISOString()})}catch{}}}else a.push({path:l.name,size:c.size,mtime:c.mtime.toISOString()})}catch{}}return a.sort((l,u)=>l.path.localeCompare(u.path)),a}catch{return[]}}async function zw(n,e,t){let r=await Gs(n,e);if(!r)return{ok:!1,error:"\u5F85\u5BA1\u533A\u4E0D\u53EF\u7528"};if(!t||t.includes("..")||t.startsWith("/"))return{ok:!1,error:"\u975E\u6CD5\u8DEF\u5F84"};try{let{resolveDepartmentWorkspace:s}=await Promise.resolve().then(()=>(Ne(),De)),[o]=await n.query.from("departments").select("workspace_path").where({id:e}).limit(1).run(),i=await s(e,o?.workspace_path,!0);if(!i)return{ok:!1,error:"\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528"};let{rename:a,mkdir:l,access:u}=await import("node:fs/promises"),{join:c,dirname:d}=await import("node:path"),p=c(r,t),f=c(i,t);try{await u(p)}catch{return{ok:!0,error:"\u5F85\u5BA1\u6587\u4EF6\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u5904\u7406\uFF09"}}return await l(d(f),{recursive:!0}),await a(p,f),{ok:!0}}catch(s){return{ok:!1,error:`\u53D1\u5E03\u5931\u8D25: ${s?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}async function J0(n,e,t){let r=await Gs(n,e);if(!r)return{ok:!1,error:"\u5F85\u5BA1\u533A\u4E0D\u53EF\u7528"};if(!t||t.includes("..")||t.startsWith("/"))return{ok:!1,error:"\u975E\u6CD5\u8DEF\u5F84"};try{let{rm:s,access:o}=await import("node:fs/promises"),{join:i}=await import("node:path"),a=i(r,t);try{await o(a)}catch{return{ok:!0,error:"\u5F85\u5BA1\u6587\u4EF6\u4E0D\u5B58\u5728\uFF08\u53EF\u80FD\u5DF2\u5904\u7406\uFF09"}}return await s(a,{recursive:!0,force:!0}),{ok:!0}}catch(s){return{ok:!1,error:`\u5220\u9664\u5931\u8D25: ${s?.message??"\u672A\u77E5\u9519\u8BEF"}`}}}async function Z0(n,e){let t=await Gs(n,e);if(!t)return 0;let r=await Vw(n,e),s=0;for(let o of r)(await zw(n,e,o.path)).ok&&s++;try{let{readdir:o,rm:i}=await import("node:fs/promises"),{join:a}=await import("node:path");for(let l of await o(t))l.startsWith(".")||await i(a(t,l),{recursive:!0,force:!0})}catch{}return s}var ta=I(()=>{"use strict"});var ty={};ie(ty,{setupSurveyRoster:()=>Y0,surveyContract:()=>ey});function ey(n,e){return`${n}
345
345
 
346
346
  \u3010\u95EE\u5377\u586B\u5199\u4EFB\u52A1\u2014\u2014\u786C\u6027\u5951\u7EA6\u3011\u6536\u5230\u95EE\u5377\u4EFB\u52A1\u65F6\u2014\u2014\u5FC5\u987B\u771F\u5B9E\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\u94FE\u2014\u2014\u7981\u6B62\u4EC5\u63CF\u8FF0/\u8111\u8865\u8F93\u51FA\uFF1A
347
347
  1. bash \u5DE5\u5177\u6267\u884C\uFF1Aagent-browser open "${n}"\uFF08\u4F60\u7684\u6C99\u76D2 allow_network \u5DF2\u5F00\u542F\u2014\u2014\u5BB9\u5668\u5185 localhost \u662F\u5BB9\u5668\u81EA\u8EAB\u2014\u2014\u7528\u5BBF\u4E3B\u5730\u5740\uFF09
@@ -351,12 +351,12 @@ ${r}`,i=od("sha256",r).update(s).digest("base64"),o=Buffer.from(i),a=Buffer.from
351
351
  5. bash \u5DE5\u5177\u6267\u884C\uFF1Aagent-browser \u9A8C\u8BC1\u2014\u2014\u9875\u9762\u663E\u793A\u300C\u2705 \u5DF2\u63D0\u4EA4\u2014\u2014\u4E0D\u53EF\u4FEE\u6539\u300D\u9501\u5B9A\u6001\uFF08\u5B8C\u6210\u5224\u5B9A\u552F\u4E00\u771F\u5B9E\u4FE1\u53F7\uFF09
352
352
  6. write \u5DE5\u5177\u5199 survey-result.json\uFF08\u8986\u76D6\uFF09\uFF1A{"name":"${e}","submitted":true,"answers":{...},"verified":true}\u2014\u2014\u7136\u540E agent-browser close
353
353
  7. \u56DE\u590D\u6D88\u606F\uFF1A\u62A5\u544A\u771F\u5B9E\u63D0\u4EA4\u7F16\u53F7\u4E0E\u9501\u5B9A\u6001\u2014\u2014\u672A\u770B\u5230\u9501\u5B9A\u6001\u524D\u4E0D\u5F97\u62A5\u544A\u5B8C\u6210
354
- \u5DE5\u5177\u5931\u8D25\uFF08\u8FDE\u63A5\u5931\u8D25/\u63A7\u4EF6\u7F3A\u5931\uFF09\u8981\u5982\u5B9E\u62A5\u544A\u5E76\u91CD\u8BD5\u2014\u2014\u7F16\u9020 = \u4EFB\u52A1\u5931\u8D25\u3002`}async function Y0(n,e){let{orm:t,appId:r}=n,s=[];for(let o of e.personas){let[a]=await t.query.insert("departments").values({app_id:String(r),name:o.name,is_dm:!1}).returning("id").run(),[l]=await t.query.insert("agents").values({app_id:String(r),type:"ai",name:"\u95EE\u5377-"+o.name,description:o.roleLabel+"\u2014\u2014"+o.expertise,role_label:o.roleLabel,expertise:o.expertise,system_prompt:ey(e.url,o.name),model:"deepseek-chat",department_id:String(a.id),is_active:!0,tools:[],allow_file_tools:!0,allow_command_exec:!0,allow_network:!0}).returning("id").run();await t.query.insert("department_members").values({department_id:String(a.id),agent_id:String(l.id),role:"member"}).run(),s.push({name:o.name,deptId:String(a.id),agentId:String(l.id)})}let i=await Kc(n,{total:e.total??e.personas.length,concurrency:e.concurrency,url:e.url,retry:e.retry,rolePrefix:"\u95EE\u5377-"});return{campaignId:String(i.campaign.id),created:s}}var ny=N(()=>{"use strict";_t()});var wy={};ie(wy,{startHostReporting:()=>cR});function cR(){if(!hy)return()=>{};let n=null,e=!1,t=()=>{if(!e)try{n=new WebSocket(`${hy.replace(/^http/,"ws")}/sandbox-host`),n.onopen=()=>{let{hostCapacity:i}=(an(),qy(gc));n?.send(JSON.stringify({type:"host:register",hostId:ke,capacity:i()}))},n.onclose=()=>{e||setTimeout(t,3e3)},n.onerror=()=>{try{n?.close()}catch{}}}catch{setTimeout(t,3e3)}};t();let r=jn(i=>{try{n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"sandbox:event",event:i}))}catch{}}),s=setInterval(()=>{try{n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"host:ping",hostId:ke,ts:Date.now()}))}catch{}},3e4);return s.unref?.(),()=>{e=!0,clearInterval(s),r();try{n?.close()}catch{}}}var hy,yy=N(()=>{"use strict";Ye();an();hy=process.env.CENTER_URL??""});var vy={};ie(vy,{checkHostHealth:()=>dR,hostLastActive:()=>_y,resetHostHealth:()=>pR});function _y(n){let e=It(2e3),t=0;for(let r of e)if(String(r.payload?.hostId??ke)===n&&(r.action==="host:ping"||r.action.startsWith("exec:")||r.action==="create"||r.action==="status"||r.action==="host:register"||r.action==="route")){let i=typeof r.payload?.ts=="number"?r.payload.ts:r.ts;t=Math.max(t,i)}return t}function dR(){let n=[],e=[],t=It(5e3),r=new Set;for(let i of t){let o=String(i.payload?.hostId??"");o&&o!==ke&&r.add(o)}let s=Date.now();for(let i of r){let o=_y(i);s-o>by?zs.has(i)||(zs.add(i),le("host:down",i,{lastActiveAt:new Date(o).toISOString(),timeoutMs:by}),n.push(i)):zs.has(i)&&(zs.delete(i),le("host:up",i,{recoveredAt:new Date().toISOString()}),e.push(i))}return{down:n,up:e}}function pR(){zs.clear()}var by,zs,ky=N(()=>{"use strict";Ye();an();by=Number(process.env.HOST_HEARTBEAT_TIMEOUT??90)*1e3,zs=new Set});var Sy={};ie(Sy,{onEvent:()=>md,registerBrowserWarmContract:()=>gR,registerExecTimeoutContract:()=>hR,resetContracts:()=>fR,startEventContracts:()=>mR});function md(n,e,t,r){Ks.push({entity:n,action:e,handler:t,predicate:r?.predicate,once:r?.once})}function mR(){if(ta&&Br)return Br;ta=!0;let n=r=>{for(let s=0;s<Ks.length;s++){let i=Ks[s];if(!(i.entity!==r.entity||i.action!==r.action)&&!(i.predicate&&!i.predicate(r.payload??{}))){try{i.handler(r)}catch{}i.once&&Ks.splice(s,1)}}},e=Ec(n),t=jn(n);return Br=()=>{e(),t(),ta=!1,Br=null},Br}function fR(){Ks.length=0,ta=!1,Br=null}function gR(){md("ai","tool:call",n=>{let e=String(n.payload?.tool??n.payload?.name??"");if(!e.includes("agent-browser")&&!e.includes("browser"))return;let t=n.payload?.departmentId?String(n.payload.departmentId):void 0;le("warm:hint",void 0,{requestId:n.payload?.requestId??void 0,departmentId:t,tool:e,source:"ai:tool:call"})})}function hR(){md("sandbox","exec:timeout",n=>{console.warn(`[events] sandbox exec \u8D85\u65F6\uFF08${n.payload?.tool??"?"}\u2014\u2014${n.payload?.ms??"?"}ms\uFF09\u2014\u2014requestId ${n.payload?.requestId??"?"}\u2014\u2014\u8DE8\u5C42\u53EF\u56DE\u6EAF`)})}var Ks,ta,Br,xy=N(()=>{"use strict";Ws();Ye();Ye();Ks=[],ta=!1,Br=null});var Ry={};ie(Ry,{parseImInbound:()=>wR});function wR(n,e){switch(n){case"wecom":{let t=String(e?.MsgType??"");if(t!=="text")throw new Error(`\u4E0D\u652F\u6301\u7684\u6D88\u606F\u7C7B\u578B\uFF1A${t||"unknown"}`);let r=String(e?.Content??"").trim();if(!r)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:r,sender:String(e?.FromUserName??"unknown"),platform:n}}case"dingtalk":{let t=String(e?.text?.content??"").trim();if(!t)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:t,sender:String(e?.senderNick??e?.senderStaffId??"unknown"),platform:n,conversationId:String(e?.conversationId??"")}}case"feishu":{let t=String(e?.event?.message?.content??""),r=t;try{let s=JSON.parse(t);r=String(s?.text??t)}catch{}if(r=r.trim(),!r)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:r,sender:String(e?.event?.sender?.sender_id?.open_id??"unknown"),platform:n,conversationId:String(e?.event?.message?.message_id??"")}}default:throw new Error(`\u4E0D\u652F\u6301\u7684 IM \u5E73\u53F0\uFF1A${n}`)}}var Ey=N(()=>{"use strict"});re();async function ch(){try{if(!process.env.PUBLIC_BASE_URL||process.env.PUBLIC_BASE_URL.includes("localhost")){let e=(await import("node:os")).networkInterfaces(),t=Object.values(e).flat().find(r=>r?.family==="IPv4"&&!r.internal)?.address;t&&(process.env.PUBLIC_BASE_URL=`http://${t}:${process.env.PORT??3e3}`,console.log(`[agent-platform] PUBLIC_BASE_URL \u81EA\u52A8\u63A8\u5BFC\uFF1A${process.env.PUBLIC_BASE_URL}`))}}catch{}}re();re();Ar();var dh={extensions:["vector"],enums:[{name:"agent_type",values:[...sc]}],tables:[{name:"agents",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),type:b.enum(["ai","user","webhook","knowledge_base","department"]).meta({notNull:!0}),name:b.string().meta({notNull:!0}),avatar_url:b.string().nullable(),description:b.string().nullable(),role_label:b.string().nullable(),expertise:b.string().nullable(),model:b.string().nullable(),system_prompt:b.string().nullable(),temperature:b.number().meta({default:.7}).nullable(),max_tokens:b.number().int().meta({default:2048}).nullable(),human_in_the_loop:b.boolean().meta({default:!1}).nullable(),user_id:b.uuid().nullable(),webhook_url:b.string().nullable(),webhook_secret:b.string().nullable(),webhook_retry_count:b.number().int().meta({default:3}).nullable(),im_bind_dept:b.uuid().nullable(),chunk_size:b.number().int().meta({default:500}).nullable(),chunk_overlap:b.number().int().meta({default:50}).nullable(),tools:b.json().meta({default:"[]"}).nullable(),department_id:b.uuid().nullable(),monthly_token_quota:b.number().int().meta({notNull:!0,default:0}),is_active:b.boolean().meta({notNull:!0,default:!0}),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"}),webhook_platform:b.string().meta({notNull:!0,default:"generic"}),risk_policy:b.string().meta({notNull:!0,default:"auto"}),light_model:b.string().nullable(),workspace_path:b.string().nullable(),allow_file_tools:b.boolean().meta({notNull:!0,default:!1}),allow_command_exec:b.boolean().meta({notNull:!0,default:!1}),allow_network:b.boolean().meta({notNull:!0,default:!0}),approval_policy:b.string().meta({notNull:!0,default:"auto"}),kb_id:b.uuid().nullable(),template_slug:b.string().nullable()},columnTypes:{type:"agent_type"},indexes:[{cols:["app_id"],name:"idx_agents_app"},{cols:["type"],name:"idx_agents_type"}]},{name:"departments",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),name:b.string().meta({notNull:!0}),is_dm:b.boolean().meta({notNull:!0,default:!1}),workspace_path:b.string().nullable(),artifact_review:b.boolean().meta({notNull:!0,default:!1}),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})}},{name:"department_members",columns:{department_id:b.uuid().meta({notNull:!0,references:"departments",onDelete:"CASCADE"}),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),role:b.string().meta({notNull:!0,default:"member"}),joined_at:b.date().meta({notNull:!0,default:"now"})},uniques:[["department_id","agent_id"]],indexes:[{cols:["agent_id"],name:"idx_dm_agent"}]},{name:"messages",columns:{id:R.pk(b.uuid()),department_id:b.uuid().meta({notNull:!0,references:"departments",onDelete:"CASCADE"}),sender_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),content:b.string().meta({notNull:!0}),msg_type:b.string().meta({notNull:!0,default:"text"}),ai_draft:b.string().nullable(),ai_approved:b.boolean().nullable(),ai_step:b.json().nullable(),reply_to:b.uuid().meta({references:"messages",onDelete:"SET NULL"}).nullable(),attachments:b.json().nullable(),routed_to:b.string().nullable(),feedback:b.string().nullable(),quick_replies:b.json().nullable(),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["department_id","created_at"],name:"idx_messages_department"}]},{name:"kb_documents",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),filename:b.string().meta({notNull:!0}),content:b.string().meta({notNull:!0}),chunk_count:b.number().int().meta({notNull:!0,default:0}),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id"],name:"idx_kb_agent"}]},{name:"agent_logs",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().meta({references:"departments",onDelete:"SET NULL"}).nullable(),messages_count:b.number().int().meta({notNull:!0,default:0}),steps_count:b.number().int().meta({notNull:!0,default:0}),tokens_prompt:b.number().int().meta({notNull:!0,default:0}),tokens_completion:b.number().int().meta({notNull:!0,default:0}),tokens_total:b.number().int().meta({notNull:!0,default:0}),elapsed_ms:b.number().int().meta({notNull:!0,default:0}),success:b.boolean().meta({notNull:!0,default:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id",{col:"created_at",desc:!0}],name:"idx_agent_logs_agent"},{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_agent_logs_app"}]},{name:"agent_runs",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().meta({references:"departments",onDelete:"SET NULL"}).nullable(),orchestrator_id:b.uuid().meta({references:"agents",onDelete:"CASCADE"}).nullable(),parent_run_id:b.uuid().meta({references:"agent_runs",onDelete:"CASCADE"}).nullable(),kind:b.string().meta({notNull:!0,default:"orchestration"}),plan_json:b.json().nullable(),worker_results:b.json().nullable(),status:b.string().meta({notNull:!0,default:"planned"}),request_id:b.string().nullable(),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_agent_runs_app"},{cols:["parent_run_id"],name:"idx_agent_runs_parent"}]},{name:"webhook_logs",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:b.uuid().meta({notNull:!0}),request_body:b.string().nullable(),response_body:b.string().nullable(),response_status:b.number().int().nullable(),elapsed_ms:b.number().int().meta({notNull:!0,default:0}),success:b.boolean().meta({notNull:!0,default:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id",{col:"created_at",desc:!0}],name:"idx_webhook_logs_agent"}]},{name:"webhook_conversations",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),conversation_id:b.string().meta({notNull:!0}),role:b.string().meta({notNull:!0}),content:b.string().meta({notNull:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id","conversation_id","created_at"],name:"idx_webhook_conv"}]},{name:"kb_chunks",columns:{id:R.pk(b.uuid()),document_id:b.uuid().meta({notNull:!0,references:"kb_documents",onDelete:"CASCADE"}),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),content:b.string().meta({notNull:!0}),chunk_index:b.number().int().meta({notNull:!0}),embedding:b.vector(1024).nullable(),created_at:b.date().meta({notNull:!0,default:"now"})},columnTypes:{embedding:"vector(1024)"},indexes:[{cols:["agent_id"],name:"idx_kb_chunks_agent"},{cols:["embedding"],name:"idx_kb_chunks_embedding",using:"ivfflat",opclass:"vector_cosine_ops",with:"lists = 100"}]},{name:"agent_skills",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),skill_name:b.string().meta({notNull:!0}),skill_dir:b.string().meta({notNull:!0}),enabled:b.boolean().meta({notNull:!0,default:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},uniques:[["agent_id","skill_name"]],indexes:[{cols:["agent_id"],name:"idx_agent_skills_agent"}]},{name:"role_templates",columns:{id:R.pk(b.uuid()),name:b.string().meta({notNull:!0}),slug:b.string().meta({notNull:!0,unique:!0}),description:b.string().nullable(),icon:b.string().nullable(),category:b.string().meta({notNull:!0,default:"general"}),default_system_prompt:b.string().nullable(),default_model:b.string().nullable(),default_temperature:b.number().meta({default:.7}).nullable(),default_max_tokens:b.number().int().meta({default:2048}).nullable(),default_allow_file_tools:b.boolean().meta({default:!1}).nullable(),default_allow_command_exec:b.boolean().meta({default:!1}).nullable(),default_workspace_hint:b.string().nullable(),default_skills:b.json().meta({default:"[]"}).nullable(),sort_order:b.number().int().meta({default:0}).nullable(),is_active:b.boolean().meta({notNull:!0,default:!0}),created_at:b.date().meta({notNull:!0,default:"now"})}},{name:"events",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),event:b.string().meta({notNull:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id","event"],name:"idx_events_app"},{cols:["event",{col:"created_at",desc:!0}],name:"idx_events_event"},{cols:["app_id","event"],name:"uq_events_first_message",unique:!0,where:[{col:"event",eq:"first_message"}]}]},{name:"audit_logs",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),user_id:b.uuid().nullable(),action:b.string().meta({notNull:!0}),target_type:b.string().nullable(),target_id:b.uuid().nullable(),detail:b.json().nullable(),created_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_audit_logs_app"}]},{name:"agent_versions",columns:{id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:b.uuid().meta({notNull:!0}),version:b.number().int().meta({notNull:!0}),snapshot:b.json().meta({notNull:!0}),note:b.string().nullable(),created_at:b.date().meta({notNull:!0,default:"now"})},uniques:[["agent_id","version"]],indexes:[{cols:["agent_id",{col:"version",desc:!0}],name:"idx_agent_versions_agent"}]},{name:"group_memories",columns:{department_id:R.pk(b.uuid()),summary:b.string().nullable(),msg_count:b.number().int().meta({notNull:!0,default:0}),updated_at:b.date().meta({notNull:!0,default:"now"})}},{name:"answer_cache",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),question:b.string().meta({notNull:!0}),answer:b.string().meta({notNull:!0}),hits:b.number().int().meta({notNull:!0,default:0}),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id"],name:"idx_answer_cache_app"}]},{name:"skill_ratings",columns:{id:R.pk(b.uuid()),skill_dir:b.string().meta({notNull:!0}),app_id:b.uuid().meta({notNull:!0}),liked:b.boolean().meta({notNull:!0}),created_at:b.date().meta({notNull:!0,default:"now"})},uniques:[["skill_dir","app_id"]],indexes:[{cols:["skill_dir"],name:"idx_skill_ratings_dir"}]},{name:"video_tasks",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().nullable(),agent_id:b.uuid().nullable(),task_id:b.string().meta({notNull:!0}),prompt:b.string().meta({notNull:!0}),status:b.string().meta({notNull:!0,default:"pending"}),filename:b.string().meta({notNull:!0}),path:b.string().nullable(),error:b.string().nullable(),params:b.json().nullable(),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["task_id"],name:"idx_video_tasks_task"}]},{name:"agent_run_states",columns:{message_id:R.pk(b.uuid()),agent_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().meta({notNull:!0}),app_id:b.uuid().meta({notNull:!0}),steps:b.json().meta({notNull:!0,default:"[]"}),status:b.string().meta({notNull:!0,default:"running"}),updated_at:b.date().meta({notNull:!0,default:"now"})}},{name:"sandboxes",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().nullable(),name:b.string().meta({notNull:!0}),status:b.string().meta({notNull:!0,default:"requested"}),mode:b.string().meta({notNull:!0,default:"persistent"}),image:b.string().meta({notNull:!0,default:"ap-sandbox:latest"}),network:b.boolean().meta({notNull:!0,default:!0}),memory_mb:b.number().int().meta({notNull:!0,default:1024}),cpus:b.number().int().meta({notNull:!0,default:1}),error:b.string().nullable(),workspace:b.string().nullable(),created_at:b.date().meta({notNull:!0,default:"now"}),last_used_at:b.date().nullable(),expires_at:b.date().nullable(),terminated_at:b.date().nullable(),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["department_id"],name:"idx_sandboxes_dept"},{cols:["status","last_used_at"],name:"idx_sandboxes_status"},{cols:["department_id"],name:"idx_sandboxes_dept_active",unique:!0,where:[{col:"department_id",isNull:!1},{col:"status",ne:"terminated"}]}]},{name:"sandbox_events",columns:{id:R.pk(b.number().int()),sandbox_id:b.uuid().meta({notNull:!0}),app_id:b.uuid().nullable(),type:b.string().meta({notNull:!0}),detail:b.string().nullable(),created_at:b.date().meta({notNull:!0,default:"now"})},columnTypes:{id:"BIGSERIAL"},indexes:[{cols:["sandbox_id",{col:"created_at",desc:!0}],name:"idx_sandbox_events_sb"}]},{name:"survey_campaigns",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),total:b.number().int().meta({notNull:!0}),concurrency:b.number().int().meta({notNull:!0}),url:b.string().meta({notNull:!0,default:""}),retry:b.number().int().meta({notNull:!0,default:2}),status:b.string().meta({notNull:!0,default:"running"}),completed:b.number().int().meta({notNull:!0,default:0}),failed:b.number().int().meta({notNull:!0,default:0}),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_survey_campaigns_app"}]},{name:"survey_campaign_runs",columns:{id:R.pk(b.uuid()),campaign_id:b.uuid().meta({notNull:!0,references:"survey_campaigns",onDelete:"CASCADE"}),agent_id:b.uuid().meta({notNull:!0}),agent_name:b.string().meta({notNull:!0}),dept_id:b.uuid().meta({notNull:!0}),status:b.string().meta({notNull:!0,default:"queued"}),attempts:b.number().int().meta({notNull:!0,default:0}),started_at:b.date().nullable(),finished_at:b.date().nullable(),error:b.string().nullable()},indexes:[{cols:["campaign_id","status"],name:"idx_survey_runs_campaign"}]},{name:"video_tasks",columns:{id:R.pk(b.uuid()),app_id:b.uuid().meta({notNull:!0}),department_id:b.uuid().nullable(),agent_id:b.uuid().nullable(),task_id:b.string().meta({notNull:!0}),prompt:b.string().meta({notNull:!0}),status:b.string().meta({notNull:!0,default:"pending"}),filename:b.string().meta({notNull:!0}),path:b.string().nullable(),error:b.string().nullable(),params:b.json().nullable(),created_at:b.date().meta({notNull:!0,default:"now"}),updated_at:b.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["task_id"],name:"idx_video_tasks_task"}]},{name:"survey_submissions",columns:{id:R.pk(b.string()),source:b.string().meta({notNull:!0}),age:b.string().nullable(),industry:b.string().nullable(),rating:b.number().int().nullable(),focus:b.json().nullable(),feedback:b.string().nullable(),submitted_at:b.date().meta({notNull:!0,default:"now"}),campaign_id:b.string().nullable()}},{name:"survey_answers",columns:{id:R.pk(b.number().int()),source:b.string().meta({notNull:!0}),question:b.string().nullable(),answer:b.string().nullable(),created_at:b.date().meta({notNull:!0,default:"now"}),campaign_id:b.string().nullable()},columnTypes:{id:"BIGSERIAL"}},{name:"agent_memories",columns:{agent_id:R.pk(b.uuid()).meta({references:"agents",onDelete:"cascade"}),content:b.string().meta({notNull:!0}),updated_at:b.date().meta({notNull:!0,default:"now"})}},{name:"enterprises",columns:{id:R.pk(b.uuid()),name:b.string().meta({notNull:!0}),owner_user_id:b.uuid().nullable(),created_at:b.date().meta({notNull:!0,default:"now"})}},{name:"app_ai_configs",columns:{app_id:R.pk(b.uuid()),base_url:b.string().nullable(),api_key:b.string().nullable(),model:b.string().nullable(),updated_at:b.date().meta({notNull:!0,default:"now"})}}]},ph={tables:[{name:"_weifuwu_apps",columns:{status:b.string().meta({notNull:!0,default:"active"}),plan:b.string().meta({notNull:!0,default:"free"}),trial_ends_at:b.date().nullable(),monthly_token_limit:b.number().int().meta({notNull:!0,default:5e4}),sandbox_quota:b.number().int().meta({notNull:!0,default:5}),enterprise_id:b.uuid().nullable()}}]};Us();async function xw(n){let e={requests:0,errors:0,errors5xx:0,errorsCaught:0,aiCalls:0,aiTokens:0,aiLatencyMs:0,webhooks:0,sandboxCalls:0,startTime:Date.now()};globalThis.__platform_metrics=e,n.use(ro()),n.onError(g=>Te(g));let t=parseInt(process.env.DATABASE_POOL_MAX??"20",10),r=Tr({max:t,acquireTimeoutMs:1e4,idle_timeout:parseInt(process.env.DATABASE_POOL_IDLE_TIMEOUT??"30000",10),...process.env.POSTGRES_MEMORY==="1"?{memory:!0}:{},tenant:{field:"app_id",value:g=>g?.appId}});n.use(r);let s=null;n.use(async(g,w,y)=>{let k=g.id??Math.random().toString(36).slice(2,8),_=Date.now();try{let v=await y(g,w),S=v instanceof Response?v.status:200;return e.requests++,S>=500&&(e.errors++,e.errors5xx++),S>=500&&console.error(JSON.stringify({ts:new Date().toISOString(),id:k,method:g.method,path:new URL(g.url).pathname,level:"error",status:S,ms:Date.now()-_})),v}catch(v){throw e.requests++,e.errors++,e.errorsCaught++,console.error(JSON.stringify({ts:new Date().toISOString(),id:k,method:g.method,path:new URL(g.url).pathname,level:"error",ms:Date.now()-_,error:v?.message})),v}}),await r.migrate(),await r.migrateModule("agent-platform",dh),console.log("[agent-platform] DB schema \u5DF2\u521D\u59CB\u5316");let i=null,o=!!process.env.REDIS_URL;o?(i=Ns(),n.use(i)):console.warn("[agent-platform] Redis \u672A\u914D\u7F6E\uFF08REDIS_URL \u7F3A\u5931\uFF09\u2014\u2014\u961F\u5217/\u623F\u95F4\u5E7F\u64AD/\u9650\u6D41\u964D\u7EA7\uFF08\u5185\u5B58\u9762\uFF09");let a=null,l=null;o?(a=qo({redis:i.redis}),n.use(a)):console.warn("[agent-platform] \u961F\u5217\u964D\u7EA7\uFF1A\u65E0 Redis\u2014\u2014\u89C6\u9891\u751F\u6210/\u5EF6\u8FDF\u4EFB\u52A1\u4E0D\u53EF\u7528\uFF08webhook \u76F4\u53D1\uFF09");let u=!!(process.env.OIDC_ISSUER&&process.env.OIDC_CLIENT_ID&&process.env.OIDC_CLIENT_SECRET),c=wo({orm:r.orm,secret:process.env.JWT_SECRET??"default-secret",accessTtlSeconds:900,refreshTtlDays:7,inviteRoles:["member","viewer"],sso:u?{issuer:process.env.OIDC_ISSUER.replace(/\/$/,""),clientId:process.env.OIDC_CLIENT_ID,clientSecret:process.env.OIDC_CLIENT_SECRET,redirectBase:process.env.OIDC_REDIRECT_URI?new URL(process.env.OIDC_REDIRECT_URI).origin:void 0,defaultAppSlug:process.env.OIDC_APP_SLUG||void 0,renderCallback:g=>`<!DOCTYPE html><html><body><script>
354
+ \u5DE5\u5177\u5931\u8D25\uFF08\u8FDE\u63A5\u5931\u8D25/\u63A7\u4EF6\u7F3A\u5931\uFF09\u8981\u5982\u5B9E\u62A5\u544A\u5E76\u91CD\u8BD5\u2014\u2014\u7F16\u9020 = \u4EFB\u52A1\u5931\u8D25\u3002`}async function Y0(n,e){let{orm:t,appId:r}=n,s=[];for(let i of e.personas){let[a]=await t.query.insert("departments").values({app_id:String(r),name:i.name,is_dm:!1}).returning("id").run(),[l]=await t.query.insert("agents").values({app_id:String(r),type:"ai",name:"\u95EE\u5377-"+i.name,description:i.roleLabel+"\u2014\u2014"+i.expertise,role_label:i.roleLabel,expertise:i.expertise,system_prompt:ey(e.url,i.name),model:"deepseek-chat",department_id:String(a.id),is_active:!0,tools:[],allow_file_tools:!0,allow_command_exec:!0,allow_network:!0}).returning("id").run();await t.query.insert("department_members").values({department_id:String(a.id),agent_id:String(l.id),role:"member"}).run(),s.push({name:i.name,deptId:String(a.id),agentId:String(l.id)})}let o=await Jc(n,{total:e.total??e.personas.length,concurrency:e.concurrency,url:e.url,retry:e.retry,rolePrefix:"\u95EE\u5377-"});return{campaignId:String(o.campaign.id),created:s}}var ny=I(()=>{"use strict";_t()});var hy={};ie(hy,{startHostReporting:()=>lR});function lR(){if(!gy)return()=>{};let n=null,e=!1,t=()=>{if(!e)try{n=new WebSocket(`${gy.replace(/^http/,"ws")}/sandbox-host`),n.onopen=()=>{let{hostCapacity:o}=(an(),$y(yc));n?.send(JSON.stringify({type:"host:register",hostId:ke,capacity:o()}))},n.onclose=()=>{e||setTimeout(t,3e3)},n.onerror=()=>{try{n?.close()}catch{}}}catch{setTimeout(t,3e3)}};t();let r=jn(o=>{try{n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"sandbox:event",event:o}))}catch{}}),s=setInterval(()=>{try{n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"host:ping",hostId:ke,ts:Date.now()}))}catch{}},3e4);return s.unref?.(),()=>{e=!0,clearInterval(s),r();try{n?.close()}catch{}}}var gy,wy=I(()=>{"use strict";Ye();an();gy=process.env.CENTER_URL??""});var _y={};ie(_y,{checkHostHealth:()=>uR,hostLastActive:()=>by,resetHostHealth:()=>cR});function by(n){let e=It(2e3),t=0;for(let r of e)if(String(r.payload?.hostId??ke)===n&&(r.action==="host:ping"||r.action.startsWith("exec:")||r.action==="create"||r.action==="status"||r.action==="host:register"||r.action==="route")){let o=typeof r.payload?.ts=="number"?r.payload.ts:r.ts;t=Math.max(t,o)}return t}function uR(){let n=[],e=[],t=It(5e3),r=new Set;for(let o of t){let i=String(o.payload?.hostId??"");i&&i!==ke&&r.add(i)}let s=Date.now();for(let o of r){let i=by(o);s-i>yy?Qs.has(o)||(Qs.add(o),le("host:down",o,{lastActiveAt:new Date(i).toISOString(),timeoutMs:yy}),n.push(o)):Qs.has(o)&&(Qs.delete(o),le("host:up",o,{recoveredAt:new Date().toISOString()}),e.push(o))}return{down:n,up:e}}function cR(){Qs.clear()}var yy,Qs,vy=I(()=>{"use strict";Ye();an();yy=Number(process.env.HOST_HEARTBEAT_TIMEOUT??90)*1e3,Qs=new Set});var ky={};ie(ky,{onEvent:()=>hd,registerBrowserWarmContract:()=>mR,registerExecTimeoutContract:()=>fR,resetContracts:()=>pR,startEventContracts:()=>dR});function hd(n,e,t,r){Js.push({entity:n,action:e,handler:t,predicate:r?.predicate,once:r?.once})}function dR(){if(sa&&Hr)return Hr;sa=!0;let n=r=>{for(let s=0;s<Js.length;s++){let o=Js[s];if(!(o.entity!==r.entity||o.action!==r.action)&&!(o.predicate&&!o.predicate(r.payload??{}))){try{o.handler(r)}catch{}o.once&&Js.splice(s,1)}}},e=Ac(n),t=jn(n);return Hr=()=>{e(),t(),sa=!1,Hr=null},Hr}function pR(){Js.length=0,sa=!1,Hr=null}function mR(){hd("ai","tool:call",n=>{let e=String(n.payload?.tool??n.payload?.name??"");if(!e.includes("agent-browser")&&!e.includes("browser"))return;let t=n.payload?.departmentId?String(n.payload.departmentId):void 0;le("warm:hint",void 0,{requestId:n.payload?.requestId??void 0,departmentId:t,tool:e,source:"ai:tool:call"})})}function fR(){hd("sandbox","exec:timeout",n=>{console.warn(`[events] sandbox exec \u8D85\u65F6\uFF08${n.payload?.tool??"?"}\u2014\u2014${n.payload?.ms??"?"}ms\uFF09\u2014\u2014requestId ${n.payload?.requestId??"?"}\u2014\u2014\u8DE8\u5C42\u53EF\u56DE\u6EAF`)})}var Js,sa,Hr,Sy=I(()=>{"use strict";Hs();Ye();Ye();Js=[],sa=!1,Hr=null});var xy={};ie(xy,{parseImInbound:()=>gR});function gR(n,e){switch(n){case"wecom":{let t=String(e?.MsgType??"");if(t!=="text")throw new Error(`\u4E0D\u652F\u6301\u7684\u6D88\u606F\u7C7B\u578B\uFF1A${t||"unknown"}`);let r=String(e?.Content??"").trim();if(!r)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:r,sender:String(e?.FromUserName??"unknown"),platform:n}}case"dingtalk":{let t=String(e?.text?.content??"").trim();if(!t)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:t,sender:String(e?.senderNick??e?.senderStaffId??"unknown"),platform:n,conversationId:String(e?.conversationId??"")}}case"feishu":{let t=String(e?.event?.message?.content??""),r=t;try{let s=JSON.parse(t);r=String(s?.text??t)}catch{}if(r=r.trim(),!r)throw new Error("\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A");return{content:r,sender:String(e?.event?.sender?.sender_id?.open_id??"unknown"),platform:n,conversationId:String(e?.event?.message?.message_id??"")}}default:throw new Error(`\u4E0D\u652F\u6301\u7684 IM \u5E73\u53F0\uFF1A${n}`)}}var Ry=I(()=>{"use strict"});re();async function ph(){try{if(!process.env.PUBLIC_BASE_URL||process.env.PUBLIC_BASE_URL.includes("localhost")){let e=(await import("node:os")).networkInterfaces(),t=Object.values(e).flat().find(r=>r?.family==="IPv4"&&!r.internal)?.address;t&&(process.env.PUBLIC_BASE_URL=`http://${t}:${process.env.PORT??3e3}`,console.log(`[agent-platform] PUBLIC_BASE_URL \u81EA\u52A8\u63A8\u5BFC\uFF1A${process.env.PUBLIC_BASE_URL}`))}}catch{}}re();re();Ar();var mh={extensions:["vector"],enums:[{name:"agent_type",values:[...ac]}],tables:[{name:"agents",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),type:y.enum(["ai","user","webhook","knowledge_base","department"]).meta({notNull:!0}),name:y.string().meta({notNull:!0}),avatar_url:y.string().nullable(),description:y.string().nullable(),role_label:y.string().nullable(),expertise:y.string().nullable(),model:y.string().nullable(),system_prompt:y.string().nullable(),temperature:y.number().meta({default:.7}).nullable(),max_tokens:y.number().int().meta({default:2048}).nullable(),human_in_the_loop:y.boolean().meta({default:!1}).nullable(),user_id:y.uuid().nullable(),webhook_url:y.string().nullable(),webhook_secret:y.string().nullable(),webhook_retry_count:y.number().int().meta({default:3}).nullable(),im_bind_dept:y.uuid().nullable(),chunk_size:y.number().int().meta({default:500}).nullable(),chunk_overlap:y.number().int().meta({default:50}).nullable(),tools:y.json().meta({default:"[]"}).nullable(),department_id:y.uuid().nullable(),monthly_token_quota:y.number().int().meta({notNull:!0,default:0}),is_active:y.boolean().meta({notNull:!0,default:!0}),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"}),webhook_platform:y.string().meta({notNull:!0,default:"generic"}),risk_policy:y.string().meta({notNull:!0,default:"auto"}),light_model:y.string().nullable(),workspace_path:y.string().nullable(),allow_file_tools:y.boolean().meta({notNull:!0,default:!1}),allow_command_exec:y.boolean().meta({notNull:!0,default:!1}),allow_network:y.boolean().meta({notNull:!0,default:!0}),approval_policy:y.string().meta({notNull:!0,default:"auto"}),kb_id:y.uuid().nullable(),template_slug:y.string().nullable()},columnTypes:{type:"agent_type"},indexes:[{cols:["app_id"],name:"idx_agents_app"},{cols:["type"],name:"idx_agents_type"}]},{name:"departments",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),name:y.string().meta({notNull:!0}),is_dm:y.boolean().meta({notNull:!0,default:!1}),workspace_path:y.string().nullable(),artifact_review:y.boolean().meta({notNull:!0,default:!1}),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})}},{name:"department_members",columns:{department_id:y.uuid().meta({notNull:!0,references:"departments",onDelete:"CASCADE"}),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),role:y.string().meta({notNull:!0,default:"member"}),joined_at:y.date().meta({notNull:!0,default:"now"})},uniques:[["department_id","agent_id"]],indexes:[{cols:["agent_id"],name:"idx_dm_agent"}]},{name:"messages",columns:{id:R.pk(y.uuid()),department_id:y.uuid().meta({notNull:!0,references:"departments",onDelete:"CASCADE"}),sender_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),content:y.string().meta({notNull:!0}),msg_type:y.string().meta({notNull:!0,default:"text"}),ai_draft:y.string().nullable(),ai_approved:y.boolean().nullable(),ai_step:y.json().nullable(),reply_to:y.uuid().meta({references:"messages",onDelete:"SET NULL"}).nullable(),attachments:y.json().nullable(),routed_to:y.string().nullable(),feedback:y.string().nullable(),quick_replies:y.json().nullable(),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["department_id","created_at"],name:"idx_messages_department"}]},{name:"kb_documents",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),filename:y.string().meta({notNull:!0}),content:y.string().meta({notNull:!0}),chunk_count:y.number().int().meta({notNull:!0,default:0}),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id"],name:"idx_kb_agent"}]},{name:"agent_logs",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().meta({references:"departments",onDelete:"SET NULL"}).nullable(),messages_count:y.number().int().meta({notNull:!0,default:0}),steps_count:y.number().int().meta({notNull:!0,default:0}),tokens_prompt:y.number().int().meta({notNull:!0,default:0}),tokens_completion:y.number().int().meta({notNull:!0,default:0}),tokens_total:y.number().int().meta({notNull:!0,default:0}),elapsed_ms:y.number().int().meta({notNull:!0,default:0}),success:y.boolean().meta({notNull:!0,default:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id",{col:"created_at",desc:!0}],name:"idx_agent_logs_agent"},{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_agent_logs_app"}]},{name:"agent_runs",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().meta({references:"departments",onDelete:"SET NULL"}).nullable(),orchestrator_id:y.uuid().meta({references:"agents",onDelete:"CASCADE"}).nullable(),parent_run_id:y.uuid().meta({references:"agent_runs",onDelete:"CASCADE"}).nullable(),kind:y.string().meta({notNull:!0,default:"orchestration"}),plan_json:y.json().nullable(),worker_results:y.json().nullable(),status:y.string().meta({notNull:!0,default:"planned"}),request_id:y.string().nullable(),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_agent_runs_app"},{cols:["parent_run_id"],name:"idx_agent_runs_parent"}]},{name:"webhook_logs",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:y.uuid().meta({notNull:!0}),request_body:y.string().nullable(),response_body:y.string().nullable(),response_status:y.number().int().nullable(),elapsed_ms:y.number().int().meta({notNull:!0,default:0}),success:y.boolean().meta({notNull:!0,default:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id",{col:"created_at",desc:!0}],name:"idx_webhook_logs_agent"}]},{name:"webhook_conversations",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),conversation_id:y.string().meta({notNull:!0}),role:y.string().meta({notNull:!0}),content:y.string().meta({notNull:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["agent_id","conversation_id","created_at"],name:"idx_webhook_conv"}]},{name:"kb_chunks",columns:{id:R.pk(y.uuid()),document_id:y.uuid().meta({notNull:!0,references:"kb_documents",onDelete:"CASCADE"}),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),content:y.string().meta({notNull:!0}),chunk_index:y.number().int().meta({notNull:!0}),embedding:y.vector(1024).nullable(),created_at:y.date().meta({notNull:!0,default:"now"})},columnTypes:{embedding:"vector(1024)"},indexes:[{cols:["agent_id"],name:"idx_kb_chunks_agent"},{cols:["embedding"],name:"idx_kb_chunks_embedding",using:"ivfflat",opclass:"vector_cosine_ops",with:"lists = 100"}]},{name:"agent_skills",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),skill_name:y.string().meta({notNull:!0}),skill_dir:y.string().meta({notNull:!0}),enabled:y.boolean().meta({notNull:!0,default:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},uniques:[["agent_id","skill_name"]],indexes:[{cols:["agent_id"],name:"idx_agent_skills_agent"}]},{name:"role_templates",columns:{id:R.pk(y.uuid()),name:y.string().meta({notNull:!0}),slug:y.string().meta({notNull:!0,unique:!0}),description:y.string().nullable(),icon:y.string().nullable(),category:y.string().meta({notNull:!0,default:"general"}),default_system_prompt:y.string().nullable(),default_model:y.string().nullable(),default_temperature:y.number().meta({default:.7}).nullable(),default_max_tokens:y.number().int().meta({default:2048}).nullable(),default_allow_file_tools:y.boolean().meta({default:!1}).nullable(),default_allow_command_exec:y.boolean().meta({default:!1}).nullable(),default_workspace_hint:y.string().nullable(),default_skills:y.json().meta({default:"[]"}).nullable(),sort_order:y.number().int().meta({default:0}).nullable(),is_active:y.boolean().meta({notNull:!0,default:!0}),created_at:y.date().meta({notNull:!0,default:"now"})}},{name:"events",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),event:y.string().meta({notNull:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id","event"],name:"idx_events_app"},{cols:["event",{col:"created_at",desc:!0}],name:"idx_events_event"},{cols:["app_id","event"],name:"uq_events_first_message",unique:!0,where:[{col:"event",eq:"first_message"}]}]},{name:"audit_logs",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),user_id:y.uuid().nullable(),action:y.string().meta({notNull:!0}),target_type:y.string().nullable(),target_id:y.uuid().nullable(),detail:y.json().nullable(),created_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_audit_logs_app"}]},{name:"agent_versions",columns:{id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0,references:"agents",onDelete:"CASCADE"}),app_id:y.uuid().meta({notNull:!0}),version:y.number().int().meta({notNull:!0}),snapshot:y.json().meta({notNull:!0}),note:y.string().nullable(),created_at:y.date().meta({notNull:!0,default:"now"})},uniques:[["agent_id","version"]],indexes:[{cols:["agent_id",{col:"version",desc:!0}],name:"idx_agent_versions_agent"}]},{name:"group_memories",columns:{department_id:R.pk(y.uuid()),summary:y.string().nullable(),msg_count:y.number().int().meta({notNull:!0,default:0}),updated_at:y.date().meta({notNull:!0,default:"now"})}},{name:"answer_cache",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),question:y.string().meta({notNull:!0}),answer:y.string().meta({notNull:!0}),hits:y.number().int().meta({notNull:!0,default:0}),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id"],name:"idx_answer_cache_app"}]},{name:"skill_ratings",columns:{id:R.pk(y.uuid()),skill_dir:y.string().meta({notNull:!0}),app_id:y.uuid().meta({notNull:!0}),liked:y.boolean().meta({notNull:!0}),created_at:y.date().meta({notNull:!0,default:"now"})},uniques:[["skill_dir","app_id"]],indexes:[{cols:["skill_dir"],name:"idx_skill_ratings_dir"}]},{name:"video_tasks",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().nullable(),agent_id:y.uuid().nullable(),task_id:y.string().meta({notNull:!0}),prompt:y.string().meta({notNull:!0}),status:y.string().meta({notNull:!0,default:"pending"}),filename:y.string().meta({notNull:!0}),path:y.string().nullable(),error:y.string().nullable(),params:y.json().nullable(),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["task_id"],name:"idx_video_tasks_task"}]},{name:"agent_run_states",columns:{message_id:R.pk(y.uuid()),agent_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().meta({notNull:!0}),app_id:y.uuid().meta({notNull:!0}),steps:y.json().meta({notNull:!0,default:"[]"}),status:y.string().meta({notNull:!0,default:"running"}),updated_at:y.date().meta({notNull:!0,default:"now"})}},{name:"sandboxes",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().nullable(),name:y.string().meta({notNull:!0}),status:y.string().meta({notNull:!0,default:"requested"}),mode:y.string().meta({notNull:!0,default:"persistent"}),image:y.string().meta({notNull:!0,default:"ap-sandbox:latest"}),network:y.boolean().meta({notNull:!0,default:!0}),memory_mb:y.number().int().meta({notNull:!0,default:1024}),cpus:y.number().int().meta({notNull:!0,default:1}),error:y.string().nullable(),workspace:y.string().nullable(),created_at:y.date().meta({notNull:!0,default:"now"}),last_used_at:y.date().nullable(),expires_at:y.date().nullable(),terminated_at:y.date().nullable(),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["department_id"],name:"idx_sandboxes_dept"},{cols:["status","last_used_at"],name:"idx_sandboxes_status"},{cols:["department_id"],name:"idx_sandboxes_dept_active",unique:!0,where:[{col:"department_id",isNull:!1},{col:"status",ne:"terminated"}]}]},{name:"sandbox_events",columns:{id:R.pk(y.number().int()),sandbox_id:y.uuid().meta({notNull:!0}),app_id:y.uuid().nullable(),type:y.string().meta({notNull:!0}),detail:y.string().nullable(),created_at:y.date().meta({notNull:!0,default:"now"})},columnTypes:{id:"BIGSERIAL"},indexes:[{cols:["sandbox_id",{col:"created_at",desc:!0}],name:"idx_sandbox_events_sb"}]},{name:"survey_campaigns",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),total:y.number().int().meta({notNull:!0}),concurrency:y.number().int().meta({notNull:!0}),url:y.string().meta({notNull:!0,default:""}),retry:y.number().int().meta({notNull:!0,default:2}),status:y.string().meta({notNull:!0,default:"running"}),completed:y.number().int().meta({notNull:!0,default:0}),failed:y.number().int().meta({notNull:!0,default:0}),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["app_id",{col:"created_at",desc:!0}],name:"idx_survey_campaigns_app"}]},{name:"survey_campaign_runs",columns:{id:R.pk(y.uuid()),campaign_id:y.uuid().meta({notNull:!0,references:"survey_campaigns",onDelete:"CASCADE"}),agent_id:y.uuid().meta({notNull:!0}),agent_name:y.string().meta({notNull:!0}),dept_id:y.uuid().meta({notNull:!0}),status:y.string().meta({notNull:!0,default:"queued"}),attempts:y.number().int().meta({notNull:!0,default:0}),started_at:y.date().nullable(),finished_at:y.date().nullable(),error:y.string().nullable()},indexes:[{cols:["campaign_id","status"],name:"idx_survey_runs_campaign"}]},{name:"video_tasks",columns:{id:R.pk(y.uuid()),app_id:y.uuid().meta({notNull:!0}),department_id:y.uuid().nullable(),agent_id:y.uuid().nullable(),task_id:y.string().meta({notNull:!0}),prompt:y.string().meta({notNull:!0}),status:y.string().meta({notNull:!0,default:"pending"}),filename:y.string().meta({notNull:!0}),path:y.string().nullable(),error:y.string().nullable(),params:y.json().nullable(),created_at:y.date().meta({notNull:!0,default:"now"}),updated_at:y.date().meta({notNull:!0,default:"now"})},indexes:[{cols:["task_id"],name:"idx_video_tasks_task"}]},{name:"survey_submissions",columns:{id:R.pk(y.string()),source:y.string().meta({notNull:!0}),age:y.string().nullable(),industry:y.string().nullable(),rating:y.number().int().nullable(),focus:y.json().nullable(),feedback:y.string().nullable(),submitted_at:y.date().meta({notNull:!0,default:"now"}),campaign_id:y.string().nullable()}},{name:"survey_answers",columns:{id:R.pk(y.number().int()),source:y.string().meta({notNull:!0}),question:y.string().nullable(),answer:y.string().nullable(),created_at:y.date().meta({notNull:!0,default:"now"}),campaign_id:y.string().nullable()},columnTypes:{id:"BIGSERIAL"}},{name:"agent_memories",columns:{agent_id:R.pk(y.uuid()).meta({references:"agents",onDelete:"cascade"}),content:y.string().meta({notNull:!0}),updated_at:y.date().meta({notNull:!0,default:"now"})}},{name:"enterprises",columns:{id:R.pk(y.uuid()),name:y.string().meta({notNull:!0}),owner_user_id:y.uuid().nullable(),created_at:y.date().meta({notNull:!0,default:"now"})}},{name:"app_ai_configs",columns:{app_id:R.pk(y.uuid()),base_url:y.string().nullable(),api_key:y.string().nullable(),model:y.string().nullable(),updated_at:y.date().meta({notNull:!0,default:"now"})}}]},fh={tables:[{name:"_weifuwu_apps",columns:{status:y.string().meta({notNull:!0,default:"active"}),plan:y.string().meta({notNull:!0,default:"free"}),trial_ends_at:y.date().nullable(),monthly_token_limit:y.number().int().meta({notNull:!0,default:5e4}),sandbox_quota:y.number().int().meta({notNull:!0,default:5}),enterprise_id:y.uuid().nullable()}}]};Fs();async function Ew(n){let e={requests:0,errors:0,errors5xx:0,errorsCaught:0,aiCalls:0,aiTokens:0,aiLatencyMs:0,webhooks:0,sandboxCalls:0,startTime:Date.now()};globalThis.__platform_metrics=e,n.use(oo()),n.onError(g=>Ae(g));let t=parseInt(process.env.DATABASE_POOL_MAX??"20",10),r=Tr({max:t,acquireTimeoutMs:1e4,idle_timeout:parseInt(process.env.DATABASE_POOL_IDLE_TIMEOUT??"30000",10),...process.env.POSTGRES_MEMORY==="1"?{memory:!0}:{},tenant:{field:"app_id",value:g=>g?.appId}});n.use(r);let s=null;n.use(async(g,h,b)=>{let k=g.id??Math.random().toString(36).slice(2,8),_=Date.now();try{let v=await b(g,h),S=v instanceof Response?v.status:200;return e.requests++,S>=500&&(e.errors++,e.errors5xx++),S>=500&&console.error(JSON.stringify({ts:new Date().toISOString(),id:k,method:g.method,path:new URL(g.url).pathname,level:"error",status:S,ms:Date.now()-_})),v}catch(v){throw e.requests++,e.errors++,e.errorsCaught++,console.error(JSON.stringify({ts:new Date().toISOString(),id:k,method:g.method,path:new URL(g.url).pathname,level:"error",ms:Date.now()-_,error:v?.message})),v}}),await r.migrate(),await r.migrateModule("agent-platform",mh),console.log("[agent-platform] DB schema \u5DF2\u521D\u59CB\u5316");let o=null,i=!!process.env.REDIS_URL;i?(o=qs(),n.use(o)):console.warn("[agent-platform] Redis \u672A\u914D\u7F6E\uFF08REDIS_URL \u7F3A\u5931\uFF09\u2014\u2014\u961F\u5217/\u623F\u95F4\u5E7F\u64AD/\u9650\u6D41\u964D\u7EA7\uFF08\u5185\u5B58\u9762\uFF09");let a=null,l=null;i?(a=jo({redis:o.redis}),n.use(a)):console.warn("[agent-platform] \u961F\u5217\u964D\u7EA7\uFF1A\u65E0 Redis\u2014\u2014\u89C6\u9891\u751F\u6210/\u5EF6\u8FDF\u4EFB\u52A1\u4E0D\u53EF\u7528\uFF08webhook \u76F4\u53D1\uFF09");let u=!!(process.env.OIDC_ISSUER&&process.env.OIDC_CLIENT_ID&&process.env.OIDC_CLIENT_SECRET),c=bo({orm:r.orm,secret:process.env.JWT_SECRET??"default-secret",accessTtlSeconds:900,refreshTtlDays:7,inviteRoles:["member","viewer"],sso:u?{issuer:process.env.OIDC_ISSUER.replace(/\/$/,""),clientId:process.env.OIDC_CLIENT_ID,clientSecret:process.env.OIDC_CLIENT_SECRET,redirectBase:process.env.OIDC_REDIRECT_URI?new URL(process.env.OIDC_REDIRECT_URI).origin:void 0,defaultAppSlug:process.env.OIDC_APP_SLUG||void 0,renderCallback:g=>`<!DOCTYPE html><html><body><script>
355
355
  localStorage.setItem('agent_platform_token', ${JSON.stringify(g.token)});
356
356
  localStorage.setItem('agent_platform_refresh', ${JSON.stringify(g.refreshToken)});
357
357
  localStorage.setItem('agent_platform_user', ${JSON.stringify(JSON.stringify(g.user))});
358
358
  location.href = '/';
359
- </script></body></html>`}:void 0,hooks:{onRegisterApp:async(g,w)=>{let[y]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:String(w.id),type:"user",name:y?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{});try{await r.orm.query.update("_weifuwu_apps").set({plan:"free",trial_ends_at:G.nowInterval(14,"day"),monthly_token_limit:5e4}).where({id:{eq:w.id}}).run()}catch{}},onJoinApp:async(g,w)=>{let[y]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:w,type:"user",name:y?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{})},onSsoLogin:async(g,w)=>{if(!w)return;let[y]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:w,type:"user",name:y?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{})}}});await r.migrateModule("weifuwu-users",yo),await r.migrateModule("agent-platform-app-ext",ph),await c.migrate();let d=(process.env.ADMIN_EMAILS??"").split(",").map(g=>g.trim()).filter(Boolean);if(d.length&&(await c.seedBuiltinOwners(d),console.log(`[agent-platform] \u7CFB\u7EDF\u57DF seed: ${d.length} \u4E2A\u7BA1\u7406\u5458\uFF08_builtin owner/admin\u2014\u2014ADMIN_EMAILS \u5F15\u5BFC\uFF09`),process.env.WF_TEST_HOOKS==="1"&&process.env.ADMIN_TEST_PASSWORD)){let{hashPassword:g}=await Promise.resolve().then(()=>(re(),Oi)),w=await r.orm.query.from("_weifuwu_users").select("id").where({email:{eq:d[0]}}).run();if(w[0]){let y=await g(process.env.ADMIN_TEST_PASSWORD);await r.orm.query.update("_weifuwu_users").set({password_hash:y}).where({id:{eq:String(w[0].id)}}).run()}}await r.orm.query.update("_weifuwu_apps").set({open_registration:!0}).where({slug:{eq:"_default"}}).run(),console.log("[agent-platform] _default \u5DF2\u5F00\u653E\u6CE8\u518C\uFF08\u5355\u5E94\u7528\u6A21\u5F0F\u2014\u2014\u6CE8\u518C\u5373\u52A0\u5165\u5E73\u53F0\uFF09");let[p]=await r.orm.query.from("_weifuwu_apps").select("id","app_key").where({slug:{eq:"_default"}}).run();if(p?.id&&console.log("[agent-platform] _default \u673A\u5668\u51ED\u636E\u5C31\u7EEA\uFF08appId+appKey\u2014\u2014\u5206\u79BB\u6C9F\u901A\u9762\uFF09"),process.env.POSTGRES_MEMORY||await r.runMigration("agent-platform-legacy",`
359
+ </script></body></html>`}:void 0,hooks:{onRegisterApp:async(g,h)=>{let[b]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:String(h.id),type:"user",name:b?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{});try{await r.orm.query.update("_weifuwu_apps").set({plan:"free",trial_ends_at:Q.nowInterval(14,"day"),monthly_token_limit:5e4}).where({id:{eq:h.id}}).run()}catch{}},onJoinApp:async(g,h)=>{let[b]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:h,type:"user",name:b?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{})},onSsoLogin:async(g,h)=>{if(!h)return;let[b]=await r.orm.query.from("_weifuwu_users").select("name").where({id:{eq:g}}).run();await r.orm.query.insert("agents").rows([{app_id:h,type:"user",name:b?.name??"\u6210\u5458",user_id:String(g),is_active:!0}]).onConflict(void 0,!1).run().catch(()=>{})}}});await r.migrateModule("weifuwu-users",_o),await r.migrateModule("agent-platform-app-ext",fh),await c.migrate();let d=(process.env.ADMIN_EMAILS??"").split(",").map(g=>g.trim()).filter(Boolean);if(d.length&&(await c.seedBuiltinOwners(d),console.log(`[agent-platform] \u7CFB\u7EDF\u57DF seed: ${d.length} \u4E2A\u7BA1\u7406\u5458\uFF08_builtin owner/admin\u2014\u2014ADMIN_EMAILS \u5F15\u5BFC\uFF09`),process.env.WF_TEST_HOOKS==="1"&&process.env.ADMIN_TEST_PASSWORD)){let{hashPassword:g}=await Promise.resolve().then(()=>(re(),Pi)),h=await r.orm.query.from("_weifuwu_users").select("id").where({email:{eq:d[0]}}).run();if(h[0]){let b=await g(process.env.ADMIN_TEST_PASSWORD);await r.orm.query.update("_weifuwu_users").set({password_hash:b}).where({id:{eq:String(h[0].id)}}).run()}}await r.orm.query.update("_weifuwu_apps").set({open_registration:!0}).where({slug:{eq:"_default"}}).run(),console.log("[agent-platform] _default \u5DF2\u5F00\u653E\u6CE8\u518C\uFF08\u5355\u5E94\u7528\u6A21\u5F0F\u2014\u2014\u6CE8\u518C\u5373\u52A0\u5165\u5E73\u53F0\uFF09");let[p]=await r.orm.query.from("_weifuwu_apps").select("id","app_key").where({slug:{eq:"_default"}}).run();if(p?.id&&console.log("[agent-platform] _default \u673A\u5668\u51ED\u636E\u5C31\u7EEA\uFF08appId+appKey\u2014\u2014\u5206\u79BB\u6C9F\u901A\u9762\uFF09"),process.env.POSTGRES_MEMORY||await r.runMigration("agent-platform-legacy",`
360
360
  ALTER TABLE agents DROP CONSTRAINT IF EXISTS agents_user_id_fkey;
361
361
  DO $$
362
362
  BEGIN
@@ -480,18 +480,18 @@ ${r}`,i=od("sha256",r).update(s).digest("base64"),o=Buffer.from(i),a=Buffer.from
480
480
  CREATE INDEX IF NOT EXISTS idx_events_app ON events(app_id, event);
481
481
  CREATE UNIQUE INDEX IF NOT EXISTS uq_events_first_message ON events(app_id, event) WHERE event = 'first_message';
482
482
 
483
- `),console.log("[agent-platform] app \u6A21\u578B\u8FC1\u79FB\u5B8C\u6210\uFF08\u65E7 tenants \u2192 _weifuwu_apps + members\uFF09"),n.use(c.asAppAuth()),c.routes(n,{prefix:"/api/auth"}),o){let g=Number(process.env.RATE_LIMIT_MAX??2e3),w=oo({windowMs:6e4,max:g,redis:i.redis});n.use((y,k,_)=>{let v=(y.url??"").replace(/^https?:\/\/[^/]+/,"");return v.startsWith("/api/webhook/")||!v.startsWith("/api/")?_(y,k):w(y,k,_)})}n.use(cs());let m=null;if(n.use((g,w,y)=>(m=w,y(g,w))),Zc(()=>m??null),console.log(`[agent-platform] \u5DF2\u6CE8\u518C ${un.length} \u4E2A\u5185\u7F6E\u5DE5\u5177`),a){let g={orm:r.orm},{createVideoPollWorker:w,requeuePendingVideoTasks:y}=await Promise.resolve().then(()=>(Ni(),Pi));l=w(a.queue,()=>m??g);try{await l.start();let k=await y(r.orm,a.queue);k>0&&console.log(`[agent-platform] \u89C6\u9891\u4EFB\u52A1\u91CD\u65B0\u5165\u961F\uFF1A${k} \u4E2A\uFF08\u542F\u52A8\u6062\u590D\uFF09`)}catch(k){console.error("[agent-platform] \u89C6\u9891 worker \u542F\u52A8\u5931\u8D25\uFF08\u4E0D\u963B\u65AD\uFF09:",k?.message??k)}}let{sandbox:h}=await Promise.resolve().then(()=>(De(),Fe)),f=await h.status();if(f.enabled&&f.available){let{manager:g}=await Promise.resolve().then(()=>(Se(),Ee));s=Tr({max:3,acquireTimeoutMs:5e3}),g.init(r.orm,s.orm),g.startReaper(),g.reconcile().then(w=>{console.log(`[agent-platform] \u6C99\u76D2 reconcile \u9996\u8F6E\u5B8C\u6210\uFF1Astarted=${w.started} stopped=${w.stopped} terminated=${w.terminated} \u5B64\u513F\u6E05\u7406=${w.orphans}`)}),console.log(`[agent-platform] \u6C99\u76D2\u5C31\u7EEA\uFF1A${f.mode} \xB7 \u955C\u50CF ${process.env.SANDBOX_IMAGE??"ap-sandbox:latest"}\uFF08\u751F\u547D\u5468\u671F DB \u9A71\u52A8\u2014\u2014reconcile 60s\uFF09`)}else console.warn(`[agent-platform] \u6C99\u76D2\u4E0D\u53EF\u7528\uFF08enabled=${f.enabled} dockerOk=\u955C\u50CF\u7F3A\u5931\u6216 docker \u4E0D\u53EF\u7528\uFF09\u2014\u2014agent \u6587\u4EF6/\u547D\u4EE4\u5DE5\u5177\u5C06\u8FD4\u56DE\u300C\u6C99\u76D2\u4E0D\u53EF\u7528\u300D\u7981\u7528`);return{pg:r,eventsPg:s,redisClient:i,hasRedis:o,metrics:e,currentCtx:()=>m,sandboxStatus:f,videoQueueModule:a}}re();import{readFileSync as $0}from"node:fs";import{join as q0,dirname as Iw}from"node:path";import{fileURLToPath as Pw}from"node:url";function Nw(n,e){let{pg:t,hasRedis:r,redisClient:s}=e,i=Iw(Pw(import.meta.url))+"/../..";n.get("/api/demo/stock",async o=>{let a=Math.max(0,parseInt(new URL(o.url).searchParams.get("stock")??"0",10)||0),l=Array.from({length:a},(u,c)=>({sku:`SKU-${100+c}`,stock:0,name:`\u5546\u54C1 ${100+c}`}));return Response.json({updated_at:new Date().toISOString(),items:a===0?[]:l})}),n.get("/api/skills/available",async(o,a)=>{let{discoverSkills:l}=await Promise.resolve().then(()=>(Ls(),_c)),{resolve:u,dirname:c}=await import("node:path"),{fileURLToPath:d}=await import("node:url"),p=c(d(import.meta.url)),m=u(p,"skills","builtin"),h=await l(m),f=new URL(o.url).searchParams.get("q")?.trim().toLowerCase()??"";f&&(h=h.filter(g=>String(g?.meta?.name??"").toLowerCase().includes(f)||String(g?.meta?.description??"").toLowerCase().includes(f)||String(g?.dir??"").toLowerCase().includes(f)));try{let g=await t.orm.query.from("skill_ratings").select("skill_dir").count("*","likes",{liked:{eq:!0}}).groupBy("skill_dir").run(),w=await t.orm.query.from("skill_ratings").select("skill_dir").count("*","dislikes",{liked:{eq:!1}}).groupBy("skill_dir").run(),y=[...new Map([...g,...w].map(v=>[String(v.skill_dir),v])).values()],k=v=>String(v??"").split(/[\\/]/).filter(Boolean).pop()??"",_=new Map((Array.isArray(y)?y:[y]).map(v=>[k(String(v.skill_dir??"")),{likes:Number(v.likes??0),dislikes:Number(v.dislikes??0)}]));for(let v of h){let S=_.get(k(String(v?.dir??"")))??{likes:0,dislikes:0};v.rating=S}}catch{}return Response.json({skills:h,skillsDir:m})}),n.post("/api/skills/rate",async(o,a)=>{let l=await o.json().catch(()=>({}));if(!l.skill_dir)throw new T("skill_dir \u4E3A\u5FC5\u586B",400);let u=!!l.liked,c=String(l.skill_dir).split(/[\\/]/).filter(Boolean).pop()??String(l.skill_dir),[d]=await t.orm.query.insert("skill_ratings").rows([{skill_dir:c.slice(0,200),app_id:a.appId,liked:u}]).onConflict(["skill_dir","app_id"],!0).returning("skill_dir","liked").run();return Response.json({rating:d})}),n.get("/api/role-templates",async()=>{let{getRoleTemplates:o}=await Promise.resolve().then(()=>(Ki(),ed)),a=o(),l=await t.orm.query.from("agents").select("template_slug").count("*","cnt").where({template_slug:{isNull:!1}}).groupBy("template_slug").run(),u=new Map(l.map(c=>[String(c.template_slug),Number(c.cnt)]));for(let c of a)c.usage_count=u.get(c.slug)??0;return Response.json({templates:a})}),n.get("/api/role-templates/:slug",async(o,a)=>{let{getRoleTemplates:l}=await Promise.resolve().then(()=>(Ki(),ed)),u=l().find(c=>c.slug===a.params.slug);if(!u)throw new T("\u6A21\u677F\u4E0D\u5B58\u5728",404);return Response.json({template:u})}),n.get("/api/white-label",async()=>{let{getWhiteLabelInfo:o}=await Promise.resolve().then(()=>(nd(),td));return Response.json(o())}),n.get("/api/v1/apps",async(o,a)=>{let l=process.env.MANAGEMENT_API_KEY??"";if(!l)throw new T("\u7BA1\u7406 API \u672A\u542F\u7528\uFF08\u914D\u7F6E MANAGEMENT_API_KEY\uFF09",403);if((o.headers.get("authorization")??"")!==`Bearer ${l}`)throw new T("\u65E0\u6548\u7684\u7BA1\u7406 API Key",401);let u=await a.orm.query.from("_weifuwu_apps").select("slug","name","status","plan","trial_ends_at","monthly_token_limit","created_at").orderBy("created_at","desc").run(),c=u.map(y=>String(y.id)),d=c.length?await a.orm.query.from("_weifuwu_app_members").select("app_id").count("*","member_count",{app_id:{in:c}}).groupBy("app_id").run():[],p=c.length?await a.orm.query.from("agents").select("app_id").count("*","agent_count",{app_id:{in:c}}).groupBy("app_id").run():[],m=c.length?await a.orm.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage_month",{app_id:{in:c},created_at:{gte:G.monthStart()}}).groupBy("app_id").run():[],h=new Map(d.map(y=>[String(y.app_id),Number(y.member_count??0)])),f=new Map(p.map(y=>[String(y.app_id),Number(y.agent_count??0)])),g=new Map(m.map(y=>[String(y.app_id),Number(y.token_usage_month??0)])),w=u.map(y=>({...y,member_count:h.get(String(y.id))??0,agent_count:f.get(String(y.id))??0,token_usage_month:g.get(String(y.id))??0}));return Response.json({apps:w})}),n.get("/api/v1/usage",async(o,a)=>{let l=process.env.MANAGEMENT_API_KEY??"";if(!l)throw new T("\u7BA1\u7406 API \u672A\u542F\u7528\uFF08\u914D\u7F6E MANAGEMENT_API_KEY\uFF09",403);if((o.headers.get("authorization")??"")!==`Bearer ${l}`)throw new T("\u65E0\u6548\u7684\u7BA1\u7406 API Key",401);let u=await a.orm.query.from("agent_logs").select("app_id","created_at","tokens_total").where({created_at:{gte:G.nowAgo(30,"day")}}).run(),c=m=>String(m).slice(0,10),d=new Map;for(let m of u){let h=`${String(m.app_id)}|${c(m.created_at)}`,f=d.get(h)??{app_id:String(m.app_id),day_iso:String(m.created_at),calls:0,tokens:0};f.calls+=1,f.tokens+=Number(m.tokens_total??0),d.set(h,f)}let p=[...d.values()].map(m=>({app_id:m.app_id,day:c(m.day_iso),calls:m.calls,tokens:m.tokens})).sort((m,h)=>String(h.day).localeCompare(String(m.day))).slice(0,500);return Response.json({usage:p})}),n.get("/healthz",async()=>{let o={pg:!1,redis:!1,sandbox:null};try{await t.orm.query.from("_weifuwu_apps").select("id").limit(1).run(),o.pg=!0}catch{}try{r?(await s.redis.command("PING"),o.redis=!0):o.redis="disabled"}catch{o.redis=!1}try{let{sandbox:d}=await Promise.resolve().then(()=>(De(),Fe)),p=await d.status();o.sandbox={available:p.available,enabled:p.enabled,imageReady:p.imageReady,mode:p.mode,poolSize:p.poolSize,maxContainers:p.maxContainers}}catch{o.sandbox="unavailable"}let a=null;try{let{statfs:d}=await import("node:fs/promises"),p=await d(process.env.AGENT_WORKSPACE_ROOT??"."),m=p.blocks*p.bsize,h=p.bfree*p.bsize;a={totalBytes:m,freeBytes:h,freePercent:Math.round(h/m*100)}}catch{a=null}let l=o.pg===!0&&(!a||a.freePercent>5),u=globalThis.__platform_metrics?.startTime,c=u?Math.round((Date.now()-u)/1e3):0;return Response.json({status:l?"ok":"degraded",uptimeSec:c,deps:o,disk:a,version:(()=>{try{return JSON.parse($0(q0(Iw(Pw(import.meta.url)),"../../package.json"),"utf-8")).version}catch{return"dev"}})(),ts:new Date().toISOString()},{status:l?200:503})}),n.get("/api/metrics/prom",async()=>{let o=globalThis.__platform_metrics??{},a=Math.round((Date.now()-(o.startTime??Date.now()))/1e3),l=null;try{let{statfs:d}=await import("node:fs/promises"),p=await d(process.env.AGENT_WORKSPACE_ROOT??".");l={freePercent:Math.round(p.bfree*p.bsize/(p.blocks*p.bsize)*100)}}catch{l=null}let u={};try{let{manager:d}=await Promise.resolve().then(()=>(Se(),Ee)),{sandbox:p}=await Promise.resolve().then(()=>(De(),Fe));u={...d.counters,exec:p.execStats}}catch{}let c=["# HELP agent_platform_uptime_seconds \u670D\u52A1\u8FD0\u884C\u65F6\u957F",`agent_platform_uptime_seconds ${a}`,`agent_platform_requests_total ${o.requests??0}`,`agent_platform_errors_total ${o.errors??0}`,`agent_platform_ai_calls_total ${o.aiCalls??0}`,`agent_platform_ai_tokens_total ${o.aiTokens??0}`,`agent_platform_webhooks_total ${o.webhooks??0}`,`agent_platform_sandbox_calls_total ${o.sandboxCalls??0}`,`agent_platform_sandbox_created_total ${u.created??0}`,`agent_platform_sandbox_terminated_total ${u.terminated??0}`,`agent_platform_sandbox_evicted_total ${u.evicted??0}`,`agent_platform_sandbox_idle_stopped_total ${u.idleStopped??0}`,`agent_platform_sandbox_exec_total ${u.exec?.execCount??0}`,`agent_platform_sandbox_exec_errors_total ${u.exec?.execErrors??0}`,`agent_platform_sandbox_exec_timeouts_total ${u.exec?.execTimeouts??0}`,`agent_platform_disk_free_percent ${l?.freePercent??-1}`];return new Response(c.join(`
483
+ `),console.log("[agent-platform] app \u6A21\u578B\u8FC1\u79FB\u5B8C\u6210\uFF08\u65E7 tenants \u2192 _weifuwu_apps + members\uFF09"),n.use(c.asAppAuth()),c.routes(n,{prefix:"/api/auth"}),i){let g=Number(process.env.RATE_LIMIT_MAX??2e3),h=ao({windowMs:6e4,max:g,redis:o.redis});n.use((b,k,_)=>{let v=(b.url??"").replace(/^https?:\/\/[^/]+/,"");return v.startsWith("/api/webhook/")||!v.startsWith("/api/")?_(b,k):h(b,k,_)})}n.use(ms());let f=null;if(n.use((g,h,b)=>(f=h,b(g,h))),ed(()=>f??null),console.log(`[agent-platform] \u5DF2\u6CE8\u518C ${un.length} \u4E2A\u5185\u7F6E\u5DE5\u5177`),a){let g={orm:r.orm},{createVideoPollWorker:h,requeuePendingVideoTasks:b}=await Promise.resolve().then(()=>($i(),Mi));l=h(a.queue,()=>f??g);try{await l.start();let k=await b(r.orm,a.queue);k>0&&console.log(`[agent-platform] \u89C6\u9891\u4EFB\u52A1\u91CD\u65B0\u5165\u961F\uFF1A${k} \u4E2A\uFF08\u542F\u52A8\u6062\u590D\uFF09`)}catch(k){console.error("[agent-platform] \u89C6\u9891 worker \u542F\u52A8\u5931\u8D25\uFF08\u4E0D\u963B\u65AD\uFF09:",k?.message??k)}}let{sandbox:w}=await Promise.resolve().then(()=>(Le(),ze)),m=await w.status();if(m.enabled&&m.available){let{manager:g}=await Promise.resolve().then(()=>(Se(),Te));s=Tr({max:3,acquireTimeoutMs:5e3}),g.init(r.orm,s.orm),g.startReaper(),g.reconcile().then(h=>{console.log(`[agent-platform] \u6C99\u76D2 reconcile \u9996\u8F6E\u5B8C\u6210\uFF1Astarted=${h.started} stopped=${h.stopped} terminated=${h.terminated} \u5B64\u513F\u6E05\u7406=${h.orphans}`)}),console.log(`[agent-platform] \u6C99\u76D2\u5C31\u7EEA\uFF1A${m.mode} \xB7 \u955C\u50CF ${process.env.SANDBOX_IMAGE??"ap-sandbox:latest"}\uFF08\u751F\u547D\u5468\u671F DB \u9A71\u52A8\u2014\u2014reconcile 60s\uFF09`)}else console.warn(`[agent-platform] \u6C99\u76D2\u4E0D\u53EF\u7528\uFF08enabled=${m.enabled} dockerOk=\u955C\u50CF\u7F3A\u5931\u6216 docker \u4E0D\u53EF\u7528\uFF09\u2014\u2014agent \u6587\u4EF6/\u547D\u4EE4\u5DE5\u5177\u5C06\u8FD4\u56DE\u300C\u6C99\u76D2\u4E0D\u53EF\u7528\u300D\u7981\u7528`);return{pg:r,eventsPg:s,redisClient:o,hasRedis:i,metrics:e,currentCtx:()=>f,sandboxStatus:m,videoQueueModule:a}}re();Or();import{readFileSync as M0}from"node:fs";import{resolve as $0,join as q0}from"node:path";function Nw(n,e){let{pg:t,hasRedis:r,redisClient:s}=e;n.get("/api/demo/stock",async o=>{let i=Math.max(0,parseInt(new URL(o.url).searchParams.get("stock")??"0",10)||0),a=Array.from({length:i},(l,u)=>({sku:`SKU-${100+u}`,stock:0,name:`\u5546\u54C1 ${100+u}`}));return Response.json({updated_at:new Date().toISOString(),items:i===0?[]:a})}),n.get("/api/skills/available",async(o,i)=>{let{discoverSkills:a}=await Promise.resolve().then(()=>(Bs(),Sc)),l=$0(je,"skills","builtin"),u=await a(l),c=new URL(o.url).searchParams.get("q")?.trim().toLowerCase()??"";c&&(u=u.filter(d=>String(d?.meta?.name??"").toLowerCase().includes(c)||String(d?.meta?.description??"").toLowerCase().includes(c)||String(d?.dir??"").toLowerCase().includes(c)));try{let d=await t.orm.query.from("skill_ratings").select("skill_dir").count("*","likes",{liked:{eq:!0}}).groupBy("skill_dir").run(),p=await t.orm.query.from("skill_ratings").select("skill_dir").count("*","dislikes",{liked:{eq:!1}}).groupBy("skill_dir").run(),f=[...new Map([...d,...p].map(g=>[String(g.skill_dir),g])).values()],w=g=>String(g??"").split(/[\\/]/).filter(Boolean).pop()??"",m=new Map((Array.isArray(f)?f:[f]).map(g=>[w(String(g.skill_dir??"")),{likes:Number(g.likes??0),dislikes:Number(g.dislikes??0)}]));for(let g of u){let h=m.get(w(String(g?.dir??"")))??{likes:0,dislikes:0};g.rating=h}}catch{}return Response.json({skills:u,skillsDir:l})}),n.post("/api/skills/rate",async(o,i)=>{let a=await o.json().catch(()=>({}));if(!a.skill_dir)throw new T("skill_dir \u4E3A\u5FC5\u586B",400);let l=!!a.liked,u=String(a.skill_dir).split(/[\\/]/).filter(Boolean).pop()??String(a.skill_dir),[c]=await t.orm.query.insert("skill_ratings").rows([{skill_dir:u.slice(0,200),app_id:i.appId,liked:l}]).onConflict(["skill_dir","app_id"],!0).returning("skill_dir","liked").run();return Response.json({rating:c})}),n.get("/api/role-templates",async()=>{let{getRoleTemplates:o}=await Promise.resolve().then(()=>(Qi(),rd)),i=o(),a=await t.orm.query.from("agents").select("template_slug").count("*","cnt").where({template_slug:{isNull:!1}}).groupBy("template_slug").run(),l=new Map(a.map(u=>[String(u.template_slug),Number(u.cnt)]));for(let u of i)u.usage_count=l.get(u.slug)??0;return Response.json({templates:i})}),n.get("/api/role-templates/:slug",async(o,i)=>{let{getRoleTemplates:a}=await Promise.resolve().then(()=>(Qi(),rd)),l=a().find(u=>u.slug===i.params.slug);if(!l)throw new T("\u6A21\u677F\u4E0D\u5B58\u5728",404);return Response.json({template:l})}),n.get("/api/white-label",async()=>{let{getWhiteLabelInfo:o}=await Promise.resolve().then(()=>(od(),sd));return Response.json(o())}),n.get("/api/v1/apps",async(o,i)=>{let a=process.env.MANAGEMENT_API_KEY??"";if(!a)throw new T("\u7BA1\u7406 API \u672A\u542F\u7528\uFF08\u914D\u7F6E MANAGEMENT_API_KEY\uFF09",403);if((o.headers.get("authorization")??"")!==`Bearer ${a}`)throw new T("\u65E0\u6548\u7684\u7BA1\u7406 API Key",401);let l=await i.orm.query.from("_weifuwu_apps").select("slug","name","status","plan","trial_ends_at","monthly_token_limit","created_at").orderBy("created_at","desc").run(),u=l.map(h=>String(h.id)),c=u.length?await i.orm.query.from("_weifuwu_app_members").select("app_id").count("*","member_count",{app_id:{in:u}}).groupBy("app_id").run():[],d=u.length?await i.orm.query.from("agents").select("app_id").count("*","agent_count",{app_id:{in:u}}).groupBy("app_id").run():[],p=u.length?await i.orm.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage_month",{app_id:{in:u},created_at:{gte:Q.monthStart()}}).groupBy("app_id").run():[],f=new Map(c.map(h=>[String(h.app_id),Number(h.member_count??0)])),w=new Map(d.map(h=>[String(h.app_id),Number(h.agent_count??0)])),m=new Map(p.map(h=>[String(h.app_id),Number(h.token_usage_month??0)])),g=l.map(h=>({...h,member_count:f.get(String(h.id))??0,agent_count:w.get(String(h.id))??0,token_usage_month:m.get(String(h.id))??0}));return Response.json({apps:g})}),n.get("/api/v1/usage",async(o,i)=>{let a=process.env.MANAGEMENT_API_KEY??"";if(!a)throw new T("\u7BA1\u7406 API \u672A\u542F\u7528\uFF08\u914D\u7F6E MANAGEMENT_API_KEY\uFF09",403);if((o.headers.get("authorization")??"")!==`Bearer ${a}`)throw new T("\u65E0\u6548\u7684\u7BA1\u7406 API Key",401);let l=await i.orm.query.from("agent_logs").select("app_id","created_at","tokens_total").where({created_at:{gte:Q.nowAgo(30,"day")}}).run(),u=p=>String(p).slice(0,10),c=new Map;for(let p of l){let f=`${String(p.app_id)}|${u(p.created_at)}`,w=c.get(f)??{app_id:String(p.app_id),day_iso:String(p.created_at),calls:0,tokens:0};w.calls+=1,w.tokens+=Number(p.tokens_total??0),c.set(f,w)}let d=[...c.values()].map(p=>({app_id:p.app_id,day:u(p.day_iso),calls:p.calls,tokens:p.tokens})).sort((p,f)=>String(f.day).localeCompare(String(p.day))).slice(0,500);return Response.json({usage:d})}),n.get("/healthz",async()=>{let o={pg:!1,redis:!1,sandbox:null};try{await t.orm.query.from("_weifuwu_apps").select("id").limit(1).run(),o.pg=!0}catch{}try{r?(await s.redis.command("PING"),o.redis=!0):o.redis="disabled"}catch{o.redis=!1}try{let{sandbox:c}=await Promise.resolve().then(()=>(Le(),ze)),d=await c.status();o.sandbox={available:d.available,enabled:d.enabled,imageReady:d.imageReady,mode:d.mode,poolSize:d.poolSize,maxContainers:d.maxContainers}}catch{o.sandbox="unavailable"}let i=null;try{let{statfs:c}=await import("node:fs/promises"),d=await c(process.env.AGENT_WORKSPACE_ROOT??"."),p=d.blocks*d.bsize,f=d.bfree*d.bsize;i={totalBytes:p,freeBytes:f,freePercent:Math.round(f/p*100)}}catch{i=null}let a=o.pg===!0&&(!i||i.freePercent>5),l=globalThis.__platform_metrics?.startTime,u=l?Math.round((Date.now()-l)/1e3):0;return Response.json({status:a?"ok":"degraded",uptimeSec:u,deps:o,disk:i,version:(()=>{try{return JSON.parse(M0(q0(je,"..","..","..","..","package.json"),"utf-8")).version}catch{return"dev"}})(),ts:new Date().toISOString()},{status:a?200:503})}),n.get("/api/metrics/prom",async()=>{let o=globalThis.__platform_metrics??{},i=Math.round((Date.now()-(o.startTime??Date.now()))/1e3),a=null;try{let{statfs:c}=await import("node:fs/promises"),d=await c(process.env.AGENT_WORKSPACE_ROOT??".");a={freePercent:Math.round(d.bfree*d.bsize/(d.blocks*d.bsize)*100)}}catch{a=null}let l={};try{let{manager:c}=await Promise.resolve().then(()=>(Se(),Te)),{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze));l={...c.counters,exec:d.execStats}}catch{}let u=["# HELP agent_platform_uptime_seconds \u670D\u52A1\u8FD0\u884C\u65F6\u957F",`agent_platform_uptime_seconds ${i}`,`agent_platform_requests_total ${o.requests??0}`,`agent_platform_errors_total ${o.errors??0}`,`agent_platform_ai_calls_total ${o.aiCalls??0}`,`agent_platform_ai_tokens_total ${o.aiTokens??0}`,`agent_platform_webhooks_total ${o.webhooks??0}`,`agent_platform_sandbox_calls_total ${o.sandboxCalls??0}`,`agent_platform_sandbox_created_total ${l.created??0}`,`agent_platform_sandbox_terminated_total ${l.terminated??0}`,`agent_platform_sandbox_evicted_total ${l.evicted??0}`,`agent_platform_sandbox_idle_stopped_total ${l.idleStopped??0}`,`agent_platform_sandbox_exec_total ${l.exec?.execCount??0}`,`agent_platform_sandbox_exec_errors_total ${l.exec?.execErrors??0}`,`agent_platform_sandbox_exec_timeouts_total ${l.exec?.execTimeouts??0}`,`agent_platform_disk_free_percent ${a?.freePercent??-1}`];return new Response(u.join(`
484
484
  `)+`
485
- `,{headers:{"Content-Type":"text/plain; version=0.0.4"}})}),n.get("/api/metrics",async()=>{let o=globalThis.__platform_metrics??{},a=Math.round((Date.now()-(o.startTime??Date.now()))/1e3),l=-1,u=-1;try{let[d]=await t.runMigration("pg-stat-probe","SELECT count(*) FILTER (WHERE state = 'active')::int as active, count(*)::int as total FROM pg_stat_activity").then(()=>[]);l=Number(d?.active??-1),u=Number(d?.total??-1)}catch{}let c={};try{let{manager:d}=await Promise.resolve().then(()=>(Se(),Ee)),{sandbox:p}=await Promise.resolve().then(()=>(De(),Fe)),m={};try{m=await d.statusCounts()}catch{}c={calls:o.sandboxCalls??0,created:d.counters.created,terminated:d.counters.terminated,evicted:d.counters.evicted,idleStopped:d.counters.idleStopped,autoStarted:d.counters.autoStarted,orphansCleaned:d.counters.orphansCleaned,exec:p.execStats,statusCounts:m}}catch{}return Response.json({uptimeSec:a,requests:o.requests??0,errors:o.errors??0,errors5xx:o.errors5xx??0,errorsCaught:o.errorsCaught??0,errorRate:o.requests?Number((o.errors/o.requests*100).toFixed(2)):0,aiCalls:o.aiCalls??0,aiTokens:o.aiTokens??0,aiAvgLatencyMs:o.aiCalls?Math.round((o.aiLatencyMs??0)/o.aiCalls):0,webhooks:o.webhooks??0,sandboxCalls:o.sandboxCalls??0,sandbox:c,pgConnections:{active:l,total:u},memMB:Math.round(process.memoryUsage().rss/1024/1024)})})}re();Qi();nt();Xc();import{join as fd,dirname as yR}from"node:path";import{fileURLToPath as bR}from"node:url";re();import{readFile as F0,readdir as V0,writeFile as z0,stat as Ji,mkdir as K0}from"node:fs/promises";import{join as Hw,resolve as Ww,normalize as Uw,sep as G0,dirname as Q0}from"node:path";function Zi(n,e){let t=Ww(Hw(n,e||".")),r=Uw(t),s=Uw(Ww(n));if(!r.startsWith(s+G0)&&r!==s)throw new Error(`\u8DEF\u5F84 "${e}" \u8D85\u51FA\u4E86\u5DE5\u4F5C\u7A7A\u95F4\u8303\u56F4`);return r}var ld=200*1024,Bw=500*1024;async function Fw(n){async function e(t,r){let{orm:s,appId:i}=t,[o]=await s.query.from("departments").select("id","is_dm","workspace_path").where({id:{eq:r},app_id:{eq:i}}).limit(1).run();if(!o)return null;let{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ie(),qe));return a(String(o.id),o.workspace_path,!0)}n.get("/api/departments/:id/workspace/list",async(t,r)=>{let{params:s}=r,i=await e(r,s.id);if(!i)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let o=new URL(t.url).searchParams.get("path")??"",a;try{a=Zi(i,o)}catch(l){return Response.json({error:l.message},{status:400})}try{if(!(await Ji(a)).isDirectory())throw new T("\u4E0D\u662F\u76EE\u5F55",400);let u=await V0(a,{withFileTypes:!0}),c=[];for(let d of u){let p=Hw(a,d.name);try{let m=await Ji(p);c.push({name:d.name,type:d.isDirectory()?"dir":"file",size:m.size,mtime:m.mtime.toISOString()})}catch{}}return c.sort((d,p)=>d.type===p.type?d.name.localeCompare(p.name):d.type==="dir"?-1:1),Response.json({entries:c,path:o||"/"})}catch(l){return Response.json({error:`\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25: ${l.message}`},{status:400})}}),n.post("/api/departments/:id/workspace/download-ticket",async(t,r)=>{try{let{requireWriter:o}=await Promise.resolve().then(()=>(dn(),cn));await o(r)}catch(o){return Response.json({error:o?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(o?.status)??403})}let s=await t.json().catch(()=>({})),i=String(s.path??"");if(!i)throw new T("path \u4E3A\u5FC5\u586B",400);try{let{signToken:o}=await Promise.resolve().then(()=>(re(),Oi)),a=process.env.JWT_SECRET??"default-secret",l=o({type:"download",appId:r.appId,deptId:String(r.params?.id??""),path:i,sub:r.auth?.userId},a,30);return Response.json({ticket:l,expiresIn:30})}catch{throw new T("ticket \u7B7E\u53D1\u5931\u8D25",500)}}),n.get("/api/departments/:id/workspace/file",async(t,r)=>{let{params:s}=r,i=new URL(t.url),o=i.searchParams.get("ticket"),a=i.searchParams.get("path")??"";if(o&&!t.headers.get("authorization"))try{let{verifyToken:d}=await Promise.resolve().then(()=>(re(),Oi)),p=process.env.JWT_SECRET??"default-secret",m=d(o,p);if(m?.type!=="download")throw new Error("ticket \u7C7B\u578B\u4E0D\u7B26");if(r.appId=m.appId,m.path!==decodeURIComponent(a))throw new Error("ticket path \u4E0D\u5339\u914D");r.auth={userId:String(m.sub??""),...r.auth},r.ticketUser=m.sub}catch{throw new T("\u4E0B\u8F7D ticket \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\uFF0830s\u2014\u2014\u8BF7\u91CD\u65B0\u70B9\u51FB\uFF09",401)}let l=await e(r,s.id);if(!l)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let u=i.searchParams.get("path")??"";if(!u)throw new T("path \u4E3A\u5FC5\u586B",400);let c;try{c=Zi(l,u)}catch(d){return Response.json({error:d.message},{status:400})}try{let d=await Ji(c);if(d.isDirectory())throw new T("\u662F\u76EE\u5F55\u2014\u2014\u8BF7\u7528 list \u63A5\u53E3",400);let p=await F0(c);if(i.searchParams.get("download")==="1"){let g=await import("node:path");return new Response(new Uint8Array(p),{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="${encodeURIComponent(g.basename(u))}"`,"Content-Length":String(p.length)}})}let m=p.includes(0),h="",f=!1;if(!m){let g=p.toString("utf-8");g.length>ld&&(g=g.slice(0,ld)+`
486
- ... (\u6587\u4EF6\u8FC7\u5927\uFF0C\u4EC5\u9884\u89C8\u524D ${ld} \u5B57\u7B26\uFF0C\u603B\u957F ${g.length})`,f=!0),h=g}return Response.json({content:h,binary:m,truncated:f,size:d.size})}catch(d){return Response.json({error:`\u8BFB\u53D6\u5931\u8D25: ${d.message}`},{status:404})}}),n.put("/api/departments/:id/workspace/file",async(t,r)=>{let{params:s}=r,i=await e(r,s.id);if(!i)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let o=await t.json().catch(()=>({})),a=String(o.path??""),l=String(o.content??"");if(!a)throw new T("path \u4E3A\u5FC5\u586B",400);if(l.length>Bw)return Response.json({error:`\u6587\u4EF6\u8FC7\u5927\uFF08\u4E0A\u9650 ${Bw} \u5B57\u7B26\uFF09`},{status:413});if(l.includes("\0"))throw new T("\u4E8C\u8FDB\u5236\u5185\u5BB9\u4E0D\u53EF\u5199\u2014\u2014\u4EC5\u652F\u6301\u6587\u672C\u7F16\u8F91",400);let u;try{u=Zi(i,a)}catch(c){return Response.json({error:c.message},{status:400})}try{if((await Ji(u).catch(()=>null))?.isDirectory())throw new T("\u76EE\u6807\u5DF2\u5B58\u5728\u4E14\u662F\u76EE\u5F55\u2014\u2014\u4E0D\u80FD\u8986\u76D6",400);return await K0(Q0(u),{recursive:!0}),await z0(u,l,"utf-8"),Response.json({success:!0,size:l.length})}catch(c){return Response.json({error:`\u5199\u5165\u5931\u8D25: ${c.message}`},{status:400})}}),n.post("/api/departments/:id/workspace/upload",async(t,r)=>{let{params:s}=r,i=await e(r,s.id);if(!i)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let o=await t.json().catch(()=>({})),a=String(o.path??""),{validateUploadFile:l}=await Promise.resolve().then(()=>(Hi(),Bi)),u;try{u=l(o)}catch(m){return Response.json({error:m?.message??"\u9644\u4EF6\u65E0\u6548"},{status:400})}let c;try{c=Zi(i,a?`${a.replace(/\/$/,"")}/${u.safeName}`:u.safeName)}catch(m){return Response.json({error:m.message},{status:400})}let d=await import("node:fs/promises"),p=await import("node:path");try{return await d.mkdir(p.dirname(c),{recursive:!0}),await d.writeFile(c,u.buffer),Response.json({success:!0,name:u.safeName,size:u.size})}catch(m){return Response.json({error:`\u5199\u5165\u5931\u8D25: ${m.message}`},{status:400})}})}re();re();nt();function Kw(n){n.get("/api/departments",async(e,t)=>{let{sql:r,orm:s,appId:i}=t,o=new URL(e.url),a=Math.max(0,parseInt(o.searchParams.get("offset")??"0",10)),l=Math.min(100,Math.max(1,parseInt(o.searchParams.get("limit")??"50",10))),u=String(o.searchParams.get("q")??"").trim(),c=await s.query.from("departments").select("id","app_id","name","is_dm","created_at").where({app_id:{eq:i},...u?{name:{ilike:`%${u}%`}}:{}}).limit(l).offset(a).run(),d=c.map(C=>String(C.id)),p=d.length?await s.query.from("department_members").select("department_id","agent_id").where({department_id:{in:d}}).run():[],m=new Map,h=new Map;for(let C of p){let j=String(C.department_id),K=m.get(j)??{member_count:0,human_count:0};K.member_count+=1,m.set(j,K),h.set(j,[...h.get(j)??[],String(C.agent_id??"")])}let f=[...new Set(p.map(C=>String(C.agent_id??"")))],g=f.length?await s.query.from("agents").select("id","type").where({id:{in:f}}).run():[],w=new Map(g.map(C=>[String(C.id),String(C.type)]));for(let[C,j]of m)j.human_count=(h.get(C)??[]).filter(K=>w.get(K)==="user").length;let y=d.length?await s.query.from("messages").select("department_id","content","created_at").where({department_id:{in:d}}).orderBy("created_at","desc").run():[],k=new Set,_=new Map;for(let C of y){let j=String(C.department_id);k.has(j)||(k.add(j),_.set(j,{last_message:C.content,last_message_at:C.created_at}))}let v=c.map(C=>({id:C.id,app_id:C.app_id,name:C.name,is_dm:C.is_dm,created_at:C.created_at,...m.get(String(C.id))??{member_count:0,human_count:0},..._.get(String(C.id))??{last_message:null,last_message_at:null}})).sort((C,j)=>String(j.last_message_at??j.created_at).localeCompare(String(C.last_message_at??C.created_at))),S=Z(s),[A]=await s.query.from("departments").count("*","total").where({app_id:{eq:i}}).run();return Response.json({departments:v,total:A?.total??0})}),n.post("/api/departments/dm",async(e,t)=>{let{orm:r,appId:s,auth:i}=t,o=await e.json();if(!o.agent_id)throw new T("agent_id \u4E3A\u5FC5\u586B",400);let a=Z(r),[l]=await a.agents.select("id").where(F(L(a.agents.c.id,o.agent_id),L(a.agents.c.app_id,s),rs(a.agents.c.type,"user"))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agents.select("id").where(F(L(a.agents.c.app_id,s),L(a.agents.c.type,"user"),L(a.agents.c.user_id,i.userId))).run();if(!u)throw new T("\u5F53\u524D\u7528\u6237\u65E0\u7ED1\u5B9A Agent",400);let c=await r.query.from("departments d").select("d.id").join("department_members dm1",F({"dm1.department_id":{col:"d.id"}},{"dm1.agent_id":{eq:u.id}})).join("department_members dm2",F({"dm2.department_id":{col:"d.id"}},{"dm2.agent_id":{eq:l.id}})).where({"d.is_dm":{eq:!0}}).exists({kind:"select",table:"department_members",alias:"dm3",cols:["1"],where:F({"dm3.department_id":{col:"d.id"}},{"dm3.agent_id":{notIn:[String(u.id),String(l.id)]}})},!0).limit(1).run();if(c.length)return Response.json({department:c[0],existed:!0});let[d]=await a.departments.insert({app_id:s,name:"\u5355\u804A",is_dm:!0}).returning("id","app_id","name","is_dm","created_at").run();return await a.department_members.insert([{department_id:String(d.id),agent_id:String(u.id),role:"admin"},{department_id:String(d.id),agent_id:String(l.id),role:"member"}]).onConflict().run(),Response.json({department:d,existed:!1},{status:201})}),n.post("/api/departments",async(e,t)=>{try{let{requireWriter:c}=await Promise.resolve().then(()=>(dn(),cn));await c(t)}catch(c){return Response.json({error:c?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(c?.status)??403})}try{let{appRoleOf:c}=await Promise.resolve().then(()=>(dn(),cn));if(await c(t)!=="owner")throw new T("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u521B\u5EFA\u90E8\u95E8",403)}catch(c){return Response.json({error:c?.message??"\u6743\u9650\u6821\u9A8C\u5931\u8D25"},{status:Number(c?.status)??403})}let{orm:r,appId:s}=t,i=await e.json();if(!i.name)throw new T("name \u4E3A\u5FC5\u586B",400);let o=Z(r),[a]=await o.departments.insert({app_id:s,name:i.name,is_dm:i.is_dm??!1}).returning("id","app_id","name","is_dm","created_at").run(),[l]=await o.agents.select("id").where(F(L(o.agents.c.app_id,s),L(o.agents.c.type,"user"),L(o.agents.c.user_id,t.auth.userId))).run();l&&await o.department_members.insert({department_id:String(a.id),agent_id:String(l.id),role:"admin"}).onConflict().run(),i.member_ids&&i.member_ids.length>0&&await o.department_members.insert(i.member_ids.map(c=>({department_id:String(a.id),agent_id:c,role:"member"}))).onConflict().run();let u=null;if(!i.is_dm&&i.auto_manager!==!1){let[c]=await o.agents.insert({app_id:s,type:"department",name:String(i.name)+"\u7ECF\u7406",description:"\u90E8\u95E8\u7ECF\u7406\u2014\u2014\u4EE3\u8868\u300C"+String(i.name)+"\u300D\u5BF9\u5916\u534F\u4F5C",model:"deepseek-v4-flash",department_id:String(a.id),is_active:!0,tools:[],allow_file_tools:!0}).returning("id","name").run();await o.department_members.insert({department_id:String(a.id),agent_id:String(c.id),role:"manager"}).onConflict().run();try{let{refreshManagerPrompt:d}=await Promise.resolve().then(()=>(Wr(),Lr));await d(r,s,String(a.id))}catch{}u={id:c.id,name:c.name}}return Response.json({department:a,manager:u},{status:201})}),n.get("/api/departments/:id/workspace",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.departments.select().where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let l=await r.query.from("department_members dm").select("a.id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","dm.role","dm.joined_at").join("agents a",{"a.id":{col:"dm.agent_id"}}).where({"dm.department_id":{eq:i.id}}).run(),{sql:u}=t,{manager:c}=await Promise.resolve().then(()=>(Se(),Ee));c.init(r);let d=await c.byDepartment(i.id),p={running:{status:"ready",label:"AI \u968F\u65F6\u80FD\u5E72\u6D3B"},stopped:{status:"cold",label:"AI \u4F11\u606F\u4E2D\uFF0C\u5E72\u6D3B\u65F6\u81EA\u52A8\u5524\u9192"},requested:{status:"cold",label:"\u73AF\u5883\u5F85\u542F\u52A8\uFF08\u9996\u6B21\u5E72\u6D3B\u81EA\u52A8\u521B\u5EFA\uFF09"},error:{status:"error",label:"\u73AF\u5883\u5F02\u5E38\uFF0C\u8BF7\u7BA1\u7406\u5458\u5904\u7406"}},m={status:"none",label:""};d&&p[d.status]&&(m=p[d.status]);let h=[];try{let{resolveDepartmentWorkspace:w}=await Promise.resolve().then(()=>(Ie(),qe)),y=await w(i.id,a.workspace_path,!0);if(y){let{readdir:k,stat:_}=await import("node:fs/promises"),{join:v}=await import("node:path"),S=await k(y,{withFileTypes:!0}),A=[];for(let C of S){if(C.name.startsWith("."))continue;let j=v(y,C.name);try{let K=await _(j);A.push({name:C.name,type:C.isDirectory()?"dir":"file",size:K.size,mtime:K.mtime.toISOString()})}catch{}}A.sort((C,j)=>C.type===j.type?C.name.localeCompare(j.name):C.type==="dir"?-1:1),h=A.slice(0,20)}}catch{}let f=await r.query.from("messages m").select("m.content","m.created_at","a.name as sender_name","a.type as sender_type").join("agents a",{"a.id":{col:"m.sender_id"}}).where(F({"m.department_id":{eq:i.id}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(3).run(),g=[];try{let w=await r.query.from("department_members dm").select("a.id as mgr_id","a.name as mgr_name","a.department_id").join("agents a",{"a.id":{col:"dm.agent_id"}}).where(F({"dm.department_id":{eq:i.id}},{"a.type":{eq:"department"}})).run();for(let y of w??[]){let k=String(y.department_id);if(k===i.id)continue;let[_]=await o.departments.select("id","name","workspace_path").where(F(L(o.departments.c.id,k),L(o.departments.c.app_id,s))).run();if(!_)continue;let v=0,S=[];try{let[A]=await r.query.from("department_members").count("*","n").where({department_id:{eq:k}}).run();v=Number(A?.n??0)}catch{}try{let{resolveDepartmentWorkspace:A}=await Promise.resolve().then(()=>(Ie(),qe)),C=await A(k,_.workspace_path,!0);if(C){let{readdir:j,stat:K}=await import("node:fs/promises"),{join:U}=await import("node:path"),H=await j(C,{withFileTypes:!0}),V=[];for(let Q of H){if(Q.name.startsWith("."))continue;let P=U(C,Q.name);try{let E=await K(P);V.push({name:Q.name,type:Q.isDirectory()?"dir":"file",size:E.size,mtime:E.mtime.toISOString()})}catch{}}V.sort((Q,P)=>Q.type===P.type?Q.name.localeCompare(P.name):Q.type==="dir"?-1:1),S=V.slice(0,10)}}catch{}g.push({id:k,name:String(_.name),managerId:String(y.mgr_id),managerName:String(y.mgr_name),memberCount:v,files:S})}}catch{}return Response.json({department:a,members:l,env:m,files:h,subDepartments:g,recentMessages:(f??[]).map(w=>({content:String(w.content??"").slice(0,120),senderName:String(w.sender_name??""),senderType:String(w.sender_type??""),createdAt:w.created_at}))})}),n.get("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.departments.select().where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let l=await r.query.from("department_members dm").select("a.id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","dm.role","dm.joined_at").join("agents a",{"a.id":{col:"dm.agent_id"}}).where({"dm.department_id":{eq:i.id}}).run();return Response.json({department:a,members:l})}),n.put("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),a=await Wt(e,o.departments,{variant:"patch",omit:[]});if(a.artifact_review!==void 0)try{let[c]=await o.departments.select("artifact_review").where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run();if(c?.artifact_review===!0&&a.artifact_review===!1){let{sql:p}=t,{flushPendingArtifacts:m}=await Promise.resolve().then(()=>(Yi(),Xi));await m(p,i.id)}}catch{}let l={updated_at:G.now()};a.name!==void 0&&(l.name=a.name),a.artifact_review!==void 0&&(l.artifact_review=a.artifact_review);let[u]=await r.query.update("departments").set(l).where(F({id:{eq:i.id}},{app_id:{eq:s}})).returning("id","name","artifact_review","updated_at").run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);return Response.json({department:u})}),n.delete("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:i}=t;try{let{appRoleOf:l}=await Promise.resolve().then(()=>(dn(),cn));if(await l(t)!=="owner")throw new T("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u5220\u9664\u90E8\u95E8",403)}catch(l){return Response.json({error:l?.message??"\u6743\u9650\u6821\u9A8C\u5931\u8D25"},{status:Number(l?.status)??403})}let o=Z(r);try{let{manager:l}=await Promise.resolve().then(()=>(Se(),Ee));l.init(r),await l.terminateByDepartment(i.id)}catch{}if((await o.departments.delete().where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run()).length===0)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);await o.agents.delete().where(F(L(o.agents.c.type,"department"),L(o.agents.c.department_id,i.id),L(o.agents.c.app_id,s))).run();try{let{resolveDepartmentWorkspace:l,getDefaultWorkspaceRoot:u}=await Promise.resolve().then(()=>(Ie(),qe)),c=await l(i.id,null,!0);if(c&&Number(process.env.SANDBOX_WORKSPACE_RETENTION_DAYS??0)<=0){let{rm:p}=await import("node:fs/promises");await p(c,{recursive:!0,force:!0})}}catch{}return Response.json({success:!0})}),n.post("/api/departments/:id/members",async(e,t)=>{let{orm:r,appId:s,params:i,auth:o}=t,a=await e.json();if(!a.agent_id)throw new T("agent_id \u4E3A\u5FC5\u586B",400);let l=Z(r),[u]=await l.departments.select("id").where(F(L(l.departments.c.id,i.id),L(l.departments.c.app_id,s))).run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[c]=await l.agents.select("id").where(F(L(l.agents.c.id,a.agent_id),L(l.agents.c.app_id,s))).run();if(!c)throw new T("Agent \u4E0D\u5B58\u5728",404);let[d]=await r.query.from("department_members dm").select("dm.role").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).where(F({"dm.department_id":{eq:i.id}},{"ua.user_id":{eq:o.userId}})).limit(1).run(),p=r.table("_weifuwu_app_members",cc),[m]=await p.select("role").where(F(L(p.c.app_id,s),L(p.c.user_id,o.userId))).run();if((!d||d.role!=="admin")&&m?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u7BA1\u7406\u6210\u5458",403);await l.department_members.insert({department_id:i.id,agent_id:a.agent_id,role:a.role??"member"}).onConflict(["department_id","agent_id"],!0).run();try{let{refreshManagerPrompt:h}=await Promise.resolve().then(()=>(Wr(),Lr));await h(r,s,i.id)}catch{}return Response.json({success:!0})}),n.delete("/api/departments/:id/members/:agentId",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.departments.select("id").where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);await o.department_members.delete().where(F(L(o.department_members.c.department_id,i.id),L(o.department_members.c.agent_id,i.agentId))).run();try{let{refreshManagerPrompt:l}=await Promise.resolve().then(()=>(Wr(),Lr));await l(r,s,i.id)}catch{}return Response.json({success:!0})}),n.get("/api/departments/:id/artifacts/pending",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=Z(r),[a]=await o.departments.select("id").where(F(L(o.departments.c.id,i.id),L(o.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let{sql:l}=t,{listPendingArtifacts:u}=await Promise.resolve().then(()=>(Yi(),Xi)),c=await u(l,i.id);return Response.json({pending:c})}),n.post("/api/departments/:id/artifacts/:action",async(e,t)=>{let{orm:r,appId:s,params:i,auth:o}=t,a=i.action;if(!["approve","reject"].includes(a))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let l=Z(r),[u]=await l.departments.select("id").where(F(L(l.departments.c.id,i.id),L(l.departments.c.app_id,s))).run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[c]=await r.query.from("department_members dm").select("dm.role").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).where(F({"dm.department_id":{eq:i.id}},{"ua.user_id":{eq:o.userId}})).limit(1).run(),[d]=await r.table("_weifuwu_app_members",cc).select("role").where({app_id:{eq:s},user_id:{eq:o.userId}}).run();if((!c||c.role!=="admin")&&d?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279\u4EA7\u7269",403);let p=await e.json().catch(()=>({})),m=String(p.path??""),{sql:h}=t,{approveArtifact:f,rejectArtifact:g}=await Promise.resolve().then(()=>(Yi(),Xi)),w=a==="approve"?await f(h,i.id,m):await g(h,i.id,m);return w.ok?Response.json({success:!0,path:m}):Response.json({error:w.error},{status:400})})}nt();function Gw(n){n.post("/api/demo/space",async(e,t)=>{try{let{requireWriter:u,appRoleOf:c}=await Promise.resolve().then(()=>(dn(),cn));if(await u(t),await c(t)!=="owner")throw new Error("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u521B\u5EFA\u6F14\u793A\u7A7A\u95F4")}catch(u){return Response.json({error:u?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(u?.status)??403})}let{orm:r,appId:s}=t,{dept:i,mgr:o,ai:a,kb:l}=await r.transaction(async u=>{let c=Z(u),[d]=await c.departments.insert({app_id:s,name:"\u6F14\u793A\u9879\u76EE"}).returning("id").run(),[p]=await c.agents.insert({app_id:s,type:"department",name:"\u6F14\u793A\u9879\u76EE\u7ECF\u7406",description:"\u90E8\u95E8\u7ECF\u7406\u2014\u2014\u4EE3\u8868\u300C\u6F14\u793A\u9879\u76EE\u300D\u5BF9\u5916\u534F\u4F5C",model:"deepseek-v4-flash",department_id:String(d.id),is_active:!0,tools:[],allow_file_tools:!0}).returning("id").run();await c.department_members.insert({department_id:String(d.id),agent_id:String(p.id),role:"manager"}).run();let[m]=await c.agents.insert({app_id:s,type:"ai",name:"\u5BA2\u670D\u5C0F\u77E5",description:"\u6F14\u793A\u5BA2\u670D\u52A9\u624B",system_prompt:"\u4F60\u662F\u300C\u6F14\u793A\u9879\u76EE\u300D\u7684\u5BA2\u670D\u52A9\u624B\uFF0C\u793C\u8C8C\u3001\u7B80\u6D01\u5730\u56DE\u5E94\u7528\u6237\u95EE\u9898\uFF1B\u4E0D\u786E\u5B9A\u65F6\u8BF4\u660E\u5E76\u5EFA\u8BAE\u8865\u5145\u8D44\u6599\u3002",model:"deepseek-chat",department_id:String(d.id),is_active:!0,tools:[]}).returning("id").run(),[h]=await c.agents.insert({app_id:s,type:"knowledge_base",name:"\u4EA7\u54C1\u77E5\u8BC6\u5E93",department_id:String(d.id),is_active:!0,tools:[]}).returning("id").run();return await c.department_members.insert([{department_id:String(d.id),agent_id:String(m.id),role:"member"},{department_id:String(d.id),agent_id:String(h.id),role:"member"}]).run(),{dept:d,mgr:p,ai:m,kb:h}});try{let{refreshManagerPrompt:u}=await Promise.resolve().then(()=>(Wr(),Lr));await u(t.orm,s,String(i.id))}catch{}return Response.json({success:!0,department:{id:i.id,name:"\u6F14\u793A\u9879\u76EE"},manager:o.id,agents:[a.id,l.id]},{status:201})})}re();function Qw(n){function e(r){let s=r.auth?.role;return s!=="owner"&&s!=="admin"?{ok:!1,error:"\u4EC5\u7BA1\u7406\u5458\u53EF\u7BA1\u7406\u6C99\u76D2",status:403}:{ok:!0}}async function t(r,s,i,o){try{let{writeAudit:a}=await Promise.resolve().then(()=>(st(),rt));await a(r,{action:s,target_type:"sandbox",target_id:i,detail:o??{}})}catch{}}n.get("/api/sandboxes",async(r,s)=>{let{sql:i,orm:o,appId:a}=s,l=new URL(r.url),u=l.searchParams.get("status")??void 0,c=l.searchParams.get("department_id")??void 0,{manager:d}=await Promise.resolve().then(()=>(Se(),Ee));d.init(o);let p=await d.list(a,{status:u,department_id:c}),m=p.map(S=>S.department_id).filter(Boolean),h=new Map;if(m.length>0){let S=await o.query.from("departments").select("id","name").where({id:{in:m}}).run();for(let A of S??[])h.set(String(A.id),String(A.name??A.id))}let{sandbox:f}=await Promise.resolve().then(()=>(De(),Fe)),g=await f.listContainers(),w=new Map;for(let S of g)w.set(String(S.name??"").replace("ap-sandbox-",""),String(S.status??""));let y=p.map(S=>({...S,departmentName:S.department_id?h.get(S.department_id)??"\u672A\u77E5\u90E8\u95E8":null,containerStatus:w.get(S.id)??null,runningExec:f.runningExecs.get(String(S.id))??null})),[k]=await o.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:a}}).limit(1).run(),_=Number(k?.sandbox_quota??5),v=y.filter(S=>S.status!=="terminated").length;return Response.json({sandboxes:y,total:y.length,quota:{used:v,limit:_,pressure:_>0&&v/_>=.8}})}),n.post("/api/sandboxes",async(r,s)=>{let i=e(s);if(!i.ok)return Response.json({error:i.error},{status:i.status??403});let{sql:o,orm:a,appId:l}=s,u=await r.json().catch(()=>({})),c=u.name,d=null;if(u.department_id){let[m]=await a.query.from("departments").select("id","name","is_dm","workspace_path").where({id:{eq:u.department_id},app_id:{eq:l}}).limit(1).run();if(!m)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);c=c??String(m.name??"\u5DE5\u4F5C\u73AF\u5883");try{let{resolveDepartmentWorkspace:h}=await Promise.resolve().then(()=>(Ie(),qe));d=await h(String(m.id),m.workspace_path,!0)}catch{d=null}}let{manager:p}=await Promise.resolve().then(()=>(Se(),Ee));p.init(a);try{let m=await p.create({appId:l,departmentId:u.department_id??null,name:c??"\u5DE5\u4F5C\u73AF\u5883",workspace:d??void 0,image:u.image,network:u.network,memoryMb:u.memory_mb,mode:u.mode});return await t(s,"sandbox_create",String(m.id),{name:m.name,departmentId:m.department_id??void 0}),Response.json({sandbox:m},{status:201})}catch(m){let h=m?.message??"\u521B\u5EFA\u5931\u8D25",f=h.includes("\u914D\u989D");return Response.json({error:h},{status:f?409:400})}}),n.get("/api/sandboxes/events",async(r,s)=>{try{let{sandboxEvents:i}=await Promise.resolve().then(()=>(Ye(),Ln)),o=Number(new URL(r.url).searchParams.get("n")??100),a=new URL(r.url).searchParams.get("sandboxId")??void 0,l=new URL(r.url).searchParams.get("action")??void 0,u=i(Math.min(o,500),{sandboxId:a,action:l}),c=new URL(r.url).searchParams.get("departmentId")??void 0,d=c?u.filter(p=>p.payload?.departmentId===c):u;return Response.json({events:d,departmentId:c??null})}catch(i){return Response.json({error:i?.message??"\u4E8B\u4EF6\u6D41\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/api/sandboxes/:id",async(r,s)=>{let{sql:i,orm:o,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Ee));u.init(o);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(De(),Fe)),p=await d.containerStats(`ap-sandbox-${c.id}`),h=(await d.listContainers()).find(f=>String(f.name)===`ap-sandbox-${c.id}`);return Response.json({sandbox:{...c,containerStatus:h?.status??null,stats:p??null}})}),n.patch("/api/sandboxes/:id",async(r,s)=>{let i=e(s);if(!i.ok)return Response.json({error:i.error},{status:i.status??403});let{sql:o,orm:a,appId:l,params:u}=s,c=await r.json().catch(()=>({})),{manager:d}=await Promise.resolve().then(()=>(Se(),Ee));d.init(a);let p=await d.get(u.id,l);if(!p)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);return await d.updateConfig(String(p.id),l,{image:c.image,network:c.network,memoryMb:c.memory_mb,cpus:c.cpus}),await t(s,"sandbox_config_change",String(p.id),{...c}),Response.json({success:!0})}),n.post("/api/sandboxes/:id/:action",async(r,s)=>{let i=e(s);if(!i.ok)return Response.json({error:i.error},{status:i.status??403});let{sql:o,orm:a,appId:l,params:u}=s,c=u.action;if(!["start","stop","restart","terminate"].includes(c))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let{manager:d}=await Promise.resolve().then(()=>(Se(),Ee));d.init(a);let p=u.id,m=await d.get(p,l);if(!m)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let h;return c==="terminate"?(await d.terminate(p,l),h={ok:!0}):c==="start"?h=await d.start(p,l):c==="stop"?h=await d.stop(p,l):h=await d.restart(p,l),h.ok?(await t(s,`sandbox_${c}`,p,{name:m.name}),Response.json({success:!0,status:c==="terminate"?"terminated":void 0})):Response.json({error:h.error},{status:400})}),n.get("/api/sandboxes/:id/debug",async(r,s)=>{let{sql:i,orm:o,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Ee));u.init(o);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(De(),Fe)),p=d.runningExecs.get(String(c.id))??null,m=await u.eventHistory(String(c.id),30),{sandboxEvents:h}=await Promise.resolve().then(()=>(Ye(),Ln)),f=h(50,{sandboxId:String(c.id)}),g=await d.containerProcesses(`ap-sandbox-${c.id}`).catch(()=>[]);return Response.json({sandbox:{id:c.id,status:c.status,error:c.error,last_used_at:c.last_used_at},runningExec:p?{tool:p.tool,startedAt:new Date(p.startedAt).toISOString(),elapsedMs:Date.now()-p.startedAt,timeoutMs:p.timeoutMs}:null,events:m,liveEvents:f,processes:g.slice(0,20)})}),n.get("/api/sandboxes/:id/processes",async(r,s)=>{let{sql:i,orm:o,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Ee));u.init(o);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(De(),Fe)),p=await d.containerProcesses(`ap-sandbox-${c.id}`);return Response.json({name:c.name,processes:p})}),n.get("/api/sandboxes/:id/stats",async(r,s)=>{let{sql:i,orm:o,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Ee));u.init(o);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(De(),Fe)),p=await d.containerStats(`ap-sandbox-${c.id}`);return Response.json({name:c.name,stats:p??null})})}function Jw(n){n.get("/api/events",async(e,t)=>{try{let{aiEvents:r}=await Promise.resolve().then(()=>(Ws(),Cc)),{sandboxEvents:s,clusterEvents:i}=await Promise.resolve().then(()=>(Ye(),Ln)),o=new URL(e.url),a=Number(o.searchParams.get("n")??200),l=o.searchParams.get("requestId")??void 0,u=o.searchParams.get("entity")??void 0,c=o.searchParams.get("action")??void 0,d=u==="sandbox"?[]:r(a,{action:c}),p=o.searchParams.get("hostId")??void 0,m=u==="ai"?[]:p?i(a,{hostId:p,action:c}):s(a,{action:c}),h=[...d.map(f=>({...f,_tier:"ai"})),...m.map(f=>({...f,_tier:"sandbox"}))];return l&&(h=h.filter(f=>f.payload?.requestId===l)),h.sort((f,g)=>f.ts-g.ts),Response.json({events:h.slice(-Math.min(a,500)),requestId:l??null})}catch(r){return Response.json({error:r?.message??"\u7EDF\u4E00\u4E8B\u4EF6\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/api/ai/events",async(e,t)=>{try{let{aiEvents:r}=await Promise.resolve().then(()=>(Ws(),Cc)),s=new URL(e.url),i=Number(s.searchParams.get("n")??100),o=s.searchParams.get("agentId")??void 0,a=s.searchParams.get("action")??void 0,l=s.searchParams.get("messageId")??void 0;return Response.json({events:r(Math.min(i,500),{agentId:o,action:a,messageId:l})})}catch(r){return Response.json({error:r?.message??"AI \u4E8B\u4EF6\u6D41\u67E5\u8BE2\u5931\u8D25"},{status:500})}})}re();Wn();re();nt();function Zw(n){n.get("/api/messages/pending-approvals",async(e,t)=>{let{orm:r,appId:s}=t,i=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("departments d",{"d.id":{col:"m.department_id"}}).select("m.id","m.department_id","m.content","m.ai_draft","m.created_at","a.name as agent_name","a.type as agent_type","d.name as department_name").where(F({"a.app_id":{eq:s}},{"m.ai_draft":{ne:null}},{"m.ai_approved":{isNull:!0}})).orderBy("m.created_at","desc").limit(50).run();return Response.json({pending:i})}),n.post("/api/messages/pending-approvals/bulk",async(e,t)=>{let{orm:r,appId:s,auth:i}=t,o=await e.json(),a=[...new Set((o.ids??[]).map(String))].slice(0,50);if(a.length===0)throw new T("ids \u4E3A\u5FC5\u586B\uFF08\u226450 \u6761\uFF09",400);let l=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id").where(F({"a.app_id":{eq:s}},{"m.ai_draft":{ne:null}},{"m.ai_approved":{isNull:!0}},{"m.id":{in:a}})).run(),u=new Map(l.map(g=>[String(g.id),g])),c=new Set((await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.department_id").where(F({"ua.user_id":{eq:i.userId}},{"ua.app_id":{eq:s}},{"dm.role":{eq:"admin"}})).run()).map(g=>String(g.department_id))),[d]=await r.query.from("_weifuwu_app_members").select("role").where(F({app_id:{eq:s}},{user_id:{eq:i.userId}})).run(),p=d?.role==="owner",m=0,h=[],f=[];for(let g of a){let w=u.get(g);if(!w){f.push({id:g,error:"\u4E0D\u5B58\u5728\u6216\u5DF2\u5BA1\u6279"});continue}if(!p&&!(w.department_id&&c.has(String(w.department_id)))){f.push({id:g,error:"\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279"});continue}let y=Z(t.orm);await y.messages.update({content:G.colRef("ai_draft"),ai_approved:!0}).where(L(y.messages.c.id,g)).run(),m++}return Response.json({ok:!0,approved:m,failed:f})}),n.get("/api/departments/:id/messages",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=new URL(e.url),a=parseInt(o.searchParams.get("limit")??"50",10),l=o.searchParams.get("before"),u=o.searchParams.get("q")?.trim()??"",[c]=await r.query.from("departments d").select("d.id").where(F({"d.id":{eq:i.id}},{"d.app_id":{eq:s}})).run();if(!c)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let d=null;if(l){let[m]=await r.query.from("messages").select("created_at").where({id:{eq:l}}).run();d=m?String(m.created_at):new Date().toISOString()}let p=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}},{type:"left"}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.id","m.department_id","m.sender_id","m.content","m.msg_type","m.ai_draft","m.ai_approved","m.created_at","m.reply_to","m.attachments","m.routed_to","m.ai_step","m.quick_replies","a.name as sender_name","a.type as sender_type","a.avatar_url as sender_avatar","r.content as reply_content","ra.name as reply_sender").where(F({"m.department_id":{eq:i.id}},d?{"m.created_at":{lt:d}}:{},u?{"m.content":{ilike:"%"+u+"%"}}:{})).orderBy("m.created_at","desc").limit(a).run();return Response.json({messages:p})}),n.post("/api/departments/:id/messages",async(e,t)=>{try{let{requireWriter:y}=await Promise.resolve().then(()=>(dn(),cn));await y(t)}catch(y){return Response.json({error:y?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(y?.status)??403})}let{orm:r,appId:s,auth:i,params:o}=t,a=Z(r),l=await Wt(e,a.messages,{variant:"insert",omit:["department_id","sender_id","ai_draft","ai_approved","ai_step","created_at","updated_at"]}),u=l.attachments??null;if(!l.content&&(!u||u.length===0))throw new T("content \u4E3A\u5FC5\u586B",400);let c=String(l.content??"").slice(0,5e3),d=String(l.request_id??""),p=Z(r),[m]=await p.agents.select("id","name").where(F(L(p.agents.c.app_id,s),L(p.agents.c.type,"user"),L(p.agents.c.user_id,i.userId))).run();if(!m){let[y]=await r.query.from("_weifuwu_users").select("name").where({id:{eq:i.userId}}).run();[m]=await p.agents.insert({app_id:s,type:"user",name:y?String(y.name??"\u7528\u6237"):"\u7528\u6237",user_id:String(i.userId),is_active:!0}).returning("id").run()}if((await r.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where(F({"d.app_id":{eq:s}},{"dm.department_id":{eq:o.id}},{"dm.agent_id":{eq:m.id}})).limit(1).run()).length===0)throw new T("\u4F60\u4E0D\u662F\u8BE5\u90E8\u95E8\u7684\u6210\u5458",403);let f=null;if(u&&u.length>0){let{validateUploadFile:y}=await Promise.resolve().then(()=>(Hi(),Bi)),k=await import("node:fs/promises"),_=await import("node:path"),[v]=await p.messages.insert({department_id:o.id,sender_id:String(m.id),content:c,msg_type:l.msg_type??"text",reply_to:l.reply_to??null}).returning("id").run(),S=_.join(process.cwd(),"data","uploads",s,o.id,String(v.id));await k.mkdir(S,{recursive:!0}),f=[];for(let A of u)try{let C=y(A);await k.writeFile(_.join(S,C.safeName),C.buffer),f.push({name:C.safeName,path:`uploads/${String(v.id)}/${C.safeName}`,size:C.size,ext:C.ext})}catch(C){return await k.rm(S,{recursive:!0,force:!0}).catch(()=>{}),Response.json({error:`\u9644\u4EF6\u300C${A?.name??""}\u300D\u65E0\u6548\uFF1A${C?.message??"\u672A\u77E5\u9519\u8BEF"}`},{status:400})}return await p.messages.update({attachments:f}).where(L(p.messages.c.id,v.id)).run(),v.content=c,v.msg_type=l.msg_type??"text",v.created_at=new Date().toISOString(),t.msg.broadcast(o.id,{type:"new_message",departmentId:o.id,message:{id:v.id,sender_id:v.sender_id,sender_name:m.name??"",content:v.content,attachments:f}}),Fi(t,o.id,String(m.id),c,String(v.id),d).catch(A=>console.error("[messages] handleNewMessageStream error:",A)),Response.json({message:v},{status:201})}let[g]=await p.messages.insert({department_id:o.id,sender_id:String(m.id),content:c,msg_type:l.msg_type??"text",reply_to:l.reply_to??null}).returning("id","department_id","sender_id","content","msg_type","created_at").run();t.msg.broadcast(o.id,{type:"new_message",departmentId:o.id,message:{id:g.id,sender_id:g.sender_id,sender_name:m.name??"",content:g.content}});let w=process.env.DEEPSEEK_API_KEY;return w&&w!=="sk-your-deepseek-api-key"&&!w.startsWith("sk-your-")&&Fi(t,o.id,String(m.id),c,g.id,d).catch(y=>console.error("[messages] handleNewMessageStream error:",y)),Response.json({message:g},{status:201})}),n.post("/api/departments/:id/messages/stream",async(e,t)=>{let{orm:r,appId:s,auth:i,params:o}=t,a=await e.json();if(!a.content)throw new T("content \u4E3A\u5FC5\u586B",400);let l=String(a.content).slice(0,5e3),u=Z(r),[c]=await u.agents.select("id","name").where(F(L(u.agents.c.app_id,s),L(u.agents.c.type,"user"),L(u.agents.c.user_id,i.userId))).run();if(!c){let[g]=await r.query.from("_weifuwu_users").select("name").where({id:{eq:i.userId}}).run();[c]=await u.agents.insert({app_id:s,type:"user",name:g?String(g.name??"\u7528\u6237"):"\u7528\u6237",user_id:String(i.userId),is_active:!0}).returning("id").run()}if((await r.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where(F({"d.app_id":{eq:s}},{"dm.department_id":{eq:o.id}},{"dm.agent_id":{eq:c.id}})).limit(1).run()).length===0)throw new T("\u4F60\u4E0D\u662F\u8BE5\u90E8\u95E8\u7684\u6210\u5458",403);let[p]=await u.messages.insert({department_id:o.id,sender_id:String(c.id),content:a.content,msg_type:"text"}).returning("id","department_id","sender_id","content","msg_type","created_at").run();t.msg.broadcast(o.id,{type:"new_message",departmentId:o.id,message:{id:p.id,sender_id:p.sender_id,sender_name:c.name??"",content:p.content}});let m=process.env.DEEPSEEK_API_KEY;if(!(m&&m!=="sk-your-deepseek-api-key"&&!m.startsWith("sk-your-")))return new Response(`event: error
485
+ `,{headers:{"Content-Type":"text/plain; version=0.0.4"}})}),n.get("/api/metrics",async()=>{let o=globalThis.__platform_metrics??{},i=Math.round((Date.now()-(o.startTime??Date.now()))/1e3),a=-1,l=-1;try{let[c]=await t.runMigration("pg-stat-probe","SELECT count(*) FILTER (WHERE state = 'active')::int as active, count(*)::int as total FROM pg_stat_activity").then(()=>[]);a=Number(c?.active??-1),l=Number(c?.total??-1)}catch{}let u={};try{let{manager:c}=await Promise.resolve().then(()=>(Se(),Te)),{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze)),p={};try{p=await c.statusCounts()}catch{}u={calls:o.sandboxCalls??0,created:c.counters.created,terminated:c.counters.terminated,evicted:c.counters.evicted,idleStopped:c.counters.idleStopped,autoStarted:c.counters.autoStarted,orphansCleaned:c.counters.orphansCleaned,exec:d.execStats,statusCounts:p}}catch{}return Response.json({uptimeSec:i,requests:o.requests??0,errors:o.errors??0,errors5xx:o.errors5xx??0,errorsCaught:o.errorsCaught??0,errorRate:o.requests?Number((o.errors/o.requests*100).toFixed(2)):0,aiCalls:o.aiCalls??0,aiTokens:o.aiTokens??0,aiAvgLatencyMs:o.aiCalls?Math.round((o.aiLatencyMs??0)/o.aiCalls):0,webhooks:o.webhooks??0,sandboxCalls:o.sandboxCalls??0,sandbox:u,pgConnections:{active:a,total:l},memMB:Math.round(process.memoryUsage().rss/1024/1024)})})}re();Or();Zi();nt();td();import{join as Fr}from"node:path";re();import{readFile as F0,readdir as V0,writeFile as z0,stat as Xi,mkdir as K0}from"node:fs/promises";import{join as Hw,resolve as Ww,normalize as Uw,sep as G0,dirname as Q0}from"node:path";function Yi(n,e){let t=Ww(Hw(n,e||".")),r=Uw(t),s=Uw(Ww(n));if(!r.startsWith(s+G0)&&r!==s)throw new Error(`\u8DEF\u5F84 "${e}" \u8D85\u51FA\u4E86\u5DE5\u4F5C\u7A7A\u95F4\u8303\u56F4`);return r}var dd=200*1024,Bw=500*1024;async function Fw(n){async function e(t,r){let{orm:s,appId:o}=t,[i]=await s.query.from("departments").select("id","is_dm","workspace_path").where({id:{eq:r},app_id:{eq:o}}).limit(1).run();if(!i)return null;let{resolveDepartmentWorkspace:a}=await Promise.resolve().then(()=>(Ne(),De));return a(String(i.id),i.workspace_path,!0)}n.get("/api/departments/:id/workspace/list",async(t,r)=>{let{params:s}=r,o=await e(r,s.id);if(!o)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let i=new URL(t.url).searchParams.get("path")??"",a;try{a=Yi(o,i)}catch(l){return Response.json({error:l.message},{status:400})}try{if(!(await Xi(a)).isDirectory())throw new T("\u4E0D\u662F\u76EE\u5F55",400);let u=await V0(a,{withFileTypes:!0}),c=[];for(let d of u){let p=Hw(a,d.name);try{let f=await Xi(p);c.push({name:d.name,type:d.isDirectory()?"dir":"file",size:f.size,mtime:f.mtime.toISOString()})}catch{}}return c.sort((d,p)=>d.type===p.type?d.name.localeCompare(p.name):d.type==="dir"?-1:1),Response.json({entries:c,path:i||"/"})}catch(l){return Response.json({error:`\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25: ${l.message}`},{status:400})}}),n.post("/api/departments/:id/workspace/download-ticket",async(t,r)=>{try{let{requireWriter:i}=await Promise.resolve().then(()=>(dn(),cn));await i(r)}catch(i){return Response.json({error:i?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(i?.status)??403})}let s=await t.json().catch(()=>({})),o=String(s.path??"");if(!o)throw new T("path \u4E3A\u5FC5\u586B",400);try{let{signToken:i}=await Promise.resolve().then(()=>(re(),Pi)),a=process.env.JWT_SECRET??"default-secret",l=i({type:"download",appId:r.appId,deptId:String(r.params?.id??""),path:o,sub:r.auth?.userId},a,30);return Response.json({ticket:l,expiresIn:30})}catch{throw new T("ticket \u7B7E\u53D1\u5931\u8D25",500)}}),n.get("/api/departments/:id/workspace/file",async(t,r)=>{let{params:s}=r,o=new URL(t.url),i=o.searchParams.get("ticket"),a=o.searchParams.get("path")??"";if(i&&!t.headers.get("authorization"))try{let{verifyToken:d}=await Promise.resolve().then(()=>(re(),Pi)),p=process.env.JWT_SECRET??"default-secret",f=d(i,p);if(f?.type!=="download")throw new Error("ticket \u7C7B\u578B\u4E0D\u7B26");if(r.appId=f.appId,f.path!==decodeURIComponent(a))throw new Error("ticket path \u4E0D\u5339\u914D");r.auth={userId:String(f.sub??""),...r.auth},r.ticketUser=f.sub}catch{throw new T("\u4E0B\u8F7D ticket \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\uFF0830s\u2014\u2014\u8BF7\u91CD\u65B0\u70B9\u51FB\uFF09",401)}let l=await e(r,s.id);if(!l)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let u=o.searchParams.get("path")??"";if(!u)throw new T("path \u4E3A\u5FC5\u586B",400);let c;try{c=Yi(l,u)}catch(d){return Response.json({error:d.message},{status:400})}try{let d=await Xi(c);if(d.isDirectory())throw new T("\u662F\u76EE\u5F55\u2014\u2014\u8BF7\u7528 list \u63A5\u53E3",400);let p=await F0(c);if(o.searchParams.get("download")==="1"){let g=await import("node:path");return new Response(new Uint8Array(p),{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="${encodeURIComponent(g.basename(u))}"`,"Content-Length":String(p.length)}})}let f=p.includes(0),w="",m=!1;if(!f){let g=p.toString("utf-8");g.length>dd&&(g=g.slice(0,dd)+`
486
+ ... (\u6587\u4EF6\u8FC7\u5927\uFF0C\u4EC5\u9884\u89C8\u524D ${dd} \u5B57\u7B26\uFF0C\u603B\u957F ${g.length})`,m=!0),w=g}return Response.json({content:w,binary:f,truncated:m,size:d.size})}catch(d){return Response.json({error:`\u8BFB\u53D6\u5931\u8D25: ${d.message}`},{status:404})}}),n.put("/api/departments/:id/workspace/file",async(t,r)=>{let{params:s}=r,o=await e(r,s.id);if(!o)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let i=await t.json().catch(()=>({})),a=String(i.path??""),l=String(i.content??"");if(!a)throw new T("path \u4E3A\u5FC5\u586B",400);if(l.length>Bw)return Response.json({error:`\u6587\u4EF6\u8FC7\u5927\uFF08\u4E0A\u9650 ${Bw} \u5B57\u7B26\uFF09`},{status:413});if(l.includes("\0"))throw new T("\u4E8C\u8FDB\u5236\u5185\u5BB9\u4E0D\u53EF\u5199\u2014\u2014\u4EC5\u652F\u6301\u6587\u672C\u7F16\u8F91",400);let u;try{u=Yi(o,a)}catch(c){return Response.json({error:c.message},{status:400})}try{if((await Xi(u).catch(()=>null))?.isDirectory())throw new T("\u76EE\u6807\u5DF2\u5B58\u5728\u4E14\u662F\u76EE\u5F55\u2014\u2014\u4E0D\u80FD\u8986\u76D6",400);return await K0(Q0(u),{recursive:!0}),await z0(u,l,"utf-8"),Response.json({success:!0,size:l.length})}catch(c){return Response.json({error:`\u5199\u5165\u5931\u8D25: ${c.message}`},{status:400})}}),n.post("/api/departments/:id/workspace/upload",async(t,r)=>{let{params:s}=r,o=await e(r,s.id);if(!o)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728\u6216\u65E0\u5DE5\u4F5C\u7A7A\u95F4",404);let i=await t.json().catch(()=>({})),a=String(i.path??""),{validateUploadFile:l}=await Promise.resolve().then(()=>(Vi(),Fi)),u;try{u=l(i)}catch(f){return Response.json({error:f?.message??"\u9644\u4EF6\u65E0\u6548"},{status:400})}let c;try{c=Yi(o,a?`${a.replace(/\/$/,"")}/${u.safeName}`:u.safeName)}catch(f){return Response.json({error:f.message},{status:400})}let d=await import("node:fs/promises"),p=await import("node:path");try{return await d.mkdir(p.dirname(c),{recursive:!0}),await d.writeFile(c,u.buffer),Response.json({success:!0,name:u.safeName,size:u.size})}catch(f){return Response.json({error:`\u5199\u5165\u5931\u8D25: ${f.message}`},{status:400})}})}re();re();nt();function Kw(n){n.get("/api/departments",async(e,t)=>{let{sql:r,orm:s,appId:o}=t,i=new URL(e.url),a=Math.max(0,parseInt(i.searchParams.get("offset")??"0",10)),l=Math.min(100,Math.max(1,parseInt(i.searchParams.get("limit")??"50",10))),u=String(i.searchParams.get("q")??"").trim(),c=await s.query.from("departments").select("id","app_id","name","is_dm","created_at").where({app_id:{eq:o},...u?{name:{ilike:`%${u}%`}}:{}}).limit(l).offset(a).run(),d=c.map(C=>String(C.id)),p=d.length?await s.query.from("department_members").select("department_id","agent_id").where({department_id:{in:d}}).run():[],f=new Map,w=new Map;for(let C of p){let W=String(C.department_id),G=f.get(W)??{member_count:0,human_count:0};G.member_count+=1,f.set(W,G),w.set(W,[...w.get(W)??[],String(C.agent_id??"")])}let m=[...new Set(p.map(C=>String(C.agent_id??"")))],g=m.length?await s.query.from("agents").select("id","type").where({id:{in:m}}).run():[],h=new Map(g.map(C=>[String(C.id),String(C.type)]));for(let[C,W]of f)W.human_count=(w.get(C)??[]).filter(G=>h.get(G)==="user").length;let b=d.length?await s.query.from("messages").select("department_id","content","created_at").where({department_id:{in:d}}).orderBy("created_at","desc").run():[],k=new Set,_=new Map;for(let C of b){let W=String(C.department_id);k.has(W)||(k.add(W),_.set(W,{last_message:C.content,last_message_at:C.created_at}))}let v=c.map(C=>({id:C.id,app_id:C.app_id,name:C.name,is_dm:C.is_dm,created_at:C.created_at,...f.get(String(C.id))??{member_count:0,human_count:0},..._.get(String(C.id))??{last_message:null,last_message_at:null}})).sort((C,W)=>String(W.last_message_at??W.created_at).localeCompare(String(C.last_message_at??C.created_at))),S=Z(s),[A]=await s.query.from("departments").count("*","total").where({app_id:{eq:o}}).run();return Response.json({departments:v,total:A?.total??0})}),n.post("/api/departments/dm",async(e,t)=>{let{orm:r,appId:s,auth:o}=t,i=await e.json();if(!i.agent_id)throw new T("agent_id \u4E3A\u5FC5\u586B",400);let a=Z(r),[l]=await a.agents.select("id").where(V(L(a.agents.c.id,i.agent_id),L(a.agents.c.app_id,s),is(a.agents.c.type,"user"))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agents.select("id").where(V(L(a.agents.c.app_id,s),L(a.agents.c.type,"user"),L(a.agents.c.user_id,o.userId))).run();if(!u)throw new T("\u5F53\u524D\u7528\u6237\u65E0\u7ED1\u5B9A Agent",400);let c=await r.query.from("departments d").select("d.id").join("department_members dm1",V({"dm1.department_id":{col:"d.id"}},{"dm1.agent_id":{eq:u.id}})).join("department_members dm2",V({"dm2.department_id":{col:"d.id"}},{"dm2.agent_id":{eq:l.id}})).where({"d.is_dm":{eq:!0}}).exists({kind:"select",table:"department_members",alias:"dm3",cols:["1"],where:V({"dm3.department_id":{col:"d.id"}},{"dm3.agent_id":{notIn:[String(u.id),String(l.id)]}})},!0).limit(1).run();if(c.length)return Response.json({department:c[0],existed:!0});let[d]=await a.departments.insert({app_id:s,name:"\u5355\u804A",is_dm:!0}).returning("id","app_id","name","is_dm","created_at").run();return await a.department_members.insert([{department_id:String(d.id),agent_id:String(u.id),role:"admin"},{department_id:String(d.id),agent_id:String(l.id),role:"member"}]).onConflict().run(),Response.json({department:d,existed:!1},{status:201})}),n.post("/api/departments",async(e,t)=>{try{let{requireWriter:c}=await Promise.resolve().then(()=>(dn(),cn));await c(t)}catch(c){return Response.json({error:c?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(c?.status)??403})}try{let{appRoleOf:c}=await Promise.resolve().then(()=>(dn(),cn));if(await c(t)!=="owner")throw new T("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u521B\u5EFA\u90E8\u95E8",403)}catch(c){return Response.json({error:c?.message??"\u6743\u9650\u6821\u9A8C\u5931\u8D25"},{status:Number(c?.status)??403})}let{orm:r,appId:s}=t,o=await e.json();if(!o.name)throw new T("name \u4E3A\u5FC5\u586B",400);let i=Z(r),[a]=await i.departments.insert({app_id:s,name:o.name,is_dm:o.is_dm??!1}).returning("id","app_id","name","is_dm","created_at").run(),[l]=await i.agents.select("id").where(V(L(i.agents.c.app_id,s),L(i.agents.c.type,"user"),L(i.agents.c.user_id,t.auth.userId))).run();l&&await i.department_members.insert({department_id:String(a.id),agent_id:String(l.id),role:"admin"}).onConflict().run(),o.member_ids&&o.member_ids.length>0&&await i.department_members.insert(o.member_ids.map(c=>({department_id:String(a.id),agent_id:c,role:"member"}))).onConflict().run();let u=null;if(!o.is_dm&&o.auto_manager!==!1){let[c]=await i.agents.insert({app_id:s,type:"department",name:String(o.name)+"\u7ECF\u7406",description:"\u90E8\u95E8\u7ECF\u7406\u2014\u2014\u4EE3\u8868\u300C"+String(o.name)+"\u300D\u5BF9\u5916\u534F\u4F5C",model:"deepseek-v4-flash",department_id:String(a.id),is_active:!0,tools:[],allow_file_tools:!0}).returning("id","name").run();await i.department_members.insert({department_id:String(a.id),agent_id:String(c.id),role:"manager"}).onConflict().run();try{let{refreshManagerPrompt:d}=await Promise.resolve().then(()=>(Ur(),Wr));await d(r,s,String(a.id))}catch{}u={id:c.id,name:c.name}}return Response.json({department:a,manager:u},{status:201})}),n.get("/api/departments/:id/workspace",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.departments.select().where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let l=await r.query.from("department_members dm").select("a.id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","dm.role","dm.joined_at").join("agents a",{"a.id":{col:"dm.agent_id"}}).where({"dm.department_id":{eq:o.id}}).run(),{sql:u}=t,{manager:c}=await Promise.resolve().then(()=>(Se(),Te));c.init(r);let d=await c.byDepartment(o.id),p={running:{status:"ready",label:"AI \u968F\u65F6\u80FD\u5E72\u6D3B"},stopped:{status:"cold",label:"AI \u4F11\u606F\u4E2D\uFF0C\u5E72\u6D3B\u65F6\u81EA\u52A8\u5524\u9192"},requested:{status:"cold",label:"\u73AF\u5883\u5F85\u542F\u52A8\uFF08\u9996\u6B21\u5E72\u6D3B\u81EA\u52A8\u521B\u5EFA\uFF09"},error:{status:"error",label:"\u73AF\u5883\u5F02\u5E38\uFF0C\u8BF7\u7BA1\u7406\u5458\u5904\u7406"}},f={status:"none",label:""};d&&p[d.status]&&(f=p[d.status]);let w=[];try{let{resolveDepartmentWorkspace:h}=await Promise.resolve().then(()=>(Ne(),De)),b=await h(o.id,a.workspace_path,!0);if(b){let{readdir:k,stat:_}=await import("node:fs/promises"),{join:v}=await import("node:path"),S=await k(b,{withFileTypes:!0}),A=[];for(let C of S){if(C.name.startsWith("."))continue;let W=v(b,C.name);try{let G=await _(W);A.push({name:C.name,type:C.isDirectory()?"dir":"file",size:G.size,mtime:G.mtime.toISOString()})}catch{}}A.sort((C,W)=>C.type===W.type?C.name.localeCompare(W.name):C.type==="dir"?-1:1),w=A.slice(0,20)}}catch{}let m=await r.query.from("messages m").select("m.content","m.created_at","a.name as sender_name","a.type as sender_type").join("agents a",{"a.id":{col:"m.sender_id"}}).where(V({"m.department_id":{eq:o.id}},{"m.ai_approved":{ne:!1}})).orderBy("m.created_at","desc").limit(3).run(),g=[];try{let h=await r.query.from("department_members dm").select("a.id as mgr_id","a.name as mgr_name","a.department_id").join("agents a",{"a.id":{col:"dm.agent_id"}}).where(V({"dm.department_id":{eq:o.id}},{"a.type":{eq:"department"}})).run();for(let b of h??[]){let k=String(b.department_id);if(k===o.id)continue;let[_]=await i.departments.select("id","name","workspace_path").where(V(L(i.departments.c.id,k),L(i.departments.c.app_id,s))).run();if(!_)continue;let v=0,S=[];try{let[A]=await r.query.from("department_members").count("*","n").where({department_id:{eq:k}}).run();v=Number(A?.n??0)}catch{}try{let{resolveDepartmentWorkspace:A}=await Promise.resolve().then(()=>(Ne(),De)),C=await A(k,_.workspace_path,!0);if(C){let{readdir:W,stat:G}=await import("node:fs/promises"),{join:U}=await import("node:path"),F=await W(C,{withFileTypes:!0}),K=[];for(let M of F){if(M.name.startsWith("."))continue;let O=U(C,M.name);try{let E=await G(O);K.push({name:M.name,type:M.isDirectory()?"dir":"file",size:E.size,mtime:E.mtime.toISOString()})}catch{}}K.sort((M,O)=>M.type===O.type?M.name.localeCompare(O.name):M.type==="dir"?-1:1),S=K.slice(0,10)}}catch{}g.push({id:k,name:String(_.name),managerId:String(b.mgr_id),managerName:String(b.mgr_name),memberCount:v,files:S})}}catch{}return Response.json({department:a,members:l,env:f,files:w,subDepartments:g,recentMessages:(m??[]).map(h=>({content:String(h.content??"").slice(0,120),senderName:String(h.sender_name??""),senderType:String(h.sender_type??""),createdAt:h.created_at}))})}),n.get("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.departments.select().where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let l=await r.query.from("department_members dm").select("a.id","a.type","a.name","a.avatar_url","a.description","a.role_label","a.expertise","dm.role","dm.joined_at").join("agents a",{"a.id":{col:"dm.agent_id"}}).where({"dm.department_id":{eq:o.id}}).run();return Response.json({department:a,members:l})}),n.put("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),a=await Wt(e,i.departments,{variant:"patch",omit:[]});if(a.artifact_review!==void 0)try{let[c]=await i.departments.select("artifact_review").where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run();if(c?.artifact_review===!0&&a.artifact_review===!1){let{sql:p}=t,{flushPendingArtifacts:f}=await Promise.resolve().then(()=>(ta(),ea));await f(p,o.id)}}catch{}let l={updated_at:Q.now()};a.name!==void 0&&(l.name=a.name),a.artifact_review!==void 0&&(l.artifact_review=a.artifact_review);let[u]=await r.query.update("departments").set(l).where(V({id:{eq:o.id}},{app_id:{eq:s}})).returning("id","name","artifact_review","updated_at").run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);return Response.json({department:u})}),n.delete("/api/departments/:id",async(e,t)=>{let{orm:r,appId:s,params:o}=t;try{let{appRoleOf:l}=await Promise.resolve().then(()=>(dn(),cn));if(await l(t)!=="owner")throw new T("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u5220\u9664\u90E8\u95E8",403)}catch(l){return Response.json({error:l?.message??"\u6743\u9650\u6821\u9A8C\u5931\u8D25"},{status:Number(l?.status)??403})}let i=Z(r);try{let{manager:l}=await Promise.resolve().then(()=>(Se(),Te));l.init(r),await l.terminateByDepartment(o.id)}catch{}if((await i.departments.delete().where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run()).length===0)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);await i.agents.delete().where(V(L(i.agents.c.type,"department"),L(i.agents.c.department_id,o.id),L(i.agents.c.app_id,s))).run();try{let{resolveDepartmentWorkspace:l,getDefaultWorkspaceRoot:u}=await Promise.resolve().then(()=>(Ne(),De)),c=await l(o.id,null,!0);if(c&&Number(process.env.SANDBOX_WORKSPACE_RETENTION_DAYS??0)<=0){let{rm:p}=await import("node:fs/promises");await p(c,{recursive:!0,force:!0})}}catch{}return Response.json({success:!0})}),n.post("/api/departments/:id/members",async(e,t)=>{let{orm:r,appId:s,params:o,auth:i}=t,a=await e.json();if(!a.agent_id)throw new T("agent_id \u4E3A\u5FC5\u586B",400);let l=Z(r),[u]=await l.departments.select("id").where(V(L(l.departments.c.id,o.id),L(l.departments.c.app_id,s))).run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[c]=await l.agents.select("id").where(V(L(l.agents.c.id,a.agent_id),L(l.agents.c.app_id,s))).run();if(!c)throw new T("Agent \u4E0D\u5B58\u5728",404);let[d]=await r.query.from("department_members dm").select("dm.role").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).where(V({"dm.department_id":{eq:o.id}},{"ua.user_id":{eq:i.userId}})).limit(1).run(),p=r.table("_weifuwu_app_members",mc),[f]=await p.select("role").where(V(L(p.c.app_id,s),L(p.c.user_id,i.userId))).run();if((!d||d.role!=="admin")&&f?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u7BA1\u7406\u6210\u5458",403);await l.department_members.insert({department_id:o.id,agent_id:a.agent_id,role:a.role??"member"}).onConflict(["department_id","agent_id"],!0).run();try{let{refreshManagerPrompt:w}=await Promise.resolve().then(()=>(Ur(),Wr));await w(r,s,o.id)}catch{}return Response.json({success:!0})}),n.delete("/api/departments/:id/members/:agentId",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.departments.select("id").where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);await i.department_members.delete().where(V(L(i.department_members.c.department_id,o.id),L(i.department_members.c.agent_id,o.agentId))).run();try{let{refreshManagerPrompt:l}=await Promise.resolve().then(()=>(Ur(),Wr));await l(r,s,o.id)}catch{}return Response.json({success:!0})}),n.get("/api/departments/:id/artifacts/pending",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=Z(r),[a]=await i.departments.select("id").where(V(L(i.departments.c.id,o.id),L(i.departments.c.app_id,s))).run();if(!a)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let{sql:l}=t,{listPendingArtifacts:u}=await Promise.resolve().then(()=>(ta(),ea)),c=await u(l,o.id);return Response.json({pending:c})}),n.post("/api/departments/:id/artifacts/:action",async(e,t)=>{let{orm:r,appId:s,params:o,auth:i}=t,a=o.action;if(!["approve","reject"].includes(a))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let l=Z(r),[u]=await l.departments.select("id").where(V(L(l.departments.c.id,o.id),L(l.departments.c.app_id,s))).run();if(!u)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let[c]=await r.query.from("department_members dm").select("dm.role").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).where(V({"dm.department_id":{eq:o.id}},{"ua.user_id":{eq:i.userId}})).limit(1).run(),[d]=await r.table("_weifuwu_app_members",mc).select("role").where({app_id:{eq:s},user_id:{eq:i.userId}}).run();if((!c||c.role!=="admin")&&d?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279\u4EA7\u7269",403);let p=await e.json().catch(()=>({})),f=String(p.path??""),{sql:w}=t,{approveArtifact:m,rejectArtifact:g}=await Promise.resolve().then(()=>(ta(),ea)),h=a==="approve"?await m(w,o.id,f):await g(w,o.id,f);return h.ok?Response.json({success:!0,path:f}):Response.json({error:h.error},{status:400})})}nt();function Gw(n){n.post("/api/demo/space",async(e,t)=>{try{let{requireWriter:u,appRoleOf:c}=await Promise.resolve().then(()=>(dn(),cn));if(await u(t),await c(t)!=="owner")throw new Error("\u53EA\u6709\u79DF\u6237\u6240\u6709\u8005\u53EF\u4EE5\u521B\u5EFA\u6F14\u793A\u7A7A\u95F4")}catch(u){return Response.json({error:u?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(u?.status)??403})}let{orm:r,appId:s}=t,{dept:o,mgr:i,ai:a,kb:l}=await r.transaction(async u=>{let c=Z(u),[d]=await c.departments.insert({app_id:s,name:"\u6F14\u793A\u9879\u76EE"}).returning("id").run(),[p]=await c.agents.insert({app_id:s,type:"department",name:"\u6F14\u793A\u9879\u76EE\u7ECF\u7406",description:"\u90E8\u95E8\u7ECF\u7406\u2014\u2014\u4EE3\u8868\u300C\u6F14\u793A\u9879\u76EE\u300D\u5BF9\u5916\u534F\u4F5C",model:"deepseek-v4-flash",department_id:String(d.id),is_active:!0,tools:[],allow_file_tools:!0}).returning("id").run();await c.department_members.insert({department_id:String(d.id),agent_id:String(p.id),role:"manager"}).run();let[f]=await c.agents.insert({app_id:s,type:"ai",name:"\u5BA2\u670D\u5C0F\u77E5",description:"\u6F14\u793A\u5BA2\u670D\u52A9\u624B",system_prompt:"\u4F60\u662F\u300C\u6F14\u793A\u9879\u76EE\u300D\u7684\u5BA2\u670D\u52A9\u624B\uFF0C\u793C\u8C8C\u3001\u7B80\u6D01\u5730\u56DE\u5E94\u7528\u6237\u95EE\u9898\uFF1B\u4E0D\u786E\u5B9A\u65F6\u8BF4\u660E\u5E76\u5EFA\u8BAE\u8865\u5145\u8D44\u6599\u3002",model:"deepseek-chat",department_id:String(d.id),is_active:!0,tools:[]}).returning("id").run(),[w]=await c.agents.insert({app_id:s,type:"knowledge_base",name:"\u4EA7\u54C1\u77E5\u8BC6\u5E93",department_id:String(d.id),is_active:!0,tools:[]}).returning("id").run();return await c.department_members.insert([{department_id:String(d.id),agent_id:String(f.id),role:"member"},{department_id:String(d.id),agent_id:String(w.id),role:"member"}]).run(),{dept:d,mgr:p,ai:f,kb:w}});try{let{refreshManagerPrompt:u}=await Promise.resolve().then(()=>(Ur(),Wr));await u(t.orm,s,String(o.id))}catch{}return Response.json({success:!0,department:{id:o.id,name:"\u6F14\u793A\u9879\u76EE"},manager:i.id,agents:[a.id,l.id]},{status:201})})}re();function Qw(n){function e(r){let s=r.auth?.role;return s!=="owner"&&s!=="admin"?{ok:!1,error:"\u4EC5\u7BA1\u7406\u5458\u53EF\u7BA1\u7406\u6C99\u76D2",status:403}:{ok:!0}}async function t(r,s,o,i){try{let{writeAudit:a}=await Promise.resolve().then(()=>(st(),rt));await a(r,{action:s,target_type:"sandbox",target_id:o,detail:i??{}})}catch{}}n.get("/api/sandboxes",async(r,s)=>{let{sql:o,orm:i,appId:a}=s,l=new URL(r.url),u=l.searchParams.get("status")??void 0,c=l.searchParams.get("department_id")??void 0,{manager:d}=await Promise.resolve().then(()=>(Se(),Te));d.init(i);let p=await d.list(a,{status:u,department_id:c}),f=p.map(S=>S.department_id).filter(Boolean),w=new Map;if(f.length>0){let S=await i.query.from("departments").select("id","name").where({id:{in:f}}).run();for(let A of S??[])w.set(String(A.id),String(A.name??A.id))}let{sandbox:m}=await Promise.resolve().then(()=>(Le(),ze)),g=await m.listContainers(),h=new Map;for(let S of g)h.set(String(S.name??"").replace("ap-sandbox-",""),String(S.status??""));let b=p.map(S=>({...S,departmentName:S.department_id?w.get(S.department_id)??"\u672A\u77E5\u90E8\u95E8":null,containerStatus:h.get(S.id)??null,runningExec:m.runningExecs.get(String(S.id))??null})),[k]=await i.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:a}}).limit(1).run(),_=Number(k?.sandbox_quota??5),v=b.filter(S=>S.status!=="terminated").length;return Response.json({sandboxes:b,total:b.length,quota:{used:v,limit:_,pressure:_>0&&v/_>=.8}})}),n.post("/api/sandboxes",async(r,s)=>{let o=e(s);if(!o.ok)return Response.json({error:o.error},{status:o.status??403});let{sql:i,orm:a,appId:l}=s,u=await r.json().catch(()=>({})),c=u.name,d=null;if(u.department_id){let[f]=await a.query.from("departments").select("id","name","is_dm","workspace_path").where({id:{eq:u.department_id},app_id:{eq:l}}).limit(1).run();if(!f)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);c=c??String(f.name??"\u5DE5\u4F5C\u73AF\u5883");try{let{resolveDepartmentWorkspace:w}=await Promise.resolve().then(()=>(Ne(),De));d=await w(String(f.id),f.workspace_path,!0)}catch{d=null}}let{manager:p}=await Promise.resolve().then(()=>(Se(),Te));p.init(a);try{let f=await p.create({appId:l,departmentId:u.department_id??null,name:c??"\u5DE5\u4F5C\u73AF\u5883",workspace:d??void 0,image:u.image,network:u.network,memoryMb:u.memory_mb,mode:u.mode});return await t(s,"sandbox_create",String(f.id),{name:f.name,departmentId:f.department_id??void 0}),Response.json({sandbox:f},{status:201})}catch(f){let w=f?.message??"\u521B\u5EFA\u5931\u8D25",m=w.includes("\u914D\u989D");return Response.json({error:w},{status:m?409:400})}}),n.get("/api/sandboxes/events",async(r,s)=>{try{let{sandboxEvents:o}=await Promise.resolve().then(()=>(Ye(),Ln)),i=Number(new URL(r.url).searchParams.get("n")??100),a=new URL(r.url).searchParams.get("sandboxId")??void 0,l=new URL(r.url).searchParams.get("action")??void 0,u=o(Math.min(i,500),{sandboxId:a,action:l}),c=new URL(r.url).searchParams.get("departmentId")??void 0,d=c?u.filter(p=>p.payload?.departmentId===c):u;return Response.json({events:d,departmentId:c??null})}catch(o){return Response.json({error:o?.message??"\u4E8B\u4EF6\u6D41\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/api/sandboxes/:id",async(r,s)=>{let{sql:o,orm:i,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Te));u.init(i);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze)),p=await d.containerStats(`ap-sandbox-${c.id}`),w=(await d.listContainers()).find(m=>String(m.name)===`ap-sandbox-${c.id}`);return Response.json({sandbox:{...c,containerStatus:w?.status??null,stats:p??null}})}),n.patch("/api/sandboxes/:id",async(r,s)=>{let o=e(s);if(!o.ok)return Response.json({error:o.error},{status:o.status??403});let{sql:i,orm:a,appId:l,params:u}=s,c=await r.json().catch(()=>({})),{manager:d}=await Promise.resolve().then(()=>(Se(),Te));d.init(a);let p=await d.get(u.id,l);if(!p)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);return await d.updateConfig(String(p.id),l,{image:c.image,network:c.network,memoryMb:c.memory_mb,cpus:c.cpus}),await t(s,"sandbox_config_change",String(p.id),{...c}),Response.json({success:!0})}),n.post("/api/sandboxes/:id/:action",async(r,s)=>{let o=e(s);if(!o.ok)return Response.json({error:o.error},{status:o.status??403});let{sql:i,orm:a,appId:l,params:u}=s,c=u.action;if(!["start","stop","restart","terminate"].includes(c))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let{manager:d}=await Promise.resolve().then(()=>(Se(),Te));d.init(a);let p=u.id,f=await d.get(p,l);if(!f)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let w;return c==="terminate"?(await d.terminate(p,l),w={ok:!0}):c==="start"?w=await d.start(p,l):c==="stop"?w=await d.stop(p,l):w=await d.restart(p,l),w.ok?(await t(s,`sandbox_${c}`,p,{name:f.name}),Response.json({success:!0,status:c==="terminate"?"terminated":void 0})):Response.json({error:w.error},{status:400})}),n.get("/api/sandboxes/:id/debug",async(r,s)=>{let{sql:o,orm:i,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Te));u.init(i);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze)),p=d.runningExecs.get(String(c.id))??null,f=await u.eventHistory(String(c.id),30),{sandboxEvents:w}=await Promise.resolve().then(()=>(Ye(),Ln)),m=w(50,{sandboxId:String(c.id)}),g=await d.containerProcesses(`ap-sandbox-${c.id}`).catch(()=>[]);return Response.json({sandbox:{id:c.id,status:c.status,error:c.error,last_used_at:c.last_used_at},runningExec:p?{tool:p.tool,startedAt:new Date(p.startedAt).toISOString(),elapsedMs:Date.now()-p.startedAt,timeoutMs:p.timeoutMs}:null,events:f,liveEvents:m,processes:g.slice(0,20)})}),n.get("/api/sandboxes/:id/processes",async(r,s)=>{let{sql:o,orm:i,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Te));u.init(i);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze)),p=await d.containerProcesses(`ap-sandbox-${c.id}`);return Response.json({name:c.name,processes:p})}),n.get("/api/sandboxes/:id/stats",async(r,s)=>{let{sql:o,orm:i,appId:a,params:l}=s,{manager:u}=await Promise.resolve().then(()=>(Se(),Te));u.init(i);let c=await u.get(l.id,a);if(!c)throw new T("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),ze)),p=await d.containerStats(`ap-sandbox-${c.id}`);return Response.json({name:c.name,stats:p??null})})}function Jw(n){n.get("/api/events",async(e,t)=>{try{let{aiEvents:r}=await Promise.resolve().then(()=>(Hs(),Ic)),{sandboxEvents:s,clusterEvents:o}=await Promise.resolve().then(()=>(Ye(),Ln)),i=new URL(e.url),a=Number(i.searchParams.get("n")??200),l=i.searchParams.get("requestId")??void 0,u=i.searchParams.get("entity")??void 0,c=i.searchParams.get("action")??void 0,d=u==="sandbox"?[]:r(a,{action:c}),p=i.searchParams.get("hostId")??void 0,f=u==="ai"?[]:p?o(a,{hostId:p,action:c}):s(a,{action:c}),w=[...d.map(m=>({...m,_tier:"ai"})),...f.map(m=>({...m,_tier:"sandbox"}))];return l&&(w=w.filter(m=>m.payload?.requestId===l)),w.sort((m,g)=>m.ts-g.ts),Response.json({events:w.slice(-Math.min(a,500)),requestId:l??null})}catch(r){return Response.json({error:r?.message??"\u7EDF\u4E00\u4E8B\u4EF6\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/api/ai/events",async(e,t)=>{try{let{aiEvents:r}=await Promise.resolve().then(()=>(Hs(),Ic)),s=new URL(e.url),o=Number(s.searchParams.get("n")??100),i=s.searchParams.get("agentId")??void 0,a=s.searchParams.get("action")??void 0,l=s.searchParams.get("messageId")??void 0;return Response.json({events:r(Math.min(o,500),{agentId:i,action:a,messageId:l})})}catch(r){return Response.json({error:r?.message??"AI \u4E8B\u4EF6\u6D41\u67E5\u8BE2\u5931\u8D25"},{status:500})}})}re();Wn();re();nt();function Zw(n){n.get("/api/messages/pending-approvals",async(e,t)=>{let{orm:r,appId:s}=t,o=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).join("departments d",{"d.id":{col:"m.department_id"}}).select("m.id","m.department_id","m.content","m.ai_draft","m.created_at","a.name as agent_name","a.type as agent_type","d.name as department_name").where(V({"a.app_id":{eq:s}},{"m.ai_draft":{ne:null}},{"m.ai_approved":{isNull:!0}})).orderBy("m.created_at","desc").limit(50).run();return Response.json({pending:o})}),n.post("/api/messages/pending-approvals/bulk",async(e,t)=>{let{orm:r,appId:s,auth:o}=t,i=await e.json(),a=[...new Set((i.ids??[]).map(String))].slice(0,50);if(a.length===0)throw new T("ids \u4E3A\u5FC5\u586B\uFF08\u226450 \u6761\uFF09",400);let l=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id").where(V({"a.app_id":{eq:s}},{"m.ai_draft":{ne:null}},{"m.ai_approved":{isNull:!0}},{"m.id":{in:a}})).run(),u=new Map(l.map(g=>[String(g.id),g])),c=new Set((await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.department_id").where(V({"ua.user_id":{eq:o.userId}},{"ua.app_id":{eq:s}},{"dm.role":{eq:"admin"}})).run()).map(g=>String(g.department_id))),[d]=await r.query.from("_weifuwu_app_members").select("role").where(V({app_id:{eq:s}},{user_id:{eq:o.userId}})).run(),p=d?.role==="owner",f=0,w=[],m=[];for(let g of a){let h=u.get(g);if(!h){m.push({id:g,error:"\u4E0D\u5B58\u5728\u6216\u5DF2\u5BA1\u6279"});continue}if(!p&&!(h.department_id&&c.has(String(h.department_id)))){m.push({id:g,error:"\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279"});continue}let b=Z(t.orm);await b.messages.update({content:Q.colRef("ai_draft"),ai_approved:!0}).where(L(b.messages.c.id,g)).run(),f++}return Response.json({ok:!0,approved:f,failed:m})}),n.get("/api/departments/:id/messages",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=new URL(e.url),a=parseInt(i.searchParams.get("limit")??"50",10),l=i.searchParams.get("before"),u=i.searchParams.get("q")?.trim()??"",[c]=await r.query.from("departments d").select("d.id").where(V({"d.id":{eq:o.id}},{"d.app_id":{eq:s}})).run();if(!c)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let d=null;if(l){let[f]=await r.query.from("messages").select("created_at").where({id:{eq:l}}).run();d=f?String(f.created_at):new Date().toISOString()}let p=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}},{type:"left"}).join("messages r",{"r.id":{col:"m.reply_to"}},{type:"left"}).join("agents ra",{"ra.id":{col:"r.sender_id"}},{type:"left"}).select("m.id","m.department_id","m.sender_id","m.content","m.msg_type","m.ai_draft","m.ai_approved","m.created_at","m.reply_to","m.attachments","m.routed_to","m.ai_step","m.quick_replies","a.name as sender_name","a.type as sender_type","a.avatar_url as sender_avatar","r.content as reply_content","ra.name as reply_sender").where(V({"m.department_id":{eq:o.id}},d?{"m.created_at":{lt:d}}:{},u?{"m.content":{ilike:"%"+u+"%"}}:{})).orderBy("m.created_at","desc").limit(a).run();return Response.json({messages:p})}),n.post("/api/departments/:id/messages",async(e,t)=>{try{let{requireWriter:b}=await Promise.resolve().then(()=>(dn(),cn));await b(t)}catch(b){return Response.json({error:b?.message??"\u65E0\u6743\u64CD\u4F5C"},{status:Number(b?.status)??403})}let{orm:r,appId:s,auth:o,params:i}=t,a=Z(r),l=await Wt(e,a.messages,{variant:"insert",omit:["department_id","sender_id","ai_draft","ai_approved","ai_step","created_at","updated_at"]}),u=l.attachments??null;if(!l.content&&(!u||u.length===0))throw new T("content \u4E3A\u5FC5\u586B",400);let c=String(l.content??"").slice(0,5e3),d=String(l.request_id??""),p=Z(r),[f]=await p.agents.select("id","name").where(V(L(p.agents.c.app_id,s),L(p.agents.c.type,"user"),L(p.agents.c.user_id,o.userId))).run();if(!f){let[b]=await r.query.from("_weifuwu_users").select("name").where({id:{eq:o.userId}}).run();[f]=await p.agents.insert({app_id:s,type:"user",name:b?String(b.name??"\u7528\u6237"):"\u7528\u6237",user_id:String(o.userId),is_active:!0}).returning("id").run()}if((await r.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where(V({"d.app_id":{eq:s}},{"dm.department_id":{eq:i.id}},{"dm.agent_id":{eq:f.id}})).limit(1).run()).length===0)throw new T("\u4F60\u4E0D\u662F\u8BE5\u90E8\u95E8\u7684\u6210\u5458",403);let m=null;if(u&&u.length>0){let{validateUploadFile:b}=await Promise.resolve().then(()=>(Vi(),Fi)),k=await import("node:fs/promises"),_=await import("node:path"),[v]=await p.messages.insert({department_id:i.id,sender_id:String(f.id),content:c,msg_type:l.msg_type??"text",reply_to:l.reply_to??null}).returning("id").run(),S=_.join(process.cwd(),"data","uploads",s,i.id,String(v.id));await k.mkdir(S,{recursive:!0}),m=[];for(let A of u)try{let C=b(A);await k.writeFile(_.join(S,C.safeName),C.buffer),m.push({name:C.safeName,path:`uploads/${String(v.id)}/${C.safeName}`,size:C.size,ext:C.ext})}catch(C){return await k.rm(S,{recursive:!0,force:!0}).catch(()=>{}),Response.json({error:`\u9644\u4EF6\u300C${A?.name??""}\u300D\u65E0\u6548\uFF1A${C?.message??"\u672A\u77E5\u9519\u8BEF"}`},{status:400})}return await p.messages.update({attachments:m}).where(L(p.messages.c.id,v.id)).run(),v.content=c,v.msg_type=l.msg_type??"text",v.created_at=new Date().toISOString(),t.msg.broadcast(i.id,{type:"new_message",departmentId:i.id,message:{id:v.id,sender_id:v.sender_id,sender_name:f.name??"",content:v.content,attachments:m}}),zi(t,i.id,String(f.id),c,String(v.id),d).catch(A=>console.error("[messages] handleNewMessageStream error:",A)),Response.json({message:v},{status:201})}let[g]=await p.messages.insert({department_id:i.id,sender_id:String(f.id),content:c,msg_type:l.msg_type??"text",reply_to:l.reply_to??null}).returning("id","department_id","sender_id","content","msg_type","created_at").run();t.msg.broadcast(i.id,{type:"new_message",departmentId:i.id,message:{id:g.id,sender_id:g.sender_id,sender_name:f.name??"",content:g.content}});let h=process.env.DEEPSEEK_API_KEY;return h&&h!=="sk-your-deepseek-api-key"&&!h.startsWith("sk-your-")&&zi(t,i.id,String(f.id),c,g.id,d).catch(b=>console.error("[messages] handleNewMessageStream error:",b)),Response.json({message:g},{status:201})}),n.post("/api/departments/:id/messages/stream",async(e,t)=>{let{orm:r,appId:s,auth:o,params:i}=t,a=await e.json();if(!a.content)throw new T("content \u4E3A\u5FC5\u586B",400);let l=String(a.content).slice(0,5e3),u=Z(r),[c]=await u.agents.select("id","name").where(V(L(u.agents.c.app_id,s),L(u.agents.c.type,"user"),L(u.agents.c.user_id,o.userId))).run();if(!c){let[g]=await r.query.from("_weifuwu_users").select("name").where({id:{eq:o.userId}}).run();[c]=await u.agents.insert({app_id:s,type:"user",name:g?String(g.name??"\u7528\u6237"):"\u7528\u6237",user_id:String(o.userId),is_active:!0}).returning("id").run()}if((await r.query.from("department_members dm").join("departments d",{"d.id":{col:"dm.department_id"}}).select("dm.department_id").where(V({"d.app_id":{eq:s}},{"dm.department_id":{eq:i.id}},{"dm.agent_id":{eq:c.id}})).limit(1).run()).length===0)throw new T("\u4F60\u4E0D\u662F\u8BE5\u90E8\u95E8\u7684\u6210\u5458",403);let[p]=await u.messages.insert({department_id:i.id,sender_id:String(c.id),content:a.content,msg_type:"text"}).returning("id","department_id","sender_id","content","msg_type","created_at").run();t.msg.broadcast(i.id,{type:"new_message",departmentId:i.id,message:{id:p.id,sender_id:p.sender_id,sender_name:c.name??"",content:p.content}});let f=process.env.DEEPSEEK_API_KEY;if(!(f&&f!=="sk-your-deepseek-api-key"&&!f.startsWith("sk-your-")))return new Response(`event: error
487
487
  data: {"error":"DEEPSEEK_API_KEY \u672A\u914D\u7F6E"}
488
488
 
489
- `,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache"}});let f=new ReadableStream({async start(g){let w=new TextEncoder,y=k=>g.enqueue(w.encode(k));y(`event: meta
489
+ `,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache"}});let m=new ReadableStream({async start(g){let h=new TextEncoder,b=k=>g.enqueue(h.encode(k));b(`event: meta
490
490
  data: {"messageId":"${p.id}"}
491
491
 
492
- `),await Bc(t,o.id,a.content,"",y),g.close()}});return new Response(f,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}),n.put("/api/messages/:id",async(e,t)=>{let{orm:r,appId:s,auth:i,params:o}=t,a=await e.json();if(!a.content?.trim())throw new T("content \u4E0D\u80FD\u4E3A\u7A7A",400);let[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.sender_id","m.created_at","m.department_id","a.user_id as owner_user_id","a.app_id").where(F({"m.id":{eq:o.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);if(l.owner_user_id!==i.userId)throw new T("\u53EA\u80FD\u7F16\u8F91\u81EA\u5DF1\u7684\u6D88\u606F",403);let u=new Date(Date.now()-300*1e3);if(new Date(String(l.created_at))<u)throw new T("\u6D88\u606F\u5DF2\u8D85\u8FC7 5 \u5206\u949F\uFF0C\u65E0\u6CD5\u7F16\u8F91",400);let c=Z(r);return await c.messages.update({content:a.content.trim()}).where(L(c.messages.c.id,o.id)).run(),t.msg.broadcast(String(l.department_id),{type:"message_edited",messageId:o.id,content:a.content.trim()}),Response.json({success:!0})}),n.delete("/api/messages/:id",async(e,t)=>{let{orm:r,appId:s,auth:i,params:o}=t,[a]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.sender_id","m.created_at","a.user_id as owner_user_id","m.department_id").where(F({"m.id":{eq:o.id}},{"a.app_id":{eq:s}})).run();if(!a)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let l=a.owner_user_id===i.userId,u=i.role==="owner";if(!l&&!u)throw new T("\u53EA\u80FD\u64A4\u56DE\u81EA\u5DF1\u7684\u6D88\u606F",403);if(!u){let d=new Date(Date.now()-3e5);if(new Date(String(a.created_at))<d)throw new T("\u6D88\u606F\u5DF2\u8D85\u8FC7 5 \u5206\u949F\uFF0C\u65E0\u6CD5\u64A4\u56DE",400)}let c=Z(r);return await c.messages.delete().where(L(c.messages.c.id,o.id)).run(),t.msg.broadcast(String(a.department_id),{type:"message_deleted",messageId:o.id}),Response.json({success:!0})}),n.post("/api/messages/:id/feedback",async(e,t)=>{let{orm:r,appId:s,params:i}=t,o=await e.json(),a=o.feedback==="like"||o.feedback==="dislike"?o.feedback:o.feedback===null||o.feedback===""?null:void 0;if(a===void 0)throw new T("feedback \u5FC5\u987B\u662F like/dislike/null",400);let[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id").where(F({"m.id":{eq:i.id}},{"a.app_id":{eq:s}},{"a.type":{eq:"ai"}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let u=Z(r);return await u.messages.update({feedback:a}).where(L(u.messages.c.id,i.id)).run(),Response.json({success:!0,feedback:a})}),n.put("/api/messages/:id/draft",async(e,t)=>{let{orm:r,appId:s,params:i,auth:o}=t,a=await e.json(),l=String(a.draft??"").trim();if(!l)throw new T("\u8349\u7A3F\u4E0D\u80FD\u4E3A\u7A7A",400);let[u]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.ai_draft").where(F({"m.id":{eq:i.id}},{"a.app_id":{eq:s}},{"m.ai_approved":{isNull:!0}})).run();if(!u)throw new T("\u8349\u7A3F\u4E0D\u5B58\u5728\u6216\u5DF2\u5904\u7406",404);let[c]=await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where(F({"dm.department_id":{eq:u.department_id}},{"ua.user_id":{eq:o.userId}})).limit(1).run(),[d]=await r.query.from("_weifuwu_app_members").select("role").where(F({app_id:{eq:s}},{user_id:{eq:o.userId}})).run();if((!c||c.role!=="admin")&&d?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u7F16\u8F91\u8349\u7A3F",403);let p=Z(r);await p.messages.update({ai_draft:l}).where(L(p.messages.c.id,i.id)).run();try{let{writeAudit:m}=await Promise.resolve().then(()=>(st(),rt));await m(t,{action:"approval_draft_edit",target_type:"message",target_id:i.id,detail:{}})}catch{}return Response.json({success:!0})}),n.post("/api/messages/:id/approve",async(e,t)=>{let{orm:r,appId:s,params:i,auth:o}=t,a=await e.json(),[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.ai_draft","m.ai_approved","m.department_id").where(F({"m.id":{eq:i.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);if(l.ai_approved!==null)throw new T("\u8BE5\u6D88\u606F\u5DF2\u5BA1\u6279",400);let[u]=await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where(F({"dm.department_id":{eq:l.department_id}},{"ua.user_id":{eq:o.userId}})).limit(1).run();if(!u||u.role!=="admin")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279",403);let c=Z(r);return a.approved?await c.messages.update({content:G.colRef("ai_draft"),ai_approved:!0}).where(L(c.messages.c.id,i.id)).run():await c.messages.update({ai_approved:!1,ai_draft:null}).where(L(c.messages.c.id,i.id)).run(),Response.json({success:!0,approved:a.approved})}),n.post("/api/messages/:id/continue",async(e,t)=>{let{orm:r,appId:s,params:i}=t,[o]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.content").where(F({"m.id":{eq:i.id}},{"a.app_id":{eq:s}},{"a.type":{eq:"user"}})).run();if(!o)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let a=Z(r),[l]=await a.agent_run_states.select("steps","status").where(L(a.agent_run_states.c.message_id,i.id)).run(),u=Array.isArray(l?.steps)?l.steps:[],c=u.filter(m=>m?.result!==void 0).length,d=u.length>0?`
492
+ `),await Vc(t,i.id,a.content,"",b),g.close()}});return new Response(m,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}),n.put("/api/messages/:id",async(e,t)=>{let{orm:r,appId:s,auth:o,params:i}=t,a=await e.json();if(!a.content?.trim())throw new T("content \u4E0D\u80FD\u4E3A\u7A7A",400);let[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.sender_id","m.created_at","m.department_id","a.user_id as owner_user_id","a.app_id").where(V({"m.id":{eq:i.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);if(l.owner_user_id!==o.userId)throw new T("\u53EA\u80FD\u7F16\u8F91\u81EA\u5DF1\u7684\u6D88\u606F",403);let u=new Date(Date.now()-300*1e3);if(new Date(String(l.created_at))<u)throw new T("\u6D88\u606F\u5DF2\u8D85\u8FC7 5 \u5206\u949F\uFF0C\u65E0\u6CD5\u7F16\u8F91",400);let c=Z(r);return await c.messages.update({content:a.content.trim()}).where(L(c.messages.c.id,i.id)).run(),t.msg.broadcast(String(l.department_id),{type:"message_edited",messageId:i.id,content:a.content.trim()}),Response.json({success:!0})}),n.delete("/api/messages/:id",async(e,t)=>{let{orm:r,appId:s,auth:o,params:i}=t,[a]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.sender_id","m.created_at","a.user_id as owner_user_id","m.department_id").where(V({"m.id":{eq:i.id}},{"a.app_id":{eq:s}})).run();if(!a)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let l=a.owner_user_id===o.userId,u=o.role==="owner";if(!l&&!u)throw new T("\u53EA\u80FD\u64A4\u56DE\u81EA\u5DF1\u7684\u6D88\u606F",403);if(!u){let d=new Date(Date.now()-3e5);if(new Date(String(a.created_at))<d)throw new T("\u6D88\u606F\u5DF2\u8D85\u8FC7 5 \u5206\u949F\uFF0C\u65E0\u6CD5\u64A4\u56DE",400)}let c=Z(r);return await c.messages.delete().where(L(c.messages.c.id,i.id)).run(),t.msg.broadcast(String(a.department_id),{type:"message_deleted",messageId:i.id}),Response.json({success:!0})}),n.post("/api/messages/:id/feedback",async(e,t)=>{let{orm:r,appId:s,params:o}=t,i=await e.json(),a=i.feedback==="like"||i.feedback==="dislike"?i.feedback:i.feedback===null||i.feedback===""?null:void 0;if(a===void 0)throw new T("feedback \u5FC5\u987B\u662F like/dislike/null",400);let[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id").where(V({"m.id":{eq:o.id}},{"a.app_id":{eq:s}},{"a.type":{eq:"ai"}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let u=Z(r);return await u.messages.update({feedback:a}).where(L(u.messages.c.id,o.id)).run(),Response.json({success:!0,feedback:a})}),n.put("/api/messages/:id/draft",async(e,t)=>{let{orm:r,appId:s,params:o,auth:i}=t,a=await e.json(),l=String(a.draft??"").trim();if(!l)throw new T("\u8349\u7A3F\u4E0D\u80FD\u4E3A\u7A7A",400);let[u]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.ai_draft").where(V({"m.id":{eq:o.id}},{"a.app_id":{eq:s}},{"m.ai_approved":{isNull:!0}})).run();if(!u)throw new T("\u8349\u7A3F\u4E0D\u5B58\u5728\u6216\u5DF2\u5904\u7406",404);let[c]=await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where(V({"dm.department_id":{eq:u.department_id}},{"ua.user_id":{eq:i.userId}})).limit(1).run(),[d]=await r.query.from("_weifuwu_app_members").select("role").where(V({app_id:{eq:s}},{user_id:{eq:i.userId}})).run();if((!c||c.role!=="admin")&&d?.role!=="owner")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u7F16\u8F91\u8349\u7A3F",403);let p=Z(r);await p.messages.update({ai_draft:l}).where(L(p.messages.c.id,o.id)).run();try{let{writeAudit:f}=await Promise.resolve().then(()=>(st(),rt));await f(t,{action:"approval_draft_edit",target_type:"message",target_id:o.id,detail:{}})}catch{}return Response.json({success:!0})}),n.post("/api/messages/:id/approve",async(e,t)=>{let{orm:r,appId:s,params:o,auth:i}=t,a=await e.json(),[l]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.ai_draft","m.ai_approved","m.department_id").where(V({"m.id":{eq:o.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);if(l.ai_approved!==null)throw new T("\u8BE5\u6D88\u606F\u5DF2\u5BA1\u6279",400);let[u]=await r.query.from("department_members dm").join("agents ua",{"ua.id":{col:"dm.agent_id"}}).select("dm.role").where(V({"dm.department_id":{eq:l.department_id}},{"ua.user_id":{eq:i.userId}})).limit(1).run();if(!u||u.role!=="admin")throw new T("\u53EA\u6709\u90E8\u95E8\u7BA1\u7406\u5458\u53EF\u4EE5\u5BA1\u6279",403);let c=Z(r);return a.approved?await c.messages.update({content:Q.colRef("ai_draft"),ai_approved:!0}).where(L(c.messages.c.id,o.id)).run():await c.messages.update({ai_approved:!1,ai_draft:null}).where(L(c.messages.c.id,o.id)).run(),Response.json({success:!0,approved:a.approved})}),n.post("/api/messages/:id/continue",async(e,t)=>{let{orm:r,appId:s,params:o}=t,[i]=await r.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.content").where(V({"m.id":{eq:o.id}},{"a.app_id":{eq:s}},{"a.type":{eq:"user"}})).run();if(!i)throw new T("\u6D88\u606F\u4E0D\u5B58\u5728",404);let a=Z(r),[l]=await a.agent_run_states.select("steps","status").where(L(a.agent_run_states.c.message_id,o.id)).run(),u=Array.isArray(l?.steps)?l.steps:[],c=u.filter(f=>f?.result!==void 0).length,d=u.length>0?`
493
493
 
494
- \u3010\u65AD\u70B9\u7EED\u8DD1\u3011\u8FD9\u6761\u6D88\u606F\u4E0A\u6B21\u6267\u884C\u4E2D\u65AD\uFF08\u5DF2\u5B8C\u6210 ${c}/${u.length} \u6B65\u5DE5\u5177\u8C03\u7528\uFF09\u3002\u5DF2\u6267\u884C\u6B65\u9AA4\uFF1A${u.map(m=>`${m.tool}(${String(m.args??"").slice(0,60)})`).join(" \u2192 ")}\u3002\u8BF7\u4ECE\u4E2D\u65AD\u5904\u7EE7\u7EED\u5B8C\u6210\u7528\u6237\u8BF7\u6C42\uFF0C\u4E0D\u8981\u91CD\u590D\u6267\u884C\u5DF2\u5B8C\u6210\u6B65\u9AA4\u3002`:"",{handleNewMessageStream:p}=await Promise.resolve().then(()=>(Wn(),jr));return p(t,String(o.department_id),"system",String(o.content)+d,String(o.id),"").catch(m=>console.error("[messages] continue error:",m)),Response.json({success:!0,resumed:!0,doneSteps:c,totalSteps:u.length})})}re();re();nt();function Xw(n){n.get("/api/agents/:id/knowledge",async(e,t)=>{let{sql:r,appId:s,params:i}=t,o=Z(t.orm),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s),L(o.agents.c.type,"knowledge_base"))).run();if(!a)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let l=await o.kb_documents.select("id","filename","chunk_count","created_at").where(L(o.kb_documents.c.agent_id,i.id)).orderBy("created_at","desc").run();return Response.json({documents:l})}),n.get("/api/knowledge/:id",async(e,t)=>{let{sql:r,appId:s,params:i}=t,a=new URL(e.url).searchParams.get("chunks")==="true",[l]=await t.orm.query.from("kb_documents d").join("agents a",{"a.id":{col:"d.agent_id"}}).select("d.id","d.filename","d.content","d.chunk_count","d.created_at").where(F({"d.id":{eq:i.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);let u=[];if(a){let c=Z(t.orm);u=await c.kb_chunks.select("id","content","chunk_index","created_at").where(L(c.kb_chunks.c.document_id,i.id)).orderBy("chunk_index","asc").run()}return Response.json({document:l,chunks:u})}),n.post("/api/agents/:id/knowledge",async(e,t)=>{let{sql:r,appId:s,params:i,ai:o}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(F(L(a.agents.c.id,i.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.filename||!u.content)throw new T("filename \u548C content \u4E3A\u5FC5\u586B",400);u.content=String(u.content).slice(0,2e5),u.filename=String(u.filename).slice(0,200);let c=await ud(t,i.id,l,u.filename,u.content);return Response.json(c,{status:201})}),n.post("/api/agents/:id/knowledge/upload",async(e,t)=>{let{sql:r,appId:s,params:i,ai:o}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(F(L(a.agents.c.id,i.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u;try{u=await e.formData()}catch{throw new T("\u8BF7\u6C42\u683C\u5F0F\u9519\u8BEF\uFF0C\u9700\u8981 multipart/form-data",400)}let c=[],d=[];for(let[m,h]of u.entries()){if(!(h instanceof File))continue;let f=h,g=f.name.split(".").pop()?.toLowerCase();if(!g||!["txt","md","csv","json","text","markdown"].includes(g)){d.push({filename:f.name,error:`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B .${g}\uFF0C\u4EC5\u652F\u6301 .txt .md .csv .json`});continue}if(f.size>5*1024*1024){d.push({filename:f.name,error:"\u6587\u4EF6\u8D85\u8FC7 5MB \u5927\u5C0F\u9650\u5236"});continue}try{let y=await f.text();c.push({filename:f.name,content:y})}catch(y){d.push({filename:f.name,error:`\u8BFB\u53D6\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`})}}if(c.length===0&&d.length>0)return Response.json({error:"\u6240\u6709\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",details:d},{status:400});let p=[];for(let m of c)try{let h=await ud(t,i.id,l,m.filename,m.content);p.push(h)}catch(h){d.push({filename:m.filename,error:`\u5904\u7406\u5931\u8D25: ${h instanceof Error?h.message:String(h)}`})}return Response.json({success:p.length,errors:d.length>0?d:void 0,documents:p.map(m=>m.document)},{status:d.length>0?207:201})}),n.post("/api/agents/:id/knowledge/batch",async(e,t)=>{let{sql:r,appId:s,params:i,ai:o}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(F(L(a.agents.c.id,i.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.documents||!Array.isArray(u.documents)||u.documents.length===0)throw new T("documents \u4E3A\u5FC5\u586B\uFF0C\u9700\u5305\u542B filename \u548C content \u7684\u6570\u7EC4",400);if(u.documents.length>20)throw new T("\u5355\u6B21\u6700\u591A\u4E0A\u4F20 20 \u4E2A\u6587\u6863",400);let c=[],d=[];for(let p of u.documents){if(!p.filename||!p.content){d.push({filename:p.filename??"\u672A\u77E5",error:"\u7F3A\u5C11 filename \u6216 content"});continue}try{let m=await ud(t,i.id,l,p.filename,p.content);c.push(m)}catch(m){d.push({filename:p.filename,error:`\u5904\u7406\u5931\u8D25: ${m instanceof Error?m.message:String(m)}`})}}return Response.json({success:c.length,errors:d.length>0?d:void 0,documents:c.map(p=>p.document)},{status:d.length>0?207:201})}),n.delete("/api/knowledge/:id",async(e,t)=>{let{sql:r,appId:s,params:i}=t,o=Z(t.orm),[a]=await t.orm.query.from("kb_documents d").join("agents a",{"a.id":{col:"d.agent_id"}}).select("d.id").where(F({"d.id":{eq:i.id}},{"a.app_id":{eq:s}})).run();if(!a)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);if((await o.kb_documents.delete().where(L(o.kb_documents.c.id,i.id)).returning("id").run()).length===0)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);return Response.json({success:!0})}),n.post("/api/agents/:id/knowledge/reindex",async(e,t)=>{let{sql:r,appId:s,params:i}=t,o=Z(t.orm),[a]=await o.agents.select("id","chunk_size","chunk_overlap").where(F(L(o.agents.c.id,i.id),L(o.agents.c.app_id,s),L(o.agents.c.type,"knowledge_base"))).run();if(!a)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let l=await o.kb_documents.select("id","filename","content").where(L(o.kb_documents.c.agent_id,i.id)).run(),u=0;for(let c of l){let d=Yw(String(c.content),a.chunk_size??500,a.chunk_overlap??50),p;try{if(p=await t.ai.embedMany(d),p.length!==d.length||!Array.isArray(p[0]))throw new Error("embedMany \u8FD4\u56DE\u5F62\u6001\u5F02\u5E38");for(let h of p)if(Math.sqrt(h.reduce((g,w)=>g+w*w,0))>5)throw new Error("embedding \u5411\u91CF\u672A\u5F52\u4E00\u5316\uFF08\u7591\u4F3C\u968F\u673A\u56DE\u9000\uFF09\u2014\u2014\u62D2\u7EDD\u5199\u5165")}catch(h){throw new Error(`\u77E5\u8BC6\u5E93\u91CD\u65B0\u7D22\u5F15\u5931\u8D25\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF09\u2014\u2014\u672A\u5199\u5165\u4EFB\u4F55\u6570\u636E: ${h?.message??"unknown"}`)}await o.kb_chunks.delete().where(L(o.kb_chunks.c.document_id,c.id)).run();let[m]=await o.kb_documents.update({chunk_count:d.length}).where(L(o.kb_documents.c.id,c.id)).returning("id").run();for(let h=0;h<d.length;h++)await o.kb_chunks.insert({document_id:String(c.id),agent_id:i.id,content:d[h],chunk_index:h,embedding:`[${p[h].join(",")}]`}).run();u++}return Response.json({success:!0,reindexed:u,docs:l.length})}),n.post("/api/agents/:id/knowledge/search",async(e,t)=>{let{sql:r,appId:s,params:i,ai:o}=t,a=Z(t.orm),[l]=await a.agents.select("id").where(F(L(a.agents.c.id,i.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.query)throw new T("query \u4E3A\u5FC5\u586B",400);let c=u.top_k??5,d=await o.embed(u.query),p=await t.orm.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.id","kc.content","kc.chunk_index","kc.document_id","kd.filename").vectorScore("kc.embedding",d,"similarity").where({"kc.agent_id":{eq:i.id}}).limit(c).run();return Response.json({results:p})})}async function ud(n,e,t,r,s){let{sql:i,ai:o}=n,a=t.chunk_size??500,l=t.chunk_overlap??50,u=Yw(s,a,l),c;try{if(c=await o.embedMany(u),c.length!==u.length||!Array.isArray(c[0]))throw new Error("embedMany \u8FD4\u56DE\u5F62\u6001\u5F02\u5E38");for(let m of c)if(Math.sqrt(m.reduce((f,g)=>f+g*g,0))>5)throw new Error("embedding \u5411\u91CF\u672A\u5F52\u4E00\u5316\uFF08\u7591\u4F3C\u968F\u673A\u56DE\u9000\uFF09\u2014\u2014\u62D2\u7EDD\u5199\u5165")}catch(m){throw new Error(`\u6587\u6863\u5411\u91CF\u5316\u5931\u8D25\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF09\u2014\u2014\u672A\u4E0A\u4F20: ${m?.message??"unknown"}`)}let d=Z(n.orm),[p]=await d.kb_documents.insert({agent_id:e,filename:r,content:s,chunk_count:u.length}).returning("id","filename","chunk_count","created_at").run();return X0(n.orm,e,p,u,c)}async function X0(n,e,t,r,s){let i=Z(n);for(let o=0;o<r.length;o++)await i.kb_chunks.insert({document_id:String(t.id),agent_id:e,content:r[o],chunk_index:o,embedding:s.length>o?`[${s[o].join(",")}]`:"[]"}).run();return{document:t,chunk_count:r.length}}function Yw(n,e,t){if(n.length<=e)return[n];let r=[],s=0;for(;s<n.length;){let i=Math.min(s+e,n.length);r.push(n.slice(s,i)),s+=e-t}return r}re();function ry(n){n.post("/api/survey/setup",async(e,t)=>{try{let r=await e.json(),s=(r.personas??[]).slice(0,10);if(!r.url||s.length===0)throw new T("url \u548C personas \u4E3A\u5FC5\u586B",400);let{setupSurveyRoster:i}=await Promise.resolve().then(()=>(ny(),ty)),o=await i(t,{url:String(r.url),personas:s,total:s.length,concurrency:Number(r.concurrency??0)});return Response.json({success:!0,...o},{status:201})}catch(r){return Response.json({error:r?.message??"\u521B\u5EFA\u5931\u8D25"},{status:400})}}),n.get("/api/survey/campaigns",async(e,t)=>{try{let{orm:r,appId:s}=t,i=await r.query.from("survey_campaigns").select("id","status","total","completed","failed","url","retry","concurrency","created_at").where({app_id:{eq:s}}).orderBy("created_at","desc").limit(50).run();return Response.json({campaigns:i??[]})}catch(r){return Response.json({error:r?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:400})}}),n.post("/api/survey/campaigns",async(e,t)=>{try{let r=await e.json().catch(()=>({})),{createCampaign:s}=await Promise.resolve().then(()=>(_t(),Pt)),i=await s(t,r);return Response.json({success:!0,campaign:i.campaign,runs:i.runs.map(o=>({agentName:o.agent_name}))})}catch(r){return Response.json({error:r?.message??"\u521B\u5EFA\u5931\u8D25"},{status:400})}}),n.get("/api/survey/campaigns/:id",async(e,t)=>{try{let{getCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt)),s=await r(t,String(t.params.id));if(!s)throw new T("campaign \u4E0D\u5B58\u5728",404);let{campaign:i,runs:o}=s;return Response.json({campaign:i,progress:{completed:i.completed,failed:i.failed,total:i.total,active:o.filter(a=>a.status==="running").length,queued:o.filter(a=>a.status==="queued").length},failures:o.filter(a=>a.status==="failed").map(a=>({agentName:a.agent_name,error:a.error,attempts:a.attempts}))})}catch(r){return Response.json({error:r?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.post("/api/survey/campaigns/:id/retry",async(e,t)=>{try{let{retryCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt));return await r(t,String(t.params.id)),Response.json({success:!0})}catch(r){return Response.json({error:r?.message??"\u91CD\u8DD1\u5931\u8D25"},{status:400})}}),n.post("/api/survey/campaigns/:id/cancel",async(e,t)=>{try{let{cancelCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt));return await r(t,String(t.params.id)),Response.json({success:!0})}catch(r){return Response.json({error:r?.message??"\u53D6\u6D88\u5931\u8D25"},{status:400})}})}re();re();nt();function sy(n){n.get("/api/agents/:id/skills",async(e,t)=>{let{orm:r,params:s,appId:i}=t,o=Z(r),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,s.id),L(o.agents.c.app_id,i))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let l=await o.agent_skills.select("id","skill_name","skill_dir","enabled","created_at").where(L(o.agent_skills.c.agent_id,s.id)).orderBy("created_at","asc").run();return Response.json({skills:l})}),n.post("/api/agents/:id/skills",async(e,t)=>{let{orm:r,params:s,appId:i}=t,o=await e.json();if(!o.skill_name||!o.skill_dir)throw new T("skill_name \u548C skill_dir \u4E3A\u5FC5\u586B",400);let a=Z(r),[l]=await a.agents.select("id").where(F(L(a.agents.c.id,s.id),L(a.agents.c.app_id,i))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agent_skills.select("id").where(F(L(a.agent_skills.c.agent_id,s.id),L(a.agent_skills.c.skill_name,o.skill_name))).run();if(u)throw new T("\u8BE5\u6280\u80FD\u5DF2\u7ECF\u7ED1\u5B9A\u5230\u6B64 Agent",409);let[c]=await a.agent_skills.insert({agent_id:s.id,skill_name:o.skill_name,skill_dir:o.skill_dir}).returning("id","skill_name","skill_dir","enabled","created_at").run();return Response.json({skill:c},{status:201})}),n.put("/api/agents/:id/skills/:skillId",async(e,t)=>{let{orm:r,params:s,appId:i}=t,o=await e.json(),a=Z(r),[l]=await a.agents.select("id").where(F(L(a.agents.c.id,s.id),L(a.agents.c.app_id,i))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agent_skills.select("id").where(F(L(a.agent_skills.c.id,s.skillId),L(a.agent_skills.c.agent_id,s.id))).run();if(!u)throw new T("\u6280\u80FD\u7ED1\u5B9A\u4E0D\u5B58\u5728",404);let[c]=await a.agent_skills.update({enabled:o.enabled??!0}).where(L(a.agent_skills.c.id,s.skillId)).returning("id","skill_name","skill_dir","enabled","created_at").run();return Response.json({skill:c})}),n.delete("/api/agents/:id/skills/:skillId",async(e,t)=>{let{orm:r,params:s,appId:i}=t,o=Z(r),[a]=await o.agents.select("id").where(F(L(o.agents.c.id,s.id),L(o.agents.c.app_id,i))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);if((await o.agent_skills.delete().where(F(L(o.agent_skills.c.id,s.skillId),L(o.agent_skills.c.agent_id,s.id))).returning("id").run()).length===0)throw new T("\u6280\u80FD\u7ED1\u5B9A\u4E0D\u5B58\u5728",404);return Response.json({success:!0})})}Ki();re();function oy(n){let e=n.session;return!!e&&String(e.appId)===Ke&&(e.role==="owner"||e.role==="admin")}function iy(n){n.get("/api/plan",async(t,r)=>{let{getAppPlan:s,planStatusOf:i,PLANS:o}=await Promise.resolve().then(()=>(Fs(),Hs)),a=await s(r.orm,r.appId),[l]=await r.orm.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:r.appId},created_at:{gte:G.monthStart()}}).run();return Response.json(i(a,Number(l?.used??0)))});let e=async t=>{if(!oy(t))throw new T("\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650",403)};n.get("/api/admin/me",async(t,r)=>Response.json({isAdmin:oy(r)})),n.get("/api/admin/overview",async(t,r)=>{await e(r);let{sql:s,orm:i}=r,[o]=await i.query.from("_weifuwu_apps").count("*","apps").run(),[a]=await i.query.from("_weifuwu_apps").count("*","cnt").where({status:{eq:"active"}}).run(),[l]=await i.query.from("_weifuwu_apps").count("*","cnt").where({plan:{eq:"pro"}}).run(),[u]=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","total").count("*","ai_replies",{"a.type":{eq:"ai"},"m.ai_approved":{isNull:!1}}).where({"m.created_at":{gte:G.monthStart()}}).run(),[c]=await i.query.from("agent_logs").sum("tokens_total","total",{created_at:{gte:G.monthStart()}}).run(),d=2/1e6,p=8/1e6,[m]=await i.query.from("agent_logs").sum("tokens_prompt","prompt",{created_at:{gte:G.monthStart()}}).sum("tokens_completion","completion",{created_at:{gte:G.monthStart()}}).run(),h=Number((Number(m?.prompt??0)*d+Number(m?.completion??0)*p).toFixed(2)),[f]=await i.query.from("agent_logs l").count("DISTINCT l.app_id","cnt",{"l.created_at":{gte:G.nowAgo(7,"day")}}).run();return Response.json({totalApps:Number(o?.apps??0),activeApps:Number(a?.cnt??0),proApps:Number(l?.cnt??0),msgsMonth:Number(u?.total??0),aiRepliesMonth:Number(u?.ai_replies??0),tokensMonth:Number(c?.total??0),costYuanMonth:h,activeApps7d:Number(f?.cnt??0)})}),n.get("/api/admin/enterprises",async(t,r)=>{await e(r);let{orm:s}=r,i=await s.query.from("enterprises").select("id","name","created_at").orderBy("created_at","desc").run(),o=i.map(a=>String(a.id));if(o.length){let a=await s.query.from("_weifuwu_apps").select("enterprise_id").count("*","app_count",{enterprise_id:{in:o}}).groupBy("enterprise_id").run(),l=await s.query.from("agent_logs l").join("_weifuwu_apps a",{"a.id":{col:"l.app_id"}}).select("a.enterprise_id").sum("l.tokens_total","tokens_month",{"l.created_at":{gte:G.monthStart()}}).groupBy("a.enterprise_id").run(),u=new Map(a.map(d=>[String(d.enterprise_id),Number(d.app_count??0)])),c=new Map(l.map(d=>[String(d.enterprise_id),Number(d.tokens_month??0)]));for(let d of i)d.app_count=u.get(String(d.id))??0,d.tokens_month=c.get(String(d.id))??0}return Response.json({enterprises:i})}),n.post("/api/admin/enterprises",async(t,r)=>{await e(r);let s=await t.json();if(!s.name?.trim())throw new T("name \u5FC5\u586B",400);let i=null;if(s.ownerEmail){let[a]=await r.orm.query.from("_weifuwu_users").select("id").where({email:{eq:s.ownerEmail.trim().toLowerCase()}}).limit(1).run();i=a?String(a.id):null}let[o]=await r.orm.query.insert("enterprises").values({name:s.name.trim(),owner_user_id:i}).returning("id","name").run();return Response.json({enterprise:o})}),n.post("/api/admin/enterprises/:id/apps",async(t,r)=>{await e(r);let s=await t.json();if(!s.appId)throw new T("appId \u5FC5\u586B",400);return await r.orm.query.update("_weifuwu_apps").set({enterprise_id:r.params.id}).where({id:{eq:s.appId}}).run(),Response.json({ok:!0})}),n.get("/api/admin/enterprises/:id/usage",async(t,r)=>{await e(r);let{orm:s}=r,i=await s.query.from("_weifuwu_apps").select("id","slug","name","plan","status","created_at").where({enterprise_id:{eq:r.params.id}}).orderBy("created_at","asc").run(),o=i.map(l=>String(l.id));if(o.length){let l=await s.query.from("agent_logs").select("app_id").sum("tokens_total","tokens_month",{created_at:{gte:G.monthStart()}}).where({app_id:{in:o}}).groupBy("app_id").run(),u=await s.query.from("_weifuwu_app_members").select("app_id").count("*","member_count").where({app_id:{in:o}}).groupBy("app_id").run(),c=new Map(l.map(p=>[String(p.app_id),Number(p.tokens_month??0)])),d=new Map(u.map(p=>[String(p.app_id),Number(p.member_count??0)]));for(let p of i)p.tokens_month=c.get(String(p.id))??0,p.member_count=d.get(String(p.id))??0}let a=i.reduce((l,u)=>l+Number(u.tokens_month??0),0);return Response.json({apps:i,totalTokensMonth:a})}),n.get("/api/admin/apps",async(t,r)=>{await e(r);let{orm:s}=r,i=await s.query.from("_weifuwu_apps").select("id","slug","name","status","plan","trial_ends_at","monthly_token_limit","created_at").orderBy("created_at","desc").run(),o=i.map(a=>String(a.id));if(o.length){let a=await s.query.from("_weifuwu_app_members").select("app_id").count("*","member_count").where({app_id:{in:o}}).groupBy("app_id").run(),l=await s.query.from("agents").select("app_id").count("*","agent_count").where({app_id:{in:o}}).groupBy("app_id").run(),u=await s.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage").where({app_id:{in:o}}).groupBy("app_id").run(),c=await s.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage_month",{created_at:{gte:G.monthStart()}}).where({app_id:{in:o}}).groupBy("app_id").run(),d=new Map(a.map(f=>[String(f.app_id),Number(f.member_count??0)])),p=new Map(l.map(f=>[String(f.app_id),Number(f.agent_count??0)])),m=new Map(u.map(f=>[String(f.app_id),Number(f.token_usage??0)])),h=new Map(c.map(f=>[String(f.app_id),Number(f.token_usage_month??0)]));for(let f of i)f.member_count=d.get(String(f.id))??0,f.agent_count=p.get(String(f.id))??0,f.token_usage=m.get(String(f.id))??0,f.token_usage_month=h.get(String(f.id))??0}return Response.json({apps:i})}),n.post("/api/admin/apps/:id/plan",async(t,r)=>{await e(r);let s=await t.json(),i=r.params.id;s.plan==="pro"?await r.orm.query.update("_weifuwu_apps").set({plan:"pro",trial_ends_at:null,monthly_token_limit:s.monthlyTokenLimit??1e6}).where({id:{eq:i}}).run():s.plan==="free"?await r.orm.query.update("_weifuwu_apps").set({plan:"free",trial_ends_at:G.nowInterval(14,"day"),monthly_token_limit:s.monthlyTokenLimit??5e4}).where({id:{eq:i}}).run():await r.orm.query.update("_weifuwu_apps").set({monthly_token_limit:Number(s.monthlyTokenLimit??0)}).where({id:{eq:i}}).run();try{let{writeAudit:o}=await Promise.resolve().then(()=>(st(),rt));await o(r,{action:"admin_app_plan",target_type:"app",target_id:i,detail:{plan:s.plan??"quota",monthlyTokenLimit:s.monthlyTokenLimit}})}catch{}return Response.json({ok:!0})}),n.post("/api/admin/apps/:id/status",async(t,r)=>{await e(r);let i=(await t.json()).status==="disabled"?"disabled":"active",o=r.params.id;await r.orm.query.update("_weifuwu_apps").set({status:i}).where({id:{eq:o}}).run();try{let{writeAudit:a}=await Promise.resolve().then(()=>(st(),rt));await a(r,{action:"admin_app_status",target_type:"app",target_id:o,detail:{status:i}})}catch{}return Response.json({ok:!0,status:i})}),n.get("/api/admin/sandbox-capacity",async(t,r)=>{await e(r);let{sql:s,orm:i}=r,{hostCapacity:o,HOST_ID:a}=await Promise.resolve().then(()=>(an(),gc)),[l]=await i.query.from("sandboxes").sum("memory_mb","mb").count("*","running",{status:{ne:"terminated"}}).count("*","terminated",{status:{eq:"terminated"}}).run(),[u]=await i.query.from("sandbox_events").count("*","evicted").where({type:{like:"evict%"},created_at:{gte:new Date(Date.now()-7*864e5).toISOString()}}).run(),c=await i.query.from("sandbox_events e").join("sandboxes s",{"s.id":{col:"e.sandbox_id"}},{type:"left"}).select("e.sandbox_id","e.type","e.detail","e.created_at","s.name","s.app_id").where({"e.type":{like:"evict%"}}).orderBy("e.created_at","desc").limit(20).run();return Response.json({host:{...o(),id:a},occupied:{mb:Number(l?.mb??0),running:Number(l?.running??0),terminated:Number(l?.terminated??0)},weeklyEvictions:Number(u?.evicted??0),recentEvictions:c.map(d=>({sandboxId:String(d.sandbox_id),type:String(d.type),detail:String(d.detail??""),at:d.created_at,name:d.name??"",appId:d.app_id??null}))})})}nt();re();re();function ay(n){let e=s=>{let i=s.appId;return i||null};n.get("/api/stats",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);return Response.json(await t(i))});async function t(s){let{orm:i,appId:o}=s,a=Z(i),[l]=await a.agents.select().count("*","total").count("*","ai_count",{type:{eq:"ai"}}).count("*","webhook_count",{type:{eq:"webhook"}}).count("*","kb_count",{type:{eq:"knowledge_base"}}).count("*","user_count",{type:{eq:"user"}}).where({app_id:{eq:o}}).run(),[u]=await i.query.from("departments").count("*","total").where({app_id:{eq:o}}).run(),[c]=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","total").where({"a.app_id":{eq:o}}).run(),[d]=await i.query.from("agent_logs").sum("tokens_prompt","total_prompt").sum("tokens_completion","total_completion").sum("tokens_total","total_tokens").where({app_id:{eq:o}}).run(),p=await i.query.from("agent_logs").select("created_at","tokens_prompt","tokens_completion","tokens_total").where({app_id:{eq:o},created_at:{gte:G.nowAgo(14,"day")}}).run(),m=new Map;for(let P of p){let E=String(P.created_at).slice(0,10),x=m.get(E)??{prompt:0,completion:0,total:0};x.prompt+=Number(P.tokens_prompt??0),x.completion+=Number(P.tokens_completion??0),x.total+=Number(P.tokens_total??0),m.set(E,x)}let h=[...m.entries()].sort((P,E)=>P[0].localeCompare(E[0])).map(([P,E])=>({day:P,prompt:E.prompt,completion:E.completion,total:E.total})),f=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.created_at","m.sender_id").where({"a.app_id":{eq:o},"m.created_at":{gte:G.nowAgo(14,"day")}}).run(),g=new Map;for(let P of f){let E=String(P.created_at).slice(0,10),x=g.get(E)??{count:0,senders:new Set};x.count+=1,x.senders.add(String(P.sender_id??"")),g.set(E,x)}let w=[...g.entries()].sort((P,E)=>P[0].localeCompare(E[0])).map(([P,E])=>({day:P,count:E.count,active_agents:E.senders.size})),y=await i.query.from("agents a").join("messages m",{"m.sender_id":{col:"a.id"}}).select("a.id","a.name","a.type").count("m.id","message_count").max("m.created_at","last_active_at").where({"a.app_id":{eq:o},"m.created_at":{gte:G.nowAgo(7,"day")}}).groupBy("a.id","a.name","a.type").orderBy("message_count","desc").limit(8).run(),k=d,_=2/1e6,v=8/1e6,S=Number(((k?.total_prompt??0)*_+(k?.total_completion??0)*v).toFixed(2)),A=h.map(P=>({day:String(P.day).slice(5,10),total:Number(P.total??0),costYuan:Number((Number(P.prompt??0)*_+Number(P.completion??0)*v).toFixed(2))})),C=2,[j]=await a.agent_logs.select().count("*","runs").count("*","ok_runs",{success:{eq:!0}}).where({app_id:{eq:o}}).run(),[K]=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","likes",{"m.feedback":{eq:"like"}}).count("*","dislikes",{"m.feedback":{eq:"dislike"}}).where({"a.app_id":{eq:o},"m.feedback":{isNull:!1}}).run(),U=Number(j?.runs??0)>0?Math.round(Number(j?.ok_runs??0)/Number(j?.runs??0)*100):null,[H]=await i.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","cnt").where({"a.app_id":{eq:o},"a.type":{eq:"ai"},"m.ai_approved":{isNull:!1},"m.created_at":{gte:G.monthStart()}}).run(),V=Number(H?.cnt??0),Q=Math.max(0,V*C-S).toFixed(2);return{agents:l,departments:u,messages:c,tokens:d,estCostYuan:S,costTrend:A,trend:w,active_agents:y,roi:{aiRepliesMonth:V,costPerReply:C,estCostYuan:S,savedYuan:Number(Q)},quality:{toolSuccessRate:U,likes:Number(K?.likes??0),dislikes:Number(K?.dislikes??0)}}}n.get("/api/stats/report",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);let o=await t(i),[a]=await i.orm.query.from("_weifuwu_apps").select("name","plan","trial_ends_at").where({id:{eq:i.appId}}).limit(1).run(),[l]=await i.orm.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:i.appId},created_at:{gte:G.monthStart()}}).run(),u=String(a?.name??"\u672C\u5E94\u7528"),c=String(a?.plan??"free")==="pro"?"\u4E13\u4E1A\u7248":"\u514D\u8D39\u8BD5\u7528",d=o.roi??{aiRepliesMonth:0,costPerReply:2,estCostYuan:0,savedYuan:0},p=o.quality??{toolSuccessRate:null,likes:0,dislikes:0},m=o.messages?.total??0,h=o.agents?.ai_count??0,f=o.tokens??{total_tokens:0},g=o.costTrend??[],w=o.active_agents??[],y=Number(l?.used??0),k=g.map(v=>`${v.day}:\xA5${v.costYuan}`).join(" \u2192 "),_=`<!DOCTYPE html>
494
+ \u3010\u65AD\u70B9\u7EED\u8DD1\u3011\u8FD9\u6761\u6D88\u606F\u4E0A\u6B21\u6267\u884C\u4E2D\u65AD\uFF08\u5DF2\u5B8C\u6210 ${c}/${u.length} \u6B65\u5DE5\u5177\u8C03\u7528\uFF09\u3002\u5DF2\u6267\u884C\u6B65\u9AA4\uFF1A${u.map(f=>`${f.tool}(${String(f.args??"").slice(0,60)})`).join(" \u2192 ")}\u3002\u8BF7\u4ECE\u4E2D\u65AD\u5904\u7EE7\u7EED\u5B8C\u6210\u7528\u6237\u8BF7\u6C42\uFF0C\u4E0D\u8981\u91CD\u590D\u6267\u884C\u5DF2\u5B8C\u6210\u6B65\u9AA4\u3002`:"",{handleNewMessageStream:p}=await Promise.resolve().then(()=>(Wn(),Lr));return p(t,String(i.department_id),"system",String(i.content)+d,String(i.id),"").catch(f=>console.error("[messages] continue error:",f)),Response.json({success:!0,resumed:!0,doneSteps:c,totalSteps:u.length})})}re();re();nt();function Xw(n){n.get("/api/agents/:id/knowledge",async(e,t)=>{let{sql:r,appId:s,params:o}=t,i=Z(t.orm),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s),L(i.agents.c.type,"knowledge_base"))).run();if(!a)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let l=await i.kb_documents.select("id","filename","chunk_count","created_at").where(L(i.kb_documents.c.agent_id,o.id)).orderBy("created_at","desc").run();return Response.json({documents:l})}),n.get("/api/knowledge/:id",async(e,t)=>{let{sql:r,appId:s,params:o}=t,a=new URL(e.url).searchParams.get("chunks")==="true",[l]=await t.orm.query.from("kb_documents d").join("agents a",{"a.id":{col:"d.agent_id"}}).select("d.id","d.filename","d.content","d.chunk_count","d.created_at").where(V({"d.id":{eq:o.id}},{"a.app_id":{eq:s}})).run();if(!l)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);let u=[];if(a){let c=Z(t.orm);u=await c.kb_chunks.select("id","content","chunk_index","created_at").where(L(c.kb_chunks.c.document_id,o.id)).orderBy("chunk_index","asc").run()}return Response.json({document:l,chunks:u})}),n.post("/api/agents/:id/knowledge",async(e,t)=>{let{sql:r,appId:s,params:o,ai:i}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(V(L(a.agents.c.id,o.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.filename||!u.content)throw new T("filename \u548C content \u4E3A\u5FC5\u586B",400);u.content=String(u.content).slice(0,2e5),u.filename=String(u.filename).slice(0,200);let c=await pd(t,o.id,l,u.filename,u.content);return Response.json(c,{status:201})}),n.post("/api/agents/:id/knowledge/upload",async(e,t)=>{let{sql:r,appId:s,params:o,ai:i}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(V(L(a.agents.c.id,o.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u;try{u=await e.formData()}catch{throw new T("\u8BF7\u6C42\u683C\u5F0F\u9519\u8BEF\uFF0C\u9700\u8981 multipart/form-data",400)}let c=[],d=[];for(let[f,w]of u.entries()){if(!(w instanceof File))continue;let m=w,g=m.name.split(".").pop()?.toLowerCase();if(!g||!["txt","md","csv","json","text","markdown"].includes(g)){d.push({filename:m.name,error:`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B .${g}\uFF0C\u4EC5\u652F\u6301 .txt .md .csv .json`});continue}if(m.size>5*1024*1024){d.push({filename:m.name,error:"\u6587\u4EF6\u8D85\u8FC7 5MB \u5927\u5C0F\u9650\u5236"});continue}try{let b=await m.text();c.push({filename:m.name,content:b})}catch(b){d.push({filename:m.name,error:`\u8BFB\u53D6\u5931\u8D25: ${b instanceof Error?b.message:String(b)}`})}}if(c.length===0&&d.length>0)return Response.json({error:"\u6240\u6709\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25",details:d},{status:400});let p=[];for(let f of c)try{let w=await pd(t,o.id,l,f.filename,f.content);p.push(w)}catch(w){d.push({filename:f.filename,error:`\u5904\u7406\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`})}return Response.json({success:p.length,errors:d.length>0?d:void 0,documents:p.map(f=>f.document)},{status:d.length>0?207:201})}),n.post("/api/agents/:id/knowledge/batch",async(e,t)=>{let{sql:r,appId:s,params:o,ai:i}=t,a=Z(t.orm),[l]=await a.agents.select("id","chunk_size","chunk_overlap").where(V(L(a.agents.c.id,o.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.documents||!Array.isArray(u.documents)||u.documents.length===0)throw new T("documents \u4E3A\u5FC5\u586B\uFF0C\u9700\u5305\u542B filename \u548C content \u7684\u6570\u7EC4",400);if(u.documents.length>20)throw new T("\u5355\u6B21\u6700\u591A\u4E0A\u4F20 20 \u4E2A\u6587\u6863",400);let c=[],d=[];for(let p of u.documents){if(!p.filename||!p.content){d.push({filename:p.filename??"\u672A\u77E5",error:"\u7F3A\u5C11 filename \u6216 content"});continue}try{let f=await pd(t,o.id,l,p.filename,p.content);c.push(f)}catch(f){d.push({filename:p.filename,error:`\u5904\u7406\u5931\u8D25: ${f instanceof Error?f.message:String(f)}`})}}return Response.json({success:c.length,errors:d.length>0?d:void 0,documents:c.map(p=>p.document)},{status:d.length>0?207:201})}),n.delete("/api/knowledge/:id",async(e,t)=>{let{sql:r,appId:s,params:o}=t,i=Z(t.orm),[a]=await t.orm.query.from("kb_documents d").join("agents a",{"a.id":{col:"d.agent_id"}}).select("d.id").where(V({"d.id":{eq:o.id}},{"a.app_id":{eq:s}})).run();if(!a)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);if((await i.kb_documents.delete().where(L(i.kb_documents.c.id,o.id)).returning("id").run()).length===0)throw new T("\u6587\u6863\u4E0D\u5B58\u5728",404);return Response.json({success:!0})}),n.post("/api/agents/:id/knowledge/reindex",async(e,t)=>{let{sql:r,appId:s,params:o}=t,i=Z(t.orm),[a]=await i.agents.select("id","chunk_size","chunk_overlap").where(V(L(i.agents.c.id,o.id),L(i.agents.c.app_id,s),L(i.agents.c.type,"knowledge_base"))).run();if(!a)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let l=await i.kb_documents.select("id","filename","content").where(L(i.kb_documents.c.agent_id,o.id)).run(),u=0;for(let c of l){let d=Yw(String(c.content),a.chunk_size??500,a.chunk_overlap??50),p;try{if(p=await t.ai.embedMany(d),p.length!==d.length||!Array.isArray(p[0]))throw new Error("embedMany \u8FD4\u56DE\u5F62\u6001\u5F02\u5E38");for(let w of p)if(Math.sqrt(w.reduce((g,h)=>g+h*h,0))>5)throw new Error("embedding \u5411\u91CF\u672A\u5F52\u4E00\u5316\uFF08\u7591\u4F3C\u968F\u673A\u56DE\u9000\uFF09\u2014\u2014\u62D2\u7EDD\u5199\u5165")}catch(w){throw new Error(`\u77E5\u8BC6\u5E93\u91CD\u65B0\u7D22\u5F15\u5931\u8D25\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF09\u2014\u2014\u672A\u5199\u5165\u4EFB\u4F55\u6570\u636E: ${w?.message??"unknown"}`)}await i.kb_chunks.delete().where(L(i.kb_chunks.c.document_id,c.id)).run();let[f]=await i.kb_documents.update({chunk_count:d.length}).where(L(i.kb_documents.c.id,c.id)).returning("id").run();for(let w=0;w<d.length;w++)await i.kb_chunks.insert({document_id:String(c.id),agent_id:o.id,content:d[w],chunk_index:w,embedding:`[${p[w].join(",")}]`}).run();u++}return Response.json({success:!0,reindexed:u,docs:l.length})}),n.post("/api/agents/:id/knowledge/search",async(e,t)=>{let{sql:r,appId:s,params:o,ai:i}=t,a=Z(t.orm),[l]=await a.agents.select("id").where(V(L(a.agents.c.id,o.id),L(a.agents.c.app_id,s),L(a.agents.c.type,"knowledge_base"))).run();if(!l)throw new T("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.query)throw new T("query \u4E3A\u5FC5\u586B",400);let c=u.top_k??5,d=await i.embed(u.query),p=await t.orm.query.from("kb_chunks kc").join("kb_documents kd",{"kd.id":{col:"kc.document_id"}}).select("kc.id","kc.content","kc.chunk_index","kc.document_id","kd.filename").vectorScore("kc.embedding",d,"similarity").where({"kc.agent_id":{eq:o.id}}).limit(c).run();return Response.json({results:p})})}async function pd(n,e,t,r,s){let{sql:o,ai:i}=n,a=t.chunk_size??500,l=t.chunk_overlap??50,u=Yw(s,a,l),c;try{if(c=await i.embedMany(u),c.length!==u.length||!Array.isArray(c[0]))throw new Error("embedMany \u8FD4\u56DE\u5F62\u6001\u5F02\u5E38");for(let f of c)if(Math.sqrt(f.reduce((m,g)=>m+g*g,0))>5)throw new Error("embedding \u5411\u91CF\u672A\u5F52\u4E00\u5316\uFF08\u7591\u4F3C\u968F\u673A\u56DE\u9000\uFF09\u2014\u2014\u62D2\u7EDD\u5199\u5165")}catch(f){throw new Error(`\u6587\u6863\u5411\u91CF\u5316\u5931\u8D25\uFF08Embedding \u670D\u52A1\u5F02\u5E38\uFF09\u2014\u2014\u672A\u4E0A\u4F20: ${f?.message??"unknown"}`)}let d=Z(n.orm),[p]=await d.kb_documents.insert({agent_id:e,filename:r,content:s,chunk_count:u.length}).returning("id","filename","chunk_count","created_at").run();return X0(n.orm,e,p,u,c)}async function X0(n,e,t,r,s){let o=Z(n);for(let i=0;i<r.length;i++)await o.kb_chunks.insert({document_id:String(t.id),agent_id:e,content:r[i],chunk_index:i,embedding:s.length>i?`[${s[i].join(",")}]`:"[]"}).run();return{document:t,chunk_count:r.length}}function Yw(n,e,t){if(n.length<=e)return[n];let r=[],s=0;for(;s<n.length;){let o=Math.min(s+e,n.length);r.push(n.slice(s,o)),s+=e-t}return r}re();function ry(n){n.post("/api/survey/setup",async(e,t)=>{try{let r=await e.json(),s=(r.personas??[]).slice(0,10);if(!r.url||s.length===0)throw new T("url \u548C personas \u4E3A\u5FC5\u586B",400);let{setupSurveyRoster:o}=await Promise.resolve().then(()=>(ny(),ty)),i=await o(t,{url:String(r.url),personas:s,total:s.length,concurrency:Number(r.concurrency??0)});return Response.json({success:!0,...i},{status:201})}catch(r){return Response.json({error:r?.message??"\u521B\u5EFA\u5931\u8D25"},{status:400})}}),n.get("/api/survey/campaigns",async(e,t)=>{try{let{orm:r,appId:s}=t,o=await r.query.from("survey_campaigns").select("id","status","total","completed","failed","url","retry","concurrency","created_at").where({app_id:{eq:s}}).orderBy("created_at","desc").limit(50).run();return Response.json({campaigns:o??[]})}catch(r){return Response.json({error:r?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:400})}}),n.post("/api/survey/campaigns",async(e,t)=>{try{let r=await e.json().catch(()=>({})),{createCampaign:s}=await Promise.resolve().then(()=>(_t(),Pt)),o=await s(t,r);return Response.json({success:!0,campaign:o.campaign,runs:o.runs.map(i=>({agentName:i.agent_name}))})}catch(r){return Response.json({error:r?.message??"\u521B\u5EFA\u5931\u8D25"},{status:400})}}),n.get("/api/survey/campaigns/:id",async(e,t)=>{try{let{getCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt)),s=await r(t,String(t.params.id));if(!s)throw new T("campaign \u4E0D\u5B58\u5728",404);let{campaign:o,runs:i}=s;return Response.json({campaign:o,progress:{completed:o.completed,failed:o.failed,total:o.total,active:i.filter(a=>a.status==="running").length,queued:i.filter(a=>a.status==="queued").length},failures:i.filter(a=>a.status==="failed").map(a=>({agentName:a.agent_name,error:a.error,attempts:a.attempts}))})}catch(r){return Response.json({error:r?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.post("/api/survey/campaigns/:id/retry",async(e,t)=>{try{let{retryCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt));return await r(t,String(t.params.id)),Response.json({success:!0})}catch(r){return Response.json({error:r?.message??"\u91CD\u8DD1\u5931\u8D25"},{status:400})}}),n.post("/api/survey/campaigns/:id/cancel",async(e,t)=>{try{let{cancelCampaign:r}=await Promise.resolve().then(()=>(_t(),Pt));return await r(t,String(t.params.id)),Response.json({success:!0})}catch(r){return Response.json({error:r?.message??"\u53D6\u6D88\u5931\u8D25"},{status:400})}})}re();re();nt();function sy(n){n.get("/api/agents/:id/skills",async(e,t)=>{let{orm:r,params:s,appId:o}=t,i=Z(r),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,s.id),L(i.agents.c.app_id,o))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);let l=await i.agent_skills.select("id","skill_name","skill_dir","enabled","created_at").where(L(i.agent_skills.c.agent_id,s.id)).orderBy("created_at","asc").run();return Response.json({skills:l})}),n.post("/api/agents/:id/skills",async(e,t)=>{let{orm:r,params:s,appId:o}=t,i=await e.json();if(!i.skill_name||!i.skill_dir)throw new T("skill_name \u548C skill_dir \u4E3A\u5FC5\u586B",400);let a=Z(r),[l]=await a.agents.select("id").where(V(L(a.agents.c.id,s.id),L(a.agents.c.app_id,o))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agent_skills.select("id").where(V(L(a.agent_skills.c.agent_id,s.id),L(a.agent_skills.c.skill_name,i.skill_name))).run();if(u)throw new T("\u8BE5\u6280\u80FD\u5DF2\u7ECF\u7ED1\u5B9A\u5230\u6B64 Agent",409);let[c]=await a.agent_skills.insert({agent_id:s.id,skill_name:i.skill_name,skill_dir:i.skill_dir}).returning("id","skill_name","skill_dir","enabled","created_at").run();return Response.json({skill:c},{status:201})}),n.put("/api/agents/:id/skills/:skillId",async(e,t)=>{let{orm:r,params:s,appId:o}=t,i=await e.json(),a=Z(r),[l]=await a.agents.select("id").where(V(L(a.agents.c.id,s.id),L(a.agents.c.app_id,o))).run();if(!l)throw new T("Agent \u4E0D\u5B58\u5728",404);let[u]=await a.agent_skills.select("id").where(V(L(a.agent_skills.c.id,s.skillId),L(a.agent_skills.c.agent_id,s.id))).run();if(!u)throw new T("\u6280\u80FD\u7ED1\u5B9A\u4E0D\u5B58\u5728",404);let[c]=await a.agent_skills.update({enabled:i.enabled??!0}).where(L(a.agent_skills.c.id,s.skillId)).returning("id","skill_name","skill_dir","enabled","created_at").run();return Response.json({skill:c})}),n.delete("/api/agents/:id/skills/:skillId",async(e,t)=>{let{orm:r,params:s,appId:o}=t,i=Z(r),[a]=await i.agents.select("id").where(V(L(i.agents.c.id,s.id),L(i.agents.c.app_id,o))).run();if(!a)throw new T("Agent \u4E0D\u5B58\u5728",404);if((await i.agent_skills.delete().where(V(L(i.agent_skills.c.id,s.skillId),L(i.agent_skills.c.agent_id,s.id))).returning("id").run()).length===0)throw new T("\u6280\u80FD\u7ED1\u5B9A\u4E0D\u5B58\u5728",404);return Response.json({success:!0})})}Qi();re();function oy(n){let e=n.session;return!!e&&String(e.appId)===Be&&(e.role==="owner"||e.role==="admin")}function iy(n){n.get("/api/plan",async(t,r)=>{let{getAppPlan:s,planStatusOf:o,PLANS:i}=await Promise.resolve().then(()=>(Ks(),zs)),a=await s(r.orm,r.appId),[l]=await r.orm.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:r.appId},created_at:{gte:Q.monthStart()}}).run();return Response.json(o(a,Number(l?.used??0)))});let e=async t=>{if(!oy(t))throw new T("\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650",403)};n.get("/api/admin/me",async(t,r)=>Response.json({isAdmin:oy(r)})),n.get("/api/admin/overview",async(t,r)=>{await e(r);let{sql:s,orm:o}=r,[i]=await o.query.from("_weifuwu_apps").count("*","apps").run(),[a]=await o.query.from("_weifuwu_apps").count("*","cnt").where({status:{eq:"active"}}).run(),[l]=await o.query.from("_weifuwu_apps").count("*","cnt").where({plan:{eq:"pro"}}).run(),[u]=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","total").count("*","ai_replies",{"a.type":{eq:"ai"},"m.ai_approved":{isNull:!1}}).where({"m.created_at":{gte:Q.monthStart()}}).run(),[c]=await o.query.from("agent_logs").sum("tokens_total","total",{created_at:{gte:Q.monthStart()}}).run(),d=2/1e6,p=8/1e6,[f]=await o.query.from("agent_logs").sum("tokens_prompt","prompt",{created_at:{gte:Q.monthStart()}}).sum("tokens_completion","completion",{created_at:{gte:Q.monthStart()}}).run(),w=Number((Number(f?.prompt??0)*d+Number(f?.completion??0)*p).toFixed(2)),[m]=await o.query.from("agent_logs l").count("DISTINCT l.app_id","cnt",{"l.created_at":{gte:Q.nowAgo(7,"day")}}).run();return Response.json({totalApps:Number(i?.apps??0),activeApps:Number(a?.cnt??0),proApps:Number(l?.cnt??0),msgsMonth:Number(u?.total??0),aiRepliesMonth:Number(u?.ai_replies??0),tokensMonth:Number(c?.total??0),costYuanMonth:w,activeApps7d:Number(m?.cnt??0)})}),n.get("/api/admin/enterprises",async(t,r)=>{await e(r);let{orm:s}=r,o=await s.query.from("enterprises").select("id","name","created_at").orderBy("created_at","desc").run(),i=o.map(a=>String(a.id));if(i.length){let a=await s.query.from("_weifuwu_apps").select("enterprise_id").count("*","app_count",{enterprise_id:{in:i}}).groupBy("enterprise_id").run(),l=await s.query.from("agent_logs l").join("_weifuwu_apps a",{"a.id":{col:"l.app_id"}}).select("a.enterprise_id").sum("l.tokens_total","tokens_month",{"l.created_at":{gte:Q.monthStart()}}).groupBy("a.enterprise_id").run(),u=new Map(a.map(d=>[String(d.enterprise_id),Number(d.app_count??0)])),c=new Map(l.map(d=>[String(d.enterprise_id),Number(d.tokens_month??0)]));for(let d of o)d.app_count=u.get(String(d.id))??0,d.tokens_month=c.get(String(d.id))??0}return Response.json({enterprises:o})}),n.post("/api/admin/enterprises",async(t,r)=>{await e(r);let s=await t.json();if(!s.name?.trim())throw new T("name \u5FC5\u586B",400);let o=null;if(s.ownerEmail){let[a]=await r.orm.query.from("_weifuwu_users").select("id").where({email:{eq:s.ownerEmail.trim().toLowerCase()}}).limit(1).run();o=a?String(a.id):null}let[i]=await r.orm.query.insert("enterprises").values({name:s.name.trim(),owner_user_id:o}).returning("id","name").run();return Response.json({enterprise:i})}),n.post("/api/admin/enterprises/:id/apps",async(t,r)=>{await e(r);let s=await t.json();if(!s.appId)throw new T("appId \u5FC5\u586B",400);return await r.orm.query.update("_weifuwu_apps").set({enterprise_id:r.params.id}).where({id:{eq:s.appId}}).run(),Response.json({ok:!0})}),n.get("/api/admin/enterprises/:id/usage",async(t,r)=>{await e(r);let{orm:s}=r,o=await s.query.from("_weifuwu_apps").select("id","slug","name","plan","status","created_at").where({enterprise_id:{eq:r.params.id}}).orderBy("created_at","asc").run(),i=o.map(l=>String(l.id));if(i.length){let l=await s.query.from("agent_logs").select("app_id").sum("tokens_total","tokens_month",{created_at:{gte:Q.monthStart()}}).where({app_id:{in:i}}).groupBy("app_id").run(),u=await s.query.from("_weifuwu_app_members").select("app_id").count("*","member_count").where({app_id:{in:i}}).groupBy("app_id").run(),c=new Map(l.map(p=>[String(p.app_id),Number(p.tokens_month??0)])),d=new Map(u.map(p=>[String(p.app_id),Number(p.member_count??0)]));for(let p of o)p.tokens_month=c.get(String(p.id))??0,p.member_count=d.get(String(p.id))??0}let a=o.reduce((l,u)=>l+Number(u.tokens_month??0),0);return Response.json({apps:o,totalTokensMonth:a})}),n.get("/api/admin/apps",async(t,r)=>{await e(r);let{orm:s}=r,o=await s.query.from("_weifuwu_apps").select("id","slug","name","status","plan","trial_ends_at","monthly_token_limit","created_at").orderBy("created_at","desc").run(),i=o.map(a=>String(a.id));if(i.length){let a=await s.query.from("_weifuwu_app_members").select("app_id").count("*","member_count").where({app_id:{in:i}}).groupBy("app_id").run(),l=await s.query.from("agents").select("app_id").count("*","agent_count").where({app_id:{in:i}}).groupBy("app_id").run(),u=await s.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage").where({app_id:{in:i}}).groupBy("app_id").run(),c=await s.query.from("agent_logs").select("app_id").sum("tokens_total","token_usage_month",{created_at:{gte:Q.monthStart()}}).where({app_id:{in:i}}).groupBy("app_id").run(),d=new Map(a.map(m=>[String(m.app_id),Number(m.member_count??0)])),p=new Map(l.map(m=>[String(m.app_id),Number(m.agent_count??0)])),f=new Map(u.map(m=>[String(m.app_id),Number(m.token_usage??0)])),w=new Map(c.map(m=>[String(m.app_id),Number(m.token_usage_month??0)]));for(let m of o)m.member_count=d.get(String(m.id))??0,m.agent_count=p.get(String(m.id))??0,m.token_usage=f.get(String(m.id))??0,m.token_usage_month=w.get(String(m.id))??0}return Response.json({apps:o})}),n.post("/api/admin/apps/:id/plan",async(t,r)=>{await e(r);let s=await t.json(),o=r.params.id;s.plan==="pro"?await r.orm.query.update("_weifuwu_apps").set({plan:"pro",trial_ends_at:null,monthly_token_limit:s.monthlyTokenLimit??1e6}).where({id:{eq:o}}).run():s.plan==="free"?await r.orm.query.update("_weifuwu_apps").set({plan:"free",trial_ends_at:Q.nowInterval(14,"day"),monthly_token_limit:s.monthlyTokenLimit??5e4}).where({id:{eq:o}}).run():await r.orm.query.update("_weifuwu_apps").set({monthly_token_limit:Number(s.monthlyTokenLimit??0)}).where({id:{eq:o}}).run();try{let{writeAudit:i}=await Promise.resolve().then(()=>(st(),rt));await i(r,{action:"admin_app_plan",target_type:"app",target_id:o,detail:{plan:s.plan??"quota",monthlyTokenLimit:s.monthlyTokenLimit}})}catch{}return Response.json({ok:!0})}),n.post("/api/admin/apps/:id/status",async(t,r)=>{await e(r);let o=(await t.json()).status==="disabled"?"disabled":"active",i=r.params.id;await r.orm.query.update("_weifuwu_apps").set({status:o}).where({id:{eq:i}}).run();try{let{writeAudit:a}=await Promise.resolve().then(()=>(st(),rt));await a(r,{action:"admin_app_status",target_type:"app",target_id:i,detail:{status:o}})}catch{}return Response.json({ok:!0,status:o})}),n.get("/api/admin/sandbox-capacity",async(t,r)=>{await e(r);let{sql:s,orm:o}=r,{hostCapacity:i,HOST_ID:a}=await Promise.resolve().then(()=>(an(),yc)),[l]=await o.query.from("sandboxes").sum("memory_mb","mb").count("*","running",{status:{ne:"terminated"}}).count("*","terminated",{status:{eq:"terminated"}}).run(),[u]=await o.query.from("sandbox_events").count("*","evicted").where({type:{like:"evict%"},created_at:{gte:new Date(Date.now()-7*864e5).toISOString()}}).run(),c=await o.query.from("sandbox_events e").join("sandboxes s",{"s.id":{col:"e.sandbox_id"}},{type:"left"}).select("e.sandbox_id","e.type","e.detail","e.created_at","s.name","s.app_id").where({"e.type":{like:"evict%"}}).orderBy("e.created_at","desc").limit(20).run();return Response.json({host:{...i(),id:a},occupied:{mb:Number(l?.mb??0),running:Number(l?.running??0),terminated:Number(l?.terminated??0)},weeklyEvictions:Number(u?.evicted??0),recentEvictions:c.map(d=>({sandboxId:String(d.sandbox_id),type:String(d.type),detail:String(d.detail??""),at:d.created_at,name:d.name??"",appId:d.app_id??null}))})})}nt();re();re();function ay(n){let e=s=>{let o=s.appId;return o||null};n.get("/api/stats",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);return Response.json(await t(o))});async function t(s){let{orm:o,appId:i}=s,a=Z(o),[l]=await a.agents.select().count("*","total").count("*","ai_count",{type:{eq:"ai"}}).count("*","webhook_count",{type:{eq:"webhook"}}).count("*","kb_count",{type:{eq:"knowledge_base"}}).count("*","user_count",{type:{eq:"user"}}).where({app_id:{eq:i}}).run(),[u]=await o.query.from("departments").count("*","total").where({app_id:{eq:i}}).run(),[c]=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","total").where({"a.app_id":{eq:i}}).run(),[d]=await o.query.from("agent_logs").sum("tokens_prompt","total_prompt").sum("tokens_completion","total_completion").sum("tokens_total","total_tokens").where({app_id:{eq:i}}).run(),p=await o.query.from("agent_logs").select("created_at","tokens_prompt","tokens_completion","tokens_total").where({app_id:{eq:i},created_at:{gte:Q.nowAgo(14,"day")}}).run(),f=new Map;for(let O of p){let E=String(O.created_at).slice(0,10),x=f.get(E)??{prompt:0,completion:0,total:0};x.prompt+=Number(O.tokens_prompt??0),x.completion+=Number(O.tokens_completion??0),x.total+=Number(O.tokens_total??0),f.set(E,x)}let w=[...f.entries()].sort((O,E)=>O[0].localeCompare(E[0])).map(([O,E])=>({day:O,prompt:E.prompt,completion:E.completion,total:E.total})),m=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.created_at","m.sender_id").where({"a.app_id":{eq:i},"m.created_at":{gte:Q.nowAgo(14,"day")}}).run(),g=new Map;for(let O of m){let E=String(O.created_at).slice(0,10),x=g.get(E)??{count:0,senders:new Set};x.count+=1,x.senders.add(String(O.sender_id??"")),g.set(E,x)}let h=[...g.entries()].sort((O,E)=>O[0].localeCompare(E[0])).map(([O,E])=>({day:O,count:E.count,active_agents:E.senders.size})),b=await o.query.from("agents a").join("messages m",{"m.sender_id":{col:"a.id"}}).select("a.id","a.name","a.type").count("m.id","message_count").max("m.created_at","last_active_at").where({"a.app_id":{eq:i},"m.created_at":{gte:Q.nowAgo(7,"day")}}).groupBy("a.id","a.name","a.type").orderBy("message_count","desc").limit(8).run(),k=d,_=2/1e6,v=8/1e6,S=Number(((k?.total_prompt??0)*_+(k?.total_completion??0)*v).toFixed(2)),A=w.map(O=>({day:String(O.day).slice(5,10),total:Number(O.total??0),costYuan:Number((Number(O.prompt??0)*_+Number(O.completion??0)*v).toFixed(2))})),C=2,[W]=await a.agent_logs.select().count("*","runs").count("*","ok_runs",{success:{eq:!0}}).where({app_id:{eq:i}}).run(),[G]=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","likes",{"m.feedback":{eq:"like"}}).count("*","dislikes",{"m.feedback":{eq:"dislike"}}).where({"a.app_id":{eq:i},"m.feedback":{isNull:!1}}).run(),U=Number(W?.runs??0)>0?Math.round(Number(W?.ok_runs??0)/Number(W?.runs??0)*100):null,[F]=await o.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).count("*","cnt").where({"a.app_id":{eq:i},"a.type":{eq:"ai"},"m.ai_approved":{isNull:!1},"m.created_at":{gte:Q.monthStart()}}).run(),K=Number(F?.cnt??0),M=Math.max(0,K*C-S).toFixed(2);return{agents:l,departments:u,messages:c,tokens:d,estCostYuan:S,costTrend:A,trend:h,active_agents:b,roi:{aiRepliesMonth:K,costPerReply:C,estCostYuan:S,savedYuan:Number(M)},quality:{toolSuccessRate:U,likes:Number(G?.likes??0),dislikes:Number(G?.dislikes??0)}}}n.get("/api/stats/report",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);let i=await t(o),[a]=await o.orm.query.from("_weifuwu_apps").select("name","plan","trial_ends_at").where({id:{eq:o.appId}}).limit(1).run(),[l]=await o.orm.query.from("agent_logs").sum("tokens_total","used").where({app_id:{eq:o.appId},created_at:{gte:Q.monthStart()}}).run(),u=String(a?.name??"\u672C\u5E94\u7528"),c=String(a?.plan??"free")==="pro"?"\u4E13\u4E1A\u7248":"\u514D\u8D39\u8BD5\u7528",d=i.roi??{aiRepliesMonth:0,costPerReply:2,estCostYuan:0,savedYuan:0},p=i.quality??{toolSuccessRate:null,likes:0,dislikes:0},f=i.messages?.total??0,w=i.agents?.ai_count??0,m=i.tokens??{total_tokens:0},g=i.costTrend??[],h=i.active_agents??[],b=Number(l?.used??0),k=g.map(v=>`${v.day}:\xA5${v.costYuan}`).join(" \u2192 "),_=`<!DOCTYPE html>
495
495
  <html lang="zh-CN"><head><meta charset="utf-8"><title>AI \u4EF7\u503C\u62A5\u544A \u2014 ${u}</title>
496
496
  <style>
497
497
  body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; max-width: 720px; margin: 40px auto; padding: 0 24px; color: #1f2937; }
@@ -517,8 +517,8 @@ data: {"messageId":"${p.id}"}
517
517
 
518
518
  <h2>\u4F7F\u7528\u6982\u51B5</h2>
519
519
  <table>
520
- <tr><td>\u603B\u6D88\u606F\u6570</td><td>${m} \u6761</td><td>AI \u6210\u5458</td><td>${h} \u4E2A</td></tr>
521
- <tr><td>\u672C\u6708 token \u6D88\u8017</td><td>${y.toLocaleString()}</td><td>\u5DE5\u5177\u6267\u884C\u6210\u529F\u7387</td><td>${p.toolSuccessRate===null?"\u2014":p.toolSuccessRate+"%"}</td></tr>
520
+ <tr><td>\u603B\u6D88\u606F\u6570</td><td>${f} \u6761</td><td>AI \u6210\u5458</td><td>${w} \u4E2A</td></tr>
521
+ <tr><td>\u672C\u6708 token \u6D88\u8017</td><td>${b.toLocaleString()}</td><td>\u5DE5\u5177\u6267\u884C\u6210\u529F\u7387</td><td>${p.toolSuccessRate===null?"\u2014":p.toolSuccessRate+"%"}</td></tr>
522
522
  <tr><td>\u8D28\u91CF\u53CD\u9988</td><td>\u{1F44D} ${p.likes} \xB7 \u{1F44E} ${p.dislikes}</td><td>AI \u56DE\u590D\u6570\uFF08\u672C\u6708\uFF09</td><td>${d.aiRepliesMonth} \u6761</td></tr>
523
523
  </table>
524
524
 
@@ -528,20 +528,20 @@ data: {"messageId":"${p.id}"}
528
528
  <h2>\u6D3B\u8DC3\u6210\u5458\u6392\u884C\uFF08\u8FD1 7 \u5929\uFF09</h2>
529
529
  <table>
530
530
  <tr><th>\u6210\u5458</th><th>\u7C7B\u578B</th><th>\u6D88\u606F\u6570</th></tr>
531
- ${w.map(v=>`<tr><td>${v.name}</td><td>${v.type==="ai"?"AI":v.type}</td><td>${v.message_count}</td></tr>`).join("")||'<tr><td colspan="3" class="muted">\u6682\u65E0\u6D3B\u8DC3\u6570\u636E</td></tr>'}
531
+ ${h.map(v=>`<tr><td>${v.name}</td><td>${v.type==="ai"?"AI":v.type}</td><td>${v.message_count}</td></tr>`).join("")||'<tr><td colspan="3" class="muted">\u6682\u65E0\u6D3B\u8DC3\u6570\u636E</td></tr>'}
532
532
  </table>
533
533
 
534
534
  <h2>\u4EF7\u503C\u603B\u7ED3</h2>
535
- <p>${m>0?`\u8FC7\u53BB ${m>100?"30":"14"} \u5929\u91CC\uFF0C${h} \u4E2A AI \u6210\u5458\u5904\u7406\u4E86 ${m} \u6761\u6D88\u606F\uFF0C\u5DE5\u5177\u6267\u884C\u6210\u529F\u7387 ${p.toolSuccessRate===null?"\u2014":p.toolSuccessRate+"%"}\uFF0C\u4E3A\u60A8\u8282\u7701\u7EA6 \xA5${d.savedYuan}\u3002AI \u6B63\u5728\u6210\u4E3A\u60A8\u56E2\u961F\u91CC\u5E72\u6D3B\u6700\u52E4\u5FEB\u7684\u540C\u4E8B\u3002`:"\u5F00\u59CB\u4F7F\u7528\uFF1A\u5728\u7FA4\u91CC @AI \u6210\u5458\u4E0B\u8FBE\u7B2C\u4E00\u4E2A\u4EFB\u52A1\uFF0C\u4E24\u5468\u540E\u8FD9\u91CC\u4F1A\u6709\u4E00\u4EFD\u5C5E\u4E8E\u60A8\u7684\u4EF7\u503C\u62A5\u544A\u3002"}</p>
535
+ <p>${f>0?`\u8FC7\u53BB ${f>100?"30":"14"} \u5929\u91CC\uFF0C${w} \u4E2A AI \u6210\u5458\u5904\u7406\u4E86 ${f} \u6761\u6D88\u606F\uFF0C\u5DE5\u5177\u6267\u884C\u6210\u529F\u7387 ${p.toolSuccessRate===null?"\u2014":p.toolSuccessRate+"%"}\uFF0C\u4E3A\u60A8\u8282\u7701\u7EA6 \xA5${d.savedYuan}\u3002AI \u6B63\u5728\u6210\u4E3A\u60A8\u56E2\u961F\u91CC\u5E72\u6D3B\u6700\u52E4\u5FEB\u7684\u540C\u4E8B\u3002`:"\u5F00\u59CB\u4F7F\u7528\uFF1A\u5728\u7FA4\u91CC @AI \u6210\u5458\u4E0B\u8FBE\u7B2C\u4E00\u4E2A\u4EFB\u52A1\uFF0C\u4E24\u5468\u540E\u8FD9\u91CC\u4F1A\u6709\u4E00\u4EFD\u5C5E\u4E8E\u60A8\u7684\u4EF7\u503C\u62A5\u544A\u3002"}</p>
536
536
 
537
537
  <div class="footer">agent-platform \xB7 AI \u4EF7\u503C\u62A5\u544A \xB7 \u6570\u636E\u6765\u81EA\u60A8\u81EA\u5DF1\u7684\u79C1\u6709\u5316\u90E8\u7F72</div>
538
- </body></html>`;return new Response(_,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.get("/api/stats/tokens-by-agent",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);let{orm:o,appId:a}=i,l=await o.query.from("agents").select("id","name","type").where({app_id:{eq:a}}).run(),u=l.map(m=>String(m.id)),c=u.length?await o.query.from("agent_logs").select("agent_id").count("*","run_count").sum("tokens_total","tokens_total").sum("tokens_prompt","tokens_prompt").sum("tokens_completion","tokens_completion").where({agent_id:{in:u},app_id:{eq:a}}).groupBy("agent_id").run():[],d=new Map(c.map(m=>[String(m.agent_id),m])),p=l.map(m=>({id:m.id,name:m.name,type:m.type,...d.get(String(m.id))??{run_count:0,tokens_total:0,tokens_prompt:0,tokens_completion:0}})).filter(m=>Number(m.run_count??0)>0).sort((m,h)=>Number(h.tokens_total??0)-Number(m.tokens_total??0)).slice(0,10);return Response.json({agents:p})}),n.get("/api/stats/departments",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);let{orm:o,appId:a}=i,l=await o.query.from("departments").select("id","name","is_dm").where({app_id:{eq:a}}).run(),u=l.map(k=>String(k.id)),c=u.length?await o.query.from("messages").select("department_id").count("*","messages").where({department_id:{in:u},ai_approved:{ne:!1}}).groupBy("department_id").run():[],d=u.length?await o.query.from("agent_logs").select("department_id").count("*","runs").count("*","runs_ok",{success:{eq:!0}}).sum("tokens_total","tokens").max("created_at","last_active").where({department_id:{in:u},app_id:{eq:a}}).groupBy("department_id").run():[],p=new Map(c.map(k=>[String(k.department_id),Number(k.messages??0)])),m=new Map(d.map(k=>[String(k.department_id),k])),h=l.map(k=>({id:k.id,name:k.name,is_dm:k.is_dm,messages:p.get(String(k.id))??0,runs:Number(m.get(String(k.id))?.runs??0),runs_ok:Number(m.get(String(k.id))?.runs_ok??0),tokens:Number(m.get(String(k.id))?.tokens??0),last_active:m.get(String(k.id))?.last_active??null})).sort((k,_)=>Number(_.tokens)-Number(k.tokens)||Number(_.messages)-Number(k.messages)),{manager:f}=await Promise.resolve().then(()=>(Se(),Ee));f.init(o);let g=h??[],w=!1,y=[];for(let k of g){let _=await f.byDepartment(String(k.id));y.push({...k,envStatus:_?.status??null,envLabel:_?_.status==="running"?"\u8FD0\u884C\u4E2D":_.status==="stopped"?"\u5DF2\u505C\u6B62":_.status==="error"?"\u9519\u8BEF":"\u5F85\u542F\u52A8":null})}try{let[k]=await i.orm.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:a}}).limit(1).run(),_=Number(k?.sandbox_quota??5),[v]=await i.orm.query.from("sandboxes").count("*","n").where({app_id:{eq:a},status:{ne:"terminated"}}).run();w=_>0&&Number(v?.n??0)/_>=.8,w&&console.warn(`[agent-platform] \u6C99\u76D2\u914D\u989D\u538B\u529B\uFF1A${v?.n}/${_}\uFF08\u226580%\uFF09\u2014\u2014app ${a}`)}catch{}return Response.json({departments:y,quotaPressure:w})});let r=new Set(["register_complete","agent_created","first_message"]);n.post("/api/track",async(s,i)=>{let{orm:o,appId:a}=i,l=await s.json().catch(()=>({}));if(!l.event||!r.has(l.event))throw new T("event \u5FC5\u987B\u662F register_complete/agent_created/first_message \u4E4B\u4E00",400);try{await i.orm.query.insert("events").values({app_id:a,event:l.event}).run()}catch{}return Response.json({ok:!0})}),n.get("/api/stats/funnel",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);let{orm:o,appId:a}=i,[l]=await o.query.from("events").count("*","register_complete",{event:{eq:"register_complete"}}).count("*","agent_created",{event:{eq:"agent_created"}}).count("*","first_message",{event:{eq:"first_message"}}).where({app_id:{eq:a}}).run(),u=l[0],c=await o.query.from("events").select("app_id","event").limit(5e4).run(),d=new Set;for(let h of c)d.add(`${String(h.app_id)}${String(h.event)}`);let p=new Map;for(let h of d){let f=h.slice(h.indexOf("")+1);p.set(f,(p.get(f)??0)+1)}let m=[...p.entries()].map(([h,f])=>({event:h,count:f}));return Response.json({mine:{register_complete:(u?.register_complete??0)>0,agent_created:(u?.agent_created??0)>0,first_message:(u?.first_message??0)>0},platform:Object.fromEntries(m.map(h=>[h.event,h.count]))})}),n.get("/api/stats/agents/:agentId/logs",async(s,i)=>{let{sql:o,orm:a,appId:l,params:u}=i,c=await a.query.from("agent_logs").select("id","messages_count","steps_count","tokens_prompt","tokens_completion","tokens_total","elapsed_ms","success","created_at").where({agent_id:{eq:u.agentId},app_id:{eq:l}}).orderBy("created_at","desc").limit(50).run();return Response.json({logs:c})}),n.get("/api/stats/agents/:agentId/webhook-logs",async(s,i)=>{let{sql:o,orm:a,appId:l,params:u}=i,c=await a.query.from("webhook_logs").select("id","request_body","response_body","response_status","elapsed_ms","success","created_at").where({agent_id:{eq:u.agentId},app_id:{eq:l}}).orderBy("created_at","desc").limit(30).run();return Response.json({logs:c})}),n.get("/api/stats/runs",async(s,i)=>{if(!e(i))throw new T("Unauthorized",401);let{orm:o,appId:a}=i,l=new URL(s.url??"","http://localhost"),u=Math.min(50,Math.max(1,Number(l.searchParams.get("limit")??20))),c=await o.query.from("agent_runs r").join("agents a",{"a.id":{col:"r.orchestrator_id"}},{type:"left"}).select("r.id","r.kind","r.status","r.plan_json","r.worker_results","r.request_id","r.created_at","r.updated_at","a.name AS orchestrator_name").where({"r.app_id":{eq:a}}).orderBy("r.created_at","desc").limit(u).run();return Response.json({runs:c??[]})})}re();function ly(n){n.get("/api/deliverables",async(e,t)=>{let{orm:r,appId:s}=t,i=new URL(e.url),o=Math.min(500,Math.max(1,parseInt(i.searchParams.get("limit")??"200",10)));if(!s)throw new T("\u672A\u8BA4\u8BC1",401);let a=await r.query.from("departments d").select("d.id","d.name","d.workspace_path").where({"d.app_id":{eq:s}}).run();if(a.length===0)return Response.json({files:[]});let{resolveDepartmentWorkspace:l}=await Promise.resolve().then(()=>(Ie(),qe)),{readdir:u,stat:c}=await import("node:fs/promises"),{join:d}=await import("node:path"),p=50*1024*1024,h=(await Promise.all(a.map(async f=>{try{let g=await l(String(f.id),f.workspace_path,!0);if(!g)return[];let w=await u(g,{withFileTypes:!0}),y=[];for(let k of w)if(!k.name.startsWith(".")){if(k.isDirectory()){let _=d(g,k.name);try{let v=await u(_,{withFileTypes:!0});for(let S of v){if(S.name.startsWith(".")||!S.isFile())continue;let A=d(_,S.name);try{let C=await c(A);if(C.size>p)continue;y.push({deptId:String(f.id),deptName:String(f.name),path:`${k.name}/${S.name}`,name:S.name,size:C.size,mtime:C.mtime.toISOString()})}catch{}}}catch{}continue}try{let _=await c(d(g,k.name));if(_.size>p)continue;y.push({deptId:String(f.id),deptName:String(f.name),path:k.name,name:k.name,size:_.size,mtime:_.mtime.toISOString()})}catch{}}return y}catch{return[]}}))).flat().sort((f,g)=>String(g.mtime).localeCompare(String(f.mtime))).slice(0,o);return Response.json({files:h})})}import{resolve as ea,join as py}from"node:path";import{readFileSync as dd,existsSync as my}from"node:fs";import{gzipSync as uR}from"node:zlib";import{resolve as uy,dirname as eR}from"node:path";import{fileURLToPath as tR,pathToFileURL as nR}from"node:url";import{writeFile as rR,rm as sR}from"node:fs/promises";import{tmpdir as oR}from"node:os";import{build as iR}from"esbuild";var aR=eR(tR(import.meta.url)),cd=null;async function lR(){if(cd)return cd;let n=uy(aR,"..","ui","ssr-entry.ts");for(let e=0;e<2;e++)try{let t=await iR({entryPoints:[n],bundle:!0,platform:"node",format:"esm",write:!1,jsx:"automatic",jsxImportSource:"weifuwu/client/vdom"}),r=uy(oR(),`wf-ap-ssr-${process.pid}-${Date.now()}.mjs`);await rR(r,t.outputFiles[0].text);let s=await import(nR(r).href+`?v=${Date.now()}`);return sR(r,{force:!0}).catch(()=>{}),cd=s,s}catch(t){if(e===0){console.error("[agent-platform] SSR bundle \u7F16\u8BD1\u5931\u8D25\u2014\u2014\u91CD\u8BD5\u4E00\u6B21:",t.message.slice(0,140)),await new Promise(r=>setTimeout(r,50));continue}throw t}throw new Error("SSR bundle \u52A0\u8F7D\u5931\u8D25")}async function cy(n){try{let e=await lR();return await e.uiSsr(e.router,n,{title:n==="/login"?"\u767B\u5F55 \u2014 Agent Platform":"\u6CE8\u518C \u2014 Agent Platform"})}catch(e){return console.warn("[agent-platform] SSR \u6E32\u67D3\u5931\u8D25\uFF08\u56DE\u9000 SPA \u58F3\uFF09:",e.message.slice(0,140)),null}}function dy(n,e){let t=`<head>
538
+ </body></html>`;return new Response(_,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.get("/api/stats/tokens-by-agent",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);let{orm:i,appId:a}=o,l=await i.query.from("agents").select("id","name","type").where({app_id:{eq:a}}).run(),u=l.map(f=>String(f.id)),c=u.length?await i.query.from("agent_logs").select("agent_id").count("*","run_count").sum("tokens_total","tokens_total").sum("tokens_prompt","tokens_prompt").sum("tokens_completion","tokens_completion").where({agent_id:{in:u},app_id:{eq:a}}).groupBy("agent_id").run():[],d=new Map(c.map(f=>[String(f.agent_id),f])),p=l.map(f=>({id:f.id,name:f.name,type:f.type,...d.get(String(f.id))??{run_count:0,tokens_total:0,tokens_prompt:0,tokens_completion:0}})).filter(f=>Number(f.run_count??0)>0).sort((f,w)=>Number(w.tokens_total??0)-Number(f.tokens_total??0)).slice(0,10);return Response.json({agents:p})}),n.get("/api/stats/departments",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);let{orm:i,appId:a}=o,l=await i.query.from("departments").select("id","name","is_dm").where({app_id:{eq:a}}).run(),u=l.map(k=>String(k.id)),c=u.length?await i.query.from("messages").select("department_id").count("*","messages").where({department_id:{in:u},ai_approved:{ne:!1}}).groupBy("department_id").run():[],d=u.length?await i.query.from("agent_logs").select("department_id").count("*","runs").count("*","runs_ok",{success:{eq:!0}}).sum("tokens_total","tokens").max("created_at","last_active").where({department_id:{in:u},app_id:{eq:a}}).groupBy("department_id").run():[],p=new Map(c.map(k=>[String(k.department_id),Number(k.messages??0)])),f=new Map(d.map(k=>[String(k.department_id),k])),w=l.map(k=>({id:k.id,name:k.name,is_dm:k.is_dm,messages:p.get(String(k.id))??0,runs:Number(f.get(String(k.id))?.runs??0),runs_ok:Number(f.get(String(k.id))?.runs_ok??0),tokens:Number(f.get(String(k.id))?.tokens??0),last_active:f.get(String(k.id))?.last_active??null})).sort((k,_)=>Number(_.tokens)-Number(k.tokens)||Number(_.messages)-Number(k.messages)),{manager:m}=await Promise.resolve().then(()=>(Se(),Te));m.init(i);let g=w??[],h=!1,b=[];for(let k of g){let _=await m.byDepartment(String(k.id));b.push({...k,envStatus:_?.status??null,envLabel:_?_.status==="running"?"\u8FD0\u884C\u4E2D":_.status==="stopped"?"\u5DF2\u505C\u6B62":_.status==="error"?"\u9519\u8BEF":"\u5F85\u542F\u52A8":null})}try{let[k]=await o.orm.query.from("_weifuwu_apps").select("sandbox_quota").where({id:{eq:a}}).limit(1).run(),_=Number(k?.sandbox_quota??5),[v]=await o.orm.query.from("sandboxes").count("*","n").where({app_id:{eq:a},status:{ne:"terminated"}}).run();h=_>0&&Number(v?.n??0)/_>=.8,h&&console.warn(`[agent-platform] \u6C99\u76D2\u914D\u989D\u538B\u529B\uFF1A${v?.n}/${_}\uFF08\u226580%\uFF09\u2014\u2014app ${a}`)}catch{}return Response.json({departments:b,quotaPressure:h})});let r=new Set(["register_complete","agent_created","first_message"]);n.post("/api/track",async(s,o)=>{let{orm:i,appId:a}=o,l=await s.json().catch(()=>({}));if(!l.event||!r.has(l.event))throw new T("event \u5FC5\u987B\u662F register_complete/agent_created/first_message \u4E4B\u4E00",400);try{await o.orm.query.insert("events").values({app_id:a,event:l.event}).run()}catch{}return Response.json({ok:!0})}),n.get("/api/stats/funnel",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);let{orm:i,appId:a}=o,[l]=await i.query.from("events").count("*","register_complete",{event:{eq:"register_complete"}}).count("*","agent_created",{event:{eq:"agent_created"}}).count("*","first_message",{event:{eq:"first_message"}}).where({app_id:{eq:a}}).run(),u=l[0],c=await i.query.from("events").select("app_id","event").limit(5e4).run(),d=new Set;for(let w of c)d.add(`${String(w.app_id)}${String(w.event)}`);let p=new Map;for(let w of d){let m=w.slice(w.indexOf("")+1);p.set(m,(p.get(m)??0)+1)}let f=[...p.entries()].map(([w,m])=>({event:w,count:m}));return Response.json({mine:{register_complete:(u?.register_complete??0)>0,agent_created:(u?.agent_created??0)>0,first_message:(u?.first_message??0)>0},platform:Object.fromEntries(f.map(w=>[w.event,w.count]))})}),n.get("/api/stats/agents/:agentId/logs",async(s,o)=>{let{sql:i,orm:a,appId:l,params:u}=o,c=await a.query.from("agent_logs").select("id","messages_count","steps_count","tokens_prompt","tokens_completion","tokens_total","elapsed_ms","success","created_at").where({agent_id:{eq:u.agentId},app_id:{eq:l}}).orderBy("created_at","desc").limit(50).run();return Response.json({logs:c})}),n.get("/api/stats/agents/:agentId/webhook-logs",async(s,o)=>{let{sql:i,orm:a,appId:l,params:u}=o,c=await a.query.from("webhook_logs").select("id","request_body","response_body","response_status","elapsed_ms","success","created_at").where({agent_id:{eq:u.agentId},app_id:{eq:l}}).orderBy("created_at","desc").limit(30).run();return Response.json({logs:c})}),n.get("/api/stats/runs",async(s,o)=>{if(!e(o))throw new T("Unauthorized",401);let{orm:i,appId:a}=o,l=new URL(s.url??"","http://localhost"),u=Math.min(50,Math.max(1,Number(l.searchParams.get("limit")??20))),c=await i.query.from("agent_runs r").join("agents a",{"a.id":{col:"r.orchestrator_id"}},{type:"left"}).select("r.id","r.kind","r.status","r.plan_json","r.worker_results","r.request_id","r.created_at","r.updated_at","a.name AS orchestrator_name").where({"r.app_id":{eq:a}}).orderBy("r.created_at","desc").limit(u).run();return Response.json({runs:c??[]})})}re();function ly(n){n.get("/api/deliverables",async(e,t)=>{let{orm:r,appId:s}=t,o=new URL(e.url),i=Math.min(500,Math.max(1,parseInt(o.searchParams.get("limit")??"200",10)));if(!s)throw new T("\u672A\u8BA4\u8BC1",401);let a=await r.query.from("departments d").select("d.id","d.name","d.workspace_path").where({"d.app_id":{eq:s}}).run();if(a.length===0)return Response.json({files:[]});let{resolveDepartmentWorkspace:l}=await Promise.resolve().then(()=>(Ne(),De)),{readdir:u,stat:c}=await import("node:fs/promises"),{join:d}=await import("node:path"),p=50*1024*1024,w=(await Promise.all(a.map(async m=>{try{let g=await l(String(m.id),m.workspace_path,!0);if(!g)return[];let h=await u(g,{withFileTypes:!0}),b=[];for(let k of h)if(!k.name.startsWith(".")){if(k.isDirectory()){let _=d(g,k.name);try{let v=await u(_,{withFileTypes:!0});for(let S of v){if(S.name.startsWith(".")||!S.isFile())continue;let A=d(_,S.name);try{let C=await c(A);if(C.size>p)continue;b.push({deptId:String(m.id),deptName:String(m.name),path:`${k.name}/${S.name}`,name:S.name,size:C.size,mtime:C.mtime.toISOString()})}catch{}}}catch{}continue}try{let _=await c(d(g,k.name));if(_.size>p)continue;b.push({deptId:String(m.id),deptName:String(m.name),path:k.name,name:k.name,size:_.size,mtime:_.mtime.toISOString()})}catch{}}return b}catch{return[]}}))).flat().sort((m,g)=>String(g.mtime).localeCompare(String(m.mtime))).slice(0,i);return Response.json({files:w})})}import{resolve as ra,join as dy}from"node:path";import{readFileSync as fd,existsSync as py}from"node:fs";import{gzipSync as aR}from"node:zlib";Or();import{resolve as na}from"node:path";import{pathToFileURL as eR}from"node:url";import{writeFile as tR,rm as nR}from"node:fs/promises";import{tmpdir as rR}from"node:os";import{build as sR}from"esbuild";var oR=na(je,"..","..",".."),md=null;async function iR(){if(md)return md;let n=na(je,"ui","ssr-entry.ts");for(let e=0;e<2;e++)try{let t=await sR({entryPoints:[n],bundle:!0,platform:"node",format:"esm",write:!1,jsx:"automatic",jsxImportSource:na(oR,"level6","client","vdom")}),r=na(rR(),`wf-ap-ssr-${process.pid}-${Date.now()}.mjs`);await tR(r,t.outputFiles[0].text);let s=await import(eR(r).href+`?v=${Date.now()}`);return nR(r,{force:!0}).catch(()=>{}),md=s,s}catch(t){if(e===0){console.error("[agent-platform] SSR bundle \u7F16\u8BD1\u5931\u8D25\u2014\u2014\u91CD\u8BD5\u4E00\u6B21:",t.message.slice(0,140)),await new Promise(r=>setTimeout(r,50));continue}throw t}throw new Error("SSR bundle \u52A0\u8F7D\u5931\u8D25")}async function uy(n){try{let e=await iR();return await e.uiSsr(e.router,n,{title:n==="/login"?"\u767B\u5F55 \u2014 Agent Platform":"\u6CE8\u518C \u2014 Agent Platform"})}catch(e){return console.warn("[agent-platform] SSR \u6E32\u67D3\u5931\u8D25\uFF08\u56DE\u9000 SPA \u58F3\uFF09:",e.message.slice(0,140)),null}}function cy(n,e){let t=`<head>
539
539
  <meta charset="UTF-8">
540
540
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
541
541
  <title>${e}</title>
542
542
  <link rel="stylesheet" href="/static/style.css">
543
543
  <link rel="stylesheet" href="/static/app.css">
544
- </head>`;return n.replace(/<head>[\s\S]*?<\/head>/,t).replace("</body>",'<script type="module" src="/static/app.js"></script></body>')}var pd=process.env.NODE_ENV==="production";function fy(n){return ea(n,"dist")}function gy(n,e){if(n.get("/favicon.ico",async()=>new Response('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#4f6ef7"/><path d="M9 21c3-8 11-14 14-11 2 2-1 5-5 8-4 3-7 3-9 3z" fill="#fff"/></svg>',{headers:{"Content-Type":"image/svg+xml","Cache-Control":"max-age=86400"}})),n.get("/static/style.css",async(t,r)=>r.ui.css("weifuwu/client/components/style.css")),n.get("/static/app.css",async(t,r)=>r.ui.css(ea(e,"ui","app.css"))),pd){let t=fy(e),r=null;n.get("/static/app.js",async(s,i)=>{let o=py(t,"app.js");return my(o)?(s.headers.get("accept-encoding")??"").includes("gzip")?(r||(r=new Blob([uR(dd(o))])),new Response(r,{headers:{"Content-Type":"application/javascript; charset=utf-8","Content-Encoding":"gzip","Cache-Control":"max-age=3600"}})):new Response(dd(o),{headers:{"Content-Type":"application/javascript; charset=utf-8","Cache-Control":"max-age=3600"}}):new Response("/* app.js not built */",{status:200,headers:{"Content-Type":"application/javascript; charset=utf-8"}})})}else n.get("/static/app.js",async(t,r)=>{let s=await r.ui.js(ea(e,"ui","v3-main.tsx"));return s.headers.set("Cache-Control","no-store"),s});if(!pd){n.get("/v3-app.js",async(r,s)=>s.ui.js(ea(e,"ui","v3-main.tsx")));let t=`<!DOCTYPE html>
544
+ </head>`;return n.replace(/<head>[\s\S]*?<\/head>/,t).replace("</body>",'<script type="module" src="/static/app.js"></script></body>')}var gd=process.env.NODE_ENV==="production";function my(n){return ra(n,"dist")}function fy(n,e){if(n.get("/favicon.ico",async()=>new Response('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#4f6ef7"/><path d="M9 21c3-8 11-14 14-11 2 2-1 5-5 8-4 3-7 3-9 3z" fill="#fff"/></svg>',{headers:{"Content-Type":"image/svg+xml","Cache-Control":"max-age=86400"}})),n.get("/static/style.css",async(t,r)=>r.ui.css("weifuwu/client/components/style.css")),n.get("/static/app.css",async(t,r)=>r.ui.css(ra(e,"ui","app.css"))),gd){let t=my(e),r=null;n.get("/static/app.js",async(s,o)=>{let i=dy(t,"app.js");return py(i)?(s.headers.get("accept-encoding")??"").includes("gzip")?(r||(r=new Blob([aR(fd(i))])),new Response(r,{headers:{"Content-Type":"application/javascript; charset=utf-8","Content-Encoding":"gzip","Cache-Control":"max-age=3600"}})):new Response(fd(i),{headers:{"Content-Type":"application/javascript; charset=utf-8","Cache-Control":"max-age=3600"}}):new Response("/* app.js not built */",{status:200,headers:{"Content-Type":"application/javascript; charset=utf-8"}})})}else n.get("/static/app.js",async(t,r)=>{let s=await r.ui.js(ra(e,"ui","v3-main.tsx"));return s.headers.set("Cache-Control","no-store"),s});if(!gd){n.get("/v3-app.js",async(r,s)=>s.ui.js(ra(e,"ui","v3-main.tsx")));let t=`<!DOCTYPE html>
545
545
  <html lang="zh-CN">
546
546
  <head><meta charset="UTF-8"><title>vdom3 \u2014 Agent Platform</title>
547
547
  <link rel="stylesheet" href="/static/style.css">
@@ -553,7 +553,7 @@ data: {"messageId":"${p.id}"}
553
553
  <script>history.replaceState(null, '', location.pathname.replace(/^\\/v3/, '') || '/')</script>
554
554
  <script type="module" src="/v3-app.js"></script>
555
555
  </body>
556
- </html>`;n.get("/v3",async()=>new Response(t,{headers:{"Content-Type":"text/html"}})),n.get("/v3/login",async()=>new Response(t,{headers:{"Content-Type":"text/html"}}))}if(pd){let t=fy(e),r=py(t,"index.html"),s="";my(r)&&(s=dd(r,"utf-8").replace("{{script}}","/static/app.js"));let i=["/","/login","/register","/dashboard","/agents","/agents/new","/agents/:id","/templates","/departments","/departments/new","/departments/:id","/chat/new","/chat/:id","/approvals","/sandboxes","/reports","/deliverables","/settings","/admin","/surveys","/workflows","/workflows/:id"];for(let o of i)n.get(o,async()=>s?new Response(s,{headers:{"Content-Type":"text/html; charset=utf-8"}}):new Response(`
556
+ </html>`;n.get("/v3",async()=>new Response(t,{headers:{"Content-Type":"text/html"}})),n.get("/v3/login",async()=>new Response(t,{headers:{"Content-Type":"text/html"}}))}if(gd){let t=my(e),r=dy(t,"index.html"),s="";py(r)&&(s=fd(r,"utf-8").replace("{{script}}","/static/app.js"));let o=["/","/login","/register","/dashboard","/agents","/agents/new","/agents/:id","/templates","/departments","/departments/new","/departments/:id","/chat/new","/chat/:id","/approvals","/sandboxes","/reports","/deliverables","/settings","/admin","/surveys","/workflows","/workflows/:id"];for(let i of o)n.get(i,async()=>s?new Response(s,{headers:{"Content-Type":"text/html; charset=utf-8"}}):new Response(`
557
557
  <!DOCTYPE html>
558
558
  <html lang="zh-CN">
559
559
  <head>
@@ -567,7 +567,7 @@ data: {"messageId":"${p.id}"}
567
567
  <div id="root"><div class="boot-loading"><div class="spinner"></div>\u52A0\u8F7D\u4E2D...</div></div>
568
568
  <script type="module" src="/static/app.js"></script>
569
569
  </body>
570
- </html>`,{headers:{"Content-Type":"text/html; charset=utf-8"}}))}else{let t=["/","/login","/register","/dashboard","/agents","/agents/new","/agents/:id","/templates","/departments","/departments/new","/departments/:id","/chat/new","/chat/:id","/approvals","/sandboxes","/reports","/deliverables","/settings","/admin","/surveys","/workflows","/workflows/:id"];for(let r of t)n.get(r,async(s,i)=>{if(r==="/login"||r==="/register"){let o=await cy(r);if(o!==null)return new Response(dy(o,r==="/login"?"\u767B\u5F55 \u2014 Agent Platform":"\u6CE8\u518C \u2014 Agent Platform"),{headers:{"Content-Type":"text/html; charset=utf-8"},status:200})}return i.ui.html`
570
+ </html>`,{headers:{"Content-Type":"text/html; charset=utf-8"}}))}else{let t=["/","/login","/register","/dashboard","/agents","/agents/new","/agents/:id","/templates","/departments","/departments/new","/departments/:id","/chat/new","/chat/:id","/approvals","/sandboxes","/reports","/deliverables","/settings","/admin","/surveys","/workflows","/workflows/:id"];for(let r of t)n.get(r,async(s,o)=>{if(r==="/login"||r==="/register"){let i=await uy(r);if(i!==null)return new Response(cy(i,r==="/login"?"\u767B\u5F55 \u2014 Agent Platform":"\u6CE8\u518C \u2014 Agent Platform"),{headers:{"Content-Type":"text/html; charset=utf-8"},status:200})}return o.ui.html`
571
571
  <!DOCTYPE html>
572
572
  <html lang="zh-CN">
573
573
  <head>
@@ -582,5 +582,5 @@ data: {"messageId":"${p.id}"}
582
582
  <script type="module" src="/static/app.js"></script>
583
583
  </body>
584
584
  </html>
585
- `})}}async function Ty(n,e){let{pg:t,redisClient:r,eventsPg:s,currentCtx:i}=e,o=yR(bR(import.meta.url))+"/../..",a=new lt;a.onError(P=>Te(P)),a.use((P,E,x)=>(E.auth.requireAuth(),x(P,E))),a.use(async(P,E,x)=>{if(String(P.url??"").includes("/api/admin/"))return x(P,E);let O=E;if(O.appId&&(await O.orm.query.from("_weifuwu_apps").select("status").where({id:{eq:O.appId}}).run())[0]?.status==="disabled")throw new T("\u8BE5\u56E2\u961F\u5DF2\u88AB\u505C\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",403);return x(P,E)}),Aw(a);let l=t.orm.gql(Z(t.orm).agents,{hidden:["webhook_secret"]});a.use(di("/api/gql",async(P,E)=>({schema:l.typeDefs,resolvers:l.resolvers,context:()=>({orm:E.orm,appId:E.appId})})));let u=Mo({orm:t.orm,redis:r?.redis});n.use(u),await t.migrateModule("weifuwu-workflows",$o),u.routes(a),u.scheduler.start(),await Fw(a),Kw(a),Gw(a),a.get("/api/departments/:id/executions",async(P,E)=>{let{orm:x,appId:O,params:I}=E,[$]=await x.query.from("departments").select("id").where({id:{eq:I.id},app_id:{eq:O}}).run();if(!$)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let{manager:M}=await Promise.resolve().then(()=>(Se(),Ee));M.init(x);let{sandbox:W}=await Promise.resolve().then(()=>(De(),Fe)),q=await x.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.role_label","a.type","a.department_id").where({"dm.department_id":{eq:I.id},"a.type":{in:["ai","department"]}}).run(),[D]=await x.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).max("m.created_at","at").where({"m.department_id":{eq:I.id},"a.type":{eq:"user"}}).run(),B=D?.at?new Date(String(D.at)).getTime():Date.now(),z=Date.now(),Y=[];for(let ee of q??[]){let pe=String(ee.id),je=ee.department_id?String(ee.department_id):I.id,me=null;try{me=await M.byDepartment(je)}catch{me=null}let Pe=me?W.runningExecs.get(String(me.id))??null:null,Ve=null,Gs=!1;if(me){let Js=await M.eventHistory(String(me.id),10);Ve=Js[0]??null,Gs=Js.some(pn=>(pn.type.includes("error")||pn.type.includes("timeout"))&&z-new Date(pn.created_at).getTime()<10*6e4)}let Un=null;try{let{resolveDepartmentWorkspace:Js}=await Promise.resolve().then(()=>(Ie(),qe)),pn=await Js(je,null,!0);if(pn){let{readdir:Cy,stat:Ay}=await import("node:fs/promises"),{join:Oy}=await import("node:path"),Iy=await Cy(pn).catch(()=>[]),Zs=null;for(let na of Iy)if(!na.startsWith("."))try{let ra=await Ay(Oy(pn,na));ra.isFile()&&(!Zs||ra.mtimeMs>Zs.mtime)&&(Zs={path:na,mtime:ra.mtimeMs})}catch{}Un=Zs}}catch{}let Bn="idle",Qs=Un&&Un.mtime>B;Pe?Bn="working":Gs&&!Qs?Bn="failed":Qs?Bn="done":z-B>5*6e4&&!Qs?Bn="stalled":z-B>3e4&&(Bn="waiting"),Y.push({agentId:pe,name:String(ee.name),roleLabel:ee.role_label??null,type:String(ee.type),status:Bn,runningExec:Pe?{tool:Pe.tool,elapsedMs:z-Pe.startedAt,timeoutMs:Pe.timeoutMs}:null,lastEvent:Ve?{type:Ve.type,detail:Ve.detail,created_at:Ve.created_at}:null,artifact:Qs&&Un?{path:Un.path,mtime:new Date(Un.mtime).toISOString()}:null})}let te=Y.filter(ee=>ee.status==="done").length;return Response.json({tasks:Y,progress:{done:te,total:Y.length}})}),Qw(a);let{startHostReporting:c}=await Promise.resolve().then(()=>(yy(),wy));c();let{checkHostHealth:d}=await Promise.resolve().then(()=>(ky(),vy));setInterval(()=>{let P=d();(P.down.length>0||P.up.length>0)&&console.log(`[sandbox] \u5BBF\u4E3B\u5065\u5EB7\uFF1Adown=${P.down.join(",")||"-"} up=${P.up.join(",")||"-"}`)},6e4).unref?.(),Jw(a);let{registerBrowserWarmContract:m,registerExecTimeoutContract:h,startEventContracts:f}=await Promise.resolve().then(()=>(xy(),Sy));m(),h(),f(),Zw(a),Xw(a),ry(a),setImmediate(async()=>{try{let{markInterrupted:P}=await Promise.resolve().then(()=>(_t(),Pt)),E=await P({sql:t,appId:""});E>0&&console.log(`[campaign] \u542F\u52A8\u6062\u590D\uFF1A${E} \u4E2A\u8FD0\u884C\u4E2D campaign \u6807\u8BB0 interrupted\uFF08\u53EF retry \u6062\u590D\uFF09`)}catch{}}),sy(a),Yc(a),iy(a),ay(a),ly(n),a.get("/api/ops",async(P,E)=>{let{getLicenseInfo:x}=await Promise.resolve().then(()=>(nd(),td)),O=x(),I={available:!1};try{let{sandbox:M}=await Promise.resolve().then(()=>(De(),Fe)),W=await M.status();I={available:W.available,enabled:W.enabled,imageReady:W.imageReady,mode:W.mode,poolSize:W.poolSize,maxContainers:W.maxContainers}}catch{}let $=0;try{let[M]=await E.orm.query.from("audit_logs").count("*","n").where({created_at:{gte:G.nowAgo(1,"day")},app_id:{eq:E.appId}}).run();$=Number(M?.n??0)}catch{}return Response.json({sandbox:I,auditToday:$,license:O})}),a.get("/api/audit",async(P,E)=>{let{listAudit:x}=await Promise.resolve().then(()=>(st(),rt)),O=new URL(P.url??"","http://localhost"),I=Number(O.searchParams.get("limit")??50),$=O.searchParams.get("action")??void 0,M=O.searchParams.get("from")??void 0,W=O.searchParams.get("to")??void 0;for(let[D,B]of[["from",M],["to",W]])if(B!==void 0&&Number.isNaN(Date.parse(B)))return Response.json({error:`${D} \u975E\u6CD5\uFF08\u9700 ISO \u65F6\u95F4\u683C\u5F0F\uFF09`},{status:400});let q=await x(E,{limit:I,action:$,from:M,to:W});return Response.json(q)}),a.get("/api/settings/ai-config",async(P,E)=>{let{getByokConfig:x}=await Promise.resolve().then(()=>(kc(),Dh)),O=await x(E.orm,E.appId);return Response.json({baseUrl:O?.base_url??"",apiKey:O?.api_key?"******":"",apiKeySet:!!O?.api_key,model:O?.model??""})}),a.put("/api/settings/ai-config",async(P,E)=>{let{orm:x,appId:O}=E,I=await P.json();if(I.clear)return await x.query.delete("app_ai_configs").where({app_id:{eq:O}}).run(),Response.json({ok:!0,cleared:!0});let[$]=await x.query.from("app_ai_configs").select("api_key").where({app_id:{eq:O}}).run(),M=I.apiKey?.trim()?I.apiKey.trim():String($?.api_key??"");await x.query.insert("app_ai_configs").rows([{app_id:O,base_url:I.baseUrl?.trim()??null,api_key:M||null,model:I.model?.trim()??null,updated_at:G.now()}]).onConflict("app_id",!0).run();try{let{writeAudit:W}=await Promise.resolve().then(()=>(st(),rt));await W(E,{action:"byok_update",target_type:"app",target_id:O,detail:{baseUrl:I.baseUrl??null,model:I.model??null}})}catch{}return Response.json({ok:!0})}),a.get("/api/audit/export",async(P,E)=>{let{listAudit:x}=await Promise.resolve().then(()=>(st(),rt)),I=new URL(P.url??"","http://localhost").searchParams.get("action")??void 0,{entries:$}=await x(E,{limit:100,action:I}),M=B=>`"${String(B??"").replace(/"/g,'""')}"`,W="\u65F6\u95F4,\u64CD\u4F5C,\u64CD\u4F5C\u4EBA,\u76EE\u6807\u7C7B\u578B,\u8BE6\u60C5",q=$.map(B=>[B.created_at??"",B.action??"",B.user_name??"",B.target_type??"",JSON.stringify(B.detail??"")].map(M).join(",")),D="\uFEFF"+[W,...q].join(`
586
- `);return new Response(D,{headers:{"Content-Type":"text/csv; charset=utf-8","Content-Disposition":`attachment; filename="audit-${E.appId.slice(0,8)}-${Date.now()}.csv"`}})}),a.put("/api/auth/profile",async(P,E)=>{let{orm:x,auth:O}=E,I=await P.json();if(!I.name?.trim())throw new T("name \u4E0D\u80FD\u4E3A\u7A7A",400);let[$]=await x.query.update("_weifuwu_users").set({name:I.name.trim()}).where({id:{eq:O.userId}}).returning("id","email","name","role","created_at").run();return Response.json({user:$})}),a.get("/api/auth/export",async(P,E)=>{let{orm:x,auth:O}=E,I=O.userId,[$]=await x.query.from("_weifuwu_users").select("id","email","name","created_at").where({id:{eq:I}}).run(),M=await x.query.from("_weifuwu_app_members m").join("_weifuwu_apps a",{"a.id":{col:"m.app_id"}}).select("a.slug","a.name","m.role").where({"m.user_id":{eq:I}}).run(),W=await x.query.from("agents").select("id","app_id","type","name","description","created_at").where({user_id:{eq:I}}).run(),q=await x.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.content","m.msg_type","m.created_at").where({"a.user_id":{eq:I}}).run(),D={profile:$,memberships:M,agents:W,messages:q};return new Response(JSON.stringify(D,null,2),{headers:{"Content-Type":"application/json","Content-Disposition":'attachment; filename="my-data.json"'}})}),a.delete("/api/auth/account",async(P,E)=>{let{orm:x,auth:O}=E,I=O.userId;await x.query.update("_weifuwu_users").set({email:`deleted-${String(I).slice(0,8)}@deleted.local`,name:"\u5DF2\u5220\u9664\u7528\u6237",password_hash:null}).where({id:{eq:I}}).run(),await x.query.update("agents").set({is_active:!1,name:"\u5DF2\u5220\u9664\u7528\u6237"}).where({user_id:{eq:I}}).run(),await x.query.delete("_weifuwu_app_members").where({user_id:{eq:I}}).run(),await x.query.delete("_weifuwu_sessions").where({user_id:{eq:I}}).run();try{let{writeAudit:$}=await Promise.resolve().then(()=>(st(),rt));await $(E,{action:"account_deleted",target_type:"user",target_id:String(I),detail:{}})}catch{}return Response.json({success:!0,message:"\u8D26\u53F7\u5DF2\u5220\u9664\uFF08\u6570\u636E\u5DF2\u533F\u540D\u5316\uFF09"})}),a.put("/api/auth/password",async(P,E)=>{let{orm:x,auth:O}=E,I=await P.json();if(!I.currentPassword||!I.newPassword)throw new T("currentPassword \u548C newPassword \u4E3A\u5FC5\u586B",400);if(I.newPassword.length<6)throw new T("\u65B0\u5BC6\u7801\u81F3\u5C11 6 \u4F4D",400);let[$]=await x.query.from("_weifuwu_users").select("password_hash").where({id:{eq:O.userId}}).run();if(!$)throw new T("\u7528\u6237\u4E0D\u5B58\u5728",404);if(!await Dt(I.currentPassword,$.password_hash))throw new T("\u5F53\u524D\u5BC6\u7801\u9519\u8BEF",403);let W=await vt(I.newPassword);return await x.query.update("_weifuwu_users").set({password_hash:W}).where({id:{eq:O.userId}}).run(),Response.json({success:!0})}),a.get("/api/sandbox/containers",async(P,E)=>{let{sandbox:x}=await Promise.resolve().then(()=>(De(),Fe)),{orm:O}=E,I=await x.listContainers(),$=I.map(D=>String(D.name??"").replace("ap-sandbox-","")),M=$.length>0?await O.query.from("agents").select("id","name","type").where({id:{in:$}}).run():[],W=new Map((Array.isArray(M)?M:[]).map(D=>[String(D.id),String(D.name??D.id)])),q=[];for(let D of I){let B=await x.containerStats(String(D.name));q.push({name:D.name,status:D.status,image:D.image,createdAt:D.createdAt,agentName:W.get(String(D.name).replace("ap-sandbox-",""))??"\u672A\u77E5",...B??{}})}return Response.json({containers:q})}),a.get("/api/sandbox/containers/:name/processes",async(P,E)=>{let{sandbox:x}=await Promise.resolve().then(()=>(De(),Fe)),O=await x.containerProcesses(E.params.name);return Response.json({name:E.params.name,processes:O})}),a.post("/api/sandbox/containers/:name/:action",async(P,E)=>{let{sandbox:x}=await Promise.resolve().then(()=>(De(),Fe)),O=E.params.action;if(!["stop","start","restart","rm"].includes(O))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let I=await x.containerAction(E.params.name,O);return I.ok?Response.json(I):Response.json({error:I.message},{status:400})}),n.mount("/",a);let g=To({orm:t.orm,redis:r?.redis});await t.migrateModule("weifuwu-messager",Co),n.use(g),n.use(lo({from:process.env.EMAIL_FROM??"no-reply@agent-platform.local",...process.env.EMAIL_API_KEY||process.env.RESEND_API_KEY?{apiKey:process.env.EMAIL_API_KEY??process.env.RESEND_API_KEY}:{adapter:(async()=>({ok:!0,id:"noop"}))}})),n.ws("/ws",g.client.handler()),process.env.WF_TEST_HOOKS==="1"&&(n.post("/api/test/orm",async P=>{try{let E=await P.json();if(!E.query||typeof E.query!="object")throw new T("query \u5FC5\u586B\uFF08Query AST\uFF09",400);let x=await t.orm.execute(E.query);return Response.json({ok:!0,rows:x})}catch(E){return Response.json({error:String(E?.message??E)},{status:500})}}),n.post("/api/test/wf",async P=>{try{let E=await P.json();if(!E.room||!Array.isArray(E.events))throw new T("room/events \u5FC5\u586B",400);for(let x of E.events)g.client.broadcast(E.room,x);return Response.json({ok:!0,pushed:E.events.length})}catch(E){return Response.json({error:String(E?.message??E)},{status:500})}})),n.ws("/sandbox-host",{open:P=>{P.send(JSON.stringify({type:"host:ack"}))},message:async(P,E,x)=>{try{let O=JSON.parse(String(x)),{hostEventIngest:I}=await Promise.resolve().then(()=>(Ye(),Ln));if(O?.type==="sandbox:event"&&O.event?.entity==="sandbox")I(O.event);else if(O?.type==="host:ping"){let{sandboxEmit:$}=await Promise.resolve().then(()=>(Ye(),Ln));$("host:ping",O.hostId,{hostId:O.hostId,ts:O.ts})}else if(O?.type==="host:register"){let{sandboxEmit:$}=await Promise.resolve().then(()=>(Ye(),Ln));$("host:register",void 0,{hostId:O.hostId,capacity:O.capacity,at:new Date().toISOString()})}}catch{}}}),n.ws("/survey-live",{open:(P,E)=>{E.hub.join("survey-live",P),v=E.hub},message:async(P,E,x)=>{try{let O=JSON.parse(String(x));if(O.type==="ping"){P.send(JSON.stringify({type:"pong"}));return}if(O.type==="survey:hello"&&O.source){let I=String(O.source).slice(0,40);for(let[$,M]of S)if(M.source===I&&$!==P){S.delete($);try{$.close()}catch{}}if(I==="stats-view"){P.send(JSON.stringify(j(String(O.campaign??""))));return}S.set(P,{source:I,at:new Date().toISOString()}),H(),O.campaign!==void 0?P.send(JSON.stringify(j(String(O.campaign??"")))):P.send(JSON.stringify(j()));return}if(O.type==="survey:answer"&&O.question){let I=S.get(P);I&&(I.at=new Date().toISOString());let $={source:String(O.source??"\u8BBF\u5BA2"),question:String(O.question).slice(0,100),answer:String(O.answer??"").slice(0,300),at:new Date().toISOString(),campaign:String(O.campaign??"")};w.push($),w.length>_&&w.splice(0,w.length-_),t.orm.query.insert("survey_answers").values({source:String($.source),question:String($.question),answer:String($.answer),campaign_id:String($.campaign)||null}).run().catch(M=>{console.error("[survey] \u9010\u9898\u843D\u5E93\u5931\u8D25:",M?.message??M)}),A({type:"survey:answer",...$})}else if(O.type==="survey:submit"&&O.data){let I=O.data,$=String(I.campaign??"");if(!$)try{let[q]=await t.orm.query.from("survey_campaign_runs").where({agent_name:{eq:String(O.source??"")}}).select("campaign_id").orderBy("created_at","desc").limit(1).run();$=q?String(q.campaign_id):""}catch{}let M={id:Date.now().toString(36)+Math.random().toString(36).slice(2,6),source:String(O.source??"\u8BBF\u5BA2"),submitted_at:new Date().toISOString(),age:String(I.age??""),industry:String(I.industry??""),rating:Number(I.rating??0),focus:Array.isArray(I.focus)?I.focus:I.focus?[I.focus]:[],feedback:String(I.feedback??"").slice(0,500),campaign:$};y.push(M),y.length>_&&y.splice(0,y.length-_),k++;try{await t.orm.query.insert("survey_submissions").values({id:String(M.id),source:String(M.source),age:String(M.age),industry:String(M.industry),rating:Number(M.rating),focus:(()=>{try{return JSON.parse(String(M.focus))}catch{return String(M.focus)}})(),feedback:String(M.feedback),submitted_at:String(M.submitted_at),campaign_id:String(M.campaign)||null}).run()}catch(q){console.error("[survey] \u63D0\u4EA4\u843D\u5E93\u5931\u8D25\uFF08\u5B8C\u6210\u4FE1\u53F7\u4E22\u5931\u98CE\u9669\u2014\u2014source=%s id=%s\uFF09:",String(M.source),String(M.id),q?.message??q)}A({type:"survey:submitted",count:k,latest:M,aggregate:C()});let W=S.get(P);W&&(W.submitted=!0,W.at=new Date().toISOString(),H())}O.type==="survey:bye"&&S.delete(P)&&H()}catch{}},close:(P,E)=>{E.hub.leave(P),S.delete(P)&&H()}}),n.post("/api/webhook/:agentId",async(P,E)=>{try{if(Number(P.headers.get("content-length")??0)>64*1024)throw new T("Request body too large (max 64KB)",413);let O=await P.json(),{planBlockForApp:I}=await Promise.resolve().then(()=>(Qi(),ad)),[$]=await E.orm.query.from("agents").where({id:{eq:E.params.agentId},type:{eq:"webhook"}}).select("app_id").limit(1).run(),M=$?String($.app_id??""):"";if(M){let D=await I(E,M);if(D)return Response.json({error:D},{status:402})}let W=P.headers.get("x-signature")??void 0,q=await id(E,E.params.agentId,O,void 0,W,P.headers.get("x-timestamp")??void 0,P.headers.get("x-nonce")??void 0);return Response.json(q)}catch(x){let O=x instanceof Error?x.message:String(x),I=O.includes("Missing")?401:O.includes("Invalid")||O.includes("Replay")?403:400;return Response.json({error:O},{status:I})}}),n.post("/api/im/:platform",async(P,E)=>{let x=await P.text().catch(()=>""),O={};try{O=x?JSON.parse(x):{}}catch{throw new T("\u65E0\u6548 JSON",400)}let{parseImInbound:I}=await Promise.resolve().then(()=>(Ey(),Ry)),$;try{$=I(E.params.platform,O)}catch(ee){return Response.json({error:ee?.message??"\u89E3\u6790\u5931\u8D25"},{status:400})}let M=await t.orm.query.from("agents").select("id","name","webhook_platform","webhook_url","im_bind_dept","webhook_secret").where({type:{eq:"webhook"},im_bind_dept:{isNull:!1},is_active:{eq:!0}}).limit(1).run(),W=(Array.isArray(M)?M:[M])[0];if(!W?.im_bind_dept)throw new T("\u672A\u914D\u7F6E IM \u7ED1\u5B9A\u90E8\u95E8\uFF08Webhook Agent \u9700\u7ED1\u5B9A im_bind_dept\uFF09",404);let q=W.webhook_secret?String(W.webhook_secret):"";if(q){let{verifySignature:ee,checkNonce:pe,verifyDingtalkSign:je}=await Promise.resolve().then(()=>(Qi(),ad)),me=ee(x,P.headers.get("x-signature")??"",q,P.headers.get("x-timestamp")??void 0),Pe=P.headers.get("timestamp")??"",Ve=P.headers.get("sign")??"",Gs=Pe&&Ve?je(O,Pe,Ve,q):!1;if(!me&&!Gs)throw new T("\u7B7E\u540D\u6821\u9A8C\u5931\u8D25\uFF08\u9700 X-Signature \u6216\u9489\u9489 timestamp+sign\uFF09",403);if(!pe(P.headers.get("x-nonce")??void 0,P.headers.get("x-timestamp")??void 0))throw new T("\u91CD\u653E\u8BF7\u6C42",403)}let D="",B="",{handleNewMessageStreamSSE:z}=await Promise.resolve().then(()=>(Wn(),jr));await z(E,String(W.im_bind_dept),$.content,"",ee=>{B+=ee;let pe=B.match(/event: wf:done[\s\S]*?data: (\{[\s\S]*?\})\n\n/);if(pe)try{let je=JSON.parse(pe[1]);je.content&&(D=je.content)}catch{}}).catch(ee=>console.error("[im] \u5165\u7AD9\u5904\u7406\u5931\u8D25:",ee?.message??ee));let{formatOutboundBody:Y}=await Promise.resolve().then(()=>(sd(),rd)),te=Y(String(W.webhook_platform??"generic"),D||"\uFF08AI \u672A\u751F\u6210\u56DE\u590D\uFF09",$.conversationId);return new Response(te,{headers:{"Content-Type":"application/json"}})});let w=[],y=[],k=0,_=1e3;(async()=>{try{let P=await t.orm.query.from("survey_submissions").select("id","source","age","industry","rating","focus","feedback","submitted_at","campaign_id").orderBy("submitted_at","desc").limit(1e3).run()??[];k=Number((await t.orm.query.from("survey_submissions").count("*","n").run())[0]?.n??0);for(let x of[...P].reverse())y.push({id:String(x.id),source:String(x.source),submitted_at:String(x.submitted_at),age:String(x.age??""),industry:String(x.industry??""),rating:Number(x.rating??0),focus:x.focus,feedback:String(x.feedback??""),campaign:String(x.campaign_id??"")});let E=await t.orm.query.from("survey_answers").select("source","question","answer","created_at","campaign_id").orderBy("created_at","desc").limit(1e3).run()??[];for(let x of[...E].reverse())w.push({source:String(x.source),question:String(x.question),answer:String(x.answer),at:String(x.created_at),campaign:String(x.campaign_id??"")});console.log(`[survey] \u5DF2\u6062\u590D\u63D0\u4EA4 ${k} / \u7B54\u6848 ${E.length}`)}catch(P){console.warn("[survey] \u6062\u590D\u5931\u8D25:",P?.message)}})();let v=null,S=new Map,A=P=>{v?.send("survey-live",JSON.stringify(P))},C=()=>{let P={},E={},x={},O={},I=0;for(let $ of y){$.industry&&(P[String($.industry)]=(P[String($.industry)]??0)+1),$.age&&(E[String($.age)]=(E[String($.age)]??0)+1);let M=Number($.rating??0);M>0&&(x[String(M)]=(x[String(M)]??0)+1,I+=M);for(let W of $.focus??[])O[String(W)]=(O[String(W)]??0)+1}return{total:y.length,byIndustry:P,byAge:E,byRating:x,focus:O,avgRating:y.length>0?Math.round(I/y.length*10)/10:0,completionRate:y.length>0?100:0}},j=(P="")=>{let E=P?y.filter(O=>String(O.campaign??"")===P):y,x=P?w.filter(O=>String(O.campaign??"")===P):w;return{type:"survey:state",count:P?E.length:k,globalCount:k,campaign:P,answers:x.slice(-_),submissions:E.slice(-_),online:U(),aggregate:(()=>{let O={},I={},$={},M={},W=0;for(let q of E){q.industry&&(O[String(q.industry)]=(O[String(q.industry)]??0)+1),q.age&&(I[String(q.age)]=(I[String(q.age)]??0)+1);let D=Number(q.rating??0);D>0&&($[String(D)]=($[String(D)]??0)+1,W+=D);for(let B of q.focus??[])M[String(B)]=(M[String(B)]??0)+1}return{total:E.length,byIndustry:O,byAge:I,byRating:$,focus:M,avgRating:E.length>0?Math.round(W/E.length*10)/10:0,completionRate:E.length>0?100:0}})()}},K=600*1e3;setInterval(()=>{try{let P=Date.now(),E=!1;for(let[x,O]of S){let I=P-new Date(O.at).getTime();(x.readyState!==1||I>K)&&(S.delete(x),E=!0)}E&&H()}catch{}},30*1e3).unref();let U=()=>{let P=[...S.values()];return{count:P.length,sources:P.map(E=>E.source),submitted:P.filter(E=>E.submitted).map(E=>E.source)}},H=()=>{A({type:"survey:online",...U()})},V=fd(o,"..","..","..","..","dist");n.get("/static/ui-dom/index.js",async()=>{let{readFileSync:P}=await import("node:fs");return new Response(P(fd(V,"client","vdom","index.js"),"utf-8"),{headers:{"Content-Type":"text/javascript; charset=utf-8","Cache-Control":"no-store"}})}),n.get("/static/components/index.js",async()=>{let{readFileSync:P}=await import("node:fs");return new Response(P(fd(V,"client","components","index.js"),"utf-8"),{headers:{"Content-Type":"text/javascript; charset=utf-8","Cache-Control":"no-store"}})}),n.get("/demo-survey",async()=>{let{readFileSync:P}=await import("node:fs"),{join:E,dirname:x}=await import("node:path"),{fileURLToPath:O}=await import("node:url"),I=x(O(import.meta.url)),$=P(E(I,"public","survey-form.html"),"utf-8");return new Response($,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.post("/demo-survey/launch",async(P,E)=>{try{let x=["\u8D22\u52A1\u5C0F\u738B","\u5E02\u573A\u5C0F\u674E","\u4EA7\u54C1\u8001\u5F20","\u5BA2\u670D\u5C0F\u9648","\u7814\u53D1\u5927\u5218","\u4EBA\u4E8B\u5C0F\u5468","\u9500\u552E\u963F\u5F3A","\u8FD0\u8425\u5C0F\u8D75","\u884C\u653F\u9648\u59D0","\u5B9E\u4E60\u751F\u963F\u6CFD"],O=await t.orm.query.from("departments").select("id","name").where({name:{in:x},is_dm:{eq:!1}}).run(),I=new Map((O??[]).map(B=>[String(B.name),String(B.id)])),$=x.filter(B=>!I.has(B));if($.length>0)return Response.json({error:`\u7F3A\u5C11\u89D2\u8272\u90E8\u95E8\uFF1A${$.join("\u3001")}\uFF08\u5148\u8DD1 seed-survey-agents.mjs\uFF09`},{status:404});let[M]=await t.orm.query.from("agents").where({app_id:{eq:E.appId},type:{eq:"user"}}).select("id").limit(1).run(),W=M?String(M.id):"system",{handleNewMessageStream:q}=await Promise.resolve().then(()=>(Wn(),jr)),D=process.env.PUBLIC_BASE_URL??`http://localhost:${process.env.PORT??3e3}`;return(async()=>{let Y=0;for(let te=0;te<x.length;te+=3){let ee=x.slice(te,te+3);console.log(`[launch] \u7B2C ${te/3+1} \u6279\u6D3E\u5355\uFF1A${ee.join("\u3001")}`),await Promise.allSettled(ee.map(async pe=>{let je=`@${pe} \u3010\u65B0\u4EFB\u52A1\u3011\u8BF7\u91CD\u65B0\u6253\u5F00\u95EE\u5377 ${D}/demo-survey?s=${encodeURIComponent(pe)} \u5E76\u5B8C\u6574\u586B\u5199\u63D0\u4EA4\uFF08\u8FD9\u662F\u65B0\u4E00\u8F6E\u586B\u5199\u4EFB\u52A1\u2014\u2014\u5373\u4F7F\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u6709\u65E7\u7684 survey-result.json \u4E5F\u8981\u91CD\u65B0\u586B\u5199\u5E76\u8986\u76D6\u66F4\u65B0\u5B83\uFF09\u3002\u5B8C\u6210\u540E\u628A\u672C\u8F6E\u4F5C\u7B54\u7ED3\u679C\u5199\u5165\u5DE5\u4F5C\u76EE\u5F55 survey-result.json\uFF08\u8986\u76D6\u65E7\u6587\u4EF6\uFF09\uFF0C\u5E76\u6267\u884C agent-browser close \u5173\u95ED\u6D4F\u89C8\u5668\u3002`,me=()=>q(E,String(I.get(pe)),W,je,"");try{await me(),Y++}catch(Pe){console.error(`[launch] \u6D3E\u5355\u5931\u8D25 ${pe}:`,Pe?.message??Pe),await new Promise(Ve=>setTimeout(Ve,3e3));try{await me(),Y++}catch(Ve){console.error(`[launch] \u91CD\u8BD5\u5931\u8D25 ${pe}:`,Ve?.message??Ve)}}})),te+3<x.length&&await new Promise(pe=>setTimeout(pe,1e4))}console.log(`[launch] \u6D3E\u5355\u5B8C\u6210\uFF1A${Y}/${x.length} \u4E2A\u89D2\u8272\uFF08\u5E76\u53D1\u72EC\u7ACB\u6C99\u76D2\uFF09`)})(),Response.json({success:!0,sent:x.length,scheduling:!0,roles:x})}catch(x){return Response.json({error:x?.message??"launch \u5931\u8D25"},{status:500})}}),n.get("/demo-survey/campaigns",async()=>{let{readFileSync:P}=await import("node:fs"),{join:E,dirname:x}=await import("node:path"),{fileURLToPath:O}=await import("node:url"),I=x(O(import.meta.url)),$=P(E(I,"public","survey-campaigns.html"),"utf-8");return new Response($,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.get("/api/survey/campaigns-list",async()=>{try{let P=await t.orm.query.from("survey_campaigns").select("id","status","total","completed","failed","created_at").orderBy("created_at","desc").limit(50).run()??[],E=P.map($=>String($.id)),x=E.length?await t.orm.query.from("survey_submissions").select("campaign_id").count("*","submitted",{campaign_id:{in:E}}).groupBy("campaign_id").run():[],O=new Map(x.map($=>[String($.campaign_id),Number($.submitted??0)])),I=P.map($=>({...$,id:String($.id),submitted:O.get(String($.id))??0}));return Response.json({list:I})}catch(P){return Response.json({error:P?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/demo-survey/stats",async()=>{let{readFileSync:P}=await import("node:fs"),{join:E,dirname:x}=await import("node:path"),{fileURLToPath:O}=await import("node:url"),I=x(O(import.meta.url)),$=P(E(I,"public","survey-stats.html"),"utf-8");return new Response($,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.use(ui()),gy(n,o);let Q=Number(process.env.PORT??3e3)}async function _R(){await ch();let n=new lt,e=await xw(n);Nw(n,e),await Ty(n,e);let t=Number(process.env.PORT??3e3),r=rc(n,{port:t});t!==0&&console.log(`[agent-platform] http://localhost:${t}`)}_R().catch(n=>{console.error("[agent-platform] \u542F\u52A8\u5931\u8D25:",n),process.exit(1)});
585
+ `})}}async function Ey(n,e){let{pg:t,redisClient:r,eventsPg:s,currentCtx:o}=e,i=new lt;i.onError(M=>Ae(M)),i.use((M,O,E)=>(O.auth.requireAuth(),E(M,O))),i.use(async(M,O,E)=>{if(String(M.url??"").includes("/api/admin/"))return E(M,O);let x=O;if(x.appId&&(await x.orm.query.from("_weifuwu_apps").select("status").where({id:{eq:x.appId}}).run())[0]?.status==="disabled")throw new T("\u8BE5\u56E2\u961F\u5DF2\u88AB\u505C\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458",403);return E(M,O)}),Iw(i);let a=t.orm.gql(Z(t.orm).agents,{hidden:["webhook_secret"]});i.use(mi("/api/gql",async(M,O)=>({schema:a.typeDefs,resolvers:a.resolvers,context:()=>({orm:O.orm,appId:O.appId})})));let l=qo({orm:t.orm,redis:r?.redis});n.use(l),await t.migrateModule("weifuwu-workflows",Do),l.routes(i),l.scheduler.start(),await Fw(i),Kw(i),Gw(i),i.get("/api/departments/:id/executions",async(M,O)=>{let{orm:E,appId:x,params:P}=O,[N]=await E.query.from("departments").select("id").where({id:{eq:P.id},app_id:{eq:x}}).run();if(!N)throw new T("\u90E8\u95E8\u4E0D\u5B58\u5728",404);let{manager:D}=await Promise.resolve().then(()=>(Se(),Te));D.init(E);let{sandbox:q}=await Promise.resolve().then(()=>(Le(),ze)),B=await E.query.from("department_members dm").join("agents a",{"a.id":{col:"dm.agent_id"}}).select("a.id","a.name","a.role_label","a.type","a.department_id").where({"dm.department_id":{eq:P.id},"a.type":{in:["ai","department"]}}).run(),[$]=await E.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).max("m.created_at","at").where({"m.department_id":{eq:P.id},"a.type":{eq:"user"}}).run(),j=$?.at?new Date(String($.at)).getTime():Date.now(),H=Date.now(),z=[];for(let ee of B??[]){let te=String(ee.id),ge=ee.department_id?String(ee.department_id):P.id,Ce=null;try{Ce=await D.byDepartment(ge)}catch{Ce=null}let pe=Ce?q.runningExecs.get(String(Ce.id))??null:null,xe=null,Vr=!1;if(Ce){let Xs=await D.eventHistory(String(Ce.id),10);xe=Xs[0]??null,Vr=Xs.some(pn=>(pn.type.includes("error")||pn.type.includes("timeout"))&&H-new Date(pn.created_at).getTime()<10*6e4)}let Un=null;try{let{resolveDepartmentWorkspace:Xs}=await Promise.resolve().then(()=>(Ne(),De)),pn=await Xs(ge,null,!0);if(pn){let{readdir:Ty,stat:Cy}=await import("node:fs/promises"),{join:Ay}=await import("node:path"),Oy=await Ty(pn).catch(()=>[]),Ys=null;for(let oa of Oy)if(!oa.startsWith("."))try{let ia=await Cy(Ay(pn,oa));ia.isFile()&&(!Ys||ia.mtimeMs>Ys.mtime)&&(Ys={path:oa,mtime:ia.mtimeMs})}catch{}Un=Ys}}catch{}let Bn="idle",Zs=Un&&Un.mtime>j;pe?Bn="working":Vr&&!Zs?Bn="failed":Zs?Bn="done":H-j>5*6e4&&!Zs?Bn="stalled":H-j>3e4&&(Bn="waiting"),z.push({agentId:te,name:String(ee.name),roleLabel:ee.role_label??null,type:String(ee.type),status:Bn,runningExec:pe?{tool:pe.tool,elapsedMs:H-pe.startedAt,timeoutMs:pe.timeoutMs}:null,lastEvent:xe?{type:xe.type,detail:xe.detail,created_at:xe.created_at}:null,artifact:Zs&&Un?{path:Un.path,mtime:new Date(Un.mtime).toISOString()}:null})}let Y=z.filter(ee=>ee.status==="done").length;return Response.json({tasks:z,progress:{done:Y,total:z.length}})}),Qw(i);let{startHostReporting:u}=await Promise.resolve().then(()=>(wy(),hy));u();let{checkHostHealth:c}=await Promise.resolve().then(()=>(vy(),_y));setInterval(()=>{let M=c();(M.down.length>0||M.up.length>0)&&console.log(`[sandbox] \u5BBF\u4E3B\u5065\u5EB7\uFF1Adown=${M.down.join(",")||"-"} up=${M.up.join(",")||"-"}`)},6e4).unref?.(),Jw(i);let{registerBrowserWarmContract:p,registerExecTimeoutContract:f,startEventContracts:w}=await Promise.resolve().then(()=>(Sy(),ky));p(),f(),w(),Zw(i),Xw(i),ry(i),setImmediate(async()=>{try{let{markInterrupted:M}=await Promise.resolve().then(()=>(_t(),Pt)),O=await M({sql:t,appId:""});O>0&&console.log(`[campaign] \u542F\u52A8\u6062\u590D\uFF1A${O} \u4E2A\u8FD0\u884C\u4E2D campaign \u6807\u8BB0 interrupted\uFF08\u53EF retry \u6062\u590D\uFF09`)}catch{}}),sy(i),nd(i),iy(i),ay(i),ly(n),i.get("/api/ops",async(M,O)=>{let{getLicenseInfo:E}=await Promise.resolve().then(()=>(od(),sd)),x=E(),P={available:!1};try{let{sandbox:D}=await Promise.resolve().then(()=>(Le(),ze)),q=await D.status();P={available:q.available,enabled:q.enabled,imageReady:q.imageReady,mode:q.mode,poolSize:q.poolSize,maxContainers:q.maxContainers}}catch{}let N=0;try{let[D]=await O.orm.query.from("audit_logs").count("*","n").where({created_at:{gte:Q.nowAgo(1,"day")},app_id:{eq:O.appId}}).run();N=Number(D?.n??0)}catch{}return Response.json({sandbox:P,auditToday:N,license:x})}),i.get("/api/audit",async(M,O)=>{let{listAudit:E}=await Promise.resolve().then(()=>(st(),rt)),x=new URL(M.url??"","http://localhost"),P=Number(x.searchParams.get("limit")??50),N=x.searchParams.get("action")??void 0,D=x.searchParams.get("from")??void 0,q=x.searchParams.get("to")??void 0;for(let[$,j]of[["from",D],["to",q]])if(j!==void 0&&Number.isNaN(Date.parse(j)))return Response.json({error:`${$} \u975E\u6CD5\uFF08\u9700 ISO \u65F6\u95F4\u683C\u5F0F\uFF09`},{status:400});let B=await E(O,{limit:P,action:N,from:D,to:q});return Response.json(B)}),i.get("/api/settings/ai-config",async(M,O)=>{let{getByokConfig:E}=await Promise.resolve().then(()=>(Rc(),Lh)),x=await E(O.orm,O.appId);return Response.json({baseUrl:x?.base_url??"",apiKey:x?.api_key?"******":"",apiKeySet:!!x?.api_key,model:x?.model??""})}),i.put("/api/settings/ai-config",async(M,O)=>{let{orm:E,appId:x}=O,P=await M.json();if(P.clear)return await E.query.delete("app_ai_configs").where({app_id:{eq:x}}).run(),Response.json({ok:!0,cleared:!0});let[N]=await E.query.from("app_ai_configs").select("api_key").where({app_id:{eq:x}}).run(),D=P.apiKey?.trim()?P.apiKey.trim():String(N?.api_key??"");await E.query.insert("app_ai_configs").rows([{app_id:x,base_url:P.baseUrl?.trim()??null,api_key:D||null,model:P.model?.trim()??null,updated_at:Q.now()}]).onConflict("app_id",!0).run();try{let{writeAudit:q}=await Promise.resolve().then(()=>(st(),rt));await q(O,{action:"byok_update",target_type:"app",target_id:x,detail:{baseUrl:P.baseUrl??null,model:P.model??null}})}catch{}return Response.json({ok:!0})}),i.get("/api/audit/export",async(M,O)=>{let{listAudit:E}=await Promise.resolve().then(()=>(st(),rt)),P=new URL(M.url??"","http://localhost").searchParams.get("action")??void 0,{entries:N}=await E(O,{limit:100,action:P}),D=j=>`"${String(j??"").replace(/"/g,'""')}"`,q="\u65F6\u95F4,\u64CD\u4F5C,\u64CD\u4F5C\u4EBA,\u76EE\u6807\u7C7B\u578B,\u8BE6\u60C5",B=N.map(j=>[j.created_at??"",j.action??"",j.user_name??"",j.target_type??"",JSON.stringify(j.detail??"")].map(D).join(",")),$="\uFEFF"+[q,...B].join(`
586
+ `);return new Response($,{headers:{"Content-Type":"text/csv; charset=utf-8","Content-Disposition":`attachment; filename="audit-${O.appId.slice(0,8)}-${Date.now()}.csv"`}})}),i.put("/api/auth/profile",async(M,O)=>{let{orm:E,auth:x}=O,P=await M.json();if(!P.name?.trim())throw new T("name \u4E0D\u80FD\u4E3A\u7A7A",400);let[N]=await E.query.update("_weifuwu_users").set({name:P.name.trim()}).where({id:{eq:x.userId}}).returning("id","email","name","role","created_at").run();return Response.json({user:N})}),i.get("/api/auth/export",async(M,O)=>{let{orm:E,auth:x}=O,P=x.userId,[N]=await E.query.from("_weifuwu_users").select("id","email","name","created_at").where({id:{eq:P}}).run(),D=await E.query.from("_weifuwu_app_members m").join("_weifuwu_apps a",{"a.id":{col:"m.app_id"}}).select("a.slug","a.name","m.role").where({"m.user_id":{eq:P}}).run(),q=await E.query.from("agents").select("id","app_id","type","name","description","created_at").where({user_id:{eq:P}}).run(),B=await E.query.from("messages m").join("agents a",{"a.id":{col:"m.sender_id"}}).select("m.id","m.department_id","m.content","m.msg_type","m.created_at").where({"a.user_id":{eq:P}}).run(),$={profile:N,memberships:D,agents:q,messages:B};return new Response(JSON.stringify($,null,2),{headers:{"Content-Type":"application/json","Content-Disposition":'attachment; filename="my-data.json"'}})}),i.delete("/api/auth/account",async(M,O)=>{let{orm:E,auth:x}=O,P=x.userId;await E.query.update("_weifuwu_users").set({email:`deleted-${String(P).slice(0,8)}@deleted.local`,name:"\u5DF2\u5220\u9664\u7528\u6237",password_hash:null}).where({id:{eq:P}}).run(),await E.query.update("agents").set({is_active:!1,name:"\u5DF2\u5220\u9664\u7528\u6237"}).where({user_id:{eq:P}}).run(),await E.query.delete("_weifuwu_app_members").where({user_id:{eq:P}}).run(),await E.query.delete("_weifuwu_sessions").where({user_id:{eq:P}}).run();try{let{writeAudit:N}=await Promise.resolve().then(()=>(st(),rt));await N(O,{action:"account_deleted",target_type:"user",target_id:String(P),detail:{}})}catch{}return Response.json({success:!0,message:"\u8D26\u53F7\u5DF2\u5220\u9664\uFF08\u6570\u636E\u5DF2\u533F\u540D\u5316\uFF09"})}),i.put("/api/auth/password",async(M,O)=>{let{orm:E,auth:x}=O,P=await M.json();if(!P.currentPassword||!P.newPassword)throw new T("currentPassword \u548C newPassword \u4E3A\u5FC5\u586B",400);if(P.newPassword.length<6)throw new T("\u65B0\u5BC6\u7801\u81F3\u5C11 6 \u4F4D",400);let[N]=await E.query.from("_weifuwu_users").select("password_hash").where({id:{eq:x.userId}}).run();if(!N)throw new T("\u7528\u6237\u4E0D\u5B58\u5728",404);if(!await Dt(P.currentPassword,N.password_hash))throw new T("\u5F53\u524D\u5BC6\u7801\u9519\u8BEF",403);let q=await vt(P.newPassword);return await E.query.update("_weifuwu_users").set({password_hash:q}).where({id:{eq:x.userId}}).run(),Response.json({success:!0})}),i.get("/api/sandbox/containers",async(M,O)=>{let{sandbox:E}=await Promise.resolve().then(()=>(Le(),ze)),{orm:x}=O,P=await E.listContainers(),N=P.map($=>String($.name??"").replace("ap-sandbox-","")),D=N.length>0?await x.query.from("agents").select("id","name","type").where({id:{in:N}}).run():[],q=new Map((Array.isArray(D)?D:[]).map($=>[String($.id),String($.name??$.id)])),B=[];for(let $ of P){let j=await E.containerStats(String($.name));B.push({name:$.name,status:$.status,image:$.image,createdAt:$.createdAt,agentName:q.get(String($.name).replace("ap-sandbox-",""))??"\u672A\u77E5",...j??{}})}return Response.json({containers:B})}),i.get("/api/sandbox/containers/:name/processes",async(M,O)=>{let{sandbox:E}=await Promise.resolve().then(()=>(Le(),ze)),x=await E.containerProcesses(O.params.name);return Response.json({name:O.params.name,processes:x})}),i.post("/api/sandbox/containers/:name/:action",async(M,O)=>{let{sandbox:E}=await Promise.resolve().then(()=>(Le(),ze)),x=O.params.action;if(!["stop","start","restart","rm"].includes(x))throw new T("\u4E0D\u652F\u6301\u7684 action",400);let P=await E.containerAction(O.params.name,x);return P.ok?Response.json(P):Response.json({error:P.message},{status:400})}),n.mount("/",i);let m=Ao({orm:t.orm,redis:r?.redis});await t.migrateModule("weifuwu-messager",Oo),n.use(m),n.use(co({from:process.env.EMAIL_FROM??"no-reply@agent-platform.local",...process.env.EMAIL_API_KEY||process.env.RESEND_API_KEY?{apiKey:process.env.EMAIL_API_KEY??process.env.RESEND_API_KEY}:{adapter:(async()=>({ok:!0,id:"noop"}))}})),n.ws("/ws",m.client.handler()),process.env.WF_TEST_HOOKS==="1"&&(n.post("/api/test/orm",async M=>{try{let O=await M.json();if(!O.query||typeof O.query!="object")throw new T("query \u5FC5\u586B\uFF08Query AST\uFF09",400);let E=await t.orm.execute(O.query);return Response.json({ok:!0,rows:E})}catch(O){return Response.json({error:String(O?.message??O)},{status:500})}}),n.post("/api/test/wf",async M=>{try{let O=await M.json();if(!O.room||!Array.isArray(O.events))throw new T("room/events \u5FC5\u586B",400);for(let E of O.events)m.client.broadcast(O.room,E);return Response.json({ok:!0,pushed:O.events.length})}catch(O){return Response.json({error:String(O?.message??O)},{status:500})}})),n.ws("/sandbox-host",{open:M=>{M.send(JSON.stringify({type:"host:ack"}))},message:async(M,O,E)=>{try{let x=JSON.parse(String(E)),{hostEventIngest:P}=await Promise.resolve().then(()=>(Ye(),Ln));if(x?.type==="sandbox:event"&&x.event?.entity==="sandbox")P(x.event);else if(x?.type==="host:ping"){let{sandboxEmit:N}=await Promise.resolve().then(()=>(Ye(),Ln));N("host:ping",x.hostId,{hostId:x.hostId,ts:x.ts})}else if(x?.type==="host:register"){let{sandboxEmit:N}=await Promise.resolve().then(()=>(Ye(),Ln));N("host:register",void 0,{hostId:x.hostId,capacity:x.capacity,at:new Date().toISOString()})}}catch{}}}),n.ws("/survey-live",{open:(M,O)=>{O.hub.join("survey-live",M),_=O.hub},message:async(M,O,E)=>{try{let x=JSON.parse(String(E));if(x.type==="ping"){M.send(JSON.stringify({type:"pong"}));return}if(x.type==="survey:hello"&&x.source){let P=String(x.source).slice(0,40);for(let[N,D]of v)if(D.source===P&&N!==M){v.delete(N);try{N.close()}catch{}}if(P==="stats-view"){M.send(JSON.stringify(C(String(x.campaign??""))));return}v.set(M,{source:P,at:new Date().toISOString()}),U(),x.campaign!==void 0?M.send(JSON.stringify(C(String(x.campaign??"")))):M.send(JSON.stringify(C()));return}if(x.type==="survey:answer"&&x.question){let P=v.get(M);P&&(P.at=new Date().toISOString());let N={source:String(x.source??"\u8BBF\u5BA2"),question:String(x.question).slice(0,100),answer:String(x.answer??"").slice(0,300),at:new Date().toISOString(),campaign:String(x.campaign??"")};g.push(N),g.length>k&&g.splice(0,g.length-k),t.orm.query.insert("survey_answers").values({source:String(N.source),question:String(N.question),answer:String(N.answer),campaign_id:String(N.campaign)||null}).run().catch(D=>{console.error("[survey] \u9010\u9898\u843D\u5E93\u5931\u8D25:",D?.message??D)}),S({type:"survey:answer",...N})}else if(x.type==="survey:submit"&&x.data){let P=x.data,N=String(P.campaign??"");if(!N)try{let[B]=await t.orm.query.from("survey_campaign_runs").where({agent_name:{eq:String(x.source??"")}}).select("campaign_id").orderBy("created_at","desc").limit(1).run();N=B?String(B.campaign_id):""}catch{}let D={id:Date.now().toString(36)+Math.random().toString(36).slice(2,6),source:String(x.source??"\u8BBF\u5BA2"),submitted_at:new Date().toISOString(),age:String(P.age??""),industry:String(P.industry??""),rating:Number(P.rating??0),focus:Array.isArray(P.focus)?P.focus:P.focus?[P.focus]:[],feedback:String(P.feedback??"").slice(0,500),campaign:N};h.push(D),h.length>k&&h.splice(0,h.length-k),b++;try{await t.orm.query.insert("survey_submissions").values({id:String(D.id),source:String(D.source),age:String(D.age),industry:String(D.industry),rating:Number(D.rating),focus:(()=>{try{return JSON.parse(String(D.focus))}catch{return String(D.focus)}})(),feedback:String(D.feedback),submitted_at:String(D.submitted_at),campaign_id:String(D.campaign)||null}).run()}catch(B){console.error("[survey] \u63D0\u4EA4\u843D\u5E93\u5931\u8D25\uFF08\u5B8C\u6210\u4FE1\u53F7\u4E22\u5931\u98CE\u9669\u2014\u2014source=%s id=%s\uFF09:",String(D.source),String(D.id),B?.message??B)}S({type:"survey:submitted",count:b,latest:D,aggregate:A()});let q=v.get(M);q&&(q.submitted=!0,q.at=new Date().toISOString(),U())}x.type==="survey:bye"&&v.delete(M)&&U()}catch{}},close:(M,O)=>{O.hub.leave(M),v.delete(M)&&U()}}),n.post("/api/webhook/:agentId",async(M,O)=>{try{if(Number(M.headers.get("content-length")??0)>64*1024)throw new T("Request body too large (max 64KB)",413);let x=await M.json(),{planBlockForApp:P}=await Promise.resolve().then(()=>(Zi(),cd)),[N]=await O.orm.query.from("agents").where({id:{eq:O.params.agentId},type:{eq:"webhook"}}).select("app_id").limit(1).run(),D=N?String(N.app_id??""):"";if(D){let $=await P(O,D);if($)return Response.json({error:$},{status:402})}let q=M.headers.get("x-signature")??void 0,B=await ud(O,O.params.agentId,x,void 0,q,M.headers.get("x-timestamp")??void 0,M.headers.get("x-nonce")??void 0);return Response.json(B)}catch(E){let x=E instanceof Error?E.message:String(E),P=x.includes("Missing")?401:x.includes("Invalid")||x.includes("Replay")?403:400;return Response.json({error:x},{status:P})}}),n.post("/api/im/:platform",async(M,O)=>{let E=await M.text().catch(()=>""),x={};try{x=E?JSON.parse(E):{}}catch{throw new T("\u65E0\u6548 JSON",400)}let{parseImInbound:P}=await Promise.resolve().then(()=>(Ry(),xy)),N;try{N=P(O.params.platform,x)}catch(ee){return Response.json({error:ee?.message??"\u89E3\u6790\u5931\u8D25"},{status:400})}let D=await t.orm.query.from("agents").select("id","name","webhook_platform","webhook_url","im_bind_dept","webhook_secret").where({type:{eq:"webhook"},im_bind_dept:{isNull:!1},is_active:{eq:!0}}).limit(1).run(),q=(Array.isArray(D)?D:[D])[0];if(!q?.im_bind_dept)throw new T("\u672A\u914D\u7F6E IM \u7ED1\u5B9A\u90E8\u95E8\uFF08Webhook Agent \u9700\u7ED1\u5B9A im_bind_dept\uFF09",404);let B=q.webhook_secret?String(q.webhook_secret):"";if(B){let{verifySignature:ee,checkNonce:te,verifyDingtalkSign:ge}=await Promise.resolve().then(()=>(Zi(),cd)),Ce=ee(E,M.headers.get("x-signature")??"",B,M.headers.get("x-timestamp")??void 0),pe=M.headers.get("timestamp")??"",xe=M.headers.get("sign")??"",Vr=pe&&xe?ge(x,pe,xe,B):!1;if(!Ce&&!Vr)throw new T("\u7B7E\u540D\u6821\u9A8C\u5931\u8D25\uFF08\u9700 X-Signature \u6216\u9489\u9489 timestamp+sign\uFF09",403);if(!te(M.headers.get("x-nonce")??void 0,M.headers.get("x-timestamp")??void 0))throw new T("\u91CD\u653E\u8BF7\u6C42",403)}let $="",j="",{handleNewMessageStreamSSE:H}=await Promise.resolve().then(()=>(Wn(),Lr));await H(O,String(q.im_bind_dept),N.content,"",ee=>{j+=ee;let te=j.match(/event: wf:done[\s\S]*?data: (\{[\s\S]*?\})\n\n/);if(te)try{let ge=JSON.parse(te[1]);ge.content&&($=ge.content)}catch{}}).catch(ee=>console.error("[im] \u5165\u7AD9\u5904\u7406\u5931\u8D25:",ee?.message??ee));let{formatOutboundBody:z}=await Promise.resolve().then(()=>(ad(),id)),Y=z(String(q.webhook_platform??"generic"),$||"\uFF08AI \u672A\u751F\u6210\u56DE\u590D\uFF09",N.conversationId);return new Response(Y,{headers:{"Content-Type":"application/json"}})});let g=[],h=[],b=0,k=1e3;(async()=>{try{let M=await t.orm.query.from("survey_submissions").select("id","source","age","industry","rating","focus","feedback","submitted_at","campaign_id").orderBy("submitted_at","desc").limit(1e3).run()??[];b=Number((await t.orm.query.from("survey_submissions").count("*","n").run())[0]?.n??0);for(let E of[...M].reverse())h.push({id:String(E.id),source:String(E.source),submitted_at:String(E.submitted_at),age:String(E.age??""),industry:String(E.industry??""),rating:Number(E.rating??0),focus:E.focus,feedback:String(E.feedback??""),campaign:String(E.campaign_id??"")});let O=await t.orm.query.from("survey_answers").select("source","question","answer","created_at","campaign_id").orderBy("created_at","desc").limit(1e3).run()??[];for(let E of[...O].reverse())g.push({source:String(E.source),question:String(E.question),answer:String(E.answer),at:String(E.created_at),campaign:String(E.campaign_id??"")});console.log(`[survey] \u5DF2\u6062\u590D\u63D0\u4EA4 ${b} / \u7B54\u6848 ${O.length}`)}catch(M){console.warn("[survey] \u6062\u590D\u5931\u8D25:",M?.message)}})();let _=null,v=new Map,S=M=>{_?.send("survey-live",JSON.stringify(M))},A=()=>{let M={},O={},E={},x={},P=0;for(let N of h){N.industry&&(M[String(N.industry)]=(M[String(N.industry)]??0)+1),N.age&&(O[String(N.age)]=(O[String(N.age)]??0)+1);let D=Number(N.rating??0);D>0&&(E[String(D)]=(E[String(D)]??0)+1,P+=D);for(let q of N.focus??[])x[String(q)]=(x[String(q)]??0)+1}return{total:h.length,byIndustry:M,byAge:O,byRating:E,focus:x,avgRating:h.length>0?Math.round(P/h.length*10)/10:0,completionRate:h.length>0?100:0}},C=(M="")=>{let O=M?h.filter(x=>String(x.campaign??"")===M):h,E=M?g.filter(x=>String(x.campaign??"")===M):g;return{type:"survey:state",count:M?O.length:b,globalCount:b,campaign:M,answers:E.slice(-k),submissions:O.slice(-k),online:G(),aggregate:(()=>{let x={},P={},N={},D={},q=0;for(let B of O){B.industry&&(x[String(B.industry)]=(x[String(B.industry)]??0)+1),B.age&&(P[String(B.age)]=(P[String(B.age)]??0)+1);let $=Number(B.rating??0);$>0&&(N[String($)]=(N[String($)]??0)+1,q+=$);for(let j of B.focus??[])D[String(j)]=(D[String(j)]??0)+1}return{total:O.length,byIndustry:x,byAge:P,byRating:N,focus:D,avgRating:O.length>0?Math.round(q/O.length*10)/10:0,completionRate:O.length>0?100:0}})()}},W=600*1e3;setInterval(()=>{try{let M=Date.now(),O=!1;for(let[E,x]of v){let P=M-new Date(x.at).getTime();(E.readyState!==1||P>W)&&(v.delete(E),O=!0)}O&&U()}catch{}},30*1e3).unref();let G=()=>{let M=[...v.values()];return{count:M.length,sources:M.map(O=>O.source),submitted:M.filter(O=>O.submitted).map(O=>O.source)}},U=()=>{S({type:"survey:online",...G()})},F=Fr(je,"..","..","..","..","dist");n.get("/static/ui-dom/index.js",async()=>{let{readFileSync:M}=await import("node:fs");return new Response(M(Fr(F,"client","vdom","index.js"),"utf-8"),{headers:{"Content-Type":"text/javascript; charset=utf-8","Cache-Control":"no-store"}})}),n.get("/static/components/index.js",async()=>{let{readFileSync:M}=await import("node:fs");return new Response(M(Fr(F,"client","components","index.js"),"utf-8"),{headers:{"Content-Type":"text/javascript; charset=utf-8","Cache-Control":"no-store"}})}),n.get("/demo-survey",async()=>{let{readFileSync:M}=await import("node:fs"),O=M(Fr(je,"public","survey-form.html"),"utf-8");return new Response(O,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.post("/demo-survey/launch",async(M,O)=>{try{let E=["\u8D22\u52A1\u5C0F\u738B","\u5E02\u573A\u5C0F\u674E","\u4EA7\u54C1\u8001\u5F20","\u5BA2\u670D\u5C0F\u9648","\u7814\u53D1\u5927\u5218","\u4EBA\u4E8B\u5C0F\u5468","\u9500\u552E\u963F\u5F3A","\u8FD0\u8425\u5C0F\u8D75","\u884C\u653F\u9648\u59D0","\u5B9E\u4E60\u751F\u963F\u6CFD"],x=await t.orm.query.from("departments").select("id","name").where({name:{in:E},is_dm:{eq:!1}}).run(),P=new Map((x??[]).map(j=>[String(j.name),String(j.id)])),N=E.filter(j=>!P.has(j));if(N.length>0)return Response.json({error:`\u7F3A\u5C11\u89D2\u8272\u90E8\u95E8\uFF1A${N.join("\u3001")}\uFF08\u5148\u8DD1 seed-survey-agents.mjs\uFF09`},{status:404});let[D]=await t.orm.query.from("agents").where({app_id:{eq:O.appId},type:{eq:"user"}}).select("id").limit(1).run(),q=D?String(D.id):"system",{handleNewMessageStream:B}=await Promise.resolve().then(()=>(Wn(),Lr)),$=process.env.PUBLIC_BASE_URL??`http://localhost:${process.env.PORT??3e3}`;return(async()=>{let z=0;for(let Y=0;Y<E.length;Y+=3){let ee=E.slice(Y,Y+3);console.log(`[launch] \u7B2C ${Y/3+1} \u6279\u6D3E\u5355\uFF1A${ee.join("\u3001")}`),await Promise.allSettled(ee.map(async te=>{let ge=`@${te} \u3010\u65B0\u4EFB\u52A1\u3011\u8BF7\u91CD\u65B0\u6253\u5F00\u95EE\u5377 ${$}/demo-survey?s=${encodeURIComponent(te)} \u5E76\u5B8C\u6574\u586B\u5199\u63D0\u4EA4\uFF08\u8FD9\u662F\u65B0\u4E00\u8F6E\u586B\u5199\u4EFB\u52A1\u2014\u2014\u5373\u4F7F\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u6709\u65E7\u7684 survey-result.json \u4E5F\u8981\u91CD\u65B0\u586B\u5199\u5E76\u8986\u76D6\u66F4\u65B0\u5B83\uFF09\u3002\u5B8C\u6210\u540E\u628A\u672C\u8F6E\u4F5C\u7B54\u7ED3\u679C\u5199\u5165\u5DE5\u4F5C\u76EE\u5F55 survey-result.json\uFF08\u8986\u76D6\u65E7\u6587\u4EF6\uFF09\uFF0C\u5E76\u6267\u884C agent-browser close \u5173\u95ED\u6D4F\u89C8\u5668\u3002`,Ce=()=>B(O,String(P.get(te)),q,ge,"");try{await Ce(),z++}catch(pe){console.error(`[launch] \u6D3E\u5355\u5931\u8D25 ${te}:`,pe?.message??pe),await new Promise(xe=>setTimeout(xe,3e3));try{await Ce(),z++}catch(xe){console.error(`[launch] \u91CD\u8BD5\u5931\u8D25 ${te}:`,xe?.message??xe)}}})),Y+3<E.length&&await new Promise(te=>setTimeout(te,1e4))}console.log(`[launch] \u6D3E\u5355\u5B8C\u6210\uFF1A${z}/${E.length} \u4E2A\u89D2\u8272\uFF08\u5E76\u53D1\u72EC\u7ACB\u6C99\u76D2\uFF09`)})(),Response.json({success:!0,sent:E.length,scheduling:!0,roles:E})}catch(E){return Response.json({error:E?.message??"launch \u5931\u8D25"},{status:500})}}),n.get("/demo-survey/campaigns",async()=>{let{readFileSync:M}=await import("node:fs"),O=M(Fr(je,"public","survey-campaigns.html"),"utf-8");return new Response(O,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.get("/api/survey/campaigns-list",async()=>{try{let M=await t.orm.query.from("survey_campaigns").select("id","status","total","completed","failed","created_at").orderBy("created_at","desc").limit(50).run()??[],O=M.map(N=>String(N.id)),E=O.length?await t.orm.query.from("survey_submissions").select("campaign_id").count("*","submitted",{campaign_id:{in:O}}).groupBy("campaign_id").run():[],x=new Map(E.map(N=>[String(N.campaign_id),Number(N.submitted??0)])),P=M.map(N=>({...N,id:String(N.id),submitted:x.get(String(N.id))??0}));return Response.json({list:P})}catch(M){return Response.json({error:M?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/demo-survey/stats",async()=>{let{readFileSync:M}=await import("node:fs"),O=M(Fr(je,"public","survey-stats.html"),"utf-8");return new Response(O,{headers:{"Content-Type":"text/html; charset=utf-8"}})}),n.use(di()),fy(n,je);let K=Number(process.env.PORT??3e3)}async function hR(){await ph();let n=new lt,e=await Ew(n);Nw(n,e),await Ey(n,e);let t=Number(process.env.PORT??3e3),r=ic(n,{port:t});t!==0&&console.log(`[agent-platform] http://localhost:${t}`)}hR().catch(n=>{console.error("[agent-platform] \u542F\u52A8\u5931\u8D25:",n),process.exit(1)});