adam-agent-server 0.4.0 → 1.0.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.
Files changed (125) hide show
  1. package/README.md +2 -4
  2. package/dist/App-SCPYTYGQ.js +9 -0
  3. package/dist/adam-tools-FNJJT7AA.js +1 -0
  4. package/dist/{approval-handler-HK7GQPHU.js → approval-handler-UDWAC5MF.js} +2 -2
  5. package/dist/audit-manager-SCX53YJT.js +1 -0
  6. package/dist/bree-engine-2DB2QECM.js +1 -0
  7. package/dist/channels-NAPXRIOX.js +1 -0
  8. package/dist/channels-PQCV74ZI.js +1 -0
  9. package/dist/{chunk-2GXYBWLS.js → chunk-2C5U3CNX.js} +1 -1
  10. package/dist/chunk-2CMR5AG7.js +1 -0
  11. package/dist/chunk-35DBEYMG.js +49 -0
  12. package/dist/chunk-3TIHZZMK.js +1 -0
  13. package/dist/{chunk-VF6GJGD6.js → chunk-42RHY3Q3.js} +1 -1
  14. package/dist/{chunk-742NWPTQ.js → chunk-4TBGFHYX.js} +1 -1
  15. package/dist/chunk-5V36ACKZ.js +1 -0
  16. package/dist/{chunk-PQ7KPALO.js → chunk-64FIXWFL.js} +1 -1
  17. package/dist/chunk-6KLG4APZ.js +1 -0
  18. package/dist/chunk-6VPL5CXB.js +4 -0
  19. package/dist/{chunk-T7WVM27S.js → chunk-7KCBFM2C.js} +6 -6
  20. package/dist/chunk-BCELBB5Q.js +3 -0
  21. package/dist/{chunk-5ASEAZCR.js → chunk-BONI2HUN.js} +1 -1
  22. package/dist/chunk-CFTWJZVX.js +67 -0
  23. package/dist/{chunk-PCSZW2PE.js → chunk-CREHL4BN.js} +7 -7
  24. package/dist/chunk-FXFHGIY6.js +8 -0
  25. package/dist/{chunk-KICPHTI2.js → chunk-GA7GEIXB.js} +1 -1
  26. package/dist/{chunk-HAWA62R2.js → chunk-I5RUEOSQ.js} +1 -1
  27. package/dist/chunk-INNDBLZE.js +1 -0
  28. package/dist/chunk-IZQI6QQ7.js +1 -0
  29. package/dist/{chunk-WXN3PSVX.js → chunk-KHPXEUSY.js} +1 -1
  30. package/dist/{chunk-IXF3XBGX.js → chunk-NFSXJNPD.js} +1 -1
  31. package/dist/chunk-NQHTOFQP.js +1 -0
  32. package/dist/{chunk-B6S2AEOD.js → chunk-PT55643Q.js} +1 -1
  33. package/dist/chunk-QC6QVNKP.js +83 -0
  34. package/dist/chunk-QMKQBU3R.js +2 -0
  35. package/dist/chunk-REKCZ3GY.js +1 -0
  36. package/dist/{chunk-L7426WNY.js → chunk-ROSOI75V.js} +1 -1
  37. package/dist/{chunk-FDWW245P.js → chunk-TEMWI6U5.js} +1 -1
  38. package/dist/{chunk-U36NBCR3.js → chunk-U3XVAAXA.js} +1 -1
  39. package/dist/chunk-VRP4LTHY.js +1 -0
  40. package/dist/chunk-WBAPIPST.js +1 -0
  41. package/dist/{chunk-AXMXXUPO.js → chunk-X26NKAXY.js} +1 -1
  42. package/dist/{chunk-TN6H2WM2.js → chunk-XFTRKHH2.js} +3 -3
  43. package/dist/{chunk-FUGJMHY4.js → chunk-YEV5YTS3.js} +1 -1
  44. package/dist/cli.js +4 -4
  45. package/dist/config-L4R273R3.js +1 -0
  46. package/dist/config-N2GMLTPU.js +1 -0
  47. package/dist/db-S6HDMJ3B.js +1 -0
  48. package/dist/delivery-log-VAI35G5V.js +1 -0
  49. package/dist/engine-E67UAI3G.js +1 -0
  50. package/dist/evolution-audit-KCFDGNSM.js +1 -0
  51. package/dist/external-api-I6CENLIS.js +1 -0
  52. package/dist/index.js +12 -57
  53. package/dist/learner-ABYVK33T.js +1 -0
  54. package/dist/logger-QCJUU7GV.js +1 -0
  55. package/dist/memories-3ZAV55YZ.js +1 -0
  56. package/dist/{memory-extractor-GOISDQTO.js → memory-extractor-BHHKD7X7.js} +2 -2
  57. package/dist/memory-service-5QHTKIUU.js +1 -0
  58. package/dist/outbound-gateway-ZFKSN2UT.js +1 -0
  59. package/dist/role-presets-OTU2M37Y.js +1 -0
  60. package/dist/roles-LXRHEVUK.js +1 -0
  61. package/dist/{runtime-6UTYEONR.js → runtime-UCOE6LNN.js} +1 -1
  62. package/dist/session-manager-RPXFZKMY.js +1 -0
  63. package/dist/task-templates-XQNKAA4U.js +1 -0
  64. package/package.json +1 -1
  65. package/web/dist/assets/{ChannelDetail-dZfZlLgQ.js → ChannelDetail-BajTUEU0.js} +1 -1
  66. package/web/dist/assets/{Channels-Cw04c7YJ.js → Channels-Bhy6rP_t.js} +1 -1
  67. package/web/dist/assets/{Chat-D4PHqHPE.js → Chat-Dvt_Oo7d.js} +1 -1
  68. package/web/dist/assets/{Dashboard-BFewwmAg.js → Dashboard-DlrAor-C.js} +1 -1
  69. package/web/dist/assets/{Evolution-DY1OC6Oc.js → Evolution-Dlsnnr4G.js} +1 -1
  70. package/web/dist/assets/{GoalDetail-DZIEpHs2.js → GoalDetail-BuUxwYdd.js} +1 -1
  71. package/web/dist/assets/{Goals-COCCVLnp.js → Goals-CkPQOev6.js} +1 -1
  72. package/web/dist/assets/{Logs-DsDeimLt.js → Logs-D33PqDAd.js} +1 -1
  73. package/web/dist/assets/{Memories-D5IEEI1u.js → Memories-D31dbUM6.js} +1 -1
  74. package/web/dist/assets/{Plugins-DUwZVjPc.js → Plugins-XlBr07x8.js} +1 -1
  75. package/web/dist/assets/RoleDetail-rZFlgXzh.js +33 -0
  76. package/web/dist/assets/{Roles-JeVjD0Ew.js → Roles-d29AC6Kh.js} +1 -1
  77. package/web/dist/assets/Settings-Bjh_RXYf.js +1 -0
  78. package/web/dist/assets/{Strategies-KAmpqrcQ.js → Strategies-Cf4ghknk.js} +1 -1
  79. package/web/dist/assets/{Switch-Jpdn6Yux.js → Switch-CxzUYL49.js} +1 -1
  80. package/web/dist/assets/{TaskDetail-C4NpqwNT.js → TaskDetail-jMBJbaRU.js} +1 -1
  81. package/web/dist/assets/{Work-DhaxNYnd.js → Work-CCLTkitf.js} +1 -1
  82. package/web/dist/assets/index-CVubgAlC.css +2 -0
  83. package/web/dist/assets/{index-CfKqiQIe.js → index-Ds41VvOC.js} +2 -2
  84. package/web/dist/index.html +2 -2
  85. package/dist/App-XZABZ2AF.js +0 -9
  86. package/dist/adam-tools-PQC7EI3J.js +0 -1
  87. package/dist/bree-engine-25VACELK.js +0 -1
  88. package/dist/channels-JEBBMFUQ.js +0 -1
  89. package/dist/channels-VEUBY2NZ.js +0 -1
  90. package/dist/chunk-3DAK2XWP.js +0 -1
  91. package/dist/chunk-5JLMSNIW.js +0 -1
  92. package/dist/chunk-7SPKRIMZ.js +0 -15
  93. package/dist/chunk-BREBCBG4.js +0 -49
  94. package/dist/chunk-ETQ7KC73.js +0 -1
  95. package/dist/chunk-FYDFMYUP.js +0 -1
  96. package/dist/chunk-HICJBGGJ.js +0 -86
  97. package/dist/chunk-JXD6ZPV7.js +0 -2
  98. package/dist/chunk-MX6AZ7WD.js +0 -1
  99. package/dist/chunk-NSJAV7IH.js +0 -1
  100. package/dist/chunk-NXTTKAQX.js +0 -3
  101. package/dist/chunk-SFUS33SO.js +0 -1
  102. package/dist/chunk-T25NLVMY.js +0 -1
  103. package/dist/chunk-URW2DJQF.js +0 -1
  104. package/dist/chunk-WZOMGJSY.js +0 -1
  105. package/dist/chunk-XNWZZYAV.js +0 -7
  106. package/dist/config-WHXCZCI4.js +0 -1
  107. package/dist/config-Y4QWELO3.js +0 -1
  108. package/dist/db-PNZ3UJOE.js +0 -1
  109. package/dist/delivery-log-VYTYUFCK.js +0 -1
  110. package/dist/engine-DEBMZJBM.js +0 -1
  111. package/dist/evolution-audit-B7WKMOVR.js +0 -1
  112. package/dist/external-api-XGEOKAWR.js +0 -1
  113. package/dist/learner-VMD5NQCD.js +0 -1
  114. package/dist/logger-BEG4WFIM.js +0 -1
  115. package/dist/memories-EFQ4SFZG.js +0 -1
  116. package/dist/memory-service-BKLZIRK6.js +0 -1
  117. package/dist/monitor-K7CGTLA6.js +0 -1
  118. package/dist/outbound-gateway-DZTXBUTP.js +0 -1
  119. package/dist/role-presets-FN2RWUCP.js +0 -1
  120. package/dist/roles-SG2YAR64.js +0 -1
  121. package/dist/session-manager-45LFTPBA.js +0 -1
  122. package/dist/task-templates-7LSQ6OST.js +0 -1
  123. package/web/dist/assets/RoleDetail-B-GKMfMG.js +0 -33
  124. package/web/dist/assets/Settings-CvEyZp5t.js +0 -1
  125. package/web/dist/assets/index-LDFr0VVR.css +0 -2
@@ -0,0 +1,67 @@
1
+ import{a as $,e as Ye}from"./chunk-PT55643Q.js";import{b as He,k as qe,m as Ge}from"./chunk-6VPL5CXB.js";import{a as me,d as Fe,e as ge}from"./chunk-NFSXJNPD.js";import{a as Oe,b as Le}from"./chunk-X26NKAXY.js";import{b as Me,c as U,d as J}from"./chunk-ROSOI75V.js";import{a as Ve}from"./chunk-XFTRKHH2.js";import{a as Ne,b as Ue,f as Ht}from"./chunk-U3XVAAXA.js";import{b as je}from"./chunk-TEMWI6U5.js";import{a as p}from"./chunk-L7JP7DUO.js";import{b as We}from"./chunk-2C5U3CNX.js";import{d as de,f as De}from"./chunk-REKCZ3GY.js";import{a as V,b as $e,e as S,g as O,h as pe,k as L}from"./chunk-FXFHGIY6.js";import{a as Be,g as Ft}from"./chunk-QMKQBU3R.js";import{b as I,d as Ae}from"./chunk-CREHL4BN.js";import{d as ue,h as jt}from"./chunk-WBAPIPST.js";import{c as f,h as _}from"./chunk-INNDBLZE.js";Ae();function Wt(t){return{id:t.id,roleId:t.role_id,taskId:t.task_id,scores:JSON.parse(t.score_json),emaScore:t.ema_score,createdAt:t.created_at}}function Je(t){I().prepare(`
2
+ INSERT INTO role_scores (id, role_id, task_id, score_json, ema_score, created_at)
3
+ VALUES (?, ?, ?, ?, ?, ?)
4
+ `).run(t.id,t.roleId,t.taskId,JSON.stringify(t.scores),t.emaScore,t.createdAt)}function K(t,e=50){return I().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT ?").all(t,e).map(Wt)}function Ke(t){return I().prepare("SELECT ema_score FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(t)?.ema_score}function Xe(t){let o=I().prepare(`
5
+ SELECT token_usage FROM tasks
6
+ WHERE role_id = ? AND status = 'completed' AND token_usage IS NOT NULL
7
+ ORDER BY completed_at DESC LIMIT 50
8
+ `).all(t);if(o.length===0)return 1e4;let n=o.map(r=>{let s=JSON.parse(r.token_usage);return(s.input??0)+(s.output??0)}).sort((r,s)=>r-s);return n[Math.floor(n.length/2)]}_();import{v4 as qt}from"uuid";var Gt=f("audit"),X={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},ze=.3;function Yt(t,e){let o=Me(t),n=o?.status==="completed"?1:0,r=1,s=Fe(t);s?.deviationReport&&(r=s.deviationReport.overallAccuracy);let a=1,i=Le(t,1e3),l=i.filter(b=>b.type==="tool_result"||b.type==="permission_denied").length,c=i.filter(b=>b.type==="permission_denied").length;l>0&&(a=1-c/l);let m=1;if(o?.tokenUsage){let b=o.tokenUsage.input+o.tokenUsage.output,x=e?Xe(e):1e4;b>x&&(m=Math.max(0,1-(b-x)/x))}let k=n*X.taskSuccess+r*X.planAccuracy+a*X.permissionCompliance+m*X.efficiency;return{taskSuccess:n,planAccuracy:r,permissionCompliance:a,efficiency:m,weighted:k}}function Qe(t,e){let o=Yt(e,t),n=Ke(t),r=n!==void 0?ze*o.weighted+(1-ze)*n:o.weighted;return Je({id:qt(),roleId:t,taskId:e,scores:o,emaScore:r,createdAt:Date.now()}),Gt.debug({roleId:t,taskId:e,scores:{...o,weighted:o.weighted.toFixed(3)},ema:r.toFixed(3)},"Task score recorded"),r}L();L();_();var Jt=f("audit");function z(t,e=7){let o=S(t),n=K(t,100),r=Date.now(),s=r-e*24*60*60*1e3,a=n.filter(d=>d.createdAt>=s),i=a.map(d=>d.emaScore),l=a.length>0?a.reduce((d,C)=>d+C.scores.weighted,0)/a.length:1,c=[],m=a.filter(d=>d.scores.taskSuccess<.5);m.length>0&&c.push({category:"task_failures",count:m.length,examples:m.slice(0,3).map(d=>d.taskId)});let k=a.filter(d=>d.scores.planAccuracy<.5);k.length>0&&c.push({category:"plan_deviations",count:k.length,examples:k.slice(0,3).map(d=>d.taskId)});let b=a.filter(d=>d.scores.permissionCompliance<.8);b.length>0&&c.push({category:"permission_violations",count:b.length,examples:b.slice(0,3).map(d=>d.taskId)});let x=a.filter(d=>d.scores.efficiency<.3);x.length>0&&c.push({category:"inefficiency",count:x.length,examples:x.slice(0,3).map(d=>d.taskId)});let T=[],R=[];return m.length>a.length*.3&&(T.push("High task failure rate"),R.push({action:"add_rule",detail:"Add rule: verify task feasibility before execution"})),b.length>0&&(T.push("Permission boundary violations"),R.push({action:"adjust_permission",detail:"Review and expand allowedTools if tasks legitimately need wider access"})),k.length>a.length*.5&&(T.push("Frequent plan deviations"),R.push({action:"add_rule",detail:"Add rule: follow execution plan steps more closely, request plan revision if steps are unclear"})),Jt.info({roleId:t,taskCount:a.length,avgScore:l.toFixed(3),failureCategories:c.map(d=>d.category)},"Diagnostic report generated"),{roleId:t,agentName:o?.name??"Unknown",period:{start:s,end:r},taskCount:a.length,avgScore:l,scoreHistory:i,failureBehaviors:c,rootCauses:T,recommendations:R}}_();var Q=f("audit"),Ze=.4,Kt=5;function et(t,e,o=Ze){if(e>=o)return;let n=S(t);if(!n||n.status==="retired"||n.status==="dead")return;Q.warn({roleId:t,emaScore:e,threshold:o},"Agent EMA below threshold, retiring");let r=z(t),s=JSON.stringify(n.learnedRules),a=Xt(n.learnedRules,r);O(t,{status:"retired",learnedRules:a});let i=[...r.failureBehaviors.map(c=>`${c.category}: ${c.count} occurrences`),...r.rootCauses.map(c=>`Root cause: ${c}`),...r.recommendations.map(c=>`Recommendation [${c.action}]: ${c.detail}`)].join(`
9
+ `),l=Ye(s,JSON.stringify(a));return $({timestamp:Date.now(),oldRules:s,newRules:JSON.stringify(a),diff:i?`--- Diagnostic Report ---
10
+ ${i}
11
+
12
+ --- Rules Diff ---
13
+ ${l}`:l,roleId:t,source:"audit"}),Q.info({roleId:t,oldRulesCount:n.learnedRules.length,newRulesCount:a.length,recommendations:r.recommendations.length},"Agent retired with targeted learnedRules modification"),r}function tt(t){let e=S(t);return!e||e.status!=="retired"?!1:(O(t,{status:"probation"}),$({timestamp:Date.now(),oldRules:"status: retired",newRules:"status: probation",diff:`- status: retired
14
+ + status: probation`,roleId:t,source:"audit"}),Q.info({roleId:t},"Agent reinstated to probation"),!0)}function ot(t,e,o=Ze,n=Kt){let r=S(t);return!r||r.status!=="probation"||K(t,n+1).length<n?!1:e>=o?(O(t,{status:"active"}),$({timestamp:Date.now(),oldRules:"status: probation",newRules:"status: idle",diff:`- status: probation
15
+ + status: idle (graduated, EMA: ${e.toFixed(3)})`,roleId:t,source:"audit"}),Q.info({roleId:t,emaScore:e},"Agent graduated from probation to active"),!0):!1}function Xt(t,e){let o=[...t];for(let n of e.recommendations){let r=`[audit:${n.action}] ${n.detail}`;o.includes(r)||o.push(r)}if(e.failureBehaviors.length>0){let r=`[audit:diagnostic] Failure patterns detected: ${e.failureBehaviors.map(s=>`${s.category}(${s.count})`).join(", ")}. Review and adjust behavior accordingly.`;o.includes(r)||o.push(r)}return o}import{spawn as Tt}from"child_process";L();import{accessSync as rt,constants as st}from"fs";import{accessSync as zt,constants as Qt,existsSync as nt,realpathSync as Zt}from"fs";import{join as fe}from"path";import{spawn as eo}from"child_process";import{execFileSync as to}from"child_process";var j=null;function F(){if(j)return j;let t=typeof import.meta.dirname=="string"?import.meta.dirname:__dirname??".",e=fe(t,"landlock-exec","landlock-exec");if(nt(e))return j=e,e;let o=process.env.PATH?.split(":").find(n=>nt(fe(n,"landlock-exec")));return o?(j=fe(o,"landlock-exec"),j):e}var Z=class{platform="landlock";async isAvailable(){if(process.platform!=="linux")return!1;try{zt(F(),Qt.X_OK)}catch{return!1}try{return to(F(),["--check"],{timeout:5e3,stdio:["ignore","pipe","pipe"]}),!0}catch{return!1}}spawn(e){let o=e.command??"node",n=e.args??[],r=[];for(let s of e.visiblePaths??[]){let a=s.mode==="rw"?"--rw":"--ro",i;try{i=Zt(s.path)}catch{i=s.path}r.push(a,i),i!==s.path&&r.push(a,s.path)}return r.push("--",o,...n),eo(F(),r,{cwd:e.cwd,env:e.env,stdio:"pipe",signal:e.signal})}};function it(){if(process.platform==="linux")try{return rt(F(),st.X_OK),"landlock"}catch{return"none"}if(process.platform==="darwin")try{return rt("/usr/bin/sandbox-exec",st.X_OK),"sandbox-exec"}catch{return"none"}return"none"}_();import{spawn as oo}from"child_process";import{readFileSync as lt,writeFileSync as no,mkdtempSync as ro,realpathSync as he,rmSync as so}from"fs";import{join as E}from"path";import{tmpdir as io}from"os";var ct=f("sandbox-macos"),at="/usr/bin/sandbox-exec";function ao(){let t=[E(typeof import.meta.dirname=="string"?import.meta.dirname:".","profiles","role-sandbox.sb"),E(typeof import.meta.dirname=="string"?import.meta.dirname:".","..","src","sandbox","profiles","role-sandbox.sb"),E(process.cwd(),"src","sandbox","profiles","role-sandbox.sb")];for(let e of t)try{return lt(e,"utf-8"),e}catch{}return t[t.length-1]}var lo=ao();function ee(t){if(!t.startsWith("/"))throw new Error(`Sandbox path must be absolute: ${t}`);if(t.includes('"')||t.includes(")")||t.includes("(")||t.includes("$"))throw new Error(`Sandbox path contains invalid characters for SBPL: ${t}`)}function co(t){let e=[`
16
+ ; ===== Per-Role writable paths =====`];for(let o of t){if(o.mode!=="rw")continue;let n;try{n=he(o.path)}catch{n=o.path}ee(n),e.push(`(allow file-write* (subpath "${n}"))`),n!==o.path&&(ee(o.path),e.push(`(allow file-write* (subpath "${o.path}"))`))}return e.join(`
17
+ `)}function uo(t){if(!t.length)return"";let e=[`
18
+ ; ===== Global read blacklist (deniedReadPaths) =====`];for(let o of t){let n;try{n=he(o)}catch{n=o}try{ee(n),e.push(`(deny file-read-data (subpath "${n}"))`),e.push(`(deny file-read-metadata (subpath "${n}"))`),n!==o&&(ee(o),e.push(`(deny file-read-data (subpath "${o}"))`),e.push(`(deny file-read-metadata (subpath "${o}"))`))}catch(r){ct.warn({path:o,error:r.message},"Skipping deniedReadPath: invalid for SBPL")}}return e.join(`
19
+ `)}var te=class{platform="sandbox-exec";async isAvailable(){try{let{existsSync:e}=await import("fs");return e(at)}catch{return!1}}spawn(e){let{command:o,args:n,cwd:r,env:s,signal:a,visiblePaths:i,deniedReadPaths:l}=e,c=lt(lo,"utf-8"),m=co(i),k=uo(l??[]),b=c+m+k+`
20
+ `,x=he(ro(E(io(),"adam-sandbox-"))),T=E(x,"role.sb");no(T,b,"utf-8");let R=x,d=s?.HOME??process.env.HOME??"/tmp",C={...s,TMPDIR:R,CLAUDE_CODE_TMPDIR:R,CLAUDE_CONFIG_DIR:E(d,".claude")};ct.debug({command:o,visiblePaths:i.length,profilePath:T},"Spawning sandboxed process");let N=oo(at,["-f",T,"-D",`TMPDIR=${R}`,"-D",`CLAUDE_CONFIG=${E(d,".claude")}`,"-D",`HOME_CACHE=${E(d,"Library","Caches")}`,o,...n],{cwd:r,env:C,stdio:"pipe",signal:a});return N.on("exit",()=>{try{so(x,{recursive:!0,force:!0})}catch{}}),N}};import{spawn as po}from"child_process";var B=null,dt=null,oe=null;function D(){if(B)return B;let t=dt??it();return dt=t,t==="sandbox-exec"?B=new te:t==="landlock"?B=new Z:B=new be(t),B}async function ut(){return oe!==null||(oe=await D().isAvailable()),oe}var be=class{platform;constructor(e){this.platform=e}async isAvailable(){return!1}spawn(e){let o=e.command??"node",n=e.args??[];return po(o,n,{cwd:e.cwd,env:e.env,stdio:"pipe",signal:e.signal})}};import{query as wo}from"@anthropic-ai/claude-agent-sdk";import{v4 as St}from"uuid";function pt(t){let e=t.roleName?`## Role Context
21
+ - Role: ${t.roleName}
22
+ ${t.roleCagPrompt?`- CAG Prompt: ${t.roleCagPrompt.slice(0,200)}`:""}`:"",o=t.allowedTools&&t.allowedTools.length>0?`## Available Tools
23
+ You have access to: ${t.allowedTools.join(", ")}. Use them as needed to complete the task.`:"";return`# Execution Agent \u2014 Task Focus
24
+
25
+ You are executing a specific task assigned to you. Your job is to complete the work, not manage goals or strategies.
26
+
27
+ ## Task
28
+ - Task ID: ${t.taskId}
29
+ - Prompt: ${t.prompt}
30
+
31
+ ${e}
32
+
33
+ ${o}
34
+
35
+ ## Focus
36
+ - Focus entirely on completing the task
37
+ - Use the standard SDK tools to do the work
38
+ - Do NOT attempt strategic decisions \u2014 just execute
39
+
40
+ ## Constraints
41
+ - You have standard SDK tools only (no adam-tools MCP)
42
+ - Stay within your assigned permissions and allowed paths
43
+ - Report completion with a clear result summary
44
+ - If WebSearch or WebFetch fails (network error, invalid params), report the failure honestly \u2014 do not fabricate data
45
+ - If a tool is unavailable, state it clearly in the result rather than guessing
46
+ `}$e();_();var mo=new Set(["Read","Glob","Grep","LSP"]),go=new Set(["Edit","Write","NotebookEdit"]);function ye(t){let e=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${e}$`)}function mt(t,e,o){return async(n,r,{agentID:s,blockedPath:a})=>{if(a){let l=V(a);if(o?.deniedReadPaths?.length)for(let c of o.deniedReadPaths){let m=V(c);if(l.startsWith(m))return fo.warn({toolName:n,blockedPath:a,agentID:s,deniedPath:c},"Denied: path in deniedReadPaths (absolute blacklist)"),{behavior:"deny",message:`Access denied: ${a} is in the global denied read paths list. This restriction is configured in Settings > Advanced and cannot be overridden by privilege escalation.`}}return e?await e(n,r,`blockedPath:${a}`,s):{behavior:"deny",message:`Access denied: ${a} is outside this role's allowed scope (cwd + additionalDirectories). Configure additionalDirectories to expand access.`}}if(mo.has(n))return{behavior:"allow",updatedInput:r};if(go.has(n))return{behavior:"allow",updatedInput:r};let i=t(s??"");if(n==="Bash"&&i){let l=r.command??"";if(i.allowedBashPatterns?.length)for(let c of i.allowedBashPatterns)try{if(ye(c).test(l))return{behavior:"allow",updatedInput:r}}catch{}if(i.deniedBashPatterns?.length)for(let c of i.deniedBashPatterns)try{if(ye(c).test(l))return{behavior:"deny",message:`Bash command denied by pattern: ${c}`}}catch{}}if(i?.disallowedTools?.includes(n))return{behavior:"deny",message:`Tool ${n} is not allowed for this role.`};if(e&&i?.approvalRequired?.length){let l=n==="Bash"?r.command??"":`${n} ${JSON.stringify(r)}`;for(let c of i.approvalRequired)try{if(ye(c).test(l))return await e(n,r,c,s)}catch{}}return{behavior:"allow",updatedInput:r}}}var fo=f("manager");function gt(t){return{SessionStart:[{hooks:[async e=>{if(!t.roleId)return{};let o=e.source,n=t.roleId==="role-chat-manager";if(!n&&o!=="startup"&&o!=="resume")return{};try{let{queryMemoryByTier:r}=await import("./memory-service-5QHTKIUU.js"),s=t.taskPrompt||"role context and recent interactions",a=n?["semantic","working"]:["semantic","episodic"],i=await r(t.roleId,s,a,{topK:5});if(i.length>0)return{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[Memory Context]
47
+ ${i.map(m=>`- [${m.tier??"episodic"}] ${m.content}`).join(`
48
+ `)}
49
+
50
+ `}}}catch{}return{}}]}],SubagentStart:[{hooks:[async e=>{let o=t.roleId??e.agent_id;if(!o)return{};try{let n=t.taskPrompt||"role context",r=await We(n,o,5);if(r)return{hookSpecificOutput:{hookEventName:"SubagentStart",additionalContext:r}}}catch{}return{}}]}],SubagentStop:[{hooks:[async e=>{let o=e.agent_id;if(!o||!t.currentTaskId)return{};try{let{createMemory:n}=await import("./memories-3ZAV55YZ.js"),{getDb:r}=await import("./db-S6HDMJ3B.js"),s=e.transcript;if(!s||s.length<=100)return{};if(r().prepare("SELECT 1 FROM memories WHERE source_task_id = ? AND type = 'thought' LIMIT 1").get(t.currentTaskId))return{};let i=`[Task ${t.currentTaskId} reasoning] ${s.slice(0,800)}`;n({id:`session-${Date.now()}`,roleId:t.roleId??o,type:"thought",content:i,keywords:[],importance:3,sourceType:"task_complete",sourceTaskId:t.currentTaskId,createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"episodic"})}catch{}return{}}]}],PostToolUse:[{hooks:[async e=>{if(!t.currentTaskId)return{};let o=e.tool_name,n=e.tool_input,r=e.tool_response,s=typeof r=="string"?r:JSON.stringify(r??"");try{Oe({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,taskId:t.currentTaskId,index:0,type:"tool_call",content:`${o}: ${JSON.stringify(n??{})} \u2192 ${s.slice(0,200)}`,toolName:o,toolInput:n,toolOutput:s,timestamp:Date.now()})}catch{}return{}}]}],PreCompact:[{hooks:[async e=>{let o=e.compact_summary;if(!o)return{};try{let{createMemory:n}=await import("./memories-3ZAV55YZ.js");n({id:`compact-${Date.now()}`,roleId:t.roleId??"role-chat-manager",type:"thought",content:o.slice(0,2e3),keywords:["compaction","context","decisions"],importance:4,sourceType:"pre_compact",createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"working"})}catch{}return{}}]}]}}L();Ht();jt();_();Ae();import{randomUUID as ho}from"crypto";function ft(t,e,o){let r=I().prepare(`
51
+ INSERT INTO task_plugins (id, task_id, plugin_path, plugin_name, role_id, used_at)
52
+ VALUES (?, ?, ?, ?, ?, ?)
53
+ `),s=Date.now();for(let a of e){let i=a.split("/").pop()??a;r.run(ho(),t,a,i,o??null,s)}}function vn(t){return I().prepare(`
54
+ SELECT plugin_name as pluginName, COUNT(*) as usageCount
55
+ FROM task_plugins
56
+ WHERE role_id = ?
57
+ GROUP BY plugin_path
58
+ ORDER BY usageCount DESC
59
+ `).all(t)}function Pn(t=50){return I().prepare(`
60
+ SELECT plugin_path as pluginPath, plugin_name as pluginName, COUNT(*) as usageCount, MAX(used_at) as lastUsed
61
+ FROM task_plugins
62
+ GROUP BY plugin_path
63
+ ORDER BY usageCount DESC
64
+ LIMIT ?
65
+ `).all(t)}L();import{createSdkMcpServer as bo,tool as ht}from"@anthropic-ai/claude-agent-sdk";import{z as bt}from"zod";async function yo(t){let{listChannels:e}=await import("./channels-NAPXRIOX.js"),o=e(),{listSessions:n}=await import("./session-manager-RPXFZKMY.js"),r=[...n("active"),...n("archived")],s=o.find(l=>l.name.toLowerCase().includes(t.toLowerCase()));if(!s)return null;let i=r.find(l=>l.source.type==="channel"&&l.source.channelId===s.id&&l.source.chatId)?.source.chatId??s.config?.userId??"";return{channelId:s.id,chatId:i}}function H(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function yt(t){let e=t?S(t):void 0,o=[...qe(t),ht("list_channels","List all available channels. Use this to discover what channels can be used with send_to_channel.",{},async()=>{let{listChannels:n}=await import("./channels-NAPXRIOX.js"),r=n();return H({channels:r.map(s=>({id:s.id,name:s.name,enabled:s.enabled,type:s.config?.type??"unknown"}))})}),ht("send_to_channel","Send a message to a connected channel by name. This role can only send to channels in its allowedChannels list (if configured).",{channelName:bt.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:bt.string().describe("The message content to send")},async n=>{if(e?.allowedChannels!==void 0){if(e.allowedChannels.length===0)return H({error:"This role is not allowed to send to any channels"});if(!e.allowedChannels.some(c=>c.toLowerCase()===n.channelName.toLowerCase()))return H({error:`Channel "${n.channelName}" is not in the allowed channels list for this role`})}let r=await yo(n.channelName);if(!r)return H({error:`Channel "${n.channelName}" not found or has no chatId available`});let{getOutboundGateway:s}=await import("./outbound-gateway-ZFKSN2UT.js"),i=await s().send({channelId:r.channelId,chatId:r.chatId,content:n.message,messageType:"reply"});return H({success:i.success,channelName:n.channelName})})];return bo({name:"execution-tools",version:"1.0.0",tools:o})}Ft();$e();import{realpathSync as So}from"fs";var h=f("execution"),wt=new Set;async function xo(t,e){if(e&&wt.has(e))return h.info({taskId:t,roleName:e},"Sandbox bypass: approved from session cache"),!0;let o=St(),n={steps:[{index:0,description:"Execute task without OS sandbox \u2014 filesystem isolation not enforced",toolsNeeded:[],expectedOutput:"Task result or denial message",riskLevel:"high"}],requiredPermissions:{allowedTools:[],disallowedTools:[],approvalRequired:[],maxBudgetUsd:0,plugins:[]},overallRisk:"high"};return me({id:o,taskId:t,plan:n,status:"pending",createdAt:Date.now()}),p.emit({type:"plan_approval_request",taskId:t,planId:o,plan:n}),h.info({taskId:t,operationId:o,roleName:e},"Sandbox unavailable: awaiting privilege escalation decision"),new Promise(r=>{let a=setTimeout(()=>{l(),ge(o,"denied"),h.warn({taskId:t,operationId:o},"Sandbox bypass timed out, auto-denied"),r(!1)},12e4),i=c=>{c.planId===o&&(l(),c.decision==="allow"?(h.info({taskId:t,operationId:o},"Sandbox bypass approved by user"),e&&wt.add(e),r(!0)):(h.info({taskId:t,operationId:o},"Sandbox bypass denied by user"),r(!1)))},l=()=>{clearTimeout(a),p.off("plan_approval_decision",i)};p.on("plan_approval_decision",i)})}var ne=class{async execute(e,o){let n=Date.now(),r,s,a;U(e.id,{status:"running",startedAt:Date.now()}),p.emit({type:"task_status_change",taskId:e.id,oldStatus:e.status,newStatus:"running"}),h.info({taskId:e.id,roleId:e.roleId},"ExecutionManager: starting task");try{let i=e.roleId?S(e.roleId):void 0,l=ue;i&&(Ue(i),l=Ne(i.name));let c={taskId:e.id,prompt:e.prompt,roleName:i?.name,roleCagPrompt:i?.cagPrompt,allowedTools:i?.allowedTools},m=pt(c),k=gt({currentTaskId:e.id,roleId:e.roleId,taskPrompt:e.prompt}),b=e.config.approvalTimeout??300,x=async(u,g,y,A)=>{let w=St(),_e=He(A??e.roleId,e.prompt,"medium");if(_e)return h.info({operationId:w,ruleId:_e.id,taskId:e.id},"Auto-approved by permanent rule"),{behavior:"allow",updatedInput:g};let Ie={steps:[{index:0,description:`${u}: ${JSON.stringify(g).slice(0,300)}`,toolsNeeded:[u],expectedOutput:"",riskLevel:"medium"}],requiredPermissions:{},overallRisk:"medium"};return me({id:w,taskId:e.id,roleId:A??e.roleId,plan:Ie,status:"pending",createdAt:Date.now()}),p.emit({type:"plan_approval_request",taskId:e.id,planId:w,plan:Ie}),h.info({taskId:e.id,operationId:w,toolName:u,matchedPattern:y},"Privilege escalation: awaiting user decision"),new Promise(ce=>{let Ut=setTimeout(()=>{Ce(),ge(w,"denied"),h.warn({taskId:e.id,operationId:w},"Privilege escalation timed out, auto-denied"),ce({behavior:"deny",message:`Operation timed out after ${b}s. Auto-denied. Try a safer alternative that does not require approval.`})},b*1e3),Ee=M=>{if(M.planId===w)if(Ce(),M.decision==="allow")h.info({taskId:e.id,operationId:w,approvalType:M.approvalType},"Operation authorized by user"),ce({behavior:"allow",updatedInput:g});else{let Vt=M.reason?`Operation denied by user: ${M.reason}. Try a safer alternative.`:"Operation denied by user. Try a safer alternative approach.";h.info({taskId:e.id,operationId:w,reason:M.reason??"no reason given"},"Operation denied by user"),ce({behavior:"deny",message:Vt})}},Ce=()=>{clearTimeout(Ut),p.off("plan_approval_decision",Ee)};p.on("plan_approval_decision",Ee)})},R=(Be("defaults.deniedReadPaths")??[]).map(u=>{let g=V(u);try{return So(g)}catch{return g}}),d=i?.additionalDirectories??[],C=i?Ge(i):[],N=[...d.map(u=>u.path)].filter((u,g,y)=>y.indexOf(u)===g),Ct=mt(u=>({disallowedTools:i?.disallowedTools,approvalRequired:i?.approvalRequired??e.config.approvalRequired,allowedBashPatterns:i?.allowedBashPatterns,deniedBashPatterns:i?.deniedBashPatterns}),x,{deniedReadPaths:R,roleScope:[l,...N]}),Dt={...process.env,...De(),DISABLE_TELEMETRY:"1",DISABLE_ERROR_REPORTING:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1",DISABLE_AUTOUPDATER:"1"},At=e.config.maxBudgetUsd??5,Mt=e.config.maxTurns??100,Ot=yt(e.roleId??""),Lt=i?.mcpServers??{},$t=e.config.mcpServers??{},Bt={...Lt,...$t,"execution-tools":Ot},ae=[{path:l,mode:"rw"}];e.roleId===Ve&&ae.push({path:ue,mode:"ro"});for(let u of d)ae.push({path:u.path,mode:u.mode??"rw"});let ve=D();if(ve.platform==="none"&&!await xo(e.id,i?.name))return U(e.id,{status:"failed",error:"Sandbox unavailable; execution denied by user"}),{taskId:e.id,status:"failed",error:"Sandbox bypass denied"};let Pe=i?.permissionMode??"default",Nt=wo({prompt:e.prompt,options:{cwd:l,additionalDirectories:N,systemPrompt:m,maxTurns:Mt,maxBudgetUsd:At,allowedTools:i?.allowedTools,model:i?.model,mcpServers:Bt,settingSources:i?.inheritUserSettings?["project","user"]:["project"],hooks:k,canUseTool:Ct,env:Dt,plugins:C.map(u=>({type:"local",path:u})),permissionMode:Pe,...Pe==="bypassPermissions"?{allowDangerouslySkipPermissions:!0}:{},spawnClaudeCodeProcess:u=>{let g=ve.spawn({command:u.command,args:u.args,cwd:u.cwd,env:u.env,signal:u.signal,visiblePaths:ae,deniedReadPaths:R}),y=g;y.pid&&(xt(y.pid,e.roleId??"unknown",e.id),y.on("exit",()=>kt(y.pid)));let A="";return y.stderr?.on("data",w=>{A+=w.toString()}),y.on("exit",w=>{w!==null&&w!==0&&A.includes("sandbox")&&(h.error({taskId:e.id,roleId:e.roleId,exitCode:w,stderr:A.slice(0,500)},"Sandbox wrapper failed \u2014 task process exited before execution"),re({roleId:e.roleId??"unknown",taskId:e.id,path:l,operation:`sandbox_init_failure:exit_${w}`,timestamp:Date.now()}))}),g},stderr:u=>{u.trim()&&h.debug({stderr:u.trim().slice(0,500)},"ExecutionManager SDK stderr")}}}),Y="",Re=0,Te=()=>{h.warn({taskId:e.id},"ExecutionManager: abort signal received")};o&&o.addEventListener("abort",Te);try{for await(let u of Nt){let g=u;if(h.debug({eventType:g.type,taskId:e.id},"ExecutionManager SDK event"),g.type==="result"&&typeof g.result=="string"&&(Y=g.result),g.type==="result"&&Re++,g.token_usage){let y=g.token_usage;y.input_tokens!==void 0&&y.output_tokens!==void 0&&(r={input:y.input_tokens,output:y.output_tokens}),y.cost_usd!==void 0&&(s=y.cost_usd)}}}finally{o&&o.removeEventListener("abort",Te)}a=Re;let le=Date.now()-n;return U(e.id,{status:"completed",result:Y,completedAt:Date.now(),costUsd:s,tokenUsage:r,numTurns:a,totalDurationMs:le}),p.emit({type:"task_status_change",taskId:e.id,oldStatus:"running",newStatus:"completed"}),p.emit({type:"task_complete_event",taskId:e.id,result:Y}),C.length>0&&ft(e.id,C,e.roleId),h.info({taskId:e.id,durationMs:le,costUsd:s},"ExecutionManager: task completed"),{taskId:e.id,status:"completed",result:Y,costUsd:s,tokenUsage:r,numTurns:a,durationMs:le}}catch(i){let l=i instanceof Error?i.message:String(i),c=Date.now()-n;return(l.includes("Prompt is too long")||l.includes("prompt is too long"))&&h.warn({taskId:e.id,error:l},"Task prompt exceeds model context window \u2014 task failed"),U(e.id,{status:"failed",error:l,completedAt:Date.now(),totalDurationMs:c}),p.emit({type:"task_status_change",taskId:e.id,oldStatus:"running",newStatus:"failed"}),p.emit({type:"task_complete_event",taskId:e.id,error:l}),h.error({taskId:e.id,error:i},"ExecutionManager: task failed"),{taskId:e.id,status:"failed",error:l,durationMs:c}}}};_();var v=f("execution-pool"),we=new Map;function xt(t,e,o){we.set(t,{roleId:e,taskId:o})}function kt(t){we.delete(t)}function Se(t){return we.get(t)}var vt=class{slots;running=!1;pollTimeoutId=null;executor;constructor(e,o){this.slots=Array.from({length:e},(n,r)=>({index:r,taskId:null,abortController:null})),this.executor=o??new ne}async start(){if(this.running)return;this.running=!0,p.on("task_created",n=>{this.onTaskCreated(n.taskId)}),p.on("task_status_change",n=>{n.newStatus==="pending"&&this.pickupPendingTasks()});let o=de().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,o),v.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let e of this.slots)e.abortController&&(e.abortController.abort(),e.taskId=null,e.abortController=null);v.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let o=de().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,o)};async onTaskCreated(e){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let e=this.slots.find(i=>i.taskId===null);if(!e){v.debug("No free slots available");return}let o=J("pending");if(o.length===0)return;let r=[...o].sort((i,l)=>i.createdAt-l.createdAt)[0];e.taskId=r.id,e.abortController=new AbortController;let s=e.index,a=r.id;v.info({slotIndex:s,taskId:a},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(r,s).catch(i=>{v.error({taskId:a,error:i},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(e,o){let n=this.slots[o];if(!n)return;let r="completed";try{p.emit({type:"execution_task_start",taskId:e.id,slotIndex:o});let s=await this.executor.execute(e,n.abortController?.signal);r=s.status,v.info({taskId:e.id,status:s.status,slotIndex:o},"ExecutionPool: task finished")}finally{n.taskId=null,n.abortController=null,p.emit({type:"execution_task_end",taskId:e.id,slotIndex:o,status:r}),this.emitSlotChange(),this.runPostCompletion(e.id,e.roleId).catch(s=>{v.error({taskId:e.id,error:s},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let e=this.slots.filter(n=>n.taskId!==null).length,o=J("pending");p.emit({type:"execution_slot_change",active:e,max:this.slots.length,queued:o.length})}async runPostCompletion(e,o){if(o){try{let{processTaskCompletion:n}=await import("./memory-extractor-BHHKD7X7.js"),r=await n(e,o);r>0&&v.debug({taskId:e,roleId:o,memoriesStored:r},"Post-completion: memories extracted")}catch(n){v.error({taskId:e,roleId:o,error:n},"Post-completion: memory extraction failed")}try{let{processTaskReview:n}=await import("./learner-ABYVK33T.js");await n(e)}catch(n){v.error({taskId:e,roleId:o,error:n},"Post-completion: task review failed")}try{let{evaluateTaskCompletion:n}=await import("./audit-manager-SCX53YJT.js");n(e,o)}catch(n){v.error({taskId:e,roleId:o,error:n},"Post-completion: audit evaluation failed")}}}getStatus(){let e=this.slots.filter(n=>n.taskId!==null).length,o=J("pending");return{active:e,max:this.slots.length,queued:o.length}}isHealthy(){return this.running}releaseSlot(e){let o=this.slots.find(n=>n.taskId===e);o&&(v.warn({taskId:e,slotIndex:o.index},"ExecutionPool: force-releasing slot"),o.abortController&&o.abortController.abort(),o.taskId=null,o.abortController=null,this.emitSlotChange(),this.running&&this.pickupPendingTasks())}};_();var P=f("audit"),ko="sandbox_violation",W=new Map,xe=1440*60*1e3,se=[],vo=100;function ke(t){let e=t.roleId,o=W.get(e)??{count:0,timestamps:[]};o.count++,o.timestamps.push(t.timestamp);let n=Date.now()-xe;if(o.timestamps=o.timestamps.filter(r=>r>=n),W.set(e,o),o.count%100===0)for(let[r,s]of W.entries()){let a=Date.now()-xe;s.timestamps.filter(i=>i>=a).length===0&&W.delete(r)}se.push(t),se.length>vo&&se.shift();try{je({id:`sv-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,ruleId:void 0,taskId:t.taskId,status:"delivered",target:{type:"channel",channelId:"audit"},content:"",attempts:1,messageType:ko,source:"audit",createdAt:t.timestamp,deliveredAt:t.timestamp,expiresAt:t.timestamp+864e5,error:`${t.operation} on ${t.path}`})}catch(r){P.error({error:r},"Failed to record violation to delivery_log")}try{let r=S(t.roleId);$({timestamp:t.timestamp,oldRules:"sandbox_violation",newRules:`${t.operation} on ${t.path}`,diff:`Sandbox violation: ${t.operation} on ${t.path} (taskId=${t.taskId??"unknown"})`,roleId:t.roleId,source:"audit"})}catch(r){P.error({error:r},"Failed to record violation to evolution_audit")}p.emit({type:"sandbox_violation",roleId:t.roleId,taskId:t.taskId,path:t.path,operation:t.operation,timestamp:t.timestamp})}async function _t(){let t=D();if(t.platform==="none")return P.info("Sandbox platform is 'none'; violation watcher not started"),()=>{};if(!await t.isAvailable())return P.warn({platform:t.platform},"Sandbox platform detected but not available; violation watcher not started"),()=>{};let o=null;return t.platform==="sandbox-exec"?o=Po():t.platform==="landlock"&&(o=await Ro()),()=>{if(o){let n=o;o=null,n.kill("SIGTERM");let r=setTimeout(()=>{try{n.kill("SIGKILL")}catch{}},2e3);n.on("exit",()=>clearTimeout(r))}P.info("Violation watcher stopped")}}function Po(){let t=Tt("log",["stream","--predicate",'subsystem == "com.apple.sandbox"',"--style","ndjson","--signal","exit"],{stdio:["ignore","pipe","pipe"]});return t.stdout?.on("data",e=>{let o=e.toString().split(`
66
+ `).filter(Boolean);for(let n of o)try{let r=JSON.parse(n),s=r.eventMessage??r.message??"";if(s.includes("deny")&&(s.includes("file-read")||s.includes("file-write"))){let a=To(r,s);a&&ke(a)}}catch{}}),t.stderr?.on("data",e=>{P.debug({msg:e.toString()},"log stream stderr")}),t.on("error",e=>{P.warn({error:e},"macOS violation watcher failed to start")}),P.info("macOS sandbox violation watcher started (log stream)"),t}async function Ro(){let t=await Pt("journalctl",["-kf","--no-pager","-o","short","--grep","landlock"]);if(t)return Rt(t),P.info("Linux violation watcher started (journalctl -kf)"),t;let e=await Pt("dmesg",["-w","-t"]);return e?(Rt(e),P.info("Linux violation watcher started (dmesg -w)"),e):(P.warn("Linux violation watcher unavailable: neither journalctl nor dmesg accessible. Sandbox enforcement still active; monitoring disabled."),null)}async function Pt(t,e){return new Promise(o=>{let n=Tt(t,e,{stdio:["ignore","pipe","pipe"]}),r=setTimeout(()=>o(n),500);n.on("error",()=>{clearTimeout(r),o(null)}),n.on("exit",s=>{s!==0&&(clearTimeout(r),o(null))})})}function Rt(t){t.stdout?.on("data",e=>{let o=e.toString().split(`
67
+ `).filter(Boolean);for(let n of o)if(n.includes("landlock")&&n.includes("denied")){let r=_o(n);r&&ke(r)}}),t.stderr?.on("data",e=>{P.debug({msg:e.toString().trim()},"Linux watcher stderr")})}function To(t,e){let o=e.match(/(?:path|file)=["']([^"']+)["']/),n=e.match(/deny\s+(file-read|file-write|file-[^\s]+)/),r=o?.[1],s=n?.[1]??"unknown";if(!r)return null;let a=typeof t.processID=="number"?t.processID:void 0,i=a?Se(a):void 0;return{roleId:i?.roleId??"unknown",taskId:i?.taskId,path:r,operation:s,timestamp:Date.now(),count:1}}function _o(t){let e=t.match(/path="([^"]+)"/)??t.match(/\/[\w\-\.\/\+ ]+/g),o=t.match(/deny\s+(\w+)/),n=t.match(/pid=(\d+)/),r=Array.isArray(e)?e[e.length-1]:e?.[1],s=o?.[1]??"unknown";if(!r)return null;let a=n?parseInt(n[1],10):void 0,i=a?Se(a):void 0;return{roleId:i?.roleId??"unknown",taskId:i?.taskId,path:r,operation:s,timestamp:Date.now(),count:1}}function re(t){ke({roleId:t.roleId,taskId:t.taskId,path:t.path,operation:t.operation,timestamp:t.timestamp,count:1})}function It(t){let e=W.get(t);if(!e)return 0;let o=Date.now()-xe;return e.timestamps.filter(n=>n>=o).length}function Et(){return[...se]}L();_();var q=f("audit"),Io=.4,Eo=1440*60*1e3,G=null,ie=null;function vr(t,e,o=Io){let n=S(e);if(!n||n.status==="retired"||n.status==="inactive"||n.status==="dead")return;let r=Qe(e,t);O(e,{performanceScore:r}),ot(e,r,o)?q.info({roleId:e,emaScore:r},"Probation role graduated"):r<o&&et(e,r,o)&&tt(e)}async function Pr(){G===null&&(G=setInterval(()=>{q.info("Running daily diagnostic reports");let t=pe(void 0,1e3);for(let e of t)if(!(e.status==="retired"||e.status==="inactive"))try{z(e.id)}catch(o){q.error({roleId:e.id,error:o},"Daily diagnostic failed")}},Eo),ie=await _t(),q.info("AuditManager started"))}function Rr(){G!==null&&(clearInterval(G),G=null),ie!==null&&(ie(),ie=null),q.info("AuditManager stopped")}function Tr(t){re(t)}async function _r(){let t=D(),e=pe(void 0,1e3),n=Date.now()-1440*60*1e3,r=Et(),s=r.filter(l=>l.timestamp>=n).length,a=e.map(l=>{let c=r.filter(k=>k.roleId===l.id),m=c[c.length-1];return{roleId:l.id,roleName:l.name,sandboxed:t.platform!=="none",violationCount:It(l.id),lastViolation:m?.timestamp}}),i=await ut();return{platform:t.platform,available:i,violationCount24h:s,rolePostures:a}}export{K as a,Ke as b,mt as c,gt as d,D as e,ut as f,vn as g,Pn as h,vr as i,Pr as j,Rr as k,Tr as l,_r as m,vt as n};
@@ -1,4 +1,4 @@
1
- import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DPZQ.js";import I from"better-sqlite3";import{existsSync as R,mkdirSync as X}from"fs";import{dirname as m}from"path";function O(e){e.exec(`
1
+ import{e as A,h as O}from"./chunk-WBAPIPST.js";import{c as R,h as X}from"./chunk-INNDBLZE.js";import{c as m}from"./chunk-FCV2DPZQ.js";import p from"better-sqlite3";import{existsSync as S,mkdirSync as g}from"fs";import{dirname as u}from"path";function D(e){e.exec(`
2
2
  CREATE TABLE IF NOT EXISTS server_state (
3
3
  id INTEGER PRIMARY KEY CHECK(id = 1),
4
4
  sdk_session_id TEXT,
@@ -8,7 +8,7 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
8
8
  created_at INTEGER NOT NULL DEFAULT (unixepoch('now') * 1000),
9
9
  last_active_at INTEGER
10
10
  );
11
- `),e.prepare("PRAGMA table_info(server_state)").all().some(E=>E.name==="schema_version")||e.exec("ALTER TABLE server_state ADD COLUMN schema_version INTEGER DEFAULT 0");let o=e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0;if(o<2){let E=["delivery_log","delivery_rules","manager_decisions","skill_scores","approval_rules","task_plans","calibration_history","task_plugins","marketplaces","plugins","trials","strategies","metric_tree","goals","chat_messages","chat_sessions","channels","evolution_audit","step_logs","task_templates","memories","tasks","config","memories_fts","memories_fts_config","memories_fts_data","memories_fts_docsize","memories_fts_idx"];for(let T of E)try{e.exec(`DROP TABLE IF EXISTS ${T}`)}catch{}for(let T of["memories_fts_insert","memories_fts_delete","memories_fts_update"])try{e.exec(`DROP TRIGGER IF EXISTS ${T}`)}catch{}}if(e.exec(`
11
+ `),e.prepare("PRAGMA table_info(server_state)").all().some(E=>E.name==="schema_version")||e.exec("ALTER TABLE server_state ADD COLUMN schema_version INTEGER DEFAULT 0");let o=e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0;if(o<2){let E=["delivery_log","delivery_rules","manager_decisions","skill_scores","approval_rules","task_plans","calibration_history","task_plugins","marketplaces","plugins","trials","strategies","metric_tree","goals","chat_messages","chat_sessions","channels","evolution_audit","step_logs","task_templates","memories","tasks","config","memories_fts","memories_fts_config","memories_fts_data","memories_fts_docsize","memories_fts_idx"];for(let s of E)try{e.exec(`DROP TABLE IF EXISTS ${s}`)}catch{}for(let s of["memories_fts_insert","memories_fts_delete","memories_fts_update"])try{e.exec(`DROP TRIGGER IF EXISTS ${s}`)}catch{}}if(e.exec(`
12
12
  CREATE TABLE IF NOT EXISTS tasks (
13
13
  id TEXT PRIMARY KEY,
14
14
  parent_id TEXT,
@@ -404,7 +404,7 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
404
404
  bound_at INTEGER NOT NULL,
405
405
  PRIMARY KEY (role_id, plugin_id)
406
406
  );
407
- `),e.prepare("PRAGMA table_info(tasks)").all().some(T=>T.name==="role_id")||(e.exec("ALTER TABLE tasks ADD COLUMN role_id TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_role_id ON tasks(role_id)")),e.exec("UPDATE server_state SET schema_version = 4 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<5&&(e.exec(`
407
+ `),e.prepare("PRAGMA table_info(tasks)").all().some(s=>s.name==="role_id")||(e.exec("ALTER TABLE tasks ADD COLUMN role_id TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_role_id ON tasks(role_id)")),e.exec("UPDATE server_state SET schema_version = 4 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<5&&(e.exec(`
408
408
  DROP TABLE IF EXISTS memories;
409
409
  CREATE TABLE memories (
410
410
  id TEXT PRIMARY KEY,
@@ -465,7 +465,7 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
465
465
  source TEXT DEFAULT 'reflection'
466
466
  );
467
467
  CREATE INDEX IF NOT EXISTS idx_evolution_audit_role_id ON evolution_audit(role_id);
468
- `),e.exec("UPDATE server_state SET schema_version = 5 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<6&&(e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="importance_trigger_curr")||e.exec("ALTER TABLE roles ADD COLUMN importance_trigger_curr INTEGER DEFAULT 150"),e.exec("UPDATE server_state SET schema_version = 6 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<7&&(e.prepare("PRAGMA table_info(tasks)").all().some(T=>T.name==="source_session_id")||e.exec("ALTER TABLE tasks ADD COLUMN source_session_id TEXT"),e.exec("UPDATE server_state SET schema_version = 7 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<8){let E=e.prepare("PRAGMA table_info(goals)").all();E.some(s=>s.name==="source_session_id")||e.exec("ALTER TABLE goals ADD COLUMN source_session_id TEXT"),E.some(s=>s.name==="notify_targets")||e.exec("ALTER TABLE goals ADD COLUMN notify_targets TEXT");let T=e.prepare("PRAGMA table_info(task_templates)").all();T.some(s=>s.name==="source_session_id")||e.exec("ALTER TABLE task_templates ADD COLUMN source_session_id TEXT"),T.some(s=>s.name==="notify_targets")||e.exec("ALTER TABLE task_templates ADD COLUMN notify_targets TEXT"),T.some(s=>s.name==="goal_ids")||e.exec("ALTER TABLE task_templates ADD COLUMN goal_ids TEXT"),e.exec("UPDATE goals SET status = 'active' WHERE status IN ('pending','planning','executing','evaluating','replanning')"),e.exec("UPDATE server_state SET schema_version = 8 WHERE id = 1")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<10){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS tasks_new"),e.exec("DROP TABLE IF EXISTS chat_sessions_new"),e.exec("DROP TABLE IF EXISTS task_plans_new"),e.exec("DROP TABLE IF EXISTS task_plugins_new"),e.exec("DROP TABLE IF EXISTS approval_rules_new"),e.exec("DROP TABLE IF EXISTS manager_decisions_new"),e.exec("DROP TABLE IF EXISTS channels_new");let E=e.prepare("PRAGMA table_info(roles)").all();E.some(r=>r.name==="allowed_tools")||e.exec("ALTER TABLE roles ADD COLUMN allowed_tools TEXT"),E.some(r=>r.name==="disallowed_tools")||e.exec("ALTER TABLE roles ADD COLUMN disallowed_tools TEXT"),E.some(r=>r.name==="evaluation_criteria")||e.exec("ALTER TABLE roles ADD COLUMN evaluation_criteria TEXT"),E.some(r=>r.name==="execution_mode")||e.exec("ALTER TABLE roles ADD COLUMN execution_mode TEXT DEFAULT 'isolated'"),E.some(r=>r.name==="model")||e.exec("ALTER TABLE roles ADD COLUMN model TEXT"),E.some(r=>r.name==="max_budget_usd")||e.exec("ALTER TABLE roles ADD COLUMN max_budget_usd REAL"),E.some(r=>r.name==="approval_required")||e.exec("ALTER TABLE roles ADD COLUMN approval_required TEXT"),E.some(r=>r.name==="source")||e.exec("ALTER TABLE roles ADD COLUMN source TEXT DEFAULT 'system'"),e.exec("DROP TABLE IF EXISTS agents"),e.exec("DROP TABLE IF EXISTS role_skills"),e.exec(`
468
+ `),e.exec("UPDATE server_state SET schema_version = 5 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<6&&(e.prepare("PRAGMA table_info(roles)").all().some(s=>s.name==="importance_trigger_curr")||e.exec("ALTER TABLE roles ADD COLUMN importance_trigger_curr INTEGER DEFAULT 150"),e.exec("UPDATE server_state SET schema_version = 6 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<7&&(e.prepare("PRAGMA table_info(tasks)").all().some(s=>s.name==="source_session_id")||e.exec("ALTER TABLE tasks ADD COLUMN source_session_id TEXT"),e.exec("UPDATE server_state SET schema_version = 7 WHERE id = 1")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<8){let E=e.prepare("PRAGMA table_info(goals)").all();E.some(T=>T.name==="source_session_id")||e.exec("ALTER TABLE goals ADD COLUMN source_session_id TEXT"),E.some(T=>T.name==="notify_targets")||e.exec("ALTER TABLE goals ADD COLUMN notify_targets TEXT");let s=e.prepare("PRAGMA table_info(task_templates)").all();s.some(T=>T.name==="source_session_id")||e.exec("ALTER TABLE task_templates ADD COLUMN source_session_id TEXT"),s.some(T=>T.name==="notify_targets")||e.exec("ALTER TABLE task_templates ADD COLUMN notify_targets TEXT"),s.some(T=>T.name==="goal_ids")||e.exec("ALTER TABLE task_templates ADD COLUMN goal_ids TEXT"),e.exec("UPDATE goals SET status = 'active' WHERE status IN ('pending','planning','executing','evaluating','replanning')"),e.exec("UPDATE server_state SET schema_version = 8 WHERE id = 1")}if((e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<10){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS tasks_new"),e.exec("DROP TABLE IF EXISTS chat_sessions_new"),e.exec("DROP TABLE IF EXISTS task_plans_new"),e.exec("DROP TABLE IF EXISTS task_plugins_new"),e.exec("DROP TABLE IF EXISTS approval_rules_new"),e.exec("DROP TABLE IF EXISTS manager_decisions_new"),e.exec("DROP TABLE IF EXISTS channels_new");let E=e.prepare("PRAGMA table_info(roles)").all();E.some(r=>r.name==="allowed_tools")||e.exec("ALTER TABLE roles ADD COLUMN allowed_tools TEXT"),E.some(r=>r.name==="disallowed_tools")||e.exec("ALTER TABLE roles ADD COLUMN disallowed_tools TEXT"),E.some(r=>r.name==="evaluation_criteria")||e.exec("ALTER TABLE roles ADD COLUMN evaluation_criteria TEXT"),E.some(r=>r.name==="execution_mode")||e.exec("ALTER TABLE roles ADD COLUMN execution_mode TEXT DEFAULT 'isolated'"),E.some(r=>r.name==="model")||e.exec("ALTER TABLE roles ADD COLUMN model TEXT"),E.some(r=>r.name==="max_budget_usd")||e.exec("ALTER TABLE roles ADD COLUMN max_budget_usd REAL"),E.some(r=>r.name==="approval_required")||e.exec("ALTER TABLE roles ADD COLUMN approval_required TEXT"),E.some(r=>r.name==="source")||e.exec("ALTER TABLE roles ADD COLUMN source TEXT DEFAULT 'system'"),e.exec("DROP TABLE IF EXISTS agents"),e.exec("DROP TABLE IF EXISTS role_skills"),e.exec(`
469
469
  CREATE TABLE IF NOT EXISTS tasks_new (
470
470
  id TEXT PRIMARY KEY,
471
471
  parent_id TEXT,
@@ -490,7 +490,7 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
490
490
  num_turns INTEGER,
491
491
  total_duration_ms INTEGER
492
492
  );
493
- `);let T=new Set(["id","status","prompt","config","created_at"]),s=["id","parent_id","status","prompt","config","result","error","sdk_session_id","template_id","original_prompt","role_id","source_session_id","notify_targets","deliver_to","report_to","created_at","started_at","completed_at","cost_usd","token_usage","num_turns","total_duration_ms"],t=new Set(e.prepare("PRAGMA table_info(tasks)").all().map(r=>r.name)),i=s.map(r=>t.has(r)?T.has(r)?`COALESCE(${r}, '')`:r:"NULL").join(",");e.exec(`INSERT INTO tasks_new SELECT ${i} FROM tasks`),e.exec("DROP TABLE tasks"),e.exec("ALTER TABLE tasks_new RENAME TO tasks"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks(created_at)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_template_id ON tasks(template_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_role_id ON tasks(role_id)"),e.exec(`
493
+ `);let s=new Set(["id","status","prompt","config","created_at"]),T=["id","parent_id","status","prompt","config","result","error","sdk_session_id","template_id","original_prompt","role_id","source_session_id","notify_targets","deliver_to","report_to","created_at","started_at","completed_at","cost_usd","token_usage","num_turns","total_duration_ms"],t=new Set(e.prepare("PRAGMA table_info(tasks)").all().map(r=>r.name)),i=T.map(r=>t.has(r)?s.has(r)?`COALESCE(${r}, '')`:r:"NULL").join(",");e.exec(`INSERT INTO tasks_new SELECT ${i} FROM tasks`),e.exec("DROP TABLE tasks"),e.exec("ALTER TABLE tasks_new RENAME TO tasks"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks(created_at)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_template_id ON tasks(template_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_tasks_role_id ON tasks(role_id)"),e.exec(`
494
494
  CREATE TABLE IF NOT EXISTS chat_sessions_new (
495
495
  id TEXT PRIMARY KEY,
496
496
  status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'archived')),
@@ -566,7 +566,7 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
566
566
  bound_at INTEGER NOT NULL,
567
567
  PRIMARY KEY (role_id, plugin_id)
568
568
  );
569
- `),e.exec("UPDATE server_state SET schema_version = 10 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(o<11){try{e.exec("ALTER TABLE task_templates RENAME COLUMN skill_preference TO role_preference")}catch(E){let T=e.prepare("PRAGMA table_info(task_templates)").all(),s=T.some(i=>i.name==="role_preference"),t=T.some(i=>i.name==="skill_preference");if(!s&&t)throw E}e.exec("UPDATE server_state SET schema_version = 11 WHERE id = 1")}if(o<12&&(e.prepare("PRAGMA table_info(server_state)").all().some(T=>T.name==="tools_fingerprint")||e.exec("ALTER TABLE server_state ADD COLUMN tools_fingerprint TEXT"),e.exec("UPDATE server_state SET schema_version = 12 WHERE id = 1")),o<13&&(e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="additional_directories")||e.exec("ALTER TABLE roles ADD COLUMN additional_directories TEXT"),e.exec("UPDATE server_state SET schema_version = 13 WHERE id = 1")),o<14){let E=e.prepare("PRAGMA table_info(roles)").all();E.some(t=>t.name==="allowed_channels")||e.exec("ALTER TABLE roles ADD COLUMN allowed_channels TEXT"),E.some(t=>t.name==="mcp_servers")||e.exec("ALTER TABLE roles ADD COLUMN mcp_servers TEXT");let T=e.prepare("PRAGMA table_info(tasks)").all();T.some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),T.some(t=>t.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(goals)").all().some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE goals ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 14 WHERE id = 1")}if(o<15&&(e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="inherit_user_settings")||e.exec("ALTER TABLE roles ADD COLUMN inherit_user_settings INTEGER DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 15 WHERE id = 1")),o<16&&(e.prepare("PRAGMA table_info(task_templates)").all().some(T=>T.name==="deliver_to")||e.exec("ALTER TABLE task_templates ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 16 WHERE id = 1")),o<17){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS plugins"),e.exec("DROP TABLE IF EXISTS role_plugins"),e.exec("DROP TABLE IF EXISTS marketplaces"),e.exec("DROP INDEX IF EXISTS idx_plugins_source"),e.exec("DROP INDEX IF EXISTS idx_plugins_enabled");try{let s=e.prepare("SELECT id, additional_directories FROM roles WHERE additional_directories IS NOT NULL").all();for(let t of s)try{let i=JSON.parse(t.additional_directories);if(i.length>0&&typeof i[0]=="object"&&i[0]!==null&&"path"in i[0])continue;let c=i.map(n=>typeof n=="string"?{path:n}:n);e.prepare("UPDATE roles SET additional_directories = ? WHERE id = ?").run(JSON.stringify(c),t.id)}catch{}}catch{}let E=e.prepare("PRAGMA table_info(tasks)").all();E.some(s=>s.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),E.some(s=>s.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let T=e.prepare("PRAGMA table_info(strategies)").all();T.some(s=>s.name==="role")&&!T.some(s=>s.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 17 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(o<18){let E=e.prepare("PRAGMA table_info(tasks)").all();E.some(s=>s.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),E.some(s=>s.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let T=e.prepare("PRAGMA table_info(strategies)").all();T.some(s=>s.name==="role")&&!T.some(s=>s.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 18 WHERE id = 1")}e.prepare("PRAGMA table_info(delivery_log)").all().some(E=>E.name==="source")||(e.exec(`
569
+ `),e.exec("UPDATE server_state SET schema_version = 10 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(o<11){try{e.exec("ALTER TABLE task_templates RENAME COLUMN skill_preference TO role_preference")}catch(E){let s=e.prepare("PRAGMA table_info(task_templates)").all(),T=s.some(i=>i.name==="role_preference"),t=s.some(i=>i.name==="skill_preference");if(!T&&t)throw E}e.exec("UPDATE server_state SET schema_version = 11 WHERE id = 1")}if(o<12&&(e.prepare("PRAGMA table_info(server_state)").all().some(s=>s.name==="tools_fingerprint")||e.exec("ALTER TABLE server_state ADD COLUMN tools_fingerprint TEXT"),e.exec("UPDATE server_state SET schema_version = 12 WHERE id = 1")),o<13&&(e.prepare("PRAGMA table_info(roles)").all().some(s=>s.name==="additional_directories")||e.exec("ALTER TABLE roles ADD COLUMN additional_directories TEXT"),e.exec("UPDATE server_state SET schema_version = 13 WHERE id = 1")),o<14){let E=e.prepare("PRAGMA table_info(roles)").all();E.some(t=>t.name==="allowed_channels")||e.exec("ALTER TABLE roles ADD COLUMN allowed_channels TEXT"),E.some(t=>t.name==="mcp_servers")||e.exec("ALTER TABLE roles ADD COLUMN mcp_servers TEXT");let s=e.prepare("PRAGMA table_info(tasks)").all();s.some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),s.some(t=>t.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(goals)").all().some(t=>t.name==="deliver_to")||e.exec("ALTER TABLE goals ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 14 WHERE id = 1")}if(o<15&&(e.prepare("PRAGMA table_info(roles)").all().some(s=>s.name==="inherit_user_settings")||e.exec("ALTER TABLE roles ADD COLUMN inherit_user_settings INTEGER DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 15 WHERE id = 1")),o<16&&(e.prepare("PRAGMA table_info(task_templates)").all().some(s=>s.name==="deliver_to")||e.exec("ALTER TABLE task_templates ADD COLUMN deliver_to TEXT"),e.exec("UPDATE server_state SET schema_version = 16 WHERE id = 1")),o<17){e.exec("PRAGMA foreign_keys = OFF"),e.exec("DROP TABLE IF EXISTS plugins"),e.exec("DROP TABLE IF EXISTS role_plugins"),e.exec("DROP TABLE IF EXISTS marketplaces"),e.exec("DROP INDEX IF EXISTS idx_plugins_source"),e.exec("DROP INDEX IF EXISTS idx_plugins_enabled");try{let T=e.prepare("SELECT id, additional_directories FROM roles WHERE additional_directories IS NOT NULL").all();for(let t of T)try{let i=JSON.parse(t.additional_directories);if(i.length>0&&typeof i[0]=="object"&&i[0]!==null&&"path"in i[0])continue;let N=i.map(n=>typeof n=="string"?{path:n}:n);e.prepare("UPDATE roles SET additional_directories = ? WHERE id = ?").run(JSON.stringify(N),t.id)}catch{}}catch{}let E=e.prepare("PRAGMA table_info(tasks)").all();E.some(T=>T.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),E.some(T=>T.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let s=e.prepare("PRAGMA table_info(strategies)").all();s.some(T=>T.name==="role")&&!s.some(T=>T.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 17 WHERE id = 1"),e.exec("PRAGMA foreign_keys = ON")}if(o<18){let E=e.prepare("PRAGMA table_info(tasks)").all();E.some(T=>T.name==="deliver_to")||e.exec("ALTER TABLE tasks ADD COLUMN deliver_to TEXT"),E.some(T=>T.name==="report_to")||e.exec("ALTER TABLE tasks ADD COLUMN report_to TEXT");let s=e.prepare("PRAGMA table_info(strategies)").all();s.some(T=>T.name==="role")&&!s.some(T=>T.name==="role_id")&&(e.exec("ALTER TABLE strategies RENAME COLUMN role TO role_id"),e.exec("DROP INDEX IF EXISTS idx_strategies_role_task_type"),e.exec("DROP INDEX IF EXISTS idx_strategies_role"),e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_role_task_type ON strategies(role_id, task_type, name)"),e.exec("CREATE INDEX IF NOT EXISTS idx_strategies_role ON strategies(role_id)")),e.exec("UPDATE server_state SET schema_version = 18 WHERE id = 1")}e.prepare("PRAGMA table_info(delivery_log)").all().some(E=>E.name==="source")||(e.exec(`
570
570
  CREATE TABLE IF NOT EXISTS delivery_log_new (
571
571
  id TEXT PRIMARY KEY,
572
572
  rule_id TEXT REFERENCES delivery_rules(id),
@@ -583,4 +583,4 @@ import{d as L,g as A}from"./chunk-SFUS33SO.js";import{c as d}from"./chunk-FCV2DP
583
583
  message_type TEXT
584
584
  )
585
585
  `),e.exec(`INSERT INTO delivery_log_new (id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at)
586
- SELECT id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at FROM delivery_log`),e.exec("DROP TABLE delivery_log"),e.exec("ALTER TABLE delivery_log_new RENAME TO delivery_log"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_rule ON delivery_log(rule_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_task ON delivery_log(task_id)")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<20&&(e.prepare("PRAGMA table_info(goals)").all().some(s=>s.name==="report_to")||e.exec("ALTER TABLE goals ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(task_templates)").all().some(s=>s.name==="report_to")||e.exec("ALTER TABLE task_templates ADD COLUMN report_to TEXT"),e.exec("UPDATE goals SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE task_templates SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE server_state SET schema_version = 20 WHERE id = 1")),e.prepare("PRAGMA table_info(config)").all().some(E=>E.name==="updated_at")||(e.exec("ALTER TABLE config ADD COLUMN updated_at INTEGER NOT NULL DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 21 WHERE id = 1"));let l=e.prepare("PRAGMA table_info(memories)").all();l.some(E=>E.name==="tier")||(e.exec("ALTER TABLE memories ADD COLUMN tier TEXT NOT NULL DEFAULT 'episodic'"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)")),l.some(E=>E.name==="superseded_by")||(e.exec("ALTER TABLE memories ADD COLUMN superseded_by TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded ON memories(superseded_by)"));let a=e.prepare("PRAGMA table_info(memories)").all();a.some(E=>E.name==="tier")&&a.some(E=>E.name==="superseded_by")&&(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<22&&e.exec("UPDATE server_state SET schema_version = 22 WHERE id = 1")}function w(){if(_)return _;let e=process.env.ADAM_DB_PATH||L,N=m(e);return R(N)||X(N,{recursive:!0}),_=new I(e),_.pragma("journal_mode = WAL"),_.pragma("foreign_keys = ON"),_.pragma("trusted_schema = ON"),O(_),_}function B(){_&&(_.close(),_=null)}var _,p=d(()=>{A();_=null});export{O as a,w as b,B as c,p as d};
586
+ SELECT id, rule_id, task_id, status, target, content, attempts, error, created_at, delivered_at, expires_at FROM delivery_log`),e.exec("DROP TABLE delivery_log"),e.exec("ALTER TABLE delivery_log_new RENAME TO delivery_log"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_rule ON delivery_log(rule_id)"),e.exec("CREATE INDEX IF NOT EXISTS idx_delivery_log_task ON delivery_log(task_id)")),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<20&&(e.prepare("PRAGMA table_info(goals)").all().some(T=>T.name==="report_to")||e.exec("ALTER TABLE goals ADD COLUMN report_to TEXT"),e.prepare("PRAGMA table_info(task_templates)").all().some(T=>T.name==="report_to")||e.exec("ALTER TABLE task_templates ADD COLUMN report_to TEXT"),e.exec("UPDATE goals SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE task_templates SET report_to = notify_targets WHERE notify_targets IS NOT NULL"),e.exec("UPDATE server_state SET schema_version = 20 WHERE id = 1")),e.prepare("PRAGMA table_info(config)").all().some(E=>E.name==="updated_at")||(e.exec("ALTER TABLE config ADD COLUMN updated_at INTEGER NOT NULL DEFAULT 0"),e.exec("UPDATE server_state SET schema_version = 21 WHERE id = 1"));let c=e.prepare("PRAGMA table_info(memories)").all();c.some(E=>E.name==="tier")||(e.exec("ALTER TABLE memories ADD COLUMN tier TEXT NOT NULL DEFAULT 'episodic'"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)")),c.some(E=>E.name==="superseded_by")||(e.exec("ALTER TABLE memories ADD COLUMN superseded_by TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded ON memories(superseded_by)"));let L=e.prepare("PRAGMA table_info(memories)").all();L.some(E=>E.name==="tier")&&L.some(E=>E.name==="superseded_by")&&(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<22&&e.exec("UPDATE server_state SET schema_version = 22 WHERE id = 1");{let E=e.prepare("PRAGMA table_info(roles)").all();E.some(T=>T.name==="permission_mode")||e.exec("ALTER TABLE roles ADD COLUMN permission_mode TEXT DEFAULT NULL"),E.some(T=>T.name==="allowed_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN allowed_bash_patterns TEXT DEFAULT NULL"),E.some(T=>T.name==="denied_bash_patterns")||e.exec("ALTER TABLE roles ADD COLUMN denied_bash_patterns TEXT DEFAULT NULL"),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<23&&e.exec("UPDATE server_state SET schema_version = 23 WHERE id = 1")}{let E=[[/\brm -rf\b/,["rm -rf *"]],[/^git push/,["git push*"]],[/^git reset/,["git reset*"]],[/\bcurl.*POST\b/i,["curl * -X POST*","curl * --request POST*"]]],s=e.prepare("SELECT key, value FROM config WHERE key = 'defaults.approvalRequired'").all();for(let T of s)try{let t=JSON.parse(T.value),i=[];for(let n of t){let a=!1;for(let[d,r]of E)if(d.test(n)){i.push(...r),a=!0,I.info({from:n,to:r},"Config: migrated approvalRequired pattern from regex to glob");break}a||(/[.+?^${}()|[\]\\]/.test(n)&&I.warn({pattern:n},"Config: approvalRequired pattern contains regex metacharacters that won't work with glob matching; update to glob syntax (use * for wildcards)"),i.push(n))}let N=[...new Set(i)];e.prepare("UPDATE config SET value = ?, updated_at = ? WHERE key = ?").run(JSON.stringify(N),Date.now(),T.key)}catch{}}}function K(){if(_)return _;let e=process.env.ADAM_DB_PATH||A,l=u(e);return S(l)||g(l,{recursive:!0}),_=new p(e),_.pragma("journal_mode = WAL"),_.pragma("foreign_keys = ON"),_.pragma("trusted_schema = ON"),D(_),_}function W(){_&&(_.close(),_=null)}var I,_,C=m(()=>{O();X();I=R("store"),_=null});export{D as a,K as b,W as c,C as d};
@@ -0,0 +1,8 @@
1
+ import{a as u,g as O}from"./chunk-QMKQBU3R.js";import{b as o,d as v}from"./chunk-CREHL4BN.js";import{b as a,h}from"./chunk-WBAPIPST.js";import{c as m,e as R}from"./chunk-FCV2DPZQ.js";import*as _ from"os";import*as g from"path";function d(e){return e.startsWith("~/")||e==="~"?g.join(_.homedir(),e.slice(1)):e}var S=m(()=>{"use strict";h()});var x={};R(x,{createRole:()=>E,deleteRole:()=>J,getRole:()=>N,getRoleByName:()=>b,listRoles:()=>T,updateRole:()=>w,validateAdditionalDirectories:()=>p});import{existsSync as y}from"fs";import{resolve as c}from"path";function p(e,n){for(let s of e){let i=typeof s=="string"?s:s.path;if(!i.startsWith("/")&&!i.startsWith("~/")&&i!=="~")throw new Error(`additionalDirectories must be absolute paths: '${i}' is not absolute`);let r=c(d(i));if(!r.startsWith("/"))throw new Error(`additionalDirectories must be absolute paths: '${i}' is not absolute`);for(let t of a){let l=c(d(t));if(r.startsWith(l))throw new Error(`additionalDirectories cannot include hardcoded denied path: '${i}' matches '${t}'`)}if(n?.length)for(let t of n){let l=c(d(t));if(r.startsWith(l)||l.startsWith(r))throw new Error(`additionalDirectories cannot overlap with deniedReadPaths: '${i}' conflicts with '${t}'`)}if(!y(r))throw new Error(`additionalDirectories path does not exist: '${i}'`)}}function f(e){return{id:e.id,name:e.name,cagPrompt:e.cag_prompt,learnedRules:e.learned_rules?JSON.parse(e.learned_rules):[],memoryStreamId:e.memory_stream_id,status:e.status,performanceScore:e.performance_score??void 0,preferences:e.preferences?JSON.parse(e.preferences):{},createdAt:e.created_at,updatedAt:e.updated_at??void 0,allowedTools:e.allowed_tools?JSON.parse(e.allowed_tools):void 0,disallowedTools:e.disallowed_tools?JSON.parse(e.disallowed_tools):void 0,evaluationCriteria:e.evaluation_criteria?JSON.parse(e.evaluation_criteria):void 0,executionMode:e.execution_mode??void 0,model:e.model??void 0,maxBudgetUsd:e.max_budget_usd??void 0,approvalRequired:e.approval_required?JSON.parse(e.approval_required):void 0,source:e.source??void 0,additionalDirectories:(()=>{if(e.additional_directories!==null)try{let n=JSON.parse(e.additional_directories);return Array.isArray(n)?n.map(s=>typeof s=="string"?{path:s}:s):void 0}catch{return}})(),allowedChannels:e.allowed_channels?JSON.parse(e.allowed_channels):void 0,mcpServers:e.mcp_servers?JSON.parse(e.mcp_servers):void 0,inheritUserSettings:e.inherit_user_settings===1?!0:void 0,permissionMode:e.permission_mode??void 0,allowedBashPatterns:e.allowed_bash_patterns?JSON.parse(e.allowed_bash_patterns):void 0,deniedBashPatterns:e.denied_bash_patterns?JSON.parse(e.denied_bash_patterns):void 0}}function E(e){let n=u("defaults.deniedReadPaths")??[...a];e.additionalDirectories&&p(e.additionalDirectories,n),o().prepare(`
2
+ INSERT INTO roles (id, name, cag_prompt, learned_rules, memory_stream_id, status,
3
+ performance_score, preferences, created_at, updated_at,
4
+ allowed_tools, disallowed_tools, evaluation_criteria, execution_mode, model,
5
+ max_budget_usd, approval_required, source, additional_directories, allowed_channels, mcp_servers, inherit_user_settings,
6
+ permission_mode, allowed_bash_patterns, denied_bash_patterns)
7
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
8
+ `).run(e.id,e.name,e.cagPrompt,JSON.stringify(e.learnedRules),e.memoryStreamId,e.status,e.performanceScore??null,e.preferences?JSON.stringify(e.preferences):null,e.createdAt,e.updatedAt??null,e.allowedTools?JSON.stringify(e.allowedTools):null,e.disallowedTools?JSON.stringify(e.disallowedTools):null,e.evaluationCriteria?JSON.stringify(e.evaluationCriteria):null,e.executionMode??null,e.model??null,e.maxBudgetUsd??null,e.approvalRequired?JSON.stringify(e.approvalRequired):null,e.source??null,e.additionalDirectories?JSON.stringify(e.additionalDirectories):null,e.allowedChannels?JSON.stringify(e.allowedChannels):null,e.mcpServers?JSON.stringify(e.mcpServers):null,e.inheritUserSettings?1:0,e.permissionMode??null,e.allowedBashPatterns?JSON.stringify(e.allowedBashPatterns):null,e.deniedBashPatterns?JSON.stringify(e.deniedBashPatterns):null)}function N(e){let s=o().prepare("SELECT * FROM roles WHERE id = ?").get(e);return s?f(s):void 0}function b(e){let s=o().prepare("SELECT * FROM roles WHERE name = ?").get(e);return s?f(s):void 0}function w(e,n){let s=o(),i=[],r=[];if("name"in n&&(i.push("name = ?"),r.push(n.name)),"cagPrompt"in n&&(i.push("cag_prompt = ?"),r.push(n.cagPrompt)),"learnedRules"in n&&(i.push("learned_rules = ?"),r.push(JSON.stringify(n.learnedRules))),"memoryStreamId"in n&&(i.push("memory_stream_id = ?"),r.push(n.memoryStreamId)),"status"in n&&(i.push("status = ?"),r.push(n.status)),"performanceScore"in n&&(i.push("performance_score = ?"),r.push(n.performanceScore??null)),"preferences"in n&&(i.push("preferences = ?"),r.push(n.preferences?JSON.stringify(n.preferences):null)),"updatedAt"in n&&(i.push("updated_at = ?"),r.push(n.updatedAt??null)),"allowedTools"in n&&(i.push("allowed_tools = ?"),r.push(n.allowedTools?JSON.stringify(n.allowedTools):null)),"disallowedTools"in n&&(i.push("disallowed_tools = ?"),r.push(n.disallowedTools?JSON.stringify(n.disallowedTools):null)),"evaluationCriteria"in n&&(i.push("evaluation_criteria = ?"),r.push(n.evaluationCriteria?JSON.stringify(n.evaluationCriteria):null)),"executionMode"in n&&(i.push("execution_mode = ?"),r.push(n.executionMode??null)),"model"in n&&(i.push("model = ?"),r.push(n.model??null)),"maxBudgetUsd"in n&&(i.push("max_budget_usd = ?"),r.push(n.maxBudgetUsd??null)),"approvalRequired"in n&&(i.push("approval_required = ?"),r.push(n.approvalRequired?JSON.stringify(n.approvalRequired):null)),"source"in n&&(i.push("source = ?"),r.push(n.source??null)),"additionalDirectories"in n){let t=u("defaults.deniedReadPaths")??[...a];n.additionalDirectories&&p(n.additionalDirectories,t),i.push("additional_directories = ?"),r.push(n.additionalDirectories?JSON.stringify(n.additionalDirectories):null)}"allowedChannels"in n&&(i.push("allowed_channels = ?"),r.push(n.allowedChannels?JSON.stringify(n.allowedChannels):null)),"mcpServers"in n&&(i.push("mcp_servers = ?"),r.push(n.mcpServers?JSON.stringify(n.mcpServers):null)),"inheritUserSettings"in n&&(i.push("inherit_user_settings = ?"),r.push(n.inheritUserSettings?1:0)),"permissionMode"in n&&(i.push("permission_mode = ?"),r.push(n.permissionMode??null)),"allowedBashPatterns"in n&&(i.push("allowed_bash_patterns = ?"),r.push(n.allowedBashPatterns?JSON.stringify(n.allowedBashPatterns):null)),"deniedBashPatterns"in n&&(i.push("denied_bash_patterns = ?"),r.push(n.deniedBashPatterns?JSON.stringify(n.deniedBashPatterns):null)),i.length!==0&&(r.push(e),s.prepare(`UPDATE roles SET ${i.join(", ")} WHERE id = ?`).run(...r))}function T(e,n=100,s=0){let i=o(),r="SELECT * FROM roles",t=[];return e&&(r+=" WHERE status = ?",t.push(e)),r+=" ORDER BY created_at ASC LIMIT ? OFFSET ?",t.push(n,s),i.prepare(r).all(...t).map(f)}function J(e){o().prepare("DELETE FROM roles WHERE id = ?").run(e)}var D=m(()=>{v();h();S();O()});export{d as a,S as b,p as c,E as d,N as e,b as f,w as g,T as h,J as i,x as j,D as k};
@@ -1,4 +1,4 @@
1
- import{b as a,d as u}from"./chunk-PCSZW2PE.js";u();function l(e){return{id:e.id,eventType:e.event_type,matchCriteria:JSON.parse(e.match_criteria),target:JSON.parse(e.target),formatTemplate:e.format_template??void 0,maxPerMinute:e.max_per_minute,skipOriginChannel:e.skip_origin_channel===1,enabled:e.enabled===1,createdAt:e.created_at,createdBy:e.created_by??void 0}}function d(e){a().prepare(`
1
+ import{b as a,d as u}from"./chunk-CREHL4BN.js";u();function l(e){return{id:e.id,eventType:e.event_type,matchCriteria:JSON.parse(e.match_criteria),target:JSON.parse(e.target),formatTemplate:e.format_template??void 0,maxPerMinute:e.max_per_minute,skipOriginChannel:e.skip_origin_channel===1,enabled:e.enabled===1,createdAt:e.created_at,createdBy:e.created_by??void 0}}function d(e){a().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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -1,4 +1,4 @@
1
- import{f,l as h}from"./chunk-XNWZZYAV.js";import{b as u,d as E}from"./chunk-PCSZW2PE.js";E();h();function l(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function b(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function v(e){u().prepare(`
1
+ import{e as f,k as h}from"./chunk-FXFHGIY6.js";import{b as u,d as E}from"./chunk-CREHL4BN.js";E();h();function l(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function b(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function v(e){u().prepare(`
2
2
  INSERT INTO memories (id, role_id, type, content, embedding, keywords,
3
3
  importance, source_type, source_task_id, evidence,
4
4
  created_at, last_accessed, retrieved_count, tier, superseded_by)
@@ -0,0 +1 @@
1
+ import{a as m,c as d}from"./chunk-FCV2DPZQ.js";import o from"pino";import{Writable as g}from"stream";function b(n){i.push(n)}function L(){if(h)try{return m("pino-pretty")({colorize:!0,translateTime:"HH:MM:ss.l",ignore:"pid,hostname"})}catch{}return process.stdout}function y(n){return r[n]||e}function E(n){e.level=n;for(let t of Object.values(r))t.level=n}function S(){return e.level}function w(n){a=n}function C(){return a}var p,i,u,h,e,r,a,v=d(()=>{p=process.env.ADAM_LOG_LEVEL||"info",i=[];u=new g({write(n,t,l){try{let s=JSON.parse(n.toString());for(let c of i)c(s)}catch{}l()}}),h=process.env.NODE_ENV!=="production";e=o({level:p,timestamp:o.stdTimeFunctions.epochTime,formatters:{level:n=>({level:n}),bindings:n=>({component:n.name})},serializers:{error:o.stdSerializers.err}},o.multistream([{stream:L()},{stream:u}])),r={adam:e.child({name:"adam"}),manager:e.child({name:"manager"}),scheduler:e.child({name:"scheduler"}),api:e.child({name:"api"}),ws:e.child({name:"ws"}),cli:e.child({name:"cli"}),store:e.child({name:"store"}),embedding:e.child({name:"embedding"}),admin:e.child({name:"admin"}),agent:e.child({name:"agent"}),channels:e.child({name:"channels"}),"plugin-sync":e.child({name:"plugin-sync"}),watchdog:e.child({name:"watchdog"}),"chat-manager":e.child({name:"chat-manager"}),execution:e.child({name:"execution"}),"execution-pool":e.child({name:"execution-pool"}),"message-handler":e.child({name:"message-handler"}),"goal-manager":e.child({name:"goal-manager"}),"cli:register-ai-digest":e.child({name:"cli:register-ai-digest"}),"sandbox-macos":e.child({name:"sandbox-macos"}),"sandbox-linux":e.child({name:"sandbox-linux"}),sandbox:e.child({name:"sandbox"}),audit:e.child({name:"audit"}),config:e.child({name:"config"})};a=null});export{b as a,e as b,y as c,E as d,S as e,w as f,C as g,v as h};
@@ -0,0 +1 @@
1
+ import{f as oe}from"./chunk-4TBGFHYX.js";import{a as ae,b as _,c as Q,d as de,e as ce}from"./chunk-64FIXWFL.js";import{c as f,h as T}from"./chunk-INNDBLZE.js";import{z as g}from"zod/v4";import{v4 as Pt}from"uuid";import{randomUUID as fe}from"crypto";import Qe from"crypto";var le="1.0.0",v="";function Ke(e){let t=e.split(".").map(i=>parseInt(i,10)),r=t[0]??0,s=t[1]??0,n=t[2]??0;return(r&255)<<16|(s&255)<<8|n&255}var H=Ke(le),He=35e3,ue=15e3,Xe=1e4;function O(){return{channel_version:le}}function Je(e){return e.endsWith("/")?e:`${e}/`}function Ye(){let e=Qe.randomBytes(4).readUInt32BE(0);return Buffer.from(String(e),"utf-8").toString("base64")}function Ze(e){let t={"Content-Type":"application/json",AuthorizationType:"ilink_bot_token","Content-Length":String(Buffer.byteLength(e.body,"utf-8")),"X-WECHAT-UIN":Ye(),"iLink-App-Id":v,"iLink-App-ClientVersion":String(H)};return e.token?.trim()&&(t.Authorization=`Bearer ${e.token.trim()}`),e.routeTag&&(t.SKRouteTag=e.routeTag),t}async function N(e){let t=Je(e.baseUrl),r=new URL(e.endpoint,t),s=Ze({token:e.token,routeTag:e.routeTag,body:e.body}),n=new AbortController,i=setTimeout(()=>n.abort(),e.timeoutMs);try{let o=await fetch(r.toString(),{method:"POST",headers:s,body:e.body,signal:n.signal});clearTimeout(i);let a=await o.text();if(!o.ok)throw new Error(`${e.label} ${o.status}: ${a}`);return a}catch(o){throw clearTimeout(i),o}}async function ge(e){let t=e.timeoutMs??He;try{let r=await N({baseUrl:e.baseUrl,endpoint:"ilink/bot/getupdates",body:JSON.stringify({get_updates_buf:e.get_updates_buf??"",base_info:O()}),token:e.token,routeTag:e.routeTag,timeoutMs:t,label:"getUpdates"});return JSON.parse(r)}catch(r){if(r instanceof Error&&r.name==="AbortError")return{ret:0,msgs:[],get_updates_buf:e.get_updates_buf};throw r}}var et=new Set([-2,-3]),K=3,tt=1e3;async function F(e){let t=(await import("./logger-QCJUU7GV.js")).getLogger("channels");for(let r=1;r<=K;r++){let s=await N({baseUrl:e.baseUrl,endpoint:"ilink/bot/sendmessage",body:JSON.stringify({...e.body,base_info:O()}),token:e.token,routeTag:e.routeTag,timeoutMs:e.timeoutMs??ue,label:"sendMessage"});t.info({status:200,responseBody:s.slice(0,300)},"apiFetch sendMessage response");try{let n=JSON.parse(s);if(n.ret&&n.ret!==0){if(et.has(n.ret)&&r<K){t.warn({ret:n.ret,attempt:r,maxRetries:K},"sendMessage: transient iLink error, retrying"),await new Promise(i=>setTimeout(i,tt*r));continue}throw t.error({ret:n.ret,errmsg:n.errmsg,attempt:r},"sendMessage: iLink API returned non-zero ret"),new Error(`sendMessage failed: iLink ret=${n.ret}${n.errmsg?` errmsg=${n.errmsg}`:""}`)}}catch(n){if(n instanceof SyntaxError)t.warn({rawText:s.slice(0,200),attempt:r},"sendMessage: non-JSON response, treating as success");else throw n}return}}async function pe(e){await N({baseUrl:e.baseUrl,endpoint:"ilink/bot/sendtyping",body:JSON.stringify({...e.body,base_info:O()}),token:e.token,routeTag:e.routeTag,timeoutMs:e.timeoutMs??Xe,label:"sendTyping"})}async function me(e){let t=await N({baseUrl:e.baseUrl,endpoint:"ilink/bot/getuploadurl",body:JSON.stringify({filekey:e.filekey,media_type:e.media_type,to_user_id:e.to_user_id,rawsize:e.rawsize,rawfilemd5:e.rawfilemd5,filesize:e.filesize,thumb_rawsize:e.thumb_rawsize,thumb_rawfilemd5:e.thumb_rawfilemd5,thumb_filesize:e.thumb_filesize,no_need_thumb:e.no_need_thumb,aeskey:e.aeskey,base_info:O()}),token:e.token,routeTag:e.routeTag,timeoutMs:e.timeoutMs??ue,label:"getUploadUrl"});return JSON.parse(t)}var nt=5*6e4,rt=35e3,ye="3",h=new Map;function X(e){return Date.now()-e.startedAt<nt}function it(){for(let[e,t]of h)X(t)||h.delete(e)}async function he(e,t,r){let s=e.endsWith("/")?e:`${e}/`,n=new URL(`ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(t)}`,s),i={"iLink-App-Id":v};r&&(i.SKRouteTag=r);let o=await fetch(n.toString(),{headers:i});if(!o.ok){let a=await o.text().catch(()=>"(unreadable)");throw new Error(`Failed to fetch QR code: ${o.status} ${o.statusText} body=${a}`)}return await o.json()}async function st(e,t,r){let s=e.endsWith("/")?e:`${e}/`,n=new URL(`ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(t)}`,s),i={"iLink-App-Id":v,"iLink-App-ClientVersion":String(H)};r&&(i.SKRouteTag=r);let o=new AbortController,a=setTimeout(()=>o.abort(),rt);try{let c=await fetch(n.toString(),{headers:i,signal:o.signal});clearTimeout(a);let l=await c.text();if(!c.ok)throw new Error(`Failed to poll QR status: ${c.status} ${c.statusText}`);return JSON.parse(l)}catch(c){if(clearTimeout(a),c instanceof Error&&c.name==="AbortError")return{status:"wait"};throw c}}async function be(e){let t=e.accountId||fe();it();let r=h.get(t);if(!e.force&&r&&X(r)&&r.qrcodeUrl)return{qrcodeUrl:r.qrcodeUrl,message:"QR code ready. Scan with WeChat.",sessionKey:t};if(!e.apiBaseUrl)return{message:"No baseUrl configured for this WeChat channel.",sessionKey:t};try{let s=e.botType||ye,n=await he(e.apiBaseUrl,s,e.routeTag),i={sessionKey:t,id:fe(),qrcode:n.qrcode,qrcodeUrl:n.qrcode_img_content,startedAt:Date.now()};return h.set(t,i),{qrcodeUrl:n.qrcode_img_content,message:"Scan the QR code with WeChat to connect.",sessionKey:t}}catch(s){return{message:`Failed to start login: ${String(s)}`,sessionKey:t}}}var ot=3;async function _e(e){let t=h.get(e.sessionKey);if(!t)return{connected:!1,message:"No active login session. Start QR login first."};if(!X(t))return h.delete(e.sessionKey),{connected:!1,message:"QR code expired. Please start again."};let r=Math.max(e.timeoutMs??48e4,1e3),s=Date.now()+r,n=1;for(;Date.now()<s;){try{let i=await st(e.apiBaseUrl,t.qrcode,e.routeTag);switch(t.status=i.status,i.status){case"wait":break;case"scaned":break;case"expired":{if(n++,n>ot)return h.delete(e.sessionKey),{connected:!1,message:"Login timeout: QR expired multiple times."};try{let o=e.botType||ye,a=await he(e.apiBaseUrl,o,e.routeTag);t.qrcode=a.qrcode,t.qrcodeUrl=a.qrcode_img_content,t.startedAt=Date.now()}catch(o){return h.delete(e.sessionKey),{connected:!1,message:`QR refresh failed: ${String(o)}`}}break}case"confirmed":return i.ilink_bot_id?(h.delete(e.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!"}):(h.delete(e.sessionKey),{connected:!1,message:"Login failed: server did not return bot ID."})}}catch(i){return h.delete(e.sessionKey),{connected:!1,message:`Login failed: ${String(i)}`}}await new Promise(i=>setTimeout(i,1e3))}return h.delete(e.sessionKey),{connected:!1,message:"Login timeout. Please try again."}}import M,{promises as A}from"fs";import x from"path";import{homedir as re}from"os";var $={IMAGE:1,VIDEO:2,FILE:3,VOICE:4},L={NONE:0,USER:1,BOT:2},m={NONE:0,TEXT:1,IMAGE:2,VOICE:3,FILE:4,VIDEO:5},D={NEW:0,GENERATING:1,FINISH:2},we={TYPING:1,CANCEL:2};T();var at=f("channels"),J=-14,B=3600*1e3,R=new Map;function xe(e){let t=Date.now()+B;R.set(e,t),at.info({channelId:e},`Session paused until ${new Date(t).toISOString()} (${B/1e3}s)`)}function W(e){let t=R.get(e);return t===void 0?!1:Date.now()>=t?(R.delete(e),!1):!0}function Ie(e){let t=R.get(e);if(t===void 0)return 0;let r=t-Date.now();return r<=0?(R.delete(e),0):r}function Te(e){R.delete(e)}T();import ve from"fs";import Oe from"path";import{homedir as ft}from"os";import{createCipheriv as dt,createDecipheriv as ct}from"crypto";function Ue(e,t){let r=dt("aes-128-ecb",t,null);return Buffer.concat([r.update(e),r.final()])}function ke(e,t){let r=ct("aes-128-ecb",t,null);return Buffer.concat([r.update(e),r.final()])}function Ce(e){return Math.ceil((e+1)/16)*16}function Y(e,t){return`${t}/download?encrypted_query_param=${encodeURIComponent(e)}`}function Me(e){return`${e.cdnBaseUrl}/upload?encrypted_query_param=${encodeURIComponent(e.uploadParam)}&filekey=${encodeURIComponent(e.filekey)}`}T();var Kt=f("channels");function lt(e){let t=Buffer.from(e,"base64");if(t.length===16)return t;if(t.length===32&&/^[0-9a-fA-F]{32}$/.test(t.toString("ascii")))return Buffer.from(t.toString("ascii"),"hex");throw new Error(`aes_key must decode to 16 raw bytes or 32-char hex, got ${t.length} bytes`)}async function Re(e){let t=await fetch(e);if(!t.ok)throw new Error(`CDN download ${t.status} ${t.statusText}`);return Buffer.from(await t.arrayBuffer())}async function E(e){let{encryptQueryParam:t,aesKeyBase64:r,cdnBaseUrl:s,fullUrl:n}=e,i=lt(r),o=n?.trim()||(t?Y(t,s):null);if(!o)throw new Error("CDN download: need full_url or encrypt_query_param");let a=await Re(o);return ke(a,i)}async function Ee(e){let{encryptQueryParam:t,cdnBaseUrl:r,fullUrl:s}=e,n=s?.trim()||(t?Y(t,r):null);if(!n)throw new Error("CDN download: need full_url or encrypt_query_param");return Re(n)}T();var q=f("channels"),Se=24e3;function ut(e,t){let r=e.byteLength,s=44+r,n=Buffer.allocUnsafe(s),i=0;return n.write("RIFF",i),i+=4,n.writeUInt32LE(s-8,i),i+=4,n.write("WAVE",i),i+=4,n.write("fmt ",i),i+=4,n.writeUInt32LE(16,i),i+=4,n.writeUInt16LE(1,i),i+=2,n.writeUInt16LE(1,i),i+=2,n.writeUInt32LE(t,i),i+=4,n.writeUInt32LE(t*2,i),i+=4,n.writeUInt16LE(2,i),i+=2,n.writeUInt16LE(16,i),i+=2,n.write("data",i),i+=4,n.writeUInt32LE(r,i),i+=4,Buffer.from(e.buffer,e.byteOffset,e.byteLength).copy(n,i),n}async function Pe(e){try{let{decode:t}=await import("silk-wasm");q.debug(`silkToWav: decoding ${e.length} bytes of SILK`);let r=await t(e,Se);q.debug(`silkToWav: decoded duration=${r.duration}ms pcmBytes=${r.data.byteLength}`);let s=ut(r.data,Se);return q.debug(`silkToWav: WAV size=${s.length}`),s}catch(t){return q.warn(`silkToWav: transcode failed, will use raw silk err=${String(t)}`),null}}import gt from"path";var pt={".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",".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"},mt={"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"};function j(e){let t=gt.extname(e).toLowerCase();return pt[t]??"application/octet-stream"}function Ae(e){let t=e.split(";")[0].trim().toLowerCase();return mt[t]??".bin"}var C=f("channels"),Ne=100*1024*1024;function yt(e){return Ae(e)??".bin"}async function S(e,t,r,s,n=Ne,i){if(e.length>n)throw new Error(`Media too large: ${e.length} bytes exceeds ${n} bytes`);let o=Oe.join(ft(),".adam","wechat","media",s,r);await ve.promises.mkdir(o,{recursive:!0});let a;if(i&&/^[a-zA-Z0-9._-]+$/.test(i))a=i;else{let l=t?yt(t):".bin",d=Date.now(),u=Math.random().toString(36).slice(2,7);a=`${d}-${u}${l}`}let c=Oe.join(o,a);return await ve.promises.writeFile(c,e),C.debug(`saveMedia: saved ${e.length} bytes to ${c}`),c}async function Fe(e,t){let{cdnBaseUrl:r,channelId:s}=t;if(e.type===m.IMAGE){let n=e.image_item;if(!n?.media?.encrypt_query_param&&!n?.media?.full_url)return null;let i=n.aeskey?Buffer.from(n.aeskey,"hex").toString("base64"):n.media?.aes_key;try{let o=i?await E({encryptQueryParam:n.media?.encrypt_query_param,aesKeyBase64:i,cdnBaseUrl:r,fullUrl:n.media?.full_url}):await Ee({encryptQueryParam:n.media?.encrypt_query_param,cdnBaseUrl:r,fullUrl:n.media?.full_url});return{path:await S(o,"image/png","inbound",s),mimeType:"image/png",type:"image"}}catch(o){return C.error({channelId:s},`Image download/decrypt failed: ${String(o)}`),null}}if(e.type===m.VOICE){let n=e.voice_item;if(!n?.media?.encrypt_query_param&&!n?.media?.full_url||!n?.media?.aes_key)return null;try{let i=await E({encryptQueryParam:n.media.encrypt_query_param,aesKeyBase64:n.media.aes_key,cdnBaseUrl:r,fullUrl:n.media.full_url}),o=await Pe(i);if(o){let a=await S(o,"audio/wav","inbound",s);return C.debug(`Voice: saved WAV to ${a}`),{path:a,mimeType:"audio/wav",type:"audio"}}else{let a=await S(i,"audio/silk","inbound",s);return C.debug(`Voice: silk transcode unavailable, saved raw SILK to ${a}`),{path:a,mimeType:"audio/silk",type:"audio"}}}catch(i){return C.error({channelId:s},`Voice download/transcode failed: ${String(i)}`),null}}if(e.type===m.FILE){let n=e.file_item;if(!n?.media?.encrypt_query_param&&!n?.media?.full_url||!n?.media?.aes_key)return null;try{let i=await E({encryptQueryParam:n.media.encrypt_query_param,aesKeyBase64:n.media.aes_key,cdnBaseUrl:r,fullUrl:n.media.full_url}),o=j(n.file_name??"file.bin");return{path:await S(i,o,"inbound",s,Ne,n.file_name),mimeType:o,type:"file"}}catch(i){return C.error({channelId:s},`File download failed: ${String(i)}`),null}}if(e.type===m.VIDEO){let n=e.video_item;if(!n?.media?.encrypt_query_param&&!n?.media?.full_url||!n?.media?.aes_key)return null;try{let i=await E({encryptQueryParam:n.media.encrypt_query_param,aesKeyBase64:n.media.aes_key,cdnBaseUrl:r,fullUrl:n.media.full_url});return{path:await S(i,"video/mp4","inbound",s),mimeType:"video/mp4",type:"video"}}catch(i){return C.error({channelId:s},`Video download failed: ${String(i)}`),null}}return null}import De from"path";import Z from"crypto";import ht from"fs/promises";T();var U=f("channels"),V=3;async function bt(e){let{buf:t,uploadFullUrl:r,uploadParam:s,filekey:n,cdnBaseUrl:i,label:o,aeskey:a}=e,c=Ue(t,a),l=r?.trim(),d;if(l)d=l;else if(s)d=Me({cdnBaseUrl:i,uploadParam:s,filekey:n});else throw new Error(`${o}: CDN upload URL missing (need upload_full_url or upload_param)`);U.debug(`${o}: CDN POST url=${d} ciphertextSize=${c.length}`);let u,y;for(let b=1;b<=V;b++)try{let p=await fetch(d,{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:new Uint8Array(c)});if(p.status>=400&&p.status<500){let I=p.headers.get("x-error-message")??await p.text();throw U.error(`${o}: CDN client error attempt=${b} status=${p.status} errMsg=${I}`),new Error(`CDN upload client error ${p.status}: ${I}`)}if(p.status!==200){let I=p.headers.get("x-error-message")??`status ${p.status}`;throw U.error(`${o}: CDN server error attempt=${b} status=${p.status} errMsg=${I}`),new Error(`CDN upload server error: ${I}`)}if(u=p.headers.get("x-encrypted-param")??void 0,!u)throw U.error(`${o}: CDN response missing x-encrypted-param header attempt=${b}`),new Error("CDN upload response missing x-encrypted-param header");U.debug(`${o}: CDN upload success attempt=${b}`);break}catch(p){if(y=p,p instanceof Error&&p.message.includes("client error"))throw p;b<V?U.warn(`${o}: attempt ${b} failed, retrying... err=${String(p)}`):U.error(`${o}: all ${V} attempts failed err=${String(p)}`)}if(!u)throw y instanceof Error?y:new Error(`CDN upload failed after ${V} attempts`);return{downloadParam:u}}async function ee(e){let{filePath:t,toUserId:r,opts:s,cdnBaseUrl:n,mediaType:i,label:o}=e,a=await ht.readFile(t),c=a.length,l=Z.createHash("md5").update(a).digest("hex"),d=Ce(c),u=Z.randomBytes(16).toString("hex"),y=Z.randomBytes(16);U.debug(`${o}: file=${t} rawsize=${c} filesize=${d} md5=${l} filekey=${u}`);let b=await me({...s,filekey:u,media_type:i,to_user_id:r,rawsize:c,rawfilemd5:l,filesize:d,no_need_thumb:!0,aeskey:y.toString("hex")}),p=b.upload_full_url?.trim(),I=b.upload_param;if(!p&&!I)throw new Error(`${o}: getUploadUrl returned no upload URL (need upload_full_url or upload_param)`);let{downloadParam:Ge}=await bt({buf:a,uploadFullUrl:p||void 0,uploadParam:I??void 0,filekey:u,cdnBaseUrl:n,aeskey:y,label:`${o}[orig filekey=${u}]`});return{filekey:u,downloadEncryptedQueryParam:Ge,aeskey:y.toString("hex"),fileSize:c,fileSizeCiphertext:d}}async function $e(e){return ee({...e,mediaType:$.IMAGE,label:"uploadImageToWeixin"})}async function Le(e){return ee({...e,mediaType:$.VIDEO,label:"uploadVideoToWeixin"})}async function te(e){return ee({...e,mediaType:$.FILE,label:"uploadFileAttachmentToWeixin"})}T();var P=f("channels");function _t(){return`adam-wechat-${Date.now()}-${Math.random().toString(36).slice(2,7)}`}function wt(e){let t=e;return t=t.replace(/```[^\n]*\n?([\s\S]*?)```/g,(r,s)=>s.trim()),t=t.replace(/!\[[^\]]*\]\([^)]*\)/g,""),t=t.replace(/\[([^\]]+)\]\([^)]*\)/g,"$1"),t=t.replace(/^\|[\s:|-]+\|$/gm,""),t=t.replace(/^\|(.+)\|$/gm,(r,s)=>s.split("|").map(n=>n.trim()).join(" ")),t}async function ne(e){let{to:t,text:r,mediaItem:s,opts:n,label:i}=e,o=[],a=wt(r);a&&o.push({type:m.TEXT,text_item:{text:a}}),o.push(s);let c="";for(let l of o){c=_t();let d={msg:{from_user_id:"",to_user_id:t,client_id:c,message_type:L.BOT,message_state:D.FINISH,item_list:[l],context_token:n.contextToken}};await F({baseUrl:n.baseUrl,token:n.token,routeTag:n.routeTag,body:d})}return P.debug(`${i}: sent to=${t} messageId=${c}`),{messageId:c}}async function xt(e){let{to:t,text:r,uploaded:s,opts:n}=e,i={type:m.IMAGE,image_item:{media:{encrypt_query_param:s.downloadEncryptedQueryParam,aes_key:Buffer.from(s.aeskey).toString("base64"),encrypt_type:1},mid_size:s.fileSizeCiphertext}};return ne({to:t,text:r,mediaItem:i,opts:n,label:"sendImageMessage"})}async function It(e){let{to:t,text:r,uploaded:s,opts:n}=e,i={type:m.VIDEO,video_item:{media:{encrypt_query_param:s.downloadEncryptedQueryParam,aes_key:Buffer.from(s.aeskey).toString("base64"),encrypt_type:1},video_size:s.fileSizeCiphertext}};return ne({to:t,text:r,mediaItem:i,opts:n,label:"sendVideoMessage"})}async function Be(e){let{to:t,text:r,fileName:s,uploaded:n,opts:i}=e,o={type:m.FILE,file_item:{media:{encrypt_query_param:n.downloadEncryptedQueryParam,aes_key:Buffer.from(n.aeskey).toString("base64"),encrypt_type:1},file_name:s,len:String(n.fileSize)}};return ne({to:t,text:r,mediaItem:o,opts:i,label:"sendFileMessage"})}async function We(e){let{filePath:t,to:r,text:s,opts:n,cdnBaseUrl:i}=e,o=j(t),a={baseUrl:n.baseUrl,token:n.token,routeTag:n.routeTag};if(o.startsWith("video/")){P.debug(`sendWeixinMediaFile: uploading video filePath=${t} to=${r}`);let d=await Le({filePath:t,toUserId:r,opts:a,cdnBaseUrl:i});return It({to:r,text:s,uploaded:d,opts:n})}if(o.startsWith("image/")){P.debug(`sendWeixinMediaFile: uploading image filePath=${t} to=${r}`);let d=await $e({filePath:t,toUserId:r,opts:a,cdnBaseUrl:i});return xt({to:r,text:s,uploaded:d,opts:n})}if(o.startsWith("audio/")){let d=De.basename(t);P.debug(`sendWeixinMediaFile: uploading audio as file filePath=${t} name=${d} to=${r}`);let u=await te({filePath:t,fileName:d,toUserId:r,opts:a,cdnBaseUrl:i});return Be({to:r,text:s,fileName:d,uploaded:u,opts:n})}let c=De.basename(t);P.debug(`sendWeixinMediaFile: uploading file attachment filePath=${t} name=${c} to=${r}`);let l=await te({filePath:t,fileName:c,toUserId:r,opts:a,cdnBaseUrl:i});return Be({to:r,text:s,fileName:c,uploaded:l,opts:n})}T();var w=f("channels"),qe="https://novac2c.cdn.weixin.qq.com/c2c",ie=new Map;function Ve(e){return x.join(re(),".adam","wechat",`${e}.context-tokens.json`)}function Tt(e){let t=Ve(e);try{let r=M.readFileSync(t,"utf-8"),s=JSON.parse(r);for(let[n,i]of Object.entries(s))typeof i=="string"&&i&&ie.set(`${e}:${n}`,i);w.debug({channelId:e,count:Object.keys(s).length},"Restored context tokens from disk")}catch{}}function Ut(e,t,r){let s=Ve(e);try{let n={};try{let o=M.readFileSync(s,"utf-8");n=JSON.parse(o)}catch{}n[t]=r;let i=x.dirname(s);M.mkdirSync(i,{recursive:!0}),M.writeFileSync(s,JSON.stringify(n),"utf-8")}catch(n){w.warn({channelId:e,userId:t},`Failed to persist context token: ${String(n)}`)}}function kt(e,t,r){ie.set(`${e}:${t}`,r),Ut(e,t,r)}function je(e,t){return ie.get(`${e}:${t}`)}function ze(e){return x.join(re(),".adam","wechat",`${e}.sync`)}function Ct(e){try{return M.readFileSync(ze(e),"utf-8")}catch{return""}}function Mt(e,t){let r=ze(e);M.mkdirSync(x.dirname(r),{recursive:!0}),M.writeFileSync(r,t,"utf-8")}var Rt=0;function Et(){return`adam-wechat-${Date.now()}-${++Rt}`}var z=class{platform="wechat";id;config;status="disconnected";messageHandler=null;pollAbort=null;getUpdatesBuf="";constructor(t,r){if(this.id=t,!r.baseUrl)throw new Error("WeChat adapter requires baseUrl");this.config=r}async connect(){if(!this.config.botToken)throw new Error("WeChat adapter requires botToken. Complete QR login first.");this.status="connecting",this.getUpdatesBuf=Ct(this.id),Tt(this.id),this.pollAbort=new AbortController,this.status="connected",w.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",w.info({channelId:this.id},"WeChat adapter disconnected")}getStatus(){return this.status==="connected"&&W(this.id)?"error":this.status}async sendMessage(t,r){if(W(this.id)){let o=Math.ceil(Ie(this.id)/6e4);throw new Error(`WeChat session paused, ${o} min remaining. Re-scan QR to reconnect.`)}let s=Et(),n=je(this.id,t),i=this.config.cdnBaseUrl??qe;if(r.mediaUrl)try{let o=!r.mediaUrl.includes("://")||r.mediaUrl.startsWith("file://"),a=x.join(re(),".adam","wechat","media","outbound-tmp");await A.mkdir(a,{recursive:!0});let c=this.getExtensionFromMediaType(r.mediaType),l;if(o){let u=r.mediaUrl.startsWith("file://")?new URL(r.mediaUrl).pathname:x.isAbsolute(r.mediaUrl)?r.mediaUrl:x.resolve(r.mediaUrl),y=await A.readFile(u);l=x.join(a,`${Date.now()}-${Math.random().toString(36).slice(2,7)}${c}`),await A.writeFile(l,y)}else{let u=await fetch(r.mediaUrl);if(!u.ok)throw new Error(`Failed to fetch media: ${u.status}`);let y=Buffer.from(await u.arrayBuffer());l=x.join(a,`${Date.now()}-${Math.random().toString(36).slice(2,7)}${c}`),await A.writeFile(l,y)}let d=await We({filePath:l,to:t,text:r.content??"",opts:{baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,contextToken:n},cdnBaseUrl:i});return await A.unlink(l).catch(()=>{}),d.messageId}catch(o){throw w.error({channelId:this.id},`sendMessage media handling failed: ${String(o)}`),o}return await F({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,body:{msg:{from_user_id:"",to_user_id:t,client_id:s,message_type:L.BOT,message_state:D.FINISH,item_list:r.content?[{type:m.TEXT,text_item:{text:r.content}}]:void 0,context_token:n}}}),s}onMessage(t){this.messageHandler=t}async sendTypingIndicator(t){if(W(this.id))return;let r=je(this.id,t);try{await pe({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,body:{ilink_user_id:t,status:we.TYPING}})}catch{}}updateConfig(t){Object.assign(this.config,t)}async startLongPoll(){let t=this.pollAbort?.signal,r=0,s=3,n=3e4,i=2e3;for(;!t?.aborted;)try{let o=await ge({baseUrl:this.config.baseUrl,token:this.config.botToken,routeTag:this.config.routeTag,get_updates_buf:this.getUpdatesBuf});if(o.ret===J||o.errcode===J){xe(this.id),this.status="error",w.error({channelId:this.id},"Session expired (errcode=-14), pausing for 1 hour"),await this.sleep(B,t),Te(this.id),this.status="connected";continue}if(o.ret!==void 0&&o.ret!==0||o.errcode!==void 0&&o.errcode!==0){r++,w.error({channelId:this.id,ret:o.ret,errcode:o.errcode},"getUpdates API error"),r>=s?(r=0,await this.sleep(n,t)):await this.sleep(i,t);continue}r=0,o.get_updates_buf&&(this.getUpdatesBuf=o.get_updates_buf,Mt(this.id,o.get_updates_buf));for(let c of o.msgs??[])await this.processInbound(c)}catch(o){if(t?.aborted)return;r++,w.error({channelId:this.id,error:o},"getUpdates error"),r>=s?(r=0,await this.sleep(n,t)):await this.sleep(i,t)}}async processInbound(t){if(!this.messageHandler)return;let r=!!t.group_id,s=r?t.group_id:t.from_user_id??"",n=t.from_user_id??"";t.context_token&&s&&kt(this.id,s,t.context_token);let i="",o,a=[];for(let d of t.item_list??[])d.type===m.TEXT&&d.text_item?.text&&(i+=d.text_item.text),d.type===m.IMAGE&&(o="image",a.push(d)),d.type===m.VOICE&&(o="audio",a.push(d),d.voice_item?.text&&!i&&(i=d.voice_item.text)),d.type===m.FILE&&(o="file",a.push(d)),d.type===m.VIDEO&&(o="video",a.push(d));if(!i&&!o)return;let c;if(a.length>0){let d=this.config.cdnBaseUrl??qe;try{let u=await Fe(a[0],{cdnBaseUrl:d,channelId:this.id});u&&(c=u.path,o=u.type)}catch(u){w.error({channelId:this.id},`Media download failed: ${String(u)}`)}}let l={channelId:this.id,platform:"wechat",chatId:s,senderId:n,content:i,mediaType:o,mediaPath:c,isGroup:r,timestamp:t.create_time_ms??Date.now(),raw:t};this.messageHandler(l)}getExtensionFromMediaType(t){switch(t){case"image":return".png";case"video":return".mp4";case"audio":return".mp3";default:return".bin"}}sleep(t,r){return new Promise((s,n)=>{let i=setTimeout(s,t);r?.addEventListener("abort",()=>{clearTimeout(i),n(new Error("aborted"))},{once:!0})})}};T();var St=f("channels"),G=class{platform="discord";id;config;status="disconnected";messageHandler=null;client=null;constructor(t,r){if(this.id=t,!r.botToken)throw new Error("Discord adapter requires botToken");this.config=r}async connect(){this.status="connecting";try{let{Client:t,GatewayIntentBits:r}=await import("discord.js");this.client=new t({intents:[r.Guilds,r.GuildMessages,r.MessageContent,r.DirectMessages]});let s=this.client;s.on("messageCreate",n=>{if(!this.messageHandler||n.author.bot||this.config.allowedGuildIds?.length&&n.guildId&&!this.config.allowedGuildIds.includes(n.guildId))return;let i={channelId:this.id,platform:"discord",chatId:n.channelId,senderId:n.author.id,senderName:n.author.displayName??n.author.username,content:n.content,isGroup:!!n.guildId,timestamp:n.createdTimestamp,raw:n};this.messageHandler(i)}),await s.login(this.config.botToken),this.status="connected",St.info({channelId:this.id},"Discord bot connected")}catch(t){throw this.status="error",t}}async disconnect(){this.client&&await this.client.destroy(),this.client=null,this.status="disconnected"}getStatus(){return this.status}async sendMessage(t,r){if(!this.client)throw new Error("Discord client not connected");let n=await this.client.channels.fetch(t);if(!n||!("send"in n))throw new Error(`Channel ${t} not found or not text channel`);return(await n.send({content:r.content,reply:r.replyToMessageId?{messageReference:r.replyToMessageId}:void 0})).id}onMessage(t){this.messageHandler=t}async sendTypingIndicator(t){if(!this.client)return;let s=await this.client.channels.fetch(t);s&&"sendTyping"in s&&await s.sendTyping()}};var k=g.object({id:g.string().uuid()}),At=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()}),vt=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()}),se;function zn(e){se=e}function Gn(){return se}async function Qn(e){let t=se;e.get("/channels",{schema:{tags:["Channels"],summary:"List channels",querystring:{type:"object",properties:{enabled:{type:"boolean"}}}}},async(r,s)=>({channels:de(r.query.enabled)})),e.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 n=At.safeParse(r.body);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let{name:i,platform:o,config:a,enabled:c,linkedRoleId:l,allowedChatIds:d}=n.data,u={id:Pt(),name:i,platform:o,enabled:c,status:"disconnected",config:a,linkedRoleId:l,allowedChatIds:d,createdAt:Date.now(),messageCount:0};return ae(u),s.status(201).send({channel:u})}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);return i?{channel:i}:s.status(404).send({code:"NOT_FOUND",message:"Channel not found"})}),e.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"}}}}}},async(r,s)=>{let n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);if(!i)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});let o=vt.safeParse(r.body);return o.success?(Q(i.id,o.data),{channel:_(i.id)}):s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(o.error)})}),e.delete("/channels/:id",{schema:{tags:["Channels"],summary:"Delete channel",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(r,s)=>{let n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);return i?(ce(i.id),s.status(204).send()):s.status(404).send({code:"NOT_FOUND",message:"Channel not found"})}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});if(!t)return s.status(501).send({code:"NOT_IMPLEMENTED",message:"Channel manager not initialized"});let i=_(n.data.id);if(!i)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(!t.hasAdapter(i.id)&&i.platform==="discord"){let o=i.config;if(!o.botToken)return s.status(400).send({code:"MISSING_CONFIG",message:"Discord channel requires botToken in config"});let a=new G(i.id,{botToken:o.botToken});await t.addChannel(i,a)}if(!t.hasAdapter(i.id))return s.status(400).send({code:"NO_ADAPTER",message:"No adapter registered for this channel. Install the appropriate adapter first."});try{return await t.connectChannel(i.id),{channelId:i.id,status:"connected"}}catch(o){return s.status(500).send({code:"CONNECT_FAILED",message:String(o)})}}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});if(!t)return s.status(501).send({code:"NOT_IMPLEMENTED",message:"Channel manager not initialized"});let i=_(n.data.id);return i?(await t.disconnectChannel(i.id),{channelId:i.id,status:"disconnected"}):s.status(404).send({code:"NOT_FOUND",message:"Channel not found"})}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);if(!i)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});let{limit:o=50,offset:a=0}=r.query;return{messages:oe(i.id,o,a)}}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);if(!i)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(i.platform!=="wechat")return s.status(400).send({code:"INVALID_PLATFORM",message:"Channel is not a WeChat channel"});let o=i.config;return await be({apiBaseUrl:o.baseUrl,routeTag:o.routeTag})}),e.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 n=k.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:g.prettifyError(n.error)});let i=_(n.data.id);if(!i)return s.status(404).send({code:"NOT_FOUND",message:"Channel not found"});if(i.platform!=="wechat")return s.status(400).send({code:"INVALID_PLATFORM",message:"Channel is not a WeChat channel"});let o=i.config,{sessionKey:a,timeoutMs:c}=r.body??{},l=await _e({sessionKey:a??"",apiBaseUrl:o.baseUrl,timeoutMs:c??12e4,routeTag:o.routeTag});if(l.connected&&l.botToken){let d={...o,botToken:l.botToken,accountId:l.accountId,baseUrl:l.baseUrl??o.baseUrl,userId:l.userId};if(Q(i.id,{config:d}),t){let u=new z(i.id,d),y=_(i.id);y&&await t.addChannel(y,u)}}return{connected:l.connected,accountId:l.accountId,message:l.message}})}export{z as a,G as b,zn as c,Gn as d,Qn as e};
@@ -1,4 +1,4 @@
1
- import{b as i,d as l}from"./chunk-PCSZW2PE.js";l();function o(e){return{id:e.id,name:e.name,description:e.description??void 0,roleId:e.role,metricType:e.metric_type,targetValue:e.target_value,currentValue:e.current_value,deadline:e.deadline,budgetUsd:e.budget_usd,status:e.status,createdAt:e.created_at,updatedAt:e.updated_at??void 0,sourceSessionId:e.source_session_id??void 0,deliverTo:e.deliver_to?JSON.parse(e.deliver_to):void 0,reportTo:e.report_to?JSON.parse(e.report_to):void 0}}function c(e){i().prepare(`
1
+ import{b as i,d as l}from"./chunk-CREHL4BN.js";l();function o(e){return{id:e.id,name:e.name,description:e.description??void 0,roleId:e.role,metricType:e.metric_type,targetValue:e.target_value,currentValue:e.current_value,deadline:e.deadline,budgetUsd:e.budget_usd,status:e.status,createdAt:e.created_at,updatedAt:e.updated_at??void 0,sourceSessionId:e.source_session_id??void 0,deliverTo:e.deliver_to?JSON.parse(e.deliver_to):void 0,reportTo:e.report_to?JSON.parse(e.report_to):void 0}}function c(e){i().prepare(`
2
2
  INSERT INTO goals (id, name, description, role, metric_type, target_value,
3
3
  current_value, deadline, budget_usd, status, created_at, updated_at,
4
4
  source_session_id, deliver_to, report_to)
@@ -1,4 +1,4 @@
1
- import{b as t,d}from"./chunk-PCSZW2PE.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
1
+ import{b as t,d}from"./chunk-CREHL4BN.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
2
2
  INSERT INTO task_plans (id, task_id, plan_json, status, approval_type,
3
3
  deviation_report_json, learned_rules_json, created_at, approved_at, reviewed_at)
4
4
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -0,0 +1 @@
1
+ import{b as R}from"./chunk-BCELBB5Q.js";import{f as E}from"./chunk-GA7GEIXB.js";import{b as g}from"./chunk-ROSOI75V.js";import{b as v}from"./chunk-BONI2HUN.js";import{e as m}from"./chunk-4TBGFHYX.js";import{b as x}from"./chunk-64FIXWFL.js";import{a as w,b as k,c as o,d as h,e as T,f as P,g as S}from"./chunk-TEMWI6U5.js";import{a as f}from"./chunk-L7JP7DUO.js";import{c as D,h as C}from"./chunk-INNDBLZE.js";C();import{v4 as _}from"uuid";var s=D("admin"),y=new Map,u=null,p=null,c=null,I=class{constructor(){f.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{s.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=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),s.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=g(e),i=this.getSourceChannelForTask(e);if(i){let d=JSON.stringify(r).slice(0,500),{sendApprovalToChannel:b}=await import("./approval-handler-UDWAC5MF.js");await b(i.channelId,i.chatId,n,e,d)}let a=`Plan approval requested for task ${e}: ${JSON.stringify(r).slice(0,500)}`;await this.matchAndDeliver("plan_approval_request",{templateId:t?.templateId,roleId:t?.roleId,prompt:t?.prompt,taskStatus:"pending"},a,e)}getSourceChannelForTask(e){try{let n=m(e);if(!n)return null;let r=v(n.sessionId);return!r||r.source.type!=="channel"||!r.source.channelId||!r.source.chatId?null:{channelId:r.source.channelId,chatId:r.source.chatId}}catch{return null}}async handleTaskStatusChange(e,n){let r=g(e);if(!r)return;let t={templateId:r.templateId,roleId:r.roleId,prompt:r.prompt,taskStatus:n},i=n==="completed"?"task_complete":"task_error",a=r.result??r.error??"";await this.matchAndDeliver(i,t,a,e)}async matchAndDeliver(e,n,r,t){let i=E(e,n);if(i.length!==0){s.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){s.warn({ruleId:a.id,maxPerMinute:a.maxPerMinute},"Delivery rate limit exceeded, skipping");continue}if(a.skipOriginChannel&&a.target.type==="channel"&&t&&this.isOriginChannel(t,a.target))continue;let d={id:_(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+w,source:"rule"};k(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=R();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=x(e.target.channelId)?.config?.userId);let i=await r.send({taskId:e.taskId,channelId:e.target.channelId,chatId:t,content:e.content,messageType:"deliver"});i.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"channel"},"Delivery successful")):o(e.id,"failed",i.error??"Gateway returned failure")}else if(e.target.type==="webhook"){let t=await r.send({taskId:e.taskId,webhookUrl:e.target.webhookUrl,content:e.content,messageType:"deliver"});t.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"webhook"},"Webhook delivery successful")):o(e.id,"failed",t.error??"Gateway returned failure")}}catch(t){let i=t instanceof Error?t.message:String(t);o(e.id,"failed",i),s.warn({entryId:e.id,error:i},"Delivery attempt failed")}}checkRateLimit(e){let n=Date.now(),r=6e4,t=y.get(e.id);t||(t=[],y.set(e.id,t));let i=n-r;for(;t.length>0&&t[0]<i;)t.shift();return t.length>=e.maxPerMinute?!1:(t.push(n),!0)}isOriginChannel(e,n){try{if(n.type!=="channel"||!n.channelId)return!1;let r=m(e);if(!r)return!1;let t=v(r.sessionId);return t?t.source.type==="channel"&&t.source.channelId===n.channelId&&(!n.chatId||t.source.chatId===n.chatId):!1}catch{return!1}}async retryPending(){let e=T("rule",50),n=P("rule",50),r=[...e,...n];if(r.length!==0){s.debug({count:r.length},"Retrying pending/failed deliveries");for(let t of r){if(t.attempts>=3){o(t.id,"failed","Max retries (3) exceeded");continue}let i={id:t.ruleId??"retry-synthetic",eventType:"*",matchCriteria:{},target:t.target,maxPerMinute:5,skipOriginChannel:!0,enabled:!0,createdAt:0};await this.attemptDelivery(t,i)}}}};function U(){return c}function W(){c||(c=new I,u=setInterval(()=>{c?.retryPending().catch(l=>{s.error({error:l},"Delivery retry scan failed")})},6e4),p=setInterval(()=>{try{let l=S();l>0&&s.info({cleaned:l},"Expired delivery log entries cleaned up")}catch(l){s.error({error:l},"Delivery cleanup failed")}},36e5),s.info("DeliveryEngine started with retry (60s) and cleanup (1h) timers"))}function $(){u&&(clearInterval(u),u=null),p&&(clearInterval(p),p=null),c=null,y.clear(),s.info("DeliveryEngine stopped")}export{I as a,U as b,W as c,$ as d};
@@ -1,4 +1,4 @@
1
- import{b as o,d as u}from"./chunk-PCSZW2PE.js";u();import{v4 as a}from"uuid";function R(t){o().prepare(`
1
+ import{b as o,d as u}from"./chunk-CREHL4BN.js";u();import{v4 as a}from"uuid";function R(t){o().prepare(`
2
2
  INSERT INTO evolution_audit (id, timestamp, old_rules, new_rules, diff, trigger_task_id, role_id, source)
3
3
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
4
4
  `).run(a(),t.timestamp,t.oldRules,t.newRules,t.diff,t.triggerTaskId??null,t.roleId??null,t.source??"reflection")}function f(t=100,e=0){return o().prepare(`