adam-agent-server 1.6.0 → 1.7.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 (96) hide show
  1. package/dist/App-ZRCRM7WR.js +13 -0
  2. package/dist/{adam-automator-skills-UFW5TXCC.js → adam-automator-skills-EZGBICHT.js} +1 -1
  3. package/dist/adam-tools-V5LPU47X.js +1 -0
  4. package/dist/{approval-handler-HQO62WK2.js → approval-handler-PB7PSLUS.js} +1 -1
  5. package/dist/audit-manager-BSBBDUER.js +1 -0
  6. package/dist/bree-engine-7S33CWS7.js +1 -0
  7. package/dist/channels-SITUUC4J.js +1 -0
  8. package/dist/{channels-J4STJ4X2.js → channels-ULFUCUUZ.js} +1 -1
  9. package/dist/{chunk-7446ZS6D.js → chunk-2L2347UQ.js} +1 -1
  10. package/dist/{chunk-FXQAUQTI.js → chunk-2YTDCR6A.js} +1 -1
  11. package/dist/chunk-4PQHGLZH.js +99 -0
  12. package/dist/{chunk-NCFVJCNQ.js → chunk-5EPG2US5.js} +2 -2
  13. package/dist/{chunk-2H7UOW4P.js → chunk-5QZXYKMS.js} +1 -1
  14. package/dist/chunk-5XOTPEAK.js +6 -0
  15. package/dist/{chunk-MDBVKBC7.js → chunk-6KF7OO2B.js} +1 -1
  16. package/dist/{chunk-TSPQ44HT.js → chunk-A5OCDYTW.js} +1 -1
  17. package/dist/{chunk-DWRYIN5N.js → chunk-AQ3ASS4B.js} +1 -1
  18. package/dist/{chunk-GMMWA5EG.js → chunk-B6LOT5CG.js} +1 -1
  19. package/dist/{chunk-MJSSCKMB.js → chunk-BCH2HAIM.js} +2 -2
  20. package/dist/{chunk-4C5ITATX.js → chunk-BQ3ZAYHC.js} +1 -1
  21. package/dist/{chunk-YHVYX3F4.js → chunk-DVN3BFPP.js} +1 -1
  22. package/dist/{chunk-P5ZXNBNV.js → chunk-EQZFOBAJ.js} +1 -1
  23. package/dist/{chunk-G5ESQEXN.js → chunk-FPZEZYUB.js} +1 -1
  24. package/dist/{chunk-YXYIA24D.js → chunk-GSFLLRS7.js} +1 -1
  25. package/dist/{chunk-7ZGSJCX5.js → chunk-HQRUJQN7.js} +1 -1
  26. package/dist/{chunk-52PR7XTN.js → chunk-IKPYPZ64.js} +1 -1
  27. package/dist/{chunk-FZCNYKNT.js → chunk-JJH2RCVC.js} +1 -1
  28. package/dist/chunk-K4C43YDD.js +7 -0
  29. package/dist/{chunk-V32YF3J5.js → chunk-M4YI4WVX.js} +1 -1
  30. package/dist/{chunk-WAG3MNMC.js → chunk-NASJH4NT.js} +1 -1
  31. package/dist/{chunk-TNL2LZB7.js → chunk-NUITL62I.js} +1 -1
  32. package/dist/{chunk-3LY6PD6A.js → chunk-NWMOV23A.js} +1 -1
  33. package/dist/chunk-PHT24MOV.js +1 -0
  34. package/dist/{chunk-ZL5JXLAX.js → chunk-QGYDGZSC.js} +1 -1
  35. package/dist/{chunk-VVSZZK5T.js → chunk-RI3V72RP.js} +2 -2
  36. package/dist/{chunk-RLJYEEQC.js → chunk-RZ7LCZVK.js} +1 -1
  37. package/dist/{chunk-5OQZPUBV.js → chunk-TAF2DBBC.js} +8 -8
  38. package/dist/{chunk-HWLSHTVX.js → chunk-ULTK7RD6.js} +3 -3
  39. package/dist/{chunk-DBP7GPWG.js → chunk-WMB7P64J.js} +1 -1
  40. package/dist/cli.js +2 -2
  41. package/dist/{config-KFPS7IEH.js → config-HBQPBIWL.js} +1 -1
  42. package/dist/{db-PZ2V7UCK.js → db-QEWTZGU3.js} +1 -1
  43. package/dist/{delivery-log-ACNJ66RD.js → delivery-log-AC476GX7.js} +1 -1
  44. package/dist/engine-6K4RG644.js +1 -0
  45. package/dist/{evolution-audit-OQDGPKYI.js → evolution-audit-XMBDUN3T.js} +1 -1
  46. package/dist/index.js +13 -10
  47. package/dist/{learner-QCD6BH2J.js → learner-VCS3Q7BR.js} +1 -1
  48. package/dist/{memories-QGMRSBJJ.js → memories-VMOGFVPU.js} +1 -1
  49. package/dist/{memory-extractor-3MRK43A2.js → memory-extractor-4WJNHYWR.js} +2 -2
  50. package/dist/memory-service-ZS6MBUIC.js +1 -0
  51. package/dist/outbound-gateway-H7RFG6D2.js +1 -0
  52. package/dist/role-presets-XAEOYEAW.js +1 -0
  53. package/dist/role-workspace-NKGAH6J6.js +1 -0
  54. package/dist/{roles-KYXNMO5H.js → roles-ZYCFQMAY.js} +1 -1
  55. package/dist/{session-manager-LZ77OT7A.js → session-manager-COLCNIB7.js} +1 -1
  56. package/dist/task-templates-4KCZOUN5.js +1 -0
  57. package/dist/workflow-executor-Z7JFMR56.js +1 -0
  58. package/package.json +25 -25
  59. package/web/dist/assets/{ChannelDetail-DHT8fW0C.js → ChannelDetail-DnL0_h8q.js} +1 -1
  60. package/web/dist/assets/{Channels-YHGNXcRu.js → Channels-dod8Q4oq.js} +1 -1
  61. package/web/dist/assets/{Dashboard-DsHC5W4C.js → Dashboard-Dl0vA6Ky.js} +1 -1
  62. package/web/dist/assets/{EnvVarEditor-Dxy1Kz1Z.js → EnvVarEditor-C-gErAzC.js} +1 -1
  63. package/web/dist/assets/{EventDefDetail-CwprP2ch.js → EventDefDetail-BhJZGNlX.js} +1 -1
  64. package/web/dist/assets/{Events-B19a8cEG.js → Events-DnNZ9-BN.js} +1 -1
  65. package/web/dist/assets/{Evolution-DT6iZvil.js → Evolution-BBWmrrnr.js} +1 -1
  66. package/web/dist/assets/{GoalDetail-BALsnPQl.js → GoalDetail-uqWQCOj3.js} +1 -1
  67. package/web/dist/assets/{Goals-BJIsKgfH.js → Goals-CylKmR9j.js} +1 -1
  68. package/web/dist/assets/{Logs-Cv15aV3l.js → Logs-6rf0KT0z.js} +1 -1
  69. package/web/dist/assets/{Memories-CKAXhAso.js → Memories-CrBTujU7.js} +1 -1
  70. package/web/dist/assets/{Plugins-NO0S2spH.js → Plugins-VKUSUcSE.js} +1 -1
  71. package/web/dist/assets/{RoleDetail-1FNyCD4u.js → RoleDetail-DJc4CWFN.js} +1 -1
  72. package/web/dist/assets/{Roles-grfjw2zy.js → Roles-6pmjn04G.js} +1 -1
  73. package/web/dist/assets/{Settings-9LRLfa_4.js → Settings-DW1jmrNj.js} +1 -1
  74. package/web/dist/assets/{Strategies-BMyd_7_5.js → Strategies-Bmke6qZo.js} +1 -1
  75. package/web/dist/assets/{Switch-CULsD-kC.js → Switch-CfTpXW9_.js} +1 -1
  76. package/web/dist/assets/{TaskDetail-C2yXy8gE.js → TaskDetail-CwJ_UKgt.js} +1 -1
  77. package/web/dist/assets/Work-DVdWNBEm.js +1 -0
  78. package/web/dist/assets/{index-qYKJGoIB.js → index-DYsO5Awn.js} +2 -2
  79. package/web/dist/index.html +1 -1
  80. package/dist/App-WJMHK5EO.js +0 -13
  81. package/dist/adam-tools-IAZSLWYB.js +0 -1
  82. package/dist/audit-manager-LC5EQXCI.js +0 -1
  83. package/dist/bree-engine-M5CZ6A62.js +0 -1
  84. package/dist/channels-5TFYQN5Z.js +0 -1
  85. package/dist/chunk-FIN36WAP.js +0 -99
  86. package/dist/chunk-GGIHDFRW.js +0 -6
  87. package/dist/chunk-I7ZZKPHE.js +0 -7
  88. package/dist/chunk-YDVTWPNA.js +0 -1
  89. package/dist/engine-5DHYHDAP.js +0 -1
  90. package/dist/memory-service-M5ADGITG.js +0 -1
  91. package/dist/outbound-gateway-QRL36F7K.js +0 -1
  92. package/dist/role-presets-DLO3XS54.js +0 -1
  93. package/dist/role-workspace-URSOBCDH.js +0 -1
  94. package/dist/task-templates-YPNWJOVV.js +0 -1
  95. package/dist/workflow-executor-3WMS2WV3.js +0 -1
  96. package/web/dist/assets/Work-dftf35Me.js +0 -1
@@ -1,4 +1,4 @@
1
- import{e as J}from"./chunk-HWLSHTVX.js";import{i as x,j as v,q as b}from"./chunk-MDBVKBC7.js";import{b as y}from"./chunk-I7ZZKPHE.js";import{a as u}from"./chunk-L7JP7DUO.js";import{p as C}from"./chunk-YHVYX3F4.js";import{c as _,d as l,f as g,h as A}from"./chunk-GGIHDFRW.js";import{d as k}from"./chunk-PG6LMSX6.js";import{o as I,r as W}from"./chunk-7ZGSJCX5.js";import{c as p,h as T}from"./chunk-MRTJFYPR.js";T();W();import{v4 as m}from"uuid";import{CronExpressionParser as S}from"cron-parser";T();import{v4 as D}from"uuid";var d=p("scheduler"),R=new J;async function O(n,t={}){let e=t.executionId??D();if(d.info({templateName:n.name,executionId:e,trigger:t.triggerContext},"Dispatching template"),n.goalIds&&n.goalIds.length>0){for(let r of n.goalIds){let o=v(r);if(!o){d.warn({goalId:r,templateId:n.id},"Goal reference not found, skipping");continue}let c=D();x({id:c,name:o.name,description:o.description,roleId:o.roleId,metricType:o.metricType,targetValue:o.targetValue,currentValue:0,deadline:o.deadline,budgetUsd:o.budgetUsd,status:"active",createdAt:Date.now(),sourceSessionId:n.sourceSessionId,deliverTo:n.deliverTo,reportTo:n.reportTo});let a=await b({prompt:`Decompose and execute goal: ${o.name}. ${o.description??""}`,roleId:n.rolePreference??o.roleId,config:{...k()},deliverTo:n.deliverTo,reportTo:n.reportTo,sourceSessionId:n.sourceSessionId,parentId:c,templateId:n.id});if(!a.ok){d.error({templateId:n.id,sourceGoalId:r,newGoalId:c,code:a.code,reason:a.reason},"Decomposition task admission failed");continue}d.info({templateId:n.id,sourceGoalId:r,newGoalId:c,taskId:a.taskId},"Goal reference triggered, dispatched decomposition task")}return}let s=await R.execute(n,e,{eventId:t.triggerContext?.eventId});d.info({templateName:n.name,executionId:e,status:s.status,steps:s.stepResults.size},"Workflow execution finished")}var i=p("scheduler"),f="ai-hourly-digest";function E(){if(l(f)){i.debug({templateId:f},"Built-in template already exists");return}let t={id:f,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{e as J}from"./chunk-ULTK7RD6.js";import{i as x,j as v,q as b}from"./chunk-6KF7OO2B.js";import{b as y}from"./chunk-K4C43YDD.js";import{a as u}from"./chunk-L7JP7DUO.js";import{p as C}from"./chunk-DVN3BFPP.js";import{c as _,d as l,f as g,h as A}from"./chunk-5XOTPEAK.js";import{d as k}from"./chunk-PG6LMSX6.js";import{o as I,r as W}from"./chunk-HQRUJQN7.js";import{c as p,h as T}from"./chunk-MRTJFYPR.js";T();W();import{v4 as m}from"uuid";import{CronExpressionParser as S}from"cron-parser";T();import{v4 as D}from"uuid";var d=p("scheduler"),R=new J;async function O(n,t={}){let e=t.executionId??D();if(d.info({templateName:n.name,executionId:e,trigger:t.triggerContext},"Dispatching template"),n.goalIds&&n.goalIds.length>0){for(let r of n.goalIds){let o=v(r);if(!o){d.warn({goalId:r,templateId:n.id},"Goal reference not found, skipping");continue}let c=D();x({id:c,name:o.name,description:o.description,roleId:o.roleId,metricType:o.metricType,targetValue:o.targetValue,currentValue:0,deadline:o.deadline,budgetUsd:o.budgetUsd,status:"active",createdAt:Date.now(),sourceSessionId:n.sourceSessionId,deliverTo:n.deliverTo,reportTo:n.reportTo});let a=await b({prompt:`Decompose and execute goal: ${o.name}. ${o.description??""}`,roleId:n.rolePreference??o.roleId,config:{...k()},deliverTo:n.deliverTo,reportTo:n.reportTo,sourceSessionId:n.sourceSessionId,parentId:c,templateId:n.id});if(!a.ok){d.error({templateId:n.id,sourceGoalId:r,newGoalId:c,code:a.code,reason:a.reason},"Decomposition task admission failed");continue}d.info({templateId:n.id,sourceGoalId:r,newGoalId:c,taskId:a.taskId},"Goal reference triggered, dispatched decomposition task")}return}let s=await R.execute(n,e,{eventId:t.triggerContext?.eventId});d.info({templateName:n.name,executionId:e,status:s.status,steps:s.stepResults.size},"Workflow execution finished")}var i=p("scheduler"),f="ai-hourly-digest";function E(){if(l(f)){i.debug({templateId:f},"Built-in template already exists");return}let t={id:f,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)
@@ -1,3 +1,3 @@
1
- import{b as C}from"./chunk-YXYIA24D.js";import{a as p}from"./chunk-L7JP7DUO.js";import{b as D,c as f,d as w}from"./chunk-RLJYEEQC.js";import{c as M,h as U}from"./chunk-MRTJFYPR.js";function O(s,c,n){switch(c){case"wechat":return $(s);case"telegram":return s;case"slack":return P(s);case"webhook":return JSON.stringify({result:s,taskId:n,timestamp:new Date().toISOString()});default:return $(s)}}function $(s){return s.replace(/^#{1,6}\s+/gm,"").replace(/\*\*(.+?)\*\*/g,"$1").replace(/\*(.+?)\*/g,"$1").replace(/__(.+?)__/g,"$1").replace(/_(.+?)_/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/```[\s\S]*?```/g,c=>c.replace(/```\w*\n?/g,"").trim()).replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\n{3,}/g,`
1
+ import{b as C}from"./chunk-GSFLLRS7.js";import{a as p}from"./chunk-L7JP7DUO.js";import{b as D,c as f,d as w}from"./chunk-RZ7LCZVK.js";import{c as M,h as U}from"./chunk-MRTJFYPR.js";function O(s,c,n){switch(c){case"wechat":return $(s);case"telegram":return s;case"slack":return P(s);case"webhook":return JSON.stringify({result:s,taskId:n,timestamp:new Date().toISOString()});default:return $(s)}}function $(s){return s.replace(/^#{1,6}\s+/gm,"").replace(/\*\*(.+?)\*\*/g,"$1").replace(/\*(.+?)\*/g,"$1").replace(/__(.+?)__/g,"$1").replace(/_(.+?)_/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/```[\s\S]*?```/g,c=>c.replace(/```\w*\n?/g,"").trim()).replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/!\[([^\]]*)\]\([^)]+\)/g,"$1").replace(/\n{3,}/g,`
2
2
 
3
- `).trim()}function P(s){return s.replace(/\*\*(.+?)\*\*/g,"*$1*").replace(/\[([^\]]+)\]\(([^)]+)\)/g,"<$2|$1>")}U();import{v4 as T}from"uuid";var x=M("adam"),v=class{_dedupCache=new Map;_rateLimitWindows=new Map;_recentlySentIds=new Set;isRecentlySent(c){return this._recentlySentIds.has(c)}async send(c){let{taskId:n,channelId:a,chatId:m,content:y,messageType:d,platform:E,webhookUrl:h,replyMarkup:I,mediaUrl:S,mediaType:b}=c,R=d!=="reply"&&!!n,r;if(R){r=`${n}:${a??"none"}:${m??"none"}:${d}`;let t=this._dedupCache.get(r);if(t&&Date.now()-t.timestamp<300*1e3)return x.debug({dedupKey:r},"Dedup hit, returning cached log entry"),{success:!0,logEntryId:t.logEntryId}}if(a){let t=Date.now(),i=6e4,o=this._rateLimitWindows.get(a);o||(o=[],this._rateLimitWindows.set(a,o));let u=t-i;for(;o.length>0&&o[0]<u;)o.shift();if(o.length>=60){let l=T();return x.warn({channelId:a,count:o.length},"Rate limited, not sending"),{success:!1,logEntryId:l,error:"rate_limited"}}o.push(t)}let L=E??(a?C(a)?.platform:void 0)??"unknown",k=h?y:O(y,L,n),e=T(),g={id:e,ruleId:void 0,taskId:n??void 0,status:"pending",target:a&&m?{type:"channel",channelId:a,chatId:m}:h?{type:"webhook",webhookUrl:h}:{type:"channel",channelId:a??"",chatId:m??""},content:k,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+1440*60*1e3,source:"direct",messageType:d};D(g),r&&this._dedupCache.set(r,{logEntryId:e,timestamp:Date.now()});try{if(h){let t=await fetch(h,{method:"POST",body:JSON.stringify({result:y,taskId:n,timestamp:new Date().toISOString()}),signal:AbortSignal.timeout(1e4)});if(t.ok)return w(e),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"delivered",messageType:d}),{success:!0,logEntryId:e};{let i=`Webhook returned ${t.status}`;return f(e,"failed",i),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:i,messageType:d}),{success:!1,logEntryId:e,error:i}}}else if(a&&m){let{getChannelManager:t}=await import("./channels-5TFYQN5Z.js"),i=t();if(!i){let l="ChannelManager not available";return f(e,"failed",l),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:l,messageType:d}),{success:!1,logEntryId:e,error:l}}let o={content:k,...I?{replyMarkup:I}:{},...S?{mediaUrl:S}:{},...b?{mediaType:b}:{}},u=await i.sendMessage(a,m,o);if(u===null){let l="Channel adapter send failed (returned null)";return f(e,"failed",l),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:l,messageType:d}),{success:!1,logEntryId:e,error:l}}return u&&(this._recentlySentIds.add(u),setTimeout(()=>this._recentlySentIds.delete(u),300*1e3)),w(e),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"delivered",messageType:d}),{success:!0,messageId:u??void 0,logEntryId:e}}else{let t="No channelId/chatId or webhookUrl provided";return f(e,"failed",t),r&&this._dedupCache.delete(r),{success:!1,logEntryId:e,error:t}}}catch(t){let i=t instanceof Error?t.message:String(t);return f(e,"failed",i),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:i,messageType:d}),{success:!1,logEntryId:e,error:i}}}},_=null;function W(){return _||(_=new v),_}function q(s){return W().isRecentlySent(s)}export{v as a,W as b,q as c};
3
+ `).trim()}function P(s){return s.replace(/\*\*(.+?)\*\*/g,"*$1*").replace(/\[([^\]]+)\]\(([^)]+)\)/g,"<$2|$1>")}U();import{v4 as T}from"uuid";var x=M("adam"),v=class{_dedupCache=new Map;_rateLimitWindows=new Map;_recentlySentIds=new Set;isRecentlySent(c){return this._recentlySentIds.has(c)}async send(c){let{taskId:n,channelId:a,chatId:m,content:y,messageType:d,platform:E,webhookUrl:h,replyMarkup:I,mediaUrl:S,mediaType:b}=c,R=d!=="reply"&&!!n,r;if(R){r=`${n}:${a??"none"}:${m??"none"}:${d}`;let t=this._dedupCache.get(r);if(t&&Date.now()-t.timestamp<300*1e3)return x.debug({dedupKey:r},"Dedup hit, returning cached log entry"),{success:!0,logEntryId:t.logEntryId}}if(a){let t=Date.now(),i=6e4,o=this._rateLimitWindows.get(a);o||(o=[],this._rateLimitWindows.set(a,o));let u=t-i;for(;o.length>0&&o[0]<u;)o.shift();if(o.length>=60){let l=T();return x.warn({channelId:a,count:o.length},"Rate limited, not sending"),{success:!1,logEntryId:l,error:"rate_limited"}}o.push(t)}let L=E??(a?C(a)?.platform:void 0)??"unknown",k=h?y:O(y,L,n),e=T(),g={id:e,ruleId:void 0,taskId:n??void 0,status:"pending",target:a&&m?{type:"channel",channelId:a,chatId:m}:h?{type:"webhook",webhookUrl:h}:{type:"channel",channelId:a??"",chatId:m??""},content:k,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+1440*60*1e3,source:"direct",messageType:d};D(g),r&&this._dedupCache.set(r,{logEntryId:e,timestamp:Date.now()});try{if(h){let t=await fetch(h,{method:"POST",body:JSON.stringify({result:y,taskId:n,timestamp:new Date().toISOString()}),signal:AbortSignal.timeout(1e4)});if(t.ok)return w(e),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"delivered",messageType:d}),{success:!0,logEntryId:e};{let i=`Webhook returned ${t.status}`;return f(e,"failed",i),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:i,messageType:d}),{success:!1,logEntryId:e,error:i}}}else if(a&&m){let{getChannelManager:t}=await import("./channels-SITUUC4J.js"),i=t();if(!i){let l="ChannelManager not available";return f(e,"failed",l),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:l,messageType:d}),{success:!1,logEntryId:e,error:l}}let o={content:k,...I?{replyMarkup:I}:{},...S?{mediaUrl:S}:{},...b?{mediaType:b}:{}},u=await i.sendMessage(a,m,o);if(u===null){let l="Channel adapter send failed (returned null)";return f(e,"failed",l),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:l,messageType:d}),{success:!1,logEntryId:e,error:l}}return u&&(this._recentlySentIds.add(u),setTimeout(()=>this._recentlySentIds.delete(u),300*1e3)),w(e),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"delivered",messageType:d}),{success:!0,messageId:u??void 0,logEntryId:e}}else{let t="No channelId/chatId or webhookUrl provided";return f(e,"failed",t),r&&this._dedupCache.delete(r),{success:!1,logEntryId:e,error:t}}}catch(t){let i=t instanceof Error?t.message:String(t);return f(e,"failed",i),r&&this._dedupCache.delete(r),p.emit({type:"delivery_status_change",logEntryId:e,taskId:n,target:g.target,status:"failed",error:i,messageType:d}),{success:!1,logEntryId:e,error:i}}}},_=null;function W(){return _||(_=new v),_}function q(s){return W().isRecentlySent(s)}export{v as a,W as b,q as c};
@@ -1,4 +1,4 @@
1
- import{b as s,d as o}from"./chunk-NCFVJCNQ.js";o();function i(e){return{id:e.id,ruleId:e.rule_id??void 0,taskId:e.task_id??void 0,status:e.status,target:JSON.parse(e.target),content:e.content,attempts:e.attempts,error:e.error??void 0,createdAt:e.created_at,deliveredAt:e.delivered_at??void 0,expiresAt:e.expires_at,source:e.source,messageType:e.message_type??void 0}}var u=1440*60*1e3;function p(e){s().prepare(`
1
+ import{b as s,d as o}from"./chunk-5EPG2US5.js";o();function i(e){return{id:e.id,ruleId:e.rule_id??void 0,taskId:e.task_id??void 0,status:e.status,target:JSON.parse(e.target),content:e.content,attempts:e.attempts,error:e.error??void 0,createdAt:e.created_at,deliveredAt:e.delivered_at??void 0,expiresAt:e.expires_at,source:e.source,messageType:e.message_type??void 0}}var u=1440*60*1e3;function p(e){s().prepare(`
2
2
  INSERT INTO delivery_log (id, rule_id, task_id, status, target, content,
3
3
  attempts, error, created_at, delivered_at, expires_at, source, message_type)
4
4
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -1,4 +1,4 @@
1
- import{j as ve}from"./chunk-V32YF3J5.js";import{a as st,c as ut,d as ft,e as gt}from"./chunk-DWRYIN5N.js";import{b as ot,c as he,e as it}from"./chunk-TNL2LZB7.js";import{a as pt,c as we,e as mt}from"./chunk-2H7UOW4P.js";import{a as L,b as Je,c as He,d as Ye,e as Qe,f as Ze,h as Xe,i as re,j as q,k as oe,l as et,m as tt,n as V,o as rt,p as $,q as ge}from"./chunk-MDBVKBC7.js";import{a as nt}from"./chunk-IZNEOYRP.js";import{a as Ge,b as Ve,c as te,d as We,e as Be,f as Ke,g as Wt,h as ze,i as C,k as ne}from"./chunk-3LY6PD6A.js";import{b as Oe}from"./chunk-7446ZS6D.js";import{b as x,c as G,d as O}from"./chunk-I7ZZKPHE.js";import{d as be}from"./chunk-YXYIA24D.js";import{c as Fe}from"./chunk-MJSSCKMB.js";import{e as me,f as X,g as je,i as fe,j as ee}from"./chunk-DBP7GPWG.js";import{a as W}from"./chunk-L7JP7DUO.js";import{g as at}from"./chunk-YHVYX3F4.js";import{c as ye,d as B,e as lt,h as dt,i as ct}from"./chunk-GGIHDFRW.js";import{d as _,j as $e}from"./chunk-GSMC3VUM.js";import{f as Ue,g as ue,i as Vt,k as Le,l as I,n as U,o as A,p as qe,q as pe,r as Z}from"./chunk-7ZGSJCX5.js";import{b as D,d as Ne}from"./chunk-NCFVJCNQ.js";import{d as ce,h as Gt}from"./chunk-WBAPIPST.js";import{c as w,d as Me,h as N}from"./chunk-MRTJFYPR.js";import{f as P}from"./chunk-FCV2DPZQ.js";import{createSdkMcpServer as yn,tool as u}from"@anthropic-ai/claude-agent-sdk";import{z as n}from"zod";Z();ee();import{v4 as K}from"uuid";N();var Bt=w("goal-manager");async function br(e){let t;try{let o=JSON.parse(e);t={name:o.name??"",description:o.description,metric:o.metric??"",targetValue:o.targetValue??0,currentValue:o.currentValue??0,deadline:o.deadline??0,budget:o.budget??0,roleId:o.roleId??"engineer",status:"active"}}catch{t=await Kt(e)}let r=zt(t);return{goalState:t,validationResult:r,rawInput:e}}async function Kt(e){let t=`Extract SMART goal fields from this natural language input.
1
+ import{j as we}from"./chunk-M4YI4WVX.js";import{a as at,c as pt,d as gt,e as ht}from"./chunk-AQ3ASS4B.js";import{b as it,c as he,e as st}from"./chunk-NUITL62I.js";import{a as mt,c as Ie,e as ft}from"./chunk-5QZXYKMS.js";import{a as L,b as He,c as Ye,d as Qe,e as Ze,f as Xe,h as et,i as re,j as q,k as oe,l as tt,m as nt,n as W,o as ot,p as $,q as ge}from"./chunk-6KF7OO2B.js";import{a as rt}from"./chunk-IZNEOYRP.js";import{a as Ve,b as We,c as te,d as Be,e as Ke,f as ze,g as Bt,h as Je,i as C,k as ne}from"./chunk-NWMOV23A.js";import{b as Ue}from"./chunk-2L2347UQ.js";import{b as P,c as V,d as O}from"./chunk-K4C43YDD.js";import{d as ve}from"./chunk-GSFLLRS7.js";import{c as Ge}from"./chunk-BCH2HAIM.js";import{e as me,f as X,g as Fe,i as fe,j as ee}from"./chunk-WMB7P64J.js";import{a as B}from"./chunk-L7JP7DUO.js";import{g as lt}from"./chunk-DVN3BFPP.js";import{c as ye,d as j,e as dt,h as ct,i as be,j as ut}from"./chunk-5XOTPEAK.js";import{d as R,j as Me}from"./chunk-GSMC3VUM.js";import{f as Le,g as ue,i as Wt,k as qe,l as I,n as U,o as A,p as je,q as pe,r as Z}from"./chunk-HQRUJQN7.js";import{b as D,d as Oe}from"./chunk-5EPG2US5.js";import{d as ce,h as Vt}from"./chunk-WBAPIPST.js";import{c as w,d as Ne,h as N}from"./chunk-MRTJFYPR.js";import{f as x}from"./chunk-FCV2DPZQ.js";import{createSdkMcpServer as bn,tool as u}from"@anthropic-ai/claude-agent-sdk";import{z as n}from"zod";Z();ee();import{v4 as K}from"uuid";N();var Kt=w("goal-manager");async function wr(e){let t;try{let o=JSON.parse(e);t={name:o.name??"",description:o.description,metric:o.metric??"",targetValue:o.targetValue??0,currentValue:o.currentValue??0,deadline:o.deadline??0,budget:o.budget??0,roleId:o.roleId??"engineer",status:"active"}}catch{t=await zt(e)}let r=Jt(t);return{goalState:t,validationResult:r,rawInput:e}}async function zt(e){let t=`Extract SMART goal fields from this natural language input.
2
2
 
3
3
  Input: "${e}"
4
4
 
@@ -19,7 +19,7 @@ Rules:
19
19
  - targetValue: realistic target for the metric; use 1 for binary goals
20
20
  - deadline_days: reasonable timeframe; default 7 if unclear
21
21
  - budget: estimated cost in USD; default 5 if unclear
22
- - role: match to the nature of work (research=analyst, writing=content_creator, coding=engineer, review=reviewer)`;try{let o=(await nt(t,"You extract structured SMART goal fields from natural language. Reply with only valid JSON.")).match(/\{[\s\S]*\}/);if(o){let i=JSON.parse(o[0]),a=i.deadline_days??7;return{name:(i.name??e.slice(0,100)).slice(0,100),description:i.description??e,metric:i.metric??"completion",targetValue:i.targetValue??1,currentValue:0,deadline:Date.now()+a*24*60*60*1e3,budget:i.budget??5,roleId:i.roleId??"engineer",status:"active"}}}catch(r){Bt.warn({error:r},"LLM goal parsing failed, using fallback")}return{name:e.trim().slice(0,100),description:e.trim(),metric:"completion",targetValue:1,currentValue:0,deadline:Date.now()+10080*60*1e3,budget:5,roleId:"engineer",status:"active"}}function zt(e){let t=[],r=[];return(!e.name||e.name.trim().length===0)&&t.push("S: name must be non-empty"),(!e.description||e.description.trim().length===0)&&t.push("S: description must be non-empty"),(!e.metric||e.metric.trim().length===0)&&t.push("M: metric must be specified"),e.targetValue<=0&&t.push("A: targetValue must be > 0"),(!e.roleId||e.roleId.trim().length===0)&&t.push("R: roleId must be non-empty"),e.deadline<=Date.now()&&t.push("T: deadline must be in the future"),e.budget<=0&&r.push("budget is zero or negative; goal will have no spending limit"),{isValid:t.length===0,errors:t,warnings:r}}function vr(e,t,r){let o=K(),i=Date.now(),a={id:o,name:e.name,description:e.description,roleId:e.roleId,metricType:e.metric,targetValue:e.targetValue,currentValue:e.currentValue,deadline:e.deadline,budgetUsd:e.budget,status:e.status,createdAt:i,deliverTo:t,reportTo:r};return re(a),a}function ht(e,t){let r=Date.now(),o=[],i={id:K(),goalId:e,level:"L0",name:`${t}_goal_progress`,description:`Goal-level ${t} progress (monthly)`,weight:1,calibrationFactor:1,createdAt:r};o.push(i),V(i);let a={id:K(),goalId:e,level:"L1",parentId:i.id,name:`${t}_weekly_trend`,description:`Weekly trend for ${t}`,weight:.8,calibrationFactor:1,createdAt:r};o.push(a),V(a);let l={id:K(),goalId:e,level:"L2",parentId:a.id,name:`${t}_daily_process`,description:`Daily process metric for ${t}`,weight:.6,calibrationFactor:1,createdAt:r};o.push(l),V(l);let d={id:K(),goalId:e,level:"L3",parentId:l.id,name:`${t}_per_task`,description:`Per-task instant metric for ${t}`,weight:.4,calibrationFactor:1,createdAt:r};return o.push(d),V(d),o}var Jt=3,Ht=2,ie=class{static async generateVariants(t,r,o=Jt,i=Ht){let a=$.getTopStrategies(t,r,o);if(a.length===0){let d=`baseline-${r}-v1`;return $.addStrategy(t,r,d,this.generateBaselinePrompt(t,r)),[d]}let l=[];for(let d=0;d<i;d++){let m=a[0].totalTrials+d+1,c=`${r}-evolved-v${m}`,h=a[0].promptTemplate,f=this.mutateTemplate(h);$.addStrategy(t,r,c,f),l.push(c)}return l}static generateBaselinePrompt(t,r){return`You are a ${t} agent specializing in ${r}.
22
+ - role: match to the nature of work (research=analyst, writing=content_creator, coding=engineer, review=reviewer)`;try{let o=(await rt(t,"You extract structured SMART goal fields from natural language. Reply with only valid JSON.")).match(/\{[\s\S]*\}/);if(o){let i=JSON.parse(o[0]),a=i.deadline_days??7;return{name:(i.name??e.slice(0,100)).slice(0,100),description:i.description??e,metric:i.metric??"completion",targetValue:i.targetValue??1,currentValue:0,deadline:Date.now()+a*24*60*60*1e3,budget:i.budget??5,roleId:i.roleId??"engineer",status:"active"}}}catch(r){Kt.warn({error:r},"LLM goal parsing failed, using fallback")}return{name:e.trim().slice(0,100),description:e.trim(),metric:"completion",targetValue:1,currentValue:0,deadline:Date.now()+10080*60*1e3,budget:5,roleId:"engineer",status:"active"}}function Jt(e){let t=[],r=[];return(!e.name||e.name.trim().length===0)&&t.push("S: name must be non-empty"),(!e.description||e.description.trim().length===0)&&t.push("S: description must be non-empty"),(!e.metric||e.metric.trim().length===0)&&t.push("M: metric must be specified"),e.targetValue<=0&&t.push("A: targetValue must be > 0"),(!e.roleId||e.roleId.trim().length===0)&&t.push("R: roleId must be non-empty"),e.deadline<=Date.now()&&t.push("T: deadline must be in the future"),e.budget<=0&&r.push("budget is zero or negative; goal will have no spending limit"),{isValid:t.length===0,errors:t,warnings:r}}function Ir(e,t,r){let o=K(),i=Date.now(),a={id:o,name:e.name,description:e.description,roleId:e.roleId,metricType:e.metric,targetValue:e.targetValue,currentValue:e.currentValue,deadline:e.deadline,budgetUsd:e.budget,status:e.status,createdAt:i,deliverTo:t,reportTo:r};return re(a),a}function yt(e,t){let r=Date.now(),o=[],i={id:K(),goalId:e,level:"L0",name:`${t}_goal_progress`,description:`Goal-level ${t} progress (monthly)`,weight:1,calibrationFactor:1,createdAt:r};o.push(i),W(i);let a={id:K(),goalId:e,level:"L1",parentId:i.id,name:`${t}_weekly_trend`,description:`Weekly trend for ${t}`,weight:.8,calibrationFactor:1,createdAt:r};o.push(a),W(a);let l={id:K(),goalId:e,level:"L2",parentId:a.id,name:`${t}_daily_process`,description:`Daily process metric for ${t}`,weight:.6,calibrationFactor:1,createdAt:r};o.push(l),W(l);let d={id:K(),goalId:e,level:"L3",parentId:l.id,name:`${t}_per_task`,description:`Per-task instant metric for ${t}`,weight:.4,calibrationFactor:1,createdAt:r};return o.push(d),W(d),o}var Ht=3,Yt=2,ie=class{static async generateVariants(t,r,o=Ht,i=Yt){let a=$.getTopStrategies(t,r,o);if(a.length===0){let d=`baseline-${r}-v1`;return $.addStrategy(t,r,d,this.generateBaselinePrompt(t,r)),[d]}let l=[];for(let d=0;d<i;d++){let m=a[0].totalTrials+d+1,c=`${r}-evolved-v${m}`,h=a[0].promptTemplate,f=this.mutateTemplate(h);$.addStrategy(t,r,c,f),l.push(c)}return l}static generateBaselinePrompt(t,r){return`You are a ${t} agent specializing in ${r}.
23
23
 
24
24
  ## Core Focus
25
25
  Complete tasks with high quality.
@@ -31,18 +31,18 @@ Complete tasks with high quality.
31
31
  4. Verify completion against requirements`}static mutateTemplate(t){let r=[this.addProcessEmphasis(),this.addQualityFocus(),this.addVerificationStep()],o=r[Math.floor(Math.random()*r.length)];return`${t}
32
32
 
33
33
  ## Evolution
34
- ${o}`}static addProcessEmphasis(){let t=["Break down complex tasks into smaller steps","Iterate on solutions, testing each component","Document your reasoning at each step"];return`**Process:** ${t[Math.floor(Math.random()*t.length)]}`}static addQualityFocus(){let t=["Double-check all outputs before completing","Consider edge cases and error conditions","Optimize for correctness over speed"];return`**Quality:** ${t[Math.floor(Math.random()*t.length)]}`}static addVerificationStep(){return"**Verification:** After completing, verify your work meets all requirements."}static async generateWithLLM(t,r,o){return{promptTemplate:this.generateBaselinePrompt(t,r),rationale:"Generated baseline - LLM integration in Phase 5"}}};N();ze();import{v4 as T}from"uuid";import{spawnSync as yt}from"child_process";import{createRequire as Yt}from"module";import{dirname as Qt,join as bt}from"path";import{openSync as Zt,readFileSync as Xt,unlinkSync as en}from"fs";var tn=3e4,vt=12e4;function wt(){let t=Yt(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");return bt(Qt(t),"cli.js")}function z(e,t){let r=wt(),o=t?.timeout??tn;if(t?.json){let a=bt("/tmp",`adam-cli-stdout-${process.pid}-${Date.now()}.txt`),l=Zt(a,"w");try{let d=yt("node",[r,...e],{cwd:t.cwd,timeout:o,stdio:["ignore",l,"pipe"],encoding:"utf-8"});if(d.status!==0)throw new Error(d.stderr?.trim()||`CLI exited with status ${d.status}`);return Xt(a,"utf-8")}finally{try{en(a)}catch{}}}let i=yt("node",[r,...e],{cwd:t?.cwd,timeout:o,encoding:"utf-8"});if(i.status!==0)throw new Error(i.stderr?.trim()||`CLI exited with status ${i.status}`);return i.stdout}function It(){let e=z(["plugin","list","--available","--json"],{json:!0});return JSON.parse(e)}function Ie(e,t="user",r){return z(["plugin","install",e,"--scope",t],{cwd:r,timeout:vt})}function ke(e,t,r){let o=["plugin","uninstall",e];return t&&o.push("--scope",t),z(o,{cwd:r,timeout:vt})}function kt(e,t){return z(["plugin","enable",e])}function Tt(e,t){return z(["plugin","disable",e])}function Dr(){try{return!!wt()}catch{return!1}}Ne();import{v4 as rn}from"uuid";function on(e){return{id:e.id,eventDefId:e.event_def_id??void 0,occurredAt:e.occurred_at,ingestedAt:e.ingested_at,userDay:e.user_day??void 0,source:e.source,type:e.type,payload:JSON.parse(e.payload),confidence:e.confidence,dedupKey:e.dedup_key,relatedEntities:e.related_entities??void 0,trustLevel:e.trust_level}}function St(e){let t=D(),r=e.id??rn(),o=new Date().toISOString();return t.prepare(`
34
+ ${o}`}static addProcessEmphasis(){let t=["Break down complex tasks into smaller steps","Iterate on solutions, testing each component","Document your reasoning at each step"];return`**Process:** ${t[Math.floor(Math.random()*t.length)]}`}static addQualityFocus(){let t=["Double-check all outputs before completing","Consider edge cases and error conditions","Optimize for correctness over speed"];return`**Quality:** ${t[Math.floor(Math.random()*t.length)]}`}static addVerificationStep(){return"**Verification:** After completing, verify your work meets all requirements."}static async generateWithLLM(t,r,o){return{promptTemplate:this.generateBaselinePrompt(t,r),rationale:"Generated baseline - LLM integration in Phase 5"}}};N();Je();import{v4 as T}from"uuid";import{spawnSync as bt}from"child_process";import{createRequire as Qt}from"module";import{dirname as Zt,join as vt}from"path";import{openSync as Xt,readFileSync as en,unlinkSync as tn}from"fs";var nn=3e4,wt=12e4;function It(){let t=Qt(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");return vt(Zt(t),"cli.js")}function z(e,t){let r=It(),o=t?.timeout??nn;if(t?.json){let a=vt("/tmp",`adam-cli-stdout-${process.pid}-${Date.now()}.txt`),l=Xt(a,"w");try{let d=bt("node",[r,...e],{cwd:t.cwd,timeout:o,stdio:["ignore",l,"pipe"],encoding:"utf-8"});if(d.status!==0)throw new Error(d.stderr?.trim()||`CLI exited with status ${d.status}`);return en(a,"utf-8")}finally{try{tn(a)}catch{}}}let i=bt("node",[r,...e],{cwd:t?.cwd,timeout:o,encoding:"utf-8"});if(i.status!==0)throw new Error(i.stderr?.trim()||`CLI exited with status ${i.status}`);return i.stdout}function kt(){let e=z(["plugin","list","--available","--json"],{json:!0});return JSON.parse(e)}function ke(e,t="user",r){return z(["plugin","install",e,"--scope",t],{cwd:r,timeout:wt})}function Te(e,t,r){let o=["plugin","uninstall",e];return t&&o.push("--scope",t),z(o,{cwd:r,timeout:wt})}function Tt(e,t){return z(["plugin","enable",e])}function St(e,t){return z(["plugin","disable",e])}function Cr(){try{return!!It()}catch{return!1}}Oe();import{v4 as on}from"uuid";function sn(e){return{id:e.id,eventDefId:e.event_def_id??void 0,occurredAt:e.occurred_at,ingestedAt:e.ingested_at,userDay:e.user_day??void 0,source:e.source,type:e.type,payload:JSON.parse(e.payload),confidence:e.confidence,dedupKey:e.dedup_key,relatedEntities:e.related_entities??void 0,trustLevel:e.trust_level}}function _t(e){let t=D(),r=e.id??on(),o=new Date().toISOString();return t.prepare(`
35
35
  INSERT OR IGNORE INTO events
36
36
  (id, event_def_id, occurred_at, ingested_at, user_day, source, type, payload, confidence, dedup_key, related_entities, trust_level)
37
37
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
38
- `).run(r,e.eventDefId??null,e.occurredAt??o,o,e.userDay??null,e.source,e.type,JSON.stringify(e.payload),e.confidence??1,e.dedupKey,e.relatedEntities??null,e.trustLevel??"trusted").changes===0?{inserted:!1,id:t.prepare("SELECT id FROM events WHERE source = ? AND dedup_key = ?").get(e.source,e.dedupKey)?.id??r}:{inserted:!0,id:r}}function Rt(e={}){let t=D(),r="SELECT * FROM events WHERE 1=1",o=[];e.eventDefId!==void 0&&(r+=" AND event_def_id = ?",o.push(e.eventDefId)),e.typePattern!==void 0&&(r+=" AND type LIKE ?",o.push(e.typePattern)),e.since!==void 0&&(r+=" AND occurred_at >= ?",o.push(e.since)),e.until!==void 0&&(r+=" AND occurred_at <= ?",o.push(e.until)),r+=" ORDER BY occurred_at DESC";let i=Math.min(e.limit??50,500);return r+=` LIMIT ${i}`,e.offset!==void 0&&(r+=` OFFSET ${e.offset}`),t.prepare(r).all(...o).map(on)}Ne();function _t(e){return{id:e.id,name:e.name,sourceType:e.source_type,sourceConfig:JSON.parse(e.source_config),enabled:e.enabled===1,description:e.description??void 0,createdAt:e.created_at,updatedAt:e.updated_at}}function Dt(e){let t=D(),r=Date.now();return t.prepare(`
38
+ `).run(r,e.eventDefId??null,e.occurredAt??o,o,e.userDay??null,e.source,e.type,JSON.stringify(e.payload),e.confidence??1,e.dedupKey,e.relatedEntities??null,e.trustLevel??"trusted").changes===0?{inserted:!1,id:t.prepare("SELECT id FROM events WHERE source = ? AND dedup_key = ?").get(e.source,e.dedupKey)?.id??r}:{inserted:!0,id:r}}function Rt(e={}){let t=D(),r="SELECT * FROM events WHERE 1=1",o=[];e.eventDefId!==void 0&&(r+=" AND event_def_id = ?",o.push(e.eventDefId)),e.typePattern!==void 0&&(r+=" AND type LIKE ?",o.push(e.typePattern)),e.since!==void 0&&(r+=" AND occurred_at >= ?",o.push(e.since)),e.until!==void 0&&(r+=" AND occurred_at <= ?",o.push(e.until)),r+=" ORDER BY occurred_at DESC";let i=Math.min(e.limit??50,500);return r+=` LIMIT ${i}`,e.offset!==void 0&&(r+=` OFFSET ${e.offset}`),t.prepare(r).all(...o).map(sn)}Oe();function Dt(e){return{id:e.id,name:e.name,sourceType:e.source_type,sourceConfig:JSON.parse(e.source_config),enabled:e.enabled===1,description:e.description??void 0,createdAt:e.created_at,updatedAt:e.updated_at}}function Et(e){let t=D(),r=Date.now();return t.prepare(`
39
39
  INSERT INTO event_defs (id, name, source_type, source_config, enabled, description, created_at, updated_at)
40
40
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
41
- `).run(e.id,e.name,e.sourceType,JSON.stringify(e.sourceConfig),e.enabled?1:0,e.description??null,r,r),{...e,createdAt:r,updatedAt:r}}function j(e){let r=D().prepare("SELECT * FROM event_defs WHERE id = ?").get(e);return r?_t(r):void 0}function se(e={}){let t=D(),r="SELECT * FROM event_defs WHERE 1=1",o=[];return e.sourceType!==void 0&&(r+=" AND source_type = ?",o.push(e.sourceType)),e.enabled!==void 0&&(r+=" AND enabled = ?",o.push(e.enabled?1:0)),r+=" ORDER BY created_at DESC",t.prepare(r).all(...o).map(_t)}function Te(e,t){let r=D(),o=j(e);if(!o)return;let i={...o,...t,updatedAt:Date.now()};return r.prepare(`
41
+ `).run(e.id,e.name,e.sourceType,JSON.stringify(e.sourceConfig),e.enabled?1:0,e.description??null,r,r),{...e,createdAt:r,updatedAt:r}}function F(e){let r=D().prepare("SELECT * FROM event_defs WHERE id = ?").get(e);return r?Dt(r):void 0}function se(e={}){let t=D(),r="SELECT * FROM event_defs WHERE 1=1",o=[];return e.sourceType!==void 0&&(r+=" AND source_type = ?",o.push(e.sourceType)),e.enabled!==void 0&&(r+=" AND enabled = ?",o.push(e.enabled?1:0)),r+=" ORDER BY created_at DESC",t.prepare(r).all(...o).map(Dt)}function Se(e,t){let r=D(),o=F(e);if(!o)return;let i={...o,...t,updatedAt:Date.now()};return r.prepare(`
42
42
  UPDATE event_defs
43
43
  SET name = ?, source_type = ?, source_config = ?, enabled = ?, description = ?, updated_at = ?
44
44
  WHERE id = ?
45
- `).run(i.name,i.sourceType,JSON.stringify(i.sourceConfig),i.enabled?1:0,i.description??null,i.updatedAt,e),i}function Se(e){return D().prepare("DELETE FROM event_defs WHERE id = ?").run(e).changes>0}import{CronExpressionParser as sn}from"cron-parser";import{v4 as an}from"uuid";function M(e){let{emitPayload:t,...r}=e,o=St(r);return o.inserted?(e.eventDefId&&W.emit({type:"event_fired",eventDefId:e.eventDefId,eventId:o.id,payload:t??e.payload}),{inserted:!0,id:o.id}):{inserted:!1,id:o.id}}N();var Et=w("scheduler"),ae=new Map;function Ct(e,t){let r=t.next(),o=Math.max(r.getTime()-Date.now(),1e3),i=setTimeout(async()=>{try{let a=an(),l=e.sourceConfig.payload_template??{},d={triggered_at:new Date().toISOString(),...l};M({id:a,eventDefId:e.id,type:"scheduler.tick",source:"adam-internal",dedupKey:`cron-${e.id}-${Date.now()}`,payload:d,occurredAt:new Date().toISOString(),trustLevel:"trusted"})}catch(a){Et.error({defId:e.id,err:a},"cron handler failed")}ae.has(e.id)&&Ct(e,t)},o);ae.set(e.id,i)}function Pt(e){if(!e.enabled)return;let t=sn.parse(e.sourceConfig.cron);Ct(e,t),Et.info({defId:e.id,defName:e.name},"Cron source started")}function xt(e){let t=ae.get(e);t&&(clearTimeout(t),ae.delete(e))}Gt();import{watch as ln}from"fs";import{statSync as dn,realpathSync as cn}from"fs";import{homedir as un}from"os";import{join as At,extname as pn}from"path";import{createHash as mn}from"crypto";N();var J=w("scheduler"),Re=new Map;function fn(e){let t;try{t=cn(e)}catch{throw new Error(`Watch path does not exist: ${e}`)}let r=un();if(!t.startsWith(r)&&!t.startsWith(ce))throw new Error(`Watch path must be within ${r} or ${ce}: ${e}`)}function $t(e){if(!e.enabled)return;let t=e.sourceConfig;fn(t.path);let r=t.stability_delay_ms??5e3,o=t.glob,i={watcher:null,stopped:!1,stabilityTimer:null,pendingEvents:new Map},a=(l,d)=>{if(!l||i.stopped||o&&!gn(l,o))return;let m=At(t.path,l),c=0,h=Date.now();try{let f=dn(m);c=f.size,h=f.mtimeMs}catch{return}i.pendingEvents.set(l,{mtime:h,size:c}),i.stabilityTimer&&clearTimeout(i.stabilityTimer),i.stabilityTimer=setTimeout(()=>{if(!i.stopped){for(let[f,g]of i.pendingEvents)try{let b=At(t.path,f),S=mn("sha256").update(`dir-${e.id}-${b}-${g.mtime}`).digest("hex").slice(0,16);M({id:S,eventDefId:e.id,type:"filesystem.file.created",source:`dir-${e.id}`,dedupKey:`dir-${e.id}-${b}-${g.mtime}`,payload:{file_path:b,mtime:g.mtime,size:g.size},occurredAt:new Date(g.mtime).toISOString(),trustLevel:"trusted"})}catch(b){J.warn({file:f,err:b},"Failed to fire directory watch event")}i.pendingEvents.clear()}},r)};try{i.watcher=ln(t.path,{persistent:!1},(l,d)=>{a(d,l)}),i.watcher.on("error",l=>{J.warn({defId:e.id,err:l},"fs.watch error, removing watcher"),_e(e.id)}),Re.set(e.id,i),J.info({defId:e.id,defName:e.name,path:t.path},"Directory watch started")}catch(l){throw J.error({defId:e.id,err:l},"Failed to start directory watch"),l}}function _e(e){let t=Re.get(e);if(t){t.stopped=!0,t.stabilityTimer&&clearTimeout(t.stabilityTimer);try{t.watcher.close()}catch{}Re.delete(e),J.info({defId:e},"Directory watch stopped")}}function gn(e,t){if(t.startsWith("*.")){let r=t.slice(1);return pn(e)===r}return e===t}import{v4 as Mt}from"uuid";function De(e,t){if(!e.enabled)throw new Error(`Event def '${e.id}' is disabled`);let r=Mt();return M({id:r,eventDefId:e.id,type:"manual.fire",source:"manual",dedupKey:`manual-${e.id}-${Date.now()}`,payload:t??{},occurredAt:new Date().toISOString(),trustLevel:"trusted"}),{eventId:r}}function Ee(e,t){let r=Mt(),o=Date.now(),i=Math.random().toString(36).slice(2,10);return M({id:r,eventDefId:e.id,type:"manual.test.fire",source:`manual-test-${e.id}`,dedupKey:`manual-test-${e.id}-${o}-${i}`,payload:t??{},occurredAt:new Date().toISOString(),trustLevel:"trusted"}),{eventId:r}}N();var Ce=w("scheduler");function Pe(e){if(e.enabled)switch(e.sourceType){case"cron":Pt(e);break;case"directory_watch":$t(e);break;case"webhook":break;case"manual":break;default:Ce.warn({defId:e.id,sourceType:e.sourceType},"Unknown source type, skipping")}}function le(e,t){switch(t){case"cron":xt(e);break;case"directory_watch":_e(e);break;case"webhook":case"manual":break;default:Ce.warn({defId:e,sourceType:t},"Unknown source type, nothing to stop")}}async function oo(){let e=se({});for(let t of e)t.enabled&&le(t.id,t.sourceType);Ce.info("All event source handlers stopped")}import{z as k}from"zod/v4";var Nt={webhook:k.object({}).strict(),manual:k.object({}).strict(),cron:k.object({cron:k.string().min(1,"cron expression required"),payload_template:k.record(k.string(),k.unknown()).optional()}).strict(),directory_watch:k.object({path:k.string().min(1,"watch path required"),glob:k.string().optional(),stability_delay_ms:k.number().int().positive().optional()}).strict()};function H(){return Object.keys(Nt)}function hn(e){return Nt[e]}function xe(e,t){let r=hn(e);if(!r)return{ok:!1,error:`Unknown sourceType: '${e}'. Known: ${H().join(", ")}`};let o=r.safeParse(t??{});return o.success?{ok:!0,data:o.data}:{ok:!1,error:k.prettifyError(o.error)}}N();import*as Ot from"crypto";var Y=w("api"),Q=class{cancelTask(t){let r=x(t);r&&(G(t,{status:"cancelled",completedAt:Date.now()}),W.emit({type:"task_status_change",taskId:t,oldStatus:r.status,newStatus:"cancelled"}),Y.debug({taskId:t,oldStatus:r.status},"Task cancelled"))}resolveApproval(t,r,o){return Y.debug({approvalId:t,action:r,reason:o},"Approval resolved (no-op in Pure C)"),!0}resolvePlanApproval(t,r,o,i){let a=ot(t);if(!a)return Y.warn({planId:t},"Plan not found or already resolved"),!1;let l=x(a.taskId);return l?(it(t,r==="allow"?"approved":"denied",o),r==="allow"&&o==="permanent"&&st({id:Ot.randomUUID(),roleId:a.roleId,taskPattern:l.prompt.slice(0,100).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),maxRiskLevel:a.plan.overallRisk,createdAt:Date.now(),createdByTaskId:l.id}),W.emit({type:"plan_approval_decision",taskId:l.id,planId:t,decision:r,approvalType:o,reason:i}),Y.debug({planId:t,decision:r,approvalType:o},"Plan approval resolved"),!0):(Y.warn({planId:t},"Task not found for plan"),!1)}};import{existsSync as Ut}from"fs";Vt();var F=w("manager");function s(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}function bn(e){let t=e.parameters?Object.entries(e.parameters).map(([o,i])=>`- ${o}: ${i.description}`).join(`
45
+ `).run(i.name,i.sourceType,JSON.stringify(i.sourceConfig),i.enabled?1:0,i.description??null,i.updatedAt,e),i}function _e(e){return D().prepare("DELETE FROM event_defs WHERE id = ?").run(e).changes>0}import{CronExpressionParser as an}from"cron-parser";import{v4 as ln}from"uuid";function M(e){let{emitPayload:t,...r}=e,o=_t(r);return o.inserted?(e.eventDefId&&B.emit({type:"event_fired",eventDefId:e.eventDefId,eventId:o.id,payload:t??e.payload}),{inserted:!0,id:o.id}):{inserted:!1,id:o.id}}N();var Ct=w("scheduler"),ae=new Map;function xt(e,t){let r=t.next(),o=Math.max(r.getTime()-Date.now(),1e3),i=setTimeout(async()=>{try{let a=ln(),l=e.sourceConfig.payload_template??{},d={triggered_at:new Date().toISOString(),...l};M({id:a,eventDefId:e.id,type:"scheduler.tick",source:"adam-internal",dedupKey:`cron-${e.id}-${Date.now()}`,payload:d,occurredAt:new Date().toISOString(),trustLevel:"trusted"})}catch(a){Ct.error({defId:e.id,err:a},"cron handler failed")}ae.has(e.id)&&xt(e,t)},o);ae.set(e.id,i)}function Pt(e){if(!e.enabled)return;let t=an.parse(e.sourceConfig.cron);xt(e,t),Ct.info({defId:e.id,defName:e.name},"Cron source started")}function At(e){let t=ae.get(e);t&&(clearTimeout(t),ae.delete(e))}Vt();import{watch as dn}from"fs";import{statSync as cn,realpathSync as un}from"fs";import{homedir as pn}from"os";import{join as $t,extname as mn}from"path";import{createHash as fn}from"crypto";N();var J=w("scheduler"),Re=new Map;function gn(e){let t;try{t=un(e)}catch{throw new Error(`Watch path does not exist: ${e}`)}let r=pn();if(!t.startsWith(r)&&!t.startsWith(ce))throw new Error(`Watch path must be within ${r} or ${ce}: ${e}`)}function Mt(e){if(!e.enabled)return;let t=e.sourceConfig;gn(t.path);let r=t.stability_delay_ms??5e3,o=t.glob,i={watcher:null,stopped:!1,stabilityTimer:null,pendingEvents:new Map},a=(l,d)=>{if(!l||i.stopped||o&&!hn(l,o))return;let m=$t(t.path,l),c=0,h=Date.now();try{let f=cn(m);c=f.size,h=f.mtimeMs}catch{return}i.pendingEvents.set(l,{mtime:h,size:c}),i.stabilityTimer&&clearTimeout(i.stabilityTimer),i.stabilityTimer=setTimeout(()=>{if(!i.stopped){for(let[f,g]of i.pendingEvents)try{let b=$t(t.path,f),S=fn("sha256").update(`dir-${e.id}-${b}-${g.mtime}`).digest("hex").slice(0,16);M({id:S,eventDefId:e.id,type:"filesystem.file.created",source:`dir-${e.id}`,dedupKey:`dir-${e.id}-${b}-${g.mtime}`,payload:{file_path:b,mtime:g.mtime,size:g.size},occurredAt:new Date(g.mtime).toISOString(),trustLevel:"trusted"})}catch(b){J.warn({file:f,err:b},"Failed to fire directory watch event")}i.pendingEvents.clear()}},r)};try{i.watcher=dn(t.path,{persistent:!1},(l,d)=>{a(d,l)}),i.watcher.on("error",l=>{J.warn({defId:e.id,err:l},"fs.watch error, removing watcher"),De(e.id)}),Re.set(e.id,i),J.info({defId:e.id,defName:e.name,path:t.path},"Directory watch started")}catch(l){throw J.error({defId:e.id,err:l},"Failed to start directory watch"),l}}function De(e){let t=Re.get(e);if(t){t.stopped=!0,t.stabilityTimer&&clearTimeout(t.stabilityTimer);try{t.watcher.close()}catch{}Re.delete(e),J.info({defId:e},"Directory watch stopped")}}function hn(e,t){if(t.startsWith("*.")){let r=t.slice(1);return mn(e)===r}return e===t}import{v4 as Nt}from"uuid";function Ee(e,t){if(!e.enabled)throw new Error(`Event def '${e.id}' is disabled`);let r=Nt();return M({id:r,eventDefId:e.id,type:"manual.fire",source:"manual",dedupKey:`manual-${e.id}-${Date.now()}`,payload:t??{},occurredAt:new Date().toISOString(),trustLevel:"trusted"}),{eventId:r}}function Ce(e,t){let r=Nt(),o=Date.now(),i=Math.random().toString(36).slice(2,10);return M({id:r,eventDefId:e.id,type:"manual.test.fire",source:`manual-test-${e.id}`,dedupKey:`manual-test-${e.id}-${o}-${i}`,payload:t??{},occurredAt:new Date().toISOString(),trustLevel:"trusted"}),{eventId:r}}N();var xe=w("scheduler");function Pe(e){if(e.enabled)switch(e.sourceType){case"cron":Pt(e);break;case"directory_watch":Mt(e);break;case"webhook":break;case"manual":break;default:xe.warn({defId:e.id,sourceType:e.sourceType},"Unknown source type, skipping")}}function le(e,t){switch(t){case"cron":At(e);break;case"directory_watch":De(e);break;case"webhook":case"manual":break;default:xe.warn({defId:e,sourceType:t},"Unknown source type, nothing to stop")}}async function so(){let e=se({});for(let t of e)t.enabled&&le(t.id,t.sourceType);xe.info("All event source handlers stopped")}import{z as k}from"zod/v4";var Ot={webhook:k.object({}).strict(),manual:k.object({}).strict(),cron:k.object({cron:k.string().min(1,"cron expression required"),payload_template:k.record(k.string(),k.unknown()).optional()}).strict(),directory_watch:k.object({path:k.string().min(1,"watch path required"),glob:k.string().optional(),stability_delay_ms:k.number().int().positive().optional()}).strict()};function H(){return Object.keys(Ot)}function yn(e){return Ot[e]}function Ae(e,t){let r=yn(e);if(!r)return{ok:!1,error:`Unknown sourceType: '${e}'. Known: ${H().join(", ")}`};let o=r.safeParse(t??{});return o.success?{ok:!0,data:o.data}:{ok:!1,error:k.prettifyError(o.error)}}N();import*as Ut from"crypto";var Y=w("api"),Q=class{cancelTask(t){let r=P(t);r&&(V(t,{status:"cancelled",completedAt:Date.now()}),B.emit({type:"task_status_change",taskId:t,oldStatus:r.status,newStatus:"cancelled"}),Y.debug({taskId:t,oldStatus:r.status},"Task cancelled"))}resolveApproval(t,r,o){return Y.debug({approvalId:t,action:r,reason:o},"Approval resolved (no-op in Pure C)"),!0}resolvePlanApproval(t,r,o,i){let a=it(t);if(!a)return Y.warn({planId:t},"Plan not found or already resolved"),!1;let l=P(a.taskId);return l?(st(t,r==="allow"?"approved":"denied",o),r==="allow"&&o==="permanent"&&at({id:Ut.randomUUID(),roleId:a.roleId,taskPattern:l.prompt.slice(0,100).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),maxRiskLevel:a.plan.overallRisk,createdAt:Date.now(),createdByTaskId:l.id}),B.emit({type:"plan_approval_decision",taskId:l.id,planId:t,decision:r,approvalType:o,reason:i}),Y.debug({planId:t,decision:r,approvalType:o},"Plan approval resolved"),!0):(Y.warn({planId:t},"Task not found for plan"),!1)}};import{existsSync as Lt}from"fs";Wt();var G=w("manager");function s(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}function vn(e){let t=e.parameters?Object.entries(e.parameters).map(([o,i])=>`- ${o}: ${i.description}`).join(`
46
46
  `):"",r=t?`
47
47
  ## Inputs
48
48
  ${t}
@@ -53,7 +53,7 @@ description: ${e.description}
53
53
  ${r}
54
54
  ## Instructions
55
55
  ${e.instructions}
56
- `}async function R(e){let{listChannels:t}=await import("./channels-J4STJ4X2.js"),r=t(),{listSessions:o}=await import("./session-manager-LZ77OT7A.js"),i=[...o("active"),...o("archived")],a=[];for(let l of e)if(l.type==="session"&&l.sessionId)a.push({type:"session",sessionId:l.sessionId});else if(l.type==="channel"){let d=l.channelId,m=l.chatId;if(!d&&l.channelName){let c=r.find(h=>h.name.toLowerCase().includes(l.channelName.toLowerCase()));c&&(d=c.id)}if(d&&!m){let c=i.find(h=>h.source.type==="channel"&&h.source.channelId===d&&h.source.chatId);c?.source.chatId?m=c.source.chatId:m=r.find(f=>f.id===d)?.config?.userId}d&&m?a.push({type:"channel",channelId:d,chatId:m}):F.warn({channelName:l.channelName,channelId:d,chatId:m},"Could not resolve channel notify target")}return a}async function vn(e){let{listRoles:t}=await import("./roles-KYXNMO5H.js"),r=t(void 0,100,0);for(let o of r)if(o.name.toLowerCase().includes(e.toLowerCase()))return o.id}var wn={goalId:n.string()},In={goalId:n.string(),status:n.string().optional(),currentValue:n.number().optional(),budgetUsd:n.number().optional(),notes:n.string().optional()},kn={goalId:n.string(),goalDescription:n.string(),maxSubtasks:n.number().optional()},E=n.union([n.object({type:n.literal("session"),sessionId:n.string()}),n.object({type:n.literal("channel"),channelName:n.string()}),n.object({type:n.literal("channel"),channelId:n.string(),chatId:n.string().optional()})]),Tn={prompt:n.string(),roleId:n.string().optional().describe("Role ID. Call list_roles(requirements) first to find the best role for the task."),requirements:L.optional(),autoSelectRole:n.boolean().optional(),deliverTo:n.array(E).optional().describe("Where to deliver the task output (result full text). E.g., send result to a specific channel."),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary). Defaults to the originating channel/session."),toolOverrides:n.object({allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional()}).optional()},Sn={taskId:n.string(),goalId:n.string().optional(),strategyId:n.string().optional()},Rn={roleId:n.string(),taskType:n.string(),name:n.string().optional()},_n={status:n.string().optional(),limit:n.number().optional()},Dn={taskId:n.string(),roleId:n.string()},En={taskId:n.string().optional(),status:n.string().optional(),limit:n.number().optional()},Cn={roleId:n.string(),allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional(),osCapabilities:n.array(n.object({id:n.string().min(1),targets:n.array(n.string().min(1)).optional()})).optional().describe("Role-level OS capability grants. Use get_capabilities to inspect the runtime registry and valid target-scoped entries."),additionalDirectories:n.array(n.object({path:n.string(),mode:n.enum(["ro","rw"]).optional().describe("Read-only or read-write access. Default: rw. Enforced by OS sandbox."),inheritPlugins:n.boolean().optional(),inheritMcp:n.boolean().optional(),inheritPermissions:n.boolean().optional()})).optional(),allowedChannels:n.array(n.string()).optional(),inheritUserSettings:n.boolean().optional().describe("Enable/disable inheriting user-level settings (global plugins, MCP servers). Default: false (isolated).")},Pn={roleId:n.string().describe("Role ID to update."),name:n.string().min(1).optional(),cagPrompt:n.string().optional(),learnedRules:n.array(n.string()).optional(),status:n.enum(["active","inactive","retired"]).optional(),executionMode:n.enum(["isolated","inline"]).optional(),model:n.string().optional(),maxBudgetUsd:n.number().optional(),approvalRequired:n.array(n.string()).optional(),preferences:n.object({model:n.string().optional(),effort:n.enum(["low","medium","high","max"]).optional(),maxTurns:n.number().optional()}).optional(),permissionMode:n.enum(["default","acceptEdits","dontAsk","bypassPermissions","plan","auto"]).optional(),allowedBashPatterns:n.array(n.string()).optional(),deniedBashPatterns:n.array(n.string()).optional(),evaluationCriteria:n.record(n.string(),n.number()).optional(),envVars:n.record(n.string(),n.string()).optional()},xn={roleId:n.string().optional(),limit:n.number().optional()},An={name:n.string(),cagPrompt:n.string(),traits:n.array(n.string()).optional(),allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional(),osCapabilities:n.array(n.object({id:n.string().min(1),targets:n.array(n.string().min(1)).optional()})).optional().describe("Initial Role-level OS capability grants. Use get_capabilities to discover editable capability ids and target rules."),additionalDirectories:n.array(n.object({path:n.string(),mode:n.enum(["ro","rw"]).optional().describe("Read-only or read-write access. Default: rw. Enforced by OS sandbox."),inheritPlugins:n.boolean().optional(),inheritMcp:n.boolean().optional(),inheritPermissions:n.boolean().optional()})).optional()},$n={roleId:n.string(),reason:n.string().optional()},Mn={name:n.string(),description:n.string().optional(),roleId:n.string().optional(),metric:n.string().optional(),targetValue:n.number().optional(),deadline:n.number().optional(),budgetUsd:n.number().optional(),deliverTo:n.array(E).optional().describe("Where to deliver goal completion notifications.")},Nn={name:n.string(),description:n.string().optional(),triggerType:n.enum(["cron","template_complete","workflow_complete","event"]),triggerCron:n.string().optional(),triggerEvent:n.string().optional().describe("For triggerType=template_complete: 'template_complete:<templateId>'. For workflow_complete: 'workflow_complete:<templateId>'. For cron/event: unused."),eventDefId:n.string().uuid().optional().describe("Required when triggerType='event'. Event def to bind this template to. Use list_event_defs to find or create_event_def to create one."),prompt:n.string(),roleId:n.string().optional(),requirements:L.optional(),autoSelectRole:n.boolean().optional(),enabled:n.boolean().optional(),goalIds:n.array(n.string()).optional(),deliverTo:n.array(E).optional().describe("Where to deliver the task output (result full text)."),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary).")},On={status:n.enum(["active","retired","probation"]).optional(),limit:n.number().optional(),requirements:L.optional()},Un={enabled:n.boolean().optional()},Ln={},qn={},jn={prompt:n.string().describe("The task prompt to execute after the delay"),delayMinutes:n.number().optional().describe("Minutes from now to execute (e.g., 30 for 'half an hour later')"),runAt:n.string().optional().describe("ISO 8601 timestamp to execute at (e.g., '2026-04-01T15:00:00+08:00')"),roleId:n.string().describe("Role ID to assign the task to. Call list_roles first."),deliverTo:n.array(E).optional().describe("Where to deliver the task output (result full text)."),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary).")},Fn={roleId:n.string().optional().describe("If provided, shows which plugins are installed in that role's workspace.")},Gn={roleId:n.string().describe("Role ID to install the plugin under (project-scope)."),pluginId:n.string().describe("Plugin ID (e.g. 'github@anthropic'). Use list_available_plugins to discover available plugins.")},Vn={roleId:n.string().describe("Role ID to uninstall the plugin from."),pluginId:n.string().describe("Plugin ID to uninstall.")},Wn={roleId:n.string().describe("Role ID to bind the MCP server to."),mcpName:n.string().describe("Name for this MCP server (e.g., 'github', 'filesystem')."),mcpConfig:n.record(n.string(),n.unknown()).describe("MCP server configuration object.")},Bn={roleId:n.string().describe("Role ID to unbind the MCP server from."),mcpName:n.string().describe("Name of the MCP server to remove.")},Kn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},zn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Jn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Hn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Yn={},Qn={},Zn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Xn={roleId:n.string().describe("Role ID to associate scanned plugins with."),path:n.string().describe("Directory path to scan for .claude/settings.json.")},er={taskId:n.string().describe("Task ID to cancel.")},tr={taskId:n.string().describe("Task ID to get logs for."),limit:n.number().optional().describe("Max log entries (default 20).")},nr={roleId:n.string().describe("Role ID to delete.")},rr={},or={updates:n.record(n.string(),n.unknown()).describe("Config key-value pairs to update. Example: { 'defaults.maxTurns': 50, 'logging.level': 'debug' }")},ir={roleId:n.string().describe("Role ID to list memories for."),limit:n.number().optional().describe("Max results (default 20).")},sr={templateId:n.string().describe("Template ID to update."),name:n.string().optional(),enabled:n.boolean().optional(),prompt:n.string().optional(),triggerType:n.enum(["cron","template_complete","workflow_complete","event"]).optional().describe("Explicit trigger type. Required when updating trigger settings."),triggerCron:n.string().optional(),triggerEvent:n.string().optional().describe("For template_complete: 'template_complete:<templateId>'. For workflow_complete: 'workflow_complete:<templateId>'. Unused for cron/event."),eventDefId:n.string().uuid().optional().describe("Required when triggerType='event'. The event def UUID to bind this template to."),roleId:n.string().optional(),autoSelectRole:n.boolean().optional().describe("Step-level: if true, Adam picks the best-fit role at dispatch time. Write to the single-step template's step."),requirements:L.optional().describe("Step-level: required when autoSelectRole=true. Fields: tools, paths, osCapabilities, network, plugins.")},ar={templateId:n.string().describe("Template ID to delete.")},lr={templateId:n.string().describe("Template ID to run immediately.")},dr={enabled:n.boolean().optional().describe("Filter by enabled status.")},cr={eventType:n.string().describe("Event type that triggers this rule (e.g., 'task_complete')."),channelId:n.string().describe("Channel ID to deliver to."),format:n.string().optional().describe("Format template (e.g., 'summary', 'full'). Default: 'summary'."),matchCriteria:n.record(n.string(),n.unknown()).optional().describe("JSON match criteria for event fields."),enabled:n.boolean().optional().describe("Enable this rule immediately (default true).")},ur={ruleId:n.string().describe("Delivery rule ID to delete.")},pr={roleId:n.string().optional().describe("Role ID to filter strategies by.")},Lt=[u("read_goal_state","Read a single goal's detailed state: progress percentage, time remaining, budget spent, and current value. Use this for deep-dive on one goal; use list_goals for an overview of all goals.",wn,async e=>{let t=q(e.goalId);if(!t)return s({error:"Goal not found"});let r=Date.now(),o=t.targetValue>0?t.currentValue/t.targetValue:0;return s({id:t.id,name:t.name,description:t.description,roleId:t.roleId,metricType:t.metricType,targetValue:t.targetValue,currentValue:t.currentValue,deadline:t.deadline,budgetUsd:t.budgetUsd,status:t.status,progress:o,timeRemainingMs:Math.max(0,t.deadline-r),budgetRemainingUsd:t.budgetUsd})}),u("update_goal_state","Update a goal's status, current value, or budget.",In,async e=>{let t={};return e.status&&(t.status=e.status),e.currentValue!==void 0&&(t.currentValue=e.currentValue),e.budgetUsd!==void 0&&(t.budgetUsd=e.budgetUsd),Object.keys(t).length>0&&(t.updatedAt=Date.now(),oe(e.goalId,t)),s({success:!0})}),u("decompose_goal","Decompose a goal into actionable subtasks using LLM reasoning.",kn,async e=>{let t=_(),r=Math.min(e.maxSubtasks??5,10);try{let{query:a}=await import("@anthropic-ai/claude-agent-sdk"),l=`Decompose this goal into ${r} actionable subtasks.
56
+ `}async function _(e){let{listChannels:t}=await import("./channels-ULFUCUUZ.js"),r=t(),{listSessions:o}=await import("./session-manager-COLCNIB7.js"),i=[...o("active"),...o("archived")],a=[];for(let l of e)if(l.type==="session"&&l.sessionId)a.push({type:"session",sessionId:l.sessionId});else if(l.type==="channel"){let d=l.channelId,m=l.chatId;if(!d&&l.channelName){let c=r.find(h=>h.name.toLowerCase().includes(l.channelName.toLowerCase()));c&&(d=c.id)}if(d&&!m){let c=i.find(h=>h.source.type==="channel"&&h.source.channelId===d&&h.source.chatId);c?.source.chatId?m=c.source.chatId:m=r.find(f=>f.id===d)?.config?.userId}d&&m?a.push({type:"channel",channelId:d,chatId:m}):G.warn({channelName:l.channelName,channelId:d,chatId:m},"Could not resolve channel notify target")}return a}async function wn(e){let{listRoles:t}=await import("./roles-ZYCFQMAY.js"),r=t(void 0,100,0);for(let o of r)if(o.name.toLowerCase().includes(e.toLowerCase()))return o.id}var In={goalId:n.string()},kn={goalId:n.string(),status:n.string().optional(),currentValue:n.number().optional(),budgetUsd:n.number().optional(),notes:n.string().optional()},Tn={goalId:n.string(),goalDescription:n.string(),maxSubtasks:n.number().optional()},E=n.union([n.object({type:n.literal("session"),sessionId:n.string()}),n.object({type:n.literal("channel"),channelName:n.string()}),n.object({type:n.literal("channel"),channelId:n.string(),chatId:n.string().optional()})]),Sn={prompt:n.string(),roleId:n.string().optional().describe("Role ID. Call list_roles(requirements) first to find the best role for the task."),requirements:L.optional(),autoSelectRole:n.boolean().optional(),deliverTo:n.array(E).optional().describe('Where to deliver the task output (result full text). E.g., send result to a specific channel. e.g., [{type:"channel", channelName:"iPad WeChat"}] when user says "\u53D1\u5230 iPad \u5FAE\u4FE1".'),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary). Defaults to the originating channel/session."),toolOverrides:n.object({allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional()}).optional()},_n={taskId:n.string(),goalId:n.string().optional(),strategyId:n.string().optional()},Rn={roleId:n.string(),taskType:n.string(),name:n.string().optional()},Dn={status:n.string().optional(),limit:n.number().optional()},En={taskId:n.string(),roleId:n.string()},Cn={taskId:n.string().optional(),status:n.string().optional(),limit:n.number().optional()},xn={roleId:n.string(),allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional(),osCapabilities:n.array(n.object({id:n.string().min(1),targets:n.array(n.string().min(1)).optional()})).optional().describe("Role-level OS capability grants. Use get_capabilities to inspect the runtime registry and valid target-scoped entries."),additionalDirectories:n.array(n.object({path:n.string(),mode:n.enum(["ro","rw"]).optional().describe("Read-only or read-write access. Default: rw. Enforced by OS sandbox."),inheritPlugins:n.boolean().optional(),inheritMcp:n.boolean().optional(),inheritPermissions:n.boolean().optional()})).optional(),allowedChannels:n.array(n.string()).optional(),inheritUserSettings:n.boolean().optional().describe("Enable/disable inheriting user-level settings (global plugins, MCP servers). Default: false (isolated).")},Pn={roleId:n.string().describe("Role ID to update."),name:n.string().min(1).optional(),cagPrompt:n.string().optional(),learnedRules:n.array(n.string()).optional(),status:n.enum(["active","inactive","retired"]).optional(),executionMode:n.enum(["isolated","inline"]).optional(),model:n.string().optional(),maxBudgetUsd:n.number().optional(),approvalRequired:n.array(n.string()).optional(),preferences:n.object({model:n.string().optional(),effort:n.enum(["low","medium","high","max"]).optional(),maxTurns:n.number().optional()}).optional(),permissionMode:n.enum(["default","acceptEdits","dontAsk","bypassPermissions","plan","auto"]).optional(),allowedBashPatterns:n.array(n.string()).optional(),deniedBashPatterns:n.array(n.string()).optional(),evaluationCriteria:n.record(n.string(),n.number()).optional(),envVars:n.record(n.string(),n.string()).optional()},An={roleId:n.string().optional(),limit:n.number().optional()},$n={name:n.string(),cagPrompt:n.string(),traits:n.array(n.string()).optional(),allowedTools:n.array(n.string()).optional(),disallowedTools:n.array(n.string()).optional(),osCapabilities:n.array(n.object({id:n.string().min(1),targets:n.array(n.string().min(1)).optional()})).optional().describe("Initial Role-level OS capability grants. Use get_capabilities to discover editable capability ids and target rules."),additionalDirectories:n.array(n.object({path:n.string(),mode:n.enum(["ro","rw"]).optional().describe("Read-only or read-write access. Default: rw. Enforced by OS sandbox."),inheritPlugins:n.boolean().optional(),inheritMcp:n.boolean().optional(),inheritPermissions:n.boolean().optional()})).optional()},Mn={roleId:n.string(),reason:n.string().optional()},Nn={name:n.string(),description:n.string().optional(),roleId:n.string().optional(),metric:n.string().optional(),targetValue:n.number().optional(),deadline:n.number().optional(),budgetUsd:n.number().optional(),deliverTo:n.array(E).optional().describe("Where to deliver goal completion notifications.")},On={name:n.string(),description:n.string().optional(),triggerType:n.enum(["cron","template_complete","workflow_complete","event"]),triggerCron:n.string().optional(),triggerEvent:n.string().optional().describe("For triggerType=template_complete: 'template_complete:<templateId>'. For workflow_complete: 'workflow_complete:<templateId>'. For cron/event: unused."),eventDefId:n.string().uuid().optional().describe("Required when triggerType='event'. Event def to bind this template to. Use list_event_defs to find or create_event_def to create one."),prompt:n.string(),roleId:n.string().optional(),requirements:L.optional(),autoSelectRole:n.boolean().optional(),enabled:n.boolean().optional(),goalIds:n.array(n.string()).optional(),deliverTo:n.array(E).optional().describe("Where to deliver the task output (result full text)."),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary).")},Un={status:n.enum(["active","retired","probation"]).optional(),limit:n.number().optional(),requirements:L.optional()},Ln={enabled:n.boolean().optional()},qn={},jn={},Fn={prompt:n.string().describe("The task prompt to execute after the delay"),delayMinutes:n.number().optional().describe("Minutes from now to execute (e.g., 30 for 'half an hour later')"),runAt:n.string().optional().describe("ISO 8601 timestamp to execute at (e.g., '2026-04-01T15:00:00+08:00')"),roleId:n.string().describe("Role ID to assign the task to. Call list_roles first."),deliverTo:n.array(E).optional().describe("Where to deliver the task output (result full text)."),reportTo:n.array(E).optional().describe("Where to send status reports (completion summary).")},Gn={roleId:n.string().optional().describe("If provided, shows which plugins are installed in that role's workspace.")},Vn={roleId:n.string().describe("Role ID to install the plugin under (project-scope)."),pluginId:n.string().describe("Plugin ID (e.g. 'github@anthropic'). Use list_available_plugins to discover available plugins.")},Wn={roleId:n.string().describe("Role ID to uninstall the plugin from."),pluginId:n.string().describe("Plugin ID to uninstall.")},Bn={roleId:n.string().describe("Role ID to bind the MCP server to."),mcpName:n.string().describe("Name for this MCP server (e.g., 'github', 'filesystem')."),mcpConfig:n.record(n.string(),n.unknown()).describe("MCP server configuration object.")},Kn={roleId:n.string().describe("Role ID to unbind the MCP server from."),mcpName:n.string().describe("Name of the MCP server to remove.")},zn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Jn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Hn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Yn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},Qn={},Zn={},Xn={pluginId:n.string().describe("Plugin ID (e.g., 'github@anthropic').")},er={roleId:n.string().describe("Role ID to associate scanned plugins with."),path:n.string().describe("Directory path to scan for .claude/settings.json.")},tr={taskId:n.string().describe("Task ID to cancel.")},nr={taskId:n.string().describe("Task ID to get logs for."),limit:n.number().optional().describe("Max log entries (default 20).")},rr={roleId:n.string().describe("Role ID to delete.")},or={},ir={updates:n.record(n.string(),n.unknown()).describe("Config key-value pairs to update. Example: { 'defaults.maxTurns': 50, 'logging.level': 'debug' }")},sr={roleId:n.string().describe("Role ID to list memories for."),limit:n.number().optional().describe("Max results (default 20).")},ar={templateId:n.string().describe("Template ID to update."),name:n.string().optional(),enabled:n.boolean().optional(),prompt:n.string().optional(),triggerType:n.enum(["cron","template_complete","workflow_complete","event"]).optional().describe("Explicit trigger type. Required when updating trigger settings."),triggerCron:n.string().optional(),triggerEvent:n.string().optional().describe("For template_complete: 'template_complete:<templateId>'. For workflow_complete: 'workflow_complete:<templateId>'. Unused for cron/event."),eventDefId:n.string().uuid().optional().describe("Required when triggerType='event'. The event def UUID to bind this template to."),roleId:n.string().optional(),autoSelectRole:n.boolean().optional().describe("Step-level: if true, Adam picks the best-fit role at dispatch time. Write to the single-step template's step."),requirements:L.optional().describe("Step-level: required when autoSelectRole=true. Fields: tools, paths, osCapabilities, network, plugins.")},lr={templateId:n.string().describe("Template ID to delete. Obtain from list_templates."),mode:n.enum(["template_only","with_tasks"]).describe("REQUIRED. Deletion mode chosen by the user after you presented the dependent counts. 'template_only' removes the template + workflow_executions but keeps tasks as orphaned history records under the Tasks tab. 'with_tasks' additionally deletes every task created by this template and their role_scores + manager_decisions (chat_messages.task_id nulled). NEVER guess this value \u2014 the user must explicitly confirm which mode.")},dr={templateId:n.string().describe("Template ID to inspect.")},cr={templateId:n.string().describe("Template ID to run immediately.")},ur={enabled:n.boolean().optional().describe("Filter by enabled status.")},pr={eventType:n.string().describe("Event type that triggers this rule (e.g., 'task_complete')."),channelId:n.string().describe("Channel ID to deliver to."),format:n.string().optional().describe("Format template (e.g., 'summary', 'full'). Default: 'summary'."),matchCriteria:n.record(n.string(),n.unknown()).optional().describe("JSON match criteria for event fields."),enabled:n.boolean().optional().describe("Enable this rule immediately (default true).")},mr={ruleId:n.string().describe("Delivery rule ID to delete.")},fr={roleId:n.string().optional().describe("Role ID to filter strategies by.")},qt=[u("read_goal_state","Read a single goal's detailed state: progress percentage, time remaining, budget spent, and current value. Use this for deep-dive on one goal; use list_goals for an overview of all goals.",In,async e=>{let t=q(e.goalId);if(!t)return s({error:"Goal not found"});let r=Date.now(),o=t.targetValue>0?t.currentValue/t.targetValue:0;return s({id:t.id,name:t.name,description:t.description,roleId:t.roleId,metricType:t.metricType,targetValue:t.targetValue,currentValue:t.currentValue,deadline:t.deadline,budgetUsd:t.budgetUsd,status:t.status,progress:o,timeRemainingMs:Math.max(0,t.deadline-r),budgetRemainingUsd:t.budgetUsd})}),u("update_goal_state","Update a goal's status, current value, or budget.",kn,async e=>{let t={};return e.status&&(t.status=e.status),e.currentValue!==void 0&&(t.currentValue=e.currentValue),e.budgetUsd!==void 0&&(t.budgetUsd=e.budgetUsd),Object.keys(t).length>0&&(t.updatedAt=Date.now(),oe(e.goalId,t)),s({success:!0})}),u("decompose_goal","Decompose a goal into actionable subtasks using LLM reasoning.",Tn,async e=>{let t=R(),r=Math.min(e.maxSubtasks??5,10);try{let{query:a}=await import("@anthropic-ai/claude-agent-sdk"),l=`Decompose this goal into ${r} actionable subtasks.
57
57
 
58
58
  Goal: ${e.goalDescription}
59
59
 
@@ -76,4 +76,4 @@ Rules:
76
76
  - Order from foundational to dependent
77
77
  - Be specific about what each subtask should accomplish
78
78
  - For each subtask, specify the best role from: 'engineer', 'analyst', 'content_creator', 'reviewer'. Match role to the nature of the work.
79
- - Include tools and paths required for the subtask where known. If unknown, omit the field.`,d=a({prompt:l,options:{cwd:process.cwd(),maxTurns:1,maxBudgetUsd:.02}}),m="";for await(let h of d){let f=h;f.type==="result"&&typeof f.result=="string"&&(m=f.result)}let c=m.match(/\[[\s\S]*\]/);if(c){let h=JSON.parse(c[0]),f=[];for(let g=0;g<Math.min(h.length,r);g++){let b=h[g],S=b.role,p=S?await vn(S):void 0,y=await ge({prompt:b.prompt,roleId:p,requirements:b.requirements,config:t.defaults});if(!y.ok){f.push({id:`admission-failed-${g}`,description:b.description,prompt:b.prompt,dependencies:g>0&&f.length>0?[f[g-1].id]:[],estimatedComplexity:b.complexity??"medium",role:S,admissionError:`${y.code}: ${y.reason}`});continue}f.push({id:y.taskId,description:b.description,prompt:b.prompt,dependencies:g>0?[f[g-1].id]:[],estimatedComplexity:b.complexity??"medium",role:S})}if(f.length>0)return s({subtasks:f})}}catch(a){F.error({error:a},"LLM decomposition failed, using fallback")}let o=await Ze({taskId:T(),roleId:void 0,autoSelectRole:!1}),i=[];return o.ok||i.push({id:"admission-blocked",description:`Decomposition fallback blocked: ${o.reason}`,prompt:e.goalDescription,dependencies:[],estimatedComplexity:"medium",admissionError:`${o.code}: ${o.reason}`}),s({subtasks:i})}),u("dispatch_task","Create and dispatch a task. Workflow: (1) call list_roles(requirements) to find candidate roles by fit; (2) call dispatch_task with requirements AND the chosen roleId. requirements is STRONGLY RECOMMENDED \u2014 when present, admission validates role fit before creation and returns structured mismatch diagnostics. If you cannot produce clear requirements from the user's message, ASK THE USER instead of dispatching. Pass deliverTo (result delivery) and/or reportTo (status reports) to route output when the task completes.",Tn,async e=>{if(!e.roleId&&!e.autoSelectRole){let i=A("active",20,0).filter(a=>a.source!=="system").map(a=>({id:a.id,name:a.name,allowedTools:a.allowedTools??[],capabilitySummary:C(a)}));return s({error:"Must provide roleId or autoSelectRole=true with requirements.",availableRoles:i})}let t=e.deliverTo?await R(e.deliverTo):void 0,r=e.reportTo?await R(e.reportTo):void 0,o=await ge({prompt:e.prompt,roleId:e.roleId,requirements:e.requirements,autoSelectRole:e.autoSelectRole,deliverTo:t,reportTo:r,toolOverrides:e.toolOverrides});if(!o.ok){let i=(o.candidates??[]).map(l=>({id:l.roleId,name:l.name,fitScore:l.fitScore,missing:l.missing})),a=i.length>0?i:A("active",20,0).filter(l=>l.source!=="system").map(l=>({id:l.id,name:l.name,allowedTools:l.allowedTools??[],capabilitySummary:C(l)}));return s({error:o.reason,code:o.code,missing:o.missing,availableRoles:a})}return s({taskId:o.taskId,roleId:o.roleId,fitScore:o.fitScore,strategyId:o.strategyId,warnings:o.warnings})}),u("dispatch_workflow","Create and execute a multi-role workflow. Use when the user's request decomposes into sequential or parallel steps handled by different roles. Each step is a complete task; roles handle conditions and decisions internally. Use {{stepId.result}} in prompts to reference prior step outputs. Minimum 2 steps.",{steps:n.array(n.object({id:n.string().describe("Unique step identifier"),prompt:n.string().describe("Task prompt for this step"),roleId:n.string().optional().describe("Role ID for this step. Call list_roles first to find roles."),requirements:L.optional().describe("Task requirements for this step (D-012)."),autoSelectRole:n.boolean().optional().describe("Auto-select best role for this step (D-012)."),dependsOn:n.array(n.string()).optional().describe("Step IDs this step depends on"),config:n.object({timeout:n.number().optional(),maxTurns:n.number().optional()}).optional()})).min(2).describe("Workflow steps (min 2)"),name:n.string().optional().describe("Workflow name for tracking"),deliverTo:n.array(E).optional().describe("Where to deliver the aggregated workflow output"),reportTo:n.array(E).optional().describe("Where to send workflow status reports"),continueOnError:n.boolean().optional().describe("Continue remaining steps if one fails (default false)")},async e=>{let t=[];for(let p of e.steps){if(!p.roleId&&!p.autoSelectRole){t.push(`${p.id} (needs roleId or autoSelectRole)`);continue}if(p.roleId){let y=I(p.roleId);(!y||y.status!=="active")&&t.push(`${p.id} (roleId ${p.roleId} invalid/inactive)`)}}if(t.length>0){let p=A("active",20,0).filter(y=>y.source!=="system").map(y=>({id:y.id,name:y.name,capabilitySummary:C(y)}));return s({error:`Steps missing roleId/autoSelectRole or with invalid roleIds: ${t.join("; ")}.`,availableRoles:p})}let r=new Set(e.steps.map(p=>p.id));for(let p of e.steps)if(p.dependsOn)for(let y of p.dependsOn){if(!r.has(y))return s({error:`Step "${p.id}" depends on unknown step "${y}"`});if(y===p.id)return s({error:`Step "${p.id}" cannot depend on itself`})}let o=new Set,i=new Set,a=new Map(e.steps.map(p=>[p.id,p.dependsOn??[]])),l=p=>{if(i.has(p))return!0;if(o.has(p))return!1;o.add(p),i.add(p);for(let y of a.get(p)??[])if(l(y))return!0;return i.delete(p),!1};for(let p of e.steps)if(l(p.id))return s({error:"Circular dependency detected in workflow steps"});let d=e.deliverTo?await R(e.deliverTo):void 0,m=e.reportTo?await R(e.reportTo):void 0,c=T(),h=_(),f={id:`workflow-${c}`,name:e.name??"Ad-hoc workflow",trigger:{type:"manual"},steps:e.steps.map(p=>({id:p.id,prompt:p.prompt,roleId:p.roleId,requirements:p.requirements,autoSelectRole:p.autoSelectRole,dependsOn:p.dependsOn,config:p.config})),enabled:!0,createdAt:Date.now(),config:{...h.defaults,continueOnError:e.continueOnError??!1},deliverTo:d,reportTo:m};try{ye(f)}catch(p){let{TemplateRoleConfigError:y}=await import("./task-templates-YPNWJOVV.js");if(p instanceof y)return s({code:p.code,error:p.message,failingStepIds:p.failingStepIds,hint:"Each step must have roleId OR autoSelectRole=true (with requirements). Use list_roles to find an appropriate role."});throw p}let{WorkflowExecutor:g}=await import("./workflow-executor-3WMS2WV3.js");new g().execute(f,c).catch(p=>{F.error({executionId:c,error:p},"dispatch_workflow execution failed")});let S=e.steps.map(p=>{let y=p.roleId??(p.autoSelectRole?"[auto-selected]":"[no role]");return(p.roleId?I(p.roleId):void 0)?.name??y});return s({executionId:c,templateId:f.id,stepCount:e.steps.length,roles:[...new Set(S)],status:"started"})}),u("evaluate_result","Evaluate a completed task's result and record a trial for Thompson Sampling.",Sn,async e=>{let{goalId:t,taskId:r,strategyId:o}=e,i=rt(t??"",r);return o&&t&&$.recordTrial(o,t,r,i.reward,i.breakdown.L2||void 0,i.breakdown.L3||void 0,"Evaluated via adam-tools"),s({reward:i.reward,metricL2Score:i.breakdown.L2||void 0,metricL3Score:i.breakdown.L3||void 0,source:i.source,reasoning:`Evaluated via ${i.source} with confidence ${i.confidence.toFixed(2)}`})}),u("create_strategy","Create a new strategy variant for a role/taskType using LLM evolution.",Rn,async e=>{let{roleId:t,taskType:r}=e;await ie.generateVariants(t,r,3,1);let o=$.getStrategies(t,r),i=o[o.length-1];return s(i?{id:i.id,name:i.name,promptTemplate:i.promptTemplate}:{error:`Failed to create strategy for ${t}/${r}`})}),u("list_goals","List all goals with progress percentage, budget, deadline, and time remaining. Goal statuses: active (in progress), paused, completed, failed. Use this to check current goal status before making decisions.",_n,async e=>{let t=e.status;return s(et(t,e.limit??10,0))}),u("delete_goal","Delete a goal by ID.",{goalId:n.string()},async e=>q(e.goalId)?(tt(e.goalId),s({success:!0,goalId:e.goalId})):s({error:"Goal not found"})),u("pause_goal","Pause an active goal.",{goalId:n.string()},async e=>q(e.goalId)?(oe(e.goalId,{status:"paused",updatedAt:Date.now()}),s({success:!0,goalId:e.goalId,status:"paused"})):s({error:"Goal not found"})),u("assign_role","Assign a role to a pending task.",Dn,async e=>{let{taskId:t,roleId:r}=e;if(!x(t))return s({error:`Task not found: ${t}`});let i=I(r);return i?(G(t,{roleId:r}),F.debug({taskId:t,roleId:r,roleName:i.name},"Role assigned to task"),s({success:!0,taskId:t,roleId:r})):s({error:`Role not found: ${r}`})}),...ut(),u("read_task_status","Read a single task's details (prompt, status, result, roleId) by ID, or list all tasks filtered by status (pending, running, completed, failed). Use this to check task progress and results.",En,async e=>{if(e.taskId){let r=x(e.taskId);return s(r??{error:"Task not found"})}let t=e.status;return s(O(t,e.limit??100,0))}),u("modify_role_permissions","Update a role's RBAC permissions (paths, tools, OS capabilities).",Cn,async e=>{if(!I(e.roleId))return s({error:`Role not found: ${e.roleId}`});let r={};if(e.allowedTools&&(r.allowedTools=e.allowedTools),e.disallowedTools&&(r.disallowedTools=e.disallowedTools),e.osCapabilities!==void 0)try{r.osCapabilities=ue(e.osCapabilities)}catch(o){return s({error:o instanceof Error?o.message:String(o)})}return e.additionalDirectories!==void 0&&(r.additionalDirectories=e.additionalDirectories),e.allowedChannels!==void 0&&(r.allowedChannels=e.allowedChannels),"inheritUserSettings"in e&&(r.inheritUserSettings=e.inheritUserSettings),U(e.roleId,r),s({success:!0})}),u("update_role","Update a role's identity and config fields (name, CAG prompt, learned rules, status, model, execution mode, preferences, permission mode, bash patterns, evaluation criteria, env vars). For permission fields (allowedTools, disallowedTools, osCapabilities, additionalDirectories, allowedChannels, inheritUserSettings) use modify_role_permissions instead.",Pn,async e=>{if(!I(e.roleId))return s({error:`Role not found: ${e.roleId}`});let{roleId:r,...o}=e,i={...o,updatedAt:Date.now()};U(r,i);let a=I(r);if(!a)return s({error:"Role disappeared after update"});if(e.cagPrompt!==void 0||e.learnedRules!==void 0){let l=me(a.name);Ut(l)&&je(l,a)}return s({success:!0,role:a})}),u("view_audit_log","View the evolution audit log for role changes.",xn,async e=>{let{listEvolutionAudit:t}=await import("./evolution-audit-OQDGPKYI.js"),r=t(e.limit??50);return s({entries:r})}),u("list_roles","List all roles with their capabilities including bound plugins (skills/agents). Use this to discover available roles before dispatching tasks. Pass requirements to get ranked results with fitScore showing which roles best match the task.",On,async e=>{if(e.requirements){let o=e.requirements,a=Qe(o).slice(0,e.limit??50).map(l=>{let d=l.role,m=ne(d),c=m.plugins.map(v=>v.name),h=me(d.name),f=Je(d,h),g=o.tools?(d.allowedTools??[]).filter(v=>o.tools.includes(v)):void 0,b=o.paths?o.paths.filter(v=>He(v,f)):void 0,S=new Set((d.osCapabilities??[]).map(v=>v.id)),p=o.osCapabilities?o.osCapabilities.filter(v=>S.has(v.id)).map(v=>v.id):void 0,y=new Set(c),Ae=o.plugins?o.plugins.filter(v=>y.has(v)):void 0,qt=o.network===!0?(d.osCapabilities??[]).some(v=>v.id==="local-network"):void 0,jt=l.missing?.osCapabilities,Ft=Ye(d,o);return{id:d.id,name:d.name,status:d.status,allowedTools:d.allowedTools??[],disallowedTools:d.disallowedTools??[],osCapabilities:d.osCapabilities??[],additionalDirectories:d.additionalDirectories??[],cagPrompt:d.cagPrompt.slice(0,500)+(d.cagPrompt.length>500?"...":""),capabilitySummary:C(d,m),plugins:m.plugins.map(v=>({name:v.name,skills:v.skills.map(de=>de.name),agents:v.agents.map(de=>de.name)})),fitScore:l.fitScore,fits:l.evaluation.ok,matchedTools:g,matchedPaths:b,matchedOsCapabilities:p,matchedPlugins:Ae,matchedNetwork:qt,missingCapabilities:l.missing?{tools:l.missing.tools,paths:l.missing.paths,osCapabilities:jt?.map(v=>v.id),plugins:l.missing.plugins,network:l.missing.network}:void 0,warnings:Ft,why:l.evaluation.ok?`Role '${d.name}' satisfies all requirements (fitScore: ${l.fitScore.toFixed(2)})`:`Role '${d.name}' does not satisfy requirements: ${l.evaluation.ok?"unknown":l.evaluation.reason}`}});return s({roles:a})}let r=A(e.status,e.limit??50,0).map(o=>{let i=ne(o);return{id:o.id,name:o.name,status:o.status,allowedTools:o.allowedTools??[],disallowedTools:o.disallowedTools??[],osCapabilities:o.osCapabilities??[],additionalDirectories:o.additionalDirectories??[],cagPrompt:o.cagPrompt.slice(0,500)+(o.cagPrompt.length>500?"...":""),capabilitySummary:C(o,i),plugins:i.plugins.map(a=>({name:a.name,skills:a.skills.map(l=>l.name),agents:a.agents.map(l=>l.name)}))}});return s({roles:r})}),u("create_role","Create a new role with a name, CAG prompt, and optional tool permissions or OS capabilities.",An,async e=>{let t;try{t=ue(e.osCapabilities)}catch(i){return s({error:i instanceof Error?i.message:String(i)})}let r=`role-${T().slice(0,8)}`,o={id:r,name:e.name,cagPrompt:e.cagPrompt,learnedRules:[],memoryStreamId:`mem-${T().slice(0,8)}`,status:"active",preferences:{},createdAt:Date.now(),allowedTools:e.allowedTools,disallowedTools:e.disallowedTools,osCapabilities:t,additionalDirectories:e.additionalDirectories};return Le(o),X(o),s({roleId:r,name:e.name,allowedTools:e.allowedTools,osCapabilities:o.osCapabilities,additionalDirectories:e.additionalDirectories??[]})}),u("retire_role","Retire a role (marks as retired, stops receiving tasks).",$n,async e=>I(e.roleId)?(U(e.roleId,{status:"retired"}),F.info({roleId:e.roleId,reason:e.reason},"Role retired"),s({success:!0})):s({error:`Role not found: ${e.roleId}`})),u("create_goal","Create a new goal with optional budget, deadline, and metric tracking.",Mn,async e=>{let t=T(),r=Date.now(),o=r+10080*60*1e3,i={id:t,name:e.name,description:e.description,roleId:e.roleId??"engineer",metricType:e.metric??"completion",targetValue:e.targetValue??1,currentValue:0,deadline:e.deadline??o,budgetUsd:e.budgetUsd??5,status:"active",createdAt:r,deliverTo:e.deliverTo?await R(e.deliverTo):void 0};re(i),ht(t,i.metricType);let a=q(t);return s({goalId:a.id,name:a.name,status:a.status})}),u("create_template","Create a recurring scheduled task. triggerType values: 'cron' (recurring via cron expression), 'template_complete' (fires when a specific template's task completes; set triggerEvent to 'template_complete:<templateId>'), 'workflow_complete' (similar), 'event' (fires when an Event def fires; set eventDefId to the event def UUID \u2014 use list_event_defs or create_event_def first). For one-shot delayed tasks ('in 30 minutes', 'tomorrow at 3pm'), use schedule_task instead.",Nn,async e=>{let{createTaskTemplate:t}=await import("./task-templates-YPNWJOVV.js"),r=T(),o=T();if(e.triggerType==="event"&&!e.eventDefId)return s({error:"eventDefId required when triggerType='event'"});if(e.triggerType!=="event"&&e.eventDefId)return s({error:"eventDefId only valid when triggerType='event'"});let i=e.deliverTo?await R(e.deliverTo):void 0,a=e.reportTo?await R(e.reportTo):void 0,l={id:r,name:e.name,description:e.description,trigger:{type:e.triggerType,cron:e.triggerCron,event:e.triggerEvent,eventDefId:e.eventDefId},steps:[{id:o,prompt:e.prompt,...e.autoSelectRole!==void 0?{autoSelectRole:e.autoSelectRole}:{},...e.requirements!==void 0?{requirements:e.requirements}:{}}],rolePreference:e.roleId,enabled:e.enabled??!0,createdAt:Date.now(),goalIds:e.goalIds,deliverTo:i,reportTo:a};try{t(l)}catch(d){let{TemplateRoleConfigError:m}=await import("./task-templates-YPNWJOVV.js");if(d instanceof m)return s({code:d.code,error:d.message,failingStepIds:d.failingStepIds,hint:"Set roleId (recommended) OR autoSelectRole=true with a requirements object (e.g., {tools:['Read']}) on the template. Use list_roles to find an appropriate role."});throw d}return s({templateId:r,name:l.name,trigger:l.trigger})}),u("create_event_def","Create an Event definition \u2014 a user-configured source that fires on schedule/webhook/directory/manual. Event defs are the trigger half of the Event Slot; pair with create_template(triggerType='event', eventDefId=<returned id>) to bind work to the trigger. sourceType is validated at runtime against the installed source registry (currently: webhook, cron, directory_watch, manual \u2014 additional types may be registered at runtime). sourceConfig is per-type: cron \u2192 {cron: '0 9 * * *'}; directory_watch \u2192 {path: '/abs/path', glob?: '*.md'}; webhook/manual \u2192 {}.",{name:n.string().min(1).max(100).describe("Human-readable name (unique within workspace)."),sourceType:n.string().describe("Source type \u2014 validated against installed registry at call time. Currently: 'webhook' | 'cron' | 'directory_watch' | 'manual'. If the value is rejected, the error message lists the currently-registered types."),sourceConfig:n.record(n.string(),n.unknown()).describe("Per-sourceType configuration. See tool description."),enabled:n.boolean().optional().describe("Default true."),description:n.string().max(500).optional()},async e=>{if(!H().includes(e.sourceType))return s({error:`Unknown sourceType: '${e.sourceType}'. Currently registered: ${H().join(", ")}`});let t=xe(e.sourceType,e.sourceConfig);if(!t.ok)return s({error:`Invalid sourceConfig: ${t.error}`});let r=T(),o=Dt({id:r,name:e.name,sourceType:e.sourceType,sourceConfig:e.sourceConfig,enabled:e.enabled??!0,description:e.description});try{Pe(o)}catch(i){Se(r);let a=i instanceof Error?i.message:String(i);return s({error:`Failed to start source: ${a}. Event def was not created.`})}return s({id:o.id,name:o.name,sourceType:o.sourceType,enabled:o.enabled})}),u("list_event_defs","List Event definitions. Use before create_template(triggerType='event') to find the eventDefId, or before fire_event_def / list_event_firings.",{sourceType:n.string().optional().describe("Filter by source type (e.g., 'cron', 'webhook')."),enabled:n.boolean().optional().describe("Filter by enabled flag.")},async e=>{let t=se({sourceType:e.sourceType,enabled:e.enabled});return s(t.map(r=>({id:r.id,name:r.name,sourceType:r.sourceType,sourceConfig:r.sourceConfig,enabled:r.enabled,description:r.description,createdAt:r.createdAt})))}),u("update_event_def","Update an Event definition. Changing `enabled` or `sourceConfig` on an active def automatically restarts the runtime source handler. Use list_event_defs first to get the id.",{id:n.string().uuid().describe("Event def id."),name:n.string().min(1).max(100).optional(),sourceType:n.string().optional().describe("Only set when migrating to a different source type."),sourceConfig:n.record(n.string(),n.unknown()).optional(),enabled:n.boolean().optional(),description:n.string().max(500).optional()},async e=>{let t=j(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});if(e.sourceType!==void 0||e.sourceConfig!==void 0){let l=e.sourceType??t.sourceType;if(!H().includes(l))return s({error:`Unknown sourceType: '${l}'`});let d=xe(l,e.sourceConfig??t.sourceConfig);if(!d.ok)return s({error:`Invalid sourceConfig: ${d.error}`})}let r=t.enabled,o=e.enabled??t.enabled,i=e.sourceType!==void 0||e.sourceConfig!==void 0;r&&(!o||i)&&le(t.id,t.sourceType);let a=Te(e.id,{name:e.name,sourceType:e.sourceType,sourceConfig:e.sourceConfig,enabled:e.enabled,description:e.description});if(!a)return s({error:"Update failed"});if(o&&(!r||i))try{Pe(a)}catch(l){Te(e.id,{enabled:!1});let d=l instanceof Error?l.message:String(l);return s({error:`Failed to start source with new config: ${d}. Event def has been marked disabled to match runtime state.`})}return s({id:a.id,name:a.name,sourceType:a.sourceType,enabled:a.enabled})}),u("delete_event_def","Delete an Event definition. Stops the runtime source handler (cron/fswatch) first, then deletes the DB row. Templates bound to this event def become orphaned and will not fire.",{id:n.string().uuid().describe("Event def id.")},async e=>{let t=j(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});try{le(t.id,t.sourceType)}catch(o){F.warn({defId:t.id,err:o},"stopEventDefSource failed during delete \u2014 proceeding with row deletion")}let r=Se(e.id);return s({ok:r,id:e.id})}),u("fire_event_def","Fire an Event definition now. For manual defs: creates a real manual event (same as clicking 'Fire now' in the UI). For any source type: with test=true, creates a synthetic test event (source='manual-test-<defId>') that flows through the EventDispatcher \u2014 useful for debugging why a Template bound to the event didn't fire. Payload is optional.",{id:n.string().uuid().describe("Event def id."),test:n.boolean().optional().describe("Test mode. Required (=true) when source type != 'manual'. Default false. In test mode the event does NOT collide with real firings' dedup keys."),payload:n.record(n.string(),n.unknown()).optional().describe("Optional event payload. Must be < 64 KB when JSON-serialized.")},async e=>{let t=j(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});let r=e.test===!0;if(t.sourceType!=="manual"&&!r)return s({error:`Can only directly fire manual event defs; this def has source type '${t.sourceType}'. Pass test=true to dry-run.`});if(e.payload){let o=Buffer.byteLength(JSON.stringify(e.payload),"utf8");if(o>65536)return s({error:`Payload exceeds 64 KB limit (got ${o} bytes)`})}try{let o=r?Ee(t,e.payload):De(t,e.payload);return s({ok:!0,eventId:o.eventId,test:r})}catch(o){let i=o instanceof Error?o.message:String(o);return s({error:i})}}),u("list_event_firings","List recent firings of an Event definition \u2014 for debugging 'why didn't my automation fire' and inspecting event history. Returns id, occurredAt, type, source, dedupKey, confidence, and a truncated payload (500 char cap for display). For full payloads, use REST GET /event-defs/:id/firings.",{eventDefId:n.string().uuid().describe("Event def id. Use list_event_defs to find it."),since:n.string().optional().describe("ISO 8601 start timestamp (inclusive). Omit for unlimited range."),until:n.string().optional().describe("ISO 8601 end timestamp (inclusive)."),limit:n.number().int().positive().max(500).optional().describe("Max rows (default 50, max 500).")},async e=>{let t=j(e.eventDefId);if(!t)return s({error:`Event def '${e.eventDefId}' not found`});let r=Rt({eventDefId:e.eventDefId,since:e.since,until:e.until,limit:e.limit??50}),o=500;return s({eventDefName:t.name,sourceType:t.sourceType,count:r.length,firings:r.map(i=>{let a=JSON.stringify(i.payload);return{id:i.id,occurredAt:i.occurredAt,type:i.type,source:i.source,dedupKey:i.dedupKey,confidence:i.confidence,payloadPreview:a.length>o?a.slice(0,o)+"...[truncated]":a,payloadTruncated:a.length>o}})})}),u("create_skill","Author a Claude Code Skill file under a target Role's workspace. The Skill becomes available next time the Role runs. Preset Roles (Engineer, Reviewer, Researcher, Writer, Chat Manager, adam-automator) require overwrite=true to replace an existing skill \u2014 first-time creation is unrestricted. Returns the written file path.",{roleId:n.string().describe("Role to target. Use list_roles to find it."),skillName:n.string().regex(/^[a-z0-9_][a-z0-9_-]{0,39}$/,"skillName must be 1-40 chars: lowercase letters, digits, underscores, optional hyphen in middle. No leading dot or dash.").describe("Skill directory name (used as the directory under .claude/skills/)."),description:n.string().max(500).describe("One-line description shown to the Role's LLM when choosing a Skill."),instructions:n.string().describe("The skill body: what it does and how to do it."),parameters:n.record(n.string(),n.object({type:n.string().describe("Parameter type name"),description:n.string().describe("Parameter description")})).optional().describe("Named input parameters and their types."),overwrite:n.boolean().optional().describe("Required (=true) to overwrite an existing SKILL.md under a preset Role (Engineer, Reviewer, Researcher, Writer, Chat Manager, adam-automator). First-time skill creation and non-preset Roles do not require this flag.")},async e=>{let{getRole:t}=await import("./roles-KYXNMO5H.js"),{ensureRoleWorkspace:r}=await import("./role-workspace-URSOBCDH.js"),{mkdir:o,writeFile:i}=await import("fs/promises"),{resolve:a}=await import("path"),l=t(e.roleId);if(!l)return s({error:`Role '${e.roleId}' not found`});let d=r(l),m=a(d,".claude","skills",e.skillName);if(Fe(l)){let{existsSync:g}=await import("fs"),b=a(m,"SKILL.md");if(g(b)&&e.overwrite!==!0)return s({error:`Role '${l.name}' is a preset. Skill '${e.skillName}' already exists at ${b}. Pass overwrite=true to replace, or choose a different skillName to add alongside.`,requiresOverwrite:!0,existingPath:b})}let c=a(d,".claude","skills");if(!m.startsWith(c+(process.platform==="win32"?"\\":"/")))return s({error:"Path traversal rejected"});await o(m,{recursive:!0});let h=bn(e),f=a(m,"SKILL.md");return await i(f,h,"utf8"),s({ok:!0,path:f})}),u("list_templates","List task templates (automations). Use this to check existing scheduled/recurring tasks before creating new ones.",{enabled:n.boolean().optional().describe("Filter by enabled status. Omit to list all."),limit:n.number().optional().describe("Max results (default 50)")},async e=>{let{listTaskTemplates:t}=await import("./task-templates-YPNWJOVV.js"),r=t(e.enabled,e.limit??50,0);return s(r.map(o=>({id:o.id,name:o.name,description:o.description,trigger:o.trigger,enabled:o.enabled,rolePreference:o.rolePreference,deliverTo:o.deliverTo,createdAt:o.createdAt})))}),u("send_to_channel","Send a message (text, image, voice, video, file) to a connected channel by name. Use this to deliver task results, media, or notifications to a specific channel (e.g., WeChat on iPad). For media: provide mediaUrl as an absolute local file path and mediaType. Do NOT use remote URLs \u2014 download files locally first.",{channelName:n.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:n.string().describe("The message content to send (text caption when sending media)"),mediaUrl:n.string().optional().describe("Absolute local file path to the media file (e.g. /Users/.../file.png). Must exist on disk. Do NOT use remote URLs \u2014 download files locally first."),mediaType:n.enum(["image","audio","video","file"]).optional().describe("Type of the media file. Required when mediaUrl is provided")},async e=>{if(e.mediaUrl){if(e.mediaUrl.includes("://")&&!e.mediaUrl.startsWith("file://"))return s({error:`mediaUrl must be a local file path, not a remote URL. Got: ${e.mediaUrl.slice(0,80)}. Download the file to a local path first, then pass the local path.`});let l=e.mediaUrl.startsWith("file://")?new URL(e.mediaUrl).pathname:e.mediaUrl;if(!Ut(l))return s({error:`Media file not found: ${l}. Verify the file exists before sending.`});if(!e.mediaType)return s({error:"mediaType is required when mediaUrl is provided. Specify one of: image, audio, video, file."})}let t=await R([{type:"channel",channelName:e.channelName}]);if(t.length===0)return s({error:`Channel "${e.channelName}" not found or no chatId available`});let r=t[0];if(r.type!=="channel")return s({error:"Resolved target is not a channel"});let{getOutboundGateway:o}=await import("./outbound-gateway-QRL36F7K.js"),a=await o().send({channelId:r.channelId,chatId:r.chatId,content:e.message,messageType:"deliver",mediaUrl:e.mediaUrl,mediaType:e.mediaType});return s({success:a.success,channelName:e.channelName,...a.error?{error:a.error}:{}})}),u("list_channels","List all connected channels with their platform, status, and chatId for message delivery. Use this to discover available channels before sending messages or setting up notifications.",Un,async e=>{let t=be(e.enabled),r=[...ve("active"),...ve("archived")],o=t.map(i=>{let a,l=r.find(d=>d.source.type==="channel"&&d.source.channelId===i.id&&d.source.chatId);return l?.source.chatId?a=l.source.chatId:a=i.config?.userId,{id:i.id,name:i.name,platform:i.platform,status:i.status,chatId:a}});return s({channels:o})}),u("get_system_status","Get current system status: execution pool capacity (active/max/queued slots), running task count, and system health. Use this to check if the system has capacity before dispatching tasks.",Ln,async()=>{let e=_(),t=O("running"),r=O("pending");return s({executionPool:{active:t.length,max:e.execution?.maxConcurrent??5,queued:r.length},timestamp:new Date().toISOString()})}),u("schedule_task","Schedule a one-shot delayed task. roleId is required \u2014 call list_roles first. Use this when the user wants something done later (e.g., '\u534A\u5C0F\u65F6\u540E', 'in 30 minutes', 'tomorrow at 3pm'). For recurring schedules ('every day', 'weekly'), use create_template instead.",jn,async e=>{let t=I(e.roleId);if(!t||t.status!=="active"){let f=A("active",20,0).filter(g=>g.source!=="system").map(g=>({id:g.id,name:g.name,allowedTools:g.allowedTools??[],capabilitySummary:C(g)}));return s({error:`Role not found or not active: ${e.roleId}. Pick a roleId from the list below.`,availableRoles:f})}let r=Date.now(),o;if(e.delayMinutes!==void 0&&e.runAt!==void 0)return s({error:"Provide exactly one of delayMinutes or runAt, not both"});if(e.delayMinutes!==void 0)o=r+e.delayMinutes*60*1e3;else if(e.runAt!==void 0){if(o=new Date(e.runAt).getTime(),isNaN(o))return s({error:"Invalid ISO 8601 timestamp in runAt"})}else return s({error:"Provide either delayMinutes or runAt"});if(o<=r)return s({error:"Scheduled time must be in the future"});let i=10080*60*1e3;if(o-r>i)return s({error:"Schedule exceeds maximum of 7 days"});let a=T(),l=new Date(o).toISOString(),d=e.deliverTo?await R(e.deliverTo):void 0,m=e.reportTo?await R(e.reportTo):void 0;ye({id:a,name:e.prompt.slice(0,80),description:`One-shot scheduled task: ${e.prompt.slice(0,200)}`,trigger:{type:"once",runAt:l},steps:[{id:"main",prompt:e.prompt}],rolePreference:e.roleId,config:{..._().defaults},tags:["scheduled","once"],enabled:!0,createdAt:r,deliverTo:d,reportTo:m});let{getBreeEngine:c}=await import("./bree-engine-M5CZ6A62.js"),h=c();return h&&h.scheduleOnceJob(a),s({templateId:a,executeAt:l,prompt:e.prompt})}),u("cancel_scheduled_task","Cancel a previously scheduled one-shot task by its template ID. The task will not execute.",{templateId:n.string().describe("The template ID returned by schedule_task")},async e=>{let t=B(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});if(t.trigger.type!=="once")return s({error:"This is not a one-shot scheduled task. Use disable_template for recurring automations."});dt(e.templateId);let{getBreeEngine:r}=await import("./bree-engine-M5CZ6A62.js"),o=r();return o&&await o.unscheduleJob(e.templateId),s({cancelled:!0,templateId:e.templateId})}),u("list_available_plugins","List all installed plugins with their scope and global enabled state. If roleId is provided, shows which plugins are installed in that role's workspace.",Fn,async e=>{let t=Ge(),r=te(),o=e.roleId?(()=>{let{getRoleWorkspacePath:i}=(ee(),P(fe)),{getRole:a}=(Z(),P(pe)),{listInstalledPlugins:l}=(ze(),P(Wt)),d=a(e.roleId);if(!d)return[];let m=i(d.name);return l({scope:"project",projectPath:m}).map(c=>c.id)})():[];return s({plugins:r.map(i=>({id:i.id,name:i.name,scope:i.scope,projectPath:i.projectPath,enabled:i.enabled,globalEnabled:t[i.id]??i.enabled,isInstalledInRole:o.includes(i.id),description:i.version?`v${i.version}`:void 0}))})}),u("install_plugin_for_role","Install a plugin into a role's workspace (project-scope). The plugin will be available when that role executes tasks.",Gn,async e=>{let{getRole:t}=(Z(),P(pe)),{getRoleWorkspacePath:r}=(ee(),P(fe)),o=t(e.roleId);if(!o)return s({error:`Role not found: ${e.roleId}`});let i=r(o.name);try{return Ie(e.pluginId,"project",i),s({success:!0,roleId:e.roleId,pluginId:e.pluginId,scope:"project",cwd:i})}catch(a){return s({error:`Failed to install plugin: ${a}`})}}),u("uninstall_plugin_from_role","Uninstall a plugin from a role's workspace.",Vn,async e=>{let{getRole:t}=(Z(),P(pe)),{getRoleWorkspacePath:r}=(ee(),P(fe)),o=t(e.roleId);if(!o)return s({error:`Role not found: ${e.roleId}`});let i=r(o.name);try{return ke(e.pluginId,"project",i),s({success:!0,roleId:e.roleId,pluginId:e.pluginId})}catch(a){return s({error:`Failed to uninstall plugin: ${a}`})}}),u("bind_mcp_to_role","Bind an MCP server configuration to a role. The MCP server will be available to the role during task execution.",Wn,async e=>{let t=I(e.roleId);if(!t)return s({error:`Role not found: ${e.roleId}`});let o={...t.mcpServers??{},[e.mcpName]:e.mcpConfig};try{return U(e.roleId,{mcpServers:o}),X(t),s({success:!0,roleId:e.roleId,mcpName:e.mcpName,mcpServers:o})}catch(i){return s({error:`Failed to bind MCP server: ${i}`})}}),u("unbind_mcp_from_role","Remove an MCP server binding from a role.",Bn,async e=>{let t=I(e.roleId);if(!t)return s({error:`Role not found: ${e.roleId}`});let r={...t.mcpServers??{}};if(!(e.mcpName in r))return s({error:`MCP server "${e.mcpName}" not bound to this role`});delete r[e.mcpName];try{return U(e.roleId,{mcpServers:r}),X(t),s({success:!0,roleId:e.roleId,mcpName:e.mcpName})}catch(o){return s({error:`Failed to unbind MCP server: ${o}`})}}),u("get_capabilities","Get a comprehensive overview of Adam's current capabilities: available roles and their tools, OS capability registry, connected channels, installed plugins, active automations, and execution capacity. Call this when the user asks what you can do, or asks for help.",qn,async()=>{let{listTaskTemplates:e}=await import("./task-templates-YPNWJOVV.js"),t=_(),r=A(void 0,100,0),o=be(),i=e(!0,100,0),a=O("running"),l=O("pending"),d=ft(),m=await gt();return s({roles:{description:"Specialized worker identities \u2014 each has its own tools, MCP servers, plugins (skills/agents), and learned rules",active:r.filter(c=>c.status==="active"&&c.source!=="system").map(c=>{let h=ne(c);return{name:c.name,tools:c.allowedTools??[],osCapabilities:c.osCapabilities??[],mcpServers:Object.keys(c.mcpServers??{}),channels:c.allowedChannels??[],capabilitySummary:C(c,h),plugins:h.plugins.map(f=>({name:f.name,skills:f.skills.map(g=>g.name),agents:f.agents.map(g=>g.name)}))}}),retired:r.filter(c=>c.status==="retired").length,probation:r.filter(c=>c.status==="probation").length},osCapabilities:{description:"Role-level OS capability registry. Only editable entries can be assigned to roles on this runtime.",sandbox:{platform:d.platform,available:m},registry:Ue(d.platform,m)},channels:{description:"Send/receive messages via connected platforms",connected:o.filter(c=>c.enabled).map(c=>({name:c.name,platform:c.platform,status:c.status}))},plugins:{description:"Extensions that add capabilities to roles",installed:te().filter(c=>c.enabled).map(c=>({name:c.name,scope:c.scope,description:c.version?`v${c.version}`:void 0}))},automations:{description:"Recurring cron tasks and event-triggered templates",active:i.map(c=>({name:c.name,trigger:c.trigger}))},execution:{description:"Parallel task execution pool",maxConcurrent:t.execution?.maxConcurrent??5,running:a.length,queued:l.length},coreFeatures:["Goal management \u2014 SMART goals with budget/deadline/metric, auto-decomposition into subtasks","Memory \u2014 per-Role vector + keyword searchable memory across tasks","Strategy evolution \u2014 Thompson Sampling optimizes task approaches over time","Monitor \u2014 automatic quality scoring, role retirement/reinstatement","Delivery engine \u2014 event-driven result routing to channels/webhooks","Schedule \u2014 cron recurring templates + one-shot delayed tasks"]})}),u("enable_plugin","Enable a globally installed plugin (makes it available to all roles).",Kn,async e=>{try{return kt(e.pluginId),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to enable plugin: ${t}`})}}),u("disable_plugin","Disable a globally installed plugin (removes it from all roles).",zn,async e=>{try{return Tt(e.pluginId),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to disable plugin: ${t}`})}}),u("install_plugin_for_user","Install a plugin globally for the current user (user-scope).",Jn,async e=>{try{return Ie(e.pluginId,"user"),s({success:!0,pluginId:e.pluginId,scope:"user"})}catch(t){return s({error:`Failed to install plugin: ${t}`})}}),u("uninstall_plugin_for_user","Uninstall a globally installed plugin from the current user.",Hn,async e=>{try{return ke(e.pluginId,"user"),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to uninstall plugin: ${t}`})}}),u("browse_marketplace","Browse all available plugins from configured marketplaces (shows installed and available).",Yn,async()=>{try{let e=It(),t=te();return s({available:e,installed:t})}catch(e){return s({error:`Failed to browse marketplace: ${e}`})}}),u("list_marketplace_sources","List configured plugin marketplace sources.",Qn,async()=>{let e=Be();return s({sources:e})}),u("get_plugin_detail","Get detailed manifest for an installed plugin (skills, agents, MCP servers, hooks).",Zn,async e=>{let t=We(e.pluginId);if(!t)return s({error:`Plugin not found: ${e.pluginId}`});let r=Ve(t.installPath);return s({id:t.id,name:t.name,version:t.version,scope:t.scope,projectPath:t.projectPath,enabled:t.enabled,manifest:r})}),u("scan_directory","Scan a directory for .claude/settings.json and return its plugin/MCP configuration.",Xn,async e=>{let{getRole:t}=await import("./roles-KYXNMO5H.js");if(!t(e.roleId))return s({error:`Role not found: ${e.roleId}`});try{let o=Ke(e.path);return s({roleId:e.roleId,path:e.path,config:o})}catch(o){return s({error:`Failed to scan directory: ${o}`})}}),u("cancel_task","Cancel a running or pending task by setting its status to 'cancelled'. Emits a task_status_change event.",er,async e=>{let t=x(e.taskId);if(!t)return s({error:`Task not found: ${e.taskId}`});let r=t.status;G(e.taskId,{status:"cancelled"});let{serverBus:o}=await import("./server-bus-GEGVMSCA.js");return o.emit({type:"task_status_change",taskId:e.taskId,oldStatus:r,newStatus:"cancelled"}),s({success:!0,taskId:e.taskId,status:"cancelled"})}),u("view_task_logs","Retrieve step-by-step execution logs for a task.",tr,async e=>{let t=Oe(e.taskId,e.limit??20);return s({taskId:e.taskId,count:t.length,logs:t})}),u("delete_role","Delete a role by ID. This removes the role and its workspace.",nr,async e=>I(e.roleId)?(qe(e.roleId),s({success:!0,roleId:e.roleId})):s({error:`Role not found: ${e.roleId}`})),u("view_config","Get the current runtime configuration (mutable fields and restart-required fields).",rr,async()=>{let{MUTABLE_PATHS:e,RESTART_REQUIRED_PATHS:t}=await import("./runtime-VDBZZ4KG.js"),r=_(),o={};try{let d=_().server?.port??7100,m=await fetch(`http://127.0.0.1:${d}/config`);m.ok&&(o=await m.json())}catch{}let i=[...e,...t],a=[...t],l={};for(let d of i){let m=d.split("."),c=r;for(let h of m)if(c&&typeof c=="object")c=c[h];else{c=void 0;break}l[d]={value:c,mutable:!t.includes(d)}}return s({config:l,mutable:[...e],restartRequired:[...t]})}),u("update_config","Update mutable runtime configuration fields. Returns partial-success: some fields may update while others return errors.",or,async e=>{let{isRestartRequiredPath:t}=await import("./runtime-VDBZZ4KG.js"),{setConfigValue:r}=await import("./config-KFPS7IEH.js"),o=$e(e.updates,r);if(e.updates["logging.level"]&&Me(e.updates["logging.level"]),o.updated.length>0){let{serverBus:i}=await import("./server-bus-GEGVMSCA.js");i.emit({type:"config_changed",changes:o.updated.map(a=>({path:a,value:e.updates[a]}))})}return s(o)}),u("list_memories","List memories stored under a specific role.",ir,async e=>{let t=at(e.roleId,e.limit??20);return s({roleId:e.roleId,count:t.length,memories:t})}),u("update_template","Update a task template's fields (name, prompt, cron, enabled, etc.).",sr,async e=>{let t=B(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});let r={};if(e.name!==void 0&&(r.name=e.name),e.enabled!==void 0&&(r.enabled=e.enabled),e.prompt!==void 0||e.autoSelectRole!==void 0||e.requirements!==void 0){let i=t.steps?.length?[...t.steps]:[];i.length===0&&i.push({id:T(),prompt:e.prompt??""});let a=i[0];i[0]={...a,...e.prompt!==void 0?{prompt:e.prompt}:{},...e.autoSelectRole!==void 0?{autoSelectRole:e.autoSelectRole}:{},...e.requirements!==void 0?{requirements:e.requirements}:{}},r.steps=i}if(e.triggerCron!==void 0||e.triggerEvent!==void 0||e.triggerType!==void 0||e.eventDefId!==void 0){let i=e.triggerType??(e.triggerEvent?e.triggerEvent.split(":")[0]:e.eventDefId?"event":"cron");if(i==="event"&&!e.eventDefId)return s({error:"eventDefId required when triggerType='event'"});r.trigger={type:i,...e.triggerCron!==void 0?{cron:e.triggerCron}:{},...e.triggerEvent!==void 0?{event:e.triggerEvent}:{},...e.eventDefId!==void 0?{eventDefId:e.eventDefId}:{}}}e.roleId!==void 0&&(r.rolePreference=e.roleId);try{lt(e.templateId,r)}catch(i){let{TemplateRoleConfigError:a}=await import("./task-templates-YPNWJOVV.js");if(i instanceof a)return s({code:i.code,error:i.message,failingStepIds:i.failingStepIds,hint:"Set roleId (recommended) OR autoSelectRole=true with a requirements object."});throw i}return s({success:!0,templateId:e.templateId,updated:Object.keys(r)})}),u("delete_template","Delete a task template by ID.",ar,async e=>B(e.templateId)?(ct(e.templateId),s({success:!0,templateId:e.templateId})):s({error:`Template not found: ${e.templateId}`})),u("run_template","Trigger a template immediately (runs the webhook endpoint for its name).",lr,async e=>{let t=B(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});try{let r=_().server?.port??7100,o=await fetch(`http://127.0.0.1:${r}/webhooks/${t.name}`,{method:"POST"}),i=await o.json();return o.ok?s({success:!0,templateId:e.templateId,templateName:t.name,response:i}):s({error:`Webhook failed: ${i.code??o.status} \u2014 ${i.message??""}`})}catch(r){return s({error:`Failed to trigger template: ${r}`})}}),u("list_delivery_rules","List delivery rules, optionally filtered by enabled status.",dr,async e=>{let t=we(e.enabled);return s({count:t.length,rules:t})}),u("create_delivery_rule","Create a new delivery rule for event-driven result routing.",cr,async e=>{let t=T(),r={id:t,eventType:e.eventType,matchCriteria:e.matchCriteria??{},target:{type:"channel",channelId:e.channelId},formatTemplate:e.format,maxPerMinute:10,skipOriginChannel:!1,enabled:e.enabled??!0,createdAt:Date.now()};return pt(r),s({success:!0,ruleId:t,rule:r})}),u("delete_delivery_rule","Delete a delivery rule by ID.",ur,async e=>we().find(o=>o.id===e.ruleId)?(mt(e.ruleId),s({success:!0,ruleId:e.ruleId})):s({error:`Delivery rule not found: ${e.ruleId}`})),u("list_strategies","List Thompson Sampling strategy populations for a role, or all strategies if roleId omitted.",pr,async e=>{let t;if(e.roleId)t=Xe(e.roleId);else{let{getDb:r}=await import("./db-PZ2V7UCK.js");t=r().prepare("SELECT * FROM strategies ORDER BY created_at").all().map(i=>({id:i.id,roleId:i.role_id,name:i.name,taskType:i.task_type,createdAt:i.created_at,updatedAt:i.updated_at??void 0,promptTemplate:i.prompt_template??"",alpha:i.alpha,beta:i.beta,totalTrials:i.trials,avgReward:i.total_reward&&i.trials>0?i.total_reward/i.trials:void 0,enabled:i.enabled===1}))}return s({roleId:e.roleId??null,count:t.length,strategies:t})}),u("authorize_task_operation","Authorize a pending privilege escalation for a task. The paused operation will proceed.",{taskId:n.string(),operationId:n.string().optional().describe("ID of the specific operation. If omitted, authorizes the most recent pending operation."),scope:n.enum(["once","permanent"]).default("once").describe("'once' = this operation only. 'permanent' = auto-authorize matching patterns in the future.")},async e=>{let t=he(e.taskId),r=e.operationId?t.find(i=>i.id===e.operationId):t.find(i=>i.status==="pending");return r?(new Q().resolvePlanApproval(r.id,"allow",e.scope),s({success:!0,operationId:r.id,decision:"allow",scope:e.scope})):s({error:"No pending operation found for this task"})}),u("deny_task_operation","Deny a pending privilege escalation for a task. The paused operation will be rejected.",{taskId:n.string(),operationId:n.string().optional(),reason:n.string().optional().describe("Reason for denial, provided to the executor as feedback.")},async e=>{let t=he(e.taskId),r=e.operationId?t.find(i=>i.id===e.operationId):t.find(i=>i.status==="pending");return r?(new Q().resolvePlanApproval(r.id,"deny","once",e.reason),s({success:!0,operationId:r.id,decision:"deny"})):s({error:"No pending operation found for this task"})})];function Qo(){return Lt.map(e=>e.name).sort().join(",")}function Zo(){return yn({name:"adam-tools",version:"1.0.0",tools:Lt})}export{Q as a,br as b,vr as c,ht as d,It as e,Ie as f,ke as g,kt as h,Tt as i,Dr as j,Rt as k,Dt as l,j as m,se as n,Te as o,Se as p,M as q,De as r,Ee as s,Pe as t,le as u,oo as v,H as w,xe as x,Qo as y,Zo as z};
79
+ - Include tools and paths required for the subtask where known. If unknown, omit the field.`,d=a({prompt:l,options:{cwd:process.cwd(),maxTurns:1,maxBudgetUsd:.02}}),m="";for await(let h of d){let f=h;f.type==="result"&&typeof f.result=="string"&&(m=f.result)}let c=m.match(/\[[\s\S]*\]/);if(c){let h=JSON.parse(c[0]),f=[];for(let g=0;g<Math.min(h.length,r);g++){let b=h[g],S=b.role,p=S?await wn(S):void 0,y=await ge({prompt:b.prompt,roleId:p,requirements:b.requirements,config:t.defaults});if(!y.ok){f.push({id:`admission-failed-${g}`,description:b.description,prompt:b.prompt,dependencies:g>0&&f.length>0?[f[g-1].id]:[],estimatedComplexity:b.complexity??"medium",role:S,admissionError:`${y.code}: ${y.reason}`});continue}f.push({id:y.taskId,description:b.description,prompt:b.prompt,dependencies:g>0?[f[g-1].id]:[],estimatedComplexity:b.complexity??"medium",role:S})}if(f.length>0)return s({subtasks:f})}}catch(a){G.error({error:a},"LLM decomposition failed, using fallback")}let o=await Xe({taskId:T(),roleId:void 0,autoSelectRole:!1}),i=[];return o.ok||i.push({id:"admission-blocked",description:`Decomposition fallback blocked: ${o.reason}`,prompt:e.goalDescription,dependencies:[],estimatedComplexity:"medium",admissionError:`${o.code}: ${o.reason}`}),s({subtasks:i})}),u("dispatch_task","Create and dispatch a task. Workflow: (1) call list_roles(requirements) to find candidate roles by fit; (2) call dispatch_task with requirements AND the chosen roleId. requirements is STRONGLY RECOMMENDED \u2014 when present, admission validates role fit before creation and returns structured mismatch diagnostics. If you cannot produce clear requirements from the user's message, ASK THE USER instead of dispatching. Pass deliverTo (result delivery) and/or reportTo (status reports) to route output when the task completes.",Sn,async e=>{if(!e.roleId&&!e.autoSelectRole){let i=A("active",20,0).filter(a=>a.source!=="system").map(a=>({id:a.id,name:a.name,allowedTools:a.allowedTools??[],capabilitySummary:C(a)}));return s({error:"Must provide roleId or autoSelectRole=true with requirements.",availableRoles:i})}let t=e.deliverTo?await _(e.deliverTo):void 0,r=e.reportTo?await _(e.reportTo):void 0,o=await ge({prompt:e.prompt,roleId:e.roleId,requirements:e.requirements,autoSelectRole:e.autoSelectRole,deliverTo:t,reportTo:r,toolOverrides:e.toolOverrides});if(!o.ok){let i=(o.candidates??[]).map(l=>({id:l.roleId,name:l.name,fitScore:l.fitScore,missing:l.missing})),a=i.length>0?i:A("active",20,0).filter(l=>l.source!=="system").map(l=>({id:l.id,name:l.name,allowedTools:l.allowedTools??[],capabilitySummary:C(l)}));return s({error:o.reason,code:o.code,missing:o.missing,availableRoles:a})}return s({taskId:o.taskId,roleId:o.roleId,fitScore:o.fitScore,strategyId:o.strategyId,warnings:o.warnings})}),u("dispatch_workflow","Create and execute a multi-role workflow. Use when the user's request decomposes into sequential or parallel steps handled by different roles. Each step is a complete task; roles handle conditions and decisions internally. Use {{stepId.result}} in prompts to reference prior step outputs. Minimum 2 steps.",{steps:n.array(n.object({id:n.string().describe("Unique step identifier"),prompt:n.string().describe("Task prompt for this step"),roleId:n.string().optional().describe("Role ID for this step. Call list_roles first to find roles."),requirements:L.optional().describe("Task requirements for this step (D-012)."),autoSelectRole:n.boolean().optional().describe("Auto-select best role for this step (D-012)."),dependsOn:n.array(n.string()).optional().describe("Step IDs this step depends on"),config:n.object({timeout:n.number().optional(),maxTurns:n.number().optional()}).optional()})).min(2).describe("Workflow steps (min 2)"),name:n.string().optional().describe("Workflow name for tracking"),deliverTo:n.array(E).optional().describe("Where to deliver the aggregated workflow output"),reportTo:n.array(E).optional().describe("Where to send workflow status reports"),continueOnError:n.boolean().optional().describe("Continue remaining steps if one fails (default false)")},async e=>{let t=[];for(let p of e.steps){if(!p.roleId&&!p.autoSelectRole){t.push(`${p.id} (needs roleId or autoSelectRole)`);continue}if(p.roleId){let y=I(p.roleId);(!y||y.status!=="active")&&t.push(`${p.id} (roleId ${p.roleId} invalid/inactive)`)}}if(t.length>0){let p=A("active",20,0).filter(y=>y.source!=="system").map(y=>({id:y.id,name:y.name,capabilitySummary:C(y)}));return s({error:`Steps missing roleId/autoSelectRole or with invalid roleIds: ${t.join("; ")}.`,availableRoles:p})}let r=new Set(e.steps.map(p=>p.id));for(let p of e.steps)if(p.dependsOn)for(let y of p.dependsOn){if(!r.has(y))return s({error:`Step "${p.id}" depends on unknown step "${y}"`});if(y===p.id)return s({error:`Step "${p.id}" cannot depend on itself`})}let o=new Set,i=new Set,a=new Map(e.steps.map(p=>[p.id,p.dependsOn??[]])),l=p=>{if(i.has(p))return!0;if(o.has(p))return!1;o.add(p),i.add(p);for(let y of a.get(p)??[])if(l(y))return!0;return i.delete(p),!1};for(let p of e.steps)if(l(p.id))return s({error:"Circular dependency detected in workflow steps"});let d=e.deliverTo?await _(e.deliverTo):void 0,m=e.reportTo?await _(e.reportTo):void 0,c=T(),h=R(),f={id:`workflow-${c}`,name:e.name??"Ad-hoc workflow",trigger:{type:"manual"},steps:e.steps.map(p=>({id:p.id,prompt:p.prompt,roleId:p.roleId,requirements:p.requirements,autoSelectRole:p.autoSelectRole,dependsOn:p.dependsOn,config:p.config})),enabled:!0,createdAt:Date.now(),config:{...h.defaults,continueOnError:e.continueOnError??!1},deliverTo:d,reportTo:m};try{ye(f)}catch(p){let{TemplateRoleConfigError:y}=await import("./task-templates-4KCZOUN5.js");if(p instanceof y)return s({code:p.code,error:p.message,failingStepIds:p.failingStepIds,hint:"Each step must have roleId OR autoSelectRole=true (with requirements). Use list_roles to find an appropriate role."});throw p}let{WorkflowExecutor:g}=await import("./workflow-executor-Z7JFMR56.js");new g().execute(f,c).catch(p=>{G.error({executionId:c,error:p},"dispatch_workflow execution failed")});let S=e.steps.map(p=>{let y=p.roleId??(p.autoSelectRole?"[auto-selected]":"[no role]");return(p.roleId?I(p.roleId):void 0)?.name??y});return s({executionId:c,templateId:f.id,stepCount:e.steps.length,roles:[...new Set(S)],status:"started"})}),u("evaluate_result","Evaluate a completed task's result and record a trial for Thompson Sampling.",_n,async e=>{let{goalId:t,taskId:r,strategyId:o}=e,i=ot(t??"",r);return o&&t&&$.recordTrial(o,t,r,i.reward,i.breakdown.L2||void 0,i.breakdown.L3||void 0,"Evaluated via adam-tools"),s({reward:i.reward,metricL2Score:i.breakdown.L2||void 0,metricL3Score:i.breakdown.L3||void 0,source:i.source,reasoning:`Evaluated via ${i.source} with confidence ${i.confidence.toFixed(2)}`})}),u("create_strategy","Create a new strategy variant for a role/taskType using LLM evolution.",Rn,async e=>{let{roleId:t,taskType:r}=e;await ie.generateVariants(t,r,3,1);let o=$.getStrategies(t,r),i=o[o.length-1];return s(i?{id:i.id,name:i.name,promptTemplate:i.promptTemplate}:{error:`Failed to create strategy for ${t}/${r}`})}),u("list_goals","List all goals with progress percentage, budget, deadline, and time remaining. Goal statuses: active (in progress), paused, completed, failed. Use this to check current goal status before making decisions.",Dn,async e=>{let t=e.status;return s(tt(t,e.limit??10,0))}),u("delete_goal","Delete a goal by ID.",{goalId:n.string()},async e=>q(e.goalId)?(nt(e.goalId),s({success:!0,goalId:e.goalId})):s({error:"Goal not found"})),u("pause_goal","Pause an active goal.",{goalId:n.string()},async e=>q(e.goalId)?(oe(e.goalId,{status:"paused",updatedAt:Date.now()}),s({success:!0,goalId:e.goalId,status:"paused"})):s({error:"Goal not found"})),u("assign_role","Assign a role to a pending task.",En,async e=>{let{taskId:t,roleId:r}=e;if(!P(t))return s({error:`Task not found: ${t}`});let i=I(r);return i?(V(t,{roleId:r}),G.debug({taskId:t,roleId:r,roleName:i.name},"Role assigned to task"),s({success:!0,taskId:t,roleId:r})):s({error:`Role not found: ${r}`})}),...pt(),u("read_task_status","Read a single task's details (prompt, status, result, roleId) by ID, or list all tasks filtered by status (pending, running, completed, failed). Use this to check task progress and results.",Cn,async e=>{if(e.taskId){let r=P(e.taskId);return s(r??{error:"Task not found"})}let t=e.status;return s(O(t,e.limit??100,0))}),u("modify_role_permissions","Update a role's RBAC permissions (paths, tools, OS capabilities).",xn,async e=>{if(!I(e.roleId))return s({error:`Role not found: ${e.roleId}`});let r={};if(e.allowedTools&&(r.allowedTools=e.allowedTools),e.disallowedTools&&(r.disallowedTools=e.disallowedTools),e.osCapabilities!==void 0)try{r.osCapabilities=ue(e.osCapabilities)}catch(o){return s({error:o instanceof Error?o.message:String(o)})}return e.additionalDirectories!==void 0&&(r.additionalDirectories=e.additionalDirectories),e.allowedChannels!==void 0&&(r.allowedChannels=e.allowedChannels),"inheritUserSettings"in e&&(r.inheritUserSettings=e.inheritUserSettings),U(e.roleId,r),s({success:!0})}),u("update_role","Update a role's identity and config fields (name, CAG prompt, learned rules, status, model, execution mode, preferences, permission mode, bash patterns, evaluation criteria, env vars). For permission fields (allowedTools, disallowedTools, osCapabilities, additionalDirectories, allowedChannels, inheritUserSettings) use modify_role_permissions instead.",Pn,async e=>{if(!I(e.roleId))return s({error:`Role not found: ${e.roleId}`});let{roleId:r,...o}=e,i={...o,updatedAt:Date.now()};U(r,i);let a=I(r);if(!a)return s({error:"Role disappeared after update"});if(e.cagPrompt!==void 0||e.learnedRules!==void 0){let l=me(a.name);Lt(l)&&Fe(l,a)}return s({success:!0,role:a})}),u("view_audit_log","View the evolution audit log for role changes.",An,async e=>{let{listEvolutionAudit:t}=await import("./evolution-audit-XMBDUN3T.js"),r=t(e.limit??50);return s({entries:r})}),u("list_roles","List all roles with their capabilities including bound plugins (skills/agents). Use this to discover available roles before dispatching tasks. Pass requirements to get ranked results with fitScore showing which roles best match the task.",Un,async e=>{if(e.requirements){let o=e.requirements,a=Ze(o).slice(0,e.limit??50).map(l=>{let d=l.role,m=ne(d),c=m.plugins.map(v=>v.name),h=me(d.name),f=He(d,h),g=o.tools?(d.allowedTools??[]).filter(v=>o.tools.includes(v)):void 0,b=o.paths?o.paths.filter(v=>Ye(v,f)):void 0,S=new Set((d.osCapabilities??[]).map(v=>v.id)),p=o.osCapabilities?o.osCapabilities.filter(v=>S.has(v.id)).map(v=>v.id):void 0,y=new Set(c),$e=o.plugins?o.plugins.filter(v=>y.has(v)):void 0,jt=o.network===!0?(d.osCapabilities??[]).some(v=>v.id==="local-network"):void 0,Ft=l.missing?.osCapabilities,Gt=Qe(d,o);return{id:d.id,name:d.name,status:d.status,allowedTools:d.allowedTools??[],disallowedTools:d.disallowedTools??[],osCapabilities:d.osCapabilities??[],additionalDirectories:d.additionalDirectories??[],cagPrompt:d.cagPrompt.slice(0,500)+(d.cagPrompt.length>500?"...":""),capabilitySummary:C(d,m),plugins:m.plugins.map(v=>({name:v.name,skills:v.skills.map(de=>de.name),agents:v.agents.map(de=>de.name)})),fitScore:l.fitScore,fits:l.evaluation.ok,matchedTools:g,matchedPaths:b,matchedOsCapabilities:p,matchedPlugins:$e,matchedNetwork:jt,missingCapabilities:l.missing?{tools:l.missing.tools,paths:l.missing.paths,osCapabilities:Ft?.map(v=>v.id),plugins:l.missing.plugins,network:l.missing.network}:void 0,warnings:Gt,why:l.evaluation.ok?`Role '${d.name}' satisfies all requirements (fitScore: ${l.fitScore.toFixed(2)})`:`Role '${d.name}' does not satisfy requirements: ${l.evaluation.ok?"unknown":l.evaluation.reason}`}});return s({roles:a})}let r=A(e.status,e.limit??50,0).map(o=>{let i=ne(o);return{id:o.id,name:o.name,status:o.status,allowedTools:o.allowedTools??[],disallowedTools:o.disallowedTools??[],osCapabilities:o.osCapabilities??[],additionalDirectories:o.additionalDirectories??[],cagPrompt:o.cagPrompt.slice(0,500)+(o.cagPrompt.length>500?"...":""),capabilitySummary:C(o,i),plugins:i.plugins.map(a=>({name:a.name,skills:a.skills.map(l=>l.name),agents:a.agents.map(l=>l.name)}))}});return s({roles:r})}),u("create_role","Create a new role with a name, CAG prompt, and optional tool permissions or OS capabilities.",$n,async e=>{let t;try{t=ue(e.osCapabilities)}catch(i){return s({error:i instanceof Error?i.message:String(i)})}let r=`role-${T().slice(0,8)}`,o={id:r,name:e.name,cagPrompt:e.cagPrompt,learnedRules:[],memoryStreamId:`mem-${T().slice(0,8)}`,status:"active",preferences:{},createdAt:Date.now(),allowedTools:e.allowedTools,disallowedTools:e.disallowedTools,osCapabilities:t,additionalDirectories:e.additionalDirectories};return qe(o),X(o),s({roleId:r,name:e.name,allowedTools:e.allowedTools,osCapabilities:o.osCapabilities,additionalDirectories:e.additionalDirectories??[]})}),u("retire_role","Retire a role (marks as retired, stops receiving tasks).",Mn,async e=>I(e.roleId)?(U(e.roleId,{status:"retired"}),G.info({roleId:e.roleId,reason:e.reason},"Role retired"),s({success:!0})):s({error:`Role not found: ${e.roleId}`})),u("create_goal","Create a new goal with optional budget, deadline, and metric tracking.",Nn,async e=>{let t=T(),r=Date.now(),o=r+10080*60*1e3,i={id:t,name:e.name,description:e.description,roleId:e.roleId??"engineer",metricType:e.metric??"completion",targetValue:e.targetValue??1,currentValue:0,deadline:e.deadline??o,budgetUsd:e.budgetUsd??5,status:"active",createdAt:r,deliverTo:e.deliverTo?await _(e.deliverTo):void 0};re(i),yt(t,i.metricType);let a=q(t);return s({goalId:a.id,name:a.name,status:a.status})}),u("create_template","Create a recurring scheduled task. triggerType values: 'cron' (recurring via cron expression), 'template_complete' (fires when a specific template's task completes; set triggerEvent to 'template_complete:<templateId>'), 'workflow_complete' (similar), 'event' (fires when an Event def fires; set eventDefId to the event def UUID \u2014 use list_event_defs or create_event_def first). For one-shot delayed tasks ('in 30 minutes', 'tomorrow at 3pm'), use schedule_task instead.",On,async e=>{let{createTaskTemplate:t}=await import("./task-templates-4KCZOUN5.js"),r=T(),o=T();if(e.triggerType==="event"&&!e.eventDefId)return s({error:"eventDefId required when triggerType='event'"});if(e.triggerType!=="event"&&e.eventDefId)return s({error:"eventDefId only valid when triggerType='event'"});let i=e.deliverTo?await _(e.deliverTo):void 0,a=e.reportTo?await _(e.reportTo):void 0,l={id:r,name:e.name,description:e.description,trigger:{type:e.triggerType,cron:e.triggerCron,event:e.triggerEvent,eventDefId:e.eventDefId},steps:[{id:o,prompt:e.prompt,...e.autoSelectRole!==void 0?{autoSelectRole:e.autoSelectRole}:{},...e.requirements!==void 0?{requirements:e.requirements}:{}}],rolePreference:e.roleId,enabled:e.enabled??!0,createdAt:Date.now(),goalIds:e.goalIds,deliverTo:i,reportTo:a};try{t(l)}catch(d){let{TemplateRoleConfigError:m}=await import("./task-templates-4KCZOUN5.js");if(d instanceof m)return s({code:d.code,error:d.message,failingStepIds:d.failingStepIds,hint:"Set roleId (recommended) OR autoSelectRole=true with a requirements object (e.g., {tools:['Read']}) on the template. Use list_roles to find an appropriate role."});throw d}return s({templateId:r,name:l.name,trigger:l.trigger})}),u("create_event_def","Create an Event definition \u2014 a user-configured source that fires on schedule/webhook/directory/manual. Event defs are the trigger half of the Event Slot; pair with create_template(triggerType='event', eventDefId=<returned id>) to bind work to the trigger. sourceType is validated at runtime against the installed source registry (currently: webhook, cron, directory_watch, manual \u2014 additional types may be registered at runtime). sourceConfig is per-type: cron \u2192 {cron: '0 9 * * *'}; directory_watch \u2192 {path: '/abs/path', glob?: '*.md'}; webhook/manual \u2192 {}.",{name:n.string().min(1).max(100).describe("Human-readable name (unique within workspace)."),sourceType:n.string().describe("Source type \u2014 validated against installed registry at call time. Currently: 'webhook' | 'cron' | 'directory_watch' | 'manual'. If the value is rejected, the error message lists the currently-registered types."),sourceConfig:n.record(n.string(),n.unknown()).describe("Per-sourceType configuration. See tool description."),enabled:n.boolean().optional().describe("Default true."),description:n.string().max(500).optional()},async e=>{if(!H().includes(e.sourceType))return s({error:`Unknown sourceType: '${e.sourceType}'. Currently registered: ${H().join(", ")}`});let t=Ae(e.sourceType,e.sourceConfig);if(!t.ok)return s({error:`Invalid sourceConfig: ${t.error}`});let r=T(),o=Et({id:r,name:e.name,sourceType:e.sourceType,sourceConfig:e.sourceConfig,enabled:e.enabled??!0,description:e.description});try{Pe(o)}catch(i){_e(r);let a=i instanceof Error?i.message:String(i);return s({error:`Failed to start source: ${a}. Event def was not created.`})}return s({id:o.id,name:o.name,sourceType:o.sourceType,enabled:o.enabled})}),u("list_event_defs","List Event definitions. Use before create_template(triggerType='event') to find the eventDefId, or before fire_event_def / list_event_firings.",{sourceType:n.string().optional().describe("Filter by source type (e.g., 'cron', 'webhook')."),enabled:n.boolean().optional().describe("Filter by enabled flag.")},async e=>{let t=se({sourceType:e.sourceType,enabled:e.enabled});return s(t.map(r=>({id:r.id,name:r.name,sourceType:r.sourceType,sourceConfig:r.sourceConfig,enabled:r.enabled,description:r.description,createdAt:r.createdAt})))}),u("update_event_def","Update an Event definition. Changing `enabled` or `sourceConfig` on an active def automatically restarts the runtime source handler. Use list_event_defs first to get the id.",{id:n.string().uuid().describe("Event def id."),name:n.string().min(1).max(100).optional(),sourceType:n.string().optional().describe("Only set when migrating to a different source type."),sourceConfig:n.record(n.string(),n.unknown()).optional(),enabled:n.boolean().optional(),description:n.string().max(500).optional()},async e=>{let t=F(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});if(e.sourceType!==void 0||e.sourceConfig!==void 0){let l=e.sourceType??t.sourceType;if(!H().includes(l))return s({error:`Unknown sourceType: '${l}'`});let d=Ae(l,e.sourceConfig??t.sourceConfig);if(!d.ok)return s({error:`Invalid sourceConfig: ${d.error}`})}let r=t.enabled,o=e.enabled??t.enabled,i=e.sourceType!==void 0||e.sourceConfig!==void 0;r&&(!o||i)&&le(t.id,t.sourceType);let a=Se(e.id,{name:e.name,sourceType:e.sourceType,sourceConfig:e.sourceConfig,enabled:e.enabled,description:e.description});if(!a)return s({error:"Update failed"});if(o&&(!r||i))try{Pe(a)}catch(l){Se(e.id,{enabled:!1});let d=l instanceof Error?l.message:String(l);return s({error:`Failed to start source with new config: ${d}. Event def has been marked disabled to match runtime state.`})}return s({id:a.id,name:a.name,sourceType:a.sourceType,enabled:a.enabled})}),u("delete_event_def","Delete an Event definition. Stops the runtime source handler (cron/fswatch) first, then deletes the DB row. Templates bound to this event def become orphaned and will not fire.",{id:n.string().uuid().describe("Event def id.")},async e=>{let t=F(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});try{le(t.id,t.sourceType)}catch(o){G.warn({defId:t.id,err:o},"stopEventDefSource failed during delete \u2014 proceeding with row deletion")}let r=_e(e.id);return s({ok:r,id:e.id})}),u("fire_event_def","Fire an Event definition now. For manual defs: creates a real manual event (same as clicking 'Fire now' in the UI). For any source type: with test=true, creates a synthetic test event (source='manual-test-<defId>') that flows through the EventDispatcher \u2014 useful for debugging why a Template bound to the event didn't fire. Payload is optional.",{id:n.string().uuid().describe("Event def id."),test:n.boolean().optional().describe("Test mode. Required (=true) when source type != 'manual'. Default false. In test mode the event does NOT collide with real firings' dedup keys."),payload:n.record(n.string(),n.unknown()).optional().describe("Optional event payload. Must be < 64 KB when JSON-serialized.")},async e=>{let t=F(e.id);if(!t)return s({error:`Event def '${e.id}' not found`});let r=e.test===!0;if(t.sourceType!=="manual"&&!r)return s({error:`Can only directly fire manual event defs; this def has source type '${t.sourceType}'. Pass test=true to dry-run.`});if(e.payload){let o=Buffer.byteLength(JSON.stringify(e.payload),"utf8");if(o>65536)return s({error:`Payload exceeds 64 KB limit (got ${o} bytes)`})}try{let o=r?Ce(t,e.payload):Ee(t,e.payload);return s({ok:!0,eventId:o.eventId,test:r})}catch(o){let i=o instanceof Error?o.message:String(o);return s({error:i})}}),u("list_event_firings","List recent firings of an Event definition \u2014 for debugging 'why didn't my automation fire' and inspecting event history. Returns id, occurredAt, type, source, dedupKey, confidence, and a truncated payload (500 char cap for display). For full payloads, use REST GET /event-defs/:id/firings.",{eventDefId:n.string().uuid().describe("Event def id. Use list_event_defs to find it."),since:n.string().optional().describe("ISO 8601 start timestamp (inclusive). Omit for unlimited range."),until:n.string().optional().describe("ISO 8601 end timestamp (inclusive)."),limit:n.number().int().positive().max(500).optional().describe("Max rows (default 50, max 500).")},async e=>{let t=F(e.eventDefId);if(!t)return s({error:`Event def '${e.eventDefId}' not found`});let r=Rt({eventDefId:e.eventDefId,since:e.since,until:e.until,limit:e.limit??50}),o=500;return s({eventDefName:t.name,sourceType:t.sourceType,count:r.length,firings:r.map(i=>{let a=JSON.stringify(i.payload);return{id:i.id,occurredAt:i.occurredAt,type:i.type,source:i.source,dedupKey:i.dedupKey,confidence:i.confidence,payloadPreview:a.length>o?a.slice(0,o)+"...[truncated]":a,payloadTruncated:a.length>o}})})}),u("create_skill","Author a Claude Code Skill file under a target Role's workspace. The Skill becomes available next time the Role runs. Preset Roles (Engineer, Reviewer, Researcher, Writer, Chat Manager, adam-automator) require overwrite=true to replace an existing skill \u2014 first-time creation is unrestricted. Returns the written file path.",{roleId:n.string().describe("Role to target. Use list_roles to find it."),skillName:n.string().regex(/^[a-z0-9_][a-z0-9_-]{0,39}$/,"skillName must be 1-40 chars: lowercase letters, digits, underscores, optional hyphen in middle. No leading dot or dash.").describe("Skill directory name (used as the directory under .claude/skills/)."),description:n.string().max(500).describe("One-line description shown to the Role's LLM when choosing a Skill."),instructions:n.string().describe("The skill body: what it does and how to do it."),parameters:n.record(n.string(),n.object({type:n.string().describe("Parameter type name"),description:n.string().describe("Parameter description")})).optional().describe("Named input parameters and their types."),overwrite:n.boolean().optional().describe("Required (=true) to overwrite an existing SKILL.md under a preset Role (Engineer, Reviewer, Researcher, Writer, Chat Manager, adam-automator). First-time skill creation and non-preset Roles do not require this flag.")},async e=>{let{getRole:t}=await import("./roles-ZYCFQMAY.js"),{ensureRoleWorkspace:r}=await import("./role-workspace-NKGAH6J6.js"),{mkdir:o,writeFile:i}=await import("fs/promises"),{resolve:a}=await import("path"),l=t(e.roleId);if(!l)return s({error:`Role '${e.roleId}' not found`});let d=r(l),m=a(d,".claude","skills",e.skillName);if(Ge(l)){let{existsSync:g}=await import("fs"),b=a(m,"SKILL.md");if(g(b)&&e.overwrite!==!0)return s({error:`Role '${l.name}' is a preset. Skill '${e.skillName}' already exists at ${b}. Pass overwrite=true to replace, or choose a different skillName to add alongside.`,requiresOverwrite:!0,existingPath:b})}let c=a(d,".claude","skills");if(!m.startsWith(c+(process.platform==="win32"?"\\":"/")))return s({error:"Path traversal rejected"});await o(m,{recursive:!0});let h=vn(e),f=a(m,"SKILL.md");return await i(f,h,"utf8"),s({ok:!0,path:f})}),u("list_templates","List task templates (automations). Use this to check existing scheduled/recurring tasks before creating new ones.",{enabled:n.boolean().optional().describe("Filter by enabled status. Omit to list all."),limit:n.number().optional().describe("Max results (default 50)")},async e=>{let{listTaskTemplates:t}=await import("./task-templates-4KCZOUN5.js"),r=t(e.enabled,e.limit??50,0);return s(r.map(o=>({id:o.id,name:o.name,description:o.description,trigger:o.trigger,enabled:o.enabled,rolePreference:o.rolePreference,deliverTo:o.deliverTo,createdAt:o.createdAt})))}),u("send_to_channel","Send a message (text, image, voice, video, file) to a connected channel by name. Use this to deliver task results, media, or notifications to a specific channel (e.g., WeChat on iPad). For media: provide mediaUrl as an absolute local file path and mediaType. Do NOT use remote URLs \u2014 download files locally first.",{channelName:n.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:n.string().describe("The message content to send (text caption when sending media)"),mediaUrl:n.string().optional().describe("Absolute local file path to the media file (e.g. /Users/.../file.png). Must exist on disk. Do NOT use remote URLs \u2014 download files locally first."),mediaType:n.enum(["image","audio","video","file"]).optional().describe("Type of the media file. Required when mediaUrl is provided")},async e=>{if(e.mediaUrl){if(e.mediaUrl.includes("://")&&!e.mediaUrl.startsWith("file://"))return s({error:`mediaUrl must be a local file path, not a remote URL. Got: ${e.mediaUrl.slice(0,80)}. Download the file to a local path first, then pass the local path.`});let l=e.mediaUrl.startsWith("file://")?new URL(e.mediaUrl).pathname:e.mediaUrl;if(!Lt(l))return s({error:`Media file not found: ${l}. Verify the file exists before sending.`});if(!e.mediaType)return s({error:"mediaType is required when mediaUrl is provided. Specify one of: image, audio, video, file."})}let t=await _([{type:"channel",channelName:e.channelName}]);if(t.length===0)return s({error:`Channel "${e.channelName}" not found or no chatId available`});let r=t[0];if(r.type!=="channel")return s({error:"Resolved target is not a channel"});let{getOutboundGateway:o}=await import("./outbound-gateway-H7RFG6D2.js"),a=await o().send({channelId:r.channelId,chatId:r.chatId,content:e.message,messageType:"deliver",mediaUrl:e.mediaUrl,mediaType:e.mediaType});return s({success:a.success,channelName:e.channelName,...a.error?{error:a.error}:{}})}),u("list_channels","List all connected channels with their platform, status, and chatId for message delivery. Use this to discover available channels before sending messages or setting up notifications.",Ln,async e=>{let t=ve(e.enabled),r=[...we("active"),...we("archived")],o=t.map(i=>{let a,l=r.find(d=>d.source.type==="channel"&&d.source.channelId===i.id&&d.source.chatId);return l?.source.chatId?a=l.source.chatId:a=i.config?.userId,{id:i.id,name:i.name,platform:i.platform,status:i.status,chatId:a}});return s({channels:o})}),u("get_system_status","Get current system status: execution pool capacity (active/max/queued slots), running task count, and system health. Use this to check if the system has capacity before dispatching tasks.",qn,async()=>{let e=R(),t=O("running"),r=O("pending");return s({executionPool:{active:t.length,max:e.execution?.maxConcurrent??5,queued:r.length},timestamp:new Date().toISOString()})}),u("schedule_task","Schedule a one-shot delayed task. roleId is required \u2014 call list_roles first. Use this when the user wants something done later (e.g., '\u534A\u5C0F\u65F6\u540E', 'in 30 minutes', 'tomorrow at 3pm'). For recurring schedules ('every day', 'weekly'), use create_template instead.",Fn,async e=>{let t=I(e.roleId);if(!t||t.status!=="active"){let f=A("active",20,0).filter(g=>g.source!=="system").map(g=>({id:g.id,name:g.name,allowedTools:g.allowedTools??[],capabilitySummary:C(g)}));return s({error:`Role not found or not active: ${e.roleId}. Pick a roleId from the list below.`,availableRoles:f})}let r=Date.now(),o;if(e.delayMinutes!==void 0&&e.runAt!==void 0)return s({error:"Provide exactly one of delayMinutes or runAt, not both"});if(e.delayMinutes!==void 0)o=r+e.delayMinutes*60*1e3;else if(e.runAt!==void 0){if(o=new Date(e.runAt).getTime(),isNaN(o))return s({error:"Invalid ISO 8601 timestamp in runAt"})}else return s({error:"Provide either delayMinutes or runAt"});if(o<=r)return s({error:"Scheduled time must be in the future"});let i=10080*60*1e3;if(o-r>i)return s({error:"Schedule exceeds maximum of 7 days"});let a=T(),l=new Date(o).toISOString(),d=e.deliverTo?await _(e.deliverTo):void 0,m=e.reportTo?await _(e.reportTo):void 0;ye({id:a,name:e.prompt.slice(0,80),description:`One-shot scheduled task: ${e.prompt.slice(0,200)}`,trigger:{type:"once",runAt:l},steps:[{id:"main",prompt:e.prompt}],rolePreference:e.roleId,config:{...R().defaults},tags:["scheduled","once"],enabled:!0,createdAt:r,deliverTo:d,reportTo:m});let{getBreeEngine:c}=await import("./bree-engine-7S33CWS7.js"),h=c();return h&&h.scheduleOnceJob(a),s({templateId:a,executeAt:l,prompt:e.prompt})}),u("cancel_scheduled_task","Cancel a previously scheduled one-shot task by its template ID. The task will not execute.",{templateId:n.string().describe("The template ID returned by schedule_task")},async e=>{let t=j(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});if(t.trigger.type!=="once")return s({error:"This is not a one-shot scheduled task. Use disable_template for recurring automations."});ct(e.templateId);let{getBreeEngine:r}=await import("./bree-engine-7S33CWS7.js"),o=r();return o&&await o.unscheduleJob(e.templateId),s({cancelled:!0,templateId:e.templateId})}),u("list_available_plugins","List all installed plugins with their scope and global enabled state. If roleId is provided, shows which plugins are installed in that role's workspace.",Gn,async e=>{let t=Ve(),r=te(),o=e.roleId?(()=>{let{getRoleWorkspacePath:i}=(ee(),x(fe)),{getRole:a}=(Z(),x(pe)),{listInstalledPlugins:l}=(Je(),x(Bt)),d=a(e.roleId);if(!d)return[];let m=i(d.name);return l({scope:"project",projectPath:m}).map(c=>c.id)})():[];return s({plugins:r.map(i=>({id:i.id,name:i.name,scope:i.scope,projectPath:i.projectPath,enabled:i.enabled,globalEnabled:t[i.id]??i.enabled,isInstalledInRole:o.includes(i.id),description:i.version?`v${i.version}`:void 0}))})}),u("install_plugin_for_role","Install a plugin into a role's workspace (project-scope). The plugin will be available when that role executes tasks.",Vn,async e=>{let{getRole:t}=(Z(),x(pe)),{getRoleWorkspacePath:r}=(ee(),x(fe)),o=t(e.roleId);if(!o)return s({error:`Role not found: ${e.roleId}`});let i=r(o.name);try{return ke(e.pluginId,"project",i),s({success:!0,roleId:e.roleId,pluginId:e.pluginId,scope:"project",cwd:i})}catch(a){return s({error:`Failed to install plugin: ${a}`})}}),u("uninstall_plugin_from_role","Uninstall a plugin from a role's workspace.",Wn,async e=>{let{getRole:t}=(Z(),x(pe)),{getRoleWorkspacePath:r}=(ee(),x(fe)),o=t(e.roleId);if(!o)return s({error:`Role not found: ${e.roleId}`});let i=r(o.name);try{return Te(e.pluginId,"project",i),s({success:!0,roleId:e.roleId,pluginId:e.pluginId})}catch(a){return s({error:`Failed to uninstall plugin: ${a}`})}}),u("bind_mcp_to_role","Bind an MCP server configuration to a role. The MCP server will be available to the role during task execution.",Bn,async e=>{let t=I(e.roleId);if(!t)return s({error:`Role not found: ${e.roleId}`});let o={...t.mcpServers??{},[e.mcpName]:e.mcpConfig};try{return U(e.roleId,{mcpServers:o}),X(t),s({success:!0,roleId:e.roleId,mcpName:e.mcpName,mcpServers:o})}catch(i){return s({error:`Failed to bind MCP server: ${i}`})}}),u("unbind_mcp_from_role","Remove an MCP server binding from a role.",Kn,async e=>{let t=I(e.roleId);if(!t)return s({error:`Role not found: ${e.roleId}`});let r={...t.mcpServers??{}};if(!(e.mcpName in r))return s({error:`MCP server "${e.mcpName}" not bound to this role`});delete r[e.mcpName];try{return U(e.roleId,{mcpServers:r}),X(t),s({success:!0,roleId:e.roleId,mcpName:e.mcpName})}catch(o){return s({error:`Failed to unbind MCP server: ${o}`})}}),u("get_capabilities","Get a comprehensive overview of Adam's current capabilities: available roles and their tools, OS capability registry, connected channels, installed plugins, active automations, and execution capacity. Call this when the user asks what you can do, or asks for help.",jn,async()=>{let{listTaskTemplates:e}=await import("./task-templates-4KCZOUN5.js"),t=R(),r=A(void 0,100,0),o=ve(),i=e(!0,100,0),a=O("running"),l=O("pending"),d=gt(),m=await ht();return s({roles:{description:"Specialized worker identities \u2014 each has its own tools, MCP servers, plugins (skills/agents), and learned rules",active:r.filter(c=>c.status==="active"&&c.source!=="system").map(c=>{let h=ne(c);return{name:c.name,tools:c.allowedTools??[],osCapabilities:c.osCapabilities??[],mcpServers:Object.keys(c.mcpServers??{}),channels:c.allowedChannels??[],capabilitySummary:C(c,h),plugins:h.plugins.map(f=>({name:f.name,skills:f.skills.map(g=>g.name),agents:f.agents.map(g=>g.name)}))}}),retired:r.filter(c=>c.status==="retired").length,probation:r.filter(c=>c.status==="probation").length},osCapabilities:{description:"Role-level OS capability registry. Only editable entries can be assigned to roles on this runtime.",sandbox:{platform:d.platform,available:m},registry:Le(d.platform,m)},channels:{description:"Send/receive messages via connected platforms",connected:o.filter(c=>c.enabled).map(c=>({name:c.name,platform:c.platform,status:c.status}))},plugins:{description:"Extensions that add capabilities to roles",installed:te().filter(c=>c.enabled).map(c=>({name:c.name,scope:c.scope,description:c.version?`v${c.version}`:void 0}))},automations:{description:"Recurring cron tasks and event-triggered templates",active:i.map(c=>({name:c.name,trigger:c.trigger}))},execution:{description:"Parallel task execution pool",maxConcurrent:t.execution?.maxConcurrent??5,running:a.length,queued:l.length},coreFeatures:["Goal management \u2014 SMART goals with budget/deadline/metric, auto-decomposition into subtasks","Memory \u2014 per-Role vector + keyword searchable memory across tasks","Strategy evolution \u2014 Thompson Sampling optimizes task approaches over time","Monitor \u2014 automatic quality scoring, role retirement/reinstatement","Delivery engine \u2014 event-driven result routing to channels/webhooks","Schedule \u2014 cron recurring templates + one-shot delayed tasks"]})}),u("enable_plugin","Enable a globally installed plugin (makes it available to all roles).",zn,async e=>{try{return Tt(e.pluginId),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to enable plugin: ${t}`})}}),u("disable_plugin","Disable a globally installed plugin (removes it from all roles).",Jn,async e=>{try{return St(e.pluginId),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to disable plugin: ${t}`})}}),u("install_plugin_for_user","Install a plugin globally for the current user (user-scope).",Hn,async e=>{try{return ke(e.pluginId,"user"),s({success:!0,pluginId:e.pluginId,scope:"user"})}catch(t){return s({error:`Failed to install plugin: ${t}`})}}),u("uninstall_plugin_for_user","Uninstall a globally installed plugin from the current user.",Yn,async e=>{try{return Te(e.pluginId,"user"),s({success:!0,pluginId:e.pluginId})}catch(t){return s({error:`Failed to uninstall plugin: ${t}`})}}),u("browse_marketplace","Browse all available plugins from configured marketplaces (shows installed and available).",Qn,async()=>{try{let e=kt(),t=te();return s({available:e,installed:t})}catch(e){return s({error:`Failed to browse marketplace: ${e}`})}}),u("list_marketplace_sources","List configured plugin marketplace sources.",Zn,async()=>{let e=Ke();return s({sources:e})}),u("get_plugin_detail","Get detailed manifest for an installed plugin (skills, agents, MCP servers, hooks).",Xn,async e=>{let t=Be(e.pluginId);if(!t)return s({error:`Plugin not found: ${e.pluginId}`});let r=We(t.installPath);return s({id:t.id,name:t.name,version:t.version,scope:t.scope,projectPath:t.projectPath,enabled:t.enabled,manifest:r})}),u("scan_directory","Scan a directory for .claude/settings.json and return its plugin/MCP configuration.",er,async e=>{let{getRole:t}=await import("./roles-ZYCFQMAY.js");if(!t(e.roleId))return s({error:`Role not found: ${e.roleId}`});try{let o=ze(e.path);return s({roleId:e.roleId,path:e.path,config:o})}catch(o){return s({error:`Failed to scan directory: ${o}`})}}),u("cancel_task","Cancel a running or pending task by setting its status to 'cancelled'. Emits a task_status_change event.",tr,async e=>{let t=P(e.taskId);if(!t)return s({error:`Task not found: ${e.taskId}`});let r=t.status;V(e.taskId,{status:"cancelled"});let{serverBus:o}=await import("./server-bus-GEGVMSCA.js");return o.emit({type:"task_status_change",taskId:e.taskId,oldStatus:r,newStatus:"cancelled"}),s({success:!0,taskId:e.taskId,status:"cancelled"})}),u("view_task_logs","Retrieve step-by-step execution logs for a task.",nr,async e=>{let t=Ue(e.taskId,e.limit??20);return s({taskId:e.taskId,count:t.length,logs:t})}),u("delete_role","Delete a role by ID. This removes the role and its workspace.",rr,async e=>I(e.roleId)?(je(e.roleId),s({success:!0,roleId:e.roleId})):s({error:`Role not found: ${e.roleId}`})),u("view_config","Get the current runtime configuration (mutable fields and restart-required fields).",or,async()=>{let{MUTABLE_PATHS:e,RESTART_REQUIRED_PATHS:t}=await import("./runtime-VDBZZ4KG.js"),r=R(),o={};try{let d=R().server?.port??7100,m=await fetch(`http://127.0.0.1:${d}/config`);m.ok&&(o=await m.json())}catch{}let i=[...e,...t],a=[...t],l={};for(let d of i){let m=d.split("."),c=r;for(let h of m)if(c&&typeof c=="object")c=c[h];else{c=void 0;break}l[d]={value:c,mutable:!t.includes(d)}}return s({config:l,mutable:[...e],restartRequired:[...t]})}),u("update_config","Update mutable runtime configuration fields. Returns partial-success: some fields may update while others return errors.",ir,async e=>{let{isRestartRequiredPath:t}=await import("./runtime-VDBZZ4KG.js"),{setConfigValue:r}=await import("./config-HBQPBIWL.js"),o=Me(e.updates,r);if(e.updates["logging.level"]&&Ne(e.updates["logging.level"]),o.updated.length>0){let{serverBus:i}=await import("./server-bus-GEGVMSCA.js");i.emit({type:"config_changed",changes:o.updated.map(a=>({path:a,value:e.updates[a]}))})}return s(o)}),u("list_memories","List memories stored under a specific role.",sr,async e=>{let t=lt(e.roleId,e.limit??20);return s({roleId:e.roleId,count:t.length,memories:t})}),u("update_template","Update a task template's fields (name, prompt, cron, enabled, etc.).",ar,async e=>{let t=j(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});let r={};if(e.name!==void 0&&(r.name=e.name),e.enabled!==void 0&&(r.enabled=e.enabled),e.prompt!==void 0||e.autoSelectRole!==void 0||e.requirements!==void 0){let i=t.steps?.length?[...t.steps]:[];i.length===0&&i.push({id:T(),prompt:e.prompt??""});let a=i[0];i[0]={...a,...e.prompt!==void 0?{prompt:e.prompt}:{},...e.autoSelectRole!==void 0?{autoSelectRole:e.autoSelectRole}:{},...e.requirements!==void 0?{requirements:e.requirements}:{}},r.steps=i}if(e.triggerCron!==void 0||e.triggerEvent!==void 0||e.triggerType!==void 0||e.eventDefId!==void 0){let i=e.triggerType??(e.triggerEvent?e.triggerEvent.split(":")[0]:e.eventDefId?"event":"cron");if(i==="event"&&!e.eventDefId)return s({error:"eventDefId required when triggerType='event'"});r.trigger={type:i,...e.triggerCron!==void 0?{cron:e.triggerCron}:{},...e.triggerEvent!==void 0?{event:e.triggerEvent}:{},...e.eventDefId!==void 0?{eventDefId:e.eventDefId}:{}}}e.roleId!==void 0&&(r.rolePreference=e.roleId);try{dt(e.templateId,r)}catch(i){let{TemplateRoleConfigError:a}=await import("./task-templates-4KCZOUN5.js");if(i instanceof a)return s({code:i.code,error:i.message,failingStepIds:i.failingStepIds,hint:"Set roleId (recommended) OR autoSelectRole=true with a requirements object."});throw i}return s({success:!0,templateId:e.templateId,updated:Object.keys(r)})}),u("get_template_dependents","Count workflow_executions and tasks that depend on a template. Use this BEFORE delete_template to show the user what will be affected. Returns { executionCount, taskCount, hasDependents }. If hasDependents is false, delete_template is safe with mode='template_only'. If true, you MUST ask the user whether to delete the template only (keeps tasks as history) or delete with its tasks (removes tasks and their score history). Never pick the mode yourself.",dr,async e=>{let t=j(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});let r=be(e.templateId);return s({templateId:e.templateId,templateName:t.name,executionCount:r.executionCount,taskCount:r.taskCount,hasDependents:r.executionCount>0||r.taskCount>0})}),u("delete_template","Delete a task template by ID. PRECONDITION: you must have called get_template_dependents first. If executionCount > 0 or taskCount > 0, you must have shown the user those counts and received explicit confirmation of which mode to use. Call this tool only after the user picks 'template_only' or 'with_tasks'. Passing a mode without user confirmation violates the skill's safety contract.",lr,async e=>{let t=j(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});let r=be(e.templateId);return ut(e.templateId,e.mode),s({success:!0,templateId:e.templateId,templateName:t.name,mode:e.mode,deleted:{template:1,workflowExecutions:r.executionCount,tasks:e.mode==="with_tasks"?r.taskCount:0}})}),u("run_template","Trigger a template immediately (runs the webhook endpoint for its name).",cr,async e=>{let t=j(e.templateId);if(!t)return s({error:`Template not found: ${e.templateId}`});try{let r=R().server?.port??7100,o=await fetch(`http://127.0.0.1:${r}/webhooks/${t.name}`,{method:"POST"}),i=await o.json();return o.ok?s({success:!0,templateId:e.templateId,templateName:t.name,response:i}):s({error:`Webhook failed: ${i.code??o.status} \u2014 ${i.message??""}`})}catch(r){return s({error:`Failed to trigger template: ${r}`})}}),u("list_delivery_rules","List delivery rules, optionally filtered by enabled status.",ur,async e=>{let t=Ie(e.enabled);return s({count:t.length,rules:t})}),u("create_delivery_rule","Create a new delivery rule for event-driven result routing.",pr,async e=>{let t=T(),r={id:t,eventType:e.eventType,matchCriteria:e.matchCriteria??{},target:{type:"channel",channelId:e.channelId},formatTemplate:e.format,maxPerMinute:10,skipOriginChannel:!1,enabled:e.enabled??!0,createdAt:Date.now()};return mt(r),s({success:!0,ruleId:t,rule:r})}),u("delete_delivery_rule","Delete a delivery rule by ID.",mr,async e=>Ie().find(o=>o.id===e.ruleId)?(ft(e.ruleId),s({success:!0,ruleId:e.ruleId})):s({error:`Delivery rule not found: ${e.ruleId}`})),u("list_strategies","List Thompson Sampling strategy populations for a role, or all strategies if roleId omitted.",fr,async e=>{let t;if(e.roleId)t=et(e.roleId);else{let{getDb:r}=await import("./db-QEWTZGU3.js");t=r().prepare("SELECT * FROM strategies ORDER BY created_at").all().map(i=>({id:i.id,roleId:i.role_id,name:i.name,taskType:i.task_type,createdAt:i.created_at,updatedAt:i.updated_at??void 0,promptTemplate:i.prompt_template??"",alpha:i.alpha,beta:i.beta,totalTrials:i.trials,avgReward:i.total_reward&&i.trials>0?i.total_reward/i.trials:void 0,enabled:i.enabled===1}))}return s({roleId:e.roleId??null,count:t.length,strategies:t})}),u("authorize_task_operation","Authorize a pending privilege escalation for a task. The paused operation will proceed.",{taskId:n.string(),operationId:n.string().optional().describe("ID of the specific operation. If omitted, authorizes the most recent pending operation."),scope:n.enum(["once","permanent"]).default("once").describe("'once' = this operation only. 'permanent' = auto-authorize matching patterns in the future.")},async e=>{let t=he(e.taskId),r=e.operationId?t.find(i=>i.id===e.operationId):t.find(i=>i.status==="pending");return r?(new Q().resolvePlanApproval(r.id,"allow",e.scope),s({success:!0,operationId:r.id,decision:"allow",scope:e.scope})):s({error:"No pending operation found for this task"})}),u("deny_task_operation","Deny a pending privilege escalation for a task. The paused operation will be rejected.",{taskId:n.string(),operationId:n.string().optional(),reason:n.string().optional().describe("Reason for denial, provided to the executor as feedback.")},async e=>{let t=he(e.taskId),r=e.operationId?t.find(i=>i.id===e.operationId):t.find(i=>i.status==="pending");return r?(new Q().resolvePlanApproval(r.id,"deny","once",e.reason),s({success:!0,operationId:r.id,decision:"deny"})):s({error:"No pending operation found for this task"})})];function Xo(){return qt.map(e=>e.name).sort().join(",")}function ei(){return bn({name:"adam-tools",version:"1.0.0",tools:qt})}export{Q as a,wr as b,Ir as c,yt as d,kt as e,ke as f,Te as g,Tt as h,St as i,Cr as j,Rt as k,Et as l,F as m,se as n,Se as o,_e as p,M as q,Ee as r,Ce as s,Pe as t,le as u,so as v,H as w,Ae as x,_ as y,Xo as z,ei as A};
@@ -1,4 +1,4 @@
1
- import{q as C}from"./chunk-MDBVKBC7.js";import{a as D}from"./chunk-N4ES7TCL.js";import{b as _}from"./chunk-I7ZZKPHE.js";import{b as A}from"./chunk-VVSZZK5T.js";import{b as T}from"./chunk-YXYIA24D.js";import{a as S}from"./chunk-L7JP7DUO.js";import{d as b}from"./chunk-PG6LMSX6.js";import{l as x,r as F}from"./chunk-7ZGSJCX5.js";import{b as w,d as $}from"./chunk-NCFVJCNQ.js";import{c as E,h as N}from"./chunk-MRTJFYPR.js";N();F();$();function O(u){return{id:u.id,templateId:u.template_id,status:u.status,stepStatuses:JSON.parse(u.step_statuses),startedAt:u.started_at,completedAt:u.completed_at??void 0,error:u.error??void 0,eventId:u.event_id??void 0}}function M(u,e,t){w().prepare(`
1
+ import{q as C}from"./chunk-6KF7OO2B.js";import{a as D}from"./chunk-N4ES7TCL.js";import{b as v}from"./chunk-K4C43YDD.js";import{b as A}from"./chunk-RI3V72RP.js";import{b as T}from"./chunk-GSFLLRS7.js";import{a as S}from"./chunk-L7JP7DUO.js";import{d as E}from"./chunk-PG6LMSX6.js";import{l as x,r as F}from"./chunk-HQRUJQN7.js";import{b as w,d as $}from"./chunk-5EPG2US5.js";import{c as b,h as N}from"./chunk-MRTJFYPR.js";N();F();$();function O(u){return{id:u.id,templateId:u.template_id,status:u.status,stepStatuses:JSON.parse(u.step_statuses),startedAt:u.started_at,completedAt:u.completed_at??void 0,error:u.error??void 0,eventId:u.event_id??void 0}}function M(u,e,t){w().prepare(`
2
2
  INSERT INTO workflow_executions (id, template_id, status, step_statuses, started_at, event_id)
3
3
  VALUES (?, ?, 'running', '{}', ?, ?)
4
4
  `).run(u,e,Date.now(),t??null)}function h(u){let t=w().prepare("SELECT * FROM workflow_executions WHERE id = ?").get(u);return t?O(t):void 0}function R(u,e){let t=w(),n=[],s=[];e.status!==void 0&&(n.push("status = ?"),s.push(e.status)),e.stepStatuses!==void 0&&(n.push("step_statuses = ?"),s.push(JSON.stringify(e.stepStatuses))),e.completedAt!==void 0&&(n.push("completed_at = ?"),s.push(e.completedAt)),e.error!==void 0&&(n.push("error = ?"),s.push(e.error)),n.length!==0&&(s.push(u),t.prepare(`UPDATE workflow_executions SET ${n.join(", ")} WHERE id = ?`).run(...s))}function L(u,e=50,t=0){let n=w(),s="SELECT * FROM workflow_executions",a=[];return u&&(s+=" WHERE template_id = ?",a.push(u)),s+=" ORDER BY started_at DESC LIMIT ? OFFSET ?",a.push(e,t),n.prepare(s).all(...a).map(O)}function B(u,e=20,t=0){return w().prepare(`
@@ -18,10 +18,10 @@ import{q as C}from"./chunk-MDBVKBC7.js";import{a as D}from"./chunk-N4ES7TCL.js";
18
18
  WHERE e.event_def_id = ?
19
19
  ORDER BY we.started_at DESC
20
20
  LIMIT ? OFFSET ?
21
- `).all(u,e,t).map(a=>({executionId:a.execution_id,templateId:a.template_id,templateName:a.template_name,status:a.status,startedAt:a.started_at,completedAt:a.completed_at,error:a.error,eventId:a.event_id,eventOccurredAt:a.event_occurred_at,eventPayload:a.event_payload?JSON.parse(a.event_payload):null}))}var f=E("scheduler"),P=class{maxRetries;baseDelayMs;constructor(e){this.maxRetries=e?.maxRetries??3,this.baseDelayMs=e?.baseDelayMs??1e3}async execute(e,t,n){let s=b(),a={timeout:e.config?.timeout??s.timeout,approvalRequired:s.approvalRequired,approvalTimeout:s.approvalTimeout,plugins:e.config?.plugins,mcpServers:e.config?.mcpServers,model:e.config?.model??s.model,maxTurns:e.config?.maxTurns??s.maxTurns,maxBudgetUsd:e.config?.maxBudgetUsd??s.maxBudgetUsd,env:{...s.env,...e.config?.env},claudeCodePath:s.claudeCodePath},r={templateId:e.id,executionId:t,stepResults:new Map,stepStatuses:{},config:a,continueOnError:e.config?.continueOnError??!1,failedStepIds:new Set,rolePreference:e.rolePreference,deliverTo:e.deliverTo,reportTo:e.reportTo};M(t,e.id,n?.eventId),D(t),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:"running"});let i=this.groupIntoLayers(e.steps);for(let m of i){if(this.syncExternalState(r)==="cancelled")return this.finalizeCancelledWorkflow(e,r);let g=m.filter(l=>!this.shouldSkip(l,r)),v=m.filter(l=>this.shouldSkip(l,r));for(let l of v){let p={stepId:l.id,taskId:"",status:"skipped",error:"Skipped: dependency failed"};r.stepResults.set(l.id,p),r.stepStatuses[l.id]={taskId:"",status:"skipped",error:"Skipped: dependency failed"},f.info({stepId:l.id,executionId:t},"Step skipped due to failed dependency")}if(g.length===0)continue;let W=await Promise.allSettled(g.map(l=>this.executeStep(l,r)));if(this.syncExternalState(r)==="cancelled")return this.finalizeCancelledWorkflow(e,r);for(let l=0;l<g.length;l++){let p=g[l],k=W[l];if(k.status==="rejected"){f.error({stepId:p.id,error:k.reason},"Workflow step threw");let I={stepId:p.id,taskId:"",status:"failed",error:String(k.reason)};r.stepResults.set(p.id,I),r.failedStepIds.add(p.id),r.stepStatuses[p.id]={taskId:"",status:"failed",error:String(k.reason)}}let y=r.stepResults.get(p.id);if(y?.status==="failed"&&(r.failedStepIds.add(p.id),!r.continueOnError)){if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);let I="failed";return R(t,{status:I,stepStatuses:r.stepStatuses,completedAt:Date.now(),error:y.error}),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:I}),f.warn({stepId:p.id,executionId:t},"Workflow step failed, workflow aborted"),{executionId:t,status:I,stepResults:r.stepResults}}}if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);R(t,{stepStatuses:r.stepStatuses})}if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);let d=r.failedStepIds.size>0,o=[...r.stepResults.values()].some(m=>m.status==="skipped"||m.status==="cancelled"),c=d||o?"partial":"completed";return R(t,{status:c,stepStatuses:r.stepStatuses,completedAt:Date.now()}),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:c}),f.info({executionId:t,status:c,completedSteps:r.stepResults.size,totalSteps:e.steps.length,failedSteps:r.failedStepIds.size},"Workflow completed"),await this.deliverWorkflowResult(r,c),{executionId:t,status:c,stepResults:r.stepResults}}groupIntoLayers(e){let t=new Map(e.map(i=>[i.id,i])),n=new Map,s=new Map;for(let i of e)n.set(i.id,0),s.set(i.id,[]);for(let i of e)if(i.dependsOn)for(let d of i.dependsOn)t.has(d)&&(n.set(i.id,(n.get(i.id)??0)+1),s.get(d)?.push(i.id));let a=[],r=new Set(e.map(i=>i.id));for(;r.size>0;){let i=[];for(let d of r)if((n.get(d)??0)===0){let o=t.get(d);o&&i.push(o)}if(i.length===0){f.warn({remaining:[...r]},"Cycle detected in step dependencies");for(let d of r){let o=t.get(d);o&&a.push([o])}break}a.push(i);for(let d of i){r.delete(d.id);for(let o of s.get(d.id)??[])n.set(o,(n.get(o)??0)-1)}}return a}syncExternalState(e){let t=h(e.executionId);if(t){for(let[n,s]of Object.entries(t.stepStatuses))(s.status==="skipped"||s.status==="failed"||s.status==="cancelled")&&!e.stepResults.has(n)&&!e.failedStepIds.has(n)&&(s.status==="skipped"?e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"skipped",error:s.error??"Manually skipped via API"}):s.status==="cancelled"?e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"cancelled",error:s.error??"Cancelled"}):(e.failedStepIds.add(n),e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"failed",error:s.error})),e.stepStatuses[n]=s,f.info({stepId:n,status:s.status,executionId:e.executionId},"Synced external step status from DB"));return t.status==="cancelled"?"cancelled":void 0}}shouldSkip(e,t){return e.dependsOn?e.dependsOn.some(n=>t.failedStepIds.has(n)?!0:t.stepResults.get(n)?.status==="skipped"):!1}async executeStep(e,t){let n=this.resolveVariables(e.prompt,t.stepResults),s=e.roleId??t.rolePreference,a=s?x(s):void 0,r=(e.config?.timeout??t.config?.timeout??600)*1e3,i="",d="failed",o;for(let l=1;l<=this.maxRetries;l++){let p=await C({prompt:n,roleId:s,requirements:e.requirements,autoSelectRole:e.autoSelectRole,config:{...t.config,...e.config?.timeout!==void 0?{timeout:e.config.timeout}:{},...e.config?.maxTurns!==void 0?{maxTurns:e.config.maxTurns}:{}},sourceSessionId:t.templateId,parentId:t.executionId,templateId:t.templateId,stepId:e.id});if(!p.ok){o=p;break}if(i=p.taskId,t.stepStatuses[e.id]={taskId:i,status:"running",roleId:s},f.debug({stepId:e.id,taskId:i,roleId:s,attempt:l},"Workflow step task created via admission"),d=await this.waitForTaskCompletion(i,r),d==="completed"||d==="cancelled")break;if(l<this.maxRetries){let k=this.baseDelayMs*Math.pow(2,l-1);f.info({stepId:e.id,attempt:l,maxRetries:this.maxRetries,delayMs:k},"Workflow step failed, retrying"),await this.sleep(k)}}if(o&&!o.ok){let l={stepId:e.id,taskId:"",status:"failed",roleId:s,roleName:a?.name,error:`Admission failed: ${o.reason}`,admissionError:{code:o.code,reason:o.reason,candidates:o.candidates?.map(p=>({roleId:p.roleId,name:p.name,fitScore:p.fitScore}))}};t.stepResults.set(e.id,l),t.stepStatuses[e.id]={taskId:"",status:"failed",roleId:s,error:o.reason},f.warn({stepId:e.id,admissionCode:o.code,reason:o.reason},"Workflow step admission failed");return}let c=_(i),m=h(t.executionId),g=m?.stepStatuses[e.id],v=d==="completed"?"completed":g?.status==="skipped"?"skipped":g?.status==="cancelled"||m?.status==="cancelled"?"cancelled":"failed",W={stepId:e.id,taskId:i,status:v,roleId:s,roleName:a?.name,result:c?.result,error:c?.error};t.stepResults.set(e.id,W),t.stepStatuses[e.id]={taskId:i,status:W.status,roleId:s,result:c?.result,error:c?.error}}async deliverWorkflowResult(e,t){let n=A();if(e.deliverTo&&e.deliverTo.length>0){let s=this.assembleWorkflowSummary(e);for(let a of e.deliverTo)if(a.type==="channel"){let r=T(a.channelId);try{await n.send({taskId:e.executionId,channelId:a.channelId,chatId:a.chatId,platform:r?.platform,content:s,messageType:"deliver"})}catch(i){f.error({executionId:e.executionId,channelId:a.channelId,error:i},"Workflow delivery failed")}}}if(e.reportTo&&e.reportTo.length>0){let s=[...e.stepResults.values()].filter(o=>o.status==="completed").length,a=e.failedStepIds.size,r=[...e.stepResults.values()].filter(o=>o.status==="skipped").length,i=e.stepResults.size,d=`Workflow ${t}: ${s}/${i} steps completed${a>0?`, ${a} failed`:""}${r>0?`, ${r} skipped`:""}`;for(let o of e.reportTo)if(o.type==="channel"){let c=T(o.channelId);try{await n.send({taskId:e.executionId,channelId:o.channelId,chatId:o.chatId,platform:c?.platform,content:d,messageType:"report"})}catch(m){f.error({executionId:e.executionId,channelId:o.channelId,error:m},"Workflow report delivery failed")}}}}assembleWorkflowSummary(e){let t=[];for(let[n,s]of e.stepResults){let a=s.status==="completed"?"OK":s.status==="skipped"?"SKIP":"FAIL",r=s.roleName?` (${s.roleName})`:"",i=s.result??s.error??"No output";t.push(`## [${a}] Step: ${n}${r}
21
+ `).all(u,e,t).map(a=>({executionId:a.execution_id,templateId:a.template_id,templateName:a.template_name,status:a.status,startedAt:a.started_at,completedAt:a.completed_at,error:a.error,eventId:a.event_id,eventOccurredAt:a.event_occurred_at,eventPayload:a.event_payload?JSON.parse(a.event_payload):null}))}var f=b("scheduler"),P=class{maxRetries;baseDelayMs;constructor(e){this.maxRetries=e?.maxRetries??3,this.baseDelayMs=e?.baseDelayMs??1e3}async execute(e,t,n){let s=E(),a={timeout:e.config?.timeout??s.timeout,approvalRequired:s.approvalRequired,approvalTimeout:s.approvalTimeout,plugins:e.config?.plugins,mcpServers:e.config?.mcpServers,model:e.config?.model??s.model,maxTurns:e.config?.maxTurns??s.maxTurns,maxBudgetUsd:e.config?.maxBudgetUsd??s.maxBudgetUsd,env:{...s.env,...e.config?.env},claudeCodePath:s.claudeCodePath},r={templateId:e.id,executionId:t,stepResults:new Map,stepStatuses:{},config:a,continueOnError:e.config?.continueOnError??!1,failedStepIds:new Set,rolePreference:e.rolePreference,deliverTo:e.deliverTo,reportTo:e.reportTo};M(t,e.id,n?.eventId),D(t),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:"running"});let i=this.groupIntoLayers(e.steps);for(let m of i){if(this.syncExternalState(r)==="cancelled")return this.finalizeCancelledWorkflow(e,r);let g=m.filter(l=>!this.shouldSkip(l,r)),_=m.filter(l=>this.shouldSkip(l,r));for(let l of _){let p={stepId:l.id,taskId:"",status:"skipped",error:"Skipped: dependency failed"};r.stepResults.set(l.id,p),r.stepStatuses[l.id]={taskId:"",status:"skipped",error:"Skipped: dependency failed"},f.info({stepId:l.id,executionId:t},"Step skipped due to failed dependency")}if(g.length===0)continue;let W=await Promise.allSettled(g.map(l=>this.executeStep(l,r)));if(this.syncExternalState(r)==="cancelled")return this.finalizeCancelledWorkflow(e,r);for(let l=0;l<g.length;l++){let p=g[l],k=W[l];if(k.status==="rejected"){f.error({stepId:p.id,error:k.reason},"Workflow step threw");let I={stepId:p.id,taskId:"",status:"failed",error:String(k.reason)};r.stepResults.set(p.id,I),r.failedStepIds.add(p.id),r.stepStatuses[p.id]={taskId:"",status:"failed",error:String(k.reason)}}let y=r.stepResults.get(p.id);if(y?.status==="failed"&&(r.failedStepIds.add(p.id),!r.continueOnError)){if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);let I="failed";return R(t,{status:I,stepStatuses:r.stepStatuses,completedAt:Date.now(),error:y.error}),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:I}),f.warn({stepId:p.id,executionId:t},"Workflow step failed, workflow aborted"),{executionId:t,status:I,stepResults:r.stepResults}}}if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);R(t,{stepStatuses:r.stepStatuses})}if(this.isWorkflowCancelled(r.executionId))return this.finalizeCancelledWorkflow(e,r);let d=r.failedStepIds.size>0,o=[...r.stepResults.values()].some(m=>m.status==="skipped"||m.status==="cancelled"),c=d||o?"partial":"completed";return R(t,{status:c,stepStatuses:r.stepStatuses,completedAt:Date.now()}),S.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:c}),f.info({executionId:t,status:c,completedSteps:r.stepResults.size,totalSteps:e.steps.length,failedSteps:r.failedStepIds.size},"Workflow completed"),await this.deliverWorkflowResult(r,c),{executionId:t,status:c,stepResults:r.stepResults}}groupIntoLayers(e){let t=new Map(e.map(i=>[i.id,i])),n=new Map,s=new Map;for(let i of e)n.set(i.id,0),s.set(i.id,[]);for(let i of e)if(i.dependsOn)for(let d of i.dependsOn)t.has(d)&&(n.set(i.id,(n.get(i.id)??0)+1),s.get(d)?.push(i.id));let a=[],r=new Set(e.map(i=>i.id));for(;r.size>0;){let i=[];for(let d of r)if((n.get(d)??0)===0){let o=t.get(d);o&&i.push(o)}if(i.length===0){f.warn({remaining:[...r]},"Cycle detected in step dependencies");for(let d of r){let o=t.get(d);o&&a.push([o])}break}a.push(i);for(let d of i){r.delete(d.id);for(let o of s.get(d.id)??[])n.set(o,(n.get(o)??0)-1)}}return a}syncExternalState(e){let t=h(e.executionId);if(t){for(let[n,s]of Object.entries(t.stepStatuses))(s.status==="skipped"||s.status==="failed"||s.status==="cancelled")&&!e.stepResults.has(n)&&!e.failedStepIds.has(n)&&(s.status==="skipped"?e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"skipped",error:s.error??"Manually skipped via API"}):s.status==="cancelled"?e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"cancelled",error:s.error??"Cancelled"}):(e.failedStepIds.add(n),e.stepResults.set(n,{stepId:n,taskId:s.taskId,status:"failed",error:s.error})),e.stepStatuses[n]=s,f.info({stepId:n,status:s.status,executionId:e.executionId},"Synced external step status from DB"));return t.status==="cancelled"?"cancelled":void 0}}shouldSkip(e,t){return e.dependsOn?e.dependsOn.some(n=>t.failedStepIds.has(n)?!0:t.stepResults.get(n)?.status==="skipped"):!1}async executeStep(e,t){let n=this.resolveVariables(e.prompt,t.stepResults),s=e.roleId??t.rolePreference,a=s?x(s):void 0,r=(e.config?.timeout??t.config?.timeout??600)*1e3,i="",d="failed",o;for(let l=1;l<=this.maxRetries;l++){let p=await C({prompt:n,roleId:s,requirements:e.requirements,autoSelectRole:e.autoSelectRole,config:{...t.config,...e.config?.timeout!==void 0?{timeout:e.config.timeout}:{},...e.config?.maxTurns!==void 0?{maxTurns:e.config.maxTurns}:{}},sourceSessionId:t.templateId,parentId:t.executionId,templateId:t.templateId,stepId:e.id});if(!p.ok){o=p;break}if(i=p.taskId,t.stepStatuses[e.id]={taskId:i,status:"running",roleId:s},f.debug({stepId:e.id,taskId:i,roleId:s,attempt:l},"Workflow step task created via admission"),d=await this.waitForTaskCompletion(i,r),d==="completed"||d==="cancelled")break;if(l<this.maxRetries){let k=this.baseDelayMs*Math.pow(2,l-1);f.info({stepId:e.id,attempt:l,maxRetries:this.maxRetries,delayMs:k},"Workflow step failed, retrying"),await this.sleep(k)}}if(o&&!o.ok){let l={stepId:e.id,taskId:"",status:"failed",roleId:s,roleName:a?.name,error:`Admission failed: ${o.reason}`,admissionError:{code:o.code,reason:o.reason,candidates:o.candidates?.map(p=>({roleId:p.roleId,name:p.name,fitScore:p.fitScore}))}};t.stepResults.set(e.id,l),t.stepStatuses[e.id]={taskId:"",status:"failed",roleId:s,error:o.reason},f.warn({stepId:e.id,admissionCode:o.code,reason:o.reason},"Workflow step admission failed");return}let c=v(i),m=h(t.executionId),g=m?.stepStatuses[e.id],_=d==="completed"?"completed":g?.status==="skipped"?"skipped":g?.status==="cancelled"||m?.status==="cancelled"?"cancelled":"failed",W={stepId:e.id,taskId:i,status:_,roleId:s,roleName:a?.name,result:c?.result,error:c?.error};t.stepResults.set(e.id,W),t.stepStatuses[e.id]={taskId:i,status:W.status,roleId:s,result:c?.result,error:c?.error}}async deliverWorkflowResult(e,t){let n=A();if(e.deliverTo&&e.deliverTo.length>0){let s=this.assembleWorkflowSummary(e);for(let a of e.deliverTo)if(a.type==="channel"){let r=T(a.channelId);try{await n.send({taskId:e.executionId,channelId:a.channelId,chatId:a.chatId,platform:r?.platform,content:s,messageType:"deliver"})}catch(i){f.error({executionId:e.executionId,channelId:a.channelId,error:i},"Workflow delivery failed")}}}if(e.reportTo&&e.reportTo.length>0){let s=[...e.stepResults.values()].filter(o=>o.status==="completed").length,a=e.failedStepIds.size,r=[...e.stepResults.values()].filter(o=>o.status==="skipped").length,i=e.stepResults.size,d=`Workflow ${t}: ${s}/${i} steps completed${a>0?`, ${a} failed`:""}${r>0?`, ${r} skipped`:""}`;for(let o of e.reportTo)if(o.type==="channel"){let c=T(o.channelId);try{await n.send({taskId:e.executionId,channelId:o.channelId,chatId:o.chatId,platform:c?.platform,content:d,messageType:"report"})}catch(m){f.error({executionId:e.executionId,channelId:o.channelId,error:m},"Workflow report delivery failed")}}}}assembleWorkflowSummary(e){let t=[];for(let[n,s]of e.stepResults){let a=s.status==="completed"?"OK":s.status==="skipped"?"SKIP":"FAIL",r=s.roleName?` (${s.roleName})`:"",i=s.result??s.error??"No output";t.push(`## [${a}] Step: ${n}${r}
22
22
 
23
23
  ${i}`)}return t.join(`
24
24
 
25
25
  ---
26
26
 
27
- `)}resolveVariables(e,t){return e.replace(/\{\{([^}]+)\.result\}\}/g,(n,s)=>t.get(s)?.result??`[no result from ${s}]`)}waitForTaskCompletion(e,t=6e5){return new Promise(n=>{let s=!1,a=Date.now(),r=()=>{s=!0,S.off("task_status_change",i)},i=o=>{s||o.taskId!==e||(o.newStatus==="completed"?(r(),n("completed")):o.newStatus==="failed"?(r(),n("failed")):o.newStatus==="cancelled"&&(r(),n("cancelled")))};S.on("task_status_change",i);let d=()=>{if(s)return;if(Date.now()-a>t){r(),n("failed");return}let o=_(e);if(!o){r(),n("failed");return}if(o.status==="completed"){r(),n("completed");return}if(o.status==="failed"){r(),n("failed");return}if(o.status==="cancelled"){r(),n("cancelled");return}setTimeout(d,5e3)};setTimeout(d,100)})}sleep(e){return new Promise(t=>setTimeout(t,e))}isWorkflowCancelled(e){return h(e)?.status==="cancelled"}finalizeCancelledWorkflow(e,t){let n=h(t.executionId);return R(t.executionId,{status:"cancelled",stepStatuses:n?.stepStatuses??t.stepStatuses,completedAt:n?.completedAt??Date.now(),error:n?.error}),f.info({executionId:t.executionId,templateId:e.id},"Workflow cancelled"),{executionId:t.executionId,status:"cancelled",stepResults:t.stepResults}}};export{h as a,R as b,L as c,B as d,P as e};
27
+ `)}resolveVariables(e,t){return e.replace(/\{\{([^}]+)\.result\}\}/g,(n,s)=>t.get(s)?.result??`[no result from ${s}]`)}waitForTaskCompletion(e,t=6e5){return new Promise(n=>{let s=!1,a=Date.now(),r=()=>{s=!0,S.off("task_status_change",i)},i=o=>{s||o.taskId!==e||(o.newStatus==="completed"?(r(),n("completed")):o.newStatus==="failed"?(r(),n("failed")):o.newStatus==="cancelled"?(r(),n("cancelled")):o.newStatus==="blocked"&&(r(),n("blocked")))};S.on("task_status_change",i);let d=()=>{if(s)return;if(Date.now()-a>t){r(),n("failed");return}let o=v(e);if(!o){r(),n("failed");return}if(o.status==="completed"){r(),n("completed");return}if(o.status==="failed"){r(),n("failed");return}if(o.status==="cancelled"){r(),n("cancelled");return}if(o.status==="blocked"){r(),n("blocked");return}setTimeout(d,5e3)};setTimeout(d,100)})}sleep(e){return new Promise(t=>setTimeout(t,e))}isWorkflowCancelled(e){return h(e)?.status==="cancelled"}finalizeCancelledWorkflow(e,t){let n=h(t.executionId);return R(t.executionId,{status:"cancelled",stepStatuses:n?.stepStatuses??t.stepStatuses,completedAt:n?.completedAt??Date.now(),error:n?.error}),f.info({executionId:t.executionId,templateId:e.id},"Workflow cancelled"),{executionId:t.executionId,status:"cancelled",stepResults:t.stepResults}}};export{h as a,R as b,L as c,B as d,P as e};
@@ -1,4 +1,4 @@
1
- import{n as y,r as T}from"./chunk-7ZGSJCX5.js";import{d as h,h as F}from"./chunk-WBAPIPST.js";import{c as R,h as P}from"./chunk-MRTJFYPR.js";import{c as v,e as A}from"./chunk-FCV2DPZQ.js";import{readFileSync as b,writeFileSync as C,existsSync as k}from"fs";import{join as W}from"path";function w(e){let n=W(d(e),".env");if(!k(n))return null;let i=b(n,"utf-8"),t={};for(let o of i.split(`
1
+ import{n as y,r as T}from"./chunk-HQRUJQN7.js";import{d as h,h as F}from"./chunk-WBAPIPST.js";import{c as R,h as P}from"./chunk-MRTJFYPR.js";import{c as v,e as A}from"./chunk-FCV2DPZQ.js";import{readFileSync as b,writeFileSync as C,existsSync as k}from"fs";import{join as W}from"path";function w(e){let n=W(d(e),".env");if(!k(n))return null;let i=b(n,"utf-8"),t={};for(let o of i.split(`
2
2
  `)){let s=o.trim();if(!s||s.startsWith("#"))continue;let c=s.startsWith("export ")?s.slice(7).trim():s,u=c.indexOf("=");if(u===-1)continue;let f=c.slice(0,u).trim(),r=c.slice(u+1).trim();(r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"))&&(r=r.slice(1,-1)),!(r.includes("$")&&(r=r.replace(/\$\{(\w+)\}|\$(\w+)/g,(p,l,a)=>{let g=l??a;return t[g]??process.env[g]??""}),!r))&&(t[f]=r)}return t}function V(e,n){let i=w(e);if(!i)return n;let t={...n},o=0;for(let[s,c]of Object.entries(i)){if(s.startsWith("ANTHROPIC_")){x.warn({roleName:e,key:s},"Role .env contains ANTHROPIC_* key; ignored (managed globally)");continue}s in t||(t[s]=c,o++)}return o>0&&x.info({roleName:e,seeded:o},"Seeded role envVars from .env file"),Object.keys(t).length>0?t:void 0}function M(e,n){let i=w(e);if(!i)return[];let t=n??{},o=[];for(let[s,c]of Object.entries(i)){if(s.startsWith("ANTHROPIC_"))continue;let u=t[s]??"";u!==c&&o.push({envKey:s,dbValue:u,envValue:c})}for(let[s,c]of Object.entries(t))s in i||o.push({envKey:s,dbValue:c,envValue:""});return o}function N(e,n){let i=W(d(e),".env"),t=n??{},o=[],s=new Set;if(k(i)){let u=b(i,"utf-8");for(let f of u.split(`
3
3
  `)){let r=f.trim();if(!r||r.startsWith("#")){o.push(f);continue}let p=r.startsWith("export ")?r.slice(7).trim():r,l=p.indexOf("=");if(l===-1){o.push(f);continue}let a=p.slice(0,l).trim(),g=r.startsWith("export ")?"export ":"";a in t&&(o.push(`${g}${a}=${t[a]}`),s.add(a))}}let c=0;for(let[u,f]of Object.entries(t)){if(s.has(u)){c++;continue}f&&f.length>0&&(o.push(`${u}=${f}`),c++)}return C(i,o.join(`
4
4
  `)+`