adam-agent-server 1.8.0 → 1.9.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 (135) hide show
  1. package/README.md +8 -0
  2. package/dist/App-5QZKMPRM.js +13 -0
  3. package/dist/adam-tools-FSI5XKDL.js +1 -0
  4. package/dist/{approval-handler-PB7PSLUS.js → approval-handler-JYCGXQUE.js} +1 -1
  5. package/dist/audit-manager-CLKTJPLM.js +1 -0
  6. package/dist/bree-engine-XJR5TKVC.js +1 -0
  7. package/dist/channels-DY2OW7YQ.js +1 -0
  8. package/dist/{channels-ULFUCUUZ.js → channels-ZNMTMMCY.js} +1 -1
  9. package/dist/{chunk-BQ3ZAYHC.js → chunk-3HZE5DQZ.js} +1 -1
  10. package/dist/chunk-3IQADR6L.js +144 -0
  11. package/dist/{chunk-NASJH4NT.js → chunk-3N7MGASP.js} +1 -1
  12. package/dist/{chunk-TAF2DBBC.js → chunk-56QP5ZHF.js} +7 -7
  13. package/dist/{chunk-PG6LMSX6.js → chunk-5AUQIK3Q.js} +1 -1
  14. package/dist/{chunk-NUITL62I.js → chunk-6M2QCKAS.js} +1 -1
  15. package/dist/{chunk-WMB7P64J.js → chunk-6XVWIRR2.js} +1 -1
  16. package/dist/{chunk-5EPG2US5.js → chunk-7F4SZXI2.js} +39 -10
  17. package/dist/{chunk-JJH2RCVC.js → chunk-7WJF65TQ.js} +1 -1
  18. package/dist/{chunk-RZ7LCZVK.js → chunk-ARQF52V6.js} +1 -1
  19. package/dist/{chunk-NWMOV23A.js → chunk-C2SD2NMZ.js} +1 -1
  20. package/dist/{chunk-2L2347UQ.js → chunk-DKMF4B33.js} +1 -1
  21. package/dist/{chunk-EQZFOBAJ.js → chunk-EJBGJLA2.js} +1 -1
  22. package/dist/{chunk-T33BLZV2.js → chunk-HSEP6LNQ.js} +1 -1
  23. package/dist/{chunk-GSFLLRS7.js → chunk-IZ3WZHCM.js} +1 -1
  24. package/dist/chunk-J4Y54LIC.js +50 -0
  25. package/dist/{chunk-AQ3ASS4B.js → chunk-KO7XBNPV.js} +1 -1
  26. package/dist/{chunk-RI3V72RP.js → chunk-KUJFQDT5.js} +2 -2
  27. package/dist/{chunk-DVN3BFPP.js → chunk-LV4XLPCD.js} +1 -1
  28. package/dist/chunk-MYVYH4PQ.js +77 -0
  29. package/dist/chunk-OFTIPZTH.js +1 -0
  30. package/dist/{chunk-K4C43YDD.js → chunk-OY2KVSIX.js} +1 -1
  31. package/dist/{chunk-IKPYPZ64.js → chunk-PFYYS7CI.js} +1 -1
  32. package/dist/chunk-QMW7VEPC.js +0 -0
  33. package/dist/{chunk-A5OCDYTW.js → chunk-QPIWPQWM.js} +1 -1
  34. package/dist/chunk-S6OV7Z6K.js +1 -0
  35. package/dist/{chunk-2YTDCR6A.js → chunk-TTP7QRAQ.js} +1 -1
  36. package/dist/{chunk-B6LOT5CG.js → chunk-UQDC3X6O.js} +1 -1
  37. package/dist/{chunk-M4YI4WVX.js → chunk-UYOLAFUR.js} +1 -1
  38. package/dist/chunk-VPZSOYE5.js +6 -0
  39. package/dist/{chunk-5QZXYKMS.js → chunk-W7U3ASGR.js} +1 -1
  40. package/dist/chunk-XIQVXRZH.js +27 -0
  41. package/dist/{chunk-FPZEZYUB.js → chunk-XTOOD44S.js} +1 -1
  42. package/dist/{chunk-6KF7OO2B.js → chunk-YKMWAVUH.js} +1 -1
  43. package/dist/{chunk-UQJZU3R5.js → chunk-YVVKUPGL.js} +1 -1
  44. package/dist/{chunk-HQRUJQN7.js → chunk-YWUX3ZTO.js} +4 -4
  45. package/dist/cli.js +2 -2
  46. package/dist/{config-HBQPBIWL.js → config-CILWJYZB.js} +1 -1
  47. package/dist/config-W2OD7PXZ.js +1 -0
  48. package/dist/{db-QEWTZGU3.js → db-JO24ZLIN.js} +1 -1
  49. package/dist/{delivery-log-AC476GX7.js → delivery-log-QPQM5YU7.js} +1 -1
  50. package/dist/engine-ZAPYG7G4.js +1 -0
  51. package/dist/{evolution-audit-XMBDUN3T.js → evolution-audit-ZLYQ3ZYV.js} +1 -1
  52. package/dist/{external-api-V74YTLBY.js → external-api-QKRNGSYS.js} +1 -1
  53. package/dist/index.js +20 -16
  54. package/dist/{learner-VCS3Q7BR.js → learner-ACHENH6R.js} +1 -1
  55. package/dist/{memories-VMOGFVPU.js → memories-LXH4VHCH.js} +1 -1
  56. package/dist/{memory-extractor-4WJNHYWR.js → memory-extractor-URH4YHK3.js} +2 -2
  57. package/dist/memory-service-23P6VNKZ.js +1 -0
  58. package/dist/outbound-gateway-Y3P3T3VH.js +1 -0
  59. package/dist/presets-XR2OBXUP.js +1 -0
  60. package/dist/role-presets-DYWDEQYU.js +1 -0
  61. package/dist/role-workspace-LHW7AWPF.js +1 -0
  62. package/dist/{roles-ZYCFQMAY.js → roles-DRPLO4LY.js} +1 -1
  63. package/dist/{runtime-VDBZZ4KG.js → runtime-YPBWWMXW.js} +1 -1
  64. package/dist/session-manager-Z6K4U5X7.js +1 -0
  65. package/dist/{task-templates-4KCZOUN5.js → task-templates-4DWXHLFZ.js} +1 -1
  66. package/dist/workflow-executor-6ZMNL34C.js +1 -0
  67. package/package.json +2 -1
  68. package/web/dist/assets/{AlertDialog-B1zj0Qs3.js → AlertDialog-DhA65f_0.js} +1 -1
  69. package/web/dist/assets/{Button-BehrGSvy.js → Button-CYDgoTTo.js} +1 -1
  70. package/web/dist/assets/{Card-B5E56u94.js → Card-DDGXsHus.js} +1 -1
  71. package/web/dist/assets/{ChannelDetail-BaSlX2yb.js → ChannelDetail-Bb8P8It_.js} +1 -1
  72. package/web/dist/assets/{Channels-CLhgGEmS.js → Channels-8j28oydE.js} +2 -2
  73. package/web/dist/assets/{Chat-BZpf1DSF.js → Chat-BZwLDoYO.js} +2 -2
  74. package/web/dist/assets/{Dashboard-HR4Qmdwg.js → Dashboard-Cv0AtO-o.js} +1 -1
  75. package/web/dist/assets/{EmptyState-tTclFq_B.js → EmptyState-EuQHAv5Y.js} +1 -1
  76. package/web/dist/assets/{EnvVarEditor-BzJNsDt0.js → EnvVarEditor-r-l-u4V7.js} +1 -1
  77. package/web/dist/assets/{EventDefDetail-CjoqsH0e.js → EventDefDetail-asUFrbQE.js} +1 -1
  78. package/web/dist/assets/Events-DtkHL-r2.js +1 -0
  79. package/web/dist/assets/{Evolution-CUn8g34X.js → Evolution-DIqYOSb8.js} +1 -1
  80. package/web/dist/assets/FeatureRequests-BxPqLR1x.js +1 -0
  81. package/web/dist/assets/{GoalDetail-DgPvXb6z.js → GoalDetail-Bkvgg6uI.js} +1 -1
  82. package/web/dist/assets/Goals-CkKJDCiU.js +1 -0
  83. package/web/dist/assets/{Logs-CvFC-GbD.js → Logs-DnaaHV0Y.js} +1 -1
  84. package/web/dist/assets/{Memories-B5pvI6Oj.js → Memories-Dq9S-Tsi.js} +1 -1
  85. package/web/dist/assets/Mistakes-D5lW31Co.js +1 -0
  86. package/web/dist/assets/{NotFound-D-OII_Lp.js → NotFound-gJVrOtER.js} +1 -1
  87. package/web/dist/assets/{PageHeader-B2CgcZ-t.js → PageHeader-CugYeCci.js} +1 -1
  88. package/web/dist/assets/Plugins-CoRmK2UG.js +1 -0
  89. package/web/dist/assets/{RoleDetail-BBJxaZip.js → RoleDetail-BHJA_PAn.js} +2 -2
  90. package/web/dist/assets/Roles-EBUueS_P.js +1 -0
  91. package/web/dist/assets/{SectionHeader-CmXz6PM3.js → SectionHeader-DihC0CnO.js} +1 -1
  92. package/web/dist/assets/Settings-DZHAGazz.js +1 -0
  93. package/web/dist/assets/{Strategies-Ddb5HiUS.js → Strategies-3IV9eueQ.js} +1 -1
  94. package/web/dist/assets/{Switch-yrTepsdl.js → Switch-B3w5KMMc.js} +1 -1
  95. package/web/dist/assets/{Table-CXAcZ8Ru.js → Table-Cf6m8zLu.js} +1 -1
  96. package/web/dist/assets/{TaskDetail-CHwHgfZq.js → TaskDetail-BmXaH3sx.js} +2 -2
  97. package/web/dist/assets/Work-CvQrOKtL.js +1 -0
  98. package/web/dist/assets/api-D-UzHSDq.js +1 -0
  99. package/web/dist/assets/index-BsKlGx3x.js +2 -0
  100. package/web/dist/assets/index-EqsPGp9a.css +2 -0
  101. package/web/dist/assets/{useIsMobileLayout-dYzXP1EC.js → useIsMobileLayout-2GbB90oO.js} +1 -1
  102. package/web/dist/assets/{vendor-icons-Dk0hMuJz.js → vendor-icons-PF9RcPJx.js} +1 -1
  103. package/web/dist/assets/{vendor-react-C6faO6LO.js → vendor-react-Cxy4EVtR.js} +1 -1
  104. package/web/dist/assets/{vendor-state-DahK0J-G.js → vendor-state-aQJ7d4tA.js} +1 -1
  105. package/web/dist/index.html +8 -8
  106. package/dist/App-ZRCRM7WR.js +0 -13
  107. package/dist/adam-automator-skills-EZGBICHT.js +0 -18
  108. package/dist/adam-tools-V5LPU47X.js +0 -1
  109. package/dist/audit-manager-BSBBDUER.js +0 -1
  110. package/dist/bree-engine-7S33CWS7.js +0 -1
  111. package/dist/channels-SITUUC4J.js +0 -1
  112. package/dist/chunk-4PQHGLZH.js +0 -99
  113. package/dist/chunk-5XOTPEAK.js +0 -6
  114. package/dist/chunk-BCH2HAIM.js +0 -23
  115. package/dist/chunk-GSMC3VUM.js +0 -1
  116. package/dist/chunk-IZNEOYRP.js +0 -1
  117. package/dist/chunk-QGYDGZSC.js +0 -49
  118. package/dist/chunk-ULTK7RD6.js +0 -27
  119. package/dist/config-ZBNGRASI.js +0 -1
  120. package/dist/engine-6K4RG644.js +0 -1
  121. package/dist/memory-service-ZS6MBUIC.js +0 -1
  122. package/dist/outbound-gateway-H7RFG6D2.js +0 -1
  123. package/dist/role-presets-XAEOYEAW.js +0 -1
  124. package/dist/role-workspace-NKGAH6J6.js +0 -1
  125. package/dist/session-manager-COLCNIB7.js +0 -1
  126. package/dist/workflow-executor-Z7JFMR56.js +0 -1
  127. package/web/dist/assets/Events-IeznRpCj.js +0 -1
  128. package/web/dist/assets/Goals-DYrggK-M.js +0 -1
  129. package/web/dist/assets/Plugins-BuE7GImW.js +0 -1
  130. package/web/dist/assets/Roles-C5eVA6LM.js +0 -1
  131. package/web/dist/assets/Settings-BblOdOih.js +0 -1
  132. package/web/dist/assets/Work-Corw0ITh.js +0 -1
  133. package/web/dist/assets/api-Bux34u4-.js +0 -1
  134. package/web/dist/assets/index-B3_4_qY6.js +0 -2
  135. package/web/dist/assets/index-Cu5neZGw.css +0 -2
@@ -0,0 +1,144 @@
1
+ import{b as nt,c as mt,d as J,e as ft}from"./chunk-KO7XBNPV.js";import{a as Y,e as gt}from"./chunk-QPIWPQWM.js";import{a as Ie,d as rt,e as ke}from"./chunk-6M2QCKAS.js";import{b as dt}from"./chunk-PFYYS7CI.js";import{b as it,e as at}from"./chunk-UQDC3X6O.js";import{b as be,c as ct,d as lt,e as ut,f as pt}from"./chunk-N4ES7TCL.js";import{j as et}from"./chunk-C2SD2NMZ.js";import{a as tt}from"./chunk-S6OV7Z6K.js";import{a as Ke,b as Je}from"./chunk-DKMF4B33.js";import{b as L,c as $,d as oe,f as ze}from"./chunk-OY2KVSIX.js";import{d as Ze}from"./chunk-MYVYH4PQ.js";import{e as ne,f as Xe,j as Qe}from"./chunk-6XVWIRR2.js";import{a as b}from"./chunk-L7JP7DUO.js";import{b as ot}from"./chunk-ARQF52V6.js";import{b as st}from"./chunk-HSEP6LNQ.js";import{d as G,i as je}from"./chunk-OFTIPZTH.js";import{a as re,b as Ye,l as A,n as q,o as _e,r as j}from"./chunk-YWUX3ZTO.js";import{a as X,g as Ge}from"./chunk-XTOOD44S.js";import{b as y,d as V}from"./chunk-7F4SZXI2.js";import{d as ye,h as Io}from"./chunk-WBAPIPST.js";import{c as v,h as B}from"./chunk-MRTJFYPR.js";V();function ht(e){return{id:e.id,roleId:e.role_id,taskId:e.task_id,scores:JSON.parse(e.score_json),emaScore:e.ema_score,createdAt:e.created_at}}function yt(e){y().prepare(`
2
+ INSERT INTO role_scores (id, role_id, task_id, score_json, ema_score, created_at)
3
+ VALUES (?, ?, ?, ?, ?, ?)
4
+ `).run(e.id,e.roleId,e.taskId,JSON.stringify(e.scores),e.emaScore,e.createdAt)}function se(e,t=50){return y().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT ?").all(e,t).map(ht)}function _t(e){return y().prepare("SELECT ema_score FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(e)?.ema_score}function It(e){let o=y().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(e);if(o.length===0)return 1e4;let n=o.map(s=>{let a=JSON.parse(s.token_usage);return(a.input??0)+(a.output??0)}).sort((s,a)=>s-a);return n[Math.floor(n.length/2)]}function kt(e){let o=y().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(e);return o?ht(o):void 0}function bt(e,t,o,n,s){let a=y(),c=a.prepare("SELECT id, role_id, score_json FROM role_scores WHERE task_id = ?").get(e);if(!c)return;let i=JSON.parse(c.score_json);i.intentFulfillment=t,i.intentFulfillmentFailed=o,i.weighted=n(i);let r=a.prepare("SELECT ema_score FROM role_scores WHERE role_id = ? AND created_at < (SELECT created_at FROM role_scores WHERE id = ?) ORDER BY created_at DESC LIMIT 1").get(c.role_id,c.id),d=r!==void 0?s*i.weighted+(1-s)*r.ema_score:i.weighted;return a.prepare("UPDATE role_scores SET score_json = ?, ema_score = ? WHERE id = ?").run(JSON.stringify(i),d,c.id),d}B();import{v4 as ko}from"uuid";var bo=v("audit"),Q={taskSuccess:.25,planAccuracy:.2,permissionCompliance:.2,efficiency:.15,intentFulfillment:.2},ie={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},ae=.3;function Se(e){return e.intentFulfillment===null||e.intentFulfillment===void 0?e.taskSuccess*ie.taskSuccess+e.planAccuracy*ie.planAccuracy+e.permissionCompliance*ie.permissionCompliance+e.efficiency*ie.efficiency:e.taskSuccess*Q.taskSuccess+e.planAccuracy*Q.planAccuracy+e.permissionCompliance*Q.permissionCompliance+e.efficiency*Q.efficiency+e.intentFulfillment*Q.intentFulfillment}function So(e,t){let o=L(e),n=o?.status==="completed"?1:0,s=1,a=rt(e);a?.deviationReport&&(s=a.deviationReport.overallAccuracy);let c=1,i=Je(e,1e3),r=i.filter(f=>f.type==="tool_result"||f.type==="permission_denied").length,d=i.filter(f=>f.type==="permission_denied").length;r>0&&(c=1-d/r);let m=1;if(o?.tokenUsage){let f=o.tokenUsage.input+o.tokenUsage.output,l=t?It(t):1e4;f>l&&(m=Math.max(0,1-(f-l)/l))}let p=Se({taskSuccess:n,planAccuracy:s,permissionCompliance:c,efficiency:m,intentFulfillment:void 0});return{taskSuccess:n,planAccuracy:s,permissionCompliance:c,efficiency:m,weighted:p}}function St(e,t){let o=So(t,e),n=_t(e),s=n!==void 0?ae*o.weighted+(1-ae)*n:o.weighted;return yt({id:ko(),roleId:e,taskId:t,scores:o,emaScore:s,createdAt:Date.now()}),bo.debug({roleId:e,taskId:t,scores:{...o,weighted:o.weighted.toFixed(3)},ema:s.toFixed(3)},"Task score recorded"),s}import{readFileSync as xt}from"fs";import{dirname as wo,join as we}from"path";import{fileURLToPath as Ro}from"url";j();Ge();B();var xo=v("audit"),vo=Ro(import.meta.url),wt=wo(vo);function To(){let e=[we(wt,"prompts","intent-eval.md"),we(wt,"..","src","audit","prompts","intent-eval.md"),we(process.cwd(),"src","audit","prompts","intent-eval.md")];for(let t of e)try{return xt(t,"utf8"),t}catch{}return e[e.length-1]}var Re;function Eo(){return Re===void 0&&(Re=xt(To(),"utf8")),Re}var Po="claude-haiku-4-5-20251001",Rt=3e4;async function vt(e,t){try{let o=L(e);if(!o||!o.result)return{score:null,failed:!0,reason:"task missing or no result"};let n=A(t),s=Ao(e,o.prompt),a=Eo().replace("{{userRequest}}",s).replace("{{roleName}}",n?.name??"(unknown)").replace("{{roleCag}}",n?.cagPrompt??"(none)").replace("{{taskResult}}",o.result),c=X("evaluation.model")??X("anthropic.defaultHaikuModel")??Po,i=tt(a,{model:c,maxBudgetUsd:.25,maxTurns:2}),r=new Promise((f,l)=>setTimeout(()=>l(new Error(`eval timeout after ${Rt}ms`)),Rt)),m=(await Promise.race([i,r])).trim().replace(/^```(?:json)?\s*|\s*```$/g,""),p=JSON.parse(m);if(typeof p.score!="number"||p.score<0||p.score>1||Number.isNaN(p.score))throw new Error(`invalid score: ${p.score}`);return{score:p.score,reason:p.reason,failed:!1}}catch(o){return xo.warn({taskId:e,roleId:t,err:o instanceof Error?o.message:String(o)},"Intent eval failed; degrading to neutral"),{score:null,failed:!0,reason:o instanceof Error?o.message:String(o)}}}function Ao(e,t){try{let o=at(e);if(!o?.sessionId)return t;let n=it(o.sessionId,100,0),s=n.findIndex(a=>a.id===o.id);if(s===-1)return t;for(let a=s-1;a>=0;a--)if(n[a].role==="user")return n[a].content;return t}catch{return t}}j();j();B();var Do=v("audit");function de(e,t=7){let o=A(e),n=se(e,100),s=Date.now(),a=s-t*24*60*60*1e3,c=n.filter(u=>u.createdAt>=a),i=c.map(u=>u.emaScore),r=c.length>0?c.reduce((u,_)=>u+_.scores.weighted,0)/c.length:1,d=[],m=c.filter(u=>u.scores.taskSuccess<.5);m.length>0&&d.push({category:"task_failures",count:m.length,examples:m.slice(0,3).map(u=>u.taskId)});let p=c.filter(u=>u.scores.planAccuracy<.5);p.length>0&&d.push({category:"plan_deviations",count:p.length,examples:p.slice(0,3).map(u=>u.taskId)});let f=c.filter(u=>u.scores.permissionCompliance<.8);f.length>0&&d.push({category:"permission_violations",count:f.length,examples:f.slice(0,3).map(u=>u.taskId)});let l=c.filter(u=>u.scores.efficiency<.3);l.length>0&&d.push({category:"inefficiency",count:l.length,examples:l.slice(0,3).map(u=>u.taskId)});let x=[],I=[];return m.length>c.length*.3&&(x.push("High task failure rate"),I.push({action:"add_rule",detail:"Add rule: verify task feasibility before execution"})),f.length>0&&(x.push("Permission boundary violations"),I.push({action:"adjust_permission",detail:"Review and expand allowedTools if tasks legitimately need wider access"})),p.length>c.length*.5&&(x.push("Frequent plan deviations"),I.push({action:"add_rule",detail:"Add rule: follow execution plan steps more closely, request plan revision if steps are unclear"})),Do.info({roleId:e,taskCount:c.length,avgScore:r.toFixed(3),failureCategories:d.map(u=>u.category)},"Diagnostic report generated"),{roleId:e,agentName:o?.name??"Unknown",period:{start:a,end:s},taskCount:c.length,avgScore:r,scoreHistory:i,failureBehaviors:d,rootCauses:x,recommendations:I}}B();var ce=v("audit"),Tt=.4,Co=5;function Et(e,t,o=Tt){if(t>=o)return;let n=A(e);if(!n||n.status==="retired"||n.status==="dead")return;ce.warn({roleId:e,emaScore:t,threshold:o},"Agent EMA below threshold, retiring");let s=de(e),a=JSON.stringify(n.learnedRules),c=Mo(n.learnedRules,s);q(e,{status:"retired",learnedRules:c});let i=[...s.failureBehaviors.map(d=>`${d.category}: ${d.count} occurrences`),...s.rootCauses.map(d=>`Root cause: ${d}`),...s.recommendations.map(d=>`Recommendation [${d.action}]: ${d.detail}`)].join(`
9
+ `),r=gt(a,JSON.stringify(c));return Y({timestamp:Date.now(),oldRules:a,newRules:JSON.stringify(c),diff:i?`--- Diagnostic Report ---
10
+ ${i}
11
+
12
+ --- Rules Diff ---
13
+ ${r}`:r,roleId:e,source:"audit"}),ce.info({roleId:e,oldRulesCount:n.learnedRules.length,newRulesCount:c.length,recommendations:s.recommendations.length},"Agent retired with targeted learnedRules modification"),s}function Pt(e){let t=A(e);return!t||t.status!=="retired"?!1:(q(e,{status:"probation"}),Y({timestamp:Date.now(),oldRules:"status: retired",newRules:"status: probation",diff:`- status: retired
14
+ + status: probation`,roleId:e,source:"audit"}),ce.info({roleId:e},"Agent reinstated to probation"),!0)}function At(e,t,o=Tt,n=Co){let s=A(e);return!s||s.status!=="probation"||se(e,n+1).length<n?!1:t>=o?(q(e,{status:"active"}),Y({timestamp:Date.now(),oldRules:"status: probation",newRules:"status: idle",diff:`- status: probation
15
+ + status: idle (graduated, EMA: ${t.toFixed(3)})`,roleId:e,source:"audit"}),ce.info({roleId:e,emaScore:t},"Agent graduated from probation to active"),!0):!1}function Mo(e,t){let o=[...e];for(let n of t.recommendations){let s=`[audit:${n.action}] ${n.detail}`;o.includes(s)||o.push(s)}if(t.failureBehaviors.length>0){let s=`[audit:diagnostic] Failure patterns detected: ${t.failureBehaviors.map(a=>`${a.category}(${a.count})`).join(", ")}. Review and adjust behavior accordingly.`;o.includes(s)||o.push(s)}return o}import{spawn as ro}from"child_process";j();import{query as ir}from"@anthropic-ai/claude-agent-sdk";import{v4 as Xt}from"uuid";function Dt(e){let t=e.roleName?`## Role Context
16
+ - Role: ${e.roleName}
17
+ ${e.roleCagPrompt?`- CAG Prompt: ${e.roleCagPrompt}`:""}`:"",o=e.allowedTools&&e.allowedTools.length>0?`## Available Tools
18
+ You have access to: ${e.allowedTools.join(", ")}. Use them as needed to complete the task.`:"",n=e.workflowStep?`## Workflow Step Context
19
+ You are executing step \`${e.workflowStep.stepId}\` of workflow \`${e.workflowStep.executionId}\`.
20
+ Other workflow steps may have already published structured data or files for you to use, and your output may be consumed by downstream steps.
21
+
22
+ ### Artifact tools (use these to share data across steps)
23
+ - \`write_artifact\`: Save small structured JSON for downstream steps. Use for fields, flags, URLs, or summaries. Example: save extracted metadata.
24
+ - \`read_artifact\`: Read structured JSON previously written by an upstream step. Use for fields or state, not files.
25
+ - \`publish_artifact_file\`: Publish a file from your workspace into workflow storage. Use for audio, video, reports, images, or other large outputs.
26
+ - \`fetch_artifact_file\`: Copy an upstream file artifact into your current workspace. Use when you need to process a file produced by another step.
27
+ - \`list_artifacts\`: Discover what upstream artifacts exist before choosing a read or fetch call.
28
+
29
+ ### When to use which
30
+ - Small JSON, fields, numbers, status, URLs: \`write_artifact\` and \`read_artifact\`
31
+ - Files such as audio, video, reports, images, or large outputs: \`publish_artifact_file\` and \`fetch_artifact_file\`
32
+ - Discover upstream output first: \`list_artifacts\`
33
+
34
+ The artifact tools handle storage and isolation automatically; never write to ~/.adam/ or other shared directories yourself.`:"";return`# Execution Agent \u2014 Task Focus
35
+
36
+ You are executing a specific task assigned to you. Your job is to complete the work, not manage goals or strategies.
37
+
38
+ ## Task
39
+ - Task ID: ${e.taskId}
40
+ - Prompt: ${e.prompt}
41
+
42
+ ${t}
43
+
44
+ ${o}
45
+
46
+ ${n}
47
+
48
+ ## Focus
49
+ - Focus entirely on completing the task
50
+ - Use the standard SDK tools to do the work
51
+ - Do NOT attempt strategic decisions \u2014 just execute
52
+
53
+ ## Constraints
54
+ - You have standard SDK tools only (no adam-tools MCP)
55
+ - Stay within your assigned permissions and allowed paths
56
+ - File writes: persistent outputs go under your working directory${e.cwd?` (\`${e.cwd}\`)`:""}. Temporary files may use \`os.tmpdir()\` (auto-redirected by the sandbox to a per-task dir). Do NOT write to absolute paths like \`/tmp/*\`, \`/var/*\`, \`~/Documents/*\`, or anywhere outside your workspace; the sandbox will reject them.
57
+ - Report completion with a clear result summary
58
+ - If WebSearch or WebFetch fails (network error, invalid params), report the failure honestly \u2014 do not fabricate data
59
+ - If a tool is unavailable, state it clearly in the result rather than guessing
60
+ `}import{isAbsolute as Oo,relative as Lo,resolve as No}from"path";Ye();B();var Bo=new Set(["Read","Glob","Grep","LSP"]),Fo=new Set(["Edit","Write","NotebookEdit"]);function xe(e){let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${t}$`)}function ve(e){return No(re(e))}function Ct(e,t){return t.some(o=>{let n=ve(o),s=Lo(n,e);return s===""||!s.startsWith("..")&&!Oo(s)})}function Mt(e,t,o){return async(n,s,{agentID:a,blockedPath:c})=>{if(c){let r=ve(c);if(o?.deniedReadPaths?.length)for(let d of o.deniedReadPaths){let m=ve(d);if(Ct(r,[m]))return $o.warn({toolName:n,blockedPath:c,agentID:a,deniedPath:d},"Denied: path in deniedReadPaths (absolute blacklist)"),{behavior:"deny",message:`Access denied: ${c} is in the global denied read paths list. This restriction is configured in Settings > Advanced and cannot be overridden by privilege escalation.`}}return o?.roleScope?.length&&Ct(r,o.roleScope)?{behavior:"allow",updatedInput:s}:t?await t(n,s,`blockedPath:${c}`,a):{behavior:"deny",message:`Access denied: ${c} is outside this role's allowed scope (cwd + additionalDirectories). Configure additionalDirectories to expand access.`}}if(Bo.has(n))return{behavior:"allow",updatedInput:s};if(Fo.has(n))return{behavior:"allow",updatedInput:s};let i=e(a??"");if(n==="Bash"&&i){let r=s.command??"";if(i.allowedBashPatterns?.length)for(let d of i.allowedBashPatterns)try{if(xe(d).test(r))return{behavior:"allow",updatedInput:s}}catch{}if(i.deniedBashPatterns?.length)for(let d of i.deniedBashPatterns)try{if(xe(d).test(r))return{behavior:"deny",message:`Bash command denied by pattern: ${d}`}}catch{}}if(i?.disallowedTools?.includes(n))return{behavior:"deny",message:`Tool ${n} is not allowed for this role.`};if(t&&i?.approvalRequired?.length){let r=n==="Bash"?s.command??"":`${n} ${JSON.stringify(s)}`;for(let d of i.approvalRequired)try{if(xe(d).test(r))return await t(n,s,d,a)}catch{}}return{behavior:"allow",updatedInput:s}}}var $o=v("manager");function Ot(e){return{SessionStart:[{hooks:[async t=>{if(!e.roleId)return{};let o=t.source,n=e.roleId==="role-chat-manager";if(!n&&o!=="startup"&&o!=="resume")return{};try{let{queryMemoryByTier:s}=await import("./memory-service-23P6VNKZ.js"),a=e.taskPrompt||"role context and recent interactions",c=n?["semantic","working"]:["semantic","episodic"],i=await s(e.roleId,a,c,{topK:5});if(i.length>0)return{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[Memory Context]
61
+ ${i.map(m=>`- [${m.tier??"episodic"}] ${m.content}`).join(`
62
+ `)}
63
+
64
+ `}}}catch{}return{}}]}],SubagentStart:[{hooks:[async t=>{let o=e.roleId??t.agent_id;if(!o)return{};let n=[];try{let{getRole:s}=await import("./roles-DRPLO4LY.js"),a=s(o);a?.cagPrompt&&a.cagPrompt.trim().length>0&&n.push(`[Role CAG]
65
+ ${a.cagPrompt}`)}catch{}try{let s=e.taskPrompt||"role context",a=await dt(s,o,5);a&&n.push(a)}catch{}return n.length===0?{}:{hookSpecificOutput:{hookEventName:"SubagentStart",additionalContext:n.join(`
66
+
67
+ `)}}}]}],SubagentStop:[{hooks:[async t=>{let o=t.agent_id;if(!o||!e.currentTaskId)return{};try{let{createMemory:n}=await import("./memories-LXH4VHCH.js"),{getDb:s}=await import("./db-JO24ZLIN.js"),a=t.transcript;if(!a||a.length<=100)return{};if(s().prepare("SELECT 1 FROM memories WHERE source_task_id = ? AND type = 'thought' LIMIT 1").get(e.currentTaskId))return{};let i=`[Task ${e.currentTaskId} reasoning] ${a.slice(0,3e3)}`;n({id:`session-${Date.now()}`,roleId:e.roleId??o,type:"thought",content:i,keywords:[],importance:3,sourceType:"task_complete",sourceTaskId:e.currentTaskId,createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"episodic"})}catch{}return{}}]}],PostToolUse:[{hooks:[async t=>{if(!e.currentTaskId)return{};let o=t.tool_name,n=t.tool_input,s=t.tool_response,a=typeof s=="string"?s:JSON.stringify(s??"");try{Ke({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,taskId:e.currentTaskId,index:0,type:"tool_call",content:`${o}: ${JSON.stringify(n??{})} \u2192 ${a.slice(0,200)}`,toolName:o,toolInput:n,toolOutput:a,timestamp:Date.now()})}catch{}return{}}]}],PreCompact:[{hooks:[async t=>{let o=t.compact_summary;if(!o)return{};try{let{createMemory:n}=await import("./memories-LXH4VHCH.js");n({id:`compact-${Date.now()}`,roleId:e.roleId??"role-chat-manager",type:"thought",content:o.slice(0,5e3),keywords:["compaction","context","decisions"],importance:4,sourceType:"pre_compact",createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"working"})}catch{}return{}}]}]}}j();Qe();Io();B();V();import{randomUUID as Uo}from"crypto";function Lt(e,t,o){let s=y().prepare(`
68
+ INSERT INTO task_plugins (id, task_id, plugin_path, plugin_name, role_id, used_at)
69
+ VALUES (?, ?, ?, ?, ?, ?)
70
+ `),a=Date.now();for(let c of t){let i=c.split("/").pop()??c;s.run(Uo(),e,c,i,o??null,a)}}function tn(e){return y().prepare(`
71
+ SELECT plugin_name as pluginName, COUNT(*) as usageCount
72
+ FROM task_plugins
73
+ WHERE role_id = ?
74
+ GROUP BY plugin_path
75
+ ORDER BY usageCount DESC
76
+ `).all(e)}function on(e=50){return y().prepare(`
77
+ SELECT plugin_path as pluginPath, plugin_name as pluginName, COUNT(*) as usageCount, MAX(used_at) as lastUsed
78
+ FROM task_plugins
79
+ GROUP BY plugin_path
80
+ ORDER BY usageCount DESC
81
+ LIMIT ?
82
+ `).all(e)}j();Qe();import{createSdkMcpServer as Ho,tool as U}from"@anthropic-ai/claude-agent-sdk";import{z as P}from"zod";import{v4 as Ft}from"uuid";V();function Nt(e){return{id:e.id,executionId:e.execution_id,stepId:e.step_id,key:e.key,kind:e.kind,value:e.value_json?JSON.parse(e.value_json):void 0,blobPath:e.blob_path??void 0,mime:e.mime??void 0,sizeBytes:e.size_bytes,createdAt:e.created_at}}function Te(e){y().prepare(`
83
+ INSERT INTO workflow_artifacts (
84
+ id, execution_id, step_id, key, kind, value_json, blob_path, mime, size_bytes, created_at
85
+ )
86
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
87
+ `).run(e.id,e.executionId,e.stepId,e.key,e.kind,e.value!==void 0?JSON.stringify(e.value):null,e.blobPath??null,e.mime??null,e.sizeBytes,e.createdAt)}function Ee(e,t,o){let s=y().prepare(`
88
+ SELECT * FROM workflow_artifacts
89
+ WHERE execution_id = ? AND step_id = ? AND key = ?
90
+ `).get(e,t,o);return s?Nt(s):void 0}function Pe(e,t){let o=y(),n="SELECT * FROM workflow_artifacts WHERE execution_id = ?",s=[e];return t&&(n+=" AND step_id = ?",s.push(t)),n+=" ORDER BY created_at ASC",o.prepare(n).all(...s).map(Nt)}function sn(e){let t=y(),o=Pe(e);return t.prepare("DELETE FROM workflow_artifacts WHERE execution_id = ?").run(e),o}function Bt(e){y().prepare("DELETE FROM workflow_artifacts WHERE id = ?").run(e)}function an(e){return y().prepare(`
91
+ SELECT id
92
+ FROM workflow_executions
93
+ WHERE status != 'running' AND COALESCE(completed_at, started_at) < ?
94
+ `).all(e).map(n=>n.id)}B();V();var Wo=v("audit");function R(e){try{y().prepare(`
95
+ INSERT INTO artifact_access_log (
96
+ timestamp, task_id, role_id, execution_id, step_id, tool, artifact_key, artifact_id,
97
+ size_bytes, outcome, error_reason
98
+ )
99
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
100
+ `).run(e.timestamp,e.taskId??null,e.roleId??null,e.executionId,e.stepId??null,e.tool,e.artifactKey??null,e.artifactId??null,e.sizeBytes??null,e.outcome,e.errorReason??null)}catch(t){Wo.error({err:t,entry:e},"Failed to write artifact access log")}}var Vo=/^[A-Za-z0-9._-]{1,256}$/,qo=/^[A-Za-z0-9._-]{1,128}$/,$t=256*1024,jo=/^[a-z]+\/[a-z0-9.+-]+$/;async function zo(e){let{listChannels:t}=await import("./channels-ZNMTMMCY.js"),o=t(),{listSessions:n}=await import("./session-manager-Z6K4U5X7.js"),s=[...n("active"),...n("archived")],a=o.find(r=>r.name.toLowerCase().includes(e.toLowerCase()));if(!a)return null;let i=s.find(r=>r.source.type==="channel"&&r.source.channelId===a.id&&r.source.chatId)?.source.chatId??a.config?.userId??"";return{channelId:a.id,chatId:i}}function h(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}function le(e){return Vo.test(e)?null:"Invalid artifact key. Use only letters, numbers, dot, underscore, or dash (1-256 chars)."}function Ae(e){return qo.test(e)?null:"Invalid stepId format. Use only letters, numbers, dot, underscore, or dash (1-128 chars)."}function Ut(e,t,o){let n=e?A(e):void 0,s=o??(()=>{}),a=async()=>{if(!t)return{error:"artifact tools require a task context"};let i=L(t);if(!i)return{error:`task not found: ${t}`};if(!i.parentId)return{error:"this task is not a workflow step (no execution context)"};if(!i.stepId)return{error:"this task is not a workflow step (no step_id)"};let r=i.roleId??e;if(!r)return{error:"this workflow task has no role context"};let d=A(r);return d?{executionId:i.parentId,stepId:i.stepId,roleId:r,roleWorkspacePath:ne(d.name),taskId:t}:{error:`role not found: ${r}`}},c=[...mt(e),U("list_channels","List all available channels. Use this to discover what channels can be used with send_to_channel.",{},async()=>{let{listChannels:i}=await import("./channels-ZNMTMMCY.js"),r=i();return h({channels:r.map(d=>({id:d.id,name:d.name,enabled:d.enabled,type:d.config?.type??"unknown"}))})}),U("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:P.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:P.string().describe("The message content to send")},async i=>{if(n?.allowedChannels!==void 0){if(n.allowedChannels.length===0)return h({error:"This role is not allowed to send to any channels"});if(!n.allowedChannels.some(l=>l.toLowerCase()===i.channelName.toLowerCase()))return h({error:`Channel "${i.channelName}" is not in the allowed channels list for this role`})}let r=await zo(i.channelName);if(!r)return h({error:`Channel "${i.channelName}" not found or has no chatId available`});let{getOutboundGateway:d}=await import("./outbound-gateway-Y3P3T3VH.js"),p=await d().send({channelId:r.channelId,chatId:r.chatId,content:i.message,messageType:"reply"});return h({success:p.success,channelName:i.channelName})}),U("write_artifact","Persist a small structured value (JSON <= 256KB) for downstream workflow steps to read. USE THIS for: extracted fields, status flags, URL lists, summaries, structured key-value data. Do NOT use for: files (audio, video, reports). For files use publish_artifact_file instead.",{key:P.string(),value:P.unknown()},async i=>{let r=await a();if("error"in r)return h({error:r.error});let d=le(i.key);if(d)return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"write_artifact",artifactKey:i.key,outcome:"denied",errorReason:d}),h({error:d});try{let m=JSON.stringify(i.value),p=Buffer.byteLength(m,"utf8");if(p>$t){let l=`Artifact JSON exceeds ${$t} bytes`;return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"write_artifact",artifactKey:i.key,sizeBytes:p,outcome:"denied",errorReason:l}),h({error:l})}let f=Ft();return Te({id:f,executionId:r.executionId,stepId:r.stepId,key:i.key,kind:"json",value:i.value,sizeBytes:p,createdAt:Date.now()}),R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"write_artifact",artifactKey:i.key,artifactId:f,sizeBytes:p,outcome:"success"}),h({success:!0,artifactId:f,sizeBytes:p})}catch(m){let p=m instanceof Error?m.message:String(m);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"write_artifact",artifactKey:i.key,outcome:"error",errorReason:p}),h({error:p})}}),U("read_artifact","Read a structured value previously written by an upstream step's write_artifact. Returns the JSON value. For files, use fetch_artifact_file instead.",{stepId:P.string(),key:P.string()},async i=>{let r=await a();if("error"in r)return h({error:r.error});let d=Ae(i.stepId),m=le(i.key),p=d??m;if(p)return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"read_artifact",artifactKey:i.key,outcome:"denied",errorReason:p}),h({error:p});let f=Ee(r.executionId,i.stepId,i.key);if(!f){let l=`no artifact at ${i.stepId}/${i.key}`;return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"read_artifact",artifactKey:i.key,outcome:"error",errorReason:l}),h({error:l})}if(f.kind!=="json"){let l="artifact is a file; use fetch_artifact_file";return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"read_artifact",artifactKey:i.key,artifactId:f.id,sizeBytes:f.sizeBytes,outcome:"denied",errorReason:l}),h({error:l})}return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"read_artifact",artifactKey:i.key,artifactId:f.id,sizeBytes:f.sizeBytes,outcome:"success"}),h({value:f.value,sizeBytes:f.sizeBytes})}),U("publish_artifact_file","Publish a file from your workspace as a workflow artifact. The file is COPIED to the workflow's shared storage. USE THIS for: generated audio, video, reports, images, or large outputs. Do NOT use for: small structured values; use write_artifact instead. If you publish with cleanup=true, this step will not be retryable through publish; only choose cleanup=true when you do not need the source file again.",{key:P.string(),sourcePath:P.string(),mime:P.string().optional(),cleanup:P.boolean().optional()},async i=>{let r=await a();if("error"in r)return h({error:r.error});let d=le(i.key);if(d)return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:d}),h({error:d});if(i.mime&&!jo.test(i.mime)){let l=`Invalid MIME type: ${i.mime}`;return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:l}),h({error:l})}try{be(i.sourcePath,r.roleWorkspacePath,!0)}catch(l){let x=l instanceof Error?l.message:String(l);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"publish_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:x}),h({error:x})}let m=Ft(),p=null,f=!1;try{let l=ct({executionId:r.executionId,artifactId:m,sourcePath:i.sourcePath});return p=l.blobPath,Te({id:m,executionId:r.executionId,stepId:r.stepId,key:i.key,kind:"file",blobPath:p,mime:i.mime,sizeBytes:l.sizeBytes,createdAt:Date.now()}),f=!0,i.cleanup===!0&&lt(i.sourcePath),R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"publish_artifact_file",artifactKey:i.key,artifactId:m,sizeBytes:l.sizeBytes,outcome:"success"}),h({success:!0,artifactId:m,sizeBytes:l.sizeBytes})}catch(l){if(f)try{Bt(m)}catch{}if(p)try{pt(p)}catch{}let x=l instanceof Error?l.message:String(l);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"publish_artifact_file",artifactKey:i.key,artifactId:m,outcome:"error",errorReason:x}),h({error:x})}}),U("fetch_artifact_file","Copy an upstream step's published file into your current Role workspace. Use this when an earlier step published audio, video, reports, or other files you need to process.",{stepId:P.string(),key:P.string(),destPath:P.string()},async i=>{let r=await a();if("error"in r)return h({error:r.error});let d=Ae(i.stepId),m=le(i.key),p=d??m;if(p)return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:p}),h({error:p});try{be(i.destPath,r.roleWorkspacePath,!1)}catch(l){let x=l instanceof Error?l.message:String(l);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"denied",errorReason:x}),h({error:x})}let f=Ee(r.executionId,i.stepId,i.key);if(!f){let l=`no artifact at ${i.stepId}/${i.key}`;return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,outcome:"error",errorReason:l}),h({error:l})}if(f.kind!=="file"||!f.blobPath){let l="artifact is not a file";return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:f.id,outcome:"denied",errorReason:l}),h({error:l})}try{let l=ut({blobPath:f.blobPath,destPath:i.destPath});return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:f.id,sizeBytes:l.sizeBytes,outcome:"success"}),h({success:!0,sizeBytes:l.sizeBytes,mime:f.mime,destPath:i.destPath})}catch(l){let x=l instanceof Error?l.message:String(l);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"fetch_artifact_file",artifactKey:i.key,artifactId:f.id,outcome:"error",errorReason:x}),h({error:x})}}),U("list_artifacts","Discover artifacts published by upstream steps in this workflow. Returns step_id, key, kind ('json' or 'file'), size, mime. Use this to learn what is available before calling read_artifact or fetch_artifact_file.",{stepId:P.string().optional()},async i=>{let r=await a();if("error"in r)return h({error:r.error});let d=i.stepId?Ae(i.stepId):null;if(d)return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"list_artifacts",outcome:"denied",errorReason:d}),h({error:d});let m=Pe(r.executionId,i.stepId);return R({timestamp:Date.now(),taskId:r.taskId,roleId:r.roleId,executionId:r.executionId,stepId:r.stepId,tool:"list_artifacts",sizeBytes:m.length,outcome:"success"}),h({artifacts:m.map(p=>({id:p.id,stepId:p.stepId,key:p.key,kind:p.kind,sizeBytes:p.sizeBytes,mime:p.mime,createdAt:p.createdAt}))})}),U("report_blocked","Report that the task cannot proceed due to a missing prerequisite (e.g., missing credential, missing input, missing target). This sets the task status to 'blocked', stores the reason for the UI to display, and aborts the execution loop.",{reason:P.string().describe("Short reason, e.g. 'missing_credential', 'missing_target', 'missing_input'"),missingPrereqs:P.array(P.string()).optional().describe("Specific keys/IDs that are missing, e.g. ['MINIMAX_API_KEY']"),resumeHint:P.string().optional().describe("How the user can unblock, e.g. 'set MINIMAX_API_KEY in role env'")},async i=>{if(!t)return h({error:"report_blocked requires a task context (taskId not available)"});let r=L(t);if(!r)return h({error:`task not found: ${t}`});let d={reason:i.reason,missingPrereqs:i.missingPrereqs,resumeHint:i.resumeHint};return $(t,{status:"blocked",blockReason:d,completedAt:Date.now()}),b.emit({type:"task_status_change",taskId:t,oldStatus:r.status,newStatus:"blocked"}),s(),h({success:!0,blocked:!0,reason:i.reason})})];return Ho({name:"execution-tools",version:"1.0.0",tools:c})}Ge();import{createSdkMcpServer as Yo,tool as Go}from"@anthropic-ai/claude-agent-sdk";import{z as W}from"zod";V();function Wt(e){return{id:e.id,sourceSessionId:e.source_session_id??void 0,sourceMessageId:e.source_message_id??void 0,extractedAt:e.extracted_at,extractedByRoleId:e.extracted_by_role_id??void 0,content:e.content,summary:e.summary??void 0,status:e.status,tags:e.tags?JSON.parse(e.tags):void 0,evidenceQuote:e.evidence_quote??void 0,createdAt:e.created_at,updatedAt:e.updated_at}}var Ko=`
101
+ INSERT INTO feature_requests
102
+ (id, source_session_id, source_message_id, extracted_at, extracted_by_role_id,
103
+ content, summary, status, tags, evidence_quote, created_at, updated_at)
104
+ VALUES
105
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
106
+ `.trim(),Jo=`
107
+ UPDATE feature_requests SET status = ?, updated_at = ? WHERE id = ?
108
+ `.trim();function Ht(e){y().prepare(Ko).run(e.id,e.sourceSessionId??null,e.sourceMessageId??null,e.extractedAt,e.extractedByRoleId??null,e.content,e.summary??null,e.status,e.tags?JSON.stringify(e.tags):null,e.evidenceQuote??null,e.createdAt,e.updatedAt)}function xn(e,t=100,o=0){let n=y();return(e?n.prepare("SELECT * FROM feature_requests WHERE status = ? ORDER BY extracted_at DESC LIMIT ? OFFSET ?").all(e,t,o):n.prepare("SELECT * FROM feature_requests ORDER BY extracted_at DESC LIMIT ? OFFSET ?").all(t,o)).map(Wt)}function vn(e){let o=y().prepare("SELECT * FROM feature_requests WHERE id = ?").get(e);return o?Wt(o):void 0}function Tn(e,t){y().prepare(Jo).run(t,Date.now(),e)}import{v4 as Xo}from"uuid";var Vt={content:W.string().min(1).max(5e3),summary:W.string().max(500).optional(),tags:W.array(W.string().max(50)).max(10).optional(),evidenceQuote:W.string().max(1e3).optional(),sourceSessionId:W.string().optional(),sourceMessageId:W.string().optional()};function Qo(e){return Go("record_feature_request","Record a feature request extracted from chat sessions. Call this once per distinct feature request found in the provided chat data. Do not fabricate \u2014 only record requests that appear verbatim or clearly in the chat content.",Vt,async t=>{let o=W.object(Vt).safeParse(t);if(!o.success)return{content:[{type:"text",text:JSON.stringify({ok:!1,error:o.error.message})}]};let n=o.data,s=Date.now(),a=Xo(),c={id:a,content:n.content,summary:n.summary,status:"new",tags:n.tags??[],evidenceQuote:n.evidenceQuote,sourceSessionId:n.sourceSessionId,sourceMessageId:n.sourceMessageId,extractedByRoleId:e,extractedAt:s,createdAt:s,updatedAt:s};try{Ht(c)}catch{return{content:[{type:"text",text:JSON.stringify({ok:!1,error:"failed to write feature request"})}]}}return{content:[{type:"text",text:JSON.stringify({success:!0,featureRequestId:a,summary:n.summary??n.content.slice(0,80)})}]}})}function qt(e){return Yo({name:"mining-tools",version:"1.0.0",tools:[Qo(e)]})}import{createSdkMcpServer as or,tool as rr}from"@anthropic-ai/claude-agent-sdk";import{z as Z}from"zod";V();V();function De(e){return{id:e.id,dimensionType:e.dimension_type,dimensionValue:e.dimension_value,count:e.count,roleIds:JSON.parse(e.role_ids),sampleEvidenceIds:JSON.parse(e.sample_evidence_ids),status:e.status,firstSeen:e.first_seen,lastSeen:e.last_seen,createdAt:e.created_at,updatedAt:e.updated_at}}var Zo=`
109
+ INSERT INTO mistake_patterns
110
+ (id, dimension_type, dimension_value, count, role_ids, sample_evidence_ids,
111
+ status, first_seen, last_seen, created_at, updated_at)
112
+ VALUES
113
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
114
+ `.trim(),er=`
115
+ UPDATE mistake_patterns SET status = ?, updated_at = ? WHERE id = ?
116
+ `.trim();function jt(e){let t=y(),o=Date.now(),n=e.sampleEvidenceIds.slice(-10),s=t.prepare("SELECT * FROM mistake_patterns WHERE dimension_type = ? AND dimension_value = ?").get(e.dimensionType,e.dimensionValue);if(s){let c=JSON.parse(s.role_ids),i=Array.from(new Set([...c,...e.roleIds])),d=[...JSON.parse(s.sample_evidence_ids),...n].slice(-10);t.prepare(`
117
+ UPDATE mistake_patterns SET
118
+ count = count + 1,
119
+ role_ids = ?,
120
+ sample_evidence_ids = ?,
121
+ last_seen = ?,
122
+ updated_at = ?
123
+ WHERE dimension_type = ? AND dimension_value = ?
124
+ `).run(JSON.stringify(i),JSON.stringify(d),e.lastSeen,o,e.dimensionType,e.dimensionValue)}else t.prepare(Zo).run(`mp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,e.dimensionType,e.dimensionValue,1,JSON.stringify(e.roleIds),JSON.stringify(n),"new",e.firstSeen,e.lastSeen,o,o);let a=t.prepare("SELECT * FROM mistake_patterns WHERE dimension_type = ? AND dimension_value = ?").get(e.dimensionType,e.dimensionValue);return De(a)}function Ln(e,t=100,o=0){let n=y();return(e?n.prepare("SELECT * FROM mistake_patterns WHERE status = ? ORDER BY last_seen DESC LIMIT ? OFFSET ?").all(e,t,o):n.prepare("SELECT * FROM mistake_patterns ORDER BY last_seen DESC LIMIT ? OFFSET ?").all(t,o)).map(De)}function Nn(e){let o=y().prepare("SELECT * FROM mistake_patterns WHERE id = ?").get(e);return o?De(o):void 0}function Bn(e,t){y().prepare(er).run(t,Date.now(),e)}var Ce=.5,Me=.3;function tr(e,t,o,n){let s=e<o,a=t<n;return s&&a?"both":s?"low_ema":"low_task"}function zt(e={}){let{windowDays:t=14,dimensions:o=["event_type","score_degradation","tool_call_pattern"],minOccurrences:n=3,minRoles:s=2,scoreThresholdEma:a=Ce,scoreThresholdTask:c=Me}=e,i=y(),r=Date.now()-t*864e5,d=new Map;if(o.includes("event_type")){let I=i.prepare(`
125
+ SELECT id, role_id, source, timestamp
126
+ FROM evolution_audit
127
+ WHERE timestamp >= ? AND source IN ('audit','monitor','admin','manual')
128
+ ORDER BY timestamp ASC
129
+ `).all(r);for(let u of I){let _=u.source,C=`event_type|${_}`;d.has(C)||d.set(C,{dimensionType:"event_type",dimensionValue:_,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let w=d.get(C);w.count++,u.role_id&&w.roleIds.add(u.role_id),w.evidenceIds.push({source:"evolution_audit",id:u.id}),u.timestamp<w.firstSeen&&(w.firstSeen=u.timestamp),u.timestamp>w.lastSeen&&(w.lastSeen=u.timestamp)}}if(o.includes("score_degradation")){let I=i.prepare(`
130
+ SELECT id, role_id, score_json, ema_score, created_at
131
+ FROM role_scores
132
+ WHERE created_at >= ?
133
+ ORDER BY created_at ASC
134
+ `).all(r);for(let u of I){let _=u.ema_score;try{let F=JSON.parse(u.score_json);typeof F.weighted=="number"?_=F.weighted:typeof F.task=="number"?_=F.task:typeof F.score=="number"&&(_=F.score)}catch{}let C=tr(u.ema_score,_,a,c),w=`score_degradation|${C}`;d.has(w)||d.set(w,{dimensionType:"score_degradation",dimensionValue:C,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let N=d.get(w);N.count++,N.roleIds.add(u.role_id),N.evidenceIds.push({source:"role_scores",id:u.id}),u.created_at<N.firstSeen&&(N.firstSeen=u.created_at),u.created_at>N.lastSeen&&(N.lastSeen=u.created_at)}}if(o.includes("tool_call_pattern")){let I=i.prepare(`
135
+ SELECT dl.id, dl.task_id, dl.error, dl.created_at, t.role_id
136
+ FROM delivery_log dl
137
+ LEFT JOIN tasks t ON t.id = dl.task_id
138
+ WHERE dl.created_at >= ?
139
+ AND dl.message_type = 'sandbox_violation'
140
+ AND dl.source = 'audit'
141
+ ORDER BY dl.created_at ASC
142
+ `).all(r);for(let u of I){let _=(u.error??"").slice(0,60),C=`tool_call_pattern|${_}`;d.has(C)||d.set(C,{dimensionType:"tool_call_pattern",dimensionValue:_,count:0,roleIds:new Set,evidenceIds:[],firstSeen:1/0,lastSeen:0});let w=d.get(C);w.count++,u.role_id&&w.roleIds.add(u.role_id),w.evidenceIds.push({source:"delivery_log",id:u.id}),u.created_at<w.firstSeen&&(w.firstSeen=u.created_at),u.created_at>w.lastSeen&&(w.lastSeen=u.created_at)}}let m={};for(let I of d.keys()){let[u]=I.split("|");m[u]=(m[u]??0)+1}let p=Array.from(d.values()).filter(I=>I.count>=n&&I.roleIds.size>=s),f=0,l=i.transaction(()=>{for(let I of p)jt({dimensionType:I.dimensionType,dimensionValue:I.dimensionValue,roleIds:Array.from(I.roleIds),sampleEvidenceIds:I.evidenceIds.slice(-10),firstSeen:I.firstSeen===1/0?Date.now():I.firstSeen,lastSeen:I.lastSeen}),f++});try{l()}catch(I){throw new Error(`aggregateMistakes: transaction failed: ${I}`)}let x=0;for(let I of d.values())x+=I.count;return{patternsUpserted:f,totalEventsScanned:x,dimensionCounts:m}}var Kt={windowDays:Z.number().int().min(1).max(365).optional(),dimensions:Z.enum(["event_type","score_degradation","tool_call_pattern"]).array().min(1).max(3).optional(),minOccurrences:Z.number().int().min(1).max(100).optional(),minRoles:Z.number().int().min(1).max(100).optional()};function nr(){return rr("aggregate_mistakes","Aggregate cross-role failure signals from the last N days into mistake patterns. Returns counts + dimensions; patterns are persisted to mistake_patterns for UI review. Notify-only: no role/permission/CAG mutation.",Kt,async e=>{let t=Z.object(Kt).safeParse(e);if(!t.success)return{content:[{type:"text",text:JSON.stringify({ok:!1,error:t.error.message})}]};let o=t.data,n={windowDays:o.windowDays??14,dimensions:o.dimensions??["event_type","score_degradation","tool_call_pattern"],minOccurrences:o.minOccurrences??3,minRoles:o.minRoles??2,scoreThresholdEma:Ce,scoreThresholdTask:Me};try{let s=zt(n);return{content:[{type:"text",text:JSON.stringify({ok:!0,...s})}]}}catch(s){return{content:[{type:"text",text:JSON.stringify({ok:!1,error:String(s)})}]}}})}var sr="audit-tools";function Jt(){return or({name:sr,version:"1.0.0",tools:[nr()]})}function Yt(e){return e.presetId==="feature-miner"?{"mining-tools":qt(e.id)}:e.presetId==="mistake-digester"?{"audit-tools":Jt()}:{}}Ye();import{realpathSync as ar}from"fs";var T=v("execution"),Gt=new Set;async function dr(e,t){if(t&&Gt.has(t))return T.info({taskId:e,roleName:t},"Sandbox bypass: approved from session cache"),!0;let o=Xt(),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 Ie({id:o,taskId:e,plan:n,status:"pending",createdAt:Date.now()}),b.emit({type:"plan_approval_request",taskId:e,planId:o,plan:n}),T.info({taskId:e,operationId:o,roleName:t},"Sandbox unavailable: awaiting privilege escalation decision"),new Promise(s=>{let c=setTimeout(()=>{r(),ke(o,"denied"),T.warn({taskId:e,operationId:o},"Sandbox bypass timed out, auto-denied"),s(!1)},12e4),i=d=>{d.planId===o&&(r(),d.decision==="allow"?(T.info({taskId:e,operationId:o},"Sandbox bypass approved by user"),t&&Gt.add(t),s(!0)):(T.info({taskId:e,operationId:o},"Sandbox bypass denied by user"),s(!1)))},r=()=>{clearTimeout(c),b.off("plan_approval_decision",i)};b.on("plan_approval_decision",i)})}var ue=class{async execute(t,o){let n=Date.now(),s,a,c,i=new AbortController;$(t.id,{status:"running",startedAt:Date.now()}),b.emit({type:"task_status_change",taskId:t.id,oldStatus:t.status,newStatus:"running"}),T.info({taskId:t.id,roleId:t.roleId},"ExecutionManager: starting task");try{let r=t.config.executionProfile;if(!r){let g=t.roleId?A(t.roleId):void 0;if(g){T.info({taskId:t.id,roleId:t.roleId},"Lazy-backfilled executionProfile from live Role"),r=g;let S=L(t.id);S&&$(t.id,{config:{...S.config,executionProfile:g}})}}let d=ye;r&&(Xe(r),d=ne(r.name));let m={taskId:t.id,prompt:t.prompt,roleName:r?.name,roleCagPrompt:r?.cagPrompt,allowedTools:r?.allowedTools,cwd:d,workflowStep:t.parentId&&t.stepId?{executionId:t.parentId,stepId:t.stepId}:void 0},p=Dt(m),f=Ot({currentTaskId:t.id,roleId:t.roleId,taskPrompt:t.prompt}),l=t.config.approvalTimeout??300,x=async(g,S,D,E)=>{let k=Xt(),We=nt(E??t.roleId,t.prompt,"medium");if(We)return T.info({operationId:k,ruleId:We.id,taskId:t.id},"Auto-approved by permanent rule"),{behavior:"allow",updatedInput:S};let He={steps:[{index:0,description:`${g}: ${JSON.stringify(S).slice(0,300)}`,toolsNeeded:[g],expectedOutput:"",riskLevel:"medium"}],requiredPermissions:{},overallRisk:"medium"};return Ie({id:k,taskId:t.id,roleId:E??t.roleId,plan:He,status:"pending",createdAt:Date.now()}),b.emit({type:"plan_approval_request",taskId:t.id,planId:k,plan:He}),T.info({taskId:t.id,operationId:k,toolName:g,matchedPattern:D},"Privilege escalation: awaiting user decision"),new Promise(he=>{let yo=setTimeout(()=>{qe(),ke(k,"denied"),T.warn({taskId:t.id,operationId:k},"Privilege escalation timed out, auto-denied"),he({behavior:"deny",message:`Operation timed out after ${l}s. Auto-denied. Try a safer alternative that does not require approval.`})},l*1e3),Ve=K=>{if(K.planId===k)if(qe(),K.decision==="allow")T.info({taskId:t.id,operationId:k,approvalType:K.approvalType},"Operation authorized by user"),he({behavior:"allow",updatedInput:S});else{let _o=K.reason?`Operation denied by user: ${K.reason}. Try a safer alternative.`:"Operation denied by user. Try a safer alternative approach.";T.info({taskId:t.id,operationId:k,reason:K.reason??"no reason given"},"Operation denied by user"),he({behavior:"deny",message:_o})}},qe=()=>{clearTimeout(yo),b.off("plan_approval_decision",Ve)};b.on("plan_approval_decision",Ve)})},u=(X("defaults.deniedReadPaths")??[]).map(g=>{let S=re(g);try{return ar(S)}catch{return S}}),_=r,C=_?.additionalDirectories??[],w=_?et(_):[],N=[...C.map(g=>g.path)].filter((g,S,D)=>D.indexOf(g)===S),F=Mt(g=>({disallowedTools:_?.disallowedTools,approvalRequired:_?.approvalRequired??t.config.approvalRequired,allowedBashPatterns:_?.allowedBashPatterns,deniedBashPatterns:_?.deniedBashPatterns}),x,{deniedReadPaths:u,roleScope:[d,...N]}),ao=je({roleEnvVars:_?.envVars,taskEnv:t.config.env}),co=t.config.maxBudgetUsd??G().defaults.maxBudgetUsd,lo=t.config.maxTurns??100,uo=Ut(t.roleId??"",t.id,()=>i.abort()),po=_?.mcpServers??{},mo=t.config.mcpServers??{},fo=_?Yt(_):{},go={...po,...mo,...fo,"execution-tools":uo},ge=[{path:d,mode:"rw"}];t.roleId===Ze&&ge.push({path:ye,mode:"ro"});for(let g of C)ge.push({path:g.path,mode:g.mode??"rw"});let Fe=J();if(Fe.platform==="none"&&!await dr(t.id,r?.name))return $(t.id,{status:"failed",error:"Sandbox unavailable; execution denied by user"}),{taskId:t.id,status:"failed",error:"Sandbox bypass denied"};o&&(o.aborted?i.abort():o.addEventListener("abort",()=>i.abort()));let $e=_?.permissionMode??"default",ho=ir({prompt:t.prompt,options:{abortController:i,cwd:d,additionalDirectories:N,systemPrompt:p,maxTurns:lo,maxBudgetUsd:co,allowedTools:_?.allowedTools,model:_?.model,mcpServers:go,settingSources:_?.inheritUserSettings?["project","user"]:["project"],hooks:f,canUseTool:F,env:ao,plugins:w.map(g=>({type:"local",path:g})),permissionMode:$e,...$e==="bypassPermissions"?{allowDangerouslySkipPermissions:!0}:{},spawnClaudeCodeProcess:g=>{let S=Fe.spawn({command:g.command,args:g.args,cwd:g.cwd,env:g.env,signal:g.signal,visiblePaths:ge,deniedReadPaths:u,osCapabilities:_?.osCapabilities}),D=S;D.pid&&(Qt(D.pid,t.roleId??"unknown",t.id),D.on("exit",()=>Zt(D.pid)));let E="";return D.stderr?.on("data",k=>{E+=k.toString()}),D.on("exit",k=>{k!==null&&k!==0&&E.includes("sandbox")&&(T.error({taskId:t.id,roleId:t.roleId,exitCode:k,stderr:E.slice(0,500)},"Sandbox wrapper failed \u2014 task process exited before execution"),pe({roleId:t.roleId??"unknown",taskId:t.id,path:d,operation:`sandbox_init_failure:exit_${k}`,timestamp:Date.now()}))}),S},stderr:g=>{g.trim()&&T.debug({stderr:g.trim().slice(0,500)},"ExecutionManager SDK stderr")}}}),z="",Ue=0;try{for await(let D of ho){let E=D;if(T.debug({eventType:E.type,taskId:t.id},"ExecutionManager SDK event"),E.type==="result"&&typeof E.result=="string"&&(z=E.result),E.type==="result"){Ue++,typeof E.total_cost_usd=="number"&&(a=E.total_cost_usd);let k=E.usage;k?.input_tokens!==void 0&&k?.output_tokens!==void 0&&(s={input:k.input_tokens,output:k.output_tokens})}if(E.token_usage){let k=E.token_usage;k.input_tokens!==void 0&&k.output_tokens!==void 0&&(s={input:k.input_tokens,output:k.output_tokens})}}c=Ue;let g=Date.now()-n;return L(t.id)?.status==="blocked"?(b.emit({type:"task_complete_event",taskId:t.id,result:z}),{taskId:t.id,status:"blocked",result:z,durationMs:g}):($(t.id,{status:"completed",result:z,completedAt:Date.now(),costUsd:a,tokenUsage:s,numTurns:c,totalDurationMs:g}),b.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"completed"}),b.emit({type:"task_complete_event",taskId:t.id,result:z}),w.length>0&&Lt(t.id,w,t.roleId),T.info({taskId:t.id,durationMs:g,costUsd:a},"ExecutionManager: task completed"),{taskId:t.id,status:"completed",result:z,costUsd:a,tokenUsage:s,numTurns:c,durationMs:g})}catch(g){let S=g instanceof Error?g.message:String(g),D=Date.now()-n;return L(t.id)?.status==="blocked"?(b.emit({type:"task_complete_event",taskId:t.id,error:S}),{taskId:t.id,status:"blocked",error:S,durationMs:D}):((S.includes("Prompt is too long")||S.includes("prompt is too long"))&&T.warn({taskId:t.id,error:S},"Task prompt exceeds model context window \u2014 task failed"),$(t.id,{status:"failed",error:S,completedAt:Date.now(),totalDurationMs:D}),b.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"failed"}),b.emit({type:"task_complete_event",taskId:t.id,error:S}),T.error({taskId:t.id,error:g},"ExecutionManager: task failed"),{taskId:t.id,status:"failed",error:S,durationMs:D})}}catch(r){let d=r instanceof Error?r.message:String(r),m=Date.now()-n;return T.error({taskId:t.id,error:r},"ExecutionManager: setup-phase error"),{taskId:t.id,status:"failed",error:d,durationMs:m}}}};B();var M=v("execution-pool"),Oe=new Map;function Qt(e,t,o){Oe.set(e,{roleId:t,taskId:o})}function Zt(e){Oe.delete(e)}function Le(e){return Oe.get(e)}var eo=class{slots;running=!1;pollTimeoutId=null;executor;constructor(t,o){this.slots=Array.from({length:t},(n,s)=>({index:s,taskId:null,abortController:null})),this.executor=o??new ue}async start(){if(this.running)return;this.running=!0,b.on("task_created",n=>{this.onTaskCreated(n.taskId)}),b.on("task_status_change",n=>{n.newStatus==="pending"&&this.pickupPendingTasks()});let o=G().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,o),M.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let t of this.slots)t.abortController&&(t.abortController.abort(),t.taskId=null,t.abortController=null);M.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let o=G().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,o)};async onTaskCreated(t){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let t=this.slots.find(i=>i.taskId===null);if(!t){M.debug("No free slots available");return}let o=oe("pending");if(o.length===0)return;let s=[...o].sort((i,r)=>i.createdAt-r.createdAt)[0];t.taskId=s.id,t.abortController=new AbortController;let a=t.index,c=s.id;M.info({slotIndex:a,taskId:c},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(s,a).catch(i=>{M.error({taskId:c,error:i},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(t,o){let n=this.slots[o];if(!n)return;let s="completed";try{b.emit({type:"execution_task_start",taskId:t.id,slotIndex:o});let a=await this.executor.execute(t,n.abortController?.signal);s=a.status,M.info({taskId:t.id,status:a.status,slotIndex:o},"ExecutionPool: task finished")}finally{n.taskId=null,n.abortController=null,b.emit({type:"execution_task_end",taskId:t.id,slotIndex:o,status:s}),this.emitSlotChange(),s!=="blocked"&&this.runPostCompletion(t.id,t.roleId).catch(a=>{M.error({taskId:t.id,error:a},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let t=this.slots.filter(s=>s.taskId!==null).length,o=oe("pending");b.emit({type:"execution_slot_change",active:t,max:this.slots.length,queued:o.length});let n=st();b.emit({type:"stats_update",activeTasks:t,queuedTasks:o.length,totalCostToday:ze(n)})}async runPostCompletion(t,o){if(o){try{let{processTaskCompletion:n}=await import("./memory-extractor-URH4YHK3.js"),s=await n(t,o);s>0&&M.debug({taskId:t,roleId:o,memoriesStored:s},"Post-completion: memories extracted")}catch(n){M.error({taskId:t,roleId:o,error:n},"Post-completion: memory extraction failed")}try{let{processTaskReview:n}=await import("./learner-ACHENH6R.js");await n(t)}catch(n){M.error({taskId:t,roleId:o,error:n},"Post-completion: task review failed")}try{let{evaluateTaskCompletion:n}=await import("./audit-manager-CLKTJPLM.js");n(t,o)}catch(n){M.error({taskId:t,roleId:o,error:n},"Post-completion: audit evaluation failed")}}}getStatus(){let t=this.slots.filter(n=>n.taskId!==null).length,o=oe("pending");return{active:t,max:this.slots.length,queued:o.length}}isHealthy(){return this.running}releaseSlot(t){let o=this.slots.find(n=>n.taskId===t);o&&(M.warn({taskId:t,slotIndex:o.index},"ExecutionPool: force-releasing slot"),o.abortController&&o.abortController.abort(),o.taskId=null,o.abortController=null,this.emitSlotChange(),this.running&&this.pickupPendingTasks())}};B();var O=v("audit"),cr="sandbox_violation",ee=new Map,Ne=1440*60*1e3,me=[],lr=100;function Be(e){let t=e.roleId,o=ee.get(t)??{count:0,timestamps:[]};o.count++,o.timestamps.push(e.timestamp);let n=Date.now()-Ne;if(o.timestamps=o.timestamps.filter(s=>s>=n),ee.set(t,o),o.count%100===0)for(let[s,a]of ee.entries()){let c=Date.now()-Ne;a.timestamps.filter(i=>i>=c).length===0&&ee.delete(s)}me.push(e),me.length>lr&&me.shift();try{ot({id:`sv-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,ruleId:void 0,taskId:e.taskId,status:"delivered",target:{type:"channel",channelId:"audit"},content:"",attempts:1,messageType:cr,source:"audit",createdAt:e.timestamp,deliveredAt:e.timestamp,expiresAt:e.timestamp+864e5,error:`${e.operation} on ${e.path}`})}catch(s){O.error({error:s},"Failed to record violation to delivery_log")}try{let s=A(e.roleId);Y({timestamp:e.timestamp,oldRules:"sandbox_violation",newRules:`${e.operation} on ${e.path}`,diff:`Sandbox violation: ${e.operation} on ${e.path} (taskId=${e.taskId??"unknown"})`,roleId:e.roleId,source:"audit"})}catch(s){O.error({error:s},"Failed to record violation to evolution_audit")}b.emit({type:"sandbox_violation",roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp})}async function no(){let e=J();if(e.platform==="none")return O.info("Sandbox platform is 'none'; violation watcher not started"),()=>{};if(!await e.isAvailable())return O.warn({platform:e.platform},"Sandbox platform detected but not available; violation watcher not started"),()=>{};let o=null;return e.platform==="sandbox-exec"?o=ur():e.platform==="landlock"&&(o=await pr()),()=>{if(o){let n=o;o=null,n.kill("SIGTERM");let s=setTimeout(()=>{try{n.kill("SIGKILL")}catch{}},2e3);n.on("exit",()=>clearTimeout(s))}O.info("Violation watcher stopped")}}function ur(){let e=ro("log",["stream","--predicate",'subsystem == "com.apple.sandbox"',"--style","ndjson","--signal","exit"],{stdio:["ignore","pipe","pipe"]});return e.stdout?.on("data",t=>{let o=t.toString().split(`
143
+ `).filter(Boolean);for(let n of o)try{let s=JSON.parse(n),a=s.eventMessage??s.message??"";if(a.includes("deny")&&(a.includes("file-read")||a.includes("file-write"))){let c=mr(s,a);c&&Be(c)}}catch{}}),e.stderr?.on("data",t=>{O.debug({msg:t.toString()},"log stream stderr")}),e.on("error",t=>{O.warn({error:t},"macOS violation watcher failed to start")}),O.info("macOS sandbox violation watcher started (log stream)"),e}async function pr(){let e=await to("journalctl",["-kf","--no-pager","-o","short","--grep","landlock"]);if(e)return oo(e),O.info("Linux violation watcher started (journalctl -kf)"),e;let t=await to("dmesg",["-w","-t"]);return t?(oo(t),O.info("Linux violation watcher started (dmesg -w)"),t):(O.warn("Linux violation watcher unavailable: neither journalctl nor dmesg accessible. Sandbox enforcement still active; monitoring disabled."),null)}async function to(e,t){return new Promise(o=>{let n=ro(e,t,{stdio:["ignore","pipe","pipe"]}),s=setTimeout(()=>o(n),500);n.on("error",()=>{clearTimeout(s),o(null)}),n.on("exit",a=>{a!==0&&(clearTimeout(s),o(null))})})}function oo(e){e.stdout?.on("data",t=>{let o=t.toString().split(`
144
+ `).filter(Boolean);for(let n of o)if(n.includes("landlock")&&n.includes("denied")){let s=fr(n);s&&Be(s)}}),e.stderr?.on("data",t=>{O.debug({msg:t.toString().trim()},"Linux watcher stderr")})}function mr(e,t){let o=t.match(/(?:path|file)=["']([^"']+)["']/),n=t.match(/deny\s+(file-read|file-write|file-[^\s]+)/),s=o?.[1],a=n?.[1]??"unknown";if(!s)return null;let c=typeof e.processID=="number"?e.processID:void 0,i=c?Le(c):void 0;return{roleId:i?.roleId??"unknown",taskId:i?.taskId,path:s,operation:a,timestamp:Date.now(),count:1}}function fr(e){let t=e.match(/path="([^"]+)"/)??e.match(/\/[\w\-\.\/\+ ]+/g),o=e.match(/deny\s+(\w+)/),n=e.match(/pid=(\d+)/),s=Array.isArray(t)?t[t.length-1]:t?.[1],a=o?.[1]??"unknown";if(!s)return null;let c=n?parseInt(n[1],10):void 0,i=c?Le(c):void 0;return{roleId:i?.roleId??"unknown",taskId:i?.taskId,path:s,operation:a,timestamp:Date.now(),count:1}}function pe(e){Be({roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp,count:1})}function so(e){let t=ee.get(e);if(!t)return 0;let o=Date.now()-Ne;return t.timestamps.filter(n=>n>=o).length}function io(){return[...me]}j();B();var H=v("audit"),gr=.4,hr=1440*60*1e3,te=null,fe=null;function Ks(e,t,o=gr){let n=A(t);if(!n||n.status==="retired"||n.status==="inactive"||n.status==="dead")return;let s=St(t,e);q(t,{performanceScore:s}),At(t,s,o)?H.info({roleId:t,emaScore:s},"Probation role graduated"):s<o&&Et(t,s,o)&&Pt(t),setImmediate(()=>{vt(e,t).then(c=>{let i=bt(e,c.score,c.failed,Se,ae);if(i===void 0)return;let r=kt(t);if(r?.taskId!==e){H.debug({taskId:e,roleId:t,latestTaskId:r?.taskId},"Intent eval landed for non-latest task; skipping performanceScore update");return}q(t,{performanceScore:i}),H.debug({taskId:e,roleId:t,intentScore:c.score,failed:c.failed,newEma:i.toFixed(3)},"Intent eval applied")}).catch(c=>{H.warn({taskId:e,roleId:t,err:c instanceof Error?c.message:String(c)},"Intent eval pipeline error (swallowed)")})})}async function Js(){te===null&&(te=setInterval(()=>{H.info("Running daily diagnostic reports");let e=_e(void 0,1e3);for(let t of e)if(!(t.status==="retired"||t.status==="inactive"))try{de(t.id)}catch(o){H.error({roleId:t.id,error:o},"Daily diagnostic failed")}},hr),fe=await no(),H.info("AuditManager started"))}function Ys(){te!==null&&(clearInterval(te),te=null),fe!==null&&(fe(),fe=null),H.info("AuditManager stopped")}function Gs(e){pe(e)}async function Xs(){let e=J(),t=_e(void 0,1e3),n=Date.now()-1440*60*1e3,s=io(),a=s.filter(r=>r.timestamp>=n).length,c=t.map(r=>{let d=s.filter(p=>p.roleId===r.id),m=d[d.length-1];return{roleId:r.id,roleName:r.name,sandboxed:e.platform!=="none",violationCount:so(r.id),lastViolation:m?.timestamp}}),i=await ft();return{platform:e.platform,available:i,violationCount24h:a,rolePostures:c}}export{se as a,_t as b,Mt as c,Ot as d,tn as e,on as f,Pe as g,sn as h,an as i,Ht as j,xn as k,vn as l,Tn as m,Ln as n,Nn as o,Bn as p,Ks as q,Js as r,Ys as s,Gs as t,Xs as u,eo as v};
@@ -1,4 +1,4 @@
1
- import{c,d as m}from"./chunk-5XOTPEAK.js";import{b as a,d as _}from"./chunk-5EPG2US5.js";import{c as s,h as f}from"./chunk-MRTJFYPR.js";import{readFileSync as p,existsSync as l}from"fs";import{fileURLToPath as A}from"url";import{dirname as I,join as r}from"path";var O=A(import.meta.url),g=I(O),i,n;function u(){let e=r(g,"..","package.json");if(l(e))return e;let o=r(g,"..","..","package.json");return l(o)?o:r(process.cwd(),"package.json")}function P(){if(i===void 0){let e=u();i=JSON.parse(p(e,"utf-8")).version}return i}function S(){if(n===void 0){let e=u();n=JSON.parse(p(e,"utf-8")).name}return n}_();f();import{dirname as h,join as R}from"path";import{fileURLToPath as T}from"url";var y=h(T(import.meta.url)),d=R(y,"..");var k=d,U=s("cli:register-ai-digest"),t="ai-hourly-digest";function x(){try{if(m(t)){console.log(`[INFO] AI Digest template already exists (${t})`);return}}catch{}let e={id:t,name:"AI Hourly Digest",description:"\u6BCF\u5C0F\u65F6\u641C\u7D22 AI \u524D\u6CBF\u6587\u7AE0\uFF0C\u603B\u7ED3\u540E\u4FDD\u5B58\u5230 Omnifocus",trigger:{type:"cron",cron:"0 * * * *"},enabled:!0,steps:[{id:"search_ai_news",autoSelectRole:!0,requirements:{},prompt:`\u641C\u7D22\u8FC7\u53BB 24 \u5C0F\u65F6\u5185\u5173\u4E8E AI/\u4EBA\u5DE5\u667A\u80FD\u7684\u6700\u65B0\u524D\u6CBF\u6587\u7AE0\u3002
1
+ import{c,d as m}from"./chunk-VPZSOYE5.js";import{b as a,d as _}from"./chunk-7F4SZXI2.js";import{c as s,h as f}from"./chunk-MRTJFYPR.js";import{readFileSync as p,existsSync as l}from"fs";import{fileURLToPath as A}from"url";import{dirname as I,join as r}from"path";var O=A(import.meta.url),g=I(O),i,n;function u(){let e=r(g,"..","package.json");if(l(e))return e;let o=r(g,"..","..","package.json");return l(o)?o:r(process.cwd(),"package.json")}function P(){if(i===void 0){let e=u();i=JSON.parse(p(e,"utf-8")).version}return i}function S(){if(n===void 0){let e=u();n=JSON.parse(p(e,"utf-8")).name}return n}_();f();import{dirname as h,join as R}from"path";import{fileURLToPath as T}from"url";var y=h(T(import.meta.url)),d=R(y,"..");var k=d,U=s("cli:register-ai-digest"),t="ai-hourly-digest";function x(){try{if(m(t)){console.log(`[INFO] AI Digest template already exists (${t})`);return}}catch{}let e={id:t,name:"AI Hourly Digest",description:"\u6BCF\u5C0F\u65F6\u641C\u7D22 AI \u524D\u6CBF\u6587\u7AE0\uFF0C\u603B\u7ED3\u540E\u4FDD\u5B58\u5230 Omnifocus",trigger:{type:"cron",cron:"0 * * * *"},enabled:!0,steps:[{id:"search_ai_news",autoSelectRole:!0,requirements:{},prompt:`\u641C\u7D22\u8FC7\u53BB 24 \u5C0F\u65F6\u5185\u5173\u4E8E AI/\u4EBA\u5DE5\u667A\u80FD\u7684\u6700\u65B0\u524D\u6CBF\u6587\u7AE0\u3002
2
2
 
3
3
  \u641C\u7D22\u6765\u6E90:
4
4
  1. Hacker News AI \u677F\u5757 (https://news.ycombinator.com/front?day=1)