adam-agent-server 1.15.1 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App-Z2GJAMX3.js +14 -0
- package/dist/approval-handler-6NPN24UN.js +1 -0
- package/dist/artifacts-S2KD6W76.js +1 -0
- package/dist/audit-diagnostics-2MDM3IQT.js +1 -0
- package/dist/audit-manager-QG7CMBV2.js +1 -0
- package/dist/bree-engine-3QSLZF3W.js +1 -0
- package/dist/channels-S4AAOOTN.js +1 -0
- package/dist/channels-TYXSSI7D.js +1 -0
- package/dist/{chat-tool-calls-KARPW7PE.js → chat-tool-calls-2C7O4B2X.js} +1 -1
- package/dist/chunk-32LOJEHE.js +32 -0
- package/dist/{chunk-VNXTBIPI.js → chunk-3UR2PN5N.js} +1 -1
- package/dist/{chunk-D3SPXZZY.js → chunk-3UZIEE2D.js} +1 -1
- package/dist/{chunk-MFFJ5HFI.js → chunk-4234WJJD.js} +5 -5
- package/dist/{chunk-2N4EOZZ4.js → chunk-52FETPCI.js} +1 -1
- package/dist/{chunk-QZ34KQ76.js → chunk-6Y2DN2UH.js} +1 -1
- package/dist/{chunk-NWGRLNUM.js → chunk-AG5SADAI.js} +1 -1
- package/dist/{chunk-LZDO4PXK.js → chunk-AQAHVNNG.js} +5 -5
- package/dist/{chunk-DMDZ3QW7.js → chunk-C2XFPUFV.js} +1 -1
- package/dist/{chunk-XA3MZOWU.js → chunk-EWYXVBOG.js} +7 -7
- package/dist/{chunk-ISKCTUI7.js → chunk-FHESRUJY.js} +1 -1
- package/dist/{chunk-BKNXRSJU.js → chunk-FYULPPFR.js} +1 -1
- package/dist/{chunk-27C637GL.js → chunk-H4MMEULK.js} +2 -2
- package/dist/chunk-HC34HJFF.js +1 -0
- package/dist/{chunk-XF7YHFVR.js → chunk-HJICGOD4.js} +1 -1
- package/dist/{chunk-F6U5TMM3.js → chunk-HXDS4NWI.js} +1 -1
- package/dist/{chunk-3BRHWRZ5.js → chunk-I44JKROJ.js} +1 -1
- package/dist/chunk-K2TZW4DU.js +132 -0
- package/dist/{chunk-RBJPQYV3.js → chunk-K4IE6DPX.js} +1 -1
- package/dist/{chunk-NPGZRSGL.js → chunk-LQVBWVLE.js} +1 -1
- package/dist/chunk-LVHLUAZW.js +22 -0
- package/dist/{chunk-ICAM2GUU.js → chunk-MNSZE3NV.js} +1 -1
- package/dist/{chunk-KJNAORKM.js → chunk-MTQI6B7T.js} +1 -1
- package/dist/chunk-NS6WVZMS.js +1 -0
- package/dist/{chunk-IRUR4DVD.js → chunk-OGY42NUN.js} +1 -1
- package/dist/{chunk-VLS3BPCG.js → chunk-OXGWWSKT.js} +1 -1
- package/dist/{chunk-OW3HDZV5.js → chunk-P5Q2UINT.js} +1 -1
- package/dist/{chunk-BPXS4QEO.js → chunk-QL2ZOLMC.js} +88 -21
- package/dist/{chunk-TZCMK3UG.js → chunk-R24YRJRG.js} +1 -1
- package/dist/{chunk-RX274IH7.js → chunk-SCUPWMI5.js} +1 -1
- package/dist/{chunk-J3VYLSJI.js → chunk-TCBGUVVU.js} +1 -1
- package/dist/{chunk-XIVFVKMB.js → chunk-TJTH7LHX.js} +1 -1
- package/dist/chunk-VVQ532U2.js +6 -0
- package/dist/chunk-WVHN54MA.js +14 -0
- package/dist/{chunk-LBINDAPE.js → chunk-YNS5LQX5.js} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{config-XO7TGH27.js → config-HDAAV5FV.js} +1 -1
- package/dist/{db-WCTOLFAZ.js → db-HFBXO2O5.js} +1 -1
- package/dist/{delivery-log-ML4RJOBM.js → delivery-log-3O3OHKY4.js} +1 -1
- package/dist/engine-J43ECCH7.js +1 -0
- package/dist/{evolution-audit-HLU7LQL6.js → evolution-audit-BSGPFGFK.js} +1 -1
- package/dist/execution-tools-HHUPWLCF.js +1 -0
- package/dist/index.js +41 -41
- package/dist/{learner-NJXX2RUL.js → learner-TQQZKRSB.js} +1 -1
- package/dist/{memories-JDTQM3UN.js → memories-2DY5G6ZN.js} +1 -1
- package/dist/{memory-extractor-X2HTMKCV.js → memory-extractor-TUOOFST2.js} +1 -1
- package/dist/memory-gc-MRO53MEY.js +1 -0
- package/dist/memory-service-23WVAW7T.js +1 -0
- package/dist/outbound-gateway-VXODXSQR.js +1 -0
- package/dist/presets-KJV6SNNB.js +1 -0
- package/dist/{reflection-job-BHX3BWAG.js → reflection-job-EFFW3WOR.js} +1 -1
- package/dist/role-presets-PHHL3OEN.js +1 -0
- package/dist/role-workspace-USY47ZPQ.js +1 -0
- package/dist/{roles-F6AEM6B5.js → roles-3JXNHL7K.js} +1 -1
- package/dist/{session-manager-6MUWHQYF.js → session-manager-PI3JEINK.js} +1 -1
- package/dist/skill-registry-ROGU2WED.js +1 -0
- package/dist/{task-templates-6G46OVYT.js → task-templates-4YPKFFKG.js} +1 -1
- package/dist/template-dispatch-46TN534D.js +1 -0
- package/package.json +1 -1
- package/web/dist/assets/ArtifactDetail-9DJdEqCz.js +66 -0
- package/web/dist/assets/Artifacts-CQ6SAemH.js +1 -0
- package/web/dist/assets/{Button-fLMsJd5o.js → Button-xVc-P0vm.js} +1 -1
- package/web/dist/assets/{Card-cy-gHU0O.js → Card-WUD1cwG6.js} +1 -1
- package/web/dist/assets/ChannelDetail-B21nBQwi.js +1 -0
- package/web/dist/assets/{Channels-DMutLV9r.js → Channels-CAeGE1r7.js} +2 -2
- package/web/dist/assets/Chat-KpFWchPp.js +2 -0
- package/web/dist/assets/{Dashboard-CoatfhW8.js → Dashboard-DkRwHNmr.js} +1 -1
- package/web/dist/assets/{EmptyState-C5kVDHc7.js → EmptyState-BLB33cKG.js} +1 -1
- package/web/dist/assets/{EnvVarEditor-BvRsHayG.js → EnvVarEditor-BchUNrmz.js} +1 -1
- package/web/dist/assets/{EventDefDetail-zuJydp12.js → EventDefDetail-DnBwWWfT.js} +1 -1
- package/web/dist/assets/Events-ByIzPIs2.js +1 -0
- package/web/dist/assets/{Evolution-Br41g99g.js → Evolution-Vh9RKdma.js} +1 -1
- package/web/dist/assets/{ExtensionDetail-BXlphIkn.js → ExtensionDetail-0CtJh5rF.js} +1 -1
- package/web/dist/assets/Extensions--O1ulwlC.js +1 -0
- package/web/dist/assets/{FeatureRequests-oaXQNu43.js → FeatureRequests-XhQbGg_q.js} +1 -1
- package/web/dist/assets/GoalDetail-DIOxf7ES.js +1 -0
- package/web/dist/assets/Goals-CZnHu9qC.js +1 -0
- package/web/dist/assets/{Logs-BZKxhdnb.js → Logs-DdeG3GiY.js} +1 -1
- package/web/dist/assets/{Memories-DhJJk-KB.js → Memories-D-EAODUg.js} +1 -1
- package/web/dist/assets/{Mistakes-DxThj9as.js → Mistakes-wW78K3cP.js} +1 -1
- package/web/dist/assets/{NotFound-buXr2gl7.js → NotFound-BsxIP-Xm.js} +1 -1
- package/web/dist/assets/{PageHeader-BgNbz3JV.js → PageHeader-D8pqg_wk.js} +1 -1
- package/web/dist/assets/Plugins-DDUdX51_.js +1 -0
- package/web/dist/assets/{RoleDetail-rClUsHwS.js → RoleDetail-CU3G9j_q.js} +4 -4
- package/web/dist/assets/Roles-BCoSzDBg.js +1 -0
- package/web/dist/assets/{SectionHeader-CwX6m1f6.js → SectionHeader-DZo4QVWr.js} +1 -1
- package/web/dist/assets/{Settings-My2lOEWv.js → Settings-K3usfV-2.js} +1 -1
- package/web/dist/assets/{Strategies-YLMryJlG.js → Strategies-Bg4qlLei.js} +1 -1
- package/web/dist/assets/{Switch-PNpjNoGn.js → Switch-WWPXnSOG.js} +1 -1
- package/web/dist/assets/{Table-BrERwl-F.js → Table-XjSmrOyn.js} +1 -1
- package/web/dist/assets/{Tabs-CGHmpUAD.js → Tabs-CSbcG_5T.js} +1 -1
- package/web/dist/assets/TaskDetail-C5roukcV.js +2 -0
- package/web/dist/assets/Work-DGTWSgtc.js +1 -0
- package/web/dist/assets/{es2015-JqLIWAgH.js → es2015-BgPT8VkR.js} +1 -1
- package/web/dist/assets/index-KNUbHDLy.css +2 -0
- package/web/dist/assets/index-iD-HOtIu.js +12 -0
- package/web/dist/assets/{useIsMobileLayout-Blj4Mk4K.js → useIsMobileLayout-DF2fEEM9.js} +1 -1
- package/web/dist/assets/{usePluginsWithUsage-Ch9WCFTb.js → usePluginsWithUsage-CjU8Lkdn.js} +1 -1
- package/web/dist/assets/vendor-icons-H7p0EuQJ.js +1 -0
- package/web/dist/assets/{vendor-react-Bp_V-Hsf.js → vendor-react-C1yKjxEP.js} +1 -1
- package/web/dist/assets/{vendor-state-Zjl_6-V3.js → vendor-state-D0TNAbOY.js} +1 -1
- package/web/dist/index.html +7 -7
- package/dist/App-6TRGTNZ7.js +0 -13
- package/dist/approval-handler-ZWZZ3FKR.js +0 -1
- package/dist/audit-diagnostics-MASYIEGZ.js +0 -1
- package/dist/audit-manager-3YOVBIFV.js +0 -1
- package/dist/bree-engine-Y6WEQCC4.js +0 -1
- package/dist/channels-2DFKJ33W.js +0 -1
- package/dist/channels-2IL6USWL.js +0 -1
- package/dist/chunk-2Q6XLYCC.js +0 -25
- package/dist/chunk-CLNYHWZ6.js +0 -5
- package/dist/chunk-JUVQWLWM.js +0 -14
- package/dist/chunk-JYJWNUGH.js +0 -1
- package/dist/chunk-L47LZYVG.js +0 -21
- package/dist/chunk-VVPRB2JU.js +0 -114
- package/dist/engine-IZRMVJRH.js +0 -1
- package/dist/execution-tools-3UATAFUL.js +0 -1
- package/dist/memory-gc-BCHTOSXK.js +0 -1
- package/dist/memory-service-66EMRJXO.js +0 -1
- package/dist/outbound-gateway-R6EVRWHP.js +0 -1
- package/dist/presets-ZZVLCPB2.js +0 -1
- package/dist/role-presets-JJI7532O.js +0 -1
- package/dist/role-workspace-SIHNI6HO.js +0 -1
- package/dist/skill-registry-4JT62GEF.js +0 -1
- package/dist/template-dispatch-NDQH6S2P.js +0 -1
- package/dist/template-execution-artifacts-NEPSVD2B.js +0 -1
- package/web/dist/assets/ChannelDetail-CsKBPHkT.js +0 -1
- package/web/dist/assets/Chat-DWTs-iOw.js +0 -2
- package/web/dist/assets/Events-nCImjXyr.js +0 -1
- package/web/dist/assets/Extensions-3lhbw0A2.js +0 -1
- package/web/dist/assets/GoalDetail-DRDg1JDv.js +0 -1
- package/web/dist/assets/Goals-DGmKvtGA.js +0 -1
- package/web/dist/assets/Plugins-BXrsGsXs.js +0 -1
- package/web/dist/assets/Roles-DH9cRv8h.js +0 -1
- package/web/dist/assets/TaskDetail-Bkaq0NwW.js +0 -2
- package/web/dist/assets/Work-4OcGMu_a.js +0 -1
- package/web/dist/assets/index-C-e-qpXc.js +0 -12
- package/web/dist/assets/index-DGTVc0qD.css +0 -2
- package/web/dist/assets/vendor-icons-U4igmrUq.js +0 -1
- /package/web/dist/assets/{format-BUYXZqDw.js → format-ZWN4JNj-.js} +0 -0
- /package/web/dist/assets/{ui-CerQw0jA.js → ui-D1crlGpt.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as Gt}from"./chunk-
|
|
1
|
+
import{d as Gt}from"./chunk-YNS5LQX5.js";import{c as Xt,d as Qt,e as Zt,f as Re,h as et,i as en,s as nn,t as rn,u as on,v as sn}from"./chunk-EWYXVBOG.js";import{a as Qe,e as Ze}from"./chunk-TCBGUVVU.js";import{a as Te}from"./chunk-XYZVMTNN.js";import{h as tn}from"./chunk-MNSZE3NV.js";import{a as q,e as an}from"./chunk-R24YRJRG.js";import{c as Wt,f as Jt}from"./chunk-HJICGOD4.js";import{b as qt,k as zt}from"./chunk-LQVBWVLE.js";import{d as Yt,j as Kt}from"./chunk-WVHN54MA.js";import{a as me}from"./chunk-HXDS4NWI.js";import{e as Ut,f as $t,i as Ar}from"./chunk-3UR2PN5N.js";import{a as x}from"./chunk-L7JP7DUO.js";import{b as Xe}from"./chunk-3UZIEE2D.js";import{b as Ft,f as Ht,g as Vt}from"./chunk-FHESRUJY.js";import{C as M,E as X,F as Ge,I as se,b as J,c as oe,d as At,e as xe,g as Mt,h as Ot,m as Lt,n as Ye,o as ie,r as Ee,s as Nt,u as Bt,y as Ke,z as Dr}from"./chunk-MTQI6B7T.js";import{b as pe}from"./chunk-N2OLEUAQ.js";import{a as G,g as jt}from"./chunk-OGY42NUN.js";import{a as be}from"./chunk-ASPPM7TQ.js";import{d as w,i as Pt}from"./chunk-Z6LHGA27.js";import{n as h,p as H}from"./chunk-QL2ZOLMC.js";import{d as K,h as qe}from"./chunk-WBAPIPST.js";import{c as b,h as L}from"./chunk-BLCNUT53.js";import{b as Dt,c as re,e as ze}from"./chunk-245WE5AF.js";import{readFileSync as mn}from"fs";import{dirname as Mr,join as tt}from"path";import{fileURLToPath as Or}from"url";ie();se();jt();L();var Lr=b("audit"),Nr=Or(import.meta.url),ln=Mr(Nr);function jr(){let e=[tt(ln,"prompts","intent-eval.md"),tt(ln,"..","src","audit","prompts","intent-eval.md"),tt(process.cwd(),"src","audit","prompts","intent-eval.md")];for(let t of e)try{return mn(t,"utf8"),t}catch{}return e[e.length-1]}var nt;function Br(){return nt===void 0&&(nt=mn(jr(),"utf8")),nt}var Ur="claude-haiku-4-5-20251001",$r=1,Fr=3e4,rt=0,dn=pe();function pn(){let e=pe();e!==dn&&(dn=e,rt=0)}function cn(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function un(e){return typeof e=="number"&&Number.isInteger(e)&&e>0}function fn(){let e=G("audit.intentEval.maxBudgetUsd");if(cn(e))return e;try{let t=w().audit?.intentEval?.maxBudgetUsd;if(cn(t))return t}catch{}return $r}function Hr(){let e=G("audit.intentEval.timeoutMs");if(un(e))return e;try{let t=w().audit?.intentEval?.timeoutMs;if(un(t))return t}catch{}return Fr}function Vr(){pn(),rt+=1}function Gi(){return pn(),{intentEvalDegradedToday:rt,intentEvalBudgetUsd:fn()}}async function gn(e,t){try{let n=J(e);if(!n||!n.result)return{score:null,failed:!0,reason:"task missing or no result"};let r=M(t),o=Wr(e,n.prompt),i=Br().replace("{{userRequest}}",o).replace("{{roleName}}",r?.name??"(unknown)").replace("{{roleCag}}",r?.cagPrompt??"(none)").replace("{{taskResult}}",n.result),s=G("evaluation.model")??G("anthropic.defaultHaikuModel")??Ur,a=fn(),l=Hr(),d=Te(i,{model:s,maxBudgetUsd:a,maxTurns:2}),c=new Promise((T,k)=>setTimeout(()=>k(new Error(`eval timeout after ${l}ms`)),l)),m=(await Promise.race([d,c])).trim().replace(/^```(?:json)?\s*|\s*```$/g,""),p=JSON.parse(m);if(typeof p.score!="number"||p.score<0||p.score>1||Number.isNaN(p.score))throw new Error(`invalid score: ${p.score}`);return{score:p.score,reason:p.reason,failed:!1}}catch(n){return Vr(),Lr.error({taskId:e,roleId:t,degraded:!0,err:n instanceof Error?n.message:String(n)},"Intent eval failed; degrading to neutral"),{score:null,failed:!0,reason:n instanceof Error?n.message:String(n)}}}function Wr(e,t){try{let n=Jt(e);if(!n?.sessionId)return t;let r=Wt(n.sessionId,100,0),o=r.findIndex(i=>i.id===n.id);if(o===-1)return t;for(let i=o-1;i>=0;i--)if(r[i].role==="user")return r[i].content;return t}catch{return t}}ie();se();se();L();var Jr=b("audit");function we(e,t=7){let n=M(e),r=Re(e,100),o=Date.now(),i=o-t*24*60*60*1e3,s=r.filter(f=>f.createdAt>=i),a=s.map(f=>f.emaScore),l=s.length>0?s.reduce((f,g)=>f+g.scores.weighted,0)/s.length:1,d=[],c=s.filter(f=>f.scores.taskSuccess<.5);c.length>0&&d.push({category:"task_failures",count:c.length,examples:c.slice(0,3).map(f=>f.taskId)});let u=s.filter(f=>f.scores.planAccuracy<.5);u.length>0&&d.push({category:"plan_deviations",count:u.length,examples:u.slice(0,3).map(f=>f.taskId)});let m=s.filter(f=>f.scores.permissionCompliance<.8);m.length>0&&d.push({category:"permission_violations",count:m.length,examples:m.slice(0,3).map(f=>f.taskId)});let p=s.filter(f=>f.scores.efficiency<.3);p.length>0&&d.push({category:"inefficiency",count:p.length,examples:p.slice(0,3).map(f=>f.taskId)});let T=[],k=[];return c.length>s.length*.3&&(T.push("High task failure rate"),k.push({action:"add_rule",detail:"Add rule: verify task feasibility before execution"})),m.length>0&&(T.push("Permission boundary violations"),k.push({action:"adjust_permission",detail:"Review and expand allowedTools if tasks legitimately need wider access"})),u.length>s.length*.5&&(T.push("Frequent plan deviations"),k.push({action:"add_rule",detail:"Add rule: follow execution plan steps more closely, request plan revision if steps are unclear"})),Jr.info({roleId:e,taskCount:s.length,avgScore:l.toFixed(3),failureCategories:d.map(f=>f.category)},"Diagnostic report generated"),{roleId:e,agentName:n?.name??"Unknown",period:{start:i,end:o},taskCount:s.length,avgScore:l,scoreHistory:a,failureBehaviors:d,rootCauses:T,recommendations:k}}L();ze();var Se=b("audit"),hn=.4,qr=5;function yn(e,t,n=hn){if(t>=n)return;let r=M(e);if(!r||r.status==="retired"||r.status==="dead")return;Se.warn({roleId:e,emaScore:t,threshold:n},"Agent EMA below threshold, retiring");let o=we(e),i=JSON.stringify(r.learnedRules),s=zr(r.learnedRules,o);X(e,{status:"retired",learnedRules:s});let a=[...o.failureBehaviors.map(d=>`${d.category}: ${d.count} occurrences`),...o.rootCauses.map(d=>`Root cause: ${d}`),...o.recommendations.map(d=>`Recommendation [${d.action}]: ${d.detail}`)].join(`
|
|
2
2
|
`),l=an(i,JSON.stringify(s));return q({timestamp:Date.now(),oldRules:i,newRules:JSON.stringify(s),diff:a?`--- Diagnostic Report ---
|
|
3
3
|
${a}
|
|
4
4
|
|
|
@@ -62,15 +62,15 @@ ${n}
|
|
|
62
62
|
${r}
|
|
63
63
|
|
|
64
64
|
${o}
|
|
65
|
-
`}function Mn(e){let t=ho,n=yo(e);return[t,go,n]}import{isAbsolute as _o,relative as vo,resolve as bo}from"path";ie();Nt();L();var xo=new Set(["Read","Glob","Grep","LSP"]),Eo=new Set(["Edit","Write","NotebookEdit"]);var Ro=new Set(["search_memories","save_memory","delete_memory","Read","Glob","Grep","LSP"]),To=new Set(["search_memories"]);function De(e){let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${t}$`)}function at(e){return bo(Ee(e))}function On(e,t){return t.some(n=>{let r=at(n),o=vo(r,e);return o===""||!o.startsWith("..")&&!_o(o)})}var lt=b("manager");function Ln(e,t){if(e.includes("*"))try{return De(e).test(t)}catch(n){return lt.warn({pattern:e,error:String(n)},"Pinned parameter glob failed to compile; pin ignored"),!1}return t.includes(e)}function wo(e,t,n){if(e.startsWith("Bash:")){if(t!=="Bash")return!1;let r=e.slice(5),o=n.command??"";return Ln(r,o)}return Ln(e,t)}function So(e,t,n){if(!n?.length)return{input:t,injected:[],overrides:[]};let r=[],o=[],i=t;for(let s of n)if(wo(s.tool,e,i))if(e==="Bash"){let a=i.command??"",l=[];for(let[d,c]of Object.entries(s.params))if(new RegExp(`(^|\\s)${d.replace(/[.+?^${}()|[\]\\]/g,"\\$&")}([= ]|$)`).test(a))r.push({tool:s.tool,key:d,pinnedValue:c,llmValue:"(flag already present)"});else{let m=String(c),p=m.includes("'")||/[\s$`"\\;&|<>(){}[\]*?#~!]/.test(m)?"'"+m.replace(/'/g,"'\\''")+"'":m;l.push(`${d} ${p}`)}l.length>0&&(a=a.trimEnd()+" "+l.join(" "),i={...i,command:a},o.push(s))}else{let a={};for(let[l,d]of Object.entries(s.params))l in i?r.push({tool:s.tool,key:l,pinnedValue:d,llmValue:i[l]}):a[l]=d;Object.keys(a).length>0&&(i={...i,...a},o.push(s))}return{input:i,injected:o,overrides:r}}function Nn(e,t,n){return async(r,o,{agentID:i,blockedPath:s})=>{let{input:a,injected:l,overrides:d}=So(r,o,n?.pinnedParameters);(l.length>0||d.length>0)&<.info({toolName:r,injected:l.length,overrides:d.length,overrideDetails:d},"Pinned parameter injection applied");let c=e(i??"");if(c){if(c.disallowedTools?.includes(r))return{behavior:"deny",message:`Tool ${r} is not allowed for this role.`};if(rn(r))return{behavior:"allow",updatedInput:a};if(c.allowedTools?.length&&!c.allowedTools.includes(r))return{behavior:"deny",message:`Tool ${r} is not in this role's allowedTools allowlist.`}}if(s){let u=at(s);if(n?.deniedReadPaths?.length)for(let m of n.deniedReadPaths){let p=at(m);if(On(u,[p]))return lt.warn({toolName:r,blockedPath:s,agentID:i,deniedPath:m},"Denied: path in deniedReadPaths (absolute blacklist)"),{behavior:"deny",message:`Access denied: ${s} is in the global denied read paths list. This restriction is configured in Settings > Advanced and cannot be overridden by privilege escalation.`}}return n?.roleScope?.length&&On(u,n.roleScope)?{behavior:"allow",updatedInput:a}:t?await t(r,a,`blockedPath:${s}`,i):{behavior:"deny",message:`Access denied: ${s} is outside this role's allowed scope (cwd + additionalDirectories). Configure additionalDirectories to expand access.`}}if(xo.has(r))return{behavior:"allow",updatedInput:a};if(Eo.has(r))return{behavior:"allow",updatedInput:a};if(r==="Bash"&&c){let u=a.command??"";if(c.allowedBashPatterns?.length)for(let m of c.allowedBashPatterns)try{if(De(m).test(u))return{behavior:"allow",updatedInput:a}}catch{}if(c.deniedBashPatterns?.length)for(let m of c.deniedBashPatterns)try{if(De(m).test(u))return{behavior:"deny",message:`Bash command denied by pattern: ${m}`}}catch{}}if(t&&c?.approvalRequired?.length){let u=r==="Bash"?a.command??"":`${r} ${JSON.stringify(a)}`;for(let m of c.approvalRequired)try{if(De(m).test(u))return await t(r,a,m,i)}catch{}}return{behavior:"allow",updatedInput:a}}}function jn(e){let t=new Map;return{SessionStart:[{hooks:[async n=>{if(!e.roleId)return{};let r=n.source,o=e.roleId==="role-chat-manager";if(!o&&r!=="startup"&&r!=="resume")return{};try{let{queryMemoryByTier:i}=await import("./memory-service-
|
|
65
|
+
`}function Mn(e){let t=ho,n=yo(e);return[t,go,n]}import{isAbsolute as _o,relative as vo,resolve as bo}from"path";ie();Nt();L();var xo=new Set(["Read","Glob","Grep","LSP"]),Eo=new Set(["Edit","Write","NotebookEdit"]);var Ro=new Set(["search_memories","save_memory","delete_memory","Read","Glob","Grep","LSP"]),To=new Set(["search_memories"]);function De(e){let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${t}$`)}function at(e){return bo(Ee(e))}function On(e,t){return t.some(n=>{let r=at(n),o=vo(r,e);return o===""||!o.startsWith("..")&&!_o(o)})}var lt=b("manager");function Ln(e,t){if(e.includes("*"))try{return De(e).test(t)}catch(n){return lt.warn({pattern:e,error:String(n)},"Pinned parameter glob failed to compile; pin ignored"),!1}return t.includes(e)}function wo(e,t,n){if(e.startsWith("Bash:")){if(t!=="Bash")return!1;let r=e.slice(5),o=n.command??"";return Ln(r,o)}return Ln(e,t)}function So(e,t,n){if(!n?.length)return{input:t,injected:[],overrides:[]};let r=[],o=[],i=t;for(let s of n)if(wo(s.tool,e,i))if(e==="Bash"){let a=i.command??"",l=[];for(let[d,c]of Object.entries(s.params))if(new RegExp(`(^|\\s)${d.replace(/[.+?^${}()|[\]\\]/g,"\\$&")}([= ]|$)`).test(a))r.push({tool:s.tool,key:d,pinnedValue:c,llmValue:"(flag already present)"});else{let m=String(c),p=m.includes("'")||/[\s$`"\\;&|<>(){}[\]*?#~!]/.test(m)?"'"+m.replace(/'/g,"'\\''")+"'":m;l.push(`${d} ${p}`)}l.length>0&&(a=a.trimEnd()+" "+l.join(" "),i={...i,command:a},o.push(s))}else{let a={};for(let[l,d]of Object.entries(s.params))l in i?r.push({tool:s.tool,key:l,pinnedValue:d,llmValue:i[l]}):a[l]=d;Object.keys(a).length>0&&(i={...i,...a},o.push(s))}return{input:i,injected:o,overrides:r}}function Nn(e,t,n){return async(r,o,{agentID:i,blockedPath:s})=>{let{input:a,injected:l,overrides:d}=So(r,o,n?.pinnedParameters);(l.length>0||d.length>0)&<.info({toolName:r,injected:l.length,overrides:d.length,overrideDetails:d},"Pinned parameter injection applied");let c=e(i??"");if(c){if(c.disallowedTools?.includes(r))return{behavior:"deny",message:`Tool ${r} is not allowed for this role.`};if(rn(r))return{behavior:"allow",updatedInput:a};if(c.allowedTools?.length&&!c.allowedTools.includes(r))return{behavior:"deny",message:`Tool ${r} is not in this role's allowedTools allowlist.`}}if(s){let u=at(s);if(n?.deniedReadPaths?.length)for(let m of n.deniedReadPaths){let p=at(m);if(On(u,[p]))return lt.warn({toolName:r,blockedPath:s,agentID:i,deniedPath:m},"Denied: path in deniedReadPaths (absolute blacklist)"),{behavior:"deny",message:`Access denied: ${s} is in the global denied read paths list. This restriction is configured in Settings > Advanced and cannot be overridden by privilege escalation.`}}return n?.roleScope?.length&&On(u,n.roleScope)?{behavior:"allow",updatedInput:a}:t?await t(r,a,`blockedPath:${s}`,i):{behavior:"deny",message:`Access denied: ${s} is outside this role's allowed scope (cwd + additionalDirectories). Configure additionalDirectories to expand access.`}}if(xo.has(r))return{behavior:"allow",updatedInput:a};if(Eo.has(r))return{behavior:"allow",updatedInput:a};if(r==="Bash"&&c){let u=a.command??"";if(c.allowedBashPatterns?.length)for(let m of c.allowedBashPatterns)try{if(De(m).test(u))return{behavior:"allow",updatedInput:a}}catch{}if(c.deniedBashPatterns?.length)for(let m of c.deniedBashPatterns)try{if(De(m).test(u))return{behavior:"deny",message:`Bash command denied by pattern: ${m}`}}catch{}}if(t&&c?.approvalRequired?.length){let u=r==="Bash"?a.command??"":`${r} ${JSON.stringify(a)}`;for(let m of c.approvalRequired)try{if(De(m).test(u))return await t(r,a,m,i)}catch{}}return{behavior:"allow",updatedInput:a}}}function jn(e){let t=new Map;return{SessionStart:[{hooks:[async n=>{if(!e.roleId)return{};let r=n.source,o=e.roleId==="role-chat-manager";if(!o&&r!=="startup"&&r!=="resume")return{};try{let{queryMemoryByTier:i}=await import("./memory-service-23WVAW7T.js"),s=e.taskPrompt||"role context and recent interactions",a=o?["semantic","working"]:["semantic","episodic"],l=await i(e.roleId,s,a,{topK:5});if(l.length>0)return{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[Memory Context]
|
|
66
66
|
${l.map(u=>`- [${u.tier??"episodic"}] ${u.content}`).join(`
|
|
67
67
|
`)}
|
|
68
68
|
|
|
69
|
-
`}}}catch{}return{}}]}],SubagentStart:[{hooks:[async n=>{let r=e.roleId??n.agent_id;if(!r)return{};let o=[];try{let{getRole:i}=await import("./roles-
|
|
69
|
+
`}}}catch{}return{}}]}],SubagentStart:[{hooks:[async n=>{let r=e.roleId??n.agent_id;if(!r)return{};let o=[];try{let{getRole:i}=await import("./roles-3JXNHL7K.js"),s=i(r);s?.cagPrompt&&s.cagPrompt.trim().length>0&&o.push(`[Role CAG]
|
|
70
70
|
${s.cagPrompt}`)}catch{}try{let i=e.taskPrompt||"role context",{contextString:s,usedIds:a}=await Xe(i,r,{topK:5});s&&o.push(s),e.currentTaskId&&a.length>0&&Ye(e.currentTaskId,a)}catch{}return o.length===0?{}:{hookSpecificOutput:{hookEventName:"SubagentStart",additionalContext:o.join(`
|
|
71
71
|
|
|
72
72
|
`)}}}]}],PreToolUse:[{hooks:[async n=>{let r=e.currentTaskId;if(!r)return{};let o=n.tool_name;if(!o)return{};let i;try{i=w().memory?.midTaskInjection}catch{return{}}if(!i||i.enabled!==!0)return{};let s=t.get(r)??{toolCallCount:0,lastInjectedAt:0,lastSearchMemoriesAt:0};if(To.has(o))return s.toolCallCount=0,s.lastSearchMemoriesAt=Date.now(),t.set(r,s),{};if(Ro.has(o))return{};s.toolCallCount+=1;let a=Date.now();if(s.toolCallCount<i.toolCallThreshold)return t.set(r,s),{};let l=a-s.lastInjectedAt,d=a-s.lastSearchMemoriesAt;if(l<i.cooldownMs||s.lastSearchMemoriesAt>0&&d<i.cooldownMs)return t.set(r,s),{};s.toolCallCount=0,s.lastInjectedAt=a,t.set(r,s);try{let c=e.taskPrompt||"task context",{contextString:u,usedIds:m}=await Xe(c,e.roleId,{topK:i.topK,budgetTokens:i.maxTokens});return u?(m.length>0&&Ye(r,m),{hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:u.replace("[Memory Context \u2014 retrieved from prior interactions]","[Memory Refresh]").replace(/\n\n\[User Request\]\n$/,`
|
|
73
|
-
`)}}):{}}catch{return{}}}]}],SubagentStop:[{hooks:[async n=>{e.currentTaskId&&t.delete(e.currentTaskId);let r=n.agent_id;if(!r||!e.currentTaskId)return{};try{let{createMemory:o}=await import("./memories-
|
|
73
|
+
`)}}):{}}catch{return{}}}]}],SubagentStop:[{hooks:[async n=>{e.currentTaskId&&t.delete(e.currentTaskId);let r=n.agent_id;if(!r||!e.currentTaskId)return{};try{let{createMemory:o}=await import("./memories-2DY5G6ZN.js"),i=n.transcript;if(!i||i.length<=100)return{};let s=`[Task ${e.currentTaskId} reasoning] ${i.slice(0,3e3)}`;o({id:`session-${Date.now()}`,roleId:e.roleId??r,type:"thought",content:s,keywords:[],importance:3,sourceType:"task_complete",sourceTaskId:e.currentTaskId,createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"episodic"})}catch{}return{}}]}],PostToolUse:[{hooks:[async n=>{let r=n.tool_name,o=n.tool_input,i=n.tool_response,s=typeof i=="string"?i:JSON.stringify(i??"");if(e.currentTaskId){try{me({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,taskId:e.currentTaskId,index:0,type:"tool_call",content:`${r}: ${JSON.stringify(o??{})} \u2192 ${s.slice(0,200)}`,toolName:r,toolInput:o,toolOutput:s,timestamp:Date.now()})}catch{}return{}}if(r&&e.getChatSessionId){let a=e.getChatSessionId();if(a)try{let{getCurrentTraceId:l}=await import("./trace-context-UR7DI5ME.js"),{recordChatToolCall:d}=await import("./chat-tool-calls-2C7O4B2X.js"),c=l()??"";c&&d({traceId:c,sessionId:a,toolName:r,toolInput:o,toolOutputSummary:s.slice(0,500)})}catch{try{let{recordAuditDiagnostic:l}=await import("./audit-diagnostics-2MDM3IQT.js");await l({source:"chat_tool_calls_logger",severity:"warning",sourceId:a,message:`chat_tool_calls write failed: ${String(r)}`})}catch{}}}return{}}]}],PreCompact:[{hooks:[async n=>({})]}],PostCompact:[{hooks:[async n=>{let r=n.compact_summary;if(!r||r.trim().length===0)return{};try{let{createMemory:o}=await import("./memories-2DY5G6ZN.js");o({id:`compact-${Date.now()}`,roleId:e.roleId??"role-chat-manager",type:"thought",content:r.slice(0,5e3),keywords:["compaction","context","decisions"],importance:4,sourceType:"post_compact",createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"working"})}catch{}return{}}]}]}}se();Ar();ie();H();qe();L();H();import{randomUUID as ko}from"crypto";function Bn(e,t,n){let o=h().prepare(`
|
|
74
74
|
INSERT INTO task_plugins (id, task_id, plugin_path, plugin_name, role_id, used_at)
|
|
75
75
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
76
76
|
`),i=Date.now();for(let s of t){let a=s.split("/").pop()??s;o.run(ko(),e,s,a,n??null,i)}}function zs(e){return h().prepare(`
|
|
@@ -111,7 +111,7 @@ ${s.cagPrompt}`)}catch{}try{let i=e.taskPrompt||"role context",{contextString:s,
|
|
|
111
111
|
\u2026(truncated)`:P}),A.on("exit",I=>{if(I===null||I===0)return;if(_.includes("sandbox")){y.error({taskId:t.id,roleId:t.roleId,exitCode:I,stderr:_.slice(0,500)},"Sandbox wrapper failed \u2014 task process exited before execution"),Ue({roleId:t.roleId??"unknown",taskId:t.id,path:d,operation:`sandbox_init_failure:exit_${I}`,timestamp:Date.now()});return}if(_.length===0)return;let C;try{C=(h().prepare("SELECT COUNT(*) as n FROM step_logs WHERE task_id = ?").get(t.id)?.n??0)+1}catch{C=1e5+Date.now()%1e5}try{me({id:je(),taskId:t.id,index:C,type:"error",content:_,truncated:_.endsWith("\u2026(truncated)"),timestamp:Date.now()})}catch(P){y.warn({taskId:t.id,error:P},"Failed to persist stderr to step_logs")}}),D},stderr:R=>{R.trim()&&y.debug({stderr:R.trim().slice(0,500)},"ExecutionManager SDK stderr")}}}),B="";try{let R=t.config.timeout??600,D=Math.max(500,Math.min(18e4,R*1e3/2)),A=Date.now(),I=!1,C=[],P=O[Symbol.asyncIterator]();for(;;){let W=Math.max(0,D-(Date.now()-A)),We=[P.next().then(S=>({done:S.done??!1,value:S.value})),new Promise(S=>setTimeout(()=>S({done:!0,timedOut:!0}),W))],ne=await Promise.race(We);if(ne.timedOut){I=!0,y.warn({taskId:t.id,inactivityMs:D},"ExecutionManager: SDK loop force-closed after inactivity timeout"),P.return?.(void 0).catch(()=>{});break}if(ne.done)break;A=Date.now();let v=ne.value;if(y.debug({eventType:v.type,taskId:t.id},"ExecutionManager SDK event"),v.type==="result"&&typeof v.result=="string"&&(B=v.result),v.type==="result"){typeof v.num_turns=="number"&&(s=v.num_turns),typeof v.total_cost_usd=="number"&&(i=v.total_cost_usd);let S=v.usage;if(S?.input_tokens!==void 0&&S?.output_tokens!==void 0&&(o={input:S.input_tokens,output:S.output_tokens}),Object.keys(V).length>0)try{C=(await O.mcpServerStatus()).map(Y=>({name:Y.name,status:Y.status,error:Y.error}))}catch(F){y.warn({err:F,taskId:t.id},"Phase 3: mcpServerStatus() on result event failed \u2014 extension_health using fallback empty array")}}if(v.token_usage){let S=v.token_usage;S.input_tokens!==void 0&&S.output_tokens!==void 0&&(o={input:S.input_tokens,output:S.output_tokens})}}if(I&&!B&&(B="ExecutionManager: SDK loop force-closed after activity timeout"),t.roleId&&Object.keys(V).length>0)try{let W=h(),We=Oe(W,t.roleId),ne=new Map(We.map(v=>[v.generatedServerName,v])),St=new Map(C.map(v=>[v.name,v]));for(let v of Object.keys(V)){let S=ne.get(v);if(!S)continue;let F=St.get(v),Y=F?.status==="failed";if(pt(W,{extensionId:S.extensionId,lastRunAt:Date.now(),lastStatus:Y?"failure":"success",lastError:Y?F?.error??null:null,lastRoleId:t.roleId,lastTaskId:t.id}),Y){let Je;try{Je=(W.prepare("SELECT COUNT(*) as n FROM step_logs WHERE task_id = ?").get(t.id)?.n??0)+1}catch{Je=2e5+Date.now()%1e5}let kt=V[v],Pr=JSON.stringify({command:kt.command,args:kt.args}),It=`MCP server failed to load: ${F?.error??"(unknown error)"}
|
|
112
112
|
spawn: ${Pr}`.slice(0,4096);try{me({id:je(),taskId:t.id,index:Je,type:"mcp_load_error",content:It,truncated:It.length>=4096,timestamp:Date.now()})}catch(Ct){y.warn({taskId:t.id,serverName:v,error:Ct},"Phase 3: failed to write mcp_load_error step_log")}}}if(C.length===0&&_.length>0&&(_.includes("MCP server")&&_.includes("failed")||_.includes("Failed to initialize")))for(let S of Object.keys(V)){let F=ne.get(S);F&&pt(W,{extensionId:F.extensionId,lastRunAt:Date.now(),lastStatus:"failure",lastError:"(stderr heuristic \u2014 mcpServerStatus unavailable)",lastRoleId:t.roleId,lastTaskId:t.id})}}catch(W){y.warn({err:W,taskId:t.id},"Phase 3: extension_health upsert block failed \u2014 continuing")}let $=Date.now()-r,ue=J(t.id);return ue&&Kn(ue.status)?(x.emit({type:"task_complete_event",taskId:t.id,result:ue.result??B,error:ue.error}),Gn(ue,$)):(oe(t.id,{status:"completed",result:B,completedAt:Date.now(),costUsd:i,tokenUsage:o,numTurns:s,totalDurationMs:$}),x.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"completed"}),x.emit({type:"task_complete_event",taskId:t.id,result:B}),de.length>0&&Bn(t.id,de,t.roleId),y.info({taskId:t.id,durationMs:$,costUsd:i},"ExecutionManager: task completed"),{taskId:t.id,status:"completed",result:B,costUsd:i,tokenUsage:o,numTurns:s,durationMs:$})}catch(R){let D=R instanceof Error?R.message:String(R),A=Date.now()-r,I=J(t.id);if(I&&Kn(I.status))return x.emit({type:"task_complete_event",taskId:t.id,result:I.result,error:I.error??D}),Gn(I,A,D);(D.includes("Prompt is too long")||D.includes("prompt is too long"))&&y.warn({taskId:t.id,error:D},"Task prompt exceeds model context window -- task failed");let C=sn(D),P=_?`
|
|
113
113
|
--- stderr (last 4096 bytes) ---
|
|
114
|
-
${_}`:"",$=C.originalError+P;return oe(t.id,{status:"failed",error:JSON.stringify({...C,originalError:$}),completedAt:Date.now(),totalDurationMs:A,costUsd:i,numTurns:s,tokenUsage:o,errorCategory:C.category}),x.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"failed"}),x.emit({type:"task_complete_event",taskId:t.id,error:D}),y.error({taskId:t.id,error:R},"ExecutionManager: task failed"),{taskId:t.id,status:"failed",error:$,costUsd:i,tokenUsage:o,numTurns:s,durationMs:A}}},wt=t.traceId;return wt?await Dt(wt,"chat",Tt):await Tt()}catch(l){let d=l instanceof Error?l.message:String(l),c=Date.now()-r;return y.error({taskId:t.id,error:l},"ExecutionManager: setup-phase error"),{taskId:t.id,status:"failed",error:d,durationMs:c}}finally{try{Hn(t.id)}catch{}}}};ie();L();var N=b("execution-pool"),ft=new Map;function Xn(e,t,n){ft.set(e,{roleId:t,taskId:n})}function Qn(e){ft.delete(e)}function gt(e){return ft.get(e)}var Zn=class{slots;running=!1;pollTimeoutId=null;executor;constructor(t,n){this.slots=Array.from({length:t},(r,o)=>({index:o,taskId:null,abortController:null})),this.executor=n??new Be}async start(){if(this.running)return;this.running=!0,x.on("task_created",r=>{this.onTaskCreated(r.taskId)}),x.on("task_abort_requested",r=>{this.abortTask(r.taskId,r.reason)}),x.on("task_status_change",r=>{r.newStatus==="pending"&&this.pickupPendingTasks()});let n=w().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,n),N.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let t of this.slots)t.abortController&&(t.abortController.abort(),t.taskId=null,t.abortController=null);N.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let n=w().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,n)};async onTaskCreated(t){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let t=this.slots.find(a=>a.taskId===null);if(!t){N.debug("No free slots available");return}let n=xe("pending");if(n.length===0)return;let o=[...n].sort((a,l)=>a.createdAt-l.createdAt)[0];t.taskId=o.id,t.abortController=new AbortController;let i=t.index,s=o.id;N.info({slotIndex:i,taskId:s},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(o,i).catch(a=>{N.error({taskId:s,error:a},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(t,n){let r=this.slots[n];if(!r)return;let o="completed";try{x.emit({type:"execution_task_start",taskId:t.id,slotIndex:n});let i=await this.executor.execute(t,r.abortController?.signal);o=i.status,N.info({taskId:t.id,status:i.status,slotIndex:n},"ExecutionPool: task finished")}finally{r.taskId=null,r.abortController=null,x.emit({type:"execution_task_end",taskId:t.id,slotIndex:n,status:o}),this.emitSlotChange(),o!=="blocked"&&this.runPostCompletion(t.id,t.roleId).catch(i=>{N.error({taskId:t.id,error:i},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let t=this.slots.filter(o=>o.taskId!==null).length,n=xe("pending");x.emit({type:"execution_slot_change",active:t,max:this.slots.length,queued:n.length});let r=pe();x.emit({type:"stats_update",activeTasks:t,queuedTasks:n.length,totalCostToday:Mt(r)})}async runPostCompletion(t,n){if(n){try{let{processTaskCompletion:r}=await import("./memory-extractor-
|
|
114
|
+
${_}`:"",$=C.originalError+P;return oe(t.id,{status:"failed",error:JSON.stringify({...C,originalError:$}),completedAt:Date.now(),totalDurationMs:A,costUsd:i,numTurns:s,tokenUsage:o,errorCategory:C.category}),x.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"failed"}),x.emit({type:"task_complete_event",taskId:t.id,error:D}),y.error({taskId:t.id,error:R},"ExecutionManager: task failed"),{taskId:t.id,status:"failed",error:$,costUsd:i,tokenUsage:o,numTurns:s,durationMs:A}}},wt=t.traceId;return wt?await Dt(wt,"chat",Tt):await Tt()}catch(l){let d=l instanceof Error?l.message:String(l),c=Date.now()-r;return y.error({taskId:t.id,error:l},"ExecutionManager: setup-phase error"),{taskId:t.id,status:"failed",error:d,durationMs:c}}finally{try{Hn(t.id)}catch{}}}};ie();L();var N=b("execution-pool"),ft=new Map;function Xn(e,t,n){ft.set(e,{roleId:t,taskId:n})}function Qn(e){ft.delete(e)}function gt(e){return ft.get(e)}var Zn=class{slots;running=!1;pollTimeoutId=null;executor;constructor(t,n){this.slots=Array.from({length:t},(r,o)=>({index:o,taskId:null,abortController:null})),this.executor=n??new Be}async start(){if(this.running)return;this.running=!0,x.on("task_created",r=>{this.onTaskCreated(r.taskId)}),x.on("task_abort_requested",r=>{this.abortTask(r.taskId,r.reason)}),x.on("task_status_change",r=>{r.newStatus==="pending"&&this.pickupPendingTasks()});let n=w().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,n),N.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let t of this.slots)t.abortController&&(t.abortController.abort(),t.taskId=null,t.abortController=null);N.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let n=w().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,n)};async onTaskCreated(t){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let t=this.slots.find(a=>a.taskId===null);if(!t){N.debug("No free slots available");return}let n=xe("pending");if(n.length===0)return;let o=[...n].sort((a,l)=>a.createdAt-l.createdAt)[0];t.taskId=o.id,t.abortController=new AbortController;let i=t.index,s=o.id;N.info({slotIndex:i,taskId:s},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(o,i).catch(a=>{N.error({taskId:s,error:a},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(t,n){let r=this.slots[n];if(!r)return;let o="completed";try{x.emit({type:"execution_task_start",taskId:t.id,slotIndex:n});let i=await this.executor.execute(t,r.abortController?.signal);o=i.status,N.info({taskId:t.id,status:i.status,slotIndex:n},"ExecutionPool: task finished")}finally{r.taskId=null,r.abortController=null,x.emit({type:"execution_task_end",taskId:t.id,slotIndex:n,status:o}),this.emitSlotChange(),o!=="blocked"&&this.runPostCompletion(t.id,t.roleId).catch(i=>{N.error({taskId:t.id,error:i},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let t=this.slots.filter(o=>o.taskId!==null).length,n=xe("pending");x.emit({type:"execution_slot_change",active:t,max:this.slots.length,queued:n.length});let r=pe();x.emit({type:"stats_update",activeTasks:t,queuedTasks:n.length,totalCostToday:Mt(r)})}async runPostCompletion(t,n){if(n){try{let{processTaskCompletion:r}=await import("./memory-extractor-TUOOFST2.js"),o=await r(t,n);o>0&&N.debug({taskId:t,roleId:n,memoriesStored:o},"Post-completion: memories extracted")}catch(r){N.error({taskId:t,roleId:n,error:r},"Post-completion: memory extraction failed")}try{let{processTaskReview:r}=await import("./learner-TQQZKRSB.js");await r(t)}catch(r){N.error({taskId:t,roleId:n,error:r},"Post-completion: task review failed")}try{let{evaluateTaskCompletion:r}=await import("./audit-manager-QG7CMBV2.js");r(t,n)}catch(r){N.error({taskId:t,roleId:n,error:r},"Post-completion: audit evaluation failed")}}}getStatus(){let t=this.slots.filter(r=>r.taskId!==null).length,n=xe("pending");return{active:t,max:this.slots.length,queued:n.length}}isHealthy(){return this.running}releaseSlot(t){this.abortTask(t,"watchdog_stale_running")}abortTask(t,n){let r=this.slots.find(o=>o.taskId===t);r&&(N.warn({taskId:t,slotIndex:r.index,reason:n},"ExecutionPool: aborting task slot"),r.abortController&&r.abortController.abort(),r.taskId=null,r.abortController=null,this.emitSlotChange(),this.running&&this.pickupPendingTasks())}};L();ie();var j=b("audit"),Wo="sandbox_violation",_e=new Map,ht=1440*60*1e3,$e=[],Jo=100;function yt(e){let t=e.roleId,n=_e.get(t)??{count:0,timestamps:[]};n.count++,n.timestamps.push(e.timestamp);let r=Date.now()-ht;if(n.timestamps=n.timestamps.filter(o=>o>=r),_e.set(t,n),n.count%100===0)for(let[o,i]of _e.entries()){let s=Date.now()-ht;i.timestamps.filter(a=>a>=s).length===0&&_e.delete(o)}$e.push(e),$e.length>Jo&&$e.shift();try{let o=e.taskId?Ot(e.taskId):void 0;qt({id:`sv-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,ruleId:void 0,taskId:e.taskId,status:"delivered",target:{type:"channel",channelId:"audit"},content:"",attempts:1,messageType:Wo,source:"audit",createdAt:e.timestamp,deliveredAt:e.timestamp,expiresAt:e.timestamp+864e5,error:`${e.operation} on ${e.path}`,traceId:o})}catch(o){j.error({error:o},"Failed to record violation to delivery_log")}try{let o=M(e.roleId);q({timestamp:e.timestamp,oldRules:"sandbox_violation",newRules:`${e.operation} on ${e.path}`,diff:`Sandbox violation: ${e.operation} on ${e.path} (taskId=${e.taskId??"unknown"})`,roleId:e.roleId,source:"audit"})}catch(o){j.error({error:o},"Failed to record violation to evolution_audit")}x.emit({type:"sandbox_violation",roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp})}async function rr(){let e=Q();if(e.platform==="none")return j.info("Sandbox platform is 'none'; violation watcher not started"),()=>{};if(!await e.isAvailable())return j.warn({platform:e.platform},"Sandbox platform detected but not available; violation watcher not started"),()=>{};let n=null;return e.platform==="sandbox-exec"?n=qo():e.platform==="landlock"&&(n=await zo()),()=>{if(n){let r=n;n=null,r.kill("SIGTERM");let o=setTimeout(()=>{try{r.kill("SIGKILL")}catch{}},2e3);r.on("exit",()=>clearTimeout(o))}j.info("Violation watcher stopped")}}function qo(){let e=nr("log",["stream","--predicate",'subsystem == "com.apple.sandbox"',"--style","ndjson","--signal","exit"],{stdio:["ignore","pipe","pipe"]});return e.stdout?.on("data",t=>{let n=t.toString().split(`
|
|
115
115
|
`).filter(Boolean);for(let r of n)try{let o=JSON.parse(r),i=o.eventMessage??o.message??"";if(i.includes("deny")&&(i.includes("file-read")||i.includes("file-write"))){let s=Yo(o,i);s&&yt(s)}}catch{}}),e.stderr?.on("data",t=>{j.debug({msg:t.toString()},"log stream stderr")}),e.on("error",t=>{j.warn({error:t},"macOS violation watcher failed to start")}),j.info("macOS sandbox violation watcher started (log stream)"),e}async function zo(){let e=await er("journalctl",["-kf","--no-pager","-o","short","--grep","landlock"]);if(e)return tr(e),j.info("Linux violation watcher started (journalctl -kf)"),e;let t=await er("dmesg",["-w","-t"]);return t?(tr(t),j.info("Linux violation watcher started (dmesg -w)"),t):(j.warn("Linux violation watcher unavailable: neither journalctl nor dmesg accessible. Sandbox enforcement still active; monitoring disabled."),null)}async function er(e,t){return new Promise(n=>{let r=nr(e,t,{stdio:["ignore","pipe","pipe"]}),o=setTimeout(()=>n(r),500);r.on("error",()=>{clearTimeout(o),n(null)}),r.on("exit",i=>{i!==0&&(clearTimeout(o),n(null))})})}function tr(e){e.stdout?.on("data",t=>{let n=t.toString().split(`
|
|
116
116
|
`).filter(Boolean);for(let r of n)if(r.includes("landlock")&&r.includes("denied")){let o=Ko(r);o&&yt(o)}}),e.stderr?.on("data",t=>{j.debug({msg:t.toString().trim()},"Linux watcher stderr")})}function Yo(e,t){let n=t.match(/(?:path|file)=["']([^"']+)["']/),r=t.match(/deny\s+(file-read|file-write|file-[^\s]+)/),o=n?.[1],i=r?.[1]??"unknown";if(!o)return null;let s=typeof e.processID=="number"?e.processID:void 0,a=s?gt(s):void 0;return{roleId:a?.roleId??"unknown",taskId:a?.taskId,path:o,operation:i,timestamp:Date.now(),count:1}}function Ko(e){let t=e.match(/path="([^"]+)"/)??e.match(/\/[\w\-\.\/\+ ]+/g),n=e.match(/deny\s+(\w+)/),r=e.match(/pid=(\d+)/),o=Array.isArray(t)?t[t.length-1]:t?.[1],i=n?.[1]??"unknown";if(!o)return null;let s=r?parseInt(r[1],10):void 0,a=s?gt(s):void 0;return{roleId:a?.roleId??"unknown",taskId:a?.taskId,path:o,operation:i,timestamp:Date.now(),count:1}}function Ue(e){yt({roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp,count:1})}function or(e){let t=_e.get(e);if(!t)return 0;let n=Date.now()-ht;return t.timestamps.filter(r=>r>=n).length}function ir(){return[...$e]}se();L();H();import{v4 as Qo}from"uuid";H();ze();import{v4 as Go}from"uuid";function Nl(e){let t={id:Go(),traceId:e.traceId??re()??void 0,effectType:e.effectType,effectCategory:e.effectCategory,entityType:e.entityType,entityId:e.entityId,fieldPath:e.fieldPath,before:e.before,after:e.after,createdAt:e.createdAt??Date.now(),actorRoleId:e.actorRoleId,toolName:e.toolName};return h().prepare(`
|
|
117
117
|
INSERT INTO runtime_effects (
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as E,c as A,i as R}from"./chunk-
|
|
1
|
+
import{b as E,c as A,i as R}from"./chunk-MNSZE3NV.js";import{e as C,i as T}from"./chunk-3UR2PN5N.js";import{F as _,I}from"./chunk-MTQI6B7T.js";import{n as w,p as F}from"./chunk-QL2ZOLMC.js";I();T();import{existsSync as W,readdirSync as L,readFileSync as j}from"fs";import{join as P}from"path";function v(l){let s=l.split(`
|
|
2
2
|
`),n=s[0]??"";return n.startsWith("```yaml")||n.startsWith("```")?s.slice(1).join(`
|
|
3
3
|
`):l}function H(l){let s={},o=v(l).split(`
|
|
4
4
|
`);for(let t of o){let u=t.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\s*(.*)$/);if(u)s[u[1].toLowerCase()]=u[2].trim();else if(t.trim()&&!t.startsWith("#")&&!t.startsWith(" ")&&!t.startsWith(" "))break}return s}function M(l,s){let n=[];try{let o=C(s),t=P(o,".claude","skills");if(!W(t))return n;let u=L(t,{withFileTypes:!0});for(let e of u){if(!e.isDirectory()&&!e.isSymbolicLink())continue;let i=P(t,e.name,"SKILL.md");if(W(i))try{let a=j(i,"utf-8"),r=H(a),m=r.name??e.name,c=r.description??"";n.push({name:m,description:c,roleName:s,roleId:l,path:i,rawFrontmatter:r})}catch{}}}catch{}return n}F();var O=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","dare","ought","used","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","also","now","and","but","or","if","because","until","while","about","against","this","that","these","those","it","its"]);function S(l){return l.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(s=>s.length>1&&!O.has(s))}function g(l,s){if(s.length===0)return 0;let n=S(l),o=0;for(let t of s){n.includes(t)&&o++;for(let u of n)u.startsWith(t)&&u!==t&&(o+=.5)}return o}function D(l){let s=w(),n=new Map;if(l.length===0)return n;let o=l.map(()=>"?").join(","),t=s.prepare(`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{c as a}from"./chunk-VVQ532U2.js";import{b as m}from"./chunk-AG5SADAI.js";import{a as d,d as f}from"./chunk-FYULPPFR.js";import{a as s}from"./chunk-ASPPM7TQ.js";import{d as p}from"./chunk-Z6LHGA27.js";import{c,h as g}from"./chunk-BLCNUT53.js";function k(e,n,i){switch(n){case"wechat":return l(e);case"telegram":return e;case"slack":return w(e);case"email":return e;case"webhook":return JSON.stringify({result:e,taskId:i,timestamp:new Date().toISOString()});default:return l(e)}}function l(e){return e.replace(/^#{1,6}\s+/gm,"").replace(/\*\*(.+?)\*\*/g,"$1").replace(/\*(.+?)\*/g,"$1").replace(/__(.+?)__/g,"$1").replace(/_(.+?)_/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/```[\s\S]*?```/g,n=>n.replace(/```\w*\n?/g,"").trim()).replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\n{3,}/g,`
|
|
2
2
|
|
|
3
3
|
`).trim()}function w(e){return e.replace(/\*\*(.+?)\*\*/g,"*$1*").replace(/\[([^\]]+)\]\(([^)]+)\)/g,"<$2|$1>")}f();g();var t=c("message-handler");function x(){try{let e=p().identity?.ownerViewerKey;if(typeof e=="string"&&e.trim().length>0)return e}catch{}return s.identity?.ownerViewerKey??"local-owner"}function u(e){if(e.type==="web"||e.type==="tui"||e.type==="api")return x();if(e.type!=="channel"||!e.channelId){t.warn({source:e},"Viewer identity unavailable for chat source"),r("chat source has no resolvable viewer identity",void 0);return}let i=a(e.channelId)?.viewerKey;if(typeof i=="string"&&i.trim().length>0)return i;t.warn({channelId:e.channelId},"Channel viewerKey missing; recent delivery context disabled"),r("channel viewerKey missing; recent delivery context disabled",e.channelId)}function E(e){if(e.type==="channel"){let o=a(e.channelId)?.viewerKey;if(typeof o=="string"&&o.trim().length>0)return o;t.warn({channelId:e.channelId},"Channel viewerKey missing; ledger recording skipped"),r("channel viewerKey missing; ledger recording skipped",e.channelId);return}let n=m(e.sessionId);if(!n){t.warn({sessionId:e.sessionId},"Session target missing; ledger recording skipped"),r("session target missing; ledger recording skipped",e.sessionId);return}return u(n.source)}function r(e,n){try{d({source:"viewer_identity",severity:"warning",sourceId:n,message:e})}catch{}}import v from"path";var h={".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".csv":"text/csv",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip",".mp3":"audio/mpeg",".ogg":"audio/ogg",".wav":"audio/wav",".amr":"audio/amr",".silk":"audio/x-silk",".md":"text/markdown",".html":"text/html",".json":"application/json",".xml":"text/xml",".mp4":"video/mp4",".mov":"video/quicktime",".webm":"video/webm",".mkv":"video/x-matroska",".avi":"video/x-msvideo",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp"},y={"image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp","image/bmp":".bmp","video/mp4":".mp4","video/quicktime":".mov","video/webm":".webm","video/x-matroska":".mkv","video/x-msvideo":".avi","audio/mpeg":".mp3","audio/ogg":".ogg","audio/wav":".wav","audio/amr":".amr","audio/x-silk":".silk","application/pdf":".pdf","application/zip":".zip","application/x-tar":".tar","application/gzip":".gz","text/plain":".txt","text/csv":".csv","text/markdown":".md","audio/mp3":".mp3","text/html":".html","application/json":".json","application/xml":".xml","text/xml":".xml","application/vnd.openxmlformats-officedocument.wordprocessingml.document":".docx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":".xlsx","application/vnd.openxmlformats-officedocument.presentationml.presentation":".pptx","application/msword":".doc","application/vnd.ms-excel":".xls","application/vnd.ms-powerpoint":".ppt"};function $(e){let n=v.extname(e).toLowerCase();return h[n]??"application/octet-stream"}function F(e){let n=e.split(";")[0].trim().toLowerCase();return y[n]??".bin"}export{k as a,l as b,x as c,u as d,E as e,$ as f,F as g};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as i,p as u}from"./chunk-QL2ZOLMC.js";u();function c(t){return{id:t.id,status:t.status,source:{type:t.source_type,channelId:t.source_channel_id??void 0,chatId:t.source_chat_id??void 0},title:t.title??void 0,createdAt:t.created_at,lastActiveAt:t.last_active_at,archivedAt:t.archived_at??void 0,messageCount:t.message_count}}function d(t){i().prepare(`
|
|
2
2
|
INSERT INTO chat_sessions (id, status, source_type, source_channel_id, source_chat_id,
|
|
3
3
|
title, created_at, last_active_at, archived_at, message_count)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as a,p as l}from"./chunk-QL2ZOLMC.js";l();function c(e){return{id:e.id,templateId:e.template_id,status:e.status,stepStatuses:JSON.parse(e.step_statuses),startedAt:e.started_at,completedAt:e.completed_at??void 0,error:e.error??void 0,eventId:e.event_id??void 0,stepResultsJson:e.step_results_json??void 0}}function _(e,t,s){a().prepare(`
|
|
2
2
|
INSERT INTO template_executions (id, template_id, status, step_statuses, started_at, event_id)
|
|
3
3
|
VALUES (?, ?, 'running', '{}', ?, ?)
|
|
4
|
-
`).run(e,t,Date.now(),
|
|
4
|
+
`).run(e,t,Date.now(),s??null)}function y(e){let s=a().prepare("SELECT * FROM template_executions WHERE id = ?").get(e);return s?c(s):void 0}function E(e,t){let s=a(),r=[],i=[];t.status!==void 0&&(r.push("status = ?"),i.push(t.status)),t.stepStatuses!==void 0&&(r.push("step_statuses = ?"),i.push(JSON.stringify(t.stepStatuses))),t.completedAt!==void 0&&(r.push("completed_at = ?"),i.push(t.completedAt)),t.error!==void 0&&(r.push("error = ?"),i.push(t.error)),r.length!==0&&(i.push(e),s.prepare(`UPDATE template_executions SET ${r.join(", ")} WHERE id = ?`).run(...i))}function R(e){let t=a(),s=Date.now()-e;return t.prepare("SELECT * FROM template_executions WHERE status = 'running' AND started_at < ?").all(s).map(c)}function I(e,t=50,s=0){let r=a(),i="SELECT * FROM template_executions",n=[];return e&&(i+=" WHERE template_id = ?",n.push(e)),i+=" ORDER BY started_at DESC LIMIT ? OFFSET ?",n.push(t,s),r.prepare(i).all(...n).map(c)}function h(e,t=20,s=0){return a().prepare(`
|
|
5
5
|
SELECT te.id AS execution_id,
|
|
6
6
|
te.template_id,
|
|
7
7
|
tt.name AS template_name,
|
|
@@ -18,7 +18,7 @@ import{l as a,n as l}from"./chunk-BPXS4QEO.js";l();function c(e){return{id:e.id,
|
|
|
18
18
|
WHERE e.event_def_id = ?
|
|
19
19
|
ORDER BY te.started_at DESC
|
|
20
20
|
LIMIT ? OFFSET ?
|
|
21
|
-
`).all(e,t,
|
|
21
|
+
`).all(e,t,s).map(n=>({executionId:n.execution_id,templateId:n.template_id,templateName:n.template_name,status:n.status,startedAt:n.started_at,completedAt:n.completed_at,error:n.error,eventId:n.event_id,eventOccurredAt:n.event_occurred_at,eventPayload:n.event_payload?JSON.parse(n.event_payload):null}))}function T(e,t){let s=JSON.stringify(Array.from(t.entries()));a().prepare("UPDATE template_executions SET step_results_json = ? WHERE id = ?").run(s,e)}l();import{v4 as p}from"uuid";function u(e){let t=[];e.traceId||t.push("traceId is required"),e.actor?(e.actor.traceId||t.push("actor.traceId is required"),e.actor.toolName||t.push("actor.toolName is required"),e.traceId&&e.actor.traceId&&e.actor.traceId!==e.traceId&&t.push(`actor.traceId ('${e.actor.traceId}') must equal top-level traceId ('${e.traceId}')`)):t.push("actor is required"),e.effectCategory!=="outbound_message"&&e.effectCategory!=="entity_mutation"&&t.push(`effectCategory must be 'outbound_message' or 'entity_mutation', got '${e.effectCategory}'`),e.verb||t.push("verb is required"),e.entityType||t.push("entityType is required");let s=e.entityId!==void 0&&e.entityId!==null,r=Array.isArray(e.entityIds)&&e.entityIds.length>0;if(s&&r&&t.push("entityId and entityIds are mutually exclusive \u2014 provide one only"),e.effectCategory==="outbound_message"&&(e.target?.channelId||t.push("outbound_message receipts require target.channelId"),(!e.payload||typeof e.payload.textChars!="number"||typeof e.payload.attachmentCount!="number")&&t.push("outbound_message receipts require payload with textChars and attachmentCount (numbers)")),e.outcome!==void 0&&e.outcome!=="success"&&e.outcome!=="failure"&&t.push(`outcome must be 'success' or 'failure', got '${String(e.outcome)}'`),e.effectCategory==="entity_mutation"){!s&&!r&&t.push("entity_mutation receipts require entityId or entityIds (verifier needs an entity to anchor the change)");let i=Array.isArray(e.fieldChanges)&&e.fieldChanges.length>0,n=!!e.scope&&typeof e.scope.matchedCount=="number"&&!!e.scope.filter;!i&&!n&&t.push("entity_mutation receipts require either fieldChanges (non-empty) or scope (with filter+matchedCount)"),r&&!n&&t.push("batch entity_mutation receipts (entityIds set) require scope to describe the matched set")}return{valid:t.length===0,errors:t}}var d=class extends Error{constructor(s){super(`Invalid effect receipt: ${s.join("; ")}`);this.errors=s;this.name="InvalidReceiptError"}errors};function C(e){let t=u(e);if(!t.valid)throw new d(t.errors);let s={id:e.id??p(),traceId:e.traceId,taskId:e.taskId,sessionId:e.sessionId,effectCategory:e.effectCategory,verb:e.verb,entityType:e.entityType,entityId:e.entityId,entityIds:e.entityIds,target:e.target,payload:e.payload,fieldChanges:e.fieldChanges,scope:e.scope,actor:e.actor,outcome:e.outcome??"success",createdAt:e.createdAt??Date.now()};return a().prepare(`
|
|
22
22
|
INSERT INTO effect_receipts (
|
|
23
23
|
id, trace_id, task_id, session_id,
|
|
24
24
|
effect_category, verb, entity_type,
|
|
@@ -27,8 +27,8 @@ import{l as a,n as l}from"./chunk-BPXS4QEO.js";l();function c(e){return{id:e.id,
|
|
|
27
27
|
actor_json, outcome, created_at
|
|
28
28
|
)
|
|
29
29
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
30
|
-
`).run(
|
|
30
|
+
`).run(s.id,s.traceId,s.taskId??null,s.sessionId??null,s.effectCategory,s.verb,s.entityType,s.entityId??null,s.entityIds?JSON.stringify(s.entityIds):null,s.target?JSON.stringify(s.target):null,s.payload?JSON.stringify(s.payload):null,s.fieldChanges?JSON.stringify(s.fieldChanges):null,s.scope?JSON.stringify(s.scope):null,JSON.stringify(s.actor),s.outcome,s.createdAt),s}function O(e){return a().prepare(`
|
|
31
31
|
SELECT * FROM effect_receipts
|
|
32
32
|
WHERE trace_id = ?
|
|
33
33
|
ORDER BY created_at ASC
|
|
34
|
-
`).all(e).map(f)}function f(e){return{id:e.id,traceId:e.trace_id,taskId:e.task_id??void 0,sessionId:e.session_id??void 0,effectCategory:e.effect_category,verb:e.verb,entityType:e.entity_type,entityId:e.entity_id??void 0,entityIds:o(e.entity_ids_json)??void 0,target:o(e.target_json)??void 0,payload:o(e.payload_json)??void 0,fieldChanges:o(e.field_changes_json)??void 0,scope:o(e.scope_json)??void 0,actor:JSON.parse(e.actor_json),outcome:e.outcome??"success",createdAt:e.created_at}}function o(e){if(e!==null)try{return JSON.parse(e)}catch{return}}export{_ as a,y as b,E as c,R as d,I as e,h as f,T as g,d as h,
|
|
34
|
+
`).all(e).map(f)}function f(e){return{id:e.id,traceId:e.trace_id,taskId:e.task_id??void 0,sessionId:e.session_id??void 0,effectCategory:e.effect_category,verb:e.verb,entityType:e.entity_type,entityId:e.entity_id??void 0,entityIds:o(e.entity_ids_json)??void 0,target:o(e.target_json)??void 0,payload:o(e.payload_json)??void 0,fieldChanges:o(e.field_changes_json)??void 0,scope:o(e.scope_json)??void 0,actor:JSON.parse(e.actor_json),outcome:e.outcome??"success",createdAt:e.created_at}}function o(e){if(e!==null)try{return JSON.parse(e)}catch{return}}export{_ as a,y as b,E as c,R as d,I as e,h as f,T as g,d as h,C as i,O as j};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as c,i as s}from"./chunk-
|
|
1
|
+
import{h as c,i as s}from"./chunk-AQAHVNNG.js";import{c as i,h as d}from"./chunk-BLCNUT53.js";import{c as a,e as f}from"./chunk-245WE5AF.js";f();d();var o=i("adam");function l(e){let r=e.traceIdOverride??a();if(!r){o.debug({toolName:e.toolName,entityType:e.entityType,verb:e.verb},"Mutation receipt skipped: no active trace context");return}let n={traceId:r,toolName:e.toolName,taskId:e.taskId,roleId:e.roleId};try{s({traceId:r,taskId:e.taskId,sessionId:e.sessionId,effectCategory:"entity_mutation",verb:e.verb,entityType:e.entityType,entityId:e.entityId,entityIds:e.entityIds,fieldChanges:e.fieldChanges,scope:e.scope,actor:n,outcome:"success"})}catch(t){t instanceof c?o.warn({errors:t.errors,toolName:e.toolName,entityType:e.entityType},"Mutation receipt validation failed"):o.warn({error:t instanceof Error?t.message:String(t),toolName:e.toolName},"Mutation receipt write failed")}}export{l as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as V}from"./chunk-
|
|
1
|
+
import{d as V}from"./chunk-TCBGUVVU.js";import{b as L}from"./chunk-HXDS4NWI.js";import{b as N,o as z}from"./chunk-MTQI6B7T.js";import{n as c,p as k}from"./chunk-QL2ZOLMC.js";import{c as F,h as X}from"./chunk-BLCNUT53.js";z();k();k();function ye(e){c().prepare(`
|
|
2
2
|
INSERT INTO audit_violations
|
|
3
3
|
(id, step_task_id, execution_id, role_id, contract_field, layer, severity, message, metadata_json, created_at)
|
|
4
4
|
VALUES
|
|
@@ -10,13 +10,13 @@ import{d as V}from"./chunk-J3VYLSJI.js";import{b as L}from"./chunk-F6U5TMM3.js";
|
|
|
10
10
|
SELECT token_usage FROM tasks
|
|
11
11
|
WHERE role_id = ? AND status = 'completed' AND token_usage IS NOT NULL
|
|
12
12
|
ORDER BY completed_at DESC LIMIT 50
|
|
13
|
-
`).all(e);if(t.length===0)return 1e4;let s=t.map(r=>{let
|
|
13
|
+
`).all(e);if(t.length===0)return 1e4;let s=t.map(r=>{let a=JSON.parse(r.token_usage);return(a.input??0)+(a.output??0)}).sort((r,a)=>r-a);return s[Math.floor(s.length/2)]}function Oe(e){let t=c().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(e);return t?P(t):void 0}function Ie(e,n,t,s,r){let a=c(),d=a.prepare("SELECT id, role_id, score_json FROM role_scores WHERE task_id = ?").get(e);if(!d)return;let u=JSON.parse(d.score_json);u.intentFulfillment=n,u.intentFulfillmentFailed=t,u.weighted=s(u);let p=a.prepare("SELECT ema_score FROM role_scores WHERE role_id = ? AND created_at < (SELECT created_at FROM role_scores WHERE id = ?) ORDER BY created_at DESC LIMIT 1").get(d.role_id,d.id),l=p!==void 0?r*u.weighted+(1-r)*p.ema_score:u.weighted;return a.prepare("UPDATE role_scores SET score_json = ?, ema_score = ? WHERE id = ?").run(JSON.stringify(u),l,d.id),l}function xe(e,n){let s=c().prepare(`
|
|
14
14
|
SELECT rs.score_json, t.cost_usd, t.completed_at, rs.created_at
|
|
15
15
|
FROM role_scores rs
|
|
16
16
|
JOIN tasks t ON t.id = rs.task_id
|
|
17
17
|
WHERE rs.role_id = ? AND rs.task_type = ?
|
|
18
18
|
ORDER BY rs.created_at DESC
|
|
19
|
-
`).all(e,n);if(s.length===0)return{totalTasks:0,successRate:0,avgCostUsd:0,lastAttempt:null};let r=s.length,d=s.filter(f=>JSON.parse(f.score_json).taskSuccess===1).length/r,p=s.map(f=>f.cost_usd??0).reduce((f,E)=>f+E,0)/r,l=s[0]?.created_at??null;return{totalTasks:r,successRate:d,avgCostUsd:p,lastAttempt:l}}function Me(e,n=50){let s=Z(e,n).map(d=>d.scores.contractCompliance).filter(d=>d!=null);return s.length===0?{emaScore:null,recentViolations:v(e,10),contractsCheckedRowCount:0}:{emaScore:[...s].reverse().reduce((d,u,p)=>p===0?u:A*u+(1-A)*d,0),recentViolations:v(e,10),contractsCheckedRowCount:s.length}}X();import{v4 as ee}from"uuid";var te=F("audit"),O={taskSuccess:.25,planAccuracy:.2,permissionCompliance:.2,efficiency:.15,intentFulfillment:.2},M={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},A=.3;function se(e){return e.intentFulfillment===null||e.intentFulfillment===void 0?e.taskSuccess*M.taskSuccess+e.planAccuracy*M.planAccuracy+e.permissionCompliance*M.permissionCompliance+e.efficiency*M.efficiency:e.taskSuccess*O.taskSuccess+e.planAccuracy*O.planAccuracy+e.permissionCompliance*O.permissionCompliance+e.efficiency*O.efficiency+e.intentFulfillment*O.intentFulfillment}function ne(e,n){let t=N(e),s=t?.status==="completed"?1:0,r=1,
|
|
19
|
+
`).all(e,n);if(s.length===0)return{totalTasks:0,successRate:0,avgCostUsd:0,lastAttempt:null};let r=s.length,d=s.filter(f=>JSON.parse(f.score_json).taskSuccess===1).length/r,p=s.map(f=>f.cost_usd??0).reduce((f,E)=>f+E,0)/r,l=s[0]?.created_at??null;return{totalTasks:r,successRate:d,avgCostUsd:p,lastAttempt:l}}function Me(e,n=50){let s=Z(e,n).map(d=>d.scores.contractCompliance).filter(d=>d!=null);return s.length===0?{emaScore:null,recentViolations:v(e,10),contractsCheckedRowCount:0}:{emaScore:[...s].reverse().reduce((d,u,p)=>p===0?u:A*u+(1-A)*d,0),recentViolations:v(e,10),contractsCheckedRowCount:s.length}}X();import{v4 as ee}from"uuid";var te=F("audit"),O={taskSuccess:.25,planAccuracy:.2,permissionCompliance:.2,efficiency:.15,intentFulfillment:.2},M={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},A=.3;function se(e){return e.intentFulfillment===null||e.intentFulfillment===void 0?e.taskSuccess*M.taskSuccess+e.planAccuracy*M.planAccuracy+e.permissionCompliance*M.permissionCompliance+e.efficiency*M.efficiency:e.taskSuccess*O.taskSuccess+e.planAccuracy*O.planAccuracy+e.permissionCompliance*O.permissionCompliance+e.efficiency*O.efficiency+e.intentFulfillment*O.intentFulfillment}function ne(e,n){let t=N(e),s=t?.status==="completed"?1:0,r=1,a=V(e);a?.deviationReport&&(r=a.deviationReport.overallAccuracy);let d=1,u=L(e,1e3),p=u.filter(_=>_.type==="tool_result"||_.type==="permission_denied").length,l=u.filter(_=>_.type==="permission_denied").length;p>0&&(d=1-l/p);let f=1;if(t?.tokenUsage){let _=t.tokenUsage.input+t.tokenUsage.output,i=n?U(n):1e4;_>i&&(f=Math.max(0,1-(_-i)/i))}let E=se({taskSuccess:s,planAccuracy:r,permissionCompliance:d,efficiency:f,intentFulfillment:void 0}),T=t?.config?.outputContractCheckCount??0,x=null;if(T>0){let i=H(e).filter(o=>!(o.severity==="warning"&&o.layer==="C"));x=Math.max(0,Math.min(1,1-i.length/T))}return{taskSuccess:s,planAccuracy:r,permissionCompliance:d,efficiency:f,contractCompliance:x,contractsCheckedThisTask:T,weighted:E}}function Ve(e,n,t){let s=ne(n,e),r=B(e),a=r!==void 0?A*s.weighted+(1-A)*r:s.weighted;return W({id:ee(),roleId:e,taskId:n,scores:s,emaScore:a,createdAt:Date.now(),taskType:t}),te.debug({roleId:e,taskId:n,scores:{...s,weighted:s.weighted.toFixed(3)},ema:a.toFixed(3)},"Task score recorded"),a}k();function q(e){return{id:e.id,sourceSessionId:e.source_session_id??void 0,sourceMessageId:e.source_message_id??void 0,extractedAt:e.extracted_at,extractedByRoleId:e.extracted_by_role_id??void 0,content:e.content,summary:e.summary??void 0,status:e.status,tags:e.tags?JSON.parse(e.tags):void 0,evidenceQuote:e.evidence_quote??void 0,createdAt:e.created_at,updatedAt:e.updated_at}}var re=`
|
|
20
20
|
INSERT INTO feature_requests
|
|
21
21
|
(id, source_session_id, source_message_id, extracted_at, extracted_by_role_id,
|
|
22
22
|
content, summary, status, tags, evidence_quote, created_at, updated_at)
|
|
@@ -40,17 +40,17 @@ import{d as V}from"./chunk-J3VYLSJI.js";import{b as L}from"./chunk-F6U5TMM3.js";
|
|
|
40
40
|
last_seen = ?,
|
|
41
41
|
updated_at = ?
|
|
42
42
|
WHERE dimension_type = ? AND dimension_value = ?
|
|
43
|
-
`).run(JSON.stringify(u),JSON.stringify(l),e.lastSeen,t,e.dimensionType,e.dimensionValue)}else n.prepare(ie).run(`mp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.dimensionType,e.dimensionValue,1,JSON.stringify(e.roleIds),JSON.stringify(s),"new",e.firstSeen,e.lastSeen,t,t);let
|
|
43
|
+
`).run(JSON.stringify(u),JSON.stringify(l),e.lastSeen,t,e.dimensionType,e.dimensionValue)}else n.prepare(ie).run(`mp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.dimensionType,e.dimensionValue,1,JSON.stringify(e.roleIds),JSON.stringify(s),"new",e.firstSeen,e.lastSeen,t,t);let a=n.prepare("SELECT * FROM mistake_patterns WHERE dimension_type = ? AND dimension_value = ?").get(e.dimensionType,e.dimensionValue);return D(a)}function je(e,n=100,t=0){let s=c();return(e?s.prepare("SELECT * FROM mistake_patterns WHERE status = ? ORDER BY last_seen DESC LIMIT ? OFFSET ?").all(e,n,t):s.prepare("SELECT * FROM mistake_patterns ORDER BY last_seen DESC LIMIT ? OFFSET ?").all(n,t)).map(D)}function Ye(e){let t=c().prepare("SELECT * FROM mistake_patterns WHERE id = ?").get(e);return t?D(t):void 0}function Ke(e,n){c().prepare(ae).run(n,Date.now(),e)}import{createSdkMcpServer as ce,tool as de}from"@anthropic-ai/claude-agent-sdk";import{z as S}from"zod";import{v4 as ue}from"uuid";var Y={content:S.string().min(1).max(5e3),summary:S.string().max(500).optional(),tags:S.array(S.string().max(50)).max(10).optional(),evidenceQuote:S.string().max(1e3).optional(),sourceSessionId:S.string().optional(),sourceMessageId:S.string().optional()};function le(e){return de("record_feature_request","Record a feature request extracted from chat sessions. Call this once per distinct feature request found in the provided chat data. Do not fabricate \u2014 only record requests that appear verbatim or clearly in the chat content.",Y,async n=>{let t=S.object(Y).safeParse(n);if(!t.success)return{content:[{type:"text",text:JSON.stringify({ok:!1,error:t.error.message})}]};let s=t.data,r=Date.now(),a=ue(),d={id:a,content:s.content,summary:s.summary,status:"new",tags:s.tags??[],evidenceQuote:s.evidenceQuote,sourceSessionId:s.sourceSessionId,sourceMessageId:s.sourceMessageId,extractedByRoleId:e,extractedAt:r,createdAt:r,updatedAt:r};try{J(d)}catch{return{content:[{type:"text",text:JSON.stringify({ok:!1,error:"failed to write feature request"})}]}}return{content:[{type:"text",text:JSON.stringify({success:!0,featureRequestId:a,summary:s.summary??s.content.slice(0,80)})}]}})}function K(e){return ce({name:"mining-tools",version:"1.0.0",tools:[le(e)]})}import{createSdkMcpServer as pe,tool as fe}from"@anthropic-ai/claude-agent-sdk";import{z as I}from"zod";k();var C=.5,w=.3;function me(e,n,t,s){let r=e<t,a=n<s;return r&&a?"both":r?"low_ema":"low_task"}function Q(e={}){let{windowDays:n=14,dimensions:t=["event_type","score_degradation","tool_call_pattern"],minOccurrences:s=3,minRoles:r=2,scoreThresholdEma:a=C,scoreThresholdTask:d=w}=e,u=c(),p=Date.now()-n*864e5,l=new Map;if(t.includes("event_type")){let i=u.prepare(`
|
|
44
44
|
SELECT id, role_id, source, timestamp
|
|
45
45
|
FROM evolution_audit
|
|
46
46
|
WHERE timestamp >= ? AND source IN ('audit','monitor','admin','manual')
|
|
47
47
|
ORDER BY timestamp ASC
|
|
48
|
-
`).all(p);for(let o of
|
|
48
|
+
`).all(p);for(let o of i){let g=o.source,R=`event_type|${g}`;l.has(R)||l.set(R,{dimensionType:"event_type",dimensionValue:g,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let m=l.get(R);m.count++,o.role_id&&m.roleIds.add(o.role_id),m.evidenceIds.push({source:"evolution_audit",id:o.id}),o.timestamp<m.firstSeen&&(m.firstSeen=o.timestamp),o.timestamp>m.lastSeen&&(m.lastSeen=o.timestamp)}}if(t.includes("score_degradation")){let i=u.prepare(`
|
|
49
49
|
SELECT id, role_id, score_json, ema_score, created_at
|
|
50
50
|
FROM role_scores
|
|
51
51
|
WHERE created_at >= ?
|
|
52
52
|
ORDER BY created_at ASC
|
|
53
|
-
`).all(p);for(let o of
|
|
53
|
+
`).all(p);for(let o of i){let g=o.ema_score;try{let b=JSON.parse(o.score_json);typeof b.weighted=="number"?g=b.weighted:typeof b.task=="number"?g=b.task:typeof b.score=="number"&&(g=b.score)}catch{}let R=me(o.ema_score,g,a,d),m=`score_degradation|${R}`;l.has(m)||l.set(m,{dimensionType:"score_degradation",dimensionValue:R,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let y=l.get(m);y.count++,y.roleIds.add(o.role_id),y.evidenceIds.push({source:"role_scores",id:o.id}),o.created_at<y.firstSeen&&(y.firstSeen=o.created_at),o.created_at>y.lastSeen&&(y.lastSeen=o.created_at)}}if(t.includes("tool_call_pattern")){let i=u.prepare(`
|
|
54
54
|
SELECT dl.id, dl.task_id, dl.error, dl.created_at, t.role_id
|
|
55
55
|
FROM delivery_log dl
|
|
56
56
|
LEFT JOIN tasks t ON t.id = dl.task_id
|
|
@@ -58,4 +58,4 @@ import{d as V}from"./chunk-J3VYLSJI.js";import{b as L}from"./chunk-F6U5TMM3.js";
|
|
|
58
58
|
AND dl.message_type = 'sandbox_violation'
|
|
59
59
|
AND dl.source = 'audit'
|
|
60
60
|
ORDER BY dl.created_at ASC
|
|
61
|
-
`).all(p);for(let o of
|
|
61
|
+
`).all(p);for(let o of i){let g=(o.error??"").slice(0,60),R=`tool_call_pattern|${g}`;l.has(R)||l.set(R,{dimensionType:"tool_call_pattern",dimensionValue:g,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let m=l.get(R);m.count++,o.role_id&&m.roleIds.add(o.role_id),m.evidenceIds.push({source:"delivery_log",id:o.id}),o.created_at<m.firstSeen&&(m.firstSeen=o.created_at),o.created_at>m.lastSeen&&(m.lastSeen=o.created_at)}}let f={};for(let i of l.keys()){let[o]=i.split("|");f[o]=(f[o]??0)+1}let E=Array.from(l.values()).filter(i=>i.count>=s&&i.roleIds.size>=r),T=0,x=u.transaction(()=>{for(let i of E)j({dimensionType:i.dimensionType,dimensionValue:i.dimensionValue,roleIds:Array.from(i.roleIds),sampleEvidenceIds:i.evidenceIds.slice(-10),firstSeen:i.firstSeen===1/0?Date.now():i.firstSeen,lastSeen:i.lastSeen}),T++});try{x()}catch(i){throw new Error(`aggregateMistakes: transaction failed: ${i}`)}let _=0;for(let i of l.values())_+=i.count;return{patternsUpserted:T,totalEventsScanned:_,dimensionCounts:f}}var $={windowDays:I.number().int().min(1).max(365).optional(),dimensions:I.enum(["event_type","score_degradation","tool_call_pattern"]).array().min(1).max(3).optional(),minOccurrences:I.number().int().min(1).max(100).optional(),minRoles:I.number().int().min(1).max(100).optional()};function _e(){return fe("aggregate_mistakes","Aggregate cross-role failure signals from the last N days into mistake patterns. Returns counts + dimensions; patterns are persisted to mistake_patterns for UI review. Notify-only: no role/permission/CAG mutation.",$,async e=>{let n=I.object($).safeParse(e);if(!n.success)return{content:[{type:"text",text:JSON.stringify({ok:!1,error:n.error.message})}]};let t=n.data,s={windowDays:t.windowDays??14,dimensions:t.dimensions??["event_type","score_degradation","tool_call_pattern"],minOccurrences:t.minOccurrences??3,minRoles:t.minRoles??2,scoreThresholdEma:C,scoreThresholdTask:w};try{let r=Q(s);return{content:[{type:"text",text:JSON.stringify({ok:!0,...r})}]}}catch(r){return{content:[{type:"text",text:JSON.stringify({ok:!1,error:String(r)})}]}}})}var ge="audit-tools";function G(){return pe({name:ge,version:"1.0.0",tools:[_e()]})}var Re=new Set(["mcp__execution-tools__","mcp__mining-tools__","mcp__audit-tools__"]);function ut(e){if(!e)return!1;for(let n of Re)if(e.startsWith(n))return!0;return!1}function lt(e){return e.presetId==="feature-miner"?{"mining-tools":K(e.id)}:e.presetId==="mistake-digester"?{"audit-tools":G()}:{}}function pt(e,n){let t=e.toLowerCase(),s=e;return/\b401\b/.test(t)||/unauthorized/i.test(t)||/invalid.*(?:api.?)?key/i.test(t)||/auth.*fail/i.test(t)||/invalid.*token/i.test(t)||n?.httpStatus===401?{category:"AUTH",originalError:s,retryable:!1,userAction:"Update the API key or credentials in the Role configuration",sameRoleRetry:!1,differentRoleHelp:!1}:/\b429\b/.test(t)||/rate.?limit/i.test(t)||/too many requests/i.test(t)||/quota.?exhaust/i.test(t)||/rate.?limit.?exceed/i.test(t)||/too.?many.?calls/i.test(t)?{category:"RATE_LIMIT",originalError:s,retryable:!0,userAction:"Wait before retrying, or increase the rate limit quota",sameRoleRetry:!0,differentRoleHelp:!1}:/econnrefused/i.test(t)||/enotfound/i.test(t)||/dns/i.test(t)||/connection.?refused/i.test(t)||/connection.?reset/i.test(t)||/connection.?timed? ?out/i.test(t)||/fetch.?failed/i.test(t)||/network.?error/i.test(t)||/socket.?hang.?up/i.test(t)||/etimedout/i.test(t)?{category:"NETWORK",originalError:s,retryable:!0,userAction:"Check network connectivity and that the target service is reachable",sameRoleRetry:!0,differentRoleHelp:!1}:/prompt is too long/i.test(t)||/context.*exceed/i.test(t)||/context.*window/i.test(t)||/too many tokens/i.test(t)||/max.?tokens/i.test(t)||/token.?limit/i.test(t)?{category:"CONTEXT_OVERFLOW",originalError:s,retryable:!1,userAction:"Shorten the task prompt or simplify the request",sameRoleRetry:!1,differentRoleHelp:!1}:n?.sandboxViolation||/sandbox/i.test(t)||/not allowed.*sandbox/i.test(t)||/sandbox.*deny/i.test(t)||/operation.*denied.*sandbox/i.test(t)?{category:"SANDBOX_VIOLATION",originalError:s,retryable:!1,userAction:"Grant filesystem access in Role settings, or run without sandbox",sameRoleRetry:!1,differentRoleHelp:!0}:/tool.*not found/i.test(t)||/command not found/i.test(t)||/enoent/i.test(t)||/no such file/i.test(t)||/mcp.*error.*tool/i.test(t)||/tool.*blocked/i.test(t)||n?.toolName&&/not.*found/.test(t)&&/tool/.test(t)?{category:"TOOL_UNAVAILABLE",originalError:s,retryable:!1,userAction:"Install the required tool or plugin, or add it to the Role's allowed tools",sameRoleRetry:!1,differentRoleHelp:!0}:/timeout/i.test(t)||/timed out/i.test(t)||/exceeded.*seconds/i.test(t)?{category:"TIMEOUT",originalError:s,retryable:!0,userAction:"Increase the task timeout or simplify the task",sameRoleRetry:!0,differentRoleHelp:!1}:/invalid.*url/i.test(t)||/bad request/i.test(t)||/400\b/.test(t)||/wrong.*method/i.test(t)||/invalid.*param/i.test(t)||/missing.*param/i.test(t)?{category:"MALFORMED_REQUEST",originalError:s,retryable:!1,userAction:"Fix the task parameters and retry",sameRoleRetry:!1,differentRoleHelp:!1}:/internal.*error/i.test(t)||/unexpected.*error/i.test(t)||/500\b/.test(t)||/503\b/.test(t)?{category:"INTERNAL_ERROR",originalError:s,retryable:!0,userAction:"The service had an internal error. Retry may succeed.",sameRoleRetry:!0,differentRoleHelp:!1}:{category:"UNKNOWN",originalError:s,retryable:!1,userAction:void 0,sameRoleRetry:!1,differentRoleHelp:!1}}export{ye as a,Ee as b,A as c,se as d,Ve as e,Z as f,B as g,Oe as h,Ie as i,xe as j,Me as k,J as l,We as m,Be as n,Ue as o,je as p,Ye as q,Ke as r,Re as s,ut as t,lt as u,pt as v};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{h as u}from"./chunk-
|
|
1
|
+
import{h as u}from"./chunk-TJTH7LHX.js";import{n as d,p as l}from"./chunk-QL2ZOLMC.js";l();function r(e){return{id:e.id,roleId:e.role_id,content:e.content,confidence:e.confidence,useCount:e.use_count,successCount:e.success_count,isAnti:e.is_anti===1,evidenceObsIds:e.evidence_obs_ids?JSON.parse(e.evidence_obs_ids):[],embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,supersededBy:e.superseded_by??void 0,createdAt:e.created_at,lastUsedAt:e.last_used_at,lastValidatedAt:e.last_validated_at}}function f(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function p(e){d().prepare(`
|
|
2
2
|
INSERT INTO beliefs (id, role_id, content, confidence, use_count, success_count,
|
|
3
3
|
is_anti, evidence_obs_ids, embedding, superseded_by,
|
|
4
4
|
created_at, last_used_at, last_validated_at)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as r,p as n}from"./chunk-QL2ZOLMC.js";import{c,e as u}from"./chunk-245WE5AF.js";import{c as d,e as o}from"./chunk-FCV2DPZQ.js";var D={};o(D,{listAuditDiagnostics:()=>A,recordAuditDiagnostic:()=>g});import{v4 as a}from"uuid";function g(e){let t={id:a(),source:e.source,severity:e.severity,traceId:e.traceId??c()??void 0,sourceId:e.sourceId,message:e.message,createdAt:e.createdAt??Date.now()};return r().prepare(`
|
|
2
2
|
INSERT INTO audit_diagnostics (id, source, severity, trace_id, source_id, message, created_at)
|
|
3
3
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
4
4
|
`).run(t.id,t.source,t.severity,t.traceId??null,t.sourceId??null,t.message,t.createdAt),t}function A(e={}){let t=[],i=[];e.source&&(t.push("source = ?"),i.push(e.source)),e.traceId&&(t.push("trace_id = ?"),i.push(e.traceId));let s="SELECT * FROM audit_diagnostics";return t.length>0&&(s+=` WHERE ${t.join(" AND ")}`),s+=" ORDER BY created_at DESC",e.limit!==void 0&&(s+=" LIMIT ?",i.push(e.limit)),r().prepare(s).all(...i).map(m)}function m(e){return{id:e.id,source:e.source,severity:e.severity,traceId:e.trace_id??void 0,sourceId:e.source_id??void 0,message:e.message,createdAt:e.created_at}}var I=d(()=>{n();u()});export{g as a,A as b,D as c,I as d};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{d as D}from"./chunk-
|
|
1
|
+
import{d as D}from"./chunk-SCUPWMI5.js";import{a as b}from"./chunk-NUJSTEV4.js";import{f as v}from"./chunk-HJICGOD4.js";import{g as O}from"./chunk-32LOJEHE.js";import{a as S,b as P,c,d as I,e as w,f as C,g as M}from"./chunk-LQVBWVLE.js";import{c as x}from"./chunk-VVQ532U2.js";import{b as y}from"./chunk-AG5SADAI.js";import{b as R}from"./chunk-AQAHVNNG.js";import{s as k}from"./chunk-K4IE6DPX.js";import{a as f}from"./chunk-L7JP7DUO.js";import{b as h,o as B}from"./chunk-MTQI6B7T.js";import{n as d,p as j}from"./chunk-QL2ZOLMC.js";import{c as E,h as N}from"./chunk-BLCNUT53.js";j();function L(i){return{id:i.id,eventType:i.event_type,matchCriteria:JSON.parse(i.match_criteria),target:JSON.parse(i.target),formatTemplate:i.format_template??void 0,maxPerMinute:i.max_per_minute,skipOriginChannel:i.skip_origin_channel===1,enabled:i.enabled===1,createdAt:i.created_at,createdBy:i.created_by??void 0}}function q(i){d().prepare(`
|
|
2
2
|
INSERT INTO delivery_rules (id, event_type, match_criteria, target, format_template,
|
|
3
3
|
max_per_minute, skip_origin_channel, enabled, created_at, created_by)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
5
|
-
`).run(i.id,i.eventType,JSON.stringify(i.matchCriteria),JSON.stringify(i.target),i.formatTemplate??null,i.maxPerMinute,i.skipOriginChannel?1:0,i.enabled?1:0,i.createdAt,i.createdBy??null)}function H(i){let n=d().prepare("SELECT * FROM delivery_rules WHERE id = ?").get(i);return n?L(n):void 0}function W(i){let e=d(),n="SELECT * FROM delivery_rules",r=[];return i!==void 0&&(n+=" WHERE enabled = ?",r.push(i?1:0)),n+=" ORDER BY created_at DESC",e.prepare(n).all(...r).map(L)}function U(i,e){let n=d(),r=[],t=[];e.eventType!==void 0&&(r.push("event_type = ?"),t.push(e.eventType)),e.matchCriteria!==void 0&&(r.push("match_criteria = ?"),t.push(JSON.stringify(e.matchCriteria))),e.target!==void 0&&(r.push("target = ?"),t.push(JSON.stringify(e.target))),e.formatTemplate!==void 0&&(r.push("format_template = ?"),t.push(e.formatTemplate)),e.maxPerMinute!==void 0&&(r.push("max_per_minute = ?"),t.push(e.maxPerMinute)),e.skipOriginChannel!==void 0&&(r.push("skip_origin_channel = ?"),t.push(e.skipOriginChannel?1:0)),e.enabled!==void 0&&(r.push("enabled = ?"),t.push(e.enabled?1:0)),r.length!==0&&(t.push(i),n.prepare(`UPDATE delivery_rules SET ${r.join(", ")} WHERE id = ?`).run(...t))}function G(i){let e=d();e.prepare("DELETE FROM delivery_log WHERE rule_id = ?").run(i),e.prepare("DELETE FROM delivery_rules WHERE id = ?").run(i)}function A(i,e){return W(!0).filter(r=>{if(r.eventType!=="*"&&r.eventType!==i)return!1;let t=r.matchCriteria;if(t.templateId&&t.templateId!==e.templateId||t.roleId&&t.roleId!==e.roleId||t.taskStatus&&t.taskStatus!==e.taskStatus)return!1;if(t.promptPattern)try{if(!new RegExp(t.promptPattern,"i").test(e.prompt??""))return!1}catch{return!1}if(t.excludePromptPatterns&&t.excludePromptPatterns.length>0){let a=e.prompt??"";for(let s of t.excludePromptPatterns)if(!(typeof s!="string"||s.length>200))try{if(new RegExp(s,"i").test(a))return!1}catch{continue}}return!0})}B();N();import{v4 as J}from"uuid";function F(i){return!!(i.templateId&&i.stepId&&i.parentId)}var l=E("admin"),_=new Map,m=null,g=null,u=null,T=class{constructor(){f.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),f.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),f.on("template_execution_status_change",e=>{e.status==="failed"&&this.handleTemplateExecutionFailure(e.executionId,e.templateId).catch(n=>{l.error({executionId:e.executionId,error:n},"Template failure delivery processing failed")})}),l.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=h(e),a=this.getSourceChannelForTask(e);if(a){let o=D(r),{sendApprovalToChannel:p}=await import("./approval-handler-
|
|
5
|
+
`).run(i.id,i.eventType,JSON.stringify(i.matchCriteria),JSON.stringify(i.target),i.formatTemplate??null,i.maxPerMinute,i.skipOriginChannel?1:0,i.enabled?1:0,i.createdAt,i.createdBy??null)}function H(i){let n=d().prepare("SELECT * FROM delivery_rules WHERE id = ?").get(i);return n?L(n):void 0}function W(i){let e=d(),n="SELECT * FROM delivery_rules",r=[];return i!==void 0&&(n+=" WHERE enabled = ?",r.push(i?1:0)),n+=" ORDER BY created_at DESC",e.prepare(n).all(...r).map(L)}function U(i,e){let n=d(),r=[],t=[];e.eventType!==void 0&&(r.push("event_type = ?"),t.push(e.eventType)),e.matchCriteria!==void 0&&(r.push("match_criteria = ?"),t.push(JSON.stringify(e.matchCriteria))),e.target!==void 0&&(r.push("target = ?"),t.push(JSON.stringify(e.target))),e.formatTemplate!==void 0&&(r.push("format_template = ?"),t.push(e.formatTemplate)),e.maxPerMinute!==void 0&&(r.push("max_per_minute = ?"),t.push(e.maxPerMinute)),e.skipOriginChannel!==void 0&&(r.push("skip_origin_channel = ?"),t.push(e.skipOriginChannel?1:0)),e.enabled!==void 0&&(r.push("enabled = ?"),t.push(e.enabled?1:0)),r.length!==0&&(t.push(i),n.prepare(`UPDATE delivery_rules SET ${r.join(", ")} WHERE id = ?`).run(...t))}function G(i){let e=d();e.prepare("DELETE FROM delivery_log WHERE rule_id = ?").run(i),e.prepare("DELETE FROM delivery_rules WHERE id = ?").run(i)}function A(i,e){return W(!0).filter(r=>{if(r.eventType!=="*"&&r.eventType!==i)return!1;let t=r.matchCriteria;if(t.templateId&&t.templateId!==e.templateId||t.roleId&&t.roleId!==e.roleId||t.taskStatus&&t.taskStatus!==e.taskStatus)return!1;if(t.promptPattern)try{if(!new RegExp(t.promptPattern,"i").test(e.prompt??""))return!1}catch{return!1}if(t.excludePromptPatterns&&t.excludePromptPatterns.length>0){let a=e.prompt??"";for(let s of t.excludePromptPatterns)if(!(typeof s!="string"||s.length>200))try{if(new RegExp(s,"i").test(a))return!1}catch{continue}}return!0})}B();N();import{v4 as J}from"uuid";function F(i){return!!(i.templateId&&i.stepId&&i.parentId)}var l=E("admin"),_=new Map,m=null,g=null,u=null,T=class{constructor(){f.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),f.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),f.on("template_execution_status_change",e=>{e.status==="failed"&&this.handleTemplateExecutionFailure(e.executionId,e.templateId).catch(n=>{l.error({executionId:e.executionId,error:n},"Template failure delivery processing failed")})}),l.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=h(e),a=this.getSourceChannelForTask(e);if(a){let o=D(r),{sendApprovalToChannel:p}=await import("./approval-handler-6NPN24UN.js");await p(a.channelId,a.chatId,n,e,o)}let s=D(r)+`
|
|
6
6
|
|
|
7
7
|
Task: ${e}`;await this.matchAndDeliver("plan_approval_request",{templateId:t?.templateId,roleId:t?.roleId,prompt:t?.prompt,taskStatus:"pending"},s,e)}async handleTemplateExecutionFailure(e,n){let r=R(e),t=n?k(n):null,a=r?Object.entries(r.stepStatuses).filter(([,o])=>o.status==="failed"):[],s=["\u26A0\uFE0F TemplateExecution failed",`Template: ${t?.name??n}`,`Execution: ${e}`,`Failed steps: ${a.map(([o])=>o).join(", ")||"(unknown \u2014 no failed step recorded)"}`,a[0]?.[1]?.error?`
|
|
8
8
|
First error: ${a[0][1].error.slice(0,300)}`:""].filter(Boolean).join(`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as Qe}from"./chunk-HJICGOD4.js";import{a as He,b as k,c as xe,d as B,e as Ke}from"./chunk-NNMQGISW.js";import{b as Xe,c as Je,f as se,g as re}from"./chunk-6Y2DN2UH.js";import{a as je,b as Ve,c as E,d as ne,e as F,f as Te,g as z,i as ze}from"./chunk-VVQ532U2.js";import{d as V}from"./chunk-Z6LHGA27.js";import{c as y,h as C}from"./chunk-BLCNUT53.js";import{z as g}from"zod/v4";import{v4 as Ms}from"uuid";import{randomUUID as st}from"crypto";import tn from"crypto";var Ye="2.1.7",ie="bot";function nn(t){let e=t.split(".").map(i=>parseInt(i,10)),n=e[0]??0,r=e[1]??0,s=e[2]??0;return(n&255)<<16|(r&255)<<8|s&255}var Me=nn(Ye),sn=35e3,Ze=15e3,rn=1e4;function ae(){return{channel_version:Ye}}function an(t){return t.endsWith("/")?t:`${t}/`}function on(){let t=tn.randomBytes(4).readUInt32BE(0);return Buffer.from(String(t),"utf-8").toString("base64")}function dn(t){let e={"Content-Type":"application/json",AuthorizationType:"ilink_bot_token","Content-Length":String(Buffer.byteLength(t.body,"utf-8")),"X-WECHAT-UIN":on(),"iLink-App-Id":ie,"iLink-App-ClientVersion":String(Me)};return t.token?.trim()&&(e.Authorization=`Bearer ${t.token.trim()}`),t.routeTag&&(e.SKRouteTag=t.routeTag),e}async function oe(t){let e=an(t.baseUrl),n=new URL(t.endpoint,e),r=dn({token:t.token,routeTag:t.routeTag,body:t.body}),s=new AbortController,i=setTimeout(()=>s.abort(),t.timeoutMs);try{let a=await fetch(n.toString(),{method:"POST",headers:r,body:t.body,signal:s.signal});clearTimeout(i);let o=await a.text();if(!a.ok)throw new Error(`${t.label} ${a.status}: ${o}`);return o}catch(a){throw clearTimeout(i),a}}async function et(t){let e=t.timeoutMs??sn;try{let n=await oe({baseUrl:t.baseUrl,endpoint:"ilink/bot/getupdates",body:JSON.stringify({get_updates_buf:t.get_updates_buf??"",base_info:ae()}),token:t.token,routeTag:t.routeTag,timeoutMs:e,label:"getUpdates"});return JSON.parse(n)}catch(n){if(n instanceof Error&&n.name==="AbortError")return{ret:0,msgs:[],get_updates_buf:t.get_updates_buf};throw n}}var un={[-2]:2,[-3]:3},cn=1e3;async function Q(t){let e=(await import("./logger-PAMNFWI3.js")).getLogger("channels"),n=new Map;for(;;){let r=await oe({baseUrl:t.baseUrl,endpoint:"ilink/bot/sendmessage",body:JSON.stringify({...t.body,base_info:ae()}),token:t.token,routeTag:t.routeTag,timeoutMs:t.timeoutMs??Ze,label:"sendMessage"});e.info({status:200,responseBody:r.slice(0,300)},"apiFetch sendMessage response");try{let s=JSON.parse(r);if(s.ret&&s.ret!==0){let i=un[s.ret],a=(n.get(s.ret)??0)+1;if(n.set(s.ret,a),i!==void 0&&a<i){e.warn({ret:s.ret,attempt:a,maxRetries:i},"sendMessage: retriable iLink error, retrying"),await new Promise(o=>setTimeout(o,cn*a));continue}throw e.error({ret:s.ret,errmsg:s.errmsg,attempt:a},"sendMessage: iLink API error, no more retries"),new Error(`sendMessage failed: iLink ret=${s.ret}${s.errmsg?` errmsg=${s.errmsg}`:""}`)}}catch(s){if(s instanceof SyntaxError)e.warn({rawText:r.slice(0,200)},"sendMessage: non-JSON response, treating as success");else throw s}return}}async function tt(t){await oe({baseUrl:t.baseUrl,endpoint:"ilink/bot/sendtyping",body:JSON.stringify({...t.body,base_info:ae()}),token:t.token,routeTag:t.routeTag,timeoutMs:t.timeoutMs??rn,label:"sendTyping"})}async function nt(t){let e=await oe({baseUrl:t.baseUrl,endpoint:"ilink/bot/getuploadurl",body:JSON.stringify({filekey:t.filekey,media_type:t.media_type,to_user_id:t.to_user_id,rawsize:t.rawsize,rawfilemd5:t.rawfilemd5,filesize:t.filesize,thumb_rawsize:t.thumb_rawsize,thumb_rawfilemd5:t.thumb_rawfilemd5,thumb_filesize:t.thumb_filesize,no_need_thumb:t.no_need_thumb,aeskey:t.aeskey,base_info:ae()}),token:t.token,routeTag:t.routeTag,timeoutMs:t.timeoutMs??Ze,label:"getUploadUrl"});return JSON.parse(e)}var ln=5*6e4,mn=35e3,rt="3",T=new Map;function Se(t){return Date.now()-t.startedAt<ln}function gn(){for(let[t,e]of T)Se(e)||T.delete(t)}async function it(t,e,n){let r=t.endsWith("/")?t:`${t}/`,s=new URL(`ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(e)}`,r),i={"iLink-App-Id":ie};n&&(i.SKRouteTag=n);let a=await fetch(s.toString(),{headers:i});if(!a.ok){let o=await a.text().catch(()=>"(unreadable)");throw new Error(`Failed to fetch QR code: ${a.status} ${a.statusText} body=${o}`)}return await a.json()}async function pn(t,e,n){let r=t.endsWith("/")?t:`${t}/`,s=new URL(`ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(e)}`,r),i={"iLink-App-Id":ie,"iLink-App-ClientVersion":String(Me)};n&&(i.SKRouteTag=n);let a=new AbortController,o=setTimeout(()=>a.abort(),mn);try{let d=await fetch(s.toString(),{headers:i,signal:a.signal});clearTimeout(o);let c=await d.text();if(!d.ok)throw new Error(`Failed to poll QR status: ${d.status} ${d.statusText}`);return JSON.parse(c)}catch(d){if(clearTimeout(o),d instanceof Error&&d.name==="AbortError")return{status:"wait"};throw d}}async function at(t){let e=t.accountId||st();gn();let n=T.get(e);if(!t.force&&n&&Se(n)&&n.qrcodeUrl)return{qrcodeUrl:n.qrcodeUrl,message:"QR code ready. Scan with WeChat.",sessionKey:e};if(!t.apiBaseUrl)return{message:"No baseUrl configured for this WeChat channel.",sessionKey:e};try{let r=t.botType||rt,s=await it(t.apiBaseUrl,r,t.routeTag),i={sessionKey:e,id:st(),qrcode:s.qrcode,qrcodeUrl:s.qrcode_img_content,startedAt:Date.now()};return T.set(e,i),{qrcodeUrl:s.qrcode_img_content,message:"Scan the QR code with WeChat to connect.",sessionKey:e}}catch(r){return{message:`Failed to start login: ${String(r)}`,sessionKey:e}}}var fn=3;async function ot(t){let e=T.get(t.sessionKey);if(!e)return{connected:!1,message:"No active login session. Start QR login first."};if(!Se(e))return T.delete(t.sessionKey),{connected:!1,message:"QR code expired. Please start again."};let n=Math.max(t.timeoutMs??48e4,1e3),r=Date.now()+n,s=1;for(;Date.now()<r;){try{let i=await pn(t.apiBaseUrl,e.qrcode,t.routeTag);switch(e.status=i.status,i.status){case"wait":break;case"scaned":break;case"expired":{if(s++,s>fn)return T.delete(t.sessionKey),{connected:!1,message:"Login timeout: QR expired multiple times."};try{let a=t.botType||rt,o=await it(t.apiBaseUrl,a,t.routeTag);e.qrcode=o.qrcode,e.qrcodeUrl=o.qrcode_img_content,e.startedAt=Date.now()}catch(a){return T.delete(t.sessionKey),{connected:!1,message:`QR refresh failed: ${String(a)}`}}break}case"confirmed":return i.ilink_bot_id?(T.delete(t.sessionKey),{connected:!0,botToken:i.bot_token,accountId:i.ilink_bot_id,baseUrl:i.baseurl,userId:i.ilink_user_id,message:"Connected to WeChat successfully!"}):(T.delete(t.sessionKey),{connected:!1,message:"Login failed: server did not return bot ID."})}}catch(i){return T.delete(t.sessionKey),{connected:!1,message:`Login failed: ${String(i)}`}}await new Promise(i=>setTimeout(i,1e3))}return T.delete(t.sessionKey),{connected:!1,message:"Login timeout. Please try again."}}import A from"fs";import*as M from"fs/promises";import x from"path";import{homedir as pe}from"os";var de={IMAGE:1,VIDEO:2,FILE:3,VOICE:4},H={NONE:0,USER:1,BOT:2},_={NONE:0,TEXT:1,IMAGE:2,VOICE:3,FILE:4,VIDEO:5},K={NEW:0,GENERATING:1,FINISH:2},dt={TYPING:1,CANCEL:2};C();var hn=y("channels"),Ce=-14,ue=3600*1e3,$=new Map;function ut(t){let e=Date.now()+ue;$.set(t,e),hn.info({channelId:t},`Session paused until ${new Date(e).toISOString()} (${ue/1e3}s)`)}function ce(t){let e=$.get(t);return e===void 0?!1:Date.now()>=e?($.delete(t),!1):!0}function ct(t){let e=$.get(t);if(e===void 0)return 0;let n=e-Date.now();return n<=0?($.delete(t),0):n}function lt(t){$.delete(t)}C();import*as me from"fs/promises";import _t from"path";import{homedir as In}from"os";import{createCipheriv as yn,createDecipheriv as bn}from"crypto";function mt(t,e){let n=yn("aes-128-ecb",e,null);return Buffer.concat([n.update(t),n.final()])}function gt(t,e){let n=bn("aes-128-ecb",e,null);return Buffer.concat([n.update(t),n.final()])}function pt(t){return Math.ceil((t+1)/16)*16}function Ae(t,e){return`${e}/download?encrypted_query_param=${encodeURIComponent(t)}`}function ft(t){return`${t.cdnBaseUrl}/upload?encrypted_query_param=${encodeURIComponent(t.uploadParam)}&filekey=${encodeURIComponent(t.filekey)}`}C();var Ws=y("channels");function wn(t){let e=Buffer.from(t,"base64");if(e.length===16)return e;if(e.length===32&&/^[0-9a-fA-F]{32}$/.test(e.toString("ascii")))return Buffer.from(e.toString("ascii"),"hex");throw new Error(`aes_key must decode to 16 raw bytes or 32-char hex, got ${e.length} bytes`)}async function ht(t){let e=await fetch(t);if(!e.ok)throw new Error(`CDN download ${e.status} ${e.statusText}`);return Buffer.from(await e.arrayBuffer())}async function X(t){let{encryptQueryParam:e,aesKeyBase64:n,cdnBaseUrl:r,fullUrl:s}=t,i=wn(n),a=s?.trim()||(e?Ae(e,r):null);if(!a)throw new Error("CDN download: need full_url or encrypt_query_param");let o=await ht(a);return gt(o,i)}async function yt(t){let{encryptQueryParam:e,cdnBaseUrl:n,fullUrl:r}=t,s=r?.trim()||(e?Ae(e,n):null);if(!s)throw new Error("CDN download: need full_url or encrypt_query_param");return ht(s)}C();var le=y("channels"),bt=24e3;function _n(t,e){let n=t.byteLength,r=44+n,s=Buffer.allocUnsafe(r),i=0;return s.write("RIFF",i),i+=4,s.writeUInt32LE(r-8,i),i+=4,s.write("WAVE",i),i+=4,s.write("fmt ",i),i+=4,s.writeUInt32LE(16,i),i+=4,s.writeUInt16LE(1,i),i+=2,s.writeUInt16LE(1,i),i+=2,s.writeUInt32LE(e,i),i+=4,s.writeUInt32LE(e*2,i),i+=4,s.writeUInt16LE(2,i),i+=2,s.writeUInt16LE(16,i),i+=2,s.write("data",i),i+=4,s.writeUInt32LE(n,i),i+=4,Buffer.from(t.buffer,t.byteOffset,t.byteLength).copy(s,i),s}async function wt(t){try{let{decode:e}=await import("silk-wasm");le.debug(`silkToWav: decoding ${t.length} bytes of SILK`);let n=await e(t,bt);le.debug(`silkToWav: decoded duration=${n.duration}ms pcmBytes=${n.data.byteLength}`);let r=_n(n.data,bt);return le.debug(`silkToWav: WAV size=${r.length}`),r}catch(e){return le.warn(`silkToWav: transcode failed, will use raw silk err=${String(e)}`),null}}var N=y("channels"),It=100*1024*1024;function En(t){return re(t)??".bin"}async function J(t,e,n,r,s=It,i){if(t.length>s)throw new Error(`Media too large: ${t.length} bytes exceeds ${s} bytes`);let a=_t.join(In(),".adam","wechat","media",r,n);await me.mkdir(a,{recursive:!0});let o;if(i&&/^[a-zA-Z0-9._-]+$/.test(i))o=i;else{let c=e?En(e):".bin",u=Date.now(),p=Math.random().toString(36).slice(2,7);o=`${u}-${p}${c}`}let d=_t.join(a,o);return await me.writeFile(d,t),N.debug(`saveMedia: saved ${t.length} bytes to ${d}`),d}async function Et(t,e){let{cdnBaseUrl:n,channelId:r}=e;if(t.type===_.IMAGE){let s=t.image_item;if(!s?.media?.encrypt_query_param&&!s?.media?.full_url)return null;let i=s.aeskey?Buffer.from(s.aeskey,"hex").toString("base64"):s.media?.aes_key;try{let a=i?await X({encryptQueryParam:s.media?.encrypt_query_param,aesKeyBase64:i,cdnBaseUrl:n,fullUrl:s.media?.full_url}):await yt({encryptQueryParam:s.media?.encrypt_query_param,cdnBaseUrl:n,fullUrl:s.media?.full_url});return{path:await J(a,"image/png","inbound",r),mimeType:"image/png",type:"image"}}catch(a){return N.error({channelId:r},`Image download/decrypt failed: ${String(a)}`),null}}if(t.type===_.VOICE){let s=t.voice_item;if(!s?.media?.encrypt_query_param&&!s?.media?.full_url||!s?.media?.aes_key)return null;try{let i=await X({encryptQueryParam:s.media.encrypt_query_param,aesKeyBase64:s.media.aes_key,cdnBaseUrl:n,fullUrl:s.media.full_url}),a=await wt(i);if(a){let o=await J(a,"audio/wav","inbound",r);return N.debug(`Voice: saved WAV to ${o}`),{path:o,mimeType:"audio/wav",type:"audio"}}else{let o=await J(i,"audio/silk","inbound",r);return N.debug(`Voice: silk transcode unavailable, saved raw SILK to ${o}`),{path:o,mimeType:"audio/silk",type:"audio"}}}catch(i){return N.error({channelId:r},`Voice download/transcode failed: ${String(i)}`),null}}if(t.type===_.FILE){let s=t.file_item;if(!s?.media?.encrypt_query_param&&!s?.media?.full_url||!s?.media?.aes_key)return null;try{let i=await X({encryptQueryParam:s.media.encrypt_query_param,aesKeyBase64:s.media.aes_key,cdnBaseUrl:n,fullUrl:s.media.full_url}),a=se(s.file_name??"file.bin");return{path:await J(i,a,"inbound",r,It,s.file_name),mimeType:a,type:"file"}}catch(i){return N.error({channelId:r},`File download failed: ${String(i)}`),null}}if(t.type===_.VIDEO){let s=t.video_item;if(!s?.media?.encrypt_query_param&&!s?.media?.full_url||!s?.media?.aes_key)return null;try{let i=await X({encryptQueryParam:s.media.encrypt_query_param,aesKeyBase64:s.media.aes_key,cdnBaseUrl:n,fullUrl:s.media.full_url});return{path:await J(i,"video/mp4","inbound",r),mimeType:"video/mp4",type:"video"}}catch(i){return N.error({channelId:r},`Video download failed: ${String(i)}`),null}}return null}import Mt from"path";import Re from"crypto";import Tn from"fs/promises";C();var O=y("channels"),ge=3;async function xn(t){let{buf:e,uploadFullUrl:n,uploadParam:r,filekey:s,cdnBaseUrl:i,label:a,aeskey:o}=t,d=mt(e,o),c=n?.trim(),u;if(c)u=c;else if(r)u=ft({cdnBaseUrl:i,uploadParam:r,filekey:s});else throw new Error(`${a}: CDN upload URL missing (need upload_full_url or upload_param)`);O.debug(`${a}: CDN POST url=${u} ciphertextSize=${d.length}`);let p,f;for(let m=1;m<=ge;m++)try{let l=await fetch(u,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:new Uint8Array(d)});if(l.status>=400&&l.status<500){let b=l.headers.get("x-error-message")??await l.text();throw O.error(`${a}: CDN client error attempt=${m} status=${l.status} errMsg=${b}`),new Error(`CDN upload client error ${l.status}: ${b}`)}if(l.status!==200){let b=l.headers.get("x-error-message")??`status ${l.status}`;throw O.error(`${a}: CDN server error attempt=${m} status=${l.status} errMsg=${b}`),new Error(`CDN upload server error: ${b}`)}if(p=l.headers.get("x-encrypted-param")??void 0,!p)throw O.error(`${a}: CDN response missing x-encrypted-param header attempt=${m}`),new Error("CDN upload response missing x-encrypted-param header");O.debug(`${a}: CDN upload success attempt=${m}`);break}catch(l){if(f=l,l instanceof Error&&l.message.includes("client error"))throw l;m<ge?O.warn(`${a}: attempt ${m} failed, retrying... err=${String(l)}`):O.error(`${a}: all ${ge} attempts failed err=${String(l)}`)}if(!p)throw f instanceof Error?f:new Error(`CDN upload failed after ${ge} attempts`);return{downloadParam:p}}async function ke(t){let{filePath:e,toUserId:n,opts:r,cdnBaseUrl:s,mediaType:i,label:a}=t,o=await Tn.readFile(e),d=o.length,c=Re.createHash("md5").update(o).digest("hex"),u=pt(d),p=Re.randomBytes(16).toString("hex"),f=Re.randomBytes(16);O.debug(`${a}: file=${e} rawsize=${d} filesize=${u} md5=${c} filekey=${p}`);let m=await nt({...r,filekey:p,media_type:i,to_user_id:n,rawsize:d,rawfilemd5:c,filesize:u,no_need_thumb:!0,aeskey:f.toString("hex")}),l=m.upload_full_url?.trim(),b=m.upload_param;if(!l&&!b)throw new Error(`${a}: getUploadUrl returned no upload URL (need upload_full_url or upload_param)`);let{downloadParam:L}=await xn({buf:o,uploadFullUrl:l||void 0,uploadParam:b??void 0,filekey:p,cdnBaseUrl:s,aeskey:f,label:`${a}[orig filekey=${p}]`});return{filekey:p,downloadEncryptedQueryParam:L,aeskey:f.toString("hex"),fileSize:d,fileSizeCiphertext:u}}async function Tt(t){return ke({...t,mediaType:de.IMAGE,label:"uploadImageToWeixin"})}async function xt(t){return ke({...t,mediaType:de.VIDEO,label:"uploadVideoToWeixin"})}async function Pe(t){return ke({...t,mediaType:de.FILE,label:"uploadFileAttachmentToWeixin"})}C();var Y=y("channels");function Mn(){return`adam-wechat-${Date.now()}-${Math.random().toString(36).slice(2,7)}`}function Sn(t){let e=t;return e=e.replace(/```[^\n]*\n?([\s\S]*?)```/g,(n,r)=>r.trim()),e=e.replace(/!\[[^\]]*\]\([^)]*\)/g,""),e=e.replace(/\[([^\]]+)\]\([^)]*\)/g,"$1"),e=e.replace(/^\|[\s:|-]+\|$/gm,""),e=e.replace(/^\|(.+)\|$/gm,(n,r)=>r.split("|").map(s=>s.trim()).join(" ")),e}async function Ue(t){let{to:e,text:n,mediaItem:r,opts:s,label:i}=t,a=[],o=Sn(n);o&&a.push({type:_.TEXT,text_item:{text:o}}),a.push(r);let d="";for(let c of a){d=Mn();let u={msg:{from_user_id:"",to_user_id:e,client_id:d,message_type:H.BOT,message_state:K.FINISH,item_list:[c],context_token:s.contextToken}};await Q({baseUrl:s.baseUrl,token:s.token,routeTag:s.routeTag,body:u})}return Y.debug(`${i}: sent to=${e} messageId=${d}`),{messageId:d}}async function Cn(t){let{to:e,text:n,uploaded:r,opts:s}=t,i={type:_.IMAGE,image_item:{media:{encrypt_query_param:r.downloadEncryptedQueryParam,aes_key:Buffer.from(r.aeskey).toString("base64"),encrypt_type:1},mid_size:r.fileSizeCiphertext}};return Ue({to:e,text:n,mediaItem:i,opts:s,label:"sendImageMessage"})}async function An(t){let{to:e,text:n,uploaded:r,opts:s}=t,i={type:_.VIDEO,video_item:{media:{encrypt_query_param:r.downloadEncryptedQueryParam,aes_key:Buffer.from(r.aeskey).toString("base64"),encrypt_type:1},video_size:r.fileSizeCiphertext}};return Ue({to:e,text:n,mediaItem:i,opts:s,label:"sendVideoMessage"})}async function St(t){let{to:e,text:n,fileName:r,uploaded:s,opts:i}=t,a={type:_.FILE,file_item:{media:{encrypt_query_param:s.downloadEncryptedQueryParam,aes_key:Buffer.from(s.aeskey).toString("base64"),encrypt_type:1},file_name:r,len:String(s.fileSize)}};return Ue({to:e,text:n,mediaItem:a,opts:i,label:"sendFileMessage"})}async function Ct(t){let{filePath:e,to:n,text:r,opts:s,cdnBaseUrl:i}=t,a=se(e),o={baseUrl:s.baseUrl,token:s.token,routeTag:s.routeTag};if(a.startsWith("video/")){Y.debug(`sendWeixinMediaFile: uploading video filePath=${e} to=${n}`);let u=await xt({filePath:e,toUserId:n,opts:o,cdnBaseUrl:i});return An({to:n,text:r,uploaded:u,opts:s})}if(a.startsWith("image/")){Y.debug(`sendWeixinMediaFile: uploading image filePath=${e} to=${n}`);let u=await Tt({filePath:e,toUserId:n,opts:o,cdnBaseUrl:i});return Cn({to:n,text:r,uploaded:u,opts:s})}if(a.startsWith("audio/")){let u=Mt.basename(e);Y.debug(`sendWeixinMediaFile: uploading audio as file filePath=${e} name=${u} to=${n}`);let p=await Pe({filePath:e,fileName:u,toUserId:n,opts:o,cdnBaseUrl:i});return St({to:n,text:r,fileName:u,uploaded:p,opts:s})}let d=Mt.basename(e);Y.debug(`sendWeixinMediaFile: uploading file attachment filePath=${e} name=${d} to=${n}`);let c=await Pe({filePath:e,fileName:d,toUserId:n,opts:o,cdnBaseUrl:i});return St({to:n,text:r,fileName:d,uploaded:c,opts:s})}C();var h=y("channels"),At="https://novac2c.cdn.weixin.qq.com/c2c",Ne=new Map;function Pt(t){return x.join(pe(),".adam","wechat",`${t}.context-tokens.json`)}function Rn(t){let e=Pt(t);try{let n=A.readFileSync(e,"utf-8"),r=JSON.parse(n);for(let[s,i]of Object.entries(r))typeof i=="string"&&i&&Ne.set(`${t}:${s}`,i);h.debug({channelId:t,count:Object.keys(r).length},"Restored context tokens from disk")}catch{}}function kn(t,e,n){let r=Pt(t);try{let s={};try{let a=A.readFileSync(r,"utf-8");s=JSON.parse(a)}catch{}s[e]=n;let i=x.dirname(r);A.mkdirSync(i,{recursive:!0}),A.writeFileSync(r,JSON.stringify(s),"utf-8")}catch(s){h.warn({channelId:t,userId:e},`Failed to persist context token: ${String(s)}`)}}function Pn(t,e,n){Ne.set(`${t}:${e}`,n),kn(t,e,n)}function ve(t,e){return Ne.get(`${t}:${e}`)}function Ut(t){return x.join(pe(),".adam","wechat",`${t}.sync`)}function Un(t){try{return A.readFileSync(Ut(t),"utf-8")}catch{return""}}function vn(t,e){let n=Ut(t);A.mkdirSync(x.dirname(n),{recursive:!0}),A.writeFileSync(n,e,"utf-8")}var Oe=1440*60*1e3,Rt=10,On=20,kt=1440*60*1e3,Nn=1320*60*1e3,Dn=1,Ln=7200*1e3;function vt(t){return x.join(pe(),".adam","wechat",`${t}.session.json`)}function Fn(t){let e=new Map,n=vt(t);try{let r=A.readFileSync(n,"utf-8"),s=JSON.parse(r);for(let[i,a]of Object.entries(s))a&&typeof a.lastUserMessageAt=="number"&&e.set(i,a);h.debug({channelId:t,count:e.size},"Restored sessions from disk")}catch{}return e}function Z(t,e){let n=vt(t);try{let r={};for(let[i,a]of e)r[i]=a;let s=x.dirname(n);A.mkdirSync(s,{recursive:!0}),A.writeFileSync(n,JSON.stringify(r),"utf-8")}catch(r){h.warn({channelId:t},`Failed to persist sessions: ${String(r)}`)}}var Bn=0;function ee(){return`adam-wechat-${Date.now()}-${++Bn}`}var q=class{platform="wechat";id;config;status="disconnected";messageHandler=null;pollAbort=null;getUpdatesBuf="";sessions=new Map;pendingQueue=new Map;lastReminderAt=new Map;constructor(e,n){if(this.id=e,!n.baseUrl)throw new Error("WeChat adapter requires baseUrl");this.config=n}async connect(){if(!this.config.botToken)throw new Error("WeChat adapter requires botToken. Complete QR login first.");this.status="connecting",this.getUpdatesBuf=Un(this.id),Rn(this.id),this.sessions=Fn(this.id),this.pollAbort=new AbortController,this.status="connected",h.info({channelId:this.id},"WeChat adapter connected, starting long-poll"),this.startLongPoll()}async disconnect(){this.pollAbort&&(this.pollAbort.abort(),this.pollAbort=null),this.status="disconnected",h.info({channelId:this.id},"WeChat adapter disconnected")}getStatus(){if(this.status==="connected"&&ce(this.id))return"error";if(this.status==="connected"){for(let[,e]of this.sessions)if(this.isSessionActive(e)&&e.quotaRemaining<=0)return"degraded"}return this.status}getCapabilities(){return{canEdit:!1,canQuote:!0,canParseQuote:!0,canInlineButtons:!1,maxTextLength:4e3,supportsAttachments:!0,maxAttachmentsPerMessage:1}}async sendMessage(e,n){if(ce(this.id)){let c=Math.ceil(ct(this.id)/6e4);throw new Error(`WeChat session paused, ${c} min remaining. Re-scan QR to reconnect.`)}let r=this.getOrCreateSession(e),i=this.getSessionRemainingMs(r)/36e5;if(!this.isSessionActive(r))return h.warn({channelId:this.id,chatId:e.slice(0,12),lastUserMessageAt:r.lastUserMessageAt,sessionExpired:!0},"iLink session expired (>24h), message queued"),this.enqueueMessage(e,n),`queued-${ee()}`;if(r.quotaRemaining<=0)return h.warn({channelId:this.id,chatId:e.slice(0,12),quotaRemaining:0,remainingHours:i.toFixed(1)},"iLink quota exhausted, message queued"),this.enqueueMessage(e,n),`queued-${ee()}`;let a=ee(),o=ve(this.id,e),d=this.config.cdnBaseUrl??At;try{let c=n.attachments?.[0],u=c?.path??n.mediaUrl,p=c?.contentType,f=c?.filename,m=c?.mediaType??n.mediaType;if(u){let l=!u.includes("://")||u.startsWith("file://"),b=x.join(pe(),".adam","wechat","media","outbound-tmp");await M.mkdir(b,{recursive:!0});let L=this.getExtensionFromMediaType(m,p),R;if(l){let I=u.startsWith("file://")?new URL(u).pathname:x.isAbsolute(u)?u:x.resolve(u),v=await M.readFile(I);R=x.join(b,`${Date.now()}-${Math.random().toString(36).slice(2,7)}${L}`),await M.writeFile(R,v)}else{let I=await fetch(u);if(!I.ok)throw new Error(`Failed to fetch media: ${I.status}`);let v=Buffer.from(await I.arrayBuffer());R=x.join(b,`${Date.now()}-${Math.random().toString(36).slice(2,7)}${L}`),await M.writeFile(R,v)}let w=R;if(f){let I=f.replace(/[\\/]/g,"-").replace(/\.\./g,"-").replace(/[\x00-\x1f]/g,"");if(I.length>0&&I.length<200){let v=x.join(b,`${Date.now()}-${I}`);await M.copyFile(R,v),await M.unlink(R).catch(()=>{}),w=v}}let U=await Ct({filePath:w,to:e,text:n.content??"",opts:{baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,contextToken:o},cdnBaseUrl:d});return await M.unlink(w).catch(()=>{}),r.quotaRemaining--,Z(this.id,this.sessions),h.info({channelId:this.id,chatId:e.slice(0,12),quotaRemaining:r.quotaRemaining,sessionRemainingHours:(this.getSessionRemainingMs(r)/36e5).toFixed(1)},"iLink send success: quota decremented"),this.checkAndSendReminder(e,r).catch(I=>{h.warn({channelId:this.id,chatId:e.slice(0,12)},`Reminder send failed: ${String(I)}`)}),U.messageId}return await Q({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,body:{msg:{from_user_id:"",to_user_id:e,client_id:a,message_type:H.BOT,message_state:K.FINISH,item_list:this.buildItemList(n),context_token:o}}}),r.quotaRemaining--,Z(this.id,this.sessions),h.info({channelId:this.id,chatId:e.slice(0,12),quotaRemaining:r.quotaRemaining,sessionRemainingHours:(this.getSessionRemainingMs(r)/36e5).toFixed(1)},"iLink send success: quota decremented"),this.checkAndSendReminder(e,r).catch(l=>{h.warn({channelId:this.id,chatId:e.slice(0,12)},`Reminder send failed: ${String(l)}`)}),a}catch(c){if(c instanceof Error&&c.message.includes("ret=-2"))return r.quotaRemaining=0,Z(this.id,this.sessions),h.warn({channelId:this.id,chatId:e.slice(0,12),quotaRemaining:0},"iLink quota exhausted (ret=-2 confirmed), message queued"),this.enqueueMessage(e,n),`queued-${ee()}`;throw c}}onMessage(e){this.messageHandler=e}async sendTypingIndicator(e){if(ce(this.id))return;let n=ve(this.id,e);try{await tt({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,body:{ilink_user_id:e,status:dt.TYPING}})}catch{}}updateConfig(e){Object.assign(this.config,e)}buildItemList(e){if(!e.content)return;let n={type:_.TEXT,text_item:{text:e.content}};if(e.replyToMessageId){let r=(e.quoteExcerpt??"").slice(0,80);n.ref_msg={message_item:{msg_id:e.replyToMessageId,text_item:{text:r}},title:e.quoteTitle}}return[n]}getOrCreateSession(e){let n=this.sessions.get(e);return n||(n={lastUserMessageAt:0,quotaRemaining:0},this.sessions.set(e,n)),n}isSessionActive(e){return e.lastUserMessageAt>0&&Date.now()-e.lastUserMessageAt<=Oe}getSessionRemainingMs(e){return e.lastUserMessageAt===0?0:Math.max(0,Oe-(Date.now()-e.lastUserMessageAt))}enqueueMessage(e,n){let r=this.pendingQueue.get(e);r||(r=[],this.pendingQueue.set(e,r));let s=Date.now();r=r.filter(i=>s-i.queuedAt<kt),r.length>=On&&(r.shift(),h.warn({channelId:this.id,chatId:e.slice(0,12)},"Queue full, dropping oldest message")),r.push({message:n,queuedAt:s}),this.pendingQueue.set(e,r),h.info({channelId:this.id,chatId:e.slice(0,12),queueDepth:r.length},"Message enqueued")}async flushQueue(e){let n=this.pendingQueue.get(e);if(!n||n.length===0)return;let r=this.getOrCreateSession(e),s=Math.min(n.length,Math.max(0,r.quotaRemaining-2));if(s<=0){h.info({channelId:this.id,chatId:e.slice(0,12),quotaRemaining:r.quotaRemaining},"Queue flush skipped: insufficient quota (reserving 2 for conversation)");return}h.info({channelId:this.id,chatId:e.slice(0,12),queueDepth:n.length,sending:s,quotaRemaining:r.quotaRemaining},"Flushing queued messages");let i=0;for(;i<s&&n.length>0;){let a=n[0];if(Date.now()-a.queuedAt>kt){n.shift();continue}try{if(await this.sendMessage(e,a.message),n.shift(),i++,r.quotaRemaining<=0)break}catch{h.warn({channelId:this.id,chatId:e.slice(0,12)},"Queue flush: send failed, stopping");break}}n.length===0&&this.pendingQueue.delete(e),h.info({channelId:this.id,chatId:e.slice(0,12),sent:i,remaining:n.length},"Queue flush complete")}async checkAndSendReminder(e,n){let r=Date.now(),s=this.lastReminderAt.get(e)??0;if(r-s<Ln)return;let i=this.getSessionRemainingMs(n),o=r-n.lastUserMessageAt>=Nn,d=n.quotaRemaining<=Dn;if(!o&&!d)return;let c=(i/36e5).toFixed(1),u;o&&d?u=`[\u7CFB\u7EDF\u63D0\u9192] \u6D88\u606F\u7A97\u53E3\u5373\u5C06\u5173\u95ED\uFF08\u5269\u4F59${c}\u5C0F\u65F6/${n.quotaRemaining}\u6761\u914D\u989D\uFF09\u3002\u8BF7\u56DE\u590D\u4EFB\u610F\u6D88\u606F\u4EE5\u4FDD\u6301\u8FDE\u63A5\u3002`:o?u=`[\u7CFB\u7EDF\u63D0\u9192] \u6D88\u606F\u7A97\u53E3\u5373\u5C06\u5173\u95ED\uFF08\u5269\u4F59${c}\u5C0F\u65F6\uFF09\u3002\u8BF7\u56DE\u590D\u4EFB\u610F\u6D88\u606F\u4EE5\u4FDD\u6301\u8FDE\u63A5\u3002`:u=`[\u7CFB\u7EDF\u63D0\u9192] \u6D88\u606F\u914D\u989D\u5373\u5C06\u7528\u5B8C\uFF08\u5269\u4F59${n.quotaRemaining}\u6761\uFF09\u3002\u8BF7\u56DE\u590D\u4EFB\u610F\u6D88\u606F\u4EE5\u91CD\u7F6E\u914D\u989D\u3002`;let p=ve(this.id,e);try{await Q({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,body:{msg:{from_user_id:"",to_user_id:e,client_id:ee(),message_type:H.BOT,message_state:K.FINISH,item_list:[{type:_.TEXT,text_item:{text:u}}],context_token:p}}}),n.quotaRemaining--,this.lastReminderAt.set(e,r),Z(this.id,this.sessions),h.info({channelId:this.id,chatId:e.slice(0,12),remainingHours:c,quotaRemaining:n.quotaRemaining,trigger:o?"time":"quota"},"iLink session reminder sent")}catch(f){h.warn({channelId:this.id,chatId:e.slice(0,12)},`Reminder send failed: ${String(f)}`)}}async startLongPoll(){let e=this.pollAbort?.signal,n=0,r=3,s=3e4,i=2e3;for(;!e?.aborted;)try{let a=await et({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,get_updates_buf:this.getUpdatesBuf});if(a.ret===Ce||a.errcode===Ce){ut(this.id),this.status="error",h.error({channelId:this.id},"Session expired (errcode=-14), pausing for 1 hour"),await this.sleep(ue,e),lt(this.id),this.status="connected";continue}if(a.ret!==void 0&&a.ret!==0||a.errcode!==void 0&&a.errcode!==0){n++,h.error({channelId:this.id,ret:a.ret,errcode:a.errcode},"getUpdates API error"),n>=r?(n=0,await this.sleep(s,e)):await this.sleep(i,e);continue}n=0,a.get_updates_buf&&(this.getUpdatesBuf=a.get_updates_buf,vn(this.id,a.get_updates_buf));for(let d of a.msgs??[])await this.processInbound(d)}catch(a){if(e?.aborted)return;n++,h.error({channelId:this.id,error:a},"getUpdates error"),n>=r?(n=0,await this.sleep(s,e)):await this.sleep(i,e)}}async processInbound(e){if(!this.messageHandler)return;let n=!!e.group_id,r=n?e.group_id:e.from_user_id??"",s=e.from_user_id??"";e.context_token&&r&&Pn(this.id,r,e.context_token);let i=this.getOrCreateSession(r),a=i.quotaRemaining;i.lastUserMessageAt=Date.now(),i.quotaRemaining=Rt,Z(this.id,this.sessions),h.info({channelId:this.id,chatId:r.slice(0,12),quotaReset:!0,prevQuota:a,newQuota:Rt,sessionWindowMs:Oe},"iLink session reset: user message received, quota restored"),this.flushQueue(r);let o="",d,c=[],u;for(let m of e.item_list??[]){let l=m.ref_msg?.message_item?.msg_id;if(l){u=l;break}}for(let m of e.item_list??[])m.type===_.TEXT&&m.text_item?.text&&(o+=m.text_item.text),m.type===_.IMAGE&&(d="image",c.push(m)),m.type===_.VOICE&&(d="audio",c.push(m),m.voice_item?.text&&!o&&(o=m.voice_item.text)),m.type===_.FILE&&(d="file",c.push(m)),m.type===_.VIDEO&&(d="video",c.push(m));if(!o&&!d)return;let p;if(c.length>0){let m=this.config.cdnBaseUrl??At;try{let l=await Et(c[0],{cdnBaseUrl:m,channelId:this.id});l&&(p=l.path,d=l.type)}catch(l){h.error({channelId:this.id},`Media download failed: ${String(l)}`)}}let f={channelId:this.id,platform:"wechat",chatId:r,senderId:s,content:o,mediaType:d,mediaPath:p,isGroup:n,timestamp:e.create_time_ms??Date.now(),raw:e,...u?{quotedPlatformMessageId:u}:{}};this.messageHandler(f)}getExtensionFromMediaType(e,n){if(n){let r=re(n);if(r&&r!==".bin")return r}switch(e){case"image":return".png";case"video":return".mp4";case"audio":return".mp3";default:return".bin"}}sleep(e,n){return new Promise((r,s)=>{let i=setTimeout(r,e);n?.addEventListener("abort",()=>{clearTimeout(i),s(new Error("aborted"))},{once:!0})})}};C();C();var $n=y("channels"),fe=class{platform="discord";id;config;status="disconnected";messageHandler=null;client=null;constructor(e,n){if(this.id=e,!n.botToken)throw new Error("Discord adapter requires botToken");this.config=n}async connect(){this.status="connecting";try{let{Client:e,GatewayIntentBits:n}=await import("discord.js");this.client=new e({intents:[n.Guilds,n.GuildMessages,n.MessageContent,n.DirectMessages]});let r=this.client;r.on("messageCreate",s=>{if(!this.messageHandler||s.author.bot||this.config.allowedGuildIds?.length&&s.guildId&&!this.config.allowedGuildIds.includes(s.guildId))return;let i={channelId:this.id,platform:"discord",chatId:s.channelId,senderId:s.author.id,senderName:s.author.displayName??s.author.username,content:s.content,isGroup:!!s.guildId,timestamp:s.createdTimestamp,raw:s};this.messageHandler(i)}),await r.login(this.config.botToken),this.status="connected",$n.info({channelId:this.id},"Discord bot connected")}catch(e){throw this.status="error",e}}async disconnect(){this.client&&await this.client.destroy(),this.client=null,this.status="disconnected"}getStatus(){return this.status}getCapabilities(){return{canEdit:!0,canQuote:!0,canParseQuote:!0,canInlineButtons:!0,maxTextLength:2e3,supportsAttachments:!0}}async sendMessage(e,n){if(!this.client)throw new Error("Discord client not connected");let s=await this.client.channels.fetch(e);if(!s||!("send"in s))throw new Error(`Channel ${e} not found or not text channel`);return(await s.send({content:n.content,reply:n.replyToMessageId?{messageReference:n.replyToMessageId}:void 0})).id}onMessage(e){this.messageHandler=e}async sendTypingIndicator(e){if(!this.client)return;let r=await this.client.channels.fetch(e);r&&"sendTyping"in r&&await r.sendTyping()}};import{statSync as es}from"fs";import{ImapFlow as ts}from"imapflow";import ns from"nodemailer";import{existsSync as qn,mkdirSync as Gn,readFileSync as Wn,writeFileSync as jn}from"fs";import{dirname as Vn,join as Ot}from"path";import{homedir as zn}from"os";var Qn={lastUid:0,seenMessageIds:[],sentMessageIds:[],updatedAt:0};function De(t=process.env.ADAM_TEST_DIR??Ot(zn(),".adam")){return Ot(t,"email-gateway","state.json")}function he(t=De()){if(!qn(t))return{...Qn};let e=JSON.parse(Wn(t,"utf-8"));return{uidValidity:e.uidValidity,lastUid:Number.isInteger(e.lastUid)?e.lastUid:0,seenMessageIds:Array.isArray(e.seenMessageIds)?e.seenMessageIds.filter(Nt):[],sentMessageIds:Array.isArray(e.sentMessageIds)?e.sentMessageIds.filter(Nt):[],updatedAt:typeof e.updatedAt=="number"?e.updatedAt:0}}function te(t,e=De()){Gn(Vn(e),{recursive:!0}),jn(e,JSON.stringify({...t,updatedAt:Date.now()},null,2),"utf-8")}function Dt(t,e){let n=G(e);return n?{...t,seenMessageIds:t.seenMessageIds.includes(n)?t.seenMessageIds:[...t.seenMessageIds,n]}:t}function Hn(t,e){let n=G(e);return n?{...t,sentMessageIds:t.sentMessageIds.includes(n)?t.sentMessageIds:[...t.sentMessageIds,n]}:t}function Lt(t,e=De()){let n=Hn(he(e),t);return te(n,e),n}function G(t){return typeof t=="string"?t.trim():""}function Nt(t){return typeof t=="string"}import{Readable as Kn}from"stream";import{MailParser as Xn}from"mailparser";import{convert as Jn}from"html-to-text";async function Bt(t){let e=new Xn({skipImageLinks:!0,skipTextToHtml:!0}),n={},r,s,i,a=[],o,d="",c="",u="",p,f=0,m;if(await new Promise((L,R)=>{e.on("headers",w=>{try{for(let[I,v]of w.entries())n[I.toLowerCase()]=Zn(v);r=Ft(w.get("message-id")),o=Ft(w.get("subject")),u=Gt(w.get("content-type"))??"";let U=w.get("date");U instanceof Date&&(p=U.getTime()),s=$t(w.get("from"),"from"),i=Yn(w.get("reply-to"),"reply-to"),a=qt(w.get("to"))}catch(U){m=U instanceof Error?U:new Error(String(U))}}),e.on("data",w=>{if(w.type==="attachment"){f+=1,w.release?.(),w.content?.resume?.();return}d=w.text??"",c=typeof w.html=="string"?w.html:""}),e.on("error",R),e.on("end",L),Kn.from([t]).pipe(e)}),m)throw m;if(!s)throw new Error("Inbound email must contain exactly one valid From address");let l=u.toLowerCase()==="text/html",b=d.trim();return(l||!b)&&c.trim()&&(b=Jn(c,{wordwrap:!1,selectors:[{selector:"h1",format:"heading",options:{uppercase:!1}},{selector:"h2",format:"heading",options:{uppercase:!1}},{selector:"h3",format:"heading",options:{uppercase:!1}},{selector:"h4",format:"heading",options:{uppercase:!1}},{selector:"h5",format:"heading",options:{uppercase:!1}},{selector:"h6",format:"heading",options:{uppercase:!1}}]}).trim()),!b&&o&&(b=o.trim()),{messageId:r,from:s,replyTo:i,to:a,subject:o,text:b,date:p,rawHeaders:n,attachmentCount:f}}function $t(t,e){let n=qt(t);if(n.length!==1){if(n.length===0)return;throw new Error(`Inbound email ${e} must contain exactly one mailbox address`)}return n[0]}function Yn(t,e){if(t)return $t(t,e)}function qt(t){return t?typeof t=="string"?[k(t)]:(t.value??[]).map(r=>r.address).filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>k(r)):[]}function Ft(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(String).join(", ")}function Zn(t){if(t instanceof Date)return t.toISOString();if(typeof t=="string")return t;if(Array.isArray(t))return t.map(String).join(", ");let e=Gt(t);return e||(t&&typeof t=="object"&&"text"in t?String(t.text??""):String(t??""))}function Gt(t){if(typeof t=="string")return t;if(t&&typeof t=="object"&&"value"in t){let e=t.value;if(typeof e=="string")return e}}var Wt=3e4,ss=5e3,rs=3e5,is=1.33,as=3e4;function os(t){if(!t||t.length===0)return Wt;let e=0;for(let r of t)try{e+=es(r.path).size}catch{}let n=e*is/(1024*1024);return Math.min(rs,Wt+Math.ceil(n*ss))}var Fe=class{imapClient;smtpTransporter;pollTimer;handlers=[];status={status:"stopped"};state=he();async start(e){if(await this.stop(),!e.enabled){this.status={status:"stopped",details:{reason:"disabled"}};return}this.status={status:"starting",lastStartedAt:Date.now()};try{this.imapClient=new ts({host:e.imap.host,port:e.imap.port,secure:e.imap.secure,auth:{user:e.imap.auth.user,pass:e.imap.auth.pass}}),await this.imapClient.connect();let n=await this.imapClient.mailboxOpen(e.imap.mailbox),r=n?.uidValidity?Number(n.uidValidity):void 0;r&&this.state.uidValidity&&r!==this.state.uidValidity?(this.state={...this.state,uidValidity:r,lastUid:0,seenMessageIds:[]},te(this.state)):r&&(this.state={...this.state,uidValidity:r},te(this.state)),this.smtpTransporter=ns.createTransport({host:e.smtp.host,port:e.smtp.port,secure:e.smtp.secure,auth:{user:e.smtp.auth.user,pass:e.smtp.auth.pass}}),await this.smtpTransporter.verify(),this.status={status:"connected",lastStartedAt:Date.now(),lastCheckedAt:Date.now()},this.schedulePoll(e)}catch(n){throw await this.cleanupResources(),this.status={status:"error",lastError:Be(n),details:{stage:this.smtpTransporter?"smtp":"imap"}},n}}async stop(){await this.cleanupResources(),this.status={status:"stopped"}}getStatus(){return{...this.status}}onInbound(e){this.handlers.push(e)}async send(e){if(!this.smtpTransporter)throw new Error("EmailGateway SMTP transporter is not started");let n=os(e.attachments),r=await ds(this.smtpTransporter.sendMail({from:e.from,to:e.to,subject:e.subject,text:e.text,html:e.html,attachments:e.attachments}),n,`SMTP send timed out after ${Math.round(n/1e3)}s`),s=G(r.messageId);if(!s)throw new Error("SMTP send returned no Message-ID");return this.state=Lt(s),s}isSentByAdam(e){let n=G(e);return n.length>0&&this.state.sentMessageIds.includes(n)}schedulePoll(e){this.pollTimer=setInterval(()=>{this.poll(e)},as)}async poll(e){if(this.imapClient)try{this.state=he();let n=`${this.state.lastUid+1}:*`,r=this.imapClient.fetch?.(n,{uid:!0,source:!0,envelope:!0},{uid:!0});if(!r||!r[Symbol.asyncIterator])return;let s=!1;for await(let i of r){let a=Number(i.uid);if(!Number.isInteger(a)||a<=this.state.lastUid)continue;if(!i.source){this.markDegraded(new Error(`IMAP fetch item ${a} is missing source`)),s=!0;break}let o;try{o=await Bt(i.source)}catch(u){this.markDegraded(u),s=!0;break}let d=o.rawHeaders["x-adam-probe-id"],c=G(o.messageId);if(d?.startsWith("adam-probe-")){this.advanceCursor(a);continue}if(c&&this.state.sentMessageIds.includes(c)){this.advanceCursor(a);continue}if(c&&this.state.seenMessageIds.includes(c)){this.advanceCursor(a);continue}try{await Promise.all(this.handlers.map(u=>u(o)))}catch(u){this.markDegraded(u),s=!0;break}this.state=Dt(this.state,c),this.advanceCursor(a)}s||(this.status={...this.status,status:"connected",lastCheckedAt:Date.now(),lastError:void 0})}catch(n){this.markDegraded(n)}}advanceCursor(e){this.state={...this.state,lastUid:e},te(this.state)}markDegraded(e){this.status={...this.status,status:"degraded",lastError:Be(e),lastCheckedAt:Date.now()}}async cleanupResources(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=void 0);let e=this.imapClient,n=this.smtpTransporter;this.imapClient=void 0,this.smtpTransporter=void 0,e&&(await Le(e.logout?.()),await Le(e.close?.())),await Le(n?.close?.())}},jt;function S(){return jt??=new Fe,jt}async function ye(t){await S().start(t)}async function jr(t,e){await S().stop(),await S().start(t)}async function Vr(t){await S().stop()}async function ds(t,e,n){let r;try{return await Promise.race([t,new Promise((s,i)=>{r=setTimeout(()=>i(new Error(n)),e)})])}catch(s){throw new Error(Be(s))}finally{r&&clearTimeout(r)}}function Be(t){return t instanceof Error?t.message.replace(/pass(word)?=[^\s]+/gi,"password=****"):"Email gateway operation failed"}async function Le(t){t&&typeof t.then=="function"&&await t.catch(()=>{})}C();var ls=/\b55[234]\b/,ms=/(?:size|too large|exceeds|maximum|over.*?limit)/i,gs=/\b(\d{6,11})\b/,ps=/Final-Recipient:\s*rfc822;\s*([^\s>]+@([^\s>;]+))/i,fs=/To:[\s<]*([^\s>;]+@([^\s>;]+))/i;function Vt(t){let e=t.text??"",n=e.split(/\r?\n/).filter(a=>ls.test(a)&&ms.test(a));if(n.length===0)return null;let r=e.match(ps)??e.match(fs);if(!r)return null;let s=r[2].toLowerCase().trim();if(!je.test(s))return null;let i=null;for(let a of n){let o=a.match(gs);if(o){let d=parseInt(o[1],10);if(Number.isFinite(d)&&d>=1048576&&d<=209715200){i=d;break}}}return i===null?null:{recipientDomain:s,capBytes:i}}var be=y("channels"),zt=!1;function Qt(t){if(zt){be.debug("Bounce handler already registered; skipping duplicate registration");return}zt=!0,t.onInbound(async e=>{let n=Vt(e);if(!n){(/MAILER-DAEMON/i.test(e.from??"")||/Mail Delivery|Undeliverable|Returned mail|Delivery Status Notification/i.test(e.subject??""))&&be.warn({from:e.from,subject:e.subject},"Inbound looks like bounce but parser did not recognize a size-limit cap");return}let{recipientDomain:r,capBytes:s}=n;be.info({recipientDomain:r,capBytes:s},"Bounce-learning: detected SMTP size-limit bounce");let i=F().filter(a=>a.platform==="email");for(let a of i)try{ze(a.id,r,s)}catch(o){be.warn({channelId:a.id,recipientDomain:r,capBytes:s,err:o},"Bounce-learning: setRecipientCap failed (out of range or DB error); skipping")}})}C();var we=y("channels"),$e=class{constructor(e){this.gateway=e}gateway;adaptersByAddress=new Map;channelAddressById=new Map;registerAdapter(e,n){if(!He(e)||!e.enabled)return;let r=B(e);this.unregisterAdapter(e.id),this.adaptersByAddress.set(r,n),this.channelAddressById.set(e.id,r)}unregisterAdapter(e){let n=this.channelAddressById.get(e);n&&(this.adaptersByAddress.delete(n),this.channelAddressById.delete(e))}refreshFromChannels(e,n){this.adaptersByAddress.clear(),this.channelAddressById.clear();for(let r of e){let s=n.get(r.id);if(s)try{this.registerAdapter(r,s)}catch(i){we.warn({channelId:r.id,error:i},"Invalid email channel skipped during router refresh")}}}async handle(e){if(e.messageId&&this.gateway.isSentByAdam(e.messageId)){we.debug({messageId:e.messageId},"Skipping Adam-sent email");return}let n;try{n=k(e.from)}catch(s){we.warn({from:e.from,error:s},"Skipping email with invalid sender address");return}let r=this.adaptersByAddress.get(n);if(!r){we.info({from:n},"Skipping unmatched inbound email");return}await r.acceptInbound(e)}hasAddress(e){return this.adaptersByAddress.has(k(e))}},_e,Ht;function qe(t){return(!_e||Ht!==t)&&(_e=new $e(t),Ht=t,t.onInbound(e=>_e?.handle(e)??Promise.resolve())),_e}import{existsSync as hs}from"fs";import{basename as ys,isAbsolute as bs}from"path";function Kt(t){let e=[];return t.mediaUrl&&e.push({path:t.mediaUrl,mediaType:t.mediaType}),t.attachments&&e.push(...t.attachments),e.map(ws)}function ws(t){let e=t.path.startsWith("file://")?new URL(t.path).pathname:t.path;if(!bs(e)||e.includes("://"))throw new Error("Email attachment path must be an absolute local file path");if(!hs(e))throw new Error(`Email attachment file not found: ${e}`);return{filename:t.filename??ys(e),path:e,...t.contentType?{contentType:t.contentType}:t.mediaType?{contentType:_s(t.mediaType)}:{}}}function _s(t){return"application/octet-stream"}import Is from"markdown-it";var Es=new Is({html:!1,linkify:!0});function Xt(t){return{text:Xe(t),html:Es.render(t)}}function Jt(t){let e=t.prefix.trim()||"Adam";return t.messageType==="report"||t.messageType==="status_report"?`[${e} Report]`:t.messageType==="deliver"||t.messageType==="result_delivery"?`[${e} Deliver]`:`[${e}]`}var Ie=class{platform="email";id;channel;gateway;handler;inboundDispatchHandler;status="disconnected";identity;constructor(e,n,r={}){this.channel=e,this.gateway=n,this.id=e.id,this.identity=r}async connect(){let e=this.gateway.getStatus();this.status=Ee(e.status)}async disconnect(){this.status="disconnected"}getStatus(){return this.status}getCapabilities(){return{canEdit:!1,canQuote:!1,canParseQuote:!1,canInlineButtons:!1,maxTextLength:Number.POSITIVE_INFINITY,supportsAttachments:!0}}async sendMessage(e,n){let r=k(e),s=B(this.channel);if(r!==s)throw new Error("Email channel recipient does not match configured address");let i=Xt(n.content);return this.gateway.send({from:this.identity.from?Ke(this.identity.from,this.identity.displayName):void 0,to:r,subject:Jt({prefix:this.identity.subjectPrefix??"Adam",messageType:n.messageType??"reply"}),text:i.text,html:i.html,attachments:Kt(n)})}onMessage(e){this.handler=e}onInboundDispatch(e){this.inboundDispatchHandler=e}syncGatewayStatus(){this.status=Ee(this.gateway.getStatus().status)}async acceptInbound(e){let n=k(e.from),r={channelId:this.channel.id,platform:"email",chatId:n,senderId:n,senderName:e.from,content:e.text,replyToMessageId:e.messageId,isGroup:!1,timestamp:e.date??Date.now(),raw:{messageId:e.messageId,subject:e.subject,attachmentCount:e.attachmentCount,headers:e.rawHeaders}};this.handler?.(r),this.inboundDispatchHandler&&await this.inboundDispatchHandler(r)}};function Ee(t){switch(t){case"connected":return"connected";case"starting":return"connecting";case"degraded":case"error":return"degraded";case"stopped":return"disconnected";default:return"disconnected"}}var Yt=y("channels"),Ge=new Map;async function W(t,e){if(t.hasAdapter(e.id))return!0;if(e.platform==="wechat"){let n=e.config;return n.botToken?(await t.addChannel(e,new q(e.id,n)),!0):!1}if(e.platform==="discord"){let n=e.config;return n.botToken?(await t.addChannel(e,new fe(e.id,{botToken:n.botToken})),!0):!1}if(e.platform==="email"){B(e);let n=S(),r=V().emailGateway,s=new Ie(e,n,{from:r?.smtp?.from||r?.address,displayName:r?.displayName,subjectPrefix:r?.subjectPrefix??"Adam"});Ge.set(e.id,s),qe(n).registerAdapter(e,s);try{await Ts(),await t.addChannel(e,s)}catch(i){throw await j(t,e),i}return!0}return!1}async function Ei(t){for(let e of F(!0))try{await W(t,e)}catch(n){z(e.id,"error"),Yt.warn({channelId:e.id,platform:e.platform,error:n},"Failed to register built-in channel adapter")}}async function Zt(t,e){e.platform==="email"&&(await j(t,e),e.enabled&&await W(t,e))}async function en(t,e){await j(t,e)}async function j(t,e){e.platform==="email"&&(qe(S()).unregisterAdapter(e.id),Ge.delete(e.id),t?.hasAdapter(e.id)&&await t.removeChannel(e.id))}function Ti(t){for(let[e,n]of Ge.entries())n.syncGatewayStatus(),z(e,n.getStatus())}async function Ts(){let t=V().emailGateway;if(!t?.enabled)return;let e=S().getStatus().status;if(!(e!=="stopped"&&e!=="error"))try{await ye(t),Qt(S())}catch(n){Yt.warn({error:xs(n)},"EmailGateway start failed during built-in adapter registration")}}function xs(t){return t instanceof Error?t.message.replace(/pass(word)?=[^\s]+/gi,"password=****"):"Email gateway operation failed"}var P=g.object({id:g.string().uuid()}),Ss=g.object({name:g.string().min(1,"name is required"),platform:g.string().min(1,"platform is required"),config:g.record(g.string(),g.unknown()),enabled:g.boolean().optional().default(!0),linkedRoleId:g.string().optional(),allowedChatIds:g.array(g.string()).optional()}),Cs=g.object({name:g.string().min(1).optional(),enabled:g.boolean().optional(),config:g.record(g.string(),g.unknown()).optional(),linkedRoleId:g.string().optional(),allowedChatIds:g.array(g.string()).optional(),viewerKey:g.string().min(1).max(100).regex(/^[a-zA-Z0-9_.@:-]+$/,"viewerKey must be alphanumeric or one of _ . @ : -").optional(),defaultRecipientCapBytes:g.number().int().min(1048576).max(209715200).optional(),recipientCapMap:g.record(g.string().regex(/^[a-z0-9.-]+$/),g.number().int().min(1048576).max(209715200)).optional()}),We;function Li(t){We=t}function Fi(){return We}async function Bi(t){let e=We;async function n(r){Ve(r);try{return e&&r.enabled&&await W(e,r),r}catch(s){throw await j(e,r),Te(r.id),s}}t.get("/channels",{schema:{tags:["Channels"],summary:"List channels",querystring:{type:"object",properties:{enabled:{type:"boolean"}}}}},async(r,s)=>({channels:F(r.query.enabled)})),t.post("/channels",{schema:{tags:["Channels"],summary:"Create a channel",body:{type:"object",required:["name","platform","config"],properties:{name:{type:"string",minLength:1},platform:{type:"string",minLength:1},config:{type:"object"},enabled:{type:"boolean"},linkedRoleId:{type:"string"},allowedChatIds:{type:"array",items:{type:"string"}}}}}},async(r,s)=>{let i=Ss.safeParse(r.body);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let{name:a,platform:o,config:d,enabled:c,linkedRoleId:u,allowedChatIds:p}=i.data,f=d;if(o==="email")try{f={...xe(d)}}catch(l){return s.status(400).send({code:"VALIDATION_ERROR",message:l instanceof Error?l.message:String(l)})}let m={id:Ms(),name:a,platform:o,enabled:c,status:"disconnected",config:f,linkedRoleId:u,allowedChatIds:p,viewerKey:Je(),createdAt:Date.now(),messageCount:0};try{await n(m)}catch(l){return s.status(400).send({code:"VALIDATION_ERROR",message:D(l)})}return s.status(201).send({channel:m})}),t.get("/channels/:id",{schema:{tags:["Channels"],summary:"Get channel by ID",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);return a?{channel:a}:s.status(404).send({code:"NOT_FOUND",message:"Channel not found"})}),t.patch("/channels/:id",{schema:{tags:["Channels"],summary:"Update channel",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},body:{type:"object",properties:{name:{type:"string"},enabled:{type:"boolean"},config:{type:"object"},linkedRoleId:{type:"string"},allowedChatIds:{type:"array",items:{type:"string"}},viewerKey:{type:"string",minLength:1,maxLength:100}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});let o=Cs.safeParse(r.body);if(!o.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(o.error)});let d={...o.data};if((a.platform==="email"||d.config)&&(d.config||a.config)){let p=d.config??a.config;if(a.platform==="email")try{d.config={...xe(p)}}catch(f){return s.status(400).send({code:"VALIDATION_ERROR",message:f instanceof Error?f.message:String(f)})}}let c=a.platform==="email"&&(d.enabled!==void 0||d.config!==void 0);ne(a.id,d);let u=E(a.id);if(e&&u&&c)try{await Zt(e,u)}catch(p){if(ne(a.id,{name:a.name,enabled:a.enabled,status:a.status,config:a.config,linkedRoleId:a.linkedRoleId,allowedChatIds:a.allowedChatIds,lastMessageAt:a.lastMessageAt,messageCount:a.messageCount}),await j(e,u),a.enabled)try{await W(e,a)}catch(f){return s.status(500).send({code:"RESTORE_FAILED",message:D(f)})}return s.status(400).send({code:"VALIDATION_ERROR",message:D(p)})}return{channel:u}}),t.delete("/channels/:id",{schema:{tags:["Channels"],summary:"Delete channel",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(Te(a.id),e)try{await en(e,a)}catch(o){t.log.warn({channelId:a.id,error:D(o)},"Failed to clean up built-in channel runtime")}return s.status(204).send()}),t.post("/channels/:id/connect",{schema:{tags:["Channels"],summary:"Connect channel",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});if(!e)return s.status(501).send({code:"NOT_IMPLEMENTED",message:"Channel manager not initialized"});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(a.platform==="email")try{await As()}catch(o){let d=S().getStatus();return z(a.id,Ee(d.status)),s.status(409).send({code:"EMAIL_GATEWAY_NOT_READY",message:D(o),gatewayStatus:d})}if(!e.hasAdapter(a.id))try{await W(e,a)}catch(o){return s.status(400).send({code:"VALIDATION_ERROR",message:D(o)})}if(!e.hasAdapter(a.id))return s.status(400).send({code:"NO_ADAPTER",message:"No adapter registered for this channel. Install the appropriate adapter first."});try{await e.connectChannel(a.id);let o=E(a.id)?.status??e.getChannelStatus(a.id);return o!=="connected"?s.status(409).send({code:"CONNECT_INCOMPLETE",message:`Channel connect finished with status "${o}"`,status:o}):{channelId:a.id,status:o}}catch(o){return s.status(500).send({code:"CONNECT_FAILED",message:D(o)})}}),t.post("/channels/:id/disconnect",{schema:{tags:["Channels"],summary:"Disconnect channel",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});if(!e)return s.status(501).send({code:"NOT_IMPLEMENTED",message:"Channel manager not initialized"});let a=E(i.data.id);return a?(await e.disconnectChannel(a.id),{channelId:a.id,status:"disconnected"}):s.status(404).send({code:"NOT_FOUND",message:"Channel not found"})}),t.get("/channels/:id/capabilities",{schema:{tags:["Channels"],summary:"Get channel adapter capabilities",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});if(!E(i.data.id))return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(!e)return s.status(503).send({code:"MANAGER_UNAVAILABLE",message:"ChannelManager not initialized"});let o=e.getCapabilities(i.data.id);return o?{capabilities:o}:s.status(404).send({code:"ADAPTER_NOT_REGISTERED",message:"Channel adapter not active"})}),t.get("/channels/:id/messages",{schema:{tags:["Channels"],summary:"Get channel message history",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50},offset:{type:"integer",minimum:0,default:0}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});let{limit:o=50,offset:d=0}=r.query;return{messages:Qe(a.id,o,d)}}),t.post("/channels/:id/wechat/qr-start",{schema:{tags:["WeChat"],summary:"Start WeChat QR login",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(a.platform!=="wechat")return s.status(400).send({code:"INVALID_PLATFORM",message:"Channel is not a WeChat channel"});let o=a.config;return await at({apiBaseUrl:o.baseUrl,routeTag:o.routeTag})}),t.post("/channels/:id/wechat/qr-wait",{schema:{tags:["WeChat"],summary:"Wait for WeChat QR scan",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},body:{type:"object",properties:{sessionKey:{type:"string"},timeoutMs:{type:"number"}}}}},async(r,s)=>{let i=P.safeParse(r.params);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(i.error)});let a=E(i.data.id);if(!a)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(a.platform!=="wechat")return s.status(400).send({code:"INVALID_PLATFORM",message:"Channel is not a WeChat channel"});let o=a.config,{sessionKey:d,timeoutMs:c}=r.body??{},u=await ot({sessionKey:d??"",apiBaseUrl:o.baseUrl,timeoutMs:c??12e4,routeTag:o.routeTag});if(u.connected&&u.botToken){let p={...o,botToken:u.botToken,accountId:u.accountId,baseUrl:u.baseUrl??o.baseUrl,userId:u.userId};if(ne(a.id,{config:p}),e){let f=new q(a.id,p),m=E(a.id);m&&await e.addChannel(m,f)}}return{connected:u.connected,accountId:u.accountId,message:u.message}})}function D(t){return t instanceof Error?t.message.replace(/pass(word)?=[^\s]+/gi,"password=****"):String(t)}async function As(){let t=V().emailGateway;if(!t?.enabled)throw new Error("Email Gateway is disabled. Enable Email Gateway in Settings before connecting Mail channels.");let e=S();e.getStatus().status!=="connected"&&await ye(t);let n=e.getStatus();if(n.status!=="connected"){let r=n.lastError?`: ${n.lastError}`:"";throw new Error(`Email Gateway status is ${n.status}${r}`)}}export{Lt as a,G as b,Bt as c,S as d,jr as e,Vr as f,Ei as g,Ti as h,Li as i,Fi as j,Bi as k};
|