weifuwu 0.95.1 → 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.
- package/dist/level6/apps/agent-platform/scripts/seed.mjs +18 -9
- package/dist/level6/apps/agent-platform/server.js +26 -26
- package/dist/level6/index.js +9 -0
- package/dist/level6/server/user/index.js +1 -1
- package/dist/level6/server/user/index.ts +12 -0
- package/dist/server/index.js +9 -0
- package/dist/server/user/index.js +1 -1
- package/docs/level.md +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
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 E,ze=I(()=>{"use strict";E=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 E("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 E("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 E){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();ze();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
|
|
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
|
|
@@ -12,8 +12,8 @@ Upgrade: websocket\r
|
|
|
12
12
|
Connection: Upgrade\r
|
|
13
13
|
Sec-WebSocket-Accept: ${c}\r
|
|
14
14
|
\r
|
|
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
|
|
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";ze();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 E||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 $=Math.min(Number(K[2]),m.size);v=m.size-$,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 E(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";ze();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 E(`email: \u4E0A\u6E38\u8D85\u65F6 after ${r}ms`,502):new E(`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 E(`email: \u4E0A\u6E38 ${a.status}${l.message?` ${l.message}`:""}`,502);return{id:l.id,accepted:!0}}}}var Oa=I(()=>{"use strict";ze()});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 E(`password must be at least ${sp} characters`,400);if(n.length>_b)throw new E("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 E(`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:Ke},user_id:{eq:U}}).run()).length||await o.insert({app_id:Ke,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),$=go(),O=new Date(Date.now()+w*24*3600*1e3);return await r.insert({token_hash:ho($),user_id:U.id,expires_at:O.toISOString(),...F?.appId?{app_id:F.appId}:{}}).run(),{token:K,refreshToken:$}}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 E("Invalid refresh token",401);let K=F[0];if(new Date(String(K.expires_at))<new Date)throw new E("Refresh token expired",401);let $=await b(K.user_id);if(!$)throw new E("User not found",401);return{user:$,appId:K.app_id?String(K.app_id):void 0}}let G=(async(U,F,K)=>{let $=null,O=null,T={},x,P,N,D=U.headers.get("authorization"),q=null;if(D?.startsWith("Bearer "))q=D.slice(7);else if(U.method==="GET"){let M=new URL(U.url??"","http://localhost"),j=M.searchParams.get("ticket");if(j){let H=jt(j,a);H?.type==="download"&&H?.sub&&(O=await b(String(H.sub)),$=O,T.userId=String(H.sub),H.appId!=null&&(P=H.appId,T.appId=String(H.appId)))}else q=M.searchParams.get("token")}if(q&&!O){let M=jt(q,a);if(M?.sub){O=await b(String(M.sub)),$=O;for(let[j,H]of Object.entries(M))j==="sub"||j==="iat"||j==="exp"||j==="type"||(T[j]=H);T.userId=String(M.sub),x=M.tenantId,P=M.appId,N=M.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={...T,async register(M){if(!M.email||!M.password)throw new E("email and password are required",400);Ua(M.password);let j=Lt(M.email),H=await vt(M.password),z=await t.insert({email:j,password_hash:H,name:M.name??null,role:null,tenant:M.tenant??null}).run(),Y=g(z[0]),ee=await C(Y);return await k(Y.id,"register"),$=Y,{...ee,user:Y}},async registerWithApp(M){let j=await this.register({email:M.email,password:M.password,name:M.name});await k(j.user.id,"register");let H=(M.appSlug??M.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:M.appName??`${M.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(M,j){let z=(await t.select("id","email","password_hash","name","role","tenant").where({email:{eq:Lt(M)}}).run())[0];if(!z||z.password_hash==null)throw await ip(j),new E("Invalid email or password",401);if(!await Dt(j,String(z.password_hash)))throw new E("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 $=ee,{...te,user:ee,apps:ge}},async logout(M){await r.update({revoked_at:new Date().toISOString()}).where({token_hash:{eq:ho(M)}}).run()},requireAuth(){if(!O)throw new E("Unauthorized",401);return O},async setPassword(M,j){Ua(j);let H=await vt(j);await t.update({password_hash:H}).where({id:{eq:M}}).run()},createToken(M,j,H){return Zn({type:M,...j},a,H.ttlSeconds)},async createApp(M){if(!$)throw new E("Unauthorized",401);if(!M.slug||!M.name)throw new E("slug and name are required",400);let j=M.slug.trim().toLowerCase();if(j.startsWith("_"))throw new E("slug \u4EE5 _ \u5F00\u5934\u4E3A\u7CFB\u7EDF\u4FDD\u7559\u540D",400);if(!await _(Ke,$.id))throw new E("\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:M.name,owner_user_id:$.id,open_registration:M.openRegistration??!1,app_key:z}).run())[0];return await o.insert({app_id:ee.id,user_id:$.id,role:"owner",invited_by:$.id}).run(),ee},async registerInApp(M){if(!M.email||!M.password)throw new E("email and password are required",400);Ua(M.password);let j=await s.select("id","open_registration").where({slug:{eq:M.appSlug}}).run();if(!j.length)throw new E("Application not found",404);let H=j[0],z=String(H.id),Y=Lt(M.email),ee="member";if(!H.open_registration){if(!M.inviteToken)throw new E("Registration closed for this application",403);let pe=jt(M.inviteToken,a);if(!pe||pe.type!=="app-invite"||pe.appId!==z)throw new E("Invalid invite",403);if(pe.email&&String(pe.email)!==Y)throw new E("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(M.password),xe=await t.insert({email:Y,password_hash:pe,name:M.name??null,role:null,tenant:null}).onConflict("email").run();if(te=xe.length?g(xe[0]):await S(Y),!te)throw new E("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:$?.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(),$=te,await l?.onJoinApp?.(te.id,z,ee),{...Ce,user:te}},async loginApp(M,j,H){let z=await s.select("id").where({slug:{eq:M}}).run();if(!z.length)throw new E("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 E("Invalid email or password",401);if(!await Dt(H,String(te.password_hash)))throw new E("Invalid email or password",401);let Ce=await _(Y,String(te.id));if(!Ce)throw new E("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(),$=pe,{...xe,user:pe,role:Ce}},async ssoLogin(M,j){let H=Lt(M),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 E("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 $=z,{...ee,user:z}},async createInvite(M,j){if(M===Ke)throw new E("_builtin \u4E0D\u8D70\u9080\u8BF7\u6D41\uFF08\u4EFB\u547D\u5236\uFF09",403);if(j.role!==void 0&&!d.includes(j.role))throw new E(`invite role not allowed: ${j.role}\uFF08allowed: ${d.join("/")}\uFF09`,403);if(!$)throw new E("Unauthorized",401);if(await _(M,$.id)!=="owner")throw new E("Owner only",403);let z=j.role&&j.role!=="owner"?j.role:"member";return{inviteToken:Zn({type:"app-invite",appId:M,...j.email?{email:Lt(j.email)}:{},role:z},a,h)}},async addMember(M,j,H){if(p(H),M===Ke&&H!==void 0&&H==="viewer")throw new E("_builtin \u65E0\u53EA\u8BFB\uFF08viewer \u7981\u2014\u2014\u7BA1\u7406\u9762\u8EAB\u4EFD\uFF09",403);if(!$)throw new E("Unauthorized",401);if(await _(M,$.id)!=="owner")throw new E("Owner only",403);let Y=await t.select("id").where({email:{eq:Lt(j)}}).run();if(!Y.length)throw new E("User not found \u2014 invite them to register first",400);let ee=H&&H!=="owner"?H:"member";await o.insert({app_id:M,user_id:String(Y[0].id),role:ee,invited_by:$.id}).run()},async setOpenRegistration(M,j){if(!$)throw new E("Unauthorized",401);if(M===Ke)throw new E("_builtin \u6CE8\u518C\u5F00\u5173\u6052 false",403);if(await _(M,$.id)!=="owner")throw new E("Owner only",403);await s.update({open_registration:j}).where({id:{eq:M}}).run()},async listMyApps(){if(!$)throw new E("Unauthorized",401);return A($.id)},async requireApp(M){if(!$)throw new E("Unauthorized",401);let j=await _(M,$.id);if(!j)throw new E("Not a member of this application",403);return{userId:$.id,appId:M,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 $=Lt(K);if(!$)continue;let O=await S($);if(!O){let x=await t.insert({email:$,password_hash:null,name:null,role:null,tenant:null}).onConflict("email").run();O=x.length?g(x[0]):await S($)}if(!O)continue;let T=await o.select("role").where({app_id:{eq:Ke},user_id:{eq:O.id}}).run();if(T.length){String(T[0].role??"")==="owner"?F.owner=String(O.id):F.admins.push(String(O.id));continue}if(F.owner)await o.insert({app_id:Ke,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:Ke,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:Ke,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 O of F)await s.update({app_key:np(32).toString("hex")}).where({id:{eq:String(O.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 $=await t.select("id").run();for(let O of $)await k(String(O.id),"migrate")},G.routes=(U,F)=>{let K=F?.prefix??m,$=new Set(F?.exclude??[]);if($.has("register")||U.post(`${K}/register`,async(O,T)=>{let x=await O.json().catch(()=>({})),P=await T.auth.register(x);return et(P)}),$.has("register")||U.post(`${K}/register-app`,async(O,T)=>{let x=await O.json().catch(()=>({})),P=await T.auth.registerWithApp(x);return et(P)}),$.has("login")||U.post(`${K}/login`,async(O,T)=>{let x=await O.json().catch(()=>({}));if(!x.email||!x.password)return Ue("email and password are required");let P=await T.auth.login(x.email,x.password);return Me(P)}),$.has("logout")||U.post(`${K}/logout`,async(O,T)=>{let x=await O.json().catch(()=>({}));return x.refreshToken?(await T.auth.logout(x.refreshToken),gn()):Ue("refreshToken is required")}),$.has("refresh")||U.post(`${K}/refresh`,async(O,T)=>{let x=await O.json().catch(()=>({}));if(!x.refreshToken)throw new E("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})}),$.has("me")||U.get(`${K}/me`,async(O,T)=>{if(!T.user)throw new E("Unauthorized",401);return Me({user:T.user,session:T.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 T=>{let P=new URL(T.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(T.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(T,x)=>{let P=new URL(T.url??"","http://localhost"),N=P.searchParams.get("code");if(!N)throw new E("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 E("SSO token \u4EA4\u6362\u5931\u8D25",401);let B=await q.json(),M=await fetch(`${c.issuer.replace(/\/$/,"")}/userinfo`,{headers:{Authorization:`Bearer ${B.access_token}`}});if(!M.ok)throw new E("SSO \u7528\u6237\u4FE1\u606F\u83B7\u53D6\u5931\u8D25",401);let j=await M.json(),H=(j.email??"").trim().toLowerCase();if(!H)throw new E("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)})}$.has("apps")||(U.post(`${K}/apps`,async(O,T)=>{let x=await O.json().catch(()=>({})),P=await T.auth.createApp(x);return et({app:P})}),U.get(`${K}/apps`,async(O,T)=>{let x=await T.auth.listMyApps();return Me({apps:x})}),U.post(`${K}/apps/:appSlug/auth/members`,async(O,T)=>{let x=await O.json().catch(()=>({})),P=await v(T.params.appSlug);if(!P)throw new E("Application not found",404);return await T.auth.addMember(P,x.email??"",x.role),et({ok:!0})}),U.post(`${K}/apps/:appSlug/auth/invites`,async(O,T)=>{let x=await O.json().catch(()=>({})),P=await v(T.params.appSlug);if(!P)throw new E("Application not found",404);let N=await T.auth.createInvite(P,{email:x.email,role:x.role});return et(N)}),U.post(`${K}/apps/:appSlug/auth/login`,async(O,T)=>{let x=await O.json().catch(()=>({}));if(!x.email||!x.password)return Ue("email and password are required");let P=await T.auth.loginApp(T.params.appSlug,x.email,x.password);return Me(P)}),U.patch(`${K}/apps/:appSlug/auth/registration`,async(O,T)=>{let x=await O.json().catch(()=>({}));if(typeof x.open!="boolean")return Ue("open is required (boolean)");let P=await v(T.params.appSlug);if(!P)throw new E("Application not found",404);return await T.auth.setOpenRegistration(P,x.open),Me({open:x.open})}),U.post(`${K}/apps/:appSlug/auth/verify`,async(O,T)=>{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 E("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,T)=>{let x=await O.json().catch(()=>({})),P=await T.auth.registerInApp({appSlug:T.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,Ke,rp,sp,_b,op,_o,ap=I(()=>{"use strict";ze();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",Ke="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 E("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 E(`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();ze()});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(`
|
|
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
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;
|
|
@@ -67,7 +67,7 @@ ${u.join(`
|
|
|
67
67
|
${ot(t)}Delete(id: ID!): ${t}
|
|
68
68
|
}`].join(`
|
|
69
69
|
|
|
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 M of q)await B.insert({conversation_id:D,user_id:M}).onConflict(void 0,!1).run()}async function l(N,D){if(D.type==="direct"){let B=[N,D.otherUserId].sort().join(":"),M=await i(N,D.otherUserId);if(M)return M;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 E("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 M=>{let z=(await M.table(us).insert({type:D,created_by:N}).run())[0];return await a(M,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 M=String(B.id),j=await s.select().where({conversation_id:{eq:M},deleted_at:{isNull:!0}}).orderBy("created_at","desc").orderBy("id","desc").limit(1).run(),H=await s.select().where({conversation_id:{eq:M},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:M,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,M)=>{let j=B.last_message?Date.parse(B.last_message.created_at):Date.parse(B.created_at);return(M.last_message?Date.parse(M.last_message.created_at):Date.parse(M.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),M=JSON.parse(q);if(M._pid===C)return;W(B,M)}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,...M}=D,j=JSON.stringify(M);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 $(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 M=B.query.token;if(M){let j=await N.verifyToken(M);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,M){try{let j=JSON.parse(M.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){$(q),D.delete(q)},error(q){$(q),D.delete(q)}}}async function T(){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:T,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(M,j){if(!j.user)throw new E("Unauthorized",401);if(!await p(M,j.user.id))throw new E("Forbidden: not a conversation member",403)}N.post(`${q}/conversations`,async(M,j)=>{if(!j.user)throw new E("Unauthorized",401);let H=await M.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(M,j)=>{if(!j.user)throw new E("Unauthorized",401);return Me(await c(j.user.id))}),N.get(`${q}/conversations/:id/messages`,async(M,j)=>{if(!j.user)throw new E("Unauthorized",401);let H=j.params.id;await B(H,j);let z=new URL(M.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(M,j)=>{if(!j.user)throw new E("Unauthorized",401);let H=j.params.id;await B(H,j);let z=await M.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(M,j)=>{if(!j.user)throw new E("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(M,j)=>{if(!j.user)throw new E("Unauthorized",401);let H=j.params.id,z=await M.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 E("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(M,j)=>{if(!j.user)throw new E("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 E("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";ze();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===`
|
|
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
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]!==`
|
|
@@ -90,13 +90,13 @@ ${En(Kt(t.step.steps,ds(e)))}
|
|
|
90
90
|
${En(Kt(t.step.steps,{...e,loopNames:[...e.loopNames,s]}))}
|
|
91
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 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 E(`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 E("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($=>$.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();ze();$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(M=>setTimeout(M,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 M=v;v=null,S=-1,await M.close().catch(()=>{})}let B=await e.createConnection();return v=B,S=q,B}async function $(){let q;for(let B=0;B<3;B++)try{await v.command("XGROUP","CREATE",m,Tn,"0","MKSTREAM");return}catch(M){if(String(M.message).includes("BUSYGROUP"))return;q=M,B<2&&await new Promise(j=>setTimeout(j,50))}throw q}async function O(q,B){let M;try{M=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(M.attempts??0),H=Number(M.maxAttempts??3);try{await u({id:q,name:l,data:M.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:M.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({...M,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 T(){let q=Date.now(),B;try{B=await v.command("ZRANGEBYSCORE",h,0,q)}catch(M){if(Bl(M)){if(await U(M))return;b=!1;return}b&&N()&&console.error("[queue] ZRANGEBYSCORE:",M instanceof Error?M.message:M);return}for(let M of B)await v.command("ZREM",h,M)&&await v.command("XADD",m,"*","payload",M)}async function x(){try{let B=(await v.command("XAUTOCLAIM",m,Tn,d,f,"0","COUNT",String(p)))[1];for(let[M,j]of B)await O(M,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 $(),!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 T(),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 $()}catch(M){if(b=!1,v){let j=v;v=null,S=-1,await j.close().catch(()=>{})}throw M}let B=D(q);C.set(q,B),B.finally(()=>C.delete(q)).catch(M=>console.error("[queue] worker loop crashed:",M))},stop:async()=>{if(!b){await Promise.allSettled([...C.values()]);return}_++,b=!1;let q=v;v=null,S=-1;let B=[...C.entries()].filter(([M])=>M<_).map(([,M])=>M);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}
|
|
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
96
|
`))};r>0&&(s=setInterval(()=>{try{i.enqueue(t.encode(`: wf-heartbeat
|
|
97
97
|
|
|
98
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="",$=[],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&&$.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 T=d($);for(let x of T)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:T,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)}
|
|
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
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
|
|
|
@@ -113,8 +113,8 @@ ${l}
|
|
|
113
113
|
${s.join(`
|
|
114
114
|
|
|
115
115
|
`)}
|
|
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?Be(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}]),Be(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),Be(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)),Be(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),Be(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?Be(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?Be(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?Be(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(Be(A,t,S,v,r,o,s,i)):_.push(Be(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(Be(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(Be(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 Be(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:T=>{t.phase=T}});let o=T=>{r.next(T)},i=n.getBrowser()?.window,a=n.getBrowser()?.document,l=()=>{if(!a)return null;if(t.container)return t.container;let T=a.getElementById(ai);T||(T=a.createElement("div"),T.id=ai,a.body.appendChild(T));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),T.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 T=xf(e.anchor);if(!T||!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(T,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=T=>{if(t.panel=T,T&&t.open&&!c&&e.positioning!=="none"&&(i&&typeof i.requestAnimationFrame=="function"?i.requestAnimationFrame(d):queueMicrotask(d)),T&&e.presence){let x=P=>{t.phase==="exit"&&k()};T.addEventListener("animationend",x),n.onUnmount(()=>T.removeEventListener("animationend",x))}},f=null,w=T=>{f=T,T&&c&&m()},m=()=>{let T=e.mask?f:t.panel;T&&(T.style.top=`${t.pos.top}px`,T.style.left=`${t.pos.left}px`,t.pos.width!==void 0&&(T.style.width=`${t.pos.width}px`))},g=T=>{if(!T)return null;let x=T;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:M=>{e.maskClosable!==!1&&M.target===M.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=T=>{let x=++t.version,P=t.tree;t.tree=T,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((M,j)=>{let H=[],z=()=>n.requestRender?.();(P?xs(P,T,q,t.segments,D,z):vr(T,q,D,t.segments,z)).subscribe({next:ee=>H.push(ee),error:j,complete:()=>M(H)})});for(let M of B){if(t.disposed||x!==t.version)return;N.apply(M)}for(let M of B)M.op==="unmount"&&at(M.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 T=x=>{let P=t.panel;P?(P.querySelector?.("input, button, [tabindex], select, textarea")??P).focus?.():x<10&&t.open&&queueMicrotask(()=>T(x+1))};T(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=T=>{if(T.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;T.shiftKey&&(D===P||D===t.panel||!t.panel.contains(D))?(T.preventDefault(),N.focus()):!T.shiftKey&&(D===N||!t.panel.contains(D))&&(T.preventDefault(),P.focus())},i.addEventListener("keydown",U));let F=T=>{if(!t.open||(e.closeOnOutside??!0)===!1)return;let x=T.target,P=xf(e.anchor);x&&P?.contains(x)||x&&t.panel?.contains(x)||_()},K=T=>{t.open&&(e.closeOnEscape??!0)&&T.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 $=()=>{if(t.open||t.disposed)return;t.open=!0,o({kind:"open"});let T=l();if(!T)return;e.trapFocus||e.lockScroll?G():e.autoFocus&&W();let x=Ct();t.applier=new Mn(T,a,x),t.segments=new Map;let P=ok(e.content);P!=null?h(g(P)):k()},O={close:_,update(T){if(t.disposed||!t.open)return;if(T==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(T)),x&&m()},refresh(){if(!(t.disposed||!t.open||!t.tree)&&e.position){let T=e.position();T&&typeof T.x=="number"&&typeof T.y=="number"&&(t.pos={top:T.y,left:T.x,width:T.width},m())}},get open(){return t.open},events$:s};return $(),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 Be(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 Be(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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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 He,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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}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(He(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=He(bg(),"dist"),t=Ek[n];if(t)return He(e,t);if(n.startsWith("weifuwu/server/"))return He(e,"level6","server",n.slice(15),"index.js");if(n.startsWith("weifuwu/")){let r=n.slice(8);for(let s of[He(e,r),`${He(e,r)}.js`,`${He(e,r)}.css`,He(e,r,"index.js"),He(e,"level6",r,"index.js"),He(e,"level5",r,"index.js")])if(Hu(s))return s;return He(e,r,"index.js")}return n}function Tk(n){let e=bg();return n.startsWith(He(e,"src")+kk)?He(e,"src","level6","client","vdom"):He(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(He(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>
|
|
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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}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,7 +159,7 @@ ${s.join(`
|
|
|
159
159
|
<body>
|
|
160
160
|
<div id="graphiql">Loading\u2026</div>
|
|
161
161
|
</body>
|
|
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();ze();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 E(`\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 E(`\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 E(`\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(`
|
|
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()
|
|
@@ -167,7 +167,7 @@ ${s.join(`
|
|
|
167
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 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
|
|
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
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
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
173
|
`);if(typeof n=="number")return Pe.encode(`:${n}\r
|
|
@@ -192,13 +192,13 @@ $${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 ch(n){if(n.method==="GET"||n.method==="HEAD")return{};try{return await n.json()}catch{throw new E("Invalid JSON body",400)}}var dh=I(()=>{"use strict";ze()});var Pi={};ie(Pi,{BUILTIN_APP_ID:()=>Ke,DEFAULT_MAX_BODY:()=>ca,HttpError:()=>E,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();ze();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,Fe,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())},Fe={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)}%)
|
|
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 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",Fe.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(Fe))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 Ve={};ie(Ve,{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(`
|
|
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
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
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",Fe.sandboxes).select().where(s).orderBy("created_at","desc").run()}async get(e,t){return this.orm?(await this.orm.table("sandboxes",Fe.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",Fe.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",Fe.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",Fe.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(`
|
|
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
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)/
|
|
@@ -287,9 +287,9 @@ ${n.map(r=>{let s=r.size>=1024?`${Math.round(r.size/1024)}KB`:`${r.size}B`;retur
|
|
|
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 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:
|
|
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
|
-
`+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
|
|
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
|
|
|
@@ -301,7 +301,7 @@ ${_.slice(0,200)}${_.length>200?"\u2026":""}
|
|
|
301
301
|
|
|
302
302
|
`+p:"")+(u?`
|
|
303
303
|
|
|
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
|
|
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
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
|
|
|
@@ -337,10 +337,10 @@ ${w.content}`}catch(w){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 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 E("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 E("\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 E("\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 E("\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 E("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 E("\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 E("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 E("\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 E("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 E("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 E("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 E("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 E("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 E("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
|
|
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
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(()=>(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 E("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 E("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}
|
|
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
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
|
|
@@ -480,18 +480,18 @@ ${r}`,o=ld("sha256",r).update(s).digest("base64"),i=Buffer.from(o),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"}),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(),
|
|
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??{},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(),
|
|
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 E("\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 E("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 E("\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 E("\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 E("\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 E("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 E("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 E("\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 E("\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 E("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 E("\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 $ of F){if($.name.startsWith("."))continue;let O=U(C,$.name);try{let T=await G(O);K.push({name:$.name,type:$.isDirectory()?"dir":"file",size:T.size,mtime:T.mtime.toISOString()})}catch{}}K.sort(($,O)=>$.type===O.type?$.name.localeCompare(O.name):$.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 E("\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 E("\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 E("\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 E("\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 E("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 E("\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 E("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 E("\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 E("\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 E("\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 E("\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 E("\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 E("\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(),Ve)),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 E("\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 E("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),Ve)),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 E("\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 E("\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 E("\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 E("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),Ve)),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 E("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),Ve)),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 E("\u6C99\u76D2\u4E0D\u5B58\u5728",404);let{sandbox:d}=await Promise.resolve().then(()=>(Le(),Ve)),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 E("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 E("\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 E("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 E("\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 E("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 E("\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
|
|
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
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 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
|
|
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(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 E("\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 E("\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 E("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.filename||!u.content)throw new E("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 E("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u;try{u=await e.formData()}catch{throw new E("\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 E("\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 E("documents \u4E3A\u5FC5\u586B\uFF0C\u9700\u5305\u542B filename \u548C content \u7684\u6570\u7EC4",400);if(u.documents.length>20)throw new E("\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 E("\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 E("\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 E("\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 E("\u77E5\u8BC6\u5E93 Agent \u4E0D\u5B58\u5728",404);let u=await e.json();if(!u.query)throw new E("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 E("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 E("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 E("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 E("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 E("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 E("\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 E("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 E("\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 E("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 E("\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)===Ke&&(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 E("\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 E("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 E("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 E("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 T=String(O.created_at).slice(0,10),x=f.get(T)??{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(T,x)}let w=[...f.entries()].sort((O,T)=>O[0].localeCompare(T[0])).map(([O,T])=>({day:O,prompt:T.prompt,completion:T.completion,total:T.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 T=String(O.created_at).slice(0,10),x=g.get(T)??{count:0,senders:new Set};x.count+=1,x.senders.add(String(O.sender_id??"")),g.set(T,x)}let h=[...g.entries()].sort((O,T)=>O[0].localeCompare(T[0])).map(([O,T])=>({day:O,count:T.count,active_agents:T.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),$=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($)},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 E("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>
|
|
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; }
|
|
@@ -535,7 +535,7 @@ data: {"messageId":"${p.id}"}
|
|
|
535
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,o)=>{if(!e(o))throw new
|
|
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>
|
|
@@ -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 Ey(n,e){let{pg:t,redisClient:r,eventsPg:s,currentCtx:o}=e,i=new lt;i.onError(
|
|
586
|
-
`);return new Response(M,{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($,O)=>{let{orm:T,auth:x}=O,P=await $.json();if(!P.name?.trim())throw new E("name \u4E0D\u80FD\u4E3A\u7A7A",400);let[N]=await T.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($,O)=>{let{orm:T,auth:x}=O,P=x.userId,[N]=await T.query.from("_weifuwu_users").select("id","email","name","created_at").where({id:{eq:P}}).run(),D=await T.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 T.query.from("agents").select("id","app_id","type","name","description","created_at").where({user_id:{eq:P}}).run(),B=await T.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(),M={profile:N,memberships:D,agents:q,messages:B};return new Response(JSON.stringify(M,null,2),{headers:{"Content-Type":"application/json","Content-Disposition":'attachment; filename="my-data.json"'}})}),i.delete("/api/auth/account",async($,O)=>{let{orm:T,auth:x}=O,P=x.userId;await T.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 T.query.update("agents").set({is_active:!1,name:"\u5DF2\u5220\u9664\u7528\u6237"}).where({user_id:{eq:P}}).run(),await T.query.delete("_weifuwu_app_members").where({user_id:{eq:P}}).run(),await T.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($,O)=>{let{orm:T,auth:x}=O,P=await $.json();if(!P.currentPassword||!P.newPassword)throw new E("currentPassword \u548C newPassword \u4E3A\u5FC5\u586B",400);if(P.newPassword.length<6)throw new E("\u65B0\u5BC6\u7801\u81F3\u5C11 6 \u4F4D",400);let[N]=await T.query.from("_weifuwu_users").select("password_hash").where({id:{eq:x.userId}}).run();if(!N)throw new E("\u7528\u6237\u4E0D\u5B58\u5728",404);if(!await Dt(P.currentPassword,N.password_hash))throw new E("\u5F53\u524D\u5BC6\u7801\u9519\u8BEF",403);let q=await vt(P.newPassword);return await T.query.update("_weifuwu_users").set({password_hash:q}).where({id:{eq:x.userId}}).run(),Response.json({success:!0})}),i.get("/api/sandbox/containers",async($,O)=>{let{sandbox:T}=await Promise.resolve().then(()=>(Le(),Ve)),{orm:x}=O,P=await T.listContainers(),N=P.map(M=>String(M.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(M=>[String(M.id),String(M.name??M.id)])),B=[];for(let M of P){let j=await T.containerStats(String(M.name));B.push({name:M.name,status:M.status,image:M.image,createdAt:M.createdAt,agentName:q.get(String(M.name).replace("ap-sandbox-",""))??"\u672A\u77E5",...j??{}})}return Response.json({containers:B})}),i.get("/api/sandbox/containers/:name/processes",async($,O)=>{let{sandbox:T}=await Promise.resolve().then(()=>(Le(),Ve)),x=await T.containerProcesses(O.params.name);return Response.json({name:O.params.name,processes:x})}),i.post("/api/sandbox/containers/:name/:action",async($,O)=>{let{sandbox:T}=await Promise.resolve().then(()=>(Le(),Ve)),x=O.params.action;if(!["stop","start","restart","rm"].includes(x))throw new E("\u4E0D\u652F\u6301\u7684 action",400);let P=await T.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 $=>{try{let O=await $.json();if(!O.query||typeof O.query!="object")throw new E("query \u5FC5\u586B\uFF08Query AST\uFF09",400);let T=await t.orm.execute(O.query);return Response.json({ok:!0,rows:T})}catch(O){return Response.json({error:String(O?.message??O)},{status:500})}}),n.post("/api/test/wf",async $=>{try{let O=await $.json();if(!O.room||!Array.isArray(O.events))throw new E("room/events \u5FC5\u586B",400);for(let T of O.events)m.client.broadcast(O.room,T);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:$=>{$.send(JSON.stringify({type:"host:ack"}))},message:async($,O,T)=>{try{let x=JSON.parse(String(T)),{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:($,O)=>{O.hub.join("survey-live",$),_=O.hub},message:async($,O,T)=>{try{let x=JSON.parse(String(T));if(x.type==="ping"){$.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!==$){v.delete(N);try{N.close()}catch{}}if(P==="stats-view"){$.send(JSON.stringify(C(String(x.campaign??""))));return}v.set($,{source:P,at:new Date().toISOString()}),U(),x.campaign!==void 0?$.send(JSON.stringify(C(String(x.campaign??"")))):$.send(JSON.stringify(C()));return}if(x.type==="survey:answer"&&x.question){let P=v.get($);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($);q&&(q.submitted=!0,q.at=new Date().toISOString(),U())}x.type==="survey:bye"&&v.delete($)&&U()}catch{}},close:($,O)=>{O.hub.leave($),v.delete($)&&U()}}),n.post("/api/webhook/:agentId",async($,O)=>{try{if(Number($.headers.get("content-length")??0)>64*1024)throw new E("Request body too large (max 64KB)",413);let x=await $.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 M=await P(O,D);if(M)return Response.json({error:M},{status:402})}let q=$.headers.get("x-signature")??void 0,B=await ud(O,O.params.agentId,x,void 0,q,$.headers.get("x-timestamp")??void 0,$.headers.get("x-nonce")??void 0);return Response.json(B)}catch(T){let x=T instanceof Error?T.message:String(T),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($,O)=>{let T=await $.text().catch(()=>""),x={};try{x=T?JSON.parse(T):{}}catch{throw new E("\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 E("\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(T,$.headers.get("x-signature")??"",B,$.headers.get("x-timestamp")??void 0),pe=$.headers.get("timestamp")??"",xe=$.headers.get("sign")??"",Vr=pe&&xe?ge(x,pe,xe,B):!1;if(!Ce&&!Vr)throw new E("\u7B7E\u540D\u6821\u9A8C\u5931\u8D25\uFF08\u9700 X-Signature \u6216\u9489\u9489 timestamp+sign\uFF09",403);if(!te($.headers.get("x-nonce")??void 0,$.headers.get("x-timestamp")??void 0))throw new E("\u91CD\u653E\u8BF7\u6C42",403)}let M="",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&&(M=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"),M||"\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 $=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 T of[...$].reverse())h.push({id:String(T.id),source:String(T.source),submitted_at:String(T.submitted_at),age:String(T.age??""),industry:String(T.industry??""),rating:Number(T.rating??0),focus:T.focus,feedback:String(T.feedback??""),campaign:String(T.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 T of[...O].reverse())g.push({source:String(T.source),question:String(T.question),answer:String(T.answer),at:String(T.created_at),campaign:String(T.campaign_id??"")});console.log(`[survey] \u5DF2\u6062\u590D\u63D0\u4EA4 ${b} / \u7B54\u6848 ${O.length}`)}catch($){console.warn("[survey] \u6062\u590D\u5931\u8D25:",$?.message)}})();let _=null,v=new Map,S=$=>{_?.send("survey-live",JSON.stringify($))},A=()=>{let $={},O={},T={},x={},P=0;for(let N of h){N.industry&&($[String(N.industry)]=($[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&&(T[String(D)]=(T[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:$,byAge:O,byRating:T,focus:x,avgRating:h.length>0?Math.round(P/h.length*10)/10:0,completionRate:h.length>0?100:0}},C=($="")=>{let O=$?h.filter(x=>String(x.campaign??"")===$):h,T=$?g.filter(x=>String(x.campaign??"")===$):g;return{type:"survey:state",count:$?O.length:b,globalCount:b,campaign:$,answers:T.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 M=Number(B.rating??0);M>0&&(N[String(M)]=(N[String(M)]??0)+1,q+=M);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 $=Date.now(),O=!1;for(let[T,x]of v){let P=$-new Date(x.at).getTime();(T.readyState!==1||P>W)&&(v.delete(T),O=!0)}O&&U()}catch{}},30*1e3).unref();let G=()=>{let $=[...v.values()];return{count:$.length,sources:$.map(O=>O.source),submitted:$.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:$}=await import("node:fs");return new Response($(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:$}=await import("node:fs");return new Response($(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:$}=await import("node:fs"),O=$(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($,O)=>{try{let T=["\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:T},is_dm:{eq:!1}}).run(),P=new Map((x??[]).map(j=>[String(j.name),String(j.id)])),N=T.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)),M=process.env.PUBLIC_BASE_URL??`http://localhost:${process.env.PORT??3e3}`;return(async()=>{let z=0;for(let Y=0;Y<T.length;Y+=3){let ee=T.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 ${M}/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<T.length&&await new Promise(te=>setTimeout(te,1e4))}console.log(`[launch] \u6D3E\u5355\u5B8C\u6210\uFF1A${z}/${T.length} \u4E2A\u89D2\u8272\uFF08\u5E76\u53D1\u72EC\u7ACB\u6C99\u76D2\uFF09`)})(),Response.json({success:!0,sent:T.length,scheduling:!0,roles:T})}catch(T){return Response.json({error:T?.message??"launch \u5931\u8D25"},{status:500})}}),n.get("/demo-survey/campaigns",async()=>{let{readFileSync:$}=await import("node:fs"),O=$(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 $=await t.orm.query.from("survey_campaigns").select("id","status","total","completed","failed","created_at").orderBy("created_at","desc").limit(50).run()??[],O=$.map(N=>String(N.id)),T=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(T.map(N=>[String(N.campaign_id),Number(N.submitted??0)])),P=$.map(N=>({...N,id:String(N.id),submitted:x.get(String(N.id))??0}));return Response.json({list:P})}catch($){return Response.json({error:$?.message??"\u67E5\u8BE2\u5931\u8D25"},{status:500})}}),n.get("/demo-survey/stats",async()=>{let{readFileSync:$}=await import("node:fs"),O=$(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)});
|
|
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)});
|