adam-agent-server 0.1.0 → 0.2.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 (130) hide show
  1. package/README.md +11 -19
  2. package/dist/App-G2WZKRUH.js +9 -0
  3. package/dist/adam-tools-Q4BRKX3U.js +1 -0
  4. package/dist/approval-handler-D3J6NCMM.js +4 -0
  5. package/dist/bree-engine-SQMSKGAP.js +1 -0
  6. package/dist/channels-VEUBY2NZ.js +1 -0
  7. package/dist/channels-WFZAONF3.js +1 -0
  8. package/dist/{chunk-5GMYXCL3.js → chunk-2EP27EGS.js} +1 -1
  9. package/dist/chunk-2GXYBWLS.js +10 -0
  10. package/dist/chunk-2VKE7ONM.js +86 -0
  11. package/dist/{chunk-HMXDNPFE.js → chunk-5ASEAZCR.js} +1 -1
  12. package/dist/chunk-5JLMSNIW.js +1 -0
  13. package/dist/{chunk-MMIO6BCA.js → chunk-742NWPTQ.js} +3 -3
  14. package/dist/chunk-7SPKRIMZ.js +15 -0
  15. package/dist/chunk-AXMXXUPO.js +5 -0
  16. package/dist/{chunk-5AKFAMQL.js → chunk-B6S2AEOD.js} +1 -1
  17. package/dist/chunk-DT2LX4XI.js +49 -0
  18. package/dist/{chunk-VURJZLM6.js → chunk-EALDBELJ.js} +6 -3
  19. package/dist/{chunk-ZN5Q3YET.js → chunk-ETQ7KC73.js} +1 -1
  20. package/dist/chunk-FDWW245P.js +5 -0
  21. package/dist/chunk-FUGJMHY4.js +1 -0
  22. package/dist/chunk-FYDFMYUP.js +1 -0
  23. package/dist/chunk-HAWA62R2.js +26 -0
  24. package/dist/chunk-IXF3XBGX.js +5 -0
  25. package/dist/chunk-JXD6ZPV7.js +2 -0
  26. package/dist/chunk-KICPHTI2.js +5 -0
  27. package/dist/chunk-L7426WNY.js +7 -0
  28. package/dist/{chunk-WGRTN6TX.js → chunk-L7JP7DUO.js} +1 -1
  29. package/dist/chunk-NICRQZ7T.js +1 -0
  30. package/dist/{chunk-3HM54J2N.js → chunk-NSJAV7IH.js} +1 -1
  31. package/dist/{chunk-W6JITSZF.js → chunk-PCSZW2PE.js} +28 -11
  32. package/dist/{chunk-EJJDJY34.js → chunk-PQ7KPALO.js} +1 -1
  33. package/dist/{chunk-F2IS5LWD.js → chunk-SFUS33SO.js} +1 -1
  34. package/dist/chunk-T25NLVMY.js +1 -0
  35. package/dist/chunk-TN6H2WM2.js +19 -0
  36. package/dist/chunk-U36NBCR3.js +17 -0
  37. package/dist/chunk-UOTDT2KY.js +3 -0
  38. package/dist/chunk-VF6GJGD6.js +6 -0
  39. package/dist/chunk-WXN3PSVX.js +6 -0
  40. package/dist/chunk-WZOMGJSY.js +1 -0
  41. package/dist/{chunk-62PXAOD6.js → chunk-XNWZZYAV.js} +1 -1
  42. package/dist/cli.js +15 -13
  43. package/dist/config-WHXCZCI4.js +1 -0
  44. package/dist/config-Y4QWELO3.js +1 -0
  45. package/dist/{db-ZDEA7EUY.js → db-PNZ3UJOE.js} +1 -1
  46. package/dist/delivery-log-VYTYUFCK.js +1 -0
  47. package/dist/engine-V5MOGOLN.js +1 -0
  48. package/dist/{evolution-audit-MDA2ZVJW.js → evolution-audit-B7WKMOVR.js} +1 -1
  49. package/dist/{external-api-T7FFXVHL.js → external-api-XGEOKAWR.js} +1 -1
  50. package/dist/index.js +41 -63
  51. package/dist/learner-VMD5NQCD.js +1 -0
  52. package/dist/memories-EFQ4SFZG.js +1 -0
  53. package/dist/memory-extractor-GOISDQTO.js +6 -0
  54. package/dist/memory-service-BKLZIRK6.js +1 -0
  55. package/dist/monitor-K7CGTLA6.js +1 -0
  56. package/dist/outbound-gateway-FIPC4BZO.js +1 -0
  57. package/dist/role-presets-FN2RWUCP.js +1 -0
  58. package/dist/{roles-CMV5FMIA.js → roles-SG2YAR64.js} +1 -1
  59. package/dist/runtime-6UTYEONR.js +1 -0
  60. package/dist/server-bus-GEGVMSCA.js +1 -0
  61. package/dist/session-manager-45LFTPBA.js +1 -0
  62. package/dist/{task-templates-AKQB7RRB.js → task-templates-7LSQ6OST.js} +1 -1
  63. package/dist/token-estimator-HMPVGDCN.js +1 -0
  64. package/package.json +2 -2
  65. package/web/dist/assets/{Card-BpwkRtmi.js → Card-BecEmnPW.js} +1 -1
  66. package/web/dist/assets/{ChannelDetail-050qK78l.js → ChannelDetail-dZfZlLgQ.js} +1 -1
  67. package/web/dist/assets/{Channels-DA4gN6nU.js → Channels-Cw04c7YJ.js} +1 -1
  68. package/web/dist/assets/{Chat-LzhfKGQ5.js → Chat-D4PHqHPE.js} +1 -1
  69. package/web/dist/assets/Dashboard-BFewwmAg.js +1 -0
  70. package/web/dist/assets/{EmptyState-B08f3BH6.js → EmptyState-DBFJc4PL.js} +1 -1
  71. package/web/dist/assets/{Evolution-BwsOuVbZ.js → Evolution-DY1OC6Oc.js} +4 -1
  72. package/web/dist/assets/{GoalDetail-Zo16ZrYD.js → GoalDetail-DZIEpHs2.js} +1 -1
  73. package/web/dist/assets/Goals-COCCVLnp.js +1 -0
  74. package/web/dist/assets/{Logs-CYfQ9k_6.js → Logs-DsDeimLt.js} +1 -1
  75. package/web/dist/assets/Memories-D5IEEI1u.js +1 -0
  76. package/web/dist/assets/NotFound-Cidygwnn.js +1 -0
  77. package/web/dist/assets/{Plugins-DHgIfely.js → Plugins-DUwZVjPc.js} +1 -1
  78. package/web/dist/assets/RoleDetail-B-GKMfMG.js +33 -0
  79. package/web/dist/assets/{Roles-DGpN5Vm6.js → Roles-JeVjD0Ew.js} +1 -1
  80. package/web/dist/assets/Settings-CvEyZp5t.js +1 -0
  81. package/web/dist/assets/{Strategies-DBp2jYdi.js → Strategies-KAmpqrcQ.js} +1 -1
  82. package/web/dist/assets/{Switch-yk5-dsti.js → Switch-Jpdn6Yux.js} +1 -1
  83. package/web/dist/assets/{Table-DWR4p9xA.js → Table-tkJ-cuiE.js} +1 -1
  84. package/web/dist/assets/TaskDetail-C4NpqwNT.js +2 -0
  85. package/web/dist/assets/Work-DhaxNYnd.js +1 -0
  86. package/web/dist/assets/dist-HyCSN_hp.js +1 -0
  87. package/web/dist/assets/index-CfKqiQIe.js +52 -0
  88. package/web/dist/assets/index-LDFr0VVR.css +2 -0
  89. package/web/dist/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  90. package/web/dist/assets/vendor-icons-ZPvC5PUS.js +1 -0
  91. package/web/dist/assets/vendor-react--nRVf2Ep.js +12 -0
  92. package/web/dist/assets/{vendor-state-CRsbPXtF.js → vendor-state-CH64feAE.js} +1 -1
  93. package/web/dist/index.html +7 -7
  94. package/dist/App-23CRAK2P.js +0 -9
  95. package/dist/adam-tools-MKUMZWCR.js +0 -1
  96. package/dist/approval-handler-SBFVVFGH.js +0 -4
  97. package/dist/channels-CNLMTKHM.js +0 -1
  98. package/dist/channels-VNG7U6UQ.js +0 -1
  99. package/dist/chunk-37OAKNKA.js +0 -15
  100. package/dist/chunk-3OYRYMJW.js +0 -11
  101. package/dist/chunk-5BAD3NCT.js +0 -1
  102. package/dist/chunk-B3CVXD44.js +0 -104
  103. package/dist/chunk-CV3ROBUM.js +0 -1
  104. package/dist/chunk-FUBKGVWI.js +0 -8
  105. package/dist/chunk-J5YZQQTS.js +0 -3
  106. package/dist/chunk-Q3N5LVPZ.js +0 -5
  107. package/dist/chunk-QOPUUA7O.js +0 -1
  108. package/dist/chunk-TGQYM4TH.js +0 -6
  109. package/dist/chunk-TYR3QUCL.js +0 -23
  110. package/dist/config-42ZJPZDM.js +0 -1
  111. package/dist/delivery-log-7DQ36UGP.js +0 -1
  112. package/dist/engine-7VBPXTGK.js +0 -1
  113. package/dist/memories-BUNOVQVG.js +0 -1
  114. package/dist/role-presets-2X3VW75D.js +0 -1
  115. package/dist/runtime-772O2XKZ.js +0 -1
  116. package/dist/server-bus-N5LCY73J.js +0 -1
  117. package/dist/session-manager-KO4CR3W6.js +0 -1
  118. package/web/dist/assets/Dashboard-Bh32YC_E.js +0 -1
  119. package/web/dist/assets/Goals-BmfVadFN.js +0 -1
  120. package/web/dist/assets/Memories-CgSb60RC.js +0 -1
  121. package/web/dist/assets/RoleDetail-CNJkMSuz.js +0 -1
  122. package/web/dist/assets/Settings-PjFyeX8n.js +0 -1
  123. package/web/dist/assets/TaskDetail-DMg-JAbC.js +0 -2
  124. package/web/dist/assets/Work-BYgMw2qj.js +0 -1
  125. package/web/dist/assets/dist-jv3vbjrx.js +0 -1
  126. package/web/dist/assets/index-CWY8H-cU.js +0 -52
  127. package/web/dist/assets/index-OXMtvYRJ.css +0 -2
  128. package/web/dist/assets/rolldown-runtime-DF2fYuay.js +0 -1
  129. package/web/dist/assets/vendor-icons-DqHipOFA.js +0 -1
  130. package/web/dist/assets/vendor-react-C2hDj0vl.js +0 -11
@@ -0,0 +1,86 @@
1
+ import{a as ue}from"./chunk-5JLMSNIW.js";import{b as Ge,c as Se,e as Ve}from"./chunk-IXF3XBGX.js";import{b as ae}from"./chunk-AXMXXUPO.js";import{a as tt,c as Me,e as rt}from"./chunk-KICPHTI2.js";import{j as _e}from"./chunk-FUGJMHY4.js";import{d as Re}from"./chunk-PQ7KPALO.js";import{a as Ke}from"./chunk-2GXYBWLS.js";import{a as Be}from"./chunk-WZOMGJSY.js";import{a as ce,b as _,c as de,d as Ze,e as et}from"./chunk-WXN3PSVX.js";import{a as se,b as v,c as F,d as A}from"./chunk-L7426WNY.js";import{a as ke}from"./chunk-L7JP7DUO.js";import{a as We,b as Te,c as Je,g as qe,j as He}from"./chunk-HAWA62R2.js";import{a as Ye,b as B,c as ze,f as Qe,g as Xe}from"./chunk-VF6GJGD6.js";import{d as k,g as je}from"./chunk-FYDFMYUP.js";import{a as Fe,b as le,e as Ie,f as V}from"./chunk-U36NBCR3.js";import{e as $e,f as T,h as U,i as G,j as Oe,k as we,l as ie}from"./chunk-XNWZZYAV.js";import{b,d as oe}from"./chunk-PCSZW2PE.js";import{c as I,d as Ue}from"./chunk-3DAK2XWP.js";import{c as Dt,e as At,f as x}from"./chunk-FCV2DPZQ.js";var wt={};At(wt,{getGlobalEnabledState:()=>z,getInstalledPlugin:()=>Le,getPluginManifest:()=>Q,listInstalledPlugins:()=>C,listMarketplaceSources:()=>Ce,resolvePluginPaths:()=>Ee,scanDirectoryConfig:()=>X});import{existsSync as E,readFileSync as K,readdirSync as yt}from"fs";import{join as y}from"path";import vt from"os";function j(e){try{if(!E(e))return null;let t=K(e,"utf-8");return JSON.parse(t)}catch{return null}}function z(){return j(Xt())?.enabledPlugins??{}}function Q(e){let t=e;function r(n,o){let s={};try{if(!E(n))return s;let l=K(n,"utf-8").replace(/^```yaml\r?\n/,"").replace(/^```\r?\n/,"");for(let u of o){let d=new RegExp(`^${u}:\\s*(.+)$`,"m"),p=l.match(d);p&&(s[u]=p[1].trim())}}catch{}return s}try{let n={name:"",skills:[],agents:[],mcpServers:[],hooks:[],lspServers:[]},o=y(t,".claude-plugin","plugin.json");if(E(o))try{let d=JSON.parse(K(o,"utf-8"));n.name=d.name??"",n.version=d.version,n.description=d.description,Array.isArray(d.lspServers)&&(n.lspServers=d.lspServers),Array.isArray(d.mcpServers)&&(n.mcpServers=d.mcpServers),Array.isArray(d.hooks)&&(n.hooks=d.hooks)}catch{}let s=y(t,"skills");if(E(s)){let d=yt(s,{withFileTypes:!0});for(let p of d){if(!p.isDirectory()&&!p.isSymbolicLink())continue;let g=y(s,p.name,"SKILL.md"),f=r(g,["name","description"]);f.name&&n.skills.push({name:f.name,description:f.description??""})}}let i=y(t,"agents");if(E(i)){let d=yt(i,{withFileTypes:!0});for(let p of d){if(!p.isFile()||!p.name.endsWith(".md"))continue;let g=r(y(i,p.name),["name","description"]);g.name&&n.agents.push({name:g.name,description:g.description??""})}}let l=y(t,".mcp.json");if(E(l))try{let d=JSON.parse(K(l,"utf-8"));d.mcpServers&&typeof d.mcpServers=="object"&&(n.mcpServers=Object.keys(d.mcpServers))}catch{}let u=y(t,"hooks","hooks.json");if(E(u))try{let d=JSON.parse(K(u,"utf-8"));Array.isArray(d)&&(n.hooks=d.map(p=>typeof p=="object"&&p!==null&&"event"in p?String(p.event):String(p)))}catch{}return n}catch{return null}}function C(e){let t=j(xe());if(!t?.plugins)return[];let r=z(),n=[];for(let[o,s]of Object.entries(t.plugins))if(!(!Array.isArray(s)||s.length===0))for(let i of s){let l=i.scope??"user";e?.scope&&l!==e.scope||e?.projectPath&&i.projectPath!==e.projectPath||n.push({id:o,name:o.split("@")[0],version:i.version??"",scope:l,projectPath:i.projectPath,installPath:i.installPath??y(Y(),o),enabled:r[o]??i.enabled??!0,installedAt:i.installedAt??"",lastUpdated:i.lastUpdated??""})}return n}function Le(e){let t=j(xe());if(!t?.plugins?.[e])return null;let r=t.plugins[e];if(!Array.isArray(r)||r.length===0)return null;let n=r[0],o=z();return{id:e,name:e.split("@")[0],version:n.version??"",scope:n.scope??"user",projectPath:n.projectPath,installPath:n.installPath??y(Y(),e),enabled:o[e]??n.enabled??!0,installedAt:n.installedAt??"",lastUpdated:n.lastUpdated??""}}function Ee(e){let t=j(xe()),r=new Map;for(let n of e){let o=t?.plugins?.[n];Array.isArray(o)&&o.length>0&&r.set(n,o[0].installPath??y(Y(),n))}return r}function Ce(){return j(Qt())?.marketplaces??[]}function X(e){let t=y(e,".claude","settings.json"),r=j(t);return{enabledPlugins:r?.enabledPlugins??{},mcpServers:r?.mcpServers??{},allowedTools:r?.allowedTools??[],disallowedTools:r?.disallowedTools??[]}}var Y,xe,Qt,Xt,ye=Dt(()=>{"use strict";Y=()=>y(vt.homedir(),".claude","plugins"),xe=()=>y(Y(),"installed_plugins.json"),Qt=()=>y(Y(),"known_marketplaces.json"),Xt=()=>y(vt.homedir(),".claude","settings.json")});import{createSdkMcpServer as cr,tool as m}from"@anthropic-ai/claude-agent-sdk";import{z as a}from"zod";ie();V();import{v4 as J}from"uuid";oe();function Nt(e){return{id:e.id,goalId:e.goal_id,level:e.level,parentId:e.parent_id??void 0,name:e.name,description:e.description??void 0,weight:e.weight,calibrationFactor:e.calibration_factor,createdAt:e.created_at}}function W(e){b().prepare(`
2
+ INSERT INTO metric_tree (id, goal_id, level, parent_id, name, description,
3
+ weight, calibration_factor, created_at)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ `).run(e.id,e.goalId,e.level,e.parentId??null,e.name,e.description??null,e.weight,e.calibrationFactor,e.createdAt)}function nt(e){return b().prepare("SELECT * FROM metric_tree WHERE goal_id = ? ORDER BY level, created_at").all(e).map(Nt)}var jt=I("goal-manager");async function un(e){let t;try{let n=JSON.parse(e);t={name:n.name??"",description:n.description,metric:n.metric??"",targetValue:n.targetValue??0,currentValue:n.currentValue??0,deadline:n.deadline??0,budget:n.budget??0,roleId:n.roleId??"engineer",status:"active"}}catch{t=await $t(e)}let r=Ot(t);return{goalState:t,validationResult:r,rawInput:e}}async function $t(e){let t=`Extract SMART goal fields from this natural language input.
6
+
7
+ Input: "${e}"
8
+
9
+ Respond ONLY with a JSON object:
10
+ {
11
+ "name": "short goal name (max 100 chars)",
12
+ "description": "detailed description of what the goal aims to achieve",
13
+ "metric": "measurable metric name (e.g. completion, reports_written, accuracy_score)",
14
+ "targetValue": <number, the target to reach>,
15
+ "deadline_days": <number, days from now to complete>,
16
+ "budget": <number, estimated budget in USD>,
17
+ "role": "<best matching role: engineer | analyst | content_creator | reviewer>"
18
+ }
19
+
20
+ Rules:
21
+ - name: concise, actionable title
22
+ - metric: quantifiable measure of success; use "completion" if the goal is binary (done/not done)
23
+ - targetValue: realistic target for the metric; use 1 for binary goals
24
+ - deadline_days: reasonable timeframe; default 7 if unclear
25
+ - budget: estimated cost in USD; default 5 if unclear
26
+ - role: match to the nature of work (research=analyst, writing=content_creator, coding=engineer, review=reviewer)`;try{let n=(await ue(t,"You extract structured SMART goal fields from natural language. Reply with only valid JSON.")).match(/\{[\s\S]*\}/);if(n){let o=JSON.parse(n[0]),s=o.deadline_days??7;return{name:(o.name??e.slice(0,100)).slice(0,100),description:o.description??e,metric:o.metric??"completion",targetValue:o.targetValue??1,currentValue:0,deadline:Date.now()+s*24*60*60*1e3,budget:o.budget??5,roleId:o.roleId??"engineer",status:"active"}}}catch(r){jt.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 Ot(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 pn(e,t,r){let n=J(),o=Date.now(),s={id:n,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:o,deliverTo:t,reportTo:r};return ce(s),s}function ot(e,t){let r=Date.now(),n=[],o={id:J(),goalId:e,level:"L0",name:`${t}_goal_progress`,description:`Goal-level ${t} progress (monthly)`,weight:1,calibrationFactor:1,createdAt:r};n.push(o),W(o);let s={id:J(),goalId:e,level:"L1",parentId:o.id,name:`${t}_weekly_trend`,description:`Weekly trend for ${t}`,weight:.8,calibrationFactor:1,createdAt:r};n.push(s),W(s);let i={id:J(),goalId:e,level:"L2",parentId:s.id,name:`${t}_daily_process`,description:`Daily process metric for ${t}`,weight:.6,calibrationFactor:1,createdAt:r};n.push(i),W(i);let l={id:J(),goalId:e,level:"L3",parentId:i.id,name:`${t}_per_task`,description:`Per-task instant metric for ${t}`,weight:.4,calibrationFactor:1,createdAt:r};return n.push(l),W(l),n}var pe=class{static collect(t,r){let n=v(t);if(!n)return this.emptyMetrics(t,r);let o=ae(t,500,0),s=n.completedAt&&n.startedAt?n.completedAt-n.startedAt:0,i=new Set,l=0,u=0;for(let p of o)p.type==="tool_call"&&p.toolName&&i.add(p.toolName),p.type==="error"&&l++,p.type==="approval_request"&&u++;let d={taskId:t,goalId:r,timestamp:Date.now(),durationMs:s,costUsd:n.costUsd??0,turns:n.numTurns??0,toolCount:i.size,errorCount:l,approvalCount:u,rawScore:0,isComplete:n.status==="completed"};return d.rawScore=this.computeRawScore(d),d}static computeRawScore(t){let n=1-Math.min(t.durationMs/6e5,1),s=1-Math.min(t.costUsd/5,1),l=1-Math.min(t.turns/50,1),u;t.toolCount>=3&&t.toolCount<=15?u=1:t.toolCount<3?u=t.toolCount/3:u=Math.max(0,1-(t.toolCount-15)/15);let d=t.errorCount===0?1:Math.max(0,1-t.errorCount*.2),p=Math.min(1,.5+t.approvalCount*.25);return .3*n+.2*s+.2*l+.1*u+.15*d+.05*p}static cache=new Map;static persist(t){this.cache.set(t.taskId,t)}static getCached(t){return this.cache.get(t)}static clearCache(){this.cache.clear()}static emptyMetrics(t,r){return{taskId:t,goalId:r,timestamp:Date.now(),durationMs:0,costUsd:0,turns:0,toolCount:0,errorCount:0,approvalCount:0,rawScore:0,isComplete:!1}}};oe();function Ft(e){return{id:e.id,strategyId:e.strategy_id,goalId:e.goal_id,taskId:e.task_id??void 0,reward:e.reward??void 0,metricL2Score:e.metric_l2_score??void 0,metricL3Score:e.metric_l3_score??void 0,context:e.context??void 0,completedAt:e.completed_at}}function st(e){b().prepare(`
27
+ INSERT INTO trials (id, strategy_id, goal_id, task_id, reward,
28
+ metric_l2_score, metric_l3_score, context, completed_at)
29
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
30
+ `).run(e.id,e.strategyId,e.goalId,e.taskId??null,e.reward??null,e.metricL2Score??null,e.metricL3Score??null,e.context??null,e.completedAt)}function at(e,t=100){return b().prepare("SELECT * FROM trials WHERE goal_id = ? ORDER BY completed_at DESC LIMIT ?").all(e,t).map(Ft)}var me=class{static collect(t){let r=_(t);if(!r)return this.emptyMetrics(t);let n=Date.now(),o=r.targetValue>0?Math.min(r.currentValue/r.targetValue,1):0,s=Math.max(0,(r.deadline-n)/(1e3*60*60*24)),i=this.calculateBudgetSpent(t),l=r.budgetUsd>0?Math.max(0,1-i/r.budgetUsd):1,u=this.calculateExpectedCompletion(r),d={goalId:t,metricType:r.metricType,targetValue:r.targetValue,currentValue:r.currentValue,progressPct:o,deadlineRemainingDays:s,budgetRemainingPct:l,expectedCompletionPct:u,rawScore:0};return d.rawScore=this.computeRawScore(d),d}static computeRawScore(t){let r=Math.min(t.progressPct,1),n;t.expectedCompletionPct>=1?n=1:t.expectedCompletionPct>=.8?n=.5+(t.expectedCompletionPct-.8)*2.5:n=t.expectedCompletionPct*.625;let o=t.budgetRemainingPct;return .5*r+.3*n+.2*o}static calculateExpectedCompletion(t){let r=Date.now(),n=t.deadline-t.createdAt,o=r-t.createdAt;if(n<=0)return 0;let s=o/n;if(s<.1)return .5;let i=t.targetValue>0?t.currentValue/t.targetValue:0;return s>0?i/s:0}static calculateBudgetSpent(t){let r=at(t,1e3),n=0,o=new Set;for(let s of r)if(s.taskId&&!o.has(s.taskId)){o.add(s.taskId);let i=v(s.taskId);i?.costUsd&&(n+=i.costUsd)}return n}static emptyMetrics(t){return{goalId:t,metricType:"",targetValue:0,currentValue:0,progressPct:0,deadlineRemainingDays:0,budgetRemainingPct:0,expectedCompletionPct:0,rawScore:0}}};var Ut=I("agent"),q=class{static cache=new Map;static CACHE_TTL=1440*60*1e3;static async callClaude(t){let o=(await ue(t,'You are an AI quality evaluator. Respond with JSON: {"score": 0-1, "confidence": 0-1, "reasoning": "..."}')).match(/\{[\s\S]*\}/);if(!o)throw new Error("Failed to parse LLM Judge response as JSON");let s=JSON.parse(o[0]);return{score:Math.max(0,Math.min(1,s.score??0)),confidence:Math.max(.3,Math.min(.95,s.confidence??.5)),reasoning:s.reasoning??"No reasoning provided"}}static async evaluate(t,r){let n=`${t}:${r}`,o=this.cache.get(n);if(o&&Date.now()-o.evaluatedAt<this.CACHE_TTL)return o;let s=v(t);if(!s){let g={taskId:t,criteria:r,score:0,confidence:.3,reasoning:"Task not found",evaluatedAt:Date.now()};return this.cache.set(n,g),g}let i=this.getPromptTemplate(s.prompt??"",s.result??s.error??"",r),l,u,d;try{let g=await this.callClaude(i);l=g.score,u=g.confidence,d=g.reasoning}catch(g){Ut.warn({error:g,taskId:t},"LLM Judge Claude API call failed, using heuristic fallback"),s.status==="failed"?(l=.1,u=.6,d=`Task failed: ${s.error??"unknown error"} (heuristic fallback)`):s.status==="completed"&&s.result?(l=.7,u=.5,d="Task completed with result (heuristic fallback due to API error)"):s.status==="completed"?(l=.5,u=.4,d="Task completed without explicit result (heuristic fallback)"):(l=.3,u=.3,d=`Task in status: ${s.status} (heuristic fallback)`)}let p={taskId:t,criteria:r,score:l,confidence:u,reasoning:d,evaluatedAt:Date.now()};return this.cache.set(n,p),p}static shouldUseObjective(t){let r=v(t);return r?r.status==="completed"&&r.costUsd!==void 0&&r.numTurns!==void 0:!1}static clearCache(){this.cache.clear()}static getPromptTemplate(t,r,n){return`You are an expert evaluator. Evaluate the following task result against these criteria:
31
+
32
+ Task: ${t}
33
+ Result: ${r}
34
+ Criteria: ${n}
35
+
36
+ Provide:
37
+ 1. Score (0-1): How well did the task meet the criteria?
38
+ 2. Confidence (0-1): How confident are you in this evaluation?
39
+ 3. Reasoning: Brief explanation of your scoring
40
+
41
+ Respond in JSON: {"score": number, "confidence": number, "reasoning": "string"}`}};var Gt={L0:.2,L1:.15,L2:.35,L3:.3},ge=class e{goalId;nodes;children;constructor(t,r){this.goalId=t,this.nodes=new Map(r.map(n=>[n.id,n])),this.children=new Map;for(let n of r){let o=n.parentId,s=this.children.get(o)??[];s.push(n),this.children.set(o,s)}this.validateAcyclicity()}validateAcyclicity(){for(let t of this.nodes.values()){if(t.parentId&&!this.nodes.has(t.parentId))continue;let r=new Set,n=t.id;for(;n;){if(r.has(n))throw new Error(`Cycle detected in metric tree at node ${n}`);r.add(n),n=this.nodes.get(n)?.parentId}}}static buildFromGoal(t){let r=nt(t);return new e(t,r)}static fromNodes(t,r){return new e(t,r)}queryPath(t){let r=[];for(let n of this.nodes.values())n.level===t&&r.push(n);return r.sort((n,o)=>o.weight-n.weight)}aggregateScores(t,r){let n=this.queryPath(t);if(n.length===0)return 0;let o=0,s=0;for(let i of n){let l=r.get(i.id)??0,u=i.weight*i.calibrationFactor;o+=l*u,s+=u}return s>0?o/s:0}getWeightedScore(t){let r=0;for(let[n,o]of Object.entries(Gt)){let s=this.aggregateScores(n,t);r+=s*o}return Math.max(0,Math.min(1,r))}getNodeCount(){return this.nodes.size}getChildren(t){return this.children.get(t)??[]}};var An=I("agent");function fe(e,t){let r=Date.now(),n=ge.buildFromGoal(e),o=new Map,s=me.collect(e);for(let u of n.queryPath("L0"))o.set(u.id,s.rawScore);let i=Vt(n);if(t){let u=pe.collect(t,e);if(u.isComplete){for(let p of n.queryPath("L3"))o.set(p.id,u.rawScore);let d=n.getNodeCount()>0?n.getWeightedScore(o):Math.max(0,Math.min(1,u.rawScore*.65+s.rawScore*.35));return{goalId:e,taskId:t,reward:d,breakdown:{L0:s.rawScore,L1:0,L2:0,L3:u.rawScore},calibrationFactors:i,source:"objective",confidence:.9,computedAt:r}}}if(t&&!q.shouldUseObjective(t)){let d=q.evaluate(t,"general_quality"),p=s.rawScore*.5+.5*.5;return{goalId:e,taskId:t,reward:s.rawScore,breakdown:{L0:s.rawScore,L1:0,L2:0,L3:0,llmJudge:.5},calibrationFactors:i,source:"llm_judge",confidence:.4,computedAt:r}}let l=n.getNodeCount()>0?n.getWeightedScore(o):s.rawScore;return{goalId:e,reward:l,breakdown:{L0:s.rawScore,L1:0,L2:0,L3:0},calibrationFactors:i,source:"fallback",confidence:.3,computedAt:r}}function Vt(e){let t={L0:1,L1:1,L2:1,L3:1};for(let r of["L0","L1","L2","L3"]){let n=e.queryPath(r);n.length>0&&(t[r]=n[0].calibrationFactor)}return t}import{v4 as ut}from"uuid";oe();function he(e){return{id:e.id,roleId:e.role_id,taskType:e.task_type,name:e.name,promptTemplate:e.prompt_template,alpha:e.alpha,beta:e.beta,totalTrials:e.total_trials,avgReward:e.avg_reward??void 0,createdAt:e.created_at,updatedAt:e.updated_at??void 0}}function it(e){b().prepare(`
42
+ INSERT INTO strategies (id, role_id, task_type, name, prompt_template,
43
+ alpha, beta, total_trials, avg_reward, created_at, updated_at)
44
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
45
+ `).run(e.id,e.roleId,e.taskType,e.name,e.promptTemplate,e.alpha,e.beta,e.totalTrials,e.avgReward??null,e.createdAt,e.updatedAt??null)}function lt(e){let r=b().prepare("SELECT * FROM strategies WHERE id = ?").get(e);return r?he(r):void 0}function $n(e=100){return b().prepare("SELECT * FROM strategies ORDER BY created_at LIMIT ?").all(e).map(he)}function ct(e){return b().prepare("SELECT * FROM strategies WHERE role_id = ? ORDER BY created_at").all(e).map(he)}function L(e,t){return b().prepare("SELECT * FROM strategies WHERE role_id = ? AND task_type = ? ORDER BY created_at").all(e,t).map(he)}function dt(e,t){b().prepare(`
46
+ UPDATE strategies
47
+ SET alpha = alpha + ?,
48
+ beta = beta + ?,
49
+ total_trials = total_trials + 1,
50
+ avg_reward = CASE
51
+ WHEN total_trials = 0 THEN ?
52
+ ELSE (avg_reward * total_trials + ?) / (total_trials + 1)
53
+ END,
54
+ updated_at = ?
55
+ WHERE id = ?
56
+ `).run(t,1-t,t,t,Date.now(),e)}var H=class{static sampleBeta(t,r){let n=this.sampleGamma(t,1),o=this.sampleGamma(r,1);return n/(n+o)}static sampleGamma(t,r){if(t<1)return this.sampleGamma(t+1,r)*Math.pow(Math.random(),1/t);let n=t-1/3,o=1/Math.sqrt(9*n);for(;;){let s,i;do s=this.randn(),i=1+o*s;while(i<=0);i=i*i*i;let l=Math.random();if(l<1-.0331*s*s*s*s||Math.log(l)<.5*s*s+n*(1-i+Math.log(i)))return n*i/r}}static randn(){let t=Math.random(),r=Math.random();return Math.sqrt(-2*Math.log(t))*Math.cos(2*Math.PI*r)}static sample(t){if(t.length===0)return null;let r=null,n=-1;for(let o of t){let s=this.sampleBeta(o.alpha,o.beta);s>n&&(n=s,r=o)}return r}static getProbabilities(t,r=1e4){let n=new Map;for(let s=0;s<r;s++){let i=this.sample(t);i&&n.set(i.id,(n.get(i.id)||0)+1)}let o=new Map;for(let[s,i]of n)o.set(s,i/r);return o}};var Bt=5,Pe=20,pt=.5,S=class{static selectStrategy(t,r){let n=L(t,r);return H.sample(n)}static recordTrial(t,r,n,o,s,i,l){dt(t,o),st({id:ut(),strategyId:t,goalId:r,taskId:n,reward:o,metricL2Score:s,metricL3Score:i,context:l,completedAt:Date.now()})}static getStrategies(t,r){return L(t,r)}static getStrategyById(t){return lt(t)}static getPopulationStats(t,r){let n=L(t,r);if(n.length===0)return{count:0,avgTrials:0,avgReward:0,minTrials:0,maxTrials:0};let s=n.reduce((u,d)=>u+d.totalTrials,0)/n.length,i=n.filter(u=>u.avgReward!==void 0).map(u=>u.avgReward),l=i.length>0?i.reduce((u,d)=>u+d,0)/i.length:0;return{count:n.length,avgTrials:s,avgReward:l,minTrials:Math.min(...n.map(u=>u.totalTrials)),maxTrials:Math.max(...n.map(u=>u.totalTrials))}}static shouldEvolve(t,r){let n=this.getPopulationStats(t,r);return n.count<Bt?!0:n.count<Pe&&n.maxTrials>0}static addStrategy(t,r,n,o){if(L(t,r).length>=Pe)throw new Error(`Strategy population at maximum (${Pe}) for ${t}/${r}`);let i={id:`strat-${ut().slice(0,8)}`,roleId:t,taskType:r,name:n,promptTemplate:o,alpha:pt,beta:pt,totalTrials:0,createdAt:Date.now()};return it(i),i}static getTopStrategies(t,r,n=3){let s=L(t,r).filter(i=>i.totalTrials>0);return s.sort((i,l)=>(l.avgReward??0)-(i.avgReward??0)),s.slice(0,n)}static getSamplingProbabilities(t,r){let n=L(t,r);return H.getProbabilities(n)}static evaluateAndRecord(t,r,n,o,s,i){let l=fe(r,n);return this.recordTrial(t,r,n,l.reward,o,s,i),l.reward}};var Wt=3,Jt=2,be=class{static async generateVariants(t,r,n=Wt,o=Jt){let s=S.getTopStrategies(t,r,n);if(s.length===0){let l=`baseline-${r}-v1`;return S.addStrategy(t,r,l,this.generateBaselinePrompt(t,r)),[l]}let i=[];for(let l=0;l<o;l++){let u=s[0].totalTrials+l+1,d=`${r}-evolved-v${u}`,p=s[0].promptTemplate,g=this.mutateTemplate(p);S.addStrategy(t,r,d,g),i.push(d)}return i}static generateBaselinePrompt(t,r){return`You are a ${t} agent specializing in ${r}.
57
+
58
+ ## Core Focus
59
+ Complete tasks with high quality.
60
+
61
+ ## Approach
62
+ 1. Understand the task requirements thoroughly
63
+ 2. Plan your approach before executing
64
+ 3. Execute systematically, checking your work
65
+ 4. Verify completion against requirements`}static mutateTemplate(t){let r=[this.addProcessEmphasis(),this.addQualityFocus(),this.addVerificationStep()],n=r[Math.floor(Math.random()*r.length)];return`${t}
66
+
67
+ ## Evolution
68
+ ${n}`}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,n){return{promptTemplate:this.generateBaselinePrompt(t,r),rationale:"Generated baseline - LLM integration in Phase 5"}}};import{tool as N}from"@anthropic-ai/claude-agent-sdk";import{z as h}from"zod";import{v4 as qt}from"uuid";function M(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}var Ht={query:h.string().describe("Search query for memory retrieval"),roleId:h.string().optional().describe("Role ID to scope search (omit for cross-role)"),topK:h.number().optional().describe("Max results to return (default 5)")},Kt={query:h.string().describe("Search query for memory retrieval"),topK:h.number().optional().describe("Max results to return (default 5)")},Yt={id:h.string().optional().describe("Memory ID to update. Omit to create new."),roleId:h.string().describe("Role ID to save memory under"),content:h.string().describe("Memory content text"),type:h.enum(["event","thought","reflection"]).optional().describe("Memory type (default: thought)"),keywords:h.array(h.string()).optional().describe("Keywords for BM25 search"),importance:h.number().min(1).max(5).optional().describe("Importance 1-5 (default: 3)"),tier:h.enum(["working","episodic","semantic"]).optional().describe("Memory tier (default: episodic)")},zt={id:h.string().optional().describe("Memory ID to update. Omit to create new."),content:h.string().describe("Memory content text"),type:h.enum(["event","thought","reflection"]).optional().describe("Memory type (default: thought)"),keywords:h.array(h.string()).optional().describe("Keywords for BM25 search"),importance:h.number().min(1).max(5).optional().describe("Importance 1-5 (default: 3)"),tier:h.enum(["working","episodic","semantic"]).optional().describe("Memory tier (default: episodic)")},mt={id:h.string().describe("Memory ID to delete")};async function gt(e,t){let r=e??t.roleId,n=t.topK??5,o=await Ke(r,t.query,{topK:n});return M({results:o.map(s=>({id:s.id,type:s.type,content:s.content,keywords:s.keywords,importance:s.importance,score:s.score}))})}async function ft(e,t){let r=e??t.roleId;if(!r)return M({error:"roleId is required"});let n,o=!0;try{n=await Be(t.content)}catch{o=!1}if(t.id){if(!Te(t.id))return M({error:`Memory ${t.id} not found`});let u=Je(t.id,{content:t.content,embedding:n,keywords:t.keywords,importance:t.importance,type:t.type});return M({id:t.id,action:"updated",success:u,embeddingUpdated:o})}let s=`mem-${qt().slice(0,8)}`,i=Date.now();return We({id:s,roleId:r,type:t.type??"thought",content:t.content,embedding:n,keywords:t.keywords??[],importance:t.importance??3,sourceType:"manual",createdAt:i,lastAccessed:i,retrievedCount:0,tier:t.tier??"episodic"}),M({id:s,action:"created",success:!0,embeddingUpdated:o})}async function ht(e,t){if(e){let r=Te(t.id);if(!r)return M({error:`Memory ${t.id} not found`});if(r.roleId!==e)return M({error:`Memory ${t.id} does not belong to this role`})}return He(t.id),M({id:t.id,deleted:!0})}function bt(e){return e?[N("search_memories","Search agent memory using hybrid vector + keyword search. Returns scored memories ranked by relevance, recency, and importance.",Kt,async t=>gt(e,t)),N("save_memory","Create a new memory or update an existing one. Provide 'id' to update, omit to create. Embedding is auto-generated from content.",zt,async t=>ft(e,t)),N("delete_memory","Delete a memory by ID.",mt,async t=>ht(e,t))]:[N("search_memories","Search agent memory using hybrid vector + keyword search. Returns scored memories ranked by relevance, recency, and importance.",Ht,async t=>gt(void 0,t)),N("save_memory","Create a new memory or update an existing one. Provide 'id' to update, omit to create. Embedding is auto-generated from content.",Yt,async t=>ft(void 0,t)),N("delete_memory","Delete a memory by ID.",mt,async t=>ht(void 0,t))]}import{v4 as w}from"uuid";ye();import{spawnSync as It}from"child_process";import{createRequire as Zt}from"module";import{dirname as er,join as St}from"path";import{openSync as tr,readFileSync as rr,unlinkSync as nr}from"fs";var or=3e4,kt=12e4;function Tt(){let t=Zt(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");return St(er(t),"cli.js")}function Z(e,t){let r=Tt(),n=t?.timeout??or;if(t?.json){let s=St("/tmp",`adam-cli-stdout-${process.pid}-${Date.now()}.txt`),i=tr(s,"w");try{let l=It("node",[r,...e],{cwd:t.cwd,timeout:n,stdio:["ignore",i,"pipe"],encoding:"utf-8"});if(l.status!==0)throw new Error(l.stderr?.trim()||`CLI exited with status ${l.status}`);return rr(s,"utf-8")}finally{try{nr(s)}catch{}}}let o=It("node",[r,...e],{cwd:t?.cwd,timeout:n,encoding:"utf-8"});if(o.status!==0)throw new Error(o.stderr?.trim()||`CLI exited with status ${o.status}`);return o.stdout}function Rt(){let e=Z(["plugin","list","--available","--json"],{json:!0});return JSON.parse(e)}function De(e,t="user",r){return Z(["plugin","install",e,"--scope",t],{cwd:r,timeout:kt})}function Ae(e,t,r){return Z(["plugin","uninstall",e],{cwd:r,timeout:kt})}function _t(e,t){return Z(["plugin","enable",e])}function Mt(e,t){return Z(["plugin","disable",e])}function co(){try{return!!Tt()}catch{return!1}}ye();V();var ar={Read:{category:"File",label:"read"},Write:{category:"File",label:"write"},Edit:{category:"File",label:"edit"},Glob:{category:"Search",label:"find files"},Grep:{category:"Search",label:"search content"},Bash:{category:"Execution",label:"shell commands"},WebSearch:{category:"Web",label:"web search"},WebFetch:{category:"Web",label:"fetch pages"},NotebookEdit:{category:"Execution",label:"Jupyter notebooks"}};function ee(e,t){let r=e.allowedTools??[];if(r.length===0)return"No tool permissions";let n=new Map,o=[];for(let d of r){let p=ar[d];if(p){let g=n.get(p.category)??[];g.push(p.label),n.set(p.category,g)}else o.push(d)}let s=[];for(let[d,p]of n)s.push(`${d} (${p.join(", ")})`);o.length>0&&s.push(o.join(", "));let i=s.join(" \xB7 "),l=Object.keys(e.mcpServers??{});l.length>0&&(i+=` \xB7 MCP: ${l.join(", ")}`);let u=e.additionalDirectories??[];if(u.length>0&&(i+=` \xB7 Dirs: ${u.map(d=>d.path).join(", ")}`),t&&t.plugins.length>0){let d=t.plugins.map(p=>{let g=[];return p.skills.length>0&&g.push(`skills: ${p.skills.map(f=>f.name).join(", ")}`),p.agents.length>0&&g.push(`agents: ${p.agents.map(f=>f.name).join(", ")}`),g.length>0?`${p.name} (${g.join("; ")})`:p.name});i+=` \xB7 Plugins: ${d.join(", ")}`}return i}function ir(e){let t=[],r=e.additionalDirectories??[];for(let n of r){if(!n.inheritPlugins&&!n.inheritMcp)continue;let o=X(n.path),s=Object.entries(o.enabledPlugins).filter(([,l])=>l).map(([l])=>l),i=Ee(s);for(let[,l]of i)t.includes(l)||t.push(l)}try{let n=Fe(e.name),o=C({scope:"project",projectPath:n});for(let s of o)s.installPath&&!t.includes(s.installPath)&&t.push(s.installPath)}catch{}return t}function Ne(e){let t=ir(e),r=[];for(let n of t){let o=Q(n);o&&r.push({name:o.name||n.split("/").pop()||"unknown",description:o.description,skills:o.skills,agents:o.agents,mcpServers:o.mcpServers,hooks:o.hooks})}return{plugins:r}}oe();function lr(e){return{id:e.id,roleId:e.role_id??void 0,taskPattern:e.task_pattern,maxRiskLevel:e.max_risk_level,createdAt:e.created_at,createdByTaskId:e.created_by_task_id??void 0}}var Pt={low:1,medium:2,high:3};function xt(e){b().prepare(`
69
+ INSERT INTO approval_rules (id, role_id, task_pattern, max_risk_level, created_at, created_by_task_id)
70
+ VALUES (?, ?, ?, ?, ?, ?)
71
+ `).run(e.id,e.roleId??null,e.taskPattern,e.maxRiskLevel,e.createdAt,e.createdByTaskId??null)}function fo(e,t,r){let o=b().prepare("SELECT * FROM approval_rules ORDER BY created_at DESC").all();for(let s of o)if(!(s.role_id&&s.role_id!==e)&&!(Pt[r]>Pt[s.max_risk_level]))try{if(new RegExp(s.task_pattern,"i").test(t))return lr(s)}catch{}}import*as Lt from"crypto";var te=I("api"),re=class{cancelTask(t){let r=v(t);r&&(F(t,{status:"cancelled",completedAt:Date.now()}),ke.emit({type:"task_status_change",taskId:t,oldStatus:r.status,newStatus:"cancelled"}),te.debug({taskId:t,oldStatus:r.status},"Task cancelled"))}resolveApproval(t,r,n){return te.debug({approvalId:t,action:r,reason:n},"Approval resolved (no-op in Pure C)"),!0}resolvePlanApproval(t,r,n,o){let s=Ge(t);if(!s)return te.warn({planId:t},"Plan not found or already resolved"),!1;let i=v(s.taskId);return i?(Ve(t,r==="allow"?"approved":"denied",n),r==="allow"&&n==="permanent"&&xt({id:Lt.randomUUID(),roleId:s.roleId,taskPattern:i.prompt.slice(0,100).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),maxRiskLevel:s.plan.overallRisk,createdAt:Date.now(),createdByTaskId:i.id}),ke.emit({type:"plan_approval_decision",taskId:i.id,planId:t,decision:r,approvalType:n,reason:o}),te.debug({planId:t,decision:r,approvalType:n},"Plan approval resolved"),!0):(te.warn({planId:t},"Task not found for plan"),!1)}};var ve=I("manager");function c(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}async function P(e){let{listChannels:t}=await import("./channels-VEUBY2NZ.js"),r=t(),{listSessions:n}=await import("./session-manager-45LFTPBA.js"),o=[...n("active"),...n("archived")],s=[];for(let i of e)if(i.type==="session"&&i.sessionId)s.push({type:"session",sessionId:i.sessionId});else if(i.type==="channel"){let l=i.channelId,u=i.chatId;if(!l&&i.channelName){let d=r.find(p=>p.name.toLowerCase().includes(i.channelName.toLowerCase()));d&&(l=d.id)}if(l&&!u){let d=o.find(p=>p.source.type==="channel"&&p.source.channelId===l&&p.source.chatId);d?.source.chatId?u=d.source.chatId:u=r.find(g=>g.id===l)?.config?.userId}l&&u?s.push({type:"channel",channelId:l,chatId:u}):ve.warn({channelName:i.channelName,channelId:l,chatId:u},"Could not resolve channel notify target")}return s}async function dr(e){let{listRoles:t}=await import("./roles-SG2YAR64.js"),r=t(void 0,100,0);for(let n of r)if(n.name.toLowerCase().includes(e.toLowerCase()))return n.id}var ur={goalId:a.string()},pr={goalId:a.string(),status:a.string().optional(),currentValue:a.number().optional(),budgetUsd:a.number().optional(),notes:a.string().optional()},mr={goalId:a.string(),goalDescription:a.string(),maxSubtasks:a.number().optional()},D=a.union([a.object({type:a.literal("session"),sessionId:a.string()}),a.object({type:a.literal("channel"),channelName:a.string()}),a.object({type:a.literal("channel"),channelId:a.string(),chatId:a.string().optional()})]),gr={prompt:a.string(),roleId:a.string().describe("Role ID. Call list_roles first to find the best role for the task."),deliverTo:a.array(D).optional().describe("Where to deliver the task output (result full text). E.g., send result to a specific channel."),reportTo:a.array(D).optional().describe("Where to send status reports (completion summary). Defaults to the originating channel/session."),toolOverrides:a.object({allowedTools:a.array(a.string()).optional(),disallowedTools:a.array(a.string()).optional()}).optional()},fr={taskId:a.string(),goalId:a.string().optional(),strategyId:a.string().optional()},hr={roleId:a.string(),taskType:a.string(),name:a.string().optional()},br={status:a.string().optional(),limit:a.number().optional()},yr={taskId:a.string(),roleId:a.string()},vr={taskId:a.string().optional(),status:a.string().optional(),limit:a.number().optional()},wr={roleId:a.string(),allowedPaths:a.array(a.string()).optional(),deniedPaths:a.array(a.string()).optional(),allowedTools:a.array(a.string()).optional(),disallowedTools:a.array(a.string()).optional(),additionalDirectories:a.array(a.object({path:a.string(),inheritPlugins:a.boolean().optional(),inheritMcp:a.boolean().optional(),inheritPermissions:a.boolean().optional()})).optional(),allowedChannels:a.array(a.string()).optional(),inheritUserSettings:a.boolean().optional().describe("Enable/disable inheriting user-level settings (global plugins, MCP servers). Default: false (isolated).")},Ir={roleId:a.string().optional(),limit:a.number().optional()},Sr={name:a.string(),cagPrompt:a.string(),traits:a.array(a.string()).optional(),allowedTools:a.array(a.string()).optional(),disallowedTools:a.array(a.string()).optional(),additionalDirectories:a.array(a.object({path:a.string(),inheritPlugins:a.boolean().optional(),inheritMcp:a.boolean().optional(),inheritPermissions:a.boolean().optional()})).optional()},kr={roleId:a.string(),reason:a.string().optional()},Tr={name:a.string(),description:a.string().optional(),roleId:a.string().optional(),metric:a.string().optional(),targetValue:a.number().optional(),deadline:a.number().optional(),budgetUsd:a.number().optional(),deliverTo:a.array(D).optional().describe("Where to deliver goal completion notifications.")},Rr={name:a.string(),description:a.string().optional(),triggerType:a.enum(["cron","event"]),triggerCron:a.string().optional(),triggerEvent:a.string().optional(),prompt:a.string(),roleId:a.string().optional(),enabled:a.boolean().optional(),goalIds:a.array(a.string()).optional(),deliverTo:a.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:a.array(D).optional().describe("Where to send status reports (completion summary).")},_r={status:a.enum(["active","retired","probation"]).optional(),limit:a.number().optional()},Mr={enabled:a.boolean().optional()},Pr={},xr={},Lr={prompt:a.string().describe("The task prompt to execute after the delay"),delayMinutes:a.number().optional().describe("Minutes from now to execute (e.g., 30 for 'half an hour later')"),runAt:a.string().optional().describe("ISO 8601 timestamp to execute at (e.g., '2026-04-01T15:00:00+08:00')"),roleId:a.string().describe("Role ID to assign the task to. Call list_roles first."),deliverTo:a.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:a.array(D).optional().describe("Where to send status reports (completion summary).")},Er={roleId:a.string().optional().describe("If provided, shows which plugins are installed in that role's workspace.")},Cr={roleId:a.string().describe("Role ID to install the plugin under (project-scope)."),pluginId:a.string().describe("Plugin ID (e.g. 'github@anthropic'). Use list_available_plugins to discover available plugins.")},Dr={roleId:a.string().describe("Role ID to uninstall the plugin from."),pluginId:a.string().describe("Plugin ID to uninstall.")},Ar={roleId:a.string().describe("Role ID to bind the MCP server to."),mcpName:a.string().describe("Name for this MCP server (e.g., 'github', 'filesystem')."),mcpConfig:a.record(a.string(),a.unknown()).describe("MCP server configuration object.")},Nr={roleId:a.string().describe("Role ID to unbind the MCP server from."),mcpName:a.string().describe("Name of the MCP server to remove.")},jr={pluginId:a.string().describe("Plugin ID (e.g., 'github@anthropic').")},$r={pluginId:a.string().describe("Plugin ID (e.g., 'github@anthropic').")},Or={pluginId:a.string().describe("Plugin ID (e.g., 'github@anthropic').")},Fr={pluginId:a.string().describe("Plugin ID (e.g., 'github@anthropic').")},Ur={},Gr={},Vr={pluginId:a.string().describe("Plugin ID (e.g., 'github@anthropic').")},Br={roleId:a.string().describe("Role ID to associate scanned plugins with."),path:a.string().describe("Directory path to scan for .claude/settings.json.")},Wr={taskId:a.string().describe("Task ID to cancel.")},Jr={taskId:a.string().describe("Task ID to get logs for."),limit:a.number().optional().describe("Max log entries (default 20).")},qr={roleId:a.string().describe("Role ID to delete.")},Hr={},Kr={updates:a.record(a.string(),a.unknown()).describe("Config key-value pairs to update. Example: { 'defaults.maxTurns': 50, 'logging.level': 'debug' }")},Yr={roleId:a.string().describe("Role ID to list memories for."),limit:a.number().optional().describe("Max results (default 20).")},zr={templateId:a.string().describe("Template ID to update."),name:a.string().optional(),enabled:a.boolean().optional(),prompt:a.string().optional(),triggerCron:a.string().optional(),triggerEvent:a.string().optional(),roleId:a.string().optional()},Qr={templateId:a.string().describe("Template ID to delete.")},Xr={templateId:a.string().describe("Template ID to run immediately.")},Zr={enabled:a.boolean().optional().describe("Filter by enabled status.")},en={eventType:a.string().describe("Event type that triggers this rule (e.g., 'task_complete')."),channelId:a.string().describe("Channel ID to deliver to."),format:a.string().optional().describe("Format template (e.g., 'summary', 'full'). Default: 'summary'."),matchCriteria:a.record(a.string(),a.unknown()).optional().describe("JSON match criteria for event fields."),enabled:a.boolean().optional().describe("Enable this rule immediately (default true).")},tn={ruleId:a.string().describe("Delivery rule ID to delete.")},rn={roleId:a.string().optional().describe("Role ID to filter strategies by.")},Et=[m("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.",ur,async e=>{let t=_(e.goalId);if(!t)return c({error:"Goal not found"});let r=Date.now(),n=t.targetValue>0?t.currentValue/t.targetValue:0;return c({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:n,timeRemainingMs:Math.max(0,t.deadline-r),budgetRemainingUsd:t.budgetUsd})}),m("update_goal_state","Update a goal's status, current value, or budget.",pr,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(),de(e.goalId,t)),c({success:!0})}),m("decompose_goal","Decompose a goal into actionable subtasks using LLM reasoning.",mr,async e=>{let t=k(),r=Math.min(e.maxSubtasks??5,10);try{let{query:o}=await import("@anthropic-ai/claude-agent-sdk"),s=`Decompose this goal into ${r} actionable subtasks.
72
+
73
+ Goal: ${e.goalDescription}
74
+
75
+ Respond ONLY with a JSON array. Each item: {"description": "...", "prompt": "detailed task instruction", "complexity": "low|medium|high", "role": "engineer|analyst|content_creator|reviewer"}
76
+
77
+ Rules:
78
+ - Each subtask must be independently executable
79
+ - Order from foundational to dependent
80
+ - Be specific about what each subtask should accomplish
81
+ - For each subtask, specify the best role from: 'engineer', 'analyst', 'content_creator', 'reviewer'. Match role to the nature of the work.`,i=o({prompt:s,options:{cwd:process.cwd(),maxTurns:1,maxBudgetUsd:.02}}),l="";for await(let d of i){let p=d;p.type==="result"&&typeof p.result=="string"&&(l=p.result)}let u=l.match(/\[[\s\S]*\]/);if(u){let d=JSON.parse(u[0]),p=[];for(let g=0;g<Math.min(d.length,r);g++){let f=d[g],ne=`subtask-${w().slice(0,8)}`,$=f.role,O=$?await dr($):void 0;se({id:ne,status:"pending",prompt:f.prompt,parentId:e.goalId,roleId:O,config:t.defaults,createdAt:Date.now()}),p.push({id:ne,description:f.description,prompt:f.prompt,dependencies:g>0?[p[g-1].id]:[],estimatedComplexity:f.complexity??"medium",role:$})}if(p.length>0)return c({subtasks:p})}}catch(o){ve.error({error:o},"LLM decomposition failed, using fallback")}let n=[];for(let o=0;o<r;o++){let s=`subtask-${w().slice(0,8)}`,i=`Subtask ${o+1} of goal: ${e.goalDescription.slice(0,100)}`,l=`${e.goalDescription}
82
+
83
+ Subtask ${o+1}/${r}`;se({id:s,status:"pending",prompt:l,parentId:e.goalId,config:t.defaults,createdAt:Date.now()}),n.push({id:s,description:i,prompt:l,dependencies:o>0?[n[o-1].id]:[],estimatedComplexity:"medium"})}return c({subtasks:n})}),m("dispatch_task","Create and immediately dispatch a task to the execution pool. roleId is required \u2014 call list_roles first to find the best role. The assigned role determines which tools the worker can use. Pass deliverTo (result delivery) and/or reportTo (status reports) to route output when the task completes.",gr,async e=>{let t=T(e.roleId);if(!t||t.status!=="active"){let O=G("active",20,0).filter(R=>R.source!=="system").map(R=>({id:R.id,name:R.name,allowedTools:R.allowedTools??[],capabilitySummary:ee(R)}));return c({error:`Role not found or not active: ${e.roleId}. Pick a roleId from the list below.`,availableRoles:O})}let r=w(),n=k(),o=e.prompt.toLowerCase(),s={coding:["code","implement","fix","debug","refactor","build"],analysis:["analyze","data","report","statistics","investigate"],content:["write","translate","summarize","content","draft"],review:["review","check","audit","evaluate","assess"],admin:["config","permission","deploy","manage"]},i="general";for(let[O,R]of Object.entries(s))if(R.some(Ct=>o.includes(Ct))){i=O;break}let l,u=e.prompt,d=S.selectStrategy(e.roleId,i);d?.promptTemplate&&(u=`${d.promptTemplate}
84
+
85
+ ## Task
86
+ ${e.prompt}`,l=d.id);let p=[...n.defaults.allowedTools];e.toolOverrides?.allowedTools&&(p=[...e.toolOverrides.allowedTools]);let g={...n.defaults,allowedTools:p,disallowedTools:e.toolOverrides?.disallowedTools??n.defaults.disallowedTools},f=e.deliverTo?await P(e.deliverTo):void 0,ne=e.reportTo?await P(e.reportTo):void 0;se({id:r,status:"pending",prompt:u,roleId:e.roleId,deliverTo:f,reportTo:ne,config:g,createdAt:Date.now()});let{serverBus:$}=await import("./server-bus-GEGVMSCA.js");return $.emit({type:"task_created",taskId:r}),c({taskId:r,roleId:e.roleId,strategyId:l})}),m("evaluate_result","Evaluate a completed task's result and record a trial for Thompson Sampling.",fr,async e=>{let{goalId:t,taskId:r,strategyId:n}=e,o=fe(t??"",r);return n&&t&&S.recordTrial(n,t,r,o.reward,o.breakdown.L2||void 0,o.breakdown.L3||void 0,"Evaluated via adam-tools"),c({reward:o.reward,metricL2Score:o.breakdown.L2||void 0,metricL3Score:o.breakdown.L3||void 0,source:o.source,reasoning:`Evaluated via ${o.source} with confidence ${o.confidence.toFixed(2)}`})}),m("create_strategy","Create a new strategy variant for a role/taskType using LLM evolution.",hr,async e=>{let{roleId:t,taskType:r}=e;await be.generateVariants(t,r,3,1);let n=S.getStrategies(t,r),o=n[n.length-1];return c(o?{id:o.id,name:o.name,promptTemplate:o.promptTemplate}:{error:`Failed to create strategy for ${t}/${r}`})}),m("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.",br,async e=>{let t=e.status;return c(Ze(t,e.limit??10,0))}),m("delete_goal","Delete a goal by ID.",{goalId:a.string()},async e=>_(e.goalId)?(et(e.goalId),c({success:!0,goalId:e.goalId})):c({error:"Goal not found"})),m("pause_goal","Pause an active goal.",{goalId:a.string()},async e=>_(e.goalId)?(de(e.goalId,{status:"paused",updatedAt:Date.now()}),c({success:!0,goalId:e.goalId,status:"paused"})):c({error:"Goal not found"})),m("assign_role","Assign a role to a pending task.",yr,async e=>{let{taskId:t,roleId:r}=e;if(!v(t))return c({error:`Task not found: ${t}`});let o=T(r);return o?(F(t,{roleId:r}),ve.debug({taskId:t,roleId:r,roleName:o.name},"Role assigned to task"),c({success:!0,taskId:t,roleId:r})):c({error:`Role not found: ${r}`})}),...bt(),m("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.",vr,async e=>{if(e.taskId){let r=v(e.taskId);return c(r??{error:"Task not found"})}let t=e.status;return c(A(t,e.limit??100,0))}),m("modify_role_permissions","Update a role's RBAC permissions (paths, tools).",wr,async e=>{let t=T(e.roleId);if(!t)return c({error:`Role not found: ${e.roleId}`});let r={};if(e.allowedTools&&(r.allowedTools=e.allowedTools),e.disallowedTools&&(r.disallowedTools=e.disallowedTools),e.additionalDirectories!==void 0&&(r.additionalDirectories=e.additionalDirectories),e.allowedChannels!==void 0&&(r.allowedChannels=e.allowedChannels),"inheritUserSettings"in e&&(r.inheritUserSettings=e.inheritUserSettings),e.allowedPaths||e.deniedPaths){let n=t.preferences??{},o=n.permissions??{};r.preferences={...n,permissions:{...o,allowedPaths:e.allowedPaths??o.allowedPaths,deniedPaths:e.deniedPaths??o.deniedPaths}}}return U(e.roleId,r),c({success:!0})}),m("view_audit_log","View the evolution audit log for role changes.",Ir,async e=>{let{listEvolutionAudit:t}=await import("./evolution-audit-B7WKMOVR.js"),r=t(e.limit??50);return c({entries:r})}),m("list_roles","List all roles with their capabilities including bound plugins (skills/agents). Use this to discover available roles before dispatching tasks.",_r,async e=>{let r=G(e.status,e.limit??50,0).map(n=>{let o=Ne(n);return{id:n.id,name:n.name,status:n.status,allowedTools:n.allowedTools??[],disallowedTools:n.disallowedTools??[],additionalDirectories:n.additionalDirectories??[],cagPrompt:n.cagPrompt.slice(0,500)+(n.cagPrompt.length>500?"...":""),capabilitySummary:ee(n,o),plugins:o.plugins.map(s=>({name:s.name,skills:s.skills.map(i=>i.name),agents:s.agents.map(i=>i.name)}))}});return c({roles:r})}),m("create_role","Create a new role with a name, CAG prompt, and optional tool permissions.",Sr,async e=>{let t=`role-${w().slice(0,8)}`,r={id:t,name:e.name,cagPrompt:e.cagPrompt,learnedRules:[],memoryStreamId:`mem-${w().slice(0,8)}`,status:"active",preferences:{},createdAt:Date.now(),allowedTools:e.allowedTools,disallowedTools:e.disallowedTools,additionalDirectories:e.additionalDirectories};return $e(r),le(r),c({roleId:t,name:e.name,allowedTools:e.allowedTools,additionalDirectories:e.additionalDirectories??[]})}),m("retire_role","Retire a role (marks as retired, stops receiving tasks).",kr,async e=>T(e.roleId)?(U(e.roleId,{status:"retired"}),ve.info({roleId:e.roleId,reason:e.reason},"Role retired"),c({success:!0})):c({error:`Role not found: ${e.roleId}`})),m("create_goal","Create a new goal with optional budget, deadline, and metric tracking.",Tr,async e=>{let t=w(),r=Date.now(),n=r+10080*60*1e3,o={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??n,budgetUsd:e.budgetUsd??5,status:"active",createdAt:r,deliverTo:e.deliverTo?await P(e.deliverTo):void 0};ce(o),ot(t,o.metricType);let s=_(t);return c({goalId:s.id,name:s.name,status:s.status})}),m("create_template","Create a recurring scheduled task using cron expressions (e.g., 'every hour', 'daily at 9am', 'weekly'). For one-shot delayed tasks ('in 30 minutes', 'tomorrow at 3pm'), use schedule_task instead.",Rr,async e=>{let{createTaskTemplate:t}=await import("./task-templates-7LSQ6OST.js"),r=w(),n=w(),o=e.deliverTo?await P(e.deliverTo):void 0,s=e.reportTo?await P(e.reportTo):void 0,i={id:r,name:e.name,description:e.description,trigger:{type:e.triggerType,cron:e.triggerCron,event:e.triggerEvent},steps:[{id:n,prompt:e.prompt}],rolePreference:e.roleId,enabled:e.enabled??!0,createdAt:Date.now(),goalIds:e.goalIds,deliverTo:o,reportTo:s};return t(i),c({templateId:r,name:i.name,trigger:i.trigger})}),m("list_templates","List task templates (automations). Use this to check existing scheduled/recurring tasks before creating new ones.",{enabled:a.boolean().optional().describe("Filter by enabled status. Omit to list all."),limit:a.number().optional().describe("Max results (default 50)")},async e=>{let{listTaskTemplates:t}=await import("./task-templates-7LSQ6OST.js"),r=t(e.enabled,e.limit??50,0);return c(r.map(n=>({id:n.id,name:n.name,description:n.description,trigger:n.trigger,enabled:n.enabled,rolePreference:n.rolePreference,deliverTo:n.deliverTo,createdAt:n.createdAt})))}),m("send_to_channel","Send a message to a connected channel by name. Use this to deliver task results or notifications to a specific channel (e.g., WeChat on iPad).",{channelName:a.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:a.string().describe("The message content to send")},async e=>{let t=await P([{type:"channel",channelName:e.channelName}]);if(t.length===0)return c({error:`Channel "${e.channelName}" not found or no chatId available`});let r=t[0];if(r.type!=="channel")return c({error:"Resolved target is not a channel"});let{getOutboundGateway:n}=await import("./outbound-gateway-FIPC4BZO.js"),s=await n().send({channelId:r.channelId,chatId:r.chatId,content:e.message,messageType:"deliver"});return c({success:s.success,channelName:e.channelName})}),m("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.",Mr,async e=>{let t=Re(e.enabled),r=[..._e("active"),..._e("archived")],n=t.map(o=>{let s,i=r.find(l=>l.source.type==="channel"&&l.source.channelId===o.id&&l.source.chatId);return i?.source.chatId?s=i.source.chatId:s=o.config?.userId,{id:o.id,name:o.name,platform:o.platform,status:o.status,chatId:s}});return c({channels:n})}),m("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.",Pr,async()=>{let e=k(),t=A("running"),r=A("pending");return c({executionPool:{active:t.length,max:e.execution?.maxConcurrent??5,queued:r.length},timestamp:new Date().toISOString()})}),m("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.",Lr,async e=>{let t=T(e.roleId);if(!t||t.status!=="active"){let g=G("active",20,0).filter(f=>f.source!=="system").map(f=>({id:f.id,name:f.name,allowedTools:f.allowedTools??[],capabilitySummary:ee(f)}));return c({error:`Role not found or not active: ${e.roleId}. Pick a roleId from the list below.`,availableRoles:g})}let r=Date.now(),n;if(e.delayMinutes!==void 0&&e.runAt!==void 0)return c({error:"Provide exactly one of delayMinutes or runAt, not both"});if(e.delayMinutes!==void 0)n=r+e.delayMinutes*60*1e3;else if(e.runAt!==void 0){if(n=new Date(e.runAt).getTime(),isNaN(n))return c({error:"Invalid ISO 8601 timestamp in runAt"})}else return c({error:"Provide either delayMinutes or runAt"});if(n<=r)return c({error:"Scheduled time must be in the future"});let o=10080*60*1e3;if(n-r>o)return c({error:"Schedule exceeds maximum of 7 days"});let s=w(),i=new Date(n).toISOString(),l=e.deliverTo?await P(e.deliverTo):void 0,u=e.reportTo?await P(e.reportTo):void 0;Ye({id:s,name:e.prompt.slice(0,80),description:`One-shot scheduled task: ${e.prompt.slice(0,200)}`,trigger:{type:"once",runAt:i},steps:[{id:"main",prompt:e.prompt}],rolePreference:e.roleId,config:{...k().defaults},tags:["scheduled","once"],enabled:!0,createdAt:r,deliverTo:l,reportTo:u});let{getBreeEngine:d}=await import("./bree-engine-SQMSKGAP.js"),p=d();return p&&p.scheduleOnceJob(s),c({templateId:s,executeAt:i,prompt:e.prompt})}),m("cancel_scheduled_task","Cancel a previously scheduled one-shot task by its template ID. The task will not execute.",{templateId:a.string().describe("The template ID returned by schedule_task")},async e=>{let t=B(e.templateId);if(!t)return c({error:`Template not found: ${e.templateId}`});if(t.trigger.type!=="once")return c({error:"This is not a one-shot scheduled task. Use disable_template for recurring automations."});Qe(e.templateId);let{getBreeEngine:r}=await import("./bree-engine-SQMSKGAP.js"),n=r();return n&&await n.unscheduleJob(e.templateId),c({cancelled:!0,templateId:e.templateId})}),m("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.",Er,async e=>{let t=z(),r=C(),n=e.roleId?(()=>{let{getRoleWorkspacePath:o}=(V(),x(Ie)),{getRole:s}=(ie(),x(we)),{listInstalledPlugins:i}=(ye(),x(wt)),l=s(e.roleId);if(!l)return[];let u=o(l.name);return i({scope:"project",projectPath:u}).map(d=>d.id)})():[];return c({plugins:r.map(o=>({id:o.id,name:o.name,scope:o.scope,projectPath:o.projectPath,enabled:o.enabled,globalEnabled:t[o.id]??o.enabled,isInstalledInRole:n.includes(o.id),description:o.version?`v${o.version}`:void 0}))})}),m("install_plugin_for_role","Install a plugin into a role's workspace (project-scope). The plugin will be available when that role executes tasks.",Cr,async e=>{let{getRole:t}=(ie(),x(we)),{getRoleWorkspacePath:r}=(V(),x(Ie)),n=t(e.roleId);if(!n)return c({error:`Role not found: ${e.roleId}`});let o=r(n.name);try{return De(e.pluginId,"project",o),c({success:!0,roleId:e.roleId,pluginId:e.pluginId,scope:"project",cwd:o})}catch(s){return c({error:`Failed to install plugin: ${s}`})}}),m("uninstall_plugin_from_role","Uninstall a plugin from a role's workspace.",Dr,async e=>{let{getRole:t}=(ie(),x(we)),{getRoleWorkspacePath:r}=(V(),x(Ie)),n=t(e.roleId);if(!n)return c({error:`Role not found: ${e.roleId}`});let o=r(n.name);try{return Ae(e.pluginId,"project",o),c({success:!0,roleId:e.roleId,pluginId:e.pluginId})}catch(s){return c({error:`Failed to uninstall plugin: ${s}`})}}),m("bind_mcp_to_role","Bind an MCP server configuration to a role. The MCP server will be available to the role during task execution.",Ar,async e=>{let t=T(e.roleId);if(!t)return c({error:`Role not found: ${e.roleId}`});let n={...t.mcpServers??{},[e.mcpName]:e.mcpConfig};try{return U(e.roleId,{mcpServers:n}),le(t),c({success:!0,roleId:e.roleId,mcpName:e.mcpName,mcpServers:n})}catch(o){return c({error:`Failed to bind MCP server: ${o}`})}}),m("unbind_mcp_from_role","Remove an MCP server binding from a role.",Nr,async e=>{let t=T(e.roleId);if(!t)return c({error:`Role not found: ${e.roleId}`});let r={...t.mcpServers??{}};if(!(e.mcpName in r))return c({error:`MCP server "${e.mcpName}" not bound to this role`});delete r[e.mcpName];try{return U(e.roleId,{mcpServers:r}),le(t),c({success:!0,roleId:e.roleId,mcpName:e.mcpName})}catch(n){return c({error:`Failed to unbind MCP server: ${n}`})}}),m("get_capabilities","Get a comprehensive overview of Adam's current capabilities: available roles and their tools, connected channels, installed plugins, active automations, and execution capacity. Call this when the user asks what you can do, or asks for help.",xr,async()=>{let{listTaskTemplates:e}=await import("./task-templates-7LSQ6OST.js"),t=k(),r=G(void 0,100,0),n=Re(),o=e(!0,100,0),s=A("running"),i=A("pending");return c({roles:{description:"Specialized worker identities \u2014 each has its own tools, MCP servers, plugins (skills/agents), and learned rules",active:r.filter(l=>l.status==="active"&&l.source!=="system").map(l=>{let u=Ne(l);return{name:l.name,tools:l.allowedTools??[],mcpServers:Object.keys(l.mcpServers??{}),channels:l.allowedChannels??[],capabilitySummary:ee(l,u),plugins:u.plugins.map(d=>({name:d.name,skills:d.skills.map(p=>p.name),agents:d.agents.map(p=>p.name)}))}}),retired:r.filter(l=>l.status==="retired").length,probation:r.filter(l=>l.status==="probation").length},channels:{description:"Send/receive messages via connected platforms",connected:n.filter(l=>l.enabled).map(l=>({name:l.name,platform:l.platform,status:l.status}))},plugins:{description:"Extensions that add capabilities to roles",installed:C().filter(l=>l.enabled).map(l=>({name:l.name,scope:l.scope,description:l.version?`v${l.version}`:void 0}))},automations:{description:"Recurring cron tasks and event-triggered templates",active:o.map(l=>({name:l.name,trigger:l.trigger}))},execution:{description:"Parallel task execution pool",maxConcurrent:t.execution?.maxConcurrent??5,running:s.length,queued:i.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"]})}),m("enable_plugin","Enable a globally installed plugin (makes it available to all roles).",jr,async e=>{try{return _t(e.pluginId),c({success:!0,pluginId:e.pluginId})}catch(t){return c({error:`Failed to enable plugin: ${t}`})}}),m("disable_plugin","Disable a globally installed plugin (removes it from all roles).",$r,async e=>{try{return Mt(e.pluginId),c({success:!0,pluginId:e.pluginId})}catch(t){return c({error:`Failed to disable plugin: ${t}`})}}),m("install_plugin_for_user","Install a plugin globally for the current user (user-scope).",Or,async e=>{try{return De(e.pluginId,"user"),c({success:!0,pluginId:e.pluginId,scope:"user"})}catch(t){return c({error:`Failed to install plugin: ${t}`})}}),m("uninstall_plugin_for_user","Uninstall a globally installed plugin from the current user.",Fr,async e=>{try{return Ae(e.pluginId,"user"),c({success:!0,pluginId:e.pluginId})}catch(t){return c({error:`Failed to uninstall plugin: ${t}`})}}),m("browse_marketplace","Browse all available plugins from configured marketplaces (shows installed and available).",Ur,async()=>{try{let e=Rt(),t=C();return c({available:e,installed:t})}catch(e){return c({error:`Failed to browse marketplace: ${e}`})}}),m("list_marketplace_sources","List configured plugin marketplace sources.",Gr,async()=>{let e=Ce();return c({sources:e})}),m("get_plugin_detail","Get detailed manifest for an installed plugin (skills, agents, MCP servers, hooks).",Vr,async e=>{let t=Le(e.pluginId);if(!t)return c({error:`Plugin not found: ${e.pluginId}`});let r=Q(t.installPath);return c({id:t.id,name:t.name,version:t.version,scope:t.scope,projectPath:t.projectPath,enabled:t.enabled,manifest:r})}),m("scan_directory","Scan a directory for .claude/settings.json and return its plugin/MCP configuration.",Br,async e=>{let{getRole:t}=await import("./roles-SG2YAR64.js");if(!t(e.roleId))return c({error:`Role not found: ${e.roleId}`});try{let n=X(e.path);return c({roleId:e.roleId,path:e.path,config:n})}catch(n){return c({error:`Failed to scan directory: ${n}`})}}),m("cancel_task","Cancel a running or pending task by setting its status to 'cancelled'. Emits a task_status_change event.",Wr,async e=>{let t=v(e.taskId);if(!t)return c({error:`Task not found: ${e.taskId}`});let r=t.status;F(e.taskId,{status:"cancelled"});let{serverBus:n}=await import("./server-bus-GEGVMSCA.js");return n.emit({type:"task_status_change",taskId:e.taskId,oldStatus:r,newStatus:"cancelled"}),c({success:!0,taskId:e.taskId,status:"cancelled"})}),m("view_task_logs","Retrieve step-by-step execution logs for a task.",Jr,async e=>{let t=ae(e.taskId,e.limit??20);return c({taskId:e.taskId,count:t.length,logs:t})}),m("delete_role","Delete a role by ID. This removes the role and its workspace.",qr,async e=>T(e.roleId)?(Oe(e.roleId),c({success:!0,roleId:e.roleId})):c({error:`Role not found: ${e.roleId}`})),m("view_config","Get the current runtime configuration (mutable fields and restart-required fields).",Hr,async()=>{let{MUTABLE_PATHS:e,RESTART_REQUIRED_PATHS:t}=await import("./runtime-6UTYEONR.js"),r=k(),n={};try{let l=k().server?.port??7100,u=await fetch(`http://127.0.0.1:${l}/config`);u.ok&&(n=await u.json())}catch{}let o=[...e,...t],s=[...t],i={};for(let l of o){let u=l.split("."),d=r;for(let p of u)if(d&&typeof d=="object")d=d[p];else{d=void 0;break}i[l]={value:d,mutable:!t.includes(l)}}return c({config:i,mutable:[...e],restartRequired:[...t]})}),m("update_config","Update mutable runtime configuration fields. Returns partial-success: some fields may update while others return errors.",Kr,async e=>{let{isRestartRequiredPath:t}=await import("./runtime-6UTYEONR.js"),{setConfigValue:r}=await import("./config-WHXCZCI4.js"),n=je(e.updates,r);if(e.updates["logging.level"]&&Ue(e.updates["logging.level"]),n.updated.length>0){let{serverBus:o}=await import("./server-bus-GEGVMSCA.js");o.emit({type:"config_changed",changes:n.updated.map(s=>({path:s,value:e.updates[s]}))})}return c(n)}),m("list_memories","List memories stored under a specific role.",Yr,async e=>{let t=qe(e.roleId,e.limit??20);return c({roleId:e.roleId,count:t.length,memories:t})}),m("update_template","Update a task template's fields (name, prompt, cron, enabled, etc.).",zr,async e=>{let t=B(e.templateId);if(!t)return c({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){let n=t.steps?.length?[...t.steps]:[];n.length===0?n.push({id:w(),prompt:e.prompt}):n[0]={...n[0],prompt:e.prompt},r.steps=n}return(e.triggerCron!==void 0||e.triggerEvent!==void 0)&&(r.trigger={type:e.triggerEvent?"event":"cron",cron:e.triggerCron,event:e.triggerEvent}),e.roleId!==void 0&&(r.rolePreference=e.roleId),ze(e.templateId,r),c({success:!0,templateId:e.templateId,updated:Object.keys(r)})}),m("delete_template","Delete a task template by ID.",Qr,async e=>B(e.templateId)?(Xe(e.templateId),c({success:!0,templateId:e.templateId})):c({error:`Template not found: ${e.templateId}`})),m("run_template","Trigger a template immediately (runs the webhook endpoint for its name).",Xr,async e=>{let t=B(e.templateId);if(!t)return c({error:`Template not found: ${e.templateId}`});try{let r=k().server?.port??7100,n=await fetch(`http://127.0.0.1:${r}/webhooks/${t.name}`,{method:"POST"}),o=await n.json();return n.ok?c({success:!0,templateId:e.templateId,templateName:t.name,response:o}):c({error:`Webhook failed: ${o.code??n.status} \u2014 ${o.message??""}`})}catch(r){return c({error:`Failed to trigger template: ${r}`})}}),m("list_delivery_rules","List delivery rules, optionally filtered by enabled status.",Zr,async e=>{let t=Me(e.enabled);return c({count:t.length,rules:t})}),m("create_delivery_rule","Create a new delivery rule for event-driven result routing.",en,async e=>{let t=w(),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 tt(r),c({success:!0,ruleId:t,rule:r})}),m("delete_delivery_rule","Delete a delivery rule by ID.",tn,async e=>Me().find(n=>n.id===e.ruleId)?(rt(e.ruleId),c({success:!0,ruleId:e.ruleId})):c({error:`Delivery rule not found: ${e.ruleId}`})),m("list_strategies","List Thompson Sampling strategy populations for a role, or all strategies if roleId omitted.",rn,async e=>{let t;if(e.roleId)t=ct(e.roleId);else{let{getDb:r}=await import("./db-PNZ3UJOE.js");t=r().prepare("SELECT * FROM strategies ORDER BY created_at").all().map(o=>({id:o.id,roleId:o.role_id,name:o.name,taskType:o.task_type,createdAt:o.created_at,updatedAt:o.updated_at??void 0,promptTemplate:o.prompt_template??"",alpha:o.alpha,beta:o.beta,totalTrials:o.trials,avgReward:o.total_reward&&o.trials>0?o.total_reward/o.trials:void 0,enabled:o.enabled===1}))}return c({roleId:e.roleId??null,count:t.length,strategies:t})}),m("authorize_task_operation","Authorize a pending privilege escalation for a task. The paused operation will proceed.",{taskId:a.string(),operationId:a.string().optional().describe("ID of the specific operation. If omitted, authorizes the most recent pending operation."),scope:a.enum(["once","permanent"]).default("once").describe("'once' = this operation only. 'permanent' = auto-authorize matching patterns in the future.")},async e=>{let t=Se(e.taskId),r=e.operationId?t.find(o=>o.id===e.operationId):t.find(o=>o.status==="pending");return r?(new re().resolvePlanApproval(r.id,"allow",e.scope),c({success:!0,operationId:r.id,decision:"allow",scope:e.scope})):c({error:"No pending operation found for this task"})}),m("deny_task_operation","Deny a pending privilege escalation for a task. The paused operation will be rejected.",{taskId:a.string(),operationId:a.string().optional(),reason:a.string().optional().describe("Reason for denial, provided to the executor as feedback.")},async e=>{let t=Se(e.taskId),r=e.operationId?t.find(o=>o.id===e.operationId):t.find(o=>o.status==="pending");return r?(new re().resolvePlanApproval(r.id,"deny","once",e.reason),c({success:!0,operationId:r.id,decision:"deny"})):c({error:"No pending operation found for this task"})})];function Yo(){return Et.map(e=>e.name).sort().join(",")}function zo(){return cr({name:"adam-tools",version:"1.0.0",tools:Et})}export{fo as a,re as b,z as c,Q as d,C as e,Le as f,Ce as g,X as h,ye as i,un as j,pn as k,ot as l,$n as m,ct as n,S as o,bt as p,Rt as q,De as r,Ae as s,_t as t,Mt as u,co as v,ir as w,Yo as x,zo as y};
@@ -1,4 +1,4 @@
1
- import{b as i,d as u}from"./chunk-W6JITSZF.js";u();function c(t){return{id:t.id,status:t.status,source:{type:t.source_type,channelId:t.source_channel_id??void 0,chatId:t.source_chat_id??void 0},title:t.title??void 0,createdAt:t.created_at,lastActiveAt:t.last_active_at,archivedAt:t.archived_at??void 0,messageCount:t.message_count}}function d(t){i().prepare(`
1
+ import{b as i,d as u}from"./chunk-PCSZW2PE.js";u();function c(t){return{id:t.id,status:t.status,source:{type:t.source_type,channelId:t.source_channel_id??void 0,chatId:t.source_chat_id??void 0},title:t.title??void 0,createdAt:t.created_at,lastActiveAt:t.last_active_at,archivedAt:t.archived_at??void 0,messageCount:t.message_count}}function d(t){i().prepare(`
2
2
  INSERT INTO chat_sessions (id, status, source_type, source_channel_id, source_chat_id,
3
3
  title, created_at, last_active_at, archived_at, message_count)
4
4
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
@@ -0,0 +1 @@
1
+ import{c as n}from"./chunk-3DAK2XWP.js";import{query as g}from"@anthropic-ai/claude-agent-sdk";import*as i from"fs/promises";import*as a from"path";import*as m from"os";var d=n("manager"),e=a.join(m.homedir(),".adam","llm-eval");async function v(u,t){await i.mkdir(e,{recursive:!0});let o={cwd:e,maxTurns:3,maxBudgetUsd:.05};t&&(o.systemPrompt=t);let c=g({prompt:u,options:o}),s="";for await(let f of c){let r=f;r.type==="result"&&typeof r.result=="string"&&(s=r.result)}return s}export{v as a};
@@ -1,10 +1,10 @@
1
- import{b as n,d as o}from"./chunk-W6JITSZF.js";o();function a(e){return{id:e.id,sessionId:e.session_id,role:e.role,content:e.content,source:{type:e.source_type},taskId:e.task_id??void 0,channelMessageId:e.channel_message_id??void 0,metadata:e.metadata?JSON.parse(e.metadata):void 0,createdAt:e.created_at}}function c(e){n().prepare(`
1
+ import{b as n,d as o}from"./chunk-PCSZW2PE.js";o();function a(e){return{id:e.id,sessionId:e.session_id,role:e.role,content:e.content,source:{type:e.source_type},taskId:e.task_id??void 0,channelMessageId:e.channel_message_id??void 0,metadata:e.metadata?JSON.parse(e.metadata):void 0,createdAt:e.created_at}}function c(e){n().prepare(`
2
2
  INSERT INTO chat_messages (id, session_id, role, content, source_type, task_id,
3
3
  channel_message_id, metadata, created_at)
4
4
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
5
- `).run(e.id,e.sessionId,e.role,e.content,e.source.type,e.taskId??null,e.channelMessageId??null,e.metadata?JSON.stringify(e.metadata):null,e.createdAt)}function g(e,s=100,t=0){return n().prepare("SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ? OFFSET ?").all(e,s,t).map(a)}function u(e){n().prepare("DELETE FROM chat_messages WHERE session_id = ?").run(e)}function E(e){let t=n().prepare("SELECT * FROM chat_messages WHERE task_id = ? LIMIT 1").get(e);return t?a(t):void 0}function p(e,s=50,t=0){return n().prepare(`
5
+ `).run(e.id,e.sessionId,e.role,e.content,e.source.type,e.taskId??null,e.channelMessageId??null,e.metadata?JSON.stringify(e.metadata):null,e.createdAt)}function g(e,s=100,t=0){return n().prepare("SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ? OFFSET ?").all(e,s,t).map(a)}function u(e,s){return n().prepare("SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at DESC LIMIT ?").all(e,s).reverse().map(a)}function E(e){n().prepare("DELETE FROM chat_messages WHERE session_id = ?").run(e)}function p(e){let t=n().prepare("SELECT * FROM chat_messages WHERE task_id = ? LIMIT 1").get(e);return t?a(t):void 0}function _(e,s=50,t=0){return n().prepare(`
6
6
  SELECT m.* FROM chat_messages m
7
7
  JOIN chat_sessions s ON m.session_id = s.id
8
8
  WHERE s.source_type = 'channel' AND s.source_channel_id = ?
9
9
  ORDER BY m.created_at DESC LIMIT ? OFFSET ?
10
- `).all(e,s,t).map(a)}export{c as a,g as b,u as c,E as d,p as e};
10
+ `).all(e,s,t).map(a)}export{c as a,g as b,u as c,E as d,p as e,_ as f};
@@ -0,0 +1,15 @@
1
+ import{a as D,e as M}from"./chunk-B6S2AEOD.js";import{d as N}from"./chunk-IXF3XBGX.js";import{b as C}from"./chunk-AXMXXUPO.js";import{b as x}from"./chunk-L7426WNY.js";import{f as m,h as S,i as L,l as E}from"./chunk-XNWZZYAV.js";import{b as h,d as W}from"./chunk-PCSZW2PE.js";import{c as g}from"./chunk-3DAK2XWP.js";W();function Y(e){return{id:e.id,roleId:e.role_id,taskId:e.task_id,scores:JSON.parse(e.score_json),emaScore:e.ema_score,createdAt:e.created_at}}function O(e){h().prepare(`
2
+ INSERT INTO role_scores (id, role_id, task_id, score_json, ema_score, created_at)
3
+ VALUES (?, ?, ?, ?, ?, ?)
4
+ `).run(e.id,e.roleId,e.taskId,JSON.stringify(e.scores),e.emaScore,e.createdAt)}function T(e,t=50){return h().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT ?").all(e,t).map(Y)}function B(e){return h().prepare("SELECT ema_score FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(e)?.ema_score}function F(e){let n=h().prepare(`
5
+ SELECT token_usage FROM tasks
6
+ WHERE role_id = ? AND status = 'completed' AND token_usage IS NOT NULL
7
+ ORDER BY completed_at DESC LIMIT 50
8
+ `).all(e);if(n.length===0)return 1e4;let r=n.map(o=>{let a=JSON.parse(o.token_usage);return(a.input??0)+(a.output??0)}).sort((o,a)=>o-a);return r[Math.floor(r.length/2)]}import{v4 as G}from"uuid";var q=g("admin"),w={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},H=.3;function V(e,t){let n=x(e),r=n?.status==="completed"?1:0,o=1,a=N(e);a?.deviationReport&&(o=a.deviationReport.overallAccuracy);let i=1,p=C(e,1e3),l=p.filter(u=>u.type==="tool_result"||u.type==="permission_denied").length,c=p.filter(u=>u.type==="permission_denied").length;l>0&&(i=1-c/l);let d=1;if(n?.tokenUsage){let u=n.tokenUsage.input+n.tokenUsage.output,f=t?F(t):1e4;u>f&&(d=Math.max(0,1-(u-f)/f))}let R=r*w.taskSuccess+o*w.planAccuracy+i*w.permissionCompliance+d*w.efficiency;return{taskSuccess:r,planAccuracy:o,permissionCompliance:i,efficiency:d,weighted:R}}function $(e,t){let n=V(t,e),r=B(e),o=r!==void 0?H*n.weighted+(1-H)*r:n.weighted;return O({id:G(),roleId:e,taskId:t,scores:n,emaScore:o,createdAt:Date.now()}),q.debug({roleId:e,taskId:t,scores:{...n,weighted:n.weighted.toFixed(3)},ema:o.toFixed(3)},"Task score recorded"),o}E();E();var z=g("admin");function A(e,t=7){let n=m(e),r=T(e,100),o=Date.now(),a=o-t*24*60*60*1e3,i=r.filter(s=>s.createdAt>=a),p=i.map(s=>s.emaScore),l=i.length>0?i.reduce((s,J)=>s+J.scores.weighted,0)/i.length:1,c=[],d=i.filter(s=>s.scores.taskSuccess<.5);d.length>0&&c.push({category:"task_failures",count:d.length,examples:d.slice(0,3).map(s=>s.taskId)});let R=i.filter(s=>s.scores.planAccuracy<.5);R.length>0&&c.push({category:"plan_deviations",count:R.length,examples:R.slice(0,3).map(s=>s.taskId)});let u=i.filter(s=>s.scores.permissionCompliance<.8);u.length>0&&c.push({category:"permission_violations",count:u.length,examples:u.slice(0,3).map(s=>s.taskId)});let f=i.filter(s=>s.scores.efficiency<.3);f.length>0&&c.push({category:"inefficiency",count:f.length,examples:f.slice(0,3).map(s=>s.taskId)});let b=[],k=[];return d.length>i.length*.3&&(b.push("High task failure rate"),k.push({action:"add_rule",detail:"Add rule: verify task feasibility before execution"})),u.length>0&&(b.push("Permission boundary violations"),k.push({action:"adjust_permission",detail:"Review and expand allowedPaths/allowedTools if tasks legitimately need wider access"})),R.length>i.length*.5&&(b.push("Frequent plan deviations"),k.push({action:"add_rule",detail:"Add rule: follow execution plan steps more closely, request plan revision if steps are unclear"})),z.info({roleId:e,taskCount:i.length,avgScore:l.toFixed(3),failureCategories:c.map(s=>s.category)},"Diagnostic report generated"),{roleId:e,agentName:n?.name??"Unknown",period:{start:a,end:o},taskCount:i.length,avgScore:l,scoreHistory:p,failureBehaviors:c,rootCauses:b,recommendations:k}}var v=g("admin"),P=.4,K=5;function U(e,t,n=P){if(t>=n)return;let r=m(e);if(!r||r.status==="retired"||r.status==="dead")return;v.warn({roleId:e,emaScore:t,threshold:n},"Agent EMA below threshold, retiring");let o=A(e),a=JSON.stringify(r.learnedRules),i=Q(r.learnedRules,o);S(e,{status:"retired",learnedRules:i});let p=[...o.failureBehaviors.map(c=>`${c.category}: ${c.count} occurrences`),...o.rootCauses.map(c=>`Root cause: ${c}`),...o.recommendations.map(c=>`Recommendation [${c.action}]: ${c.detail}`)].join(`
9
+ `),l=M(a,JSON.stringify(i));return D({timestamp:Date.now(),oldRules:a,newRules:JSON.stringify(i),diff:p?`--- Diagnostic Report ---
10
+ ${p}
11
+
12
+ --- Rules Diff ---
13
+ ${l}`:l,roleId:e,source:"monitor"}),v.info({roleId:e,oldRulesCount:r.learnedRules.length,newRulesCount:i.length,recommendations:o.recommendations.length},"Agent retired with targeted learnedRules modification"),o}function j(e){let t=m(e);return!t||t.status!=="retired"?!1:(S(e,{status:"probation"}),D({timestamp:Date.now(),oldRules:"status: retired",newRules:"status: probation",diff:`- status: retired
14
+ + status: probation`,roleId:e,source:"monitor"}),v.info({roleId:e},"Agent reinstated to probation"),!0)}function I(e,t,n=P,r=K){let o=m(e);return!o||o.status!=="probation"||T(e,r+1).length<r?!1:t>=n?(S(e,{status:"active"}),D({timestamp:Date.now(),oldRules:"status: probation",newRules:"status: idle",diff:`- status: probation
15
+ + status: idle (graduated, EMA: ${t.toFixed(3)})`,roleId:e,source:"monitor"}),v.info({roleId:e,emaScore:t},"Agent graduated from probation to active"),!0):!1}function Q(e,t){let n=[...e];for(let r of t.recommendations){let o=`[monitor:${r.action}] ${r.detail}`;n.includes(o)||n.push(o)}if(t.failureBehaviors.length>0){let o=`[monitor:diagnostic] Failure patterns detected: ${t.failureBehaviors.map(a=>`${a.category}(${a.count})`).join(", ")}. Review and adjust behavior accordingly.`;n.includes(o)||n.push(o)}return n}E();E();var _=g("admin"),X=.4,Z=1440*60*1e3,y=null;function Te(e,t,n=X){let r=m(t);if(!r||r.status==="retired"||r.status==="inactive"||r.status==="dead")return;let o=$(t,e);S(t,{performanceScore:o}),I(t,o,n)?_.info({roleId:t,emaScore:o},"Probation role graduated"):o<n&&U(t,o,n)&&j(t)}function we(){y||(y=setInterval(()=>{_.info("Running daily diagnostic reports");let e=L(void 0,1e3);for(let t of e)if(!(t.status==="retired"||t.status==="inactive"))try{A(t.id)}catch(n){_.error({roleId:t.id,error:n},"Daily diagnostic failed")}},Z),_.info("Monitor initialized with daily diagnostic timer"))}function Ae(){y&&(clearInterval(y),y=null,_.info("Monitor stopped"))}export{T as a,B as b,Te as c,we as d,Ae as e};
@@ -0,0 +1,5 @@
1
+ import{b as e,d as p}from"./chunk-PCSZW2PE.js";p();function i(t){return{id:t.id,taskId:t.task_id,index:t.index,type:t.type,content:t.content,toolName:t.tool_name??void 0,toolInput:t.tool_input?JSON.parse(t.tool_input):void 0,toolOutput:t.tool_output??void 0,truncated:t.truncated===1,timestamp:t.timestamp,tokenUsage:t.token_usage?JSON.parse(t.token_usage):void 0,planStepIndex:t.plan_step_index??void 0}}function a(t){e().prepare(`
2
+ INSERT INTO step_logs (id, task_id, "index", type, content, tool_name,
3
+ tool_input, tool_output, truncated, timestamp, token_usage, plan_step_index)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ `).run(t.id,t.taskId,t.index,t.type,t.content,t.toolName??null,t.toolInput?JSON.stringify(t.toolInput):null,t.toolOutput??null,t.truncated?1:0,t.timestamp,t.tokenUsage?JSON.stringify(t.tokenUsage):null,t.planStepIndex??null)}function r(t,n=100,o=0){return e().prepare('SELECT * FROM step_logs WHERE task_id = ? ORDER BY "index" ASC LIMIT ? OFFSET ?').all(t,n,o).map(i)}export{a,r as b};
@@ -1,4 +1,4 @@
1
- import{b as o,d as u}from"./chunk-W6JITSZF.js";u();import{v4 as a}from"uuid";function R(t){o().prepare(`
1
+ import{b as o,d as u}from"./chunk-PCSZW2PE.js";u();import{v4 as a}from"uuid";function R(t){o().prepare(`
2
2
  INSERT INTO evolution_audit (id, timestamp, old_rules, new_rules, diff, trigger_task_id, role_id, source)
3
3
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
4
4
  `).run(a(),t.timestamp,t.oldRules,t.newRules,t.diff,t.triggerTaskId??null,t.roleId??null,t.source??"reflection")}function f(t=100,e=0){return o().prepare(`
@@ -0,0 +1,49 @@
1
+ import{a as A,b as P}from"./chunk-WXN3PSVX.js";import{a as T,b as p}from"./chunk-L7426WNY.js";import{a as u}from"./chunk-L7JP7DUO.js";import{p as x}from"./chunk-HAWA62R2.js";import{a as I,b as l,d as y,f as C}from"./chunk-VF6GJGD6.js";import{d as h}from"./chunk-T25NLVMY.js";import{i as b,l as J}from"./chunk-XNWZZYAV.js";import{c as k}from"./chunk-3DAK2XWP.js";J();import{v4 as d}from"uuid";import{CronExpressionParser as D}from"cron-parser";import{v4 as M}from"uuid";var m=k("scheduler"),w=class{maxRetries=3;baseDelayMs=1e3;async execute(e,t){let s=h(),r=e.config?.fileAccess,i={timeout:e.config?.timeout??s.timeout,approvalRequired:s.approvalRequired,approvalTimeout:s.approvalTimeout,fileAccess:{allowedPaths:[...s.fileAccess.allowedPaths,...r?.allowedPaths??[]],deniedPaths:[...s.fileAccess.deniedPaths,...r?.deniedPaths??[]]},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},o={templateId:e.id,executionId:t,stepResults:new Map,config:i},a=this.sortSteps(e.steps);for(let c of a){try{await this.executeStep(c,o)}catch(_){m.error({stepId:c.id,error:_},"Workflow step failed");break}if(o.stepResults.get(c.id)?.status==="failed"){m.warn({stepId:c.id},"Workflow step failed, workflow aborted");break}}m.info({executionId:t,completedSteps:o.stepResults.size,totalSteps:a.length},"Workflow completed")}sortSteps(e){let t=new Set,s=[],r=new Map(e.map(o=>[o.id,o])),i=o=>{if(!t.has(o.id)){if(t.add(o.id),o.dependsOn)for(let a of o.dependsOn){let c=r.get(a);c&&i(c)}s.push(o)}};for(let o of e)i(o);return s}async executeStep(e,t){let s=this.resolveVariables(e.prompt,t.stepResults),r=M();T({id:r,status:"pending",prompt:s,config:t.config,createdAt:Date.now(),parentId:t.executionId,templateId:t.templateId}),m.debug({stepId:e.id,taskId:r},"Created workflow step as task"),u.emit({type:"task_created",taskId:r});let i=await this.executeWithRetry(r,e.id),o=p(r);t.stepResults.set(e.id,{stepId:e.id,taskId:r,status:i==="completed"?"completed":"failed",result:o?.result,error:o?.error})}resolveVariables(e,t){return e.replace(/\{\{([^}]+)\.result\}\}/g,(s,r)=>t.get(r)?.result??`[no result from ${r}]`)}async executeWithRetry(e,t){let s=0;for(;s<this.maxRetries;){if(s++,await this.waitForTaskCompletion(e)==="completed")return"completed";if(s<this.maxRetries){let i=this.baseDelayMs*Math.pow(2,s-1);m.info({stepId:t,attempt:s,maxRetries:this.maxRetries,delayMs:i},"Workflow step failed, retrying"),await this.sleep(i)}}return"failed"}waitForTaskCompletion(e,t=6e5){return new Promise(s=>{let r=Date.now(),i=()=>{if(Date.now()-r>t){s("failed");return}let o=p(e);if(!o){s("failed");return}if(o.status==="completed"){s("completed");return}if(o.status==="failed"||o.status==="cancelled"){s("failed");return}setTimeout(i,500)};i()})}sleep(e){return new Promise(t=>setTimeout(t,e))}};var n=k("scheduler"),v="ai-hourly-digest";function O(){if(l(v)){n.debug({templateId:v},"Built-in template already exists");return}let e={id:v,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",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
+
3
+ \u641C\u7D22\u6765\u6E90:
4
+ 1. Hacker News AI \u677F\u5757 (https://news.ycombinator.com/front?day=1)
5
+ 2. ArXiv cs.AI \u6700\u65B0\u8BBA\u6587 (https://arxiv.org/list/cs.AI/recent)
6
+ 3. Reddit r/MachineLearning \u70ED\u95E8\u5E16\u5B50
7
+
8
+ \u627E\u51FA\u4E00\u7BC7\u6700\u6709\u4EF7\u503C\u3001\u6700\u6709\u6280\u672F\u6DF1\u5EA6\u7684\u6587\u7AE0\u3002
9
+
10
+ \u8F93\u51FA\u683C\u5F0F:
11
+ - \u6807\u9898\uFF1A[\u6587\u7AE0\u6807\u9898]
12
+ - \u6765\u6E90\uFF1A[\u7F51\u7AD9/\u5E73\u53F0\u540D\u79F0]
13
+ - \u94FE\u63A5\uFF1A[\u5B8C\u6574 URL]
14
+ - \u6838\u5FC3\u4EF7\u503C\uFF1A[1-2 \u53E5\u8BDD\u8BF4\u660E\u4E3A\u4EC0\u4E48\u8FD9\u7BC7\u6587\u7AE0\u503C\u5F97\u770B]`},{id:"summarize_article",dependsOn:["search_ai_news"],prompt:`\u9605\u8BFB\u5E76\u603B\u7ED3\u8FD9\u7BC7\u6587\u7AE0\u3002
15
+
16
+ \u6587\u7AE0\u4FE1\u606F:
17
+ {{search_ai_news.result}}
18
+
19
+ \u8BF7:
20
+ 1. \u7528 WebFetch \u83B7\u53D6\u6587\u7AE0\u5B8C\u6574\u5185\u5BB9
21
+ 2. \u63D0\u53D6\u6838\u5FC3\u89C2\u70B9\u548C\u6280\u672F\u7EC6\u8282
22
+ 3. \u7528\u4E2D\u6587\u5199\u51FA 300-500 \u5B57\u7684\u603B\u7ED3
23
+
24
+ \u603B\u7ED3\u7ED3\u6784:
25
+ ## \u6838\u5FC3\u53D1\u73B0
26
+ [\u6587\u7AE0\u6700\u91CD\u8981\u7684\u53D1\u73B0/\u521B\u65B0\u70B9]
27
+
28
+ ## \u6280\u672F\u7EC6\u8282
29
+ [\u5173\u952E\u7684\u6280\u672F\u65B9\u6CD5/\u5B9E\u73B0\u7EC6\u8282]
30
+
31
+ ## \u5F71\u54CD/\u610F\u4E49
32
+ [\u8FD9\u9879\u5DE5\u4F5C\u7684\u610F\u4E49\u6216\u5BF9\u884C\u4E1A\u7684\u5F71\u54CD]
33
+
34
+ ## \u539F\u6587\u94FE\u63A5
35
+ [\u6587\u7AE0 URL]`},{id:"save_to_omnifocus",dependsOn:["summarize_article"],prompt:`\u5C06\u6587\u7AE0\u603B\u7ED3\u4FDD\u5B58\u5230 Omnifocus\u3002
36
+
37
+ \u603B\u7ED3\u5185\u5BB9:
38
+ {{summarize_article.result}}
39
+
40
+ \u63D0\u53D6\u6587\u7AE0\u6807\u9898\u548C\u5B8C\u6574\u603B\u7ED3\uFF0C\u7136\u540E\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u6DFB\u52A0\u5230 Omnifocus Inbox\uFF1A
41
+
42
+ osascript /Users/norvyn/Code/Projects/Adam/scripts/add-to-omnifocus.applescript "[\u6587\u7AE0\u6807\u9898] AI \u524D\u6CBF\u901F\u9012" "[\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9]"
43
+
44
+ \u6CE8\u610F\uFF1A
45
+ - \u5C06 [\u6587\u7AE0\u6807\u9898] \u66FF\u6362\u4E3A\u5B9E\u9645\u6807\u9898
46
+ - \u5C06 [\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9] \u66FF\u6362\u4E3A\u5B8C\u6574\u7684\u603B\u7ED3\u6587\u672C\uFF08\u5305\u542B\u6838\u5FC3\u53D1\u73B0\u3001\u6280\u672F\u7EC6\u8282\u3001\u5F71\u54CD/\u610F\u4E49\u548C\u539F\u6587\u94FE\u63A5\uFF09
47
+ - \u603B\u7ED3\u5185\u5BB9\u4F7F\u7528\u6362\u884C\u7B26\u5206\u9694\u5404\u90E8\u5206
48
+
49
+ \u5B8C\u6210\u540E\u8F93\u51FA\uFF1A\u5DF2\u4FDD\u5B58\u5230 Omnifocus\uFF1A[\u4EFB\u52A1\u6807\u9898]`}],config:{timeout:300,fileAccess:{allowedPaths:["~/.adam/","/Users/norvyn/Code/Projects/Adam/scripts/"],deniedPaths:[]}},tags:["ai","digest","hourly","automation"],createdAt:Date.now()};I(e),n.info({templateId:v,cron:"0 * * * *"},"Registered built-in AI Hourly Digest template")}var R=class{cronJobs=new Map;workflowExecutor=new w;started=!1;taskCompletionHandler=null;async start(){if(this.started)return;this.started=!0,O();let e=y(!0),t=0;for(let r of e)r.trigger.type==="cron"&&r.trigger.cron&&(this.scheduleCronJob(r),t++);let s=0;for(let r of e)r.trigger.type==="once"&&r.trigger.runAt&&(this.scheduleOnceJob(r.id),s++);this.taskCompletionHandler=r=>{r.newStatus==="completed"&&this.checkEventTriggers(r.taskId).catch(i=>{n.error({taskId:r.taskId,error:i},"Event trigger check failed")})},u.on("task_status_change",this.taskCompletionHandler),this.cronJobs.set("memory-cleanup",setInterval(()=>{this.runMemoryCleanup()},36e5)),n.info({cronCount:t,onceCount:s},"Bree engine started with cron jobs + memory cleanup")}runMemoryCleanup(){try{let e=b(void 0,1e3,0),t=0;for(let s of e)t+=x(s.id);t>0&&n.info({totalCleaned:t},"Memory cleanup completed")}catch(e){n.warn({error:e},"Memory cleanup failed")}}async stop(){for(let[,e]of this.cronJobs)clearTimeout(e),clearInterval(e);this.cronJobs.clear(),this.taskCompletionHandler&&(u.off("task_status_change",this.taskCompletionHandler),this.taskCompletionHandler=null),this.started=!1,n.info("Bree engine stopped")}scheduleCronJob(e){let t=`template-${e.id}`;this.cronJobs.has(t)&&(clearTimeout(this.cronJobs.get(t)),this.cronJobs.delete(t));let s;try{s=D.parse(e.trigger.cron)}catch{n.warn({templateId:e.id,cron:e.trigger.cron},"Invalid cron expression");return}let r=()=>{let f=s.next().getTime()-Date.now();return Math.max(f,1e3)},i=()=>{this.executeCronTrigger(e.id).catch(f=>{n.error({templateId:e.id,error:f},"Cron trigger failed")});let c=setTimeout(i,r());this.cronJobs.set(t,c)},o=r(),a=setTimeout(i,o);this.cronJobs.set(t,a),n.debug({jobName:t,nextRun:new Date(Date.now()+o).toISOString()},"Scheduled cron job")}async executeCronTrigger(e){let t=l(e);!t||!t.enabled||(n.info({templateName:t.name},"Cron triggered"),await this.executeWorkflow(t,d()))}async scheduleJob(e){let t=l(e);t&&t.trigger.type==="cron"&&t.trigger.cron&&this.scheduleCronJob(t)}async unscheduleJob(e){let t=`template-${e}`,s=this.cronJobs.get(t);s&&(clearTimeout(s),this.cronJobs.delete(t))}async runNow(e){let t=l(e);if(!t)throw new Error(`Template ${e} not found`);let s=d();return this.executeWorkflow(t,s).catch(r=>{n.error({templateId:e,error:r},"Workflow execution failed")}),s}async checkEventTriggers(e){let t=p(e);if(!t)return;let s=y(!0),r=s.filter(i=>i.trigger.type==="event"&&i.trigger.event==="task_complete");for(let i of r)n.debug({templateName:i.name},"Event trigger matched"),await this.executeWorkflow(i,d());if(t.templateId){let i=s.filter(o=>o.trigger.type!=="event"||!o.trigger.event?!1:o.trigger.event===`template_complete:${t.templateId}`);for(let o of i)n.info({templateName:o.name,sourceTemplateId:t.templateId},"Template complete trigger matched"),await this.executeWorkflow(o,d())}}async executeWorkflow(e,t){if(n.info({templateName:e.name,executionId:t},"Executing workflow"),e.goalIds&&e.goalIds.length>0){for(let s of e.goalIds){let r=P(s);if(!r){n.warn({goalId:s,templateId:e.id},"Goal reference not found, skipping");continue}let i=d();A({id:i,name:r.name,description:r.description,roleId:r.roleId,metricType:r.metricType,targetValue:r.targetValue,currentValue:0,deadline:r.deadline,budgetUsd:r.budgetUsd,status:"active",createdAt:Date.now(),sourceSessionId:e.sourceSessionId,deliverTo:e.deliverTo,reportTo:e.reportTo});let o=d();T({id:o,status:"pending",prompt:`Decompose and execute goal: ${r.name}. ${r.description??""}`,parentId:i,config:h(),createdAt:Date.now(),templateId:e.id}),u.emit({type:"task_created",taskId:o}),n.info({templateId:e.id,sourceGoalId:s,newGoalId:i,taskId:o},"Goal reference triggered, dispatched decomposition task")}return}await this.workflowExecutor.execute(e,t)}scheduleOnceJob(e){let t=l(e);if(!t||!t.enabled||t.trigger.type!=="once")return;let r=(t.trigger.runAt?new Date(t.trigger.runAt).getTime():0)-Date.now();if(r<=0){n.info({templateId:e,runAt:t.trigger.runAt},"Once-shot template past due, executing immediately"),this.executeOnceTrigger(e).catch(a=>{n.error({templateId:e,error:a},"Once trigger execution failed")});return}let i=`template-${e}`;this.cronJobs.has(i)&&clearTimeout(this.cronJobs.get(i));let o=setTimeout(()=>{this.cronJobs.delete(i),this.executeOnceTrigger(e).catch(a=>{n.error({templateId:e,error:a},"Once trigger execution failed")})},r);this.cronJobs.set(i,o),n.info({templateId:e,runAt:t.trigger.runAt,delayMs:r},"Scheduled once-shot job")}async executeOnceTrigger(e){let t=l(e);!t||!t.enabled||(n.info({templateName:t.name},"Once-shot triggered"),await this.executeWorkflow(t,d()),C(e),n.info({templateId:e},"Once-shot template auto-disabled after execution"))}},S=null;function Y(){return S}function Z(g){S=g}export{R as a,Y as b,Z as c};
@@ -1,4 +1,4 @@
1
- import{a as p,b as d}from"./chunk-TGQYM4TH.js";import{b as g,d as y}from"./chunk-W6JITSZF.js";import{c as t,f as h}from"./chunk-F2IS5LWD.js";import{c as u}from"./chunk-3DAK2XWP.js";y();import{dirname as O,join as v}from"path";import{fileURLToPath as R}from"url";var T=O(R(import.meta.url)),f=v(T,"..");var A=f,C=u("cli:register-ai-digest"),s="ai-hourly-digest";function b(){try{if(d(s)){console.log(`[INFO] AI Digest template already exists (${s})`);return}}catch{}let o={id:s,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",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{a as _,b as O}from"./chunk-VF6GJGD6.js";import{b as m,d as P}from"./chunk-PCSZW2PE.js";import{f as l,g as y}from"./chunk-SFUS33SO.js";import{c as h}from"./chunk-3DAK2XWP.js";P();import{dirname as v,join as x}from"path";import{fileURLToPath as D}from"url";var b=v(D(import.meta.url)),A=x(b,"..");var I=A,W=h("cli:register-ai-digest"),g="ai-hourly-digest";function L(){try{if(O(g)){console.log(`[INFO] AI Digest template already exists (${g})`);return}}catch{}let r={id:g,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",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)
@@ -39,11 +39,14 @@ import{a as p,b as d}from"./chunk-TGQYM4TH.js";import{b as g,d as y}from"./chunk
39
39
 
40
40
  \u63D0\u53D6\u6587\u7AE0\u6807\u9898\u548C\u5B8C\u6574\u603B\u7ED3\uFF0C\u7136\u540E\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u6DFB\u52A0\u5230 Omnifocus Inbox\uFF1A
41
41
 
42
- osascript ${A}/scripts/add-to-omnifocus.applescript "[\u6587\u7AE0\u6807\u9898] AI \u524D\u6CBF\u901F\u9012" "[\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9]"
42
+ osascript ${I}/scripts/add-to-omnifocus.applescript "[\u6587\u7AE0\u6807\u9898] AI \u524D\u6CBF\u901F\u9012" "[\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9]"
43
43
 
44
44
  \u6CE8\u610F\uFF1A
45
45
  - \u5C06 [\u6587\u7AE0\u6807\u9898] \u66FF\u6362\u4E3A\u5B9E\u9645\u6807\u9898
46
46
  - \u5C06 [\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9] \u66FF\u6362\u4E3A\u5B8C\u6574\u7684\u603B\u7ED3\u6587\u672C\uFF08\u5305\u542B\u6838\u5FC3\u53D1\u73B0\u3001\u6280\u672F\u7EC6\u8282\u3001\u5F71\u54CD/\u610F\u4E49\u548C\u539F\u6587\u94FE\u63A5\uFF09
47
47
  - \u603B\u7ED3\u5185\u5BB9\u4F7F\u7528\u6362\u884C\u7B26\u5206\u9694\u5404\u90E8\u5206
48
48
 
49
- \u5B8C\u6210\u540E\u8F93\u51FA\uFF1A\u5DF2\u4FDD\u5B58\u5230 Omnifocus\uFF1A[\u4EFB\u52A1\u6807\u9898]`}],config:{timeout:300,fileAccess:{allowedPaths:["~/.adam/",A],deniedPaths:[]}},tags:["ai","digest","hourly","automation"],createdAt:Date.now()};p(o),console.log(`[INFO] Registered AI Hourly Digest task template (${s})`),console.log("[INFO] Cron schedule: 0 * * * * (every hour at minute 0)")}import.meta.url===`file://${process.argv[1]}`&&(console.log("Initializing database..."),g(),console.log("Registering AI Digest template..."),b(),console.log("Done."),process.exit(0));h();import{existsSync as r,copyFileSync as x,mkdirSync as n,cpSync as D}from"fs";import{join as e}from"path";function w(){n(t,{recursive:!0}),n(e(t,"logs"),{recursive:!0}),n(e(t,".claude"),{recursive:!0})}function M(o=process.cwd()){w();let i=[],I=[{from:e(o,"data","adam.db"),to:e(t,"adam.db"),label:"database"},{from:e(o,"adam.config.yaml"),to:e(t,"adam.config.yaml"),label:"config"},{from:e(o,".env"),to:e(t,".env"),label:".env"}];for(let{from:m,to:l,label:_}of I)r(m)&&!r(l)&&(x(m,l),i.push(_));let a=e(o,".claude","plugins"),c=e(t,".claude","plugins");return r(a)&&!r(c)&&(D(a,c,{recursive:!0}),i.push("plugins")),i}export{f as a,b,w as c,M as d};
49
+ \u5B8C\u6210\u540E\u8F93\u51FA\uFF1A\u5DF2\u4FDD\u5B58\u5230 Omnifocus\uFF1A[\u4EFB\u52A1\u6807\u9898]`}],config:{timeout:300,fileAccess:{allowedPaths:["~/.adam/",I],deniedPaths:[]}},tags:["ai","digest","hourly","automation"],createdAt:Date.now()};_(r),console.log(`[INFO] Registered AI Hourly Digest task template (${g})`),console.log("[INFO] Cron schedule: 0 * * * * (every hour at minute 0)")}import.meta.url===`file://${process.argv[1]}`&&(console.log("Initializing database..."),m(),console.log("Registering AI Digest template..."),L(),console.log("Done."),process.exit(0));y();import{readFileSync as T,writeFileSync as N,existsSync as E}from"fs";var f={ANTHROPIC_API_KEY:"anthropic.apiKey",ANTHROPIC_BASE_URL:"anthropic.baseUrl",ANTHROPIC_MODEL:"anthropic.model",ANTHROPIC_DEFAULT_OPUS_MODEL:"anthropic.defaultOpusModel",ANTHROPIC_DEFAULT_SONNET_MODEL:"anthropic.defaultSonnetModel",ANTHROPIC_DEFAULT_HAIKU_MODEL:"anthropic.defaultHaikuModel",ANTHROPIC_SMALL_FAST_MODEL:"anthropic.smallFastModel"},G=Object.fromEntries(Object.entries(f).map(([r,o])=>[o,r]));function S(){if(!E(l))return null;let r=T(l,"utf-8"),o={};for(let s of r.split(`
50
+ `)){let i=s.trim();if(!i||i.startsWith("#"))continue;let c=i.startsWith("export ")?i.slice(7).trim():i,n=c.indexOf("=");if(n===-1)continue;let e=c.slice(0,n).trim();if(!(e in f))continue;let t=c.slice(n+1).trim();(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))&&(t=t.slice(1,-1)),!(t.includes("$")&&(t=t.replace(/\$\{(\w+)\}|\$(\w+)/g,(p,u,d)=>{let a=u??d;return o[a]??process.env[a]??""}),!t))&&(o[e]=t)}return o}function z(r){let o=S();if(!o)return[];let s=[];for(let[i,c]of Object.entries(f)){let n=r[c],e=o[i];if(e===void 0)continue;let t=n?String(n):"";t!==e&&s.push({configPath:c,envKey:i,dbValue:t,envValue:e})}return s}function q(r){if(!E(l))return 0;let s=T(l,"utf-8").split(`
51
+ `),i=0,c=new Set;for(let n=0;n<s.length;n++){let e=s[n].trim();if(!e||e.startsWith("#"))continue;let t=e.startsWith("export ")?e.slice(7).trim():e,p=t.indexOf("=");if(p===-1)continue;let u=t.slice(0,p).trim(),d=f[u];if(!d)continue;let a=r[d];if(a!=null&&String(a).length>0){let R=e.startsWith("export ")?"export ":"";s[n]=`${R}${u}=${String(a)}`,c.add(u),i++}}for(let[n,e]of Object.entries(f)){if(c.has(n))continue;let t=r[e];t&&String(t).length>0&&(s.push(`${n}=${String(t)}`),i++)}return i>0&&N(l,s.join(`
52
+ `)),i}export{A as a,G as b,S as c,z as d,q as e,L as f};
@@ -1 +1 @@
1
- import{c as e,f as t}from"./chunk-F2IS5LWD.js";t();var s={defaults:{timeout:600,maxTurns:100,maxBudgetUsd:5,effort:"high",model:"",settingSources:["user","project"],allowedTools:[],disallowedTools:[],fileAccess:{allowedPaths:["./","~/.claude"],deniedPaths:["~/.ssh","~/.aws","~/.config"]},approvalRequired:["rm -rf","git push","git reset","curl.*POST"],approvalTimeout:300,env:{},plugins:[],workspacePath:e,workspaceRetention:"immediate"},externalApis:[],server:{port:7100,host:"0.0.0.0",timezone:"system"},logging:{level:"info"},roles:{presets:[],evolution:{triggerEvery:5,reflectionThreshold:150,retirementThreshold:.4,probationTasks:5}},chat:{sessionTimeoutMinutes:30,maxSessionTurns:20,autoTitle:!0,archiveExtractMemory:!0},watchdog:{enabled:!0,intervalMinutes:5,rules:{managerHealthCheck:{enabled:!0,action:"notify",staleDurationMinutes:15},staleTasks:{enabled:!0,action:"notify",maxPendingMinutes:30},staleRunningTasks:{enabled:!0,action:"notify",maxRunningMinutes:15},dbMaintenance:{enabled:!0,action:"ignore",walCheckpointThresholdMB:100}}},execution:{maxConcurrent:5,maxBudgetPerTaskUsd:5,pollIntervalMs:3e4}};export{s as a};
1
+ import{c as e,g as t}from"./chunk-SFUS33SO.js";t();var o={defaults:{timeout:600,maxTurns:100,maxBudgetUsd:5,effort:"high",model:"",settingSources:["user","project"],allowedTools:[],disallowedTools:[],fileAccess:{allowedPaths:["./","~/.claude"],deniedPaths:["~/.ssh","~/.aws","~/.config"]},approvalRequired:["rm -rf","git push","git reset","curl.*POST"],approvalTimeout:300,env:{},plugins:[],workspacePath:e,workspaceRetention:"immediate"},externalApis:[],server:{port:7100,host:"0.0.0.0",timezone:"system"},logging:{level:"info"},roles:{presets:[],evolution:{triggerEvery:5,reflectionThreshold:150,retirementThreshold:.4,probationTasks:5}},chat:{sessionTimeoutMinutes:30,maxSessionTurns:20,autoTitle:!0,archiveExtractMemory:!0},watchdog:{enabled:!0,intervalMinutes:5,rules:{managerHealthCheck:{enabled:!0,action:"notify",staleDurationMinutes:15},staleTasks:{enabled:!0,action:"notify",maxPendingMinutes:30},staleRunningTasks:{enabled:!0,action:"notify",maxRunningMinutes:15},dbMaintenance:{enabled:!0,action:"ignore",walCheckpointThresholdMB:100}}},execution:{maxConcurrent:5,maxBudgetPerTaskUsd:5,pollIntervalMs:3e4},anthropic:{apiKey:"",baseUrl:"",model:"",defaultOpusModel:"",defaultSonnetModel:"",defaultHaikuModel:"",smallFastModel:""}};export{o as a};
@@ -0,0 +1,5 @@
1
+ import{b as s,d as o}from"./chunk-PCSZW2PE.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
+ INSERT INTO delivery_log (id, rule_id, task_id, status, target, content,
3
+ attempts, error, created_at, delivered_at, expires_at, source, message_type)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ `).run(e.id,e.ruleId??null,e.taskId??null,e.status,JSON.stringify(e.target),e.content,e.attempts,e.error??null,e.createdAt,e.deliveredAt??null,e.expiresAt,e.source??null,e.messageType??null)}function g(e,t,r){s().prepare("UPDATE delivery_log SET status = ?, error = ?, attempts = attempts + 1 WHERE id = ?").run(t,r??null,e)}function E(e){s().prepare("UPDATE delivery_log SET status = 'delivered', delivered_at = ?, attempts = attempts + 1 WHERE id = ?").run(Date.now(),e)}function D(e,t=100){let r=s(),a=Date.now(),n=e?"SELECT * FROM delivery_log WHERE status = 'pending' AND expires_at > ? AND source = ? ORDER BY created_at ASC LIMIT ?":"SELECT * FROM delivery_log WHERE status = 'pending' AND expires_at > ? ORDER BY created_at ASC LIMIT ?";return(e?r.prepare(n).all(a,e,t):r.prepare(n).all(a,t)).map(i)}function c(e,t=100){let r=s(),a=Date.now(),n=e?"SELECT * FROM delivery_log WHERE status = 'failed' AND expires_at > ? AND attempts < 3 AND source = ? ORDER BY created_at ASC LIMIT ?":"SELECT * FROM delivery_log WHERE status = 'failed' AND expires_at > ? AND attempts < 3 ORDER BY created_at ASC LIMIT ?";return(e?r.prepare(n).all(a,e,t):r.prepare(n).all(a,t)).map(i)}function v(){let e=s(),t=Date.now();return e.prepare("DELETE FROM delivery_log WHERE expires_at < ? AND status IN ('pending', 'failed')").run(t).changes}function _(e,t=50){return s().prepare("SELECT * FROM delivery_log WHERE task_id = ? ORDER BY created_at DESC LIMIT ?").all(e,t).map(i)}function y(e,t=50){return s().prepare("SELECT * FROM delivery_log WHERE rule_id = ? ORDER BY created_at DESC LIMIT ?").all(e,t).map(i)}export{u as a,p as b,g as c,E as d,D as e,c as f,v as g,_ as h,y as i};
@@ -0,0 +1 @@
1
+ import{a as h,b as u,c,d as m,e as v,f as x}from"./chunk-5ASEAZCR.js";import{b as S,d as y}from"./chunk-742NWPTQ.js";import{a as l}from"./chunk-WZOMGJSY.js";import{a as i}from"./chunk-L7JP7DUO.js";import{a as C}from"./chunk-HAWA62R2.js";import{e as p}from"./chunk-T25NLVMY.js";import{v4 as D}from"uuid";import{v4 as I}from"uuid";function _(e){if(e.length<20)return null;let t=e.trim();return t.length>300?{content:`User request: ${t.slice(0,280)}...`,importance:3,type:"thought"}:{content:`User request: ${t}`,importance:3,type:"thought"}}function b(e){if(e.length<20)return null;let t=e.trim();return t.length>400?{content:`Assistant response: ${t.slice(0,370)}...`,importance:2,type:"event"}:{content:`Assistant response: ${t}`,importance:2,type:"event"}}function N(e){let t=S(e,200,0),s=[];for(let o of t){let r=o.role==="user"?_(o.content):b(o.content);r&&s.push(r)}return{facts:s}}function $(e){let t=e.toLowerCase().replace(/[^\w\s]/g," ").split(/\s+/).filter(s=>s.length>2);return[...new Set(t)].slice(0,20)}async function A(e,t){let{facts:s}=N(e),o=0;for(let r of s){let f=r.content.slice(0,500),g;try{g=await l(f)}catch{}let M=$(f),T={id:I(),roleId:t,type:r.type,content:f,embedding:g,keywords:M,importance:r.importance,sourceType:"session_archive",createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"episodic"};C(T),o++}return o}var n=new Map,a;function w(e){return`${e.type}:${e.channelId??""}:${e.chatId??""}`}function F(){n.clear();let e=m("active",1e3);for(let t of e)n.set(t.id,t)}function Q(e,t){let s=Date.now(),o={id:D(),status:"active",source:e,createdAt:s,lastActiveAt:s,messageCount:0};return h(o),n.set(o.id,o),i.emit({type:"session_created",session:o}),o}function V(e){for(let s of n.values())if(w(s.source)===w(e))return s;let t=v(e);return t&&n.set(t.id,t),t}function B(e){let t=n.get(e);return t||u(e)}function E(e){let t=Date.now();c(e,{status:"archived",archivedAt:t}),p().archiveExtractMemory&&u(e)&&A(e,"role-chat-manager").catch(()=>{}),n.delete(e),i.emit({type:"session_archived",sessionId:e})}function W(e){c(e,{status:"active",archivedAt:void 0});let t=u(e);return t&&(n.set(t.id,t),i.emit({type:"session_restored",session:t})),t}function X(e){y(e),x(e),n.delete(e),i.emit({type:"session_deleted",sessionId:e})}function Y(e){let t=Date.now();c(e,{lastActiveAt:t});let s=n.get(e);s&&(s.lastActiveAt=t)}function Z(e){let t=B(e);if(t){let s=t.messageCount+1;c(e,{messageCount:s});let o=n.get(e);o&&(o.messageCount=s)}}function ee(e){return m(e)}function P(){let t=p().sessionTimeoutMinutes*60*1e3,s=Date.now();for(let o of n.values())if(s-o.lastActiveAt>t)try{E(o.id)}catch{}}function R(e=6e4){d(),a=setInterval(P,e)}function d(){a&&(clearInterval(a),a=void 0)}function te(){return a}function se(){F(),R()}function oe(){d(),n.clear()}function ne(){d(),n.clear()}export{F as a,Q as b,V as c,B as d,E as e,W as f,X as g,Y as h,Z as i,ee as j,R as k,d as l,te as m,se as n,oe as o,ne as p};
@@ -0,0 +1 @@
1
+ var l=["defaults.model","defaults.effort","defaults.maxTurns","defaults.maxBudgetUsd","defaults.timeout","logging.level","roles.evolution.triggerEvery","roles.evolution.reflectionThreshold","chat.sessionTimeoutMinutes","chat.maxSessionTurns","chat.autoTitle","chat.archiveExtractMemory","server.timezone","anthropic.apiKey","anthropic.baseUrl","anthropic.model","anthropic.defaultOpusModel","anthropic.defaultSonnetModel","anthropic.defaultHaikuModel","anthropic.smallFastModel"],f=["server.port","server.host","server.apiKey"],d={"anthropic.apiKey":"ANTHROPIC_API_KEY","anthropic.baseUrl":"ANTHROPIC_BASE_URL","anthropic.model":"ANTHROPIC_MODEL","anthropic.defaultOpusModel":"ANTHROPIC_DEFAULT_OPUS_MODEL","anthropic.defaultSonnetModel":"ANTHROPIC_DEFAULT_SONNET_MODEL","anthropic.defaultHaikuModel":"ANTHROPIC_DEFAULT_HAIKU_MODEL","anthropic.smallFastModel":"ANTHROPIC_SMALL_FAST_MODEL"},i=null;function T(t){i=JSON.parse(JSON.stringify(t))}function u(){if(!i)throw new Error("Runtime config not initialized. Call initRuntimeConfig first.");return i}function k(t){let o=u(),s=t();for(let[e,n]of Object.entries(s))c(o,e,n)}function v(){let t=u(),o={};for(let[s,e]of Object.entries(d)){let n=g(t,s);n&&typeof n=="string"&&n.length>0?o[e]=n:process.env[e]&&(o[e]=process.env[e])}return o}function A(t,o){let s=u(),e=[],n=[];for(let[r,a]of Object.entries(t)){if(!p(r)){h(r)?n.push(`"${r}" requires restart. Cannot modify at runtime.`):n.push(`"${r}" is not a recognized config path.`);continue}c(s,r,a)&&(e.push(r),o?.(r,a))}return{success:n.length===0,updated:e,errors:n}}function c(t,o,s){let e=o.split("."),n=t;for(let r=0;r<e.length-1;r++)if(n&&typeof n=="object")n=n[e[r]];else return!1;return n&&typeof n=="object"?(n[e[e.length-1]]=s,!0):!1}function g(t,o){let s=o.split("."),e=t;for(let n of s)if(e&&typeof e=="object")e=e[n];else return;return e}function p(t){return l.includes(t)}function h(t){return f.includes(t)}export{l as a,f as b,T as c,u as d,k as e,v as f,A as g,g as h,p as i,h as j};
@@ -0,0 +1,26 @@
1
+ import{f,l as h}from"./chunk-XNWZZYAV.js";import{b as u,d as E}from"./chunk-PCSZW2PE.js";E();h();function l(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function b(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function v(e){u().prepare(`
2
+ INSERT INTO memories (id, role_id, type, content, embedding, keywords,
3
+ importance, source_type, source_task_id, evidence,
4
+ created_at, last_accessed, retrieved_count, tier, superseded_by)
5
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
6
+ `).run(e.id,e.roleId,e.type,e.content,e.embedding?b(e.embedding):null,JSON.stringify(e.keywords),e.importance,e.sourceType,e.sourceTaskId??null,e.evidence?JSON.stringify(e.evidence):null,e.createdAt,e.lastAccessed,e.retrievedCount,e.tier,e.supersededBy??null)}function C(e){let s=u().prepare("SELECT * FROM memories WHERE id = ?").get(e);return s?l(s):void 0}function W(e,r){let s=u(),t=[],n=[];return r.content!==void 0&&(t.push("content = ?"),n.push(r.content)),r.embedding!==void 0&&(t.push("embedding = ?"),n.push(b(r.embedding))),r.keywords!==void 0&&(t.push("keywords = ?"),n.push(JSON.stringify(r.keywords))),r.importance!==void 0&&(t.push("importance = ?"),n.push(r.importance)),r.type!==void 0&&(t.push("type = ?"),n.push(r.type)),t.length===0?!0:(t.push("last_accessed = ?"),n.push(Date.now()),n.push(e),s.prepare(`UPDATE memories SET ${t.join(", ")} WHERE id = ?`).run(...n).changes>0)}function L(e){u().prepare("UPDATE memories SET retrieved_count = retrieved_count + 1, last_accessed = ? WHERE id = ?").run(Date.now(),e)}function F(e,r){let t=u().prepare("UPDATE memories SET superseded_by = ? WHERE id = ?"),n=0;for(let c of e){let i=t.run(r,c);n+=i.changes}return n}function w(e){return u().prepare("SELECT COUNT(*) as count FROM memories WHERE role_id = ?").get(e).count}function x(e,r=100,s=0){return u().prepare("SELECT * FROM memories WHERE role_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?").all(e,r,s).map(l)}function M(e,r){let s=0,t=0,n=0;for(let i=0;i<e.length;i++)s+=e[i]*r[i],t+=e[i]*e[i],n+=r[i]*r[i];let c=Math.sqrt(t)*Math.sqrt(n);return c===0?0:s/c}function R(e,r,s,t){let n=u(),c=["embedding IS NOT NULL"],i=[];e&&(c.push("role_id = ?"),i.push(e)),t?.excludeSuperseded&&c.push("superseded_by IS NULL"),t?.tiers&&t.tiers.length>0&&(c.push(`tier IN (${t.tiers.map(()=>"?").join(",")})`),i.push(...t.tiers));let a=`SELECT * FROM memories WHERE ${c.join(" AND ")}
7
+ ORDER BY importance DESC, created_at DESC
8
+ LIMIT ?`;return i.push(Math.min(s*10,1e3)),n.prepare(a).all(...i).map(o=>{let d=new Float32Array(o.embedding.buffer,o.embedding.byteOffset,o.embedding.byteLength/4);return{row:o,score:M(r,d)}}).sort((o,d)=>d.score-o.score).slice(0,s).map(o=>l(o.row))}function _(e){let r=e.split(/\s+/).filter(Boolean);return r.length===0?'""':r.map(t=>`"${t.replace(/"/g,'""')}"`).join(" OR ")}function S(e,r,s){let t=u(),n=_(r);return e?t.prepare(`
9
+ SELECT m.* FROM memories m
10
+ JOIN memories_fts fts ON m.rowid = fts.rowid
11
+ WHERE memories_fts MATCH ? AND m.role_id = ?
12
+ ORDER BY rank
13
+ LIMIT ?
14
+ `).all(n,e,s).map(l):t.prepare(`
15
+ SELECT m.* FROM memories m
16
+ JOIN memories_fts fts ON m.rowid = fts.rowid
17
+ WHERE memories_fts MATCH ?
18
+ ORDER BY rank
19
+ LIMIT ?
20
+ `).all(n,s).map(l)}function H(e){u().prepare("DELETE FROM memories WHERE id = ?").run(e)}var y={recency:.5,relevance:3,importance:2},N=.9;function T(e){let s=(Date.now()-e)/(1e3*60*60*24);return Math.min(1,Math.max(0,Math.pow(N,s)))}function k(e,r,s,t=y){let n=T(e),c=Math.min(1,Math.max(0,r)),i=s/5;return t.recency*n+t.relevance*c+t.importance*i}function I(e){return f(e)?.preferences?.scoringWeights??y}var O={vectorWeight:.6,bm25Weight:.4};function B(e,r=1e4,s=90){let t=u(),n=0,c=Date.now()-10080*60*1e3,i=t.prepare("DELETE FROM memories WHERE role_id = ? AND superseded_by IS NOT NULL AND created_at < ?").run(e,c);n+=i.changes;let a=Date.now()-720*60*60*1e3,m=t.prepare("DELETE FROM memories WHERE role_id = ? AND retrieved_count = 0 AND importance <= 2 AND created_at < ?").run(e,a);n+=m.changes;let g=Date.now()-s*24*60*60*1e3,o=t.prepare("DELETE FROM memories WHERE role_id = ? AND importance < 4 AND created_at < ?").run(e,g);n+=o.changes;let d=t.prepare("SELECT COUNT(*) as cnt FROM memories WHERE role_id = ?").get(e);if(d.cnt>r){let p=d.cnt-r;t.prepare(`
21
+ DELETE FROM memories WHERE id IN (
22
+ SELECT id FROM memories WHERE role_id = ? AND tier != 'semantic'
23
+ ORDER BY importance ASC, retrieved_count ASC, created_at ASC
24
+ LIMIT ?
25
+ )
26
+ `).run(e,p),n+=p}return n}function U(e,r,s,t,n=O,c){let i=R(e,r,t*2,c),a=S(e,s,t*2),m=new Map;for(let o=0;o<i.length;o++){let d=i[o];m.set(d.id,{node:d,vectorScore:i.length>1?1-o/(i.length-1):1,bm25Score:0})}for(let o=0;o<a.length;o++){let d=m.get(a[o].id),p=a.length>1?1-o/(a.length-1):1;d?d.bm25Score=p:m.set(a[o].id,{node:a[o],vectorScore:0,bm25Score:p})}return Array.from(m.values()).map(({node:o,vectorScore:d,bm25Score:p})=>({node:o,score:n.vectorWeight*d+n.bm25Weight*p})).sort((o,d)=>d.score-o.score).slice(0,t).map(o=>o.node)}export{v as a,C as b,W as c,L as d,F as e,w as f,x as g,R as h,S as i,H as j,y as k,T as l,k as m,I as n,O as o,B as p,U as q};
@@ -0,0 +1,5 @@
1
+ import{b as t,d}from"./chunk-PCSZW2PE.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
2
+ INSERT INTO task_plans (id, task_id, plan_json, status, approval_type,
3
+ deviation_report_json, learned_rules_json, created_at, approved_at, reviewed_at)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ `).run(e.id,e.taskId,JSON.stringify(e.plan),e.status,e.approvalType??null,e.deviationReport?JSON.stringify(e.deviationReport):null,e.learnedRules?JSON.stringify(e.learnedRules):null,e.createdAt,e.approvedAt??null,e.reviewedAt??null)}function l(e){let n=t().prepare("SELECT * FROM task_plans WHERE id = ?").get(e);return n?s(n):void 0}function u(e){return t().prepare("SELECT * FROM task_plans WHERE task_id = ? ORDER BY created_at DESC").all(e).map(s)}function _(e){let n=t().prepare("SELECT * FROM task_plans WHERE task_id = ? ORDER BY created_at DESC LIMIT 1").get(e);return n?s(n):void 0}function v(e,a,n){let r=t(),i=Date.now();a==="approved"?r.prepare("UPDATE task_plans SET status = ?, approval_type = ?, approved_at = ? WHERE id = ?").run(a,n??null,i,e):r.prepare("UPDATE task_plans SET status = ? WHERE id = ?").run(a,e)}function T(e,a){t().prepare("UPDATE task_plans SET deviation_report_json = ?, reviewed_at = ? WHERE id = ?").run(JSON.stringify(a),Date.now(),e)}function E(e,a){t().prepare("UPDATE task_plans SET learned_rules_json = ? WHERE id = ?").run(JSON.stringify(a),e)}export{p as a,l as b,u as c,_ as d,v as e,T as f,E as g};
@@ -0,0 +1,2 @@
1
+ import{b as r,d as i}from"./chunk-PCSZW2PE.js";i();function l(e){let n=r().prepare("SELECT value FROM config WHERE key = ?").get(e);if(n)try{return JSON.parse(n.value)}catch{return n.value}}function g(e,t){let n=r(),o=JSON.stringify(t),u=Date.now();n.prepare(`INSERT INTO config (key, value, updated_at) VALUES (?, ?, ?)
2
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(e,o,u)}function p(){let t=r().prepare("SELECT key, value FROM config").all(),n={};for(let o of t)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return n}function E(e){let t=r(),n=t.prepare("INSERT OR IGNORE INTO config (key, value, updated_at) VALUES (?, ?, ?)"),o=Date.now(),u=0;return t.transaction(()=>{for(let[c,a]of Object.entries(e)){if(a==null||a==="")continue;n.run(c,JSON.stringify(a),o).changes>0&&u++}})(),u}function k(){return r().prepare("SELECT COUNT(*) as count FROM config").get().count===0}function b(e){return r().prepare("DELETE FROM config WHERE key = ?").run(e).changes>0}export{l as a,g as b,p as c,E as d,k as e,b as f};
@@ -0,0 +1,5 @@
1
+ import{b as a,d as u}from"./chunk-PCSZW2PE.js";u();function l(e){return{id:e.id,eventType:e.event_type,matchCriteria:JSON.parse(e.match_criteria),target:JSON.parse(e.target),formatTemplate:e.format_template??void 0,maxPerMinute:e.max_per_minute,skipOriginChannel:e.skip_origin_channel===1,enabled:e.enabled===1,createdAt:e.created_at,createdBy:e.created_by??void 0}}function d(e){a().prepare(`
2
+ INSERT INTO delivery_rules (id, event_type, match_criteria, target, format_template,
3
+ max_per_minute, skip_origin_channel, enabled, created_at, created_by)
4
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
5
+ `).run(e.id,e.eventType,JSON.stringify(e.matchCriteria),JSON.stringify(e.target),e.formatTemplate??null,e.maxPerMinute,e.skipOriginChannel?1:0,e.enabled?1:0,e.createdAt,e.createdBy??null)}function f(e){let n=a().prepare("SELECT * FROM delivery_rules WHERE id = ?").get(e);return n?l(n):void 0}function s(e){let t=a(),n="SELECT * FROM delivery_rules",i=[];return e!==void 0&&(n+=" WHERE enabled = ?",i.push(e?1:0)),n+=" ORDER BY created_at DESC",t.prepare(n).all(...i).map(l)}function m(e,t){let n=a(),i=[],r=[];t.eventType!==void 0&&(i.push("event_type = ?"),r.push(t.eventType)),t.matchCriteria!==void 0&&(i.push("match_criteria = ?"),r.push(JSON.stringify(t.matchCriteria))),t.target!==void 0&&(i.push("target = ?"),r.push(JSON.stringify(t.target))),t.formatTemplate!==void 0&&(i.push("format_template = ?"),r.push(t.formatTemplate)),t.maxPerMinute!==void 0&&(i.push("max_per_minute = ?"),r.push(t.maxPerMinute)),t.skipOriginChannel!==void 0&&(i.push("skip_origin_channel = ?"),r.push(t.skipOriginChannel?1:0)),t.enabled!==void 0&&(i.push("enabled = ?"),r.push(t.enabled?1:0)),i.length!==0&&(r.push(e),n.prepare(`UPDATE delivery_rules SET ${i.join(", ")} WHERE id = ?`).run(...r))}function y(e){let t=a();t.prepare("DELETE FROM delivery_log WHERE rule_id = ?").run(e),t.prepare("DELETE FROM delivery_rules WHERE id = ?").run(e)}function o(e,t){return s(!0).filter(i=>{if(i.eventType!=="*"&&i.eventType!==e)return!1;let r=i.matchCriteria;if(r.templateId&&r.templateId!==t.templateId||r.roleId&&r.roleId!==t.roleId||r.taskStatus&&r.taskStatus!==t.taskStatus)return!1;if(r.promptPattern)try{if(!new RegExp(r.promptPattern,"i").test(t.prompt??""))return!1}catch{return!1}return!0})}export{d as a,f as b,s as c,m as d,y as e,o as f};
@@ -0,0 +1,7 @@
1
+ import{b as u,d as a}from"./chunk-PCSZW2PE.js";a();function d(e){return{id:e.id,parentId:e.parent_id??void 0,status:e.status,prompt:e.prompt,originalPrompt:e.original_prompt??void 0,config:JSON.parse(e.config),result:e.result??void 0,error:e.error??void 0,sdkSessionId:e.sdk_session_id??void 0,templateId:e.template_id??void 0,roleId:e.role_id??void 0,sourceSessionId:e.source_session_id??void 0,deliverTo:e.deliver_to?JSON.parse(e.deliver_to):void 0,reportTo:e.report_to?JSON.parse(e.report_to):void 0,createdAt:e.created_at,startedAt:e.started_at??void 0,completedAt:e.completed_at??void 0,costUsd:e.cost_usd??void 0,tokenUsage:e.token_usage?JSON.parse(e.token_usage):void 0,numTurns:e.num_turns??void 0,totalDurationMs:e.total_duration_ms??void 0}}function c(e){u().prepare(`
2
+ INSERT INTO tasks (id, parent_id, status, prompt, original_prompt, config, result, error,
3
+ sdk_session_id, template_id, role_id, source_session_id, notify_targets, deliver_to, report_to,
4
+ created_at, started_at, completed_at,
5
+ cost_usd, token_usage, num_turns, total_duration_ms)
6
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
7
+ `).run(e.id,e.parentId??null,e.status,e.prompt,e.originalPrompt??null,JSON.stringify(e.config),e.result??null,e.error??null,e.sdkSessionId??null,e.templateId??null,e.roleId??null,e.sourceSessionId??null,null,e.deliverTo?JSON.stringify(e.deliverTo):null,e.reportTo?JSON.stringify(e.reportTo):null,e.createdAt,e.startedAt??null,e.completedAt??null,e.costUsd??null,e.tokenUsage?JSON.stringify(e.tokenUsage):null,e.numTurns??null,e.totalDurationMs??null)}function g(e){let r=u().prepare("SELECT * FROM tasks WHERE id = ?").get(e);return r?d(r):void 0}function f(e,t){let r=u(),n=[],s=[],l={parentId:"parent_id",status:"status",prompt:"prompt",result:"result",error:"error",sdkSessionId:"sdk_session_id",templateId:"template_id",roleId:"role_id",sourceSessionId:"source_session_id",originalPrompt:"original_prompt",startedAt:"started_at",completedAt:"completed_at",costUsd:"cost_usd",numTurns:"num_turns",totalDurationMs:"total_duration_ms"};for(let[i,o]of Object.entries(l))i in t&&(n.push(`${o} = ?`),s.push(t[i]??null));"config"in t&&(n.push("config = ?"),s.push(JSON.stringify(t.config))),"tokenUsage"in t&&(n.push("token_usage = ?"),s.push(t.tokenUsage?JSON.stringify(t.tokenUsage):null)),"deliverTo"in t&&(n.push("deliver_to = ?"),s.push(t.deliverTo?JSON.stringify(t.deliverTo):null)),"reportTo"in t&&(n.push("report_to = ?"),s.push(t.reportTo?JSON.stringify(t.reportTo):null)),n.length!==0&&(s.push(e),r.prepare(`UPDATE tasks SET ${n.join(", ")} WHERE id = ?`).run(...s))}function m(e,t=100,r=0,n){let s=u(),l="SELECT * FROM tasks",i=[],o=[];return e&&(i.push("status = ?"),o.push(e)),n&&(i.push("role_id = ?"),o.push(n)),i.length>0&&(l+=" WHERE "+i.join(" AND ")),l+=" ORDER BY created_at DESC LIMIT ? OFFSET ?",o.push(t,r),s.prepare(l).all(...o).map(d)}function T(e){return u().prepare("SELECT * FROM tasks WHERE parent_id = ? ORDER BY created_at ASC").all(e).map(d)}export{c as a,g as b,f as c,m as d,T as e};
@@ -1 +1 @@
1
- import{EventEmitter as n}from"events";var a=class{emitter=new n;on(t,e){this.emitter.on(t,e)}off(t,e){this.emitter.removeListener(t,e)}emit(t){this.emitter.emit(t.type,t)}},d=new a;export{d as a};
1
+ import{EventEmitter as n}from"events";var a=class{emitter=new n;on(t,e){this.emitter.on(t,e)}off(t,e){this.emitter.removeListener(t,e)}emit(t){this.emitter.emit(t.type,t)}},r=new a;export{r as a};
@@ -0,0 +1 @@
1
+ import{b as E}from"./chunk-UOTDT2KY.js";import{f as x}from"./chunk-KICPHTI2.js";import{b as m}from"./chunk-5ASEAZCR.js";import{e as f}from"./chunk-742NWPTQ.js";import{b as S}from"./chunk-PQ7KPALO.js";import{a as D,b as w,c as o,e as k,f as T,g as P}from"./chunk-FDWW245P.js";import{b as g}from"./chunk-L7426WNY.js";import{a as h}from"./chunk-L7JP7DUO.js";import{c as I}from"./chunk-3DAK2XWP.js";import{v4 as b}from"uuid";var s=I("admin"),y=new Map,u=null,p=null,c=null,v=class{constructor(){h.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),h.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),s.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=g(e),i=this.getSourceChannelForTask(e);if(i){let d=JSON.stringify(r).slice(0,500),{sendApprovalToChannel:R}=await import("./approval-handler-D3J6NCMM.js");await R(i.channelId,i.chatId,n,e,d)}let a=`Plan approval requested for task ${e}: ${JSON.stringify(r).slice(0,500)}`;await this.matchAndDeliver("plan_approval_request",{templateId:t?.templateId,roleId:t?.roleId,prompt:t?.prompt,taskStatus:"pending"},a,e)}getSourceChannelForTask(e){try{let n=f(e);if(!n)return null;let r=m(n.sessionId);return!r||r.source.type!=="channel"||!r.source.channelId||!r.source.chatId?null:{channelId:r.source.channelId,chatId:r.source.chatId}}catch{return null}}async handleTaskStatusChange(e,n){let r=g(e);if(!r)return;let t={templateId:r.templateId,roleId:r.roleId,prompt:r.prompt,taskStatus:n},i=n==="completed"?"task_complete":"task_error",a=r.result??r.error??"";await this.matchAndDeliver(i,t,a,e)}async matchAndDeliver(e,n,r,t){let i=x(e,n);if(i.length!==0){s.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){s.warn({ruleId:a.id,maxPerMinute:a.maxPerMinute},"Delivery rate limit exceeded, skipping");continue}if(a.skipOriginChannel&&a.target.type==="channel"&&t&&this.isOriginChannel(t,a.target))continue;let d={id:b(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+D,source:"rule"};w(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=E();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=S(e.target.channelId)?.config?.userId);let i=await r.send({taskId:e.taskId,channelId:e.target.channelId,chatId:t,content:e.content,messageType:"deliver"});i.success?s.info({entryId:e.id,ruleId:n.id,targetType:"channel"},"Delivery successful"):o(e.id,"failed",i.error??"Gateway returned failure")}else if(e.target.type==="webhook"){let t=await r.send({taskId:e.taskId,webhookUrl:e.target.webhookUrl,content:e.content,messageType:"deliver"});t.success?s.info({entryId:e.id,ruleId:n.id,targetType:"webhook"},"Webhook delivery successful"):o(e.id,"failed",t.error??"Gateway returned failure")}}catch(t){let i=t instanceof Error?t.message:String(t);o(e.id,"failed",i),s.warn({entryId:e.id,error:i},"Delivery attempt failed")}}checkRateLimit(e){let n=Date.now(),r=6e4,t=y.get(e.id);t||(t=[],y.set(e.id,t));let i=n-r;for(;t.length>0&&t[0]<i;)t.shift();return t.length>=e.maxPerMinute?!1:(t.push(n),!0)}isOriginChannel(e,n){try{if(n.type!=="channel"||!n.channelId)return!1;let r=f(e);if(!r)return!1;let t=m(r.sessionId);return t?t.source.type==="channel"&&t.source.channelId===n.channelId&&t.source.chatId===n.chatId:!1}catch{return!1}}async retryPending(){let e=k("rule",50),n=T("rule",50),r=[...e,...n];if(r.length!==0){s.debug({count:r.length},"Retrying pending/failed deliveries");for(let t of r){if(t.attempts>=3){o(t.id,"failed","Max retries (3) exceeded");continue}let i={id:t.ruleId??"retry-synthetic",eventType:"*",matchCriteria:{},target:t.target,maxPerMinute:5,skipOriginChannel:!0,enabled:!0,createdAt:0};await this.attemptDelivery(t,i)}}}};function N(){return c}function U(){c||(c=new v,u=setInterval(()=>{c?.retryPending().catch(l=>{s.error({error:l},"Delivery retry scan failed")})},6e4),p=setInterval(()=>{try{let l=P();l>0&&s.info({cleaned:l},"Expired delivery log entries cleaned up")}catch(l){s.error({error:l},"Delivery cleanup failed")}},36e5),s.info("DeliveryEngine started with retry (60s) and cleanup (1h) timers"))}function W(){u&&(clearInterval(u),u=null),p&&(clearInterval(p),p=null),c=null,y.clear(),s.info("DeliveryEngine stopped")}export{v as a,N as b,U as c,W as d};
@@ -1 +1 @@
1
- import{c as w,f as S}from"./chunk-F2IS5LWD.js";import{c as g}from"./chunk-3DAK2XWP.js";import{readFileSync as v,existsSync as E}from"fs";import{join as p}from"path";import{homedir as P}from"os";S();var T=g("ws"),R=p(P(),".adam"),f=p(R,"adam.port"),b=p(w,"adam.key");function d(){let n=process.env.ADAM_API_KEY;if(n)return n;if(E(b))return v(b,"utf-8").trim()||void 0}function m(){if(!E(f))return null;let n=parseInt(v(f,"utf-8").trim(),10);return isNaN(n)?null:n}function x(){let n=m();if(!n)throw new Error("Server not running. Run: adam server start");return`http://localhost:${n}`}var u=class extends Error{constructor(e,s){super(s);this.status=e;this.name="ApiError"}};async function C(n,t={}){let s=`${x()}${n}`,r=d(),o=await fetch(s,{method:t.method||"GET",headers:{"Content-Type":"application/json",...r?{"x-api-key":r}:{},...t.headers},body:t.body?JSON.stringify(t.body):void 0});if(!o.ok){let a=await o.text().catch(()=>"Unknown error");throw new u(o.status,a)}return o.headers.get("content-type")?.includes("application/json")?o.json():o.text()}function _(){return C("/healthz")}var k=class{ws=null;callbacks=new Map;reconnectAttempts=0;reconnectTimer=null;url;constructor(t="/events"){let e=m();if(!e)throw new Error("Server not running. Run: adam server start");let s=d(),r=new URL(`ws://localhost:${e}${t}`);s&&r.searchParams.set("api_key",s),this.url=r.toString()}connect(){return new Promise((t,e)=>{try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,t()},this.ws.onmessage=s=>{try{let r=JSON.parse(s.data),{type:o,data:c,...a}=r,i=this.callbacks.get(o);i&&i.forEach(l=>l(c??a))}catch(r){T.error({error:r},"Failed to parse WebSocket message")}},this.ws.onclose=()=>{this.scheduleReconnect()},this.ws.onerror=s=>{e(s)}}catch(s){e(s)}})}scheduleReconnect(){let t=[1e3,2e3,4e3,8e3,15e3],e=t[Math.min(this.reconnectAttempts,t.length-1)];this.reconnectAttempts++,this.reconnectTimer=setTimeout(()=>{this.connect().catch(()=>{})},e)}on(t,e){this.callbacks.has(t)||this.callbacks.set(t,new Set),this.callbacks.get(t).add(e)}off(t,e){this.callbacks.get(t)?.delete(e)}close(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.ws?.close()}isConnected(){return this.ws?.readyState===WebSocket.OPEN}},y=class{ws=null;callbacks=new Map;url;constructor(t){let e=m();if(!e)throw new Error("Server not running. Run: adam server start");let s=d(),r=new URL(`ws://localhost:${e}/tasks/${t}/stream`);s&&r.searchParams.set("api_key",s),this.url=r.toString()}connect(){return new Promise((t,e)=>{try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{t()},this.ws.onmessage=s=>{try{let r=JSON.parse(s.data),{type:o,data:c,...a}=r,i=this.callbacks.get(o);i&&i.forEach(h=>h(c??a));let l=this.callbacks.get("*");l&&l.forEach(h=>h(r))}catch(r){T.error({error:r},"Failed to parse task stream message")}},this.ws.onerror=s=>{e(s)},this.ws.onclose=()=>{}}catch(s){e(s)}})}on(t,e){this.callbacks.has(t)||this.callbacks.set(t,new Set),this.callbacks.get(t).add(e)}off(t,e){this.callbacks.get(t)?.delete(e)}close(){this.ws?.close()}isConnected(){return this.ws?.readyState===WebSocket.OPEN}};export{d as a,C as b,_ as c,k as d,y as e};
1
+ import{c as w,g as S}from"./chunk-SFUS33SO.js";import{c as g}from"./chunk-3DAK2XWP.js";import{readFileSync as v,existsSync as E}from"fs";import{join as p}from"path";import{homedir as P}from"os";S();var T=g("ws"),R=p(P(),".adam"),f=p(R,"adam.port"),b=p(w,"adam.key");function d(){let n=process.env.ADAM_API_KEY;if(n)return n;if(E(b))return v(b,"utf-8").trim()||void 0}function m(){if(!E(f))return null;let n=parseInt(v(f,"utf-8").trim(),10);return isNaN(n)?null:n}function x(){let n=m();if(!n)throw new Error("Server not running. Run: adam server start");return`http://localhost:${n}`}var u=class extends Error{constructor(e,s){super(s);this.status=e;this.name="ApiError"}};async function C(n,t={}){let s=`${x()}${n}`,r=d(),o=await fetch(s,{method:t.method||"GET",headers:{"Content-Type":"application/json",...r?{"x-api-key":r}:{},...t.headers},body:t.body?JSON.stringify(t.body):void 0});if(!o.ok){let a=await o.text().catch(()=>"Unknown error");throw new u(o.status,a)}return o.headers.get("content-type")?.includes("application/json")?o.json():o.text()}function _(){return C("/healthz")}var k=class{ws=null;callbacks=new Map;reconnectAttempts=0;reconnectTimer=null;url;constructor(t="/events"){let e=m();if(!e)throw new Error("Server not running. Run: adam server start");let s=d(),r=new URL(`ws://localhost:${e}${t}`);s&&r.searchParams.set("api_key",s),this.url=r.toString()}connect(){return new Promise((t,e)=>{try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,t()},this.ws.onmessage=s=>{try{let r=JSON.parse(s.data),{type:o,data:c,...a}=r,i=this.callbacks.get(o);i&&i.forEach(l=>l(c??a))}catch(r){T.error({error:r},"Failed to parse WebSocket message")}},this.ws.onclose=()=>{this.scheduleReconnect()},this.ws.onerror=s=>{e(s)}}catch(s){e(s)}})}scheduleReconnect(){let t=[1e3,2e3,4e3,8e3,15e3],e=t[Math.min(this.reconnectAttempts,t.length-1)];this.reconnectAttempts++,this.reconnectTimer=setTimeout(()=>{this.connect().catch(()=>{})},e)}on(t,e){this.callbacks.has(t)||this.callbacks.set(t,new Set),this.callbacks.get(t).add(e)}off(t,e){this.callbacks.get(t)?.delete(e)}close(){this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.ws?.close()}isConnected(){return this.ws?.readyState===WebSocket.OPEN}},y=class{ws=null;callbacks=new Map;url;constructor(t){let e=m();if(!e)throw new Error("Server not running. Run: adam server start");let s=d(),r=new URL(`ws://localhost:${e}/tasks/${t}/stream`);s&&r.searchParams.set("api_key",s),this.url=r.toString()}connect(){return new Promise((t,e)=>{try{this.ws=new WebSocket(this.url),this.ws.onopen=()=>{t()},this.ws.onmessage=s=>{try{let r=JSON.parse(s.data),{type:o,data:c,...a}=r,i=this.callbacks.get(o);i&&i.forEach(h=>h(c??a));let l=this.callbacks.get("*");l&&l.forEach(h=>h(r))}catch(r){T.error({error:r},"Failed to parse task stream message")}},this.ws.onerror=s=>{e(s)},this.ws.onclose=()=>{}}catch(s){e(s)}})}on(t,e){this.callbacks.has(t)||this.callbacks.set(t,new Set),this.callbacks.get(t).add(e)}off(t,e){this.callbacks.get(t)?.delete(e)}close(){this.ws?.close()}isConnected(){return this.ws?.readyState===WebSocket.OPEN}};export{d as a,C as b,_ as c,k as d,y as e};