adam-agent-server 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adam-tools-PQC7EI3J.js → adam-tools-BB7WQGVT.js} +1 -1
- package/dist/chunk-D6WM2OQS.js +86 -0
- package/dist/{chunk-MX6AZ7WD.js → chunk-DWMMWYLD.js} +1 -1
- package/dist/{engine-DEBMZJBM.js → engine-3PNNEZNK.js} +1 -1
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-HICJBGGJ.js +0 -86
|
@@ -1 +1 @@
|
|
|
1
|
-
import{x as a,y as b}from"./chunk-
|
|
1
|
+
import{x as a,y as b}from"./chunk-D6WM2OQS.js";import"./chunk-5JLMSNIW.js";import"./chunk-IXF3XBGX.js";import"./chunk-AXMXXUPO.js";import"./chunk-KICPHTI2.js";import"./chunk-FUGJMHY4.js";import"./chunk-5ASEAZCR.js";import"./chunk-742NWPTQ.js";import"./chunk-PQ7KPALO.js";import"./chunk-2GXYBWLS.js";import"./chunk-WZOMGJSY.js";import"./chunk-WXN3PSVX.js";import"./chunk-L7426WNY.js";import"./chunk-L7JP7DUO.js";import"./chunk-HAWA62R2.js";import"./chunk-VF6GJGD6.js";import"./chunk-T25NLVMY.js";import"./chunk-ETQ7KC73.js";import"./chunk-FYDFMYUP.js";import"./chunk-U36NBCR3.js";import"./chunk-XNWZZYAV.js";import"./chunk-PCSZW2PE.js";import"./chunk-SFUS33SO.js";import"./chunk-3DAK2XWP.js";import"./chunk-FCV2DPZQ.js";export{b as createAdamTools,a as getToolsFingerprint};
|
|
@@ -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 se}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 We}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 ie,b as v,c as O,d as A}from"./chunk-L7426WNY.js";import{a as ke}from"./chunk-L7JP7DUO.js";import{a as Be,b as Te,c as Je,g as qe,j as He}from"./chunk-HAWA62R2.js";import{a as Ye,b as W,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 Oe,b as le,e as Ie,f as V}from"./chunk-U36NBCR3.js";import{e as $e,f as T,h as F,i as G,j as Ue,k as we,l as ae}from"./chunk-XNWZZYAV.js";import{b,d as oe}from"./chunk-PCSZW2PE.js";import{c as I,d as Fe}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 i={};try{if(!E(n))return i;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&&(i[u]=p[1].trim())}}catch{}return i}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 i=y(t,"skills");if(E(i)){let d=yt(i,{withFileTypes:!0});for(let p of d){if(!p.isDirectory()&&!p.isSymbolicLink())continue;let g=y(i,p.name,"SKILL.md"),f=r(g,["name","description"]);f.name&&n.skills.push({name:f.name,description:f.description??""})}}let a=y(t,"agents");if(E(a)){let d=yt(a,{withFileTypes:!0});for(let p of d){if(!p.isFile()||!p.name.endsWith(".md"))continue;let g=r(y(a,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,i]of Object.entries(t.plugins))if(!(!Array.isArray(i)||i.length===0))for(let a of i){let l=a.scope??"user";e?.scope&&l!==e.scope||e?.projectPath&&a.projectPath!==e.projectPath||n.push({id:o,name:o.split("@")[0],version:a.version??"",scope:l,projectPath:a.projectPath,installPath:a.installPath??y(Y(),o),enabled:r[o]??a.enabled??!0,installedAt:a.installedAt??"",lastUpdated:a.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 s}from"zod";ae();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 B(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 pn(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=Ut(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]),i=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()+i*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 Ut(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 mn(e,t,r){let n=J(),o=Date.now(),i={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(i),i}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),B(o);let i={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(i),B(i);let a={id:J(),goalId:e,level:"L2",parentId:i.id,name:`${t}_daily_process`,description:`Daily process metric for ${t}`,weight:.6,calibrationFactor:1,createdAt:r};n.push(a),B(a);let l={id:J(),goalId:e,level:"L3",parentId:a.id,name:`${t}_per_task`,description:`Per-task instant metric for ${t}`,weight:.4,calibrationFactor:1,createdAt:r};return n.push(l),B(l),n}var pe=class{static collect(t,r){let n=v(t);if(!n)return this.emptyMetrics(t,r);let o=se(t,500,0),i=n.completedAt&&n.startedAt?n.completedAt-n.startedAt:0,a=new Set,l=0,u=0;for(let p of o)p.type==="tool_call"&&p.toolName&&a.add(p.toolName),p.type==="error"&&l++,p.type==="approval_request"&&u++;let d={taskId:t,goalId:r,timestamp:Date.now(),durationMs:i,costUsd:n.costUsd??0,turns:n.numTurns??0,toolCount:a.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),i=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*i+.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 Ot(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 it(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 st(e,t=100){return b().prepare("SELECT * FROM trials WHERE goal_id = ? ORDER BY completed_at DESC LIMIT ?").all(e,t).map(Ot)}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,i=Math.max(0,(r.deadline-n)/(1e3*60*60*24)),a=this.calculateBudgetSpent(t),l=r.budgetUsd>0?Math.max(0,1-a/r.budgetUsd):1,u=this.calculateExpectedCompletion(r),d={goalId:t,metricType:r.metricType,targetValue:r.targetValue,currentValue:r.currentValue,progressPct:o,deadlineRemainingDays:i,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 i=o/n;if(i<.1)return .5;let a=t.targetValue>0?t.currentValue/t.targetValue:0;return i>0?a/i:0}static calculateBudgetSpent(t){let r=st(t,1e3),n=0,o=new Set;for(let i of r)if(i.taskId&&!o.has(i.taskId)){o.add(i.taskId);let a=v(i.taskId);a?.costUsd&&(n+=a.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 Ft=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 i=JSON.parse(o[0]);return{score:Math.max(0,Math.min(1,i.score??0)),confidence:Math.max(.3,Math.min(.95,i.confidence??.5)),reasoning:i.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 i=v(t);if(!i){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 a=this.getPromptTemplate(i.prompt??"",i.result??i.error??"",r),l,u,d;try{let g=await this.callClaude(a);l=g.score,u=g.confidence,d=g.reasoning}catch(g){Ft.warn({error:g,taskId:t},"LLM Judge Claude API call failed, using heuristic fallback"),i.status==="failed"?(l=.1,u=.6,d=`Task failed: ${i.error??"unknown error"} (heuristic fallback)`):i.status==="completed"&&i.result?(l=.7,u=.5,d="Task completed with result (heuristic fallback due to API error)"):i.status==="completed"?(l=.5,u=.4,d="Task completed without explicit result (heuristic fallback)"):(l=.3,u=.3,d=`Task in status: ${i.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,i=this.children.get(o)??[];i.push(n),this.children.set(o,i)}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,i=0;for(let a of n){let l=r.get(a.id)??0,u=a.weight*a.calibrationFactor;o+=l*u,i+=u}return i>0?o/i:0}getWeightedScore(t){let r=0;for(let[n,o]of Object.entries(Gt)){let i=this.aggregateScores(n,t);r+=i*o}return Math.max(0,Math.min(1,r))}getNodeCount(){return this.nodes.size}getChildren(t){return this.children.get(t)??[]}};var Nn=I("agent");function fe(e,t){let r=Date.now(),n=ge.buildFromGoal(e),o=new Map,i=me.collect(e);for(let u of n.queryPath("L0"))o.set(u.id,i.rawScore);let a=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+i.rawScore*.35));return{goalId:e,taskId:t,reward:d,breakdown:{L0:i.rawScore,L1:0,L2:0,L3:u.rawScore},calibrationFactors:a,source:"objective",confidence:.9,computedAt:r}}}if(t&&!q.shouldUseObjective(t)){let d=q.evaluate(t,"general_quality"),p=i.rawScore*.5+.5*.5;return{goalId:e,taskId:t,reward:i.rawScore,breakdown:{L0:i.rawScore,L1:0,L2:0,L3:0,llmJudge:.5},calibrationFactors:a,source:"llm_judge",confidence:.4,computedAt:r}}let l=n.getNodeCount()>0?n.getWeightedScore(o):i.rawScore;return{goalId:e,reward:l,breakdown:{L0:i.rawScore,L1:0,L2:0,L3:0},calibrationFactors:a,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 at(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 Un(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 i,a;do i=this.randn(),a=1+o*i;while(a<=0);a=a*a*a;let l=Math.random();if(l<1-.0331*i*i*i*i||Math.log(l)<.5*i*i+n*(1-a+Math.log(a)))return n*a/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 i=this.sampleBeta(o.alpha,o.beta);i>n&&(n=i,r=o)}return r}static getProbabilities(t,r=1e4){let n=new Map;for(let i=0;i<r;i++){let a=this.sample(t);a&&n.set(a.id,(n.get(a.id)||0)+1)}let o=new Map;for(let[i,a]of n)o.set(i,a/r);return o}};var Wt=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,i,a,l){dt(t,o),it({id:ut(),strategyId:t,goalId:r,taskId:n,reward:o,metricL2Score:i,metricL3Score:a,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 i=n.reduce((u,d)=>u+d.totalTrials,0)/n.length,a=n.filter(u=>u.avgReward!==void 0).map(u=>u.avgReward),l=a.length>0?a.reduce((u,d)=>u+d,0)/a.length:0;return{count:n.length,avgTrials:i,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<Wt?!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 a={id:`strat-${ut().slice(0,8)}`,roleId:t,taskType:r,name:n,promptTemplate:o,alpha:pt,beta:pt,totalTrials:0,createdAt:Date.now()};return at(a),a}static getTopStrategies(t,r,n=3){let i=L(t,r).filter(a=>a.totalTrials>0);return i.sort((a,l)=>(l.avgReward??0)-(a.avgReward??0)),i.slice(0,n)}static getSamplingProbabilities(t,r){let n=L(t,r);return H.getProbabilities(n)}static evaluateAndRecord(t,r,n,o,i,a){let l=fe(r,n);return this.recordTrial(t,r,n,l.reward,o,i,a),l.reward}};var Bt=3,Jt=2,be=class{static async generateVariants(t,r,n=Bt,o=Jt){let i=S.getTopStrategies(t,r,n);if(i.length===0){let l=`baseline-${r}-v1`;return S.addStrategy(t,r,l,this.generateBaselinePrompt(t,r)),[l]}let a=[];for(let l=0;l<o;l++){let u=i[0].totalTrials+l+1,d=`${r}-evolved-v${u}`,p=i[0].promptTemplate,g=this.mutateTemplate(p);S.addStrategy(t,r,d,g),a.push(d)}return a}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(i=>({id:i.id,type:i.type,content:i.content,keywords:i.keywords,importance:i.importance,score:i.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 We(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 i=`mem-${qt().slice(0,8)}`,a=Date.now();return Be({id:i,roleId:r,type:t.type??"thought",content:t.content,embedding:n,keywords:t.keywords??[],importance:t.importance??3,sourceType:"manual",createdAt:a,lastAccessed:a,retrievedCount:0,tier:t.tier??"episodic"}),M({id:i,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 i=St("/tmp",`adam-cli-stdout-${process.pid}-${Date.now()}.txt`),a=tr(i,"w");try{let l=It("node",[r,...e],{cwd:t.cwd,timeout:n,stdio:["ignore",a,"pipe"],encoding:"utf-8"});if(l.status!==0)throw new Error(l.stderr?.trim()||`CLI exited with status ${l.status}`);return rr(i,"utf-8")}finally{try{nr(i)}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 uo(){try{return!!Tt()}catch{return!1}}ye();V();var sr={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=sr[d];if(p){let g=n.get(p.category)??[];g.push(p.label),n.set(p.category,g)}else o.push(d)}let i=[];for(let[d,p]of n)i.push(`${d} (${p.join(", ")})`);o.length>0&&i.push(o.join(", "));let a=i.join(" \xB7 "),l=Object.keys(e.mcpServers??{});l.length>0&&(a+=` \xB7 MCP: ${l.join(", ")}`);let u=e.additionalDirectories??[];if(u.length>0&&(a+=` \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});a+=` \xB7 Plugins: ${d.join(", ")}`}return a}function ar(e){let t=[],r=e.additionalDirectories??[];for(let n of r){if(!n.inheritPlugins&&!n.inheritMcp)continue;let o=X(n.path),i=Object.entries(o.enabledPlugins).filter(([,l])=>l).map(([l])=>l),a=Ee(i);for(let[,l]of a)t.includes(l)||t.push(l)}try{let n=Oe(e.name),o=C({scope:"project",projectPath:n});for(let i of o)i.installPath&&!t.includes(i.installPath)&&t.push(i.installPath)}catch{}return t}function Ne(e){let t=ar(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 ho(e,t,r){let o=b().prepare("SELECT * FROM approval_rules ORDER BY created_at DESC").all();for(let i of o)if(!(i.role_id&&i.role_id!==e)&&!(Pt[r]>Pt[i.max_risk_level]))try{if(new RegExp(i.task_pattern,"i").test(t))return lr(i)}catch{}}import*as Lt from"crypto";var te=I("api"),re=class{cancelTask(t){let r=v(t);r&&(O(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 i=Ge(t);if(!i)return te.warn({planId:t},"Plan not found or already resolved"),!1;let a=v(i.taskId);return a?(Ve(t,r==="allow"?"approved":"denied",n),r==="allow"&&n==="permanent"&&xt({id:Lt.randomUUID(),roleId:i.roleId,taskPattern:a.prompt.slice(0,100).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),maxRiskLevel:i.plan.overallRisk,createdAt:Date.now(),createdByTaskId:a.id}),ke.emit({type:"plan_approval_decision",taskId:a.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)}};import{existsSync as dr}from"fs";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")],i=[];for(let a of e)if(a.type==="session"&&a.sessionId)i.push({type:"session",sessionId:a.sessionId});else if(a.type==="channel"){let l=a.channelId,u=a.chatId;if(!l&&a.channelName){let d=r.find(p=>p.name.toLowerCase().includes(a.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?i.push({type:"channel",channelId:l,chatId:u}):ve.warn({channelName:a.channelName,channelId:l,chatId:u},"Could not resolve channel notify target")}return i}async function ur(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 pr={goalId:s.string()},mr={goalId:s.string(),status:s.string().optional(),currentValue:s.number().optional(),budgetUsd:s.number().optional(),notes:s.string().optional()},gr={goalId:s.string(),goalDescription:s.string(),maxSubtasks:s.number().optional()},D=s.union([s.object({type:s.literal("session"),sessionId:s.string()}),s.object({type:s.literal("channel"),channelName:s.string()}),s.object({type:s.literal("channel"),channelId:s.string(),chatId:s.string().optional()})]),fr={prompt:s.string(),roleId:s.string().describe("Role ID. Call list_roles first to find the best role for the task."),deliverTo:s.array(D).optional().describe("Where to deliver the task output (result full text). E.g., send result to a specific channel."),reportTo:s.array(D).optional().describe("Where to send status reports (completion summary). Defaults to the originating channel/session."),toolOverrides:s.object({allowedTools:s.array(s.string()).optional(),disallowedTools:s.array(s.string()).optional()}).optional()},hr={taskId:s.string(),goalId:s.string().optional(),strategyId:s.string().optional()},br={roleId:s.string(),taskType:s.string(),name:s.string().optional()},yr={status:s.string().optional(),limit:s.number().optional()},vr={taskId:s.string(),roleId:s.string()},wr={taskId:s.string().optional(),status:s.string().optional(),limit:s.number().optional()},Ir={roleId:s.string(),allowedPaths:s.array(s.string()).optional(),deniedPaths:s.array(s.string()).optional(),allowedTools:s.array(s.string()).optional(),disallowedTools:s.array(s.string()).optional(),additionalDirectories:s.array(s.object({path:s.string(),inheritPlugins:s.boolean().optional(),inheritMcp:s.boolean().optional(),inheritPermissions:s.boolean().optional()})).optional(),allowedChannels:s.array(s.string()).optional(),inheritUserSettings:s.boolean().optional().describe("Enable/disable inheriting user-level settings (global plugins, MCP servers). Default: false (isolated).")},Sr={roleId:s.string().optional(),limit:s.number().optional()},kr={name:s.string(),cagPrompt:s.string(),traits:s.array(s.string()).optional(),allowedTools:s.array(s.string()).optional(),disallowedTools:s.array(s.string()).optional(),additionalDirectories:s.array(s.object({path:s.string(),inheritPlugins:s.boolean().optional(),inheritMcp:s.boolean().optional(),inheritPermissions:s.boolean().optional()})).optional()},Tr={roleId:s.string(),reason:s.string().optional()},Rr={name:s.string(),description:s.string().optional(),roleId:s.string().optional(),metric:s.string().optional(),targetValue:s.number().optional(),deadline:s.number().optional(),budgetUsd:s.number().optional(),deliverTo:s.array(D).optional().describe("Where to deliver goal completion notifications.")},_r={name:s.string(),description:s.string().optional(),triggerType:s.enum(["cron","event"]),triggerCron:s.string().optional(),triggerEvent:s.string().optional(),prompt:s.string(),roleId:s.string().optional(),enabled:s.boolean().optional(),goalIds:s.array(s.string()).optional(),deliverTo:s.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:s.array(D).optional().describe("Where to send status reports (completion summary).")},Mr={status:s.enum(["active","retired","probation"]).optional(),limit:s.number().optional()},Pr={enabled:s.boolean().optional()},xr={},Lr={},Er={prompt:s.string().describe("The task prompt to execute after the delay"),delayMinutes:s.number().optional().describe("Minutes from now to execute (e.g., 30 for 'half an hour later')"),runAt:s.string().optional().describe("ISO 8601 timestamp to execute at (e.g., '2026-04-01T15:00:00+08:00')"),roleId:s.string().describe("Role ID to assign the task to. Call list_roles first."),deliverTo:s.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:s.array(D).optional().describe("Where to send status reports (completion summary).")},Cr={roleId:s.string().optional().describe("If provided, shows which plugins are installed in that role's workspace.")},Dr={roleId:s.string().describe("Role ID to install the plugin under (project-scope)."),pluginId:s.string().describe("Plugin ID (e.g. 'github@anthropic'). Use list_available_plugins to discover available plugins.")},Ar={roleId:s.string().describe("Role ID to uninstall the plugin from."),pluginId:s.string().describe("Plugin ID to uninstall.")},Nr={roleId:s.string().describe("Role ID to bind the MCP server to."),mcpName:s.string().describe("Name for this MCP server (e.g., 'github', 'filesystem')."),mcpConfig:s.record(s.string(),s.unknown()).describe("MCP server configuration object.")},jr={roleId:s.string().describe("Role ID to unbind the MCP server from."),mcpName:s.string().describe("Name of the MCP server to remove.")},$r={pluginId:s.string().describe("Plugin ID (e.g., 'github@anthropic').")},Ur={pluginId:s.string().describe("Plugin ID (e.g., 'github@anthropic').")},Or={pluginId:s.string().describe("Plugin ID (e.g., 'github@anthropic').")},Fr={pluginId:s.string().describe("Plugin ID (e.g., 'github@anthropic').")},Gr={},Vr={},Wr={pluginId:s.string().describe("Plugin ID (e.g., 'github@anthropic').")},Br={roleId:s.string().describe("Role ID to associate scanned plugins with."),path:s.string().describe("Directory path to scan for .claude/settings.json.")},Jr={taskId:s.string().describe("Task ID to cancel.")},qr={taskId:s.string().describe("Task ID to get logs for."),limit:s.number().optional().describe("Max log entries (default 20).")},Hr={roleId:s.string().describe("Role ID to delete.")},Kr={},Yr={updates:s.record(s.string(),s.unknown()).describe("Config key-value pairs to update. Example: { 'defaults.maxTurns': 50, 'logging.level': 'debug' }")},zr={roleId:s.string().describe("Role ID to list memories for."),limit:s.number().optional().describe("Max results (default 20).")},Qr={templateId:s.string().describe("Template ID to update."),name:s.string().optional(),enabled:s.boolean().optional(),prompt:s.string().optional(),triggerCron:s.string().optional(),triggerEvent:s.string().optional(),roleId:s.string().optional()},Xr={templateId:s.string().describe("Template ID to delete.")},Zr={templateId:s.string().describe("Template ID to run immediately.")},en={enabled:s.boolean().optional().describe("Filter by enabled status.")},tn={eventType:s.string().describe("Event type that triggers this rule (e.g., 'task_complete')."),channelId:s.string().describe("Channel ID to deliver to."),format:s.string().optional().describe("Format template (e.g., 'summary', 'full'). Default: 'summary'."),matchCriteria:s.record(s.string(),s.unknown()).optional().describe("JSON match criteria for event fields."),enabled:s.boolean().optional().describe("Enable this rule immediately (default true).")},rn={ruleId:s.string().describe("Delivery rule ID to delete.")},nn={roleId:s.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.",pr,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.",mr,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.",gr,async e=>{let t=k(),r=Math.min(e.maxSubtasks??5,10);try{let{query:o}=await import("@anthropic-ai/claude-agent-sdk"),i=`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.`,a=o({prompt:i,options:{cwd:process.cwd(),maxTurns:1,maxBudgetUsd:.02}}),l="";for await(let d of a){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,U=$?await ur($):void 0;ie({id:ne,status:"pending",prompt:f.prompt,parentId:e.goalId,roleId:U,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 i=`subtask-${w().slice(0,8)}`,a=`Subtask ${o+1} of goal: ${e.goalDescription.slice(0,100)}`,l=`${e.goalDescription}
|
|
82
|
+
|
|
83
|
+
Subtask ${o+1}/${r}`;ie({id:i,status:"pending",prompt:l,parentId:e.goalId,config:t.defaults,createdAt:Date.now()}),n.push({id:i,description:a,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.",fr,async e=>{let t=T(e.roleId);if(!t||t.status!=="active"){let U=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:U})}let r=w(),n=k(),o=e.prompt.toLowerCase(),i={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"]},a="general";for(let[U,R]of Object.entries(i))if(R.some(Ct=>o.includes(Ct))){a=U;break}let l,u=e.prompt,d=S.selectStrategy(e.roleId,a);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;ie({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.",hr,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.",br,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.",yr,async e=>{let t=e.status;return c(Ze(t,e.limit??10,0))}),m("delete_goal","Delete a goal by ID.",{goalId:s.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:s.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.",vr,async e=>{let{taskId:t,roleId:r}=e;if(!v(t))return c({error:`Task not found: ${t}`});let o=T(r);return o?(O(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.",wr,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).",Ir,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 F(e.roleId,r),c({success:!0})}),m("view_audit_log","View the evolution audit log for role changes.",Sr,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.",Mr,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(i=>({name:i.name,skills:i.skills.map(a=>a.name),agents:i.agents.map(a=>a.name)}))}});return c({roles:r})}),m("create_role","Create a new role with a name, CAG prompt, and optional tool permissions.",kr,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).",Tr,async e=>T(e.roleId)?(F(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.",Rr,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 i=_(t);return c({goalId:i.id,name:i.name,status:i.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.",_r,async e=>{let{createTaskTemplate:t}=await import("./task-templates-7LSQ6OST.js"),r=w(),n=w(),o=e.deliverTo?await P(e.deliverTo):void 0,i=e.reportTo?await P(e.reportTo):void 0,a={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:i};return t(a),c({templateId:r,name:a.name,trigger:a.trigger})}),m("list_templates","List task templates (automations). Use this to check existing scheduled/recurring tasks before creating new ones.",{enabled:s.boolean().optional().describe("Filter by enabled status. Omit to list all."),limit:s.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 (text, image, voice, video, file) to a connected channel by name. Use this to deliver task results, media, or notifications to a specific channel (e.g., WeChat on iPad). For media: provide mediaUrl as an absolute local file path and mediaType. Do NOT use remote URLs \u2014 download files locally first.",{channelName:s.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:s.string().describe("The message content to send (text caption when sending media)"),mediaUrl:s.string().optional().describe("Absolute local file path to the media file (e.g. /Users/.../file.png). Must exist on disk. Do NOT use remote URLs \u2014 download files locally first."),mediaType:s.enum(["image","audio","video","file"]).optional().describe("Type of the media file. Required when mediaUrl is provided")},async e=>{if(e.mediaUrl){if(e.mediaUrl.includes("://")&&!e.mediaUrl.startsWith("file://"))return c({error:`mediaUrl must be a local file path, not a remote URL. Got: ${e.mediaUrl.slice(0,80)}. Download the file to a local path first, then pass the local path.`});let a=e.mediaUrl.startsWith("file://")?new URL(e.mediaUrl).pathname:e.mediaUrl;if(!dr(a))return c({error:`Media file not found: ${a}. Verify the file exists before sending.`});if(!e.mediaType)return c({error:"mediaType is required when mediaUrl is provided. Specify one of: image, audio, video, file."})}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-DZTXBUTP.js"),i=await n().send({channelId:r.channelId,chatId:r.chatId,content:e.message,messageType:"deliver",mediaUrl:e.mediaUrl,mediaType:e.mediaType});return c({success:i.success,channelName:e.channelName,...i.error?{error:i.error}:{}})}),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.",Pr,async e=>{let t=Re(e.enabled),r=[..._e("active"),..._e("archived")],n=t.map(o=>{let i,a=r.find(l=>l.source.type==="channel"&&l.source.channelId===o.id&&l.source.chatId);return a?.source.chatId?i=a.source.chatId:i=o.config?.userId,{id:o.id,name:o.name,platform:o.platform,status:o.status,chatId:i}});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.",xr,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.",Er,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 i=w(),a=new Date(n).toISOString(),l=e.deliverTo?await P(e.deliverTo):void 0,u=e.reportTo?await P(e.reportTo):void 0;Ye({id:i,name:e.prompt.slice(0,80),description:`One-shot scheduled task: ${e.prompt.slice(0,200)}`,trigger:{type:"once",runAt:a},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-25VACELK.js"),p=d();return p&&p.scheduleOnceJob(i),c({templateId:i,executeAt:a,prompt:e.prompt})}),m("cancel_scheduled_task","Cancel a previously scheduled one-shot task by its template ID. The task will not execute.",{templateId:s.string().describe("The template ID returned by schedule_task")},async e=>{let t=W(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-25VACELK.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.",Cr,async e=>{let t=z(),r=C(),n=e.roleId?(()=>{let{getRoleWorkspacePath:o}=(V(),x(Ie)),{getRole:i}=(ae(),x(we)),{listInstalledPlugins:a}=(ye(),x(wt)),l=i(e.roleId);if(!l)return[];let u=o(l.name);return a({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.",Dr,async e=>{let{getRole:t}=(ae(),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(i){return c({error:`Failed to install plugin: ${i}`})}}),m("uninstall_plugin_from_role","Uninstall a plugin from a role's workspace.",Ar,async e=>{let{getRole:t}=(ae(),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(i){return c({error:`Failed to uninstall plugin: ${i}`})}}),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.",Nr,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 F(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.",jr,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 F(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.",Lr,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),i=A("running"),a=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:i.length,queued:a.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).",$r,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).",Ur,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).",Gr,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.",Vr,async()=>{let e=Ce();return c({sources:e})}),m("get_plugin_detail","Get detailed manifest for an installed plugin (skills, agents, MCP servers, hooks).",Wr,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.",Jr,async e=>{let t=v(e.taskId);if(!t)return c({error:`Task not found: ${e.taskId}`});let r=t.status;O(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.",qr,async e=>{let t=se(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.",Hr,async e=>T(e.roleId)?(Ue(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).",Kr,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],i=[...t],a={};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}a[l]={value:d,mutable:!t.includes(l)}}return c({config:a,mutable:[...e],restartRequired:[...t]})}),m("update_config","Update mutable runtime configuration fields. Returns partial-success: some fields may update while others return errors.",Yr,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"]&&Fe(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(i=>({path:i,value:e.updates[i]}))})}return c(n)}),m("list_memories","List memories stored under a specific role.",zr,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.).",Qr,async e=>{let t=W(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.",Xr,async e=>W(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).",Zr,async e=>{let t=W(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.",en,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.",tn,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.",rn,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.",nn,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:s.string(),operationId:s.string().optional().describe("ID of the specific operation. If omitted, authorizes the most recent pending operation."),scope:s.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:s.string(),operationId:s.string().optional(),reason:s.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 Qo(){return Et.map(e=>e.name).sort().join(",")}function Xo(){return cr({name:"adam-tools",version:"1.0.0",tools:Et})}export{ho 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,pn as j,mn as k,ot as l,Un 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,uo as v,ar as w,Qo as x,Xo as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as R}from"./chunk-NXTTKAQX.js";import{f as E}from"./chunk-KICPHTI2.js";import{b as v}from"./chunk-5ASEAZCR.js";import{e as m}from"./chunk-742NWPTQ.js";import{b as x}from"./chunk-PQ7KPALO.js";import{a as w,b as k,c as o,d as h,e as T,f as P,g as S}from"./chunk-FDWW245P.js";import{b as g}from"./chunk-L7426WNY.js";import{a as f}from"./chunk-L7JP7DUO.js";import{c as D}from"./chunk-3DAK2XWP.js";import{v4 as C}from"uuid";var s=D("admin"),y=new Map,u=null,p=null,c=null,I=class{constructor(){f.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),f.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),s.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=g(e),i=this.getSourceChannelForTask(e);if(i){let d=JSON.stringify(r).slice(0,500),{sendApprovalToChannel:b}=await import("./approval-handler-HK7GQPHU.js");await b(i.channelId,i.chatId,n,e,d)}let a=`Plan approval requested for task ${e}: ${JSON.stringify(r).slice(0,500)}`;await this.matchAndDeliver("plan_approval_request",{templateId:t?.templateId,roleId:t?.roleId,prompt:t?.prompt,taskStatus:"pending"},a,e)}getSourceChannelForTask(e){try{let n=m(e);if(!n)return null;let r=v(n.sessionId);return!r||r.source.type!=="channel"||!r.source.channelId||!r.source.chatId?null:{channelId:r.source.channelId,chatId:r.source.chatId}}catch{return null}}async handleTaskStatusChange(e,n){let r=g(e);if(!r)return;let t={templateId:r.templateId,roleId:r.roleId,prompt:r.prompt,taskStatus:n},i=n==="completed"?"task_complete":"task_error",a=r.result??r.error??"";await this.matchAndDeliver(i,t,a,e)}async matchAndDeliver(e,n,r,t){let i=E(e,n);if(i.length!==0){s.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){s.warn({ruleId:a.id,maxPerMinute:a.maxPerMinute},"Delivery rate limit exceeded, skipping");continue}if(a.skipOriginChannel&&a.target.type==="channel"&&t&&this.isOriginChannel(t,a.target))continue;let d={id:C(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+w,source:"rule"};k(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=R();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=x(e.target.channelId)?.config?.userId);let i=await r.send({taskId:e.taskId,channelId:e.target.channelId,chatId:t,content:e.content,messageType:"deliver"});i.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"channel"},"Delivery successful")):o(e.id,"failed",i.error??"Gateway returned failure")}else if(e.target.type==="webhook"){let t=await r.send({taskId:e.taskId,webhookUrl:e.target.webhookUrl,content:e.content,messageType:"deliver"});t.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"webhook"},"Webhook delivery successful")):o(e.id,"failed",t.error??"Gateway returned failure")}}catch(t){let i=t instanceof Error?t.message:String(t);o(e.id,"failed",i),s.warn({entryId:e.id,error:i},"Delivery attempt failed")}}checkRateLimit(e){let n=Date.now(),r=6e4,t=y.get(e.id);t||(t=[],y.set(e.id,t));let i=n-r;for(;t.length>0&&t[0]<i;)t.shift();return t.length>=e.maxPerMinute?!1:(t.push(n),!0)}isOriginChannel(e,n){try{if(n.type!=="channel"||!n.channelId)return!1;let r=m(e);if(!r)return!1;let t=v(r.sessionId);return t?t.source.type==="channel"&&t.source.channelId===n.channelId&&t.source.chatId===n.chatId:!1}catch{return!1}}async retryPending(){let e=T("rule",50),n=P("rule",50),r=[...e,...n];if(r.length!==0){s.debug({count:r.length},"Retrying pending/failed deliveries");for(let t of r){if(t.attempts>=3){o(t.id,"failed","Max retries (3) exceeded");continue}let i={id:t.ruleId??"retry-synthetic",eventType:"*",matchCriteria:{},target:t.target,maxPerMinute:5,skipOriginChannel:!0,enabled:!0,createdAt:0};await this.attemptDelivery(t,i)}}}};function N(){return c}function U(){c||(c=new I,u=setInterval(()=>{c?.retryPending().catch(l=>{s.error({error:l},"Delivery retry scan failed")})},6e4),p=setInterval(()=>{try{let l=S();l>0&&s.info({cleaned:l},"Expired delivery log entries cleaned up")}catch(l){s.error({error:l},"Delivery cleanup failed")}},36e5),s.info("DeliveryEngine started with retry (60s) and cleanup (1h) timers"))}function W(){u&&(clearInterval(u),u=null),p&&(clearInterval(p),p=null),c=null,y.clear(),s.info("DeliveryEngine stopped")}export{I as a,N as b,U as c,W as d};
|
|
1
|
+
import{b as R}from"./chunk-NXTTKAQX.js";import{f as E}from"./chunk-KICPHTI2.js";import{b as v}from"./chunk-5ASEAZCR.js";import{e as m}from"./chunk-742NWPTQ.js";import{b as x}from"./chunk-PQ7KPALO.js";import{a as w,b as k,c as o,d as h,e as T,f as P,g as S}from"./chunk-FDWW245P.js";import{b as g}from"./chunk-L7426WNY.js";import{a as f}from"./chunk-L7JP7DUO.js";import{c as D}from"./chunk-3DAK2XWP.js";import{v4 as C}from"uuid";var s=D("admin"),y=new Map,u=null,p=null,c=null,I=class{constructor(){f.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),f.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{s.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),s.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=g(e),i=this.getSourceChannelForTask(e);if(i){let d=JSON.stringify(r).slice(0,500),{sendApprovalToChannel:b}=await import("./approval-handler-HK7GQPHU.js");await b(i.channelId,i.chatId,n,e,d)}let a=`Plan approval requested for task ${e}: ${JSON.stringify(r).slice(0,500)}`;await this.matchAndDeliver("plan_approval_request",{templateId:t?.templateId,roleId:t?.roleId,prompt:t?.prompt,taskStatus:"pending"},a,e)}getSourceChannelForTask(e){try{let n=m(e);if(!n)return null;let r=v(n.sessionId);return!r||r.source.type!=="channel"||!r.source.channelId||!r.source.chatId?null:{channelId:r.source.channelId,chatId:r.source.chatId}}catch{return null}}async handleTaskStatusChange(e,n){let r=g(e);if(!r)return;let t={templateId:r.templateId,roleId:r.roleId,prompt:r.prompt,taskStatus:n},i=n==="completed"?"task_complete":"task_error",a=r.result??r.error??"";await this.matchAndDeliver(i,t,a,e)}async matchAndDeliver(e,n,r,t){let i=E(e,n);if(i.length!==0){s.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){s.warn({ruleId:a.id,maxPerMinute:a.maxPerMinute},"Delivery rate limit exceeded, skipping");continue}if(a.skipOriginChannel&&a.target.type==="channel"&&t&&this.isOriginChannel(t,a.target))continue;let d={id:C(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+w,source:"rule"};k(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=R();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=x(e.target.channelId)?.config?.userId);let i=await r.send({taskId:e.taskId,channelId:e.target.channelId,chatId:t,content:e.content,messageType:"deliver"});i.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"channel"},"Delivery successful")):o(e.id,"failed",i.error??"Gateway returned failure")}else if(e.target.type==="webhook"){let t=await r.send({taskId:e.taskId,webhookUrl:e.target.webhookUrl,content:e.content,messageType:"deliver"});t.success?(h(e.id),s.info({entryId:e.id,ruleId:n.id,targetType:"webhook"},"Webhook delivery successful")):o(e.id,"failed",t.error??"Gateway returned failure")}}catch(t){let i=t instanceof Error?t.message:String(t);o(e.id,"failed",i),s.warn({entryId:e.id,error:i},"Delivery attempt failed")}}checkRateLimit(e){let n=Date.now(),r=6e4,t=y.get(e.id);t||(t=[],y.set(e.id,t));let i=n-r;for(;t.length>0&&t[0]<i;)t.shift();return t.length>=e.maxPerMinute?!1:(t.push(n),!0)}isOriginChannel(e,n){try{if(n.type!=="channel"||!n.channelId)return!1;let r=m(e);if(!r)return!1;let t=v(r.sessionId);return t?t.source.type==="channel"&&t.source.channelId===n.channelId&&(!n.chatId||t.source.chatId===n.chatId):!1}catch{return!1}}async retryPending(){let e=T("rule",50),n=P("rule",50),r=[...e,...n];if(r.length!==0){s.debug({count:r.length},"Retrying pending/failed deliveries");for(let t of r){if(t.attempts>=3){o(t.id,"failed","Max retries (3) exceeded");continue}let i={id:t.ruleId??"retry-synthetic",eventType:"*",matchCriteria:{},target:t.target,maxPerMinute:5,skipOriginChannel:!0,enabled:!0,createdAt:0};await this.attemptDelivery(t,i)}}}};function N(){return c}function U(){c||(c=new I,u=setInterval(()=>{c?.retryPending().catch(l=>{s.error({error:l},"Delivery retry scan failed")})},6e4),p=setInterval(()=>{try{let l=S();l>0&&s.info({cleaned:l},"Expired delivery log entries cleaned up")}catch(l){s.error({error:l},"Delivery cleanup failed")}},36e5),s.info("DeliveryEngine started with retry (60s) and cleanup (1h) timers"))}function W(){u&&(clearInterval(u),u=null),p&&(clearInterval(p),p=null),c=null,y.clear(),s.info("DeliveryEngine stopped")}export{I as a,N as b,U as c,W as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d}from"./chunk-
|
|
1
|
+
import{a,b,c,d}from"./chunk-DWMMWYLD.js";import"./chunk-NXTTKAQX.js";import"./chunk-KICPHTI2.js";import"./chunk-5ASEAZCR.js";import"./chunk-742NWPTQ.js";import"./chunk-PQ7KPALO.js";import"./chunk-FDWW245P.js";import"./chunk-L7426WNY.js";import"./chunk-L7JP7DUO.js";import"./chunk-PCSZW2PE.js";import"./chunk-SFUS33SO.js";import"./chunk-3DAK2XWP.js";import"./chunk-FCV2DPZQ.js";export{a as DeliveryEngine,b as getDeliveryEngine,c as initDeliveryEngine,d as stopDeliveryEngine};
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as ws,b as Ss,d as Sr,e as Cr}from"./chunk-7SPKRIMZ.js";import{c as Er,d as xr}from"./chunk-
|
|
1
|
+
import{a as ws,b as Ss,d as Sr,e as Cr}from"./chunk-7SPKRIMZ.js";import{c as Er,d as xr}from"./chunk-DWMMWYLD.js";import{b as hr,c as br}from"./chunk-B6S2AEOD.js";import{a as vr,b as Rr,c as Ir,e as kr}from"./chunk-URW2DJQF.js";import{b as Tr}from"./chunk-NXTTKAQX.js";import{a as hs,b as bs,c as St,d as Cs,e as We,f as Ps,g as _s,h as As,i as Es,j as er,k as tr,l as sr,m as rr,n as nr,o as or,p as ar,q as ir,r as cr,s as dr,t as lr,u as pr,v as ve,w as ur,y as At}from"./chunk-D6WM2OQS.js";import{a as Zs}from"./chunk-5JLMSNIW.js";import{a as gs,c as fs,e as ys}from"./chunk-IXF3XBGX.js";import{a as gt,b as ft}from"./chunk-AXMXXUPO.js";import{a as mr,b as He,c as gr,d as fr,e as yr}from"./chunk-KICPHTI2.js";import{b as Ge,c as Hs,d as K,e as Ks,f as zs,g as Qs,h as Pt,i as re,j as Ys,n as Js,o as Xs}from"./chunk-FUGJMHY4.js";import{b as ks,c as Ts}from"./chunk-5ASEAZCR.js";import{a as se,b as wt,c as Rs,e as Is}from"./chunk-742NWPTQ.js";import{b as Gs,d as Se,f as be}from"./chunk-PQ7KPALO.js";import{h as us,i as ms}from"./chunk-FDWW245P.js";import{a as Ct,b as js,c as Ns}from"./chunk-2GXYBWLS.js";import{a as Tt,b as vs}from"./chunk-WZOMGJSY.js";import{a as Vs,c as $s}from"./chunk-BREBCBG4.js";import{b as pe,c as $e,d as Us,e as Ws}from"./chunk-WXN3PSVX.js";import{a as mt,b as D,c as H,d as M,e as as}from"./chunk-L7426WNY.js";import{a as f}from"./chunk-L7JP7DUO.js";import{a as xs,b as Ve,c as Ds,g as Os,j as Fs}from"./chunk-HAWA62R2.js";import{a as ls,b as Ue,c as ps,d as Pr,e as Et,f as _r,g as Ar,h as Dr}from"./chunk-T7WVM27S.js";import{b as _t,c as Ke,d as wr}from"./chunk-JXD6ZPV7.js";import{a as Ls,b as ne,c as qs,d as Ms,g as Bs}from"./chunk-VF6GJGD6.js";import{b as ss,c as rs,d as ns,e as os}from"./chunk-T25NLVMY.js";import{a as ts}from"./chunk-ETQ7KC73.js";import{a as Le,b as lt,c as Xt,d as W,e as qe,f as Me,g as Zt,h as pt}from"./chunk-FYDFMYUP.js";import"./chunk-TN6H2WM2.js";import{a as te,b as we,c as Rt,d as It,f as kt}from"./chunk-U36NBCR3.js";import{a as is,b as cs,c as jn,e as yt,f as B,g as ht,h as bt,i as Te,j as vt,l as he}from"./chunk-XNWZZYAV.js";import{b as q,c as ut,d as ke}from"./chunk-PCSZW2PE.js";import{b as es,c as A,g as le}from"./chunk-SFUS33SO.js";import{a as ds,c as O,d as Be}from"./chunk-3DAK2XWP.js";import"./chunk-FCV2DPZQ.js";import{writeFileSync as xn,mkdirSync as Dn,unlinkSync as ia}from"fs";import{join as at}from"path";le();import{readFileSync as Nn,existsSync as Ln}from"fs";import{resolve as xt}from"path";function Or(o=A){let e=[],t=[],r=process.env.ADAM_ENV_FILE;r&&t.push(xt(o,r)),t.push(xt(o,".env.local")),t.push(xt(o,".env"));for(let s of t){if(!Ln(s))continue;qn(s)>0&&e.push(s)}return e}function qn(o){let t=Nn(o,"utf-8").split(`
|
|
2
2
|
`),r=0;for(let s of t){let n=s.trim();if(!n||n.startsWith("#"))continue;n.startsWith("export ")&&(n=n.slice(7).trim());let a=n.indexOf("=");if(a===-1)continue;let i=n.slice(0,a).trim();if(!i)continue;let c=n.slice(a+1).trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),c=c.replace(/\$\{(\w+)\}|\$(\w+)/g,(l,d,m)=>{let h=d??m;return process.env[h]??""}),(i.startsWith("ANTHROPIC_")||process.env[i]===void 0)&&(process.env[i]=c,r++)}return r}ke();he();kt();import{existsSync as Fr}from"fs";import Mn from"path";import Bn from"fastify";import Un from"@fastify/cors";import Wn from"@fastify/static";import Vn from"@fastify/websocket";import $n from"@fastify/swagger";import Gn from"@fastify/swagger-ui";import{timingSafeEqual as Hn}from"crypto";function Nr(o,e){let t=Bn({logger:!1});if(t.register($n,{openapi:{info:{title:"Adam API",description:"Agent orchestration server built on Claude Agent SDK. Multi-agent system with parallel task execution, intelligent agent routing, self-evolving personas, and REST/WebSocket API.",version:Ue()},servers:[{url:"http://localhost:7100"}],tags:[{name:"Tasks",description:"Task lifecycle management"},{name:"Roles",description:"Role CRUD and workspace management"},{name:"Skills",description:"Skill CRUD and permissions"},{name:"Memories",description:"Agent memory search and retrieval"},{name:"Goals",description:"Goal-driven task management"},{name:"Strategies",description:"Thompson Sampling strategy engine"},{name:"Templates",description:"Task template CRUD and triggers"},{name:"Webhooks",description:"External system integration"},{name:"Config",description:"Runtime configuration management"},{name:"Evolution",description:"Agent evolution audit log"},{name:"Health",description:"Server health checks"}],components:{securitySchemes:{apiKey:{type:"apiKey",in:"header",name:"x-api-key",description:"API key for webhook endpoints"}}}}}),t.register(Gn,{routePrefix:"/docs"}),t.register(Un,{origin:!0}),t.register(Vn,{options:{maxPayload:1024*1024*16}}),e){let s=Buffer.from(e);t.addHook("onRequest",async(n,a)=>{let i=n.url;if(i==="/healthz"||i==="/readyz"||i.startsWith("/docs")||i.startsWith("/ui"))return;let c=n.headers["x-api-key"];if(c&&jr(c,s))return;let l=n.query,d=l.api_key||l["x-api-key"];if(!(d&&jr(d,s)))return a.status(401).send({code:"UNAUTHORIZED",message:"Invalid or missing API key"})})}let r=Mn.join(ls,"web/dist");return Fr(r)&&(t.register(Wn,{root:r,prefix:"/ui/",wildcard:!1}),t.get("/ui",async(s,n)=>n.sendFile("index.html",r)),t.get("/ui/*",async(s,n)=>n.sendFile("index.html",r))),t.setErrorHandler((s,n,a)=>{if(s.validation){let c=s.validation.map(l=>{let d=l.instancePath||l.params?.missingProperty||"";return d?`${d}: ${l.message}`:l.message});return a.status(400).send({code:"VALIDATION_ERROR",message:c.join("; ")})}let i=s.statusCode??500;return a.status(i).send({code:"INTERNAL_ERROR",message:s.message})}),t.setNotFoundHandler((s,n)=>s.url.startsWith("/ui")&&Fr(r)?n.sendFile("index.html",r):n.status(404).send({code:"NOT_FOUND",message:"Route not found"})),t}function jr(o,e){try{let t=Buffer.from(o);return t.length!==e.length?!1:Hn(t,e)}catch{return!1}}import{z as p}from"zod/v4";import{v4 as eo}from"uuid";var Kn=o=>({...o,nullable:!0}),w={type:"object",properties:{code:{type:"string"},message:{type:"string"}}},zn={type:"object",additionalProperties:!0,properties:{id:{type:"string"},prompt:{type:"string"},dependsOn:{type:"array",items:{type:"string"}},outputAs:{type:"string"}}},Qn={type:"object",additionalProperties:!0,properties:{type:{type:"string"},cron:{type:"string"},event:{type:"string"}}},Lr={type:"object",additionalProperties:!0,properties:{id:{type:"string"},name:{type:"string"},description:{type:"string"},trigger:Qn,steps:{type:"array",items:zn},agentPreference:{type:"string"},config:{type:"object",additionalProperties:!0},tags:{type:"array",items:{type:"string"}},enabled:{type:"boolean"},createdAt:{type:"number"},updatedAt:{type:"number"}}},Yn={type:"object",properties:{input:{type:"number"},output:{type:"number"}}},qr={type:"object",additionalProperties:!0,properties:{id:{type:"string"},parentId:{type:"string"},status:{type:"string"},prompt:{type:"string"},originalPrompt:{type:"string"},config:{type:"object",additionalProperties:!0},result:{type:"string"},error:{type:"string"},sdkSessionId:{type:"string"},roleId:{type:"string"},templateId:{type:"string"},createdAt:{type:"number"},startedAt:{type:"number"},completedAt:{type:"number"},costUsd:{type:"number"},tokenUsage:Yn,numTurns:{type:"number"},totalDurationMs:{type:"number"}}},Jn={type:"object",additionalProperties:!0,properties:{model:{type:"string"},effort:{type:"string"},maxTurns:{type:"number"}}},ze={type:"object",additionalProperties:!0,properties:{id:{type:"string"},name:{type:"string"},source:{type:"string"},traits:{type:"array",items:{type:"string"}},background:{type:"string"},preferences:Jn,learnedRules:{type:"array",items:{type:"string"}},memoryStreamId:{type:"string"},status:{type:"string"},createdAt:{type:"number"},lastActiveAt:{type:"number"},taskCount:{type:"number"},performanceScore:{type:"number"},role:{type:"string"},toolProfile:{type:"array",items:{type:"string"}},evaluationCriteria:{type:"object",additionalProperties:{type:"number"}},strategyPoolId:{type:"string"}}},Dt={type:"object",additionalProperties:!0,properties:{id:{type:"string"},roleId:{type:"string"},type:{type:"string"},content:{type:"string"},keywords:{type:"array",items:{type:"string"}},importance:{type:"number"},sourceType:{type:"string"},sourceTaskId:{type:"string"},evidence:{type:"array",items:{type:"string"}},createdAt:{type:"number"},lastAccessed:{type:"number"},retrievedCount:{type:"number"},score:{type:"number"}}},Xn={type:"object",additionalProperties:!0,properties:{id:{type:"string"},role:{type:"string"},taskType:{type:"string"},name:{type:"string"},promptTemplate:{type:"string"},alpha:{type:"number"},beta:{type:"number"},totalTrials:{type:"number"},avgReward:{type:"number"},toolProfile:{type:"array",items:{type:"string"}},createdAt:{type:"number"},updatedAt:{type:"number"}}},Ot={type:"object",additionalProperties:!0,properties:{id:{type:"string"},name:{type:"string"},description:{type:"string"},role:{type:"string"},metricType:{type:"string"},targetValue:{type:"number"},currentValue:{type:"number"},deadline:{type:"number"},budgetUsd:{type:"number"},status:{type:"string"},createdAt:{type:"number"},updatedAt:{type:"number"}}},Zn={type:"object",additionalProperties:!0,properties:{name:{type:"string"},displayName:{type:"string"},description:{type:"string"},tags:{type:"array",items:{type:"string"}},trigger:{type:"string"}}},R={templateCreated:{201:{type:"object",properties:{templateId:{type:"string"}}}},templateList:{200:{type:"object",properties:{templates:{type:"array",items:Lr}}}},templateDetail:{200:{type:"object",properties:{template:Lr}},404:w},templateUpdated:{200:{type:"object",properties:{templateId:{type:"string"}}},404:w},templateDeleted:{200:{type:"object",properties:{templateId:{type:"string"},deleted:{type:"boolean"}}},404:w},templateRun:{200:{type:"object",properties:{executionId:{type:"string"},status:{type:"string"}}},404:w},taskCreated:{201:{type:"object",properties:{taskId:{type:"string"}}},400:w},taskList:{200:{type:"object",properties:{tasks:{type:"array",items:qr}}}},taskDetail:{200:{type:"object",properties:{task:qr}},404:w},taskAction:{200:{type:"object",additionalProperties:!0,properties:{taskId:{type:"string"}}},400:w,404:w},approvalAction:{200:{type:"object",properties:{approvalId:{type:"string"},decision:{type:"string"}}},404:w},agentList:{200:{type:"object",properties:{roles:{type:"array",items:ze}}}},agentDetail:{200:{type:"object",properties:{agent:ze}},404:w},agentCreated:{201:{type:"object",properties:{agent:ze}}},agentUpdated:{200:{type:"object",properties:{agent:ze}},404:w},agentDeleted:{200:{type:"object",properties:{agentId:{type:"string"},deleted:{type:"boolean"}}},400:w,404:w},agentPersona:{200:{type:"object",properties:{persona:Kn({type:"string"})}},404:w},memoryList:{200:{type:"object",properties:{memories:{type:"array",items:Dt},count:{type:"number"}}},404:w},memoryQuery:{200:{type:"object",properties:{memories:{type:"array",items:Dt},count:{type:"number"}}},404:w},memoryCreated:{201:{type:"object",properties:{memory:Dt}},400:w,404:w},memoryUpdated:{200:{type:"object",properties:{memoryId:{type:"string"},updated:{type:"boolean"},embeddingUpdated:{type:"boolean"}}},400:w,404:w},memoryDeleted:{200:{type:"object",properties:{memoryId:{type:"string"},deleted:{type:"boolean"}}},404:w},strategyList:{200:{type:"object",properties:{strategies:{type:"array",items:Xn}}}},strategyProbabilities:{200:{type:"object",additionalProperties:!0,properties:{role:{type:"string"},taskType:{type:"string"},stats:{type:"object",additionalProperties:!0},probabilities:{type:"object",additionalProperties:{type:"number"}}}}},goalList:{200:{type:"object",properties:{goals:{type:"array",items:Ot}}}},goalDetail:{200:{type:"object",properties:{goal:Ot}},404:w},goalCreated:{201:{type:"object",properties:{goal:Ot}},400:{...w,additionalProperties:!0,properties:{...w.properties,errors:{type:"array",items:{type:"string"}},warnings:{type:"array",items:{type:"string"}}}}},webhookTriggered:{202:{type:"object",properties:{code:{type:"string"},message:{type:"string"},executionId:{type:"string"},templateId:{type:"string"}}},401:w,404:w,409:w,500:w},webhookList:{200:{type:"object",properties:{webhooks:{type:"array",items:Zn},auth:{type:"string"}}}},configGet:{200:{type:"object",additionalProperties:!0,properties:{config:{type:"object",additionalProperties:{type:"object",additionalProperties:!0,properties:{value:{},mutable:{type:"boolean"}}}},mutable:{type:"array",items:{type:"string"}},restartRequired:{type:"array",items:{type:"string"}}}}},configPatch:{200:{type:"object",additionalProperties:!0,properties:{success:{type:"boolean"},updated:{type:"array",items:{type:"string"}},errors:{type:"array",items:{type:"string"}},message:{type:"string"}}}},healthz:{200:{type:"object",properties:{status:{type:"string"}}}},readyz:{200:{type:"object",properties:{status:{type:"string"},checks:{type:"object",additionalProperties:{type:"boolean"}}}},503:{type:"object",properties:{status:{type:"string"},checks:{type:"object",additionalProperties:{type:"boolean"}}}}}};var Mr=p.union([p.object({type:p.literal("session"),sessionId:p.string()}),p.object({type:p.literal("channel"),channelId:p.string(),chatId:p.string().optional()})]),to=p.object({prompt:p.string().min(1,"prompt is required"),roleId:p.string().optional(),deliverTo:p.array(Mr).optional(),reportTo:p.array(Mr).optional(),config:p.object({allowedTools:p.array(p.string()).optional(),disallowedTools:p.array(p.string()).optional(),maxTurns:p.number().optional(),maxBudgetUsd:p.number().optional(),mcpServers:p.record(p.string(),p.unknown()).optional(),model:p.string().optional(),effort:p.enum(["low","medium","high","max"]).optional(),settingSources:p.array(p.string()).optional(),workspacePath:p.string().optional(),timeout:p.number().optional(),approvalRequired:p.array(p.string()).optional(),approvalTimeout:p.number().optional(),fileAccess:p.object({allowedPaths:p.array(p.string()),deniedPaths:p.array(p.string())}).optional(),env:p.record(p.string(),p.string()).optional(),plugins:p.array(p.string()).optional()}).optional()}),ue=p.object({id:p.string().uuid()}),so=["pending","queued","running","paused","completed","failed","cancelled"],ro=p.object({status:p.enum(so).optional(),roleId:p.string().optional(),limit:p.coerce.number().min(1).max(100).default(100),offset:p.coerce.number().min(0).default(0)});async function Br(o){let e=new bs;o.post("/tasks",{schema:{tags:["Tasks"],summary:"Create a task",description:"Create a new task with a prompt and optional agent/config overrides. The task enters 'pending' status and is picked up by the scheduler.",body:{type:"object",required:["prompt"],properties:{prompt:{type:"string",minLength:1,description:"Task prompt"},roleId:{type:"string",description:"Role to assign"},config:{type:"object",description:"Optional task configuration overrides",properties:{model:{type:"string"},maxTurns:{type:"integer"},maxBudgetUsd:{type:"number"},timeout:{type:"integer"},effort:{type:"string",enum:["low","medium","high","max"]}}}}},response:R.taskCreated}},async(n,a)=>{let i=to.safeParse(n.body);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let{prompt:c,roleId:l,config:d,deliverTo:m,reportTo:h}=i.data,I=ns(),y={timeout:d?.timeout??I.timeout,approvalRequired:d?.approvalRequired??I.approvalRequired,approvalTimeout:d?.approvalTimeout??I.approvalTimeout,fileAccess:d?.fileAccess??I.fileAccess,allowedTools:d?.allowedTools??I.allowedTools,disallowedTools:d?.disallowedTools??I.disallowedTools,maxTurns:d?.maxTurns??I.maxTurns,maxBudgetUsd:d?.maxBudgetUsd??I.maxBudgetUsd,mcpServers:d?.mcpServers,model:d?.model||I.model||void 0,effort:d?.effort??I.effort,settingSources:d?.settingSources??I.settingSources,workspacePath:d?.workspacePath,env:d?.env??I.env,claudeCodePath:I.claudeCodePath,plugins:d?.plugins},g={id:eo(),status:"pending",prompt:c,roleId:l,config:y,deliverTo:m,reportTo:h,createdAt:Date.now()};return mt(g),f.emit({type:"task_created",taskId:g.id}),a.status(201).send({taskId:g.id})}),o.get("/tasks",{schema:{tags:["Tasks"],summary:"List tasks",description:"List tasks with optional status filter and pagination.",querystring:{type:"object",properties:{status:{type:"string",enum:["pending","queued","running","paused","completed","failed","cancelled"]},limit:{type:"integer",minimum:1,maximum:100,default:100},offset:{type:"integer",minimum:0,default:0}}},response:R.taskList}},async(n,a)=>{let i=ro.safeParse(n.query);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let{status:c,roleId:l,limit:d,offset:m}=i.data;return{tasks:M(c,d,m,l)}}),o.get("/tasks/:id",{schema:{tags:["Tasks"],summary:"Get task by ID",description:"Retrieve a single task by its UUID.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},response:R.taskDetail}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=D(i.data.id);return c?{task:c}:a.status(404).send({code:"NOT_FOUND",message:"Task not found"})}),o.post("/tasks/:id/cancel",{schema:{tags:["Tasks"],summary:"Cancel a task",description:"Cancel a running, queued, pending, or paused task. Returns 400 if the task is in a terminal state.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},response:R.taskAction}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=D(i.data.id);return c?c.status!=="running"&&c.status!=="queued"&&c.status!=="pending"&&c.status!=="paused"?a.status(400).send({code:"INVALID_STATE",message:`Cannot cancel task in status: ${c.status}`}):(e.cancelTask(c.id),{taskId:c.id,status:"cancelled"}):a.status(404).send({code:"NOT_FOUND",message:"Task not found"})});let t=p.object({taskIds:p.array(p.string()).min(1).max(500)});o.post("/tasks/batch-cancel",{schema:{tags:["Tasks"],summary:"Batch cancel tasks",description:"Cancel multiple tasks at once. Skips tasks that are already in terminal state. Returns count of cancelled tasks.",body:{type:"object",required:["taskIds"],properties:{taskIds:{type:"array",items:{type:"string"},minItems:1,maxItems:500}}}}},async(n,a)=>{let i=t.safeParse(n.body);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=new Set(["pending","queued","running","paused"]),l=0,d=[];for(let m of i.data.taskIds){let h=D(m);if(!h){d.push({taskId:m,reason:"not found"});continue}if(!c.has(h.status)){d.push({taskId:m,reason:`already ${h.status}`});continue}e.cancelTask(m),l++}return{cancelled:l,total:i.data.taskIds.length,errors:d.length>0?d:void 0}}),o.get("/tasks/:id/logs",{schema:{tags:["Tasks"],summary:"Get task step logs",description:"Returns execution step logs for a task (reasoning, tool calls, results).",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50},offset:{type:"integer",minimum:0,default:0}}}}},async(n,a)=>{let i=D(n.params.id);if(!i)return a.status(404).send({code:"NOT_FOUND",message:"Task not found"});let{limit:c=50,offset:l=0}=n.query;return{logs:ft(i.id,c,l)}});let r=p.object({approvalId:p.string().uuid(),reason:p.string().optional()});o.post("/tasks/:id/approve",{schema:{tags:["Tasks"],summary:"Approve a pending approval",description:"Approve a tool-use approval request for a paused task. The skill agent resumes execution with the approved tool call.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},body:{type:"object",required:["approvalId"],properties:{approvalId:{type:"string",format:"uuid"},reason:{type:"string"}}},response:R.approvalAction}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=r.safeParse(n.body);return c.success?D(i.data.id)?e.resolveApproval(c.data.approvalId,"allow",c.data.reason)?{approvalId:c.data.approvalId,decision:"allow"}:a.status(404).send({code:"NOT_FOUND",message:"Approval not found or already resolved"}):a.status(404).send({code:"NOT_FOUND",message:"Task not found"}):a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(c.error)})}),o.post("/tasks/:id/reject",{schema:{tags:["Tasks"],summary:"Reject a pending approval",description:"Reject a tool-use approval request for a paused task. The skill agent skips the denied tool call.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},body:{type:"object",required:["approvalId"],properties:{approvalId:{type:"string",format:"uuid"},reason:{type:"string"}}},response:R.approvalAction}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=r.safeParse(n.body);return c.success?D(i.data.id)?e.resolveApproval(c.data.approvalId,"deny",c.data.reason)?{approvalId:c.data.approvalId,decision:"deny"}:a.status(404).send({code:"NOT_FOUND",message:"Approval not found or already resolved"}):a.status(404).send({code:"NOT_FOUND",message:"Task not found"}):a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(c.error)})});let s=p.object({planId:p.string(),decision:p.enum(["allow","deny"]),approvalType:p.enum(["once","permanent"]).optional(),reason:p.string().optional()});o.post("/tasks/:id/approve-plan",{schema:{tags:["Tasks"],summary:"Approve or deny an execution plan",description:"Respond to a plan approval request. Allow once (single task), allow permanent (create rule for similar tasks), or deny.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},body:{type:"object",required:["planId","decision"],properties:{planId:{type:"string"},decision:{type:"string",enum:["allow","deny"]},approvalType:{type:"string",enum:["once","permanent"]},reason:{type:"string"}}}}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=s.safeParse(n.body);if(!c.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(c.error)});if(!D(i.data.id))return a.status(404).send({code:"NOT_FOUND",message:"Task not found"});let{planId:d,decision:m,approvalType:h,reason:I}=c.data;return e.resolvePlanApproval(d,m,h,I)?{planId:d,decision:m,approvalType:h}:a.status(404).send({code:"NOT_FOUND",message:"Plan approval not found or already resolved"})}),o.get("/tasks/:id/plan",{schema:{tags:["Tasks"],summary:"Get execution plans for a task",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(n,a)=>{let i=ue.safeParse(n.params);return i.success?D(i.data.id)?{plans:fs(i.data.id)}:a.status(404).send({code:"NOT_FOUND",message:"Task not found"}):a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)})}),o.get("/tasks/:id/delivery-log",{schema:{tags:["Tasks"],summary:"Get delivery log for a task",description:"Returns delivery log entries for a task, including channel and webhook delivery attempts.",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50}}}}},async(n,a)=>{let i=ue.safeParse(n.params);if(!i.success)return a.status(400).send({code:"VALIDATION_ERROR",message:p.prettifyError(i.error)});let c=D(i.data.id);if(!c)return a.status(404).send({code:"NOT_FOUND",message:"Task not found"});let{limit:l=50}=n.query;return{logs:us(c.id,l)}})}ke();he();async function Ur(o,e){o.get("/healthz",{schema:{tags:["Health"],summary:"Health check",description:"Basic liveness probe. Returns 200 if the server process is running.",response:R.healthz}},async(t,r)=>({status:"ok"})),o.get("/readyz",{schema:{tags:["Health"],summary:"Readiness check",description:"Readiness probe that checks database, roles, config, embedding model, and task hub. Returns 503 if any check fails.",response:R.readyz}},async(t,r)=>{let s={database:!1,manager:!1,config:!1};try{q().prepare("SELECT 1").get(),s.database=!0}catch{s.database=!1}s.manager=!0,s.config=!!e.server;try{let a=Te(void 0,1,0);s.agents=a.length>0}catch{s.agents=!1}return s.embedding=vs(),s.taskHub=!0,Object.values(s).every(a=>a)?{status:"ready",checks:s}:r.status(503).send({status:"not_ready",checks:s})}),o.get("/stats",{schema:{tags:["Health"],summary:"Runtime statistics",description:"Returns execution pool status, active/pending task counts, and cost summary."}},async(t,r)=>{let n=W().execution?.maxConcurrent??5,a=M("running"),i=M("pending");return{executionPool:{active:a.length,max:n,queued:i.length}}}),o.get("/version",{schema:{tags:["Health"],summary:"Server version",description:"Returns the server version from package.json.",response:{200:{type:"object",properties:{name:{type:"string"},version:{type:"string"}}}}}},async(t,r)=>({name:ps(),version:Ue()}))}import{timingSafeEqual as Vr}from"crypto";import{z as $r}from"zod/v4";var Ft=class{connections=new Map;eventBuffers=new Map;eventIndices=new Map;addConnection(e,t){this.connections.has(e)||this.connections.set(e,new Set),this.connections.get(e).add(t);let r=this.getBufferedEvents(e);for(let s of r)t.readyState===1&&t.send(JSON.stringify(s));t.on("close",()=>{this.removeConnection(e,t)})}removeConnection(e,t){let r=this.connections.get(e);r&&(r.delete(t),r.size===0&&this.connections.delete(e))}broadcast(e,t){this.addToBuffer(e,t);let r=this.connections.get(e);if(!r||r.size===0)return;let s=JSON.stringify(t);for(let n of r)n.readyState===1&&n.send(s)}addToBuffer(e,t){let r=this.eventBuffers.get(e);r||(r=[],this.eventBuffers.set(e,r)),r.push(t),r.length>100&&r.shift(),this.eventIndices.set(e,t.index)}getBufferedEvents(e){return this.eventBuffers.get(e)??[]}getNextIndex(e){let r=(this.eventIndices.get(e)??0)+1;return this.eventIndices.set(e,r),r}},Wr=new Ft;var no=$r.object({id:$r.string().uuid()});async function Gr(o,e){o.get("/tasks/:id/stream",{websocket:!0},(t,r)=>{if(e&&!oo(r,e)){t.close(4401,"Unauthorized");return}let s=no.safeParse(r.params);if(!s.success){t.close(1008,"Invalid task ID");return}let{id:n}=s.data;if(!D(n)){t.close(1008,"Task not found");return}Wr.addConnection(n,t)})}function oo(o,e){let t=o.headers["x-api-key"];if(t)try{let n=Buffer.from(t),a=Buffer.from(e);if(n.length===a.length&&Vr(n,a))return!0}catch{}let r=o.query,s=r.api_key||r["x-api-key"];if(s)try{let n=Buffer.from(s),a=Buffer.from(e);if(n.length===a.length&&Vr(n,a))return!0}catch{}return!1}import{timingSafeEqual as Hr}from"crypto";var ao=O("ws"),Qe=new Set;function Kr(o,e){o.get("/events",{websocket:!0},(t,r)=>{if(e&&!io(r,e)){t.close(4401,"Unauthorized");return}Qe.add(t),t.on("close",()=>{Qe.delete(t)}),t.on("error",s=>{ao.error({error:s},"WebSocket error"),Qe.delete(t)})}),f.on("task_status_change",t=>{z(t)}),f.on("approval_request",t=>{z(t)}),f.on("stats_update",t=>{z(t)}),f.on("log_event",t=>{z(t)}),f.on("config_changed",t=>{z(t)}),f.on("plan_approval_request",t=>{(()=>{try{let s=Is(t.taskId);if(!s)return!1;let n=ks(s.sessionId);return n?n.source.type==="channel"&&!!n.source.channelId:!1}catch{return!1}})()||z(t)}),f.on("plan_approval_decision",t=>{z(t)}),f.on("task_created",t=>{z(t)}),f.on("execution_slot_change",t=>{z(t)}),f.on("execution_task_start",t=>{z(t)}),f.on("execution_task_end",t=>{z(t)}),f.on("delivery_status_change",t=>{z(t)})}function z(o){let e=JSON.stringify(o);for(let t of Qe)t.readyState===1&&t.send(e)}function io(o,e){let t=o.headers["x-api-key"];if(t)try{let n=Buffer.from(t),a=Buffer.from(e);if(n.length===a.length&&Hr(n,a))return!0}catch{}let r=o.query,s=r.api_key||r["x-api-key"];if(s)try{let n=Buffer.from(s),a=Buffer.from(e);if(n.length===a.length&&Hr(n,a))return!0}catch{}return!1}ke();function co(o){return{id:o.id,sdkSessionId:o.sdk_session_id??void 0,userTaskSessionId:o.user_task_session_id??void 0,workspacePath:o.workspace_path??void 0,toolsFingerprint:o.tools_fingerprint??void 0,createdAt:o.created_at,lastActiveAt:o.last_active_at??void 0}}function jt(){let o=q(),e=o.prepare("SELECT * FROM server_state WHERE id = 1").get();if(e)return co(e);let t=Date.now();return o.prepare("INSERT INTO server_state (id, created_at) VALUES (1, ?)").run(t),{id:1,createdAt:t}}function Ce(o){let e=q(),t=[],r=[];"sdkSessionId"in o&&(t.push("sdk_session_id = ?"),r.push(o.sdkSessionId??null)),"userTaskSessionId"in o&&(t.push("user_task_session_id = ?"),r.push(o.userTaskSessionId??null)),"workspacePath"in o&&(t.push("workspace_path = ?"),r.push(o.workspacePath??null)),"lastActiveAt"in o&&(t.push("last_active_at = ?"),r.push(o.lastActiveAt??null)),"toolsFingerprint"in o&&(t.push("tools_fingerprint = ?"),r.push(o.toolsFingerprint??null)),t.length!==0&&(jt(),r.push(1),e.prepare(`UPDATE server_state SET ${t.join(", ")} WHERE id = ?`).run(...r))}function Ye(o){Ce({sdkSessionId:o,lastActiveAt:Date.now()})}function zr(){Ce({sdkSessionId:void 0,lastActiveAt:Date.now()})}function Qr(o){Ce({workspacePath:o})}he();kt();import{z as u}from"zod/v4";import{v4 as Yr}from"uuid";Es();import{rmSync as lo,existsSync as Nt}from"fs";var Jr=u.object({model:u.string().optional(),effort:u.enum(["low","medium","high","max"]).optional(),maxTurns:u.number().optional()}),Xr=u.object({path:u.string(),inheritPlugins:u.boolean().optional(),inheritMcp:u.boolean().optional(),inheritPermissions:u.boolean().optional()}),po=u.object({name:u.string().min(1,"name is required").regex(/^[\p{L}\p{N}_-]+$/u,"name must contain only letters, numbers, underscores, or hyphens"),cagPrompt:u.string().optional(),learnedRules:u.array(u.string()).optional(),allowedTools:u.array(u.string()).optional(),disallowedTools:u.array(u.string()).optional(),evaluationCriteria:u.record(u.string(),u.number()).optional(),executionMode:u.enum(["isolated","inline"]).optional(),model:u.string().optional(),maxBudgetUsd:u.number().optional(),approvalRequired:u.array(u.string()).optional(),preferences:Jr.optional(),additionalDirectories:u.array(Xr).optional(),allowedChannels:u.array(u.string()).optional(),inheritUserSettings:u.boolean().optional()}),uo=u.object({name:u.string().min(1).optional(),cagPrompt:u.string().optional(),learnedRules:u.array(u.string()).optional(),status:u.enum(["active","inactive","retired"]).optional(),allowedTools:u.array(u.string()).optional(),disallowedTools:u.array(u.string()).optional(),evaluationCriteria:u.record(u.string(),u.number()).optional(),executionMode:u.enum(["isolated","inline"]).optional(),model:u.string().optional(),maxBudgetUsd:u.number().optional(),approvalRequired:u.array(u.string()).optional(),preferences:Jr.optional(),additionalDirectories:u.array(Xr).optional(),allowedChannels:u.array(u.string()).nullable().optional(),inheritUserSettings:u.boolean().optional()}),Je=u.object({id:u.string().min(1)}),mo=u.object({status:u.enum(["active","inactive","retired"]).optional(),limit:u.coerce.number().min(1).max(100).default(100),offset:u.coerce.number().min(0).default(0)}),go=u.object({path:u.string().min(1)});async function Zr(o){o.get("/roles",{schema:{tags:["Roles"],summary:"List all roles",description:"List all roles with optional status filter and pagination.",querystring:{type:"object",properties:{status:{type:"string",enum:["active","inactive","retired"]},limit:{type:"integer",minimum:1,maximum:100,default:100},offset:{type:"integer",minimum:0,default:0}}}}},async(e,t)=>{let r=mo.safeParse(e.query);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let{status:s,limit:n,offset:a}=r.data;return{roles:Te(s,n,a).map(c=>({...c,workspacePath:te(c.name)}))}}),o.post("/roles",{schema:{tags:["Roles"],summary:"Create a role",description:"Create a new role with a name, CAG prompt, and optional preferences.",body:{type:"object",required:["name"],properties:{name:{type:"string",minLength:1},cagPrompt:{type:"string"},preferences:{type:"object",properties:{model:{type:"string"},effort:{type:"string",enum:["low","medium","high","max"]},maxTurns:{type:"number"}}}}}}},async(e,t)=>{let r=po.safeParse(e.body);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let{name:s,cagPrompt:n,learnedRules:a,allowedTools:i,disallowedTools:c,evaluationCriteria:l,executionMode:d,model:m,maxBudgetUsd:h,approvalRequired:I,preferences:y,additionalDirectories:g,allowedChannels:P,inheritUserSettings:V}=r.data;if(ht(s))return t.status(409).send({code:"CONFLICT",message:`Role with name '${s}' already exists`});let $={id:`role-${Yr().slice(0,8)}`,name:s,cagPrompt:n??"",learnedRules:a??[],memoryStreamId:`mem-${Yr().slice(0,8)}`,status:"active",preferences:y??{},allowedTools:i,disallowedTools:c,evaluationCriteria:l,executionMode:d,model:m,maxBudgetUsd:h,approvalRequired:I,additionalDirectories:g,allowedChannels:P,inheritUserSettings:V,createdAt:Date.now()};return yt($),we($),t.status(201).send({role:$})}),o.get("/roles/:id",{schema:{tags:["Roles"],summary:"Get role by ID",description:"Retrieve a single role with its project-scope plugins.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(e,t)=>{let r=Je.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let s=B(r.data.id);if(!s)return t.status(404).send({code:"NOT_FOUND",message:"Role not found"});let n=te(s.name),a=We({scope:"project",projectPath:n});return{role:s,projectPlugins:a,workspacePath:n}}),o.get("/roles/:id/scores",{schema:{tags:["Roles"],summary:"Get role quality scores",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:100,default:20}}}}},async(e,t)=>{let r=u.object({id:u.string().min(1)}).safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let s=B(r.data.id);if(!s)return t.status(404).send({code:"NOT_FOUND",message:"Role not found"});let n=e.query.limit??20,a=ws(s.id,n),i=Ss(s.id);return{scores:a,latestEma:i??null}}),o.patch("/roles/:id",{schema:{tags:["Roles"],summary:"Update a role",description:"Partially update a role's CAG prompt, learned rules, status, or preferences.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{name:{type:"string",minLength:1},cagPrompt:{type:"string"},learnedRules:{type:"array",items:{type:"string"}},status:{type:"string",enum:["active","inactive","retired"]},preferences:{type:"object",properties:{model:{type:"string"},effort:{type:"string",enum:["low","medium","high","max"]},maxTurns:{type:"number"}}}}}}},async(e,t)=>{let r=Je.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let s=uo.safeParse(e.body);if(!s.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(s.error)});if(!B(r.data.id))return t.status(404).send({code:"NOT_FOUND",message:"Role not found"});let{allowedChannels:a,...i}=s.data,c={...i,updatedAt:Date.now()};if(a!==void 0&&(c.allowedChannels=a??void 0),bt(r.data.id,c),s.data.cagPrompt!==void 0||s.data.learnedRules!==void 0){let d=B(r.data.id);if(d){let m=te(d.name);Nt(m)&&Rt(m,d)}}let l=B(r.data.id);if(l&&(s.data.allowedTools!==void 0||s.data.disallowedTools!==void 0)){let d=te(l.name);Nt(d)&&It(l.id,l.allowedTools,d)}return{role:l}}),o.delete("/roles/:id",{schema:{tags:["Roles"],summary:"Delete a role",description:"Delete a role and its workspace.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(e,t)=>{let r=Je.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let s=B(r.data.id);if(!s)return t.status(404).send({code:"NOT_FOUND",message:"Role not found"});let n=te(s.name);if(Nt(n))try{lo(n,{recursive:!0,force:!0})}catch{}return vt(r.data.id),{roleId:r.data.id,deleted:!0}}),o.post("/roles/:id/scan-directory",{schema:{tags:["Roles"],summary:"Scan directory for plugin/permission configuration",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",required:["path"],properties:{path:{type:"string",minLength:1}}}}},async(e,t)=>{let r=Je.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(r.error)});let s=go.safeParse(e.body);if(!s.success)return t.status(400).send({code:"VALIDATION_ERROR",message:u.prettifyError(s.error)});if(!B(r.data.id))return t.status(404).send({code:"NOT_FOUND",message:"Role not found"});let a=As(s.data.path);return{path:s.data.path,enabledPlugins:a.enabledPlugins,mcpServers:a.mcpServers,allowedTools:a.allowedTools,disallowedTools:a.disallowedTools}})}le();import{z as en}from"zod/v4";import{readdirSync as fo,existsSync as yo}from"fs";import{join as Lt,resolve as tn,sep as rn}from"path";import{homedir as ho}from"os";var bo=20,vo=en.object({prefix:en.string()});function nn(o){return o.startsWith("~/")?Lt(ho(),o.slice(2)):o}function sn(o){let e=tn(o);for(let t of es){let r=nn(t),s=tn(r);if(e===s||e.startsWith(s+rn))return!0}return!1}async function on(o){o.get("/fs/suggest-dirs",{schema:{tags:["FS"],summary:"Suggest directory completions",description:"Return directory suggestions matching a given path prefix.",querystring:{type:"object",required:["prefix"],properties:{prefix:{type:"string"}}}}},async(e,t)=>{let r=vo.safeParse(e.query);if(!r.success)return{suggestions:[]};let{prefix:s}=r.data;if(!s.startsWith("/")&&!s.startsWith("~/"))return{suggestions:[]};if(sn(s))return{suggestions:[]};let n=nn(s),a,i;if(s.endsWith("/"))a=n,i="";else{let g=Math.max(n.lastIndexOf("/"),n.lastIndexOf(rn));if(g<0)return{suggestions:[]};a=n.slice(0,g+1),i=n.slice(g+1)}if(!yo(a))return{suggestions:[]};let c;try{c=fo(a,{withFileTypes:!0}).filter(g=>g.isDirectory()).map(g=>g.name)}catch{return{suggestions:[]}}let l=i.toLowerCase(),d=c.filter(g=>g.toLowerCase().startsWith(l)),I=(i.startsWith(".")?d:d.filter(g=>!g.startsWith("."))).filter(g=>!sn(Lt(a,g)));return I.sort((g,P)=>g.localeCompare(P,void 0,{sensitivity:"base"})),{suggestions:I.slice(0,bo).map(g=>Lt(a,g))}})}import{z as S}from"zod/v4";he();import{v4 as Ro}from"uuid";var Io=S.object({roleId:S.string().min(1)}),ko=S.object({roleId:S.string().min(1),prompt:S.string().min(1),topK:S.number().min(1).max(50).default(10)}),To=S.object({limit:S.coerce.number().min(1).max(200).default(50),offset:S.coerce.number().min(0).default(0)});function qt(o){return B(o)!==void 0}async function an(o){o.get("/memories/:roleId",{schema:{tags:["Memories"],summary:"List role memories",description:"List all memories for a specific role with pagination. Embeddings are stripped from the response.",params:{type:"object",required:["roleId"],properties:{roleId:{type:"string"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50},offset:{type:"integer",minimum:0,default:0}}},response:R.memoryList}},async(r,s)=>{let n=Io.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:S.prettifyError(n.error)});let a=n.data.roleId;if(!qt(a))return s.status(404).send({code:"NOT_FOUND",message:"Role or agent not found"});let i=To.safeParse(r.query),{limit:c,offset:l}=i.success?i.data:{limit:50,offset:0},m=Os(a,c,l).map(({embedding:h,...I})=>I);return{memories:m,count:m.length}}),o.post("/memories/query",{schema:{tags:["Memories"],summary:"Query role memories",description:"Query a role's memories using hybrid search (FTS5 + vector similarity) with Smallville-style scoring (recency, importance, relevance).",body:{type:"object",required:["roleId","prompt"],properties:{roleId:{type:"string",minLength:1,description:"The role whose memories to query"},prompt:{type:"string",minLength:1,description:"The search query"},topK:{type:"integer",minimum:1,maximum:50,default:10,description:"Number of results to return"}}},response:R.memoryQuery}},async(r,s)=>{let n=ko.safeParse(r.body);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:S.prettifyError(n.error)});let{roleId:a,prompt:i,topK:c}=n.data;if(!qt(a))return s.status(404).send({code:"NOT_FOUND",message:"Role or agent not found"});let d=(await Ct(a,i,{topK:c})).map(({embedding:m,...h})=>h);return{memories:d,count:d.length}});let e=S.object({roleId:S.string().min(1),content:S.string().min(1),type:S.enum(["event","thought","reflection"]).default("thought"),keywords:S.array(S.string()).default([]),importance:S.number().min(1).max(5).default(3),tier:S.enum(["working","episodic","semantic"]).default("episodic")});o.post("/memories",{schema:{tags:["Memories"],summary:"Create memory",description:"Create a new memory for a role. Embedding is auto-generated from content.",body:{type:"object",required:["roleId","content"],properties:{roleId:{type:"string",minLength:1},content:{type:"string",minLength:1},type:{type:"string",enum:["event","thought","reflection"],default:"thought"},keywords:{type:"array",items:{type:"string"},default:[]},importance:{type:"integer",minimum:1,maximum:5,default:3},tier:{type:"string",enum:["working","episodic","semantic"],default:"episodic"}}},response:R.memoryCreated}},async(r,s)=>{let n=e.safeParse(r.body);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:S.prettifyError(n.error)});let{roleId:a,content:i,type:c,keywords:l,importance:d,tier:m}=n.data;if(!qt(a))return s.status(404).send({code:"NOT_FOUND",message:"Role or agent not found"});let h;try{h=await Tt(i)}catch{}let I=`mem-${Ro().slice(0,8)}`,y=Date.now();xs({id:I,roleId:a,type:c,content:i,embedding:h,keywords:l,importance:d,sourceType:"manual",createdAt:y,lastAccessed:y,retrievedCount:0,tier:m??"episodic"});let g=Ve(I),{embedding:P,...V}=g;return s.status(201).send({memory:V})});let t=S.object({content:S.string().min(1).optional(),type:S.enum(["event","thought","reflection"]).optional(),keywords:S.array(S.string()).optional(),importance:S.number().min(1).max(5).optional()});o.patch("/memories/:id",{schema:{tags:["Memories"],summary:"Update memory",description:"Update a memory's content, type, keywords, or importance. Embedding is regenerated if content changes.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{content:{type:"string",minLength:1},type:{type:"string",enum:["event","thought","reflection"]},keywords:{type:"array",items:{type:"string"}},importance:{type:"integer",minimum:1,maximum:5}}},response:R.memoryUpdated}},async(r,s)=>{let{id:n}=r.params;if(!Ve(n))return s.status(404).send({code:"NOT_FOUND",message:"Memory not found"});let i=t.safeParse(r.body);if(!i.success)return s.status(400).send({code:"VALIDATION_ERROR",message:S.prettifyError(i.error)});let c=i.data,l,d=!0;if(c.content)try{l=await Tt(c.content)}catch{d=!1}let m=Ds(n,{content:c.content,embedding:l,keywords:c.keywords,importance:c.importance,type:c.type});return{memoryId:n,updated:m,embeddingUpdated:d}}),o.delete("/memories/:id",{schema:{tags:["Memories"],summary:"Delete memory",description:"Delete a memory by ID.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.memoryDeleted}},async(r,s)=>{let{id:n}=r.params;return Ve(n)?(Fs(n),{memoryId:n,deleted:!0}):s.status(404).send({code:"NOT_FOUND",message:"Memory not found"})})}import{query as _o}from"@anthropic-ai/claude-agent-sdk";import{v4 as me}from"uuid";jn();le();var wo=new Set(["Read","Glob","Grep","LSP"]),So=new Set(["Edit","Write","NotebookEdit"]);function Pe(o,e){return async(t,r,{agentID:s})=>{if(wo.has(t))return{behavior:"allow",updatedInput:r};let n=o(s??"");if(So.has(t)){let a=is(t,r),i=A;if(a.length===0)return{behavior:"allow",updatedInput:r};let c={allowedPaths:n?.allowedPaths??[],deniedPaths:n?.deniedPaths??[]};for(let l of a){let d=cs(l,i,c);if(!d.allowed)return{behavior:"deny",message:`Path denied: ${d.reason}. Try an alternative within allowed paths.`}}return{behavior:"allow",updatedInput:r}}if(n?.disallowedTools?.includes(t))return{behavior:"deny",message:`Tool ${t} is not allowed for this role.`};if(e&&n?.approvalRequired?.length){let a=t==="Bash"?r.command??"":`${t} ${JSON.stringify(r)}`;for(let i of n.approvalRequired)try{if(new RegExp(i).test(a))return await e(t,r,i,s)}catch{}}return{behavior:"allow",updatedInput:r}}}function _e(o){return{SessionStart:[{hooks:[async e=>{if(!o.roleId)return{};let t=e.source,r=o.roleId==="role-chat-manager";if(!r&&t!=="startup"&&t!=="resume")return{};try{let{queryMemoryByTier:s}=await import("./memory-service-BKLZIRK6.js"),n=o.taskPrompt||"role context and recent interactions",a=r?["semantic","working"]:["semantic","episodic"],i=await s(o.roleId,n,a,{topK:5});if(i.length>0)return{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[Memory Context]
|
|
3
3
|
${i.map(d=>`- [${d.tier??"episodic"}] ${d.content}`).join(`
|
|
4
4
|
`)}
|
|
@@ -127,4 +127,4 @@ ${t}
|
|
|
127
127
|
ORDER BY usageCount DESC
|
|
128
128
|
LIMIT ?
|
|
129
129
|
`).all(o)}he();import{createSdkMcpServer as xo,tool as mn}from"@anthropic-ai/claude-agent-sdk";import{z as gn}from"zod";async function Do(o){let{listChannels:e}=await import("./channels-VEUBY2NZ.js"),t=e(),{listSessions:r}=await import("./session-manager-45LFTPBA.js"),s=[...r("active"),...r("archived")],n=t.find(c=>c.name.toLowerCase().includes(o.toLowerCase()));if(!n)return null;let i=s.find(c=>c.source.type==="channel"&&c.source.channelId===n.id&&c.source.chatId)?.source.chatId??n.config?.userId??"";return{channelId:n.id,chatId:i}}function Ee(o){return{content:[{type:"text",text:JSON.stringify(o)}]}}function fn(o){let e=o?B(o):void 0,t=[...ar(o),mn("list_channels","List all available channels. Use this to discover what channels can be used with send_to_channel.",{},async()=>{let{listChannels:r}=await import("./channels-VEUBY2NZ.js"),s=r();return Ee({channels:s.map(n=>({id:n.id,name:n.name,enabled:n.enabled,type:n.config?.type??"unknown"}))})}),mn("send_to_channel","Send a message to a connected channel by name. This role can only send to channels in its allowedChannels list (if configured).",{channelName:gn.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:gn.string().describe("The message content to send")},async r=>{if(e?.allowedChannels!==void 0){if(e.allowedChannels.length===0)return Ee({error:"This role is not allowed to send to any channels"});if(!e.allowedChannels.some(l=>l.toLowerCase()===r.channelName.toLowerCase()))return Ee({error:`Channel "${r.channelName}" is not in the allowed channels list for this role`})}let s=await Do(r.channelName);if(!s)return Ee({error:`Channel "${r.channelName}" not found or has no chatId available`});let{getOutboundGateway:n}=await import("./outbound-gateway-DZTXBUTP.js"),i=await n().send({channelId:s.channelId,chatId:s.chatId,content:r.message,messageType:"reply"});return Ee({success:i.success,channelName:r.channelName})})];return xo({name:"execution-tools",version:"1.0.0",tools:t})}var Q=O("execution"),xe=class{async execute(e,t){let r=Date.now(),s,n,a;H(e.id,{status:"running",startedAt:Date.now()}),f.emit({type:"task_status_change",taskId:e.id,oldStatus:e.status,newStatus:"running"}),Q.info({taskId:e.id,roleId:e.roleId},"ExecutionManager: starting task");try{let i=e.roleId?B(e.roleId):void 0,c=A;i&&(we(i),c=te(i.name));let l={taskId:e.id,prompt:e.prompt,roleName:i?.name,roleCagPrompt:i?.cagPrompt,allowedTools:i?.allowedTools},d=Bt(l),m=_e({currentTaskId:e.id,roleId:e.roleId,taskPrompt:e.prompt}),h=e.config.approvalTimeout??300,y=i?.preferences?.permissions,P=Pe(x=>({allowedPaths:y?.allowedPaths,deniedPaths:y?.deniedPaths,disallowedTools:i?.disallowedTools,approvalRequired:i?.approvalRequired??e.config.approvalRequired}),async(x,L,G,je)=>{let X=Fo(),ct=hs(je??e.roleId,e.prompt,"medium");if(ct)return Q.info({operationId:X,ruleId:ct.id,taskId:e.id},"Auto-approved by permanent rule"),{behavior:"allow",updatedInput:L};let Ne={steps:[{index:0,description:`${x}: ${JSON.stringify(L).slice(0,300)}`,toolsNeeded:[x],expectedOutput:"",riskLevel:"medium"}],requiredPermissions:{},overallRisk:"medium"};return gs({id:X,taskId:e.id,roleId:je??e.roleId,plan:Ne,status:"pending",createdAt:Date.now()}),f.emit({type:"plan_approval_request",taskId:e.id,planId:X,plan:Ne}),Q.info({taskId:e.id,operationId:X,toolName:x,matchedPattern:G},"Privilege escalation: awaiting user decision"),new Promise(dt=>{let On=setTimeout(()=>{Jt(),ys(X,"denied"),Q.warn({taskId:e.id,operationId:X},"Privilege escalation timed out, auto-denied"),dt({behavior:"deny",message:`Operation timed out after ${h}s. Auto-denied. Try a safer alternative that does not require approval.`})},h*1e3),Yt=ye=>{if(ye.planId===X)if(Jt(),ye.decision==="allow")Q.info({taskId:e.id,operationId:X,approvalType:ye.approvalType},"Operation authorized by user"),dt({behavior:"allow",updatedInput:L});else{let Fn=ye.reason?`Operation denied by user: ${ye.reason}. Try a safer alternative.`:"Operation denied by user. Try a safer alternative approach.";Q.info({taskId:e.id,operationId:X,reason:ye.reason??"no reason given"},"Operation denied by user"),dt({behavior:"deny",message:Fn})}},Jt=()=>{clearTimeout(On),f.off("plan_approval_decision",Yt)};f.on("plan_approval_decision",Yt)})}),V={...process.env,...Me(),DISABLE_TELEMETRY:"1",DISABLE_ERROR_REPORTING:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1",DISABLE_AUTOUPDATER:"1"},oe=e.config.maxBudgetUsd??5,$=e.config.maxTurns??100,ae=fn(e.roleId??""),Ie=i?.mcpServers??{},_=e.config.mcpServers??{},ie={...Ie,..._,"execution-tools":ae},ce=i?.additionalDirectories??[],ge=i?ur(i):[],fe=[e.config.workspacePath??process.cwd(),...ce.map(x=>x.path)].filter((x,L,G)=>G.indexOf(x)===L),it=Oo({prompt:e.prompt,options:{cwd:c,additionalDirectories:fe,systemPrompt:d,maxTurns:$,maxBudgetUsd:oe,allowedTools:i?.allowedTools,model:i?.model,mcpServers:ie,settingSources:i?.inheritUserSettings?["project","user"]:["project"],hooks:m,canUseTool:P,env:V,plugins:ge.map(x=>({type:"local",path:x})),stderr:x=>{x.trim()&&Q.debug({stderr:x.trim().slice(0,500)},"ExecutionManager SDK stderr")}}}),de="",b=0,F=()=>{Q.warn({taskId:e.id},"ExecutionManager: abort signal received")};t&&t.addEventListener("abort",F);try{for await(let x of it){let L=x;if(Q.debug({eventType:L.type,taskId:e.id},"ExecutionManager SDK event"),L.type==="result"&&typeof L.result=="string"&&(de=L.result),L.type==="result"&&b++,L.token_usage){let G=L.token_usage;G.input_tokens!==void 0&&G.output_tokens!==void 0&&(s={input:G.input_tokens,output:G.output_tokens}),G.cost_usd!==void 0&&(n=G.cost_usd)}}}finally{t&&t.removeEventListener("abort",F)}a=b;let J=Date.now()-r;return H(e.id,{status:"completed",result:de,completedAt:Date.now(),costUsd:n,tokenUsage:s,numTurns:a,totalDurationMs:J}),f.emit({type:"task_status_change",taskId:e.id,oldStatus:"running",newStatus:"completed"}),f.emit({type:"task_complete_event",taskId:e.id,result:de}),ge.length>0&&ln(e.id,ge,e.roleId),Q.info({taskId:e.id,durationMs:J,costUsd:n},"ExecutionManager: task completed"),{taskId:e.id,status:"completed",result:de,costUsd:n,tokenUsage:s,numTurns:a,durationMs:J}}catch(i){let c=i instanceof Error?i.message:String(i),l=Date.now()-r;return(c.includes("Prompt is too long")||c.includes("prompt is too long"))&&Q.warn({taskId:e.id,error:c},"Task prompt exceeds model context window \u2014 task failed"),H(e.id,{status:"failed",error:c,completedAt:Date.now(),totalDurationMs:l}),f.emit({type:"task_status_change",taskId:e.id,oldStatus:"running",newStatus:"failed"}),f.emit({type:"task_complete_event",taskId:e.id,error:c}),Q.error({taskId:e.id,error:i},"ExecutionManager: task failed"),{taskId:e.id,status:"failed",error:c,durationMs:l}}}};var Y=O("execution-pool"),De=class{slots;running=!1;pollTimeoutId=null;executor;constructor(e,t){this.slots=Array.from({length:e},(r,s)=>({index:s,taskId:null,abortController:null})),this.executor=t??new xe}async start(){if(this.running)return;this.running=!0,f.on("task_created",r=>{this.onTaskCreated(r.taskId)}),f.on("task_status_change",r=>{r.newStatus==="pending"&&this.pickupPendingTasks()});let t=W().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,t),Y.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let e of this.slots)e.abortController&&(e.abortController.abort(),e.taskId=null,e.abortController=null);Y.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let t=W().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,t)};async onTaskCreated(e){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let e=this.slots.find(i=>i.taskId===null);if(!e){Y.debug("No free slots available");return}let t=M("pending");if(t.length===0)return;let s=[...t].sort((i,c)=>i.createdAt-c.createdAt)[0];e.taskId=s.id,e.abortController=new AbortController;let n=e.index,a=s.id;Y.info({slotIndex:n,taskId:a},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(s,n).catch(i=>{Y.error({taskId:a,error:i},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(e,t){let r=this.slots[t];if(!r)return;let s="completed";try{f.emit({type:"execution_task_start",taskId:e.id,slotIndex:t});let n=await this.executor.execute(e,r.abortController?.signal);s=n.status,Y.info({taskId:e.id,status:n.status,slotIndex:t},"ExecutionPool: task finished")}finally{r.taskId=null,r.abortController=null,f.emit({type:"execution_task_end",taskId:e.id,slotIndex:t,status:s}),this.emitSlotChange(),this.runPostCompletion(e.id,e.roleId).catch(n=>{Y.error({taskId:e.id,error:n},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let e=this.slots.filter(r=>r.taskId!==null).length,t=M("pending");f.emit({type:"execution_slot_change",active:e,max:this.slots.length,queued:t.length})}async runPostCompletion(e,t){if(t){try{let{processTaskCompletion:r}=await import("./memory-extractor-GOISDQTO.js"),s=await r(e,t);s>0&&Y.debug({taskId:e,roleId:t,memoriesStored:s},"Post-completion: memories extracted")}catch(r){Y.error({taskId:e,roleId:t,error:r},"Post-completion: memory extraction failed")}try{let{processTaskReview:r}=await import("./learner-VMD5NQCD.js");await r(e)}catch(r){Y.error({taskId:e,roleId:t,error:r},"Post-completion: task review failed")}try{let{evaluateTaskCompletion:r}=await import("./monitor-K7CGTLA6.js");r(e,t)}catch(r){Y.error({taskId:e,roleId:t,error:r},"Post-completion: monitor evaluation failed")}}}getStatus(){let e=this.slots.filter(r=>r.taskId!==null).length,t=M("pending");return{active:e,max:this.slots.length,queued:t.length}}isHealthy(){return this.running}releaseSlot(e){let t=this.slots.find(r=>r.taskId===e);t&&(Y.warn({taskId:e,slotIndex:t.index},"ExecutionPool: force-releasing slot"),t.abortController&&t.abortController.abort(),t.taskId=null,t.abortController=null,this.emitSlotChange(),this.running&&this.pickupPendingTasks())}};import{v4 as Ut}from"uuid";var Wt=O("message-handler");async function jo(o,e){if(!(await import("./config-Y4QWELO3.js").then(s=>s.getChatConfig())).autoTitle)return;let r=["Generate a very short title (max 50 characters) for a chat session that started with this message:",`"${e.slice(0,200)}"`,"Respond with only the title, no quotes or explanation."].join(`
|
|
130
|
-
`);try{let n=(await Zs(r,"You are a concise title generator. Reply with only the title, max 50 characters.")).trim().slice(0,50);n.length>0&&Ts(o,{title:n})}catch{}}var Vt=null;function yn(o){Vt=o}async function Xe(o,e,t,r){let s;r&&(s=K(r)),s||(s=Hs(e)),s||(s=Ge(e,t));let n=Ut(),a={id:n,sessionId:s.id,role:"user",content:o,source:e,createdAt:Date.now()};if(se(a),f.emit({type:"chat_message",sessionId:s.id,message:a}),s.messageCount===0&&jo(s.id,o),re(s.id),Pt(s.id),Vt){let i=s.id,c=s.source;(async()=>{try{let l=await Vt.handleMessage(o,i,e),d={id:Ut(),sessionId:i,role:"assistant",content:l,source:e,createdAt:Date.now()};se(d),f.emit({type:"chat_message",sessionId:i,message:d}),re(i),Pt(i),c.type==="channel"&&c.channelId&&c.chatId&&(Wt.info({sessionId:i,sourceType:c.type,hasChannelId:!!c.channelId,hasResponse:!!l},"Chat response ready, checking channel delivery"),No(c.channelId,c.chatId,l))}catch(l){(await import("./logger-BEG4WFIM.js")).getLogger("message-handler").error({error:l,sessionId:i},"ChatManager response failed");let m={id:Ut(),sessionId:i,role:"assistant",content:`\u26A0\uFE0F \u5904\u7406\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`,source:e,createdAt:Date.now()};se(m),f.emit({type:"chat_message",sessionId:i,message:m}),re(i)}})()}return{sessionId:s.id,messageId:n}}async function No(o,e,t){Wt.info({channelId:o,chatId:e.slice(0,12)},"Delivering chat response to channel");try{let{getOutboundGateway:r}=await import("./outbound-gateway-DZTXBUTP.js");await r().send({channelId:o,chatId:e,content:t,messageType:"reply"})}catch(r){Wt.error({error:r,channelId:o,chatId:e.slice(0,12)},"Channel delivery failed (non-fatal)")}}import{z as v}from"zod/v4";import{v4 as Lo}from"uuid";var hn=v.union([v.object({type:v.literal("session"),sessionId:v.string()}),v.object({type:v.literal("channel"),channelId:v.string(),chatId:v.string().optional()})]),qo=v.object({id:v.string(),prompt:v.string(),dependsOn:v.array(v.string()).optional(),outputAs:v.string().optional()}),Mo=v.object({type:v.enum(["cron","manual","event","once"]),cron:v.string().optional(),event:v.string().optional(),runAt:v.string().optional()}),$t=v.object({name:v.string().min(1),description:v.string().optional(),trigger:Mo,steps:v.array(qo).min(1),rolePreference:v.string().optional(),config:v.record(v.string(),v.unknown()).optional(),enabled:v.boolean().default(!0),goalIds:v.array(v.string()).optional(),deliverTo:v.array(hn).optional(),reportTo:v.array(hn).optional()}),dd=$t.transform(o=>({...o,deliverTo:o.deliverTo,reportTo:o.reportTo})),Bo=$t.partial().transform(o=>({...o,deliverTo:o.deliverTo,reportTo:o.reportTo})),Ze=v.object({id:v.string().min(1)});async function bn(o,e){o.post("/task-templates",{schema:{tags:["Templates"],summary:"Create a task template",description:"Create a new task template with trigger (cron/manual/event) and execution steps. Cron-triggered templates are automatically scheduled.",body:{type:"object",required:["name","trigger","steps"],properties:{name:{type:"string",minLength:1},description:{type:"string"},trigger:{type:"object",required:["type"],properties:{type:{type:"string",enum:["cron","manual","event","once"]},cron:{type:"string",description:"Cron expression (required when type is cron)"},event:{type:"string",description:"Event name (required when type is event)"},runAt:{type:"string",description:"ISO 8601 timestamp (required when type is once)"}}},steps:{type:"array",minItems:1,items:{type:"object",required:["id","prompt"],properties:{id:{type:"string"},prompt:{type:"string"},dependsOn:{type:"array",items:{type:"string"}},outputAs:{type:"string"}}}},rolePreference:{type:"string"},config:{type:"object",additionalProperties:!0},enabled:{type:"boolean",default:!0},goalIds:{type:"array",items:{type:"string"}},deliverTo:{type:"array",items:{type:"object"}},reportTo:{type:"array",items:{type:"object"}}}},response:R.templateCreated}},async(t,r)=>{let s=$t.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n={id:Lo(),...s.data,createdAt:Date.now()};return Ls(n),n.enabled&&n.trigger.type==="cron"&&n.trigger.cron?await e.scheduleJob(n.id):n.enabled&&n.trigger.type==="once"&&n.trigger.runAt&&e.scheduleOnceJob(n.id),r.status(201).send({templateId:n.id})}),o.get("/task-templates",{schema:{tags:["Templates"],summary:"List task templates",description:"List all task templates, optionally filtering to enabled-only.",querystring:{type:"object",properties:{enabled:{type:"string",enum:["true","false"],description:"Filter to enabled templates only when 'true'"}}},response:R.templateList}},async t=>{let s=t.query.enabled==="true";return{templates:Ms(s)}}),o.get("/task-templates/:id",{schema:{tags:["Templates"],summary:"Get task template by ID",description:"Retrieve a single task template by its ID.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateDetail}},async(t,r)=>{let s=Ze.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n=ne(s.data.id);return n?{template:n}:r.status(404).send({code:"NOT_FOUND",message:"Template not found"})}),o.patch("/task-templates/:id",{schema:{tags:["Templates"],summary:"Update a task template",description:"Partially update a task template. Cron schedules are automatically rescheduled if the trigger changes.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{name:{type:"string",minLength:1},description:{type:"string"},trigger:{type:"object",properties:{type:{type:"string",enum:["cron","manual","event","once"]},cron:{type:"string"},event:{type:"string"},runAt:{type:"string"}}},steps:{type:"array",items:{type:"object"}},rolePreference:{type:"string"},config:{type:"object",additionalProperties:!0},enabled:{type:"boolean"},goalIds:{type:"array",items:{type:"string"}},deliverTo:{type:"array",items:{type:"object"}},reportTo:{type:"array",items:{type:"object"}}}},response:R.templateUpdated}},async(t,r)=>{let s=Ze.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n=Bo.safeParse(t.body);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(n.error)});if(!ne(s.data.id))return r.status(404).send({code:"NOT_FOUND",message:"Template not found"});qs(s.data.id,n.data),await e.unscheduleJob(s.data.id);let i=ne(s.data.id);return i?.enabled&&i.trigger.type==="cron"&&i.trigger.cron?await e.scheduleJob(i.id):i?.enabled&&i.trigger.type==="once"&&i.trigger.runAt&&e.scheduleOnceJob(i.id),{templateId:s.data.id}}),o.delete("/task-templates/:id",{schema:{tags:["Templates"],summary:"Delete a task template",description:"Delete a task template by ID. Cron jobs are automatically unscheduled.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateDeleted}},async(t,r)=>{let s=Ze.safeParse(t.params);return s.success?ne(s.data.id)?(await e.unscheduleJob(s.data.id),Bs(s.data.id),{templateId:s.data.id,deleted:!0}):r.status(404).send({code:"NOT_FOUND",message:"Template not found"}):r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)})}),o.post("/task-templates/:id/run",{schema:{tags:["Templates"],summary:"Run a task template",description:"Manually trigger execution of a task template regardless of its trigger type.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateRun}},async(t,r)=>{let s=Ze.safeParse(t.params);return s.success?ne(s.data.id)?{executionId:await e.runNow(s.data.id),status:"started"}:r.status(404).send({code:"NOT_FOUND",message:"Template not found"}):r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)})})}import{z as E}from"zod/v4";Es();var Gt=E.object({id:E.string().min(1)}),Uo=E.object({scope:E.enum(["user","project"]).optional(),cwd:E.string().optional()}),Wo=E.object({scope:E.enum(["user","project"]).optional(),cwd:E.string().optional()});async function vn(o){o.get("/plugins",{schema:{tags:["Plugins"],summary:"List all installed plugins",querystring:{type:"object",properties:{scope:{type:"string",enum:["user","project","local"]}}}}},async t=>{let r=t.query,s=We({scope:r.scope}),n=St();return{plugins:s.map(a=>({...a,globalEnabled:n[a.id]??a.enabled}))}}),o.get("/plugins/:id",{schema:{tags:["Plugins"],summary:"Get plugin by ID",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});let n=Ps(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Plugin not found"});let a=Cs(n.installPath),i=St();return{plugin:{...n,globalEnabled:i[n.id]??n.enabled,manifest:a}}}),o.post("/plugins/:id/enable",{schema:{tags:["Plugins"],summary:"Enable a plugin globally",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude CLI not found. Plugin enable/disable requires the Claude Agent SDK CLI."});try{return lr(s.data.id),{pluginId:s.data.id,enabled:!0}}catch(n){return r.status(500).send({code:"CLI_ERROR",message:n instanceof Error?n.message:"Enable failed"})}}),o.post("/plugins/:id/disable",{schema:{tags:["Plugins"],summary:"Disable a plugin globally",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude CLI not found. Plugin enable/disable requires the Claude Agent SDK CLI."});try{return pr(s.data.id),{pluginId:s.data.id,enabled:!1}}catch(n){return r.status(500).send({code:"CLI_ERROR",message:n instanceof Error?n.message:"Disable failed"})}}),o.get("/plugins/stats",{schema:{tags:["Plugins"],summary:"Get plugin usage statistics",querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50}}}}},async t=>{let r=t.query;return{stats:un(r.limit??50)}});let e=E.object({roleId:E.string().min(1)});o.get("/plugins/stats/role/:roleId",{schema:{tags:["Plugins"],summary:"Get plugin usage by role",params:{type:"object",required:["roleId"],properties:{roleId:{type:"string"}}}}},async(t,r)=>{let s=e.safeParse(t.params);return s.success?{roleId:s.data.roleId,stats:pn(s.data.roleId)}:r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)})}),o.get("/plugins/marketplace",{schema:{tags:["Marketplace"],summary:"List available marketplace plugins"}},async(t,r)=>{if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found. Install Claude Code to use marketplace features."});try{let s=ir();return{available:s.available,installed:s.installed}}catch(s){return r.status(500).send({code:"CLI_ERROR",message:s instanceof Error?s.message:"CLI command failed"})}}),o.get("/plugins/marketplaces",{schema:{tags:["Marketplace"],summary:"List known marketplace sources"}},async()=>({sources:_s()})),o.post("/plugins/install/:name",{schema:{tags:["Marketplace"],summary:"Install a plugin",params:{type:"object",required:["name"],properties:{name:{type:"string"}}},body:{type:"object",properties:{scope:{type:"string",enum:["user","project"]},cwd:{type:"string"}}}}},async(t,r)=>{let n=E.object({name:E.string().min(1)}).safeParse(t.params);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(n.error)});let a=Uo.safeParse(t.body??{});if(!a.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(a.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found"});try{return cr(n.data.name,a.data.scope??"user",a.data.cwd),{success:!0,pluginId:n.data.name}}catch(i){return r.status(500).send({code:"CLI_ERROR",message:i instanceof Error?i.message:"Install failed"})}}),o.post("/plugins/uninstall/:name",{schema:{tags:["Marketplace"],summary:"Uninstall a plugin",params:{type:"object",required:["name"],properties:{name:{type:"string"}}},body:{type:"object",properties:{scope:{type:"string",enum:["user","project"]},cwd:{type:"string"}}}}},async(t,r)=>{let n=E.object({name:E.string().min(1)}).safeParse(t.params);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(n.error)});let a=Wo.safeParse(t.body??{});if(!a.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(a.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found"});try{return dr(n.data.name,a.data.scope,a.data.cwd),{success:!0,pluginId:n.data.name}}catch(i){return r.status(500).send({code:"CLI_ERROR",message:i instanceof Error?i.message:"Uninstall failed"})}})}import{z as Ht}from"zod/v4";var Vo=Ht.object({name:Ht.string().min(1)}),$o="x-api-key";async function Rn(o,e,t){o.post("/webhooks/:name",{schema:{tags:["Webhooks"],summary:"Trigger a webhook",description:"Trigger a task template execution by name or ID. Requires X-API-Key header if API key is configured.",security:[{apiKey:[]}],params:{type:"object",required:["name"],properties:{name:{type:"string",description:"Template name or ID"}}},response:R.webhookTriggered}},async(r,s)=>{if(t&&r.headers[$o]!==t)return s.status(401).send({code:"UNAUTHORIZED",message:"Invalid or missing API key"});let n=Vo.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:Ht.prettifyError(n.error)});let{name:a}=n.data,i=ne(a);if(!i){let{listTaskTemplates:c}=await import("./task-templates-7LSQ6OST.js");i=c(!1).find(d=>d.name===a||d.id===a)}if(!i)return s.status(404).send({code:"NOT_FOUND",message:`Template '${a}' not found`});if(!i.enabled)return s.status(409).send({code:"DISABLED",message:`Template '${a}' is disabled`});try{let c=await e.runNow(i.id);return s.status(202).send({code:"ACCEPTED",message:`Template '${i.name}' triggered`,executionId:c,templateId:i.id})}catch(c){let l=c instanceof Error?c.message:String(c);return s.status(500).send({code:"EXECUTION_ERROR",message:l})}}),o.get("/webhooks",{schema:{tags:["Webhooks"],summary:"List available webhooks",description:"List all enabled task templates that can be triggered via webhook, along with auth requirements.",response:R.webhookList}},async()=>{let{listTaskTemplates:r}=await import("./task-templates-7LSQ6OST.js");return{webhooks:r(!0).map(n=>({name:n.id,displayName:n.name,description:n.description,tags:n.tags,trigger:`POST /webhooks/${n.id}`})),auth:t?"X-API-Key header required":"No auth configured"}})}import{z as k}from"zod/v4";var Go=k.object({status:k.string().optional(),limit:k.coerce.number().min(1).max(100).default(20),offset:k.coerce.number().min(0).default(0)}),et=k.union([k.object({type:k.literal("session"),sessionId:k.string()}),k.object({type:k.literal("channel"),channelId:k.string(),chatId:k.string().optional()})]),Ho=k.object({input:k.string().min(1,"goal input is required"),deliverTo:k.array(et).optional(),reportTo:k.array(et).optional()}),In=k.object({id:k.string().min(1)}),Ko=k.object({name:k.string().min(1).optional(),description:k.string().optional(),status:k.enum(["active","paused","completed","failed"]).optional(),currentValue:k.number().optional(),budgetUsd:k.number().min(0).optional(),deliverTo:k.array(et).optional(),reportTo:k.array(et).optional()});async function kn(o){o.get("/goals",{schema:{tags:["Goals"],summary:"List goals",description:"List goals with optional status filter and pagination.",querystring:{type:"object",properties:{status:{type:"string",description:"Filter by goal status"},limit:{type:"integer",minimum:1,maximum:100,default:20},offset:{type:"integer",minimum:0,default:0}}},response:R.goalList}},async(e,t)=>{let r=Go.safeParse(e.query);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let{status:s,limit:n,offset:a}=r.data;return{goals:Us(s,n,a)}}),o.get("/goals/:id",{schema:{tags:["Goals"],summary:"Get goal by ID",description:"Retrieve a single goal by its ID, including metric tree and progress.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.goalDetail}},async(e,t)=>{let r=pe(e.params.id);return r?{goal:r}:t.status(404).send({code:"NOT_FOUND",message:"Goal not found"})}),o.post("/goals",{schema:{tags:["Goals"],summary:"Create a goal",description:"Create a new goal from a natural language input. The input is parsed, validated, and a metric tree is built.",body:{type:"object",required:["input"],properties:{input:{type:"string",minLength:1,description:"Natural language goal description"},deliverTo:{type:"array",items:{type:"object"},description:"Delivery targets (result output)"},reportTo:{type:"array",items:{type:"object"},description:"Report targets (status notifications)"}}},response:R.goalCreated}},async(e,t)=>{let r=Ho.safeParse(e.body);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let s=await er(r.data.input);if(!s.validationResult.isValid)return t.status(400).send({code:"INVALID_GOAL",errors:s.validationResult.errors,warnings:s.validationResult.warnings});let n=tr(s.goalState,r.data.deliverTo,r.data.reportTo);return sr(n.id,n.metricType),t.status(201).send({goal:n})}),o.patch("/goals/:id",{schema:{tags:["Goals"],summary:"Update a goal",description:"Partially update a goal's name, description, status, currentValue, or budgetUsd.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{name:{type:"string",minLength:1},description:{type:"string"},status:{type:"string"},currentValue:{type:"number"},budgetUsd:{type:"number",minimum:0},deliverTo:{type:"array",items:{type:"object"},description:"Delivery targets (result output)"},reportTo:{type:"array",items:{type:"object"},description:"Report targets (status notifications)"}}},response:R.goalDetail}},async(e,t)=>{let r=In.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let s=Ko.safeParse(e.body);return s.success?pe(r.data.id)?($e(r.data.id,{...s.data,updatedAt:Date.now()}),{goal:pe(r.data.id)}):t.status(404).send({code:"NOT_FOUND",message:"Goal not found"}):t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(s.error)})}),o.delete("/goals/:id",{schema:{tags:["Goals"],summary:"Delete a goal",description:"Delete a goal by ID.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(e,t)=>{let r=In.safeParse(e.params);return r.success?pe(r.data.id)?(Ws(r.data.id),{goalId:r.data.id,deleted:!0}):t.status(404).send({code:"NOT_FOUND",message:"Goal not found"}):t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)})})}import{z as Oe}from"zod/v4";var zo=Oe.object({role:Oe.string().optional(),taskType:Oe.string().optional(),limit:Oe.coerce.number().min(1).max(100).default(50)});async function Tn(o){o.get("/strategies",{schema:{tags:["Strategies"],summary:"List strategies",description:"List agent strategies with optional role/taskType filter. Returns evolutionary strategy entries used for agent routing.",querystring:{type:"object",properties:{role:{type:"string",description:"Filter by role ID"},taskType:{type:"string",description:"Filter by task type"},limit:{type:"integer",minimum:1,maximum:100,default:50}}},response:R.strategyList}},async(e,t)=>{let r=zo.safeParse(e.query);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:Oe.prettifyError(r.error)});let{role:s,taskType:n,limit:a}=r.data,i;return s&&n?i=or.getStrategies(s,n):s?i=nr(s):i=rr(a),{strategies:i.slice(0,a)}})}async function wn(o){o.get("/config",{schema:{tags:["Config"],summary:"Get current configuration",description:"Returns the current server configuration with runtime-mutable vs restart-required indication for each setting.",response:R.configGet}},async(e,t)=>{let r=W(),s=[...Le,...lt],n={},a=new Set(["anthropic.apiKey","server.apiKey"]);for(let i of s){let c=pt(r,i),l=Le.includes(i);a.has(i)&&typeof c=="string"&&c.length>0&&(c=c.slice(0,5)+"****"),n[i]={value:c??null,mutable:l}}return{config:n,mutable:[...Le],restartRequired:[...lt]}}),o.patch("/config",{schema:{tags:["Config"],summary:"Update runtime-mutable configuration",description:"Updates configuration values that can be changed at runtime. Restart-required settings are rejected but valid mutable changes are still applied (partial success).",response:R.configPatch}},async(e,t)=>{let r=e.body;if(!r||typeof r!="object")return t.status(400).send({success:!1,updated:[],errors:["Request body must be a JSON object with config key-value pairs"],message:"Validation error"});let s=Zt(r,_t);if(s.updated.includes("logging.level")){let n=r["logging.level"];typeof n=="string"&&Be(n)}if(s.updated.length>0){let n=W(),a=s.updated.map(i=>({path:i,value:pt(n,i)}));f.emit({type:"config_changed",changes:a})}return{success:s.errors.length===0,updated:s.updated,errors:s.errors,message:s.errors.length===0?`Updated ${s.updated.length} configuration value(s)`:`Updated ${s.updated.length} value(s); ${s.errors.length} rejected (restart required)`}}),o.get("/config/env-diff",async()=>{let e=Ke();return{diffs:_r(e),envFileExists:Et()!==null}}),o.post("/config/sync-to-env",async()=>{let e=Ke();return{success:!0,changed:Ar(e)}}),o.post("/config/load-from-env",async()=>{let e=Et();if(!e)return{success:!1,error:".env file not found"};let t=0;for(let[r,s]of Object.entries(e)){let n=Object.entries(Pr).find(([,a])=>a===r)?.[0];n&&(_t(n,s),t++)}return qe(Ke),{success:!0,updated:t}})}async function Sn(o){o.get("/evolution-audit",{schema:{tags:["Evolution"],summary:"List evolution audit records",description:"Returns evolution audit log entries with optional role filter.",querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:100,default:20},offset:{type:"integer",minimum:0,default:0},roleId:{type:"string"}}}}},async(e,t)=>{let{limit:r=20,offset:s=0,roleId:n}=e.query;return n?br(n,r,s):hr(r,s)})}import{z as T}from"zod/v4";var Qo=["active","archived"],Yo=T.object({source:T.object({type:T.enum(["tui","web","api","channel"]),channelId:T.string().optional(),chatId:T.string().optional()}),roleId:T.string().optional()}),Fe=T.object({id:T.string().uuid()}),Jo=T.object({status:T.enum(Qo).optional(),limit:T.coerce.number().min(1).max(100).default(100),offset:T.coerce.number().min(0).default(0)}),Xo=T.object({limit:T.coerce.number().min(1).max(200).default(50),offset:T.coerce.number().min(0).default(0)});async function Cn(o){o.post("/chat/sessions",{schema:{tags:["Chat"],summary:"Create a chat session",body:{type:"object",required:["source"],properties:{source:{type:"object",required:["type"],properties:{type:{type:"string",enum:["tui","web","api","channel"]},channelId:{type:"string"},chatId:{type:"string"}}},roleId:{type:"string"}}}}},async(t,r)=>{let s=Yo.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{source:n,roleId:a}=s.data,i=Ge(n,a);return r.status(201).send({session:i})}),o.get("/chat/sessions",{schema:{tags:["Chat"],summary:"List chat sessions",querystring:{type:"object",properties:{status:{type:"string",enum:["active","archived"]},limit:{type:"integer",minimum:1,maximum:100,default:100},offset:{type:"integer",minimum:0,default:0}}}}},async(t,r)=>{let s=Jo.safeParse(t.query);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{status:n}=s.data;return{sessions:Ys(n)}}),o.get("/chat/sessions/:id",{schema:{tags:["Chat"],summary:"Get chat session with messages",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Session not found"});let a=wt(n.id);return{session:n,messages:a}}),o.post("/chat/sessions/:id/archive",{schema:{tags:["Chat"],summary:"Archive a chat session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);return n?(Ks(n.id),{sessionId:n.id,status:"archived"}):r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.post("/chat/sessions/:id/restore",{schema:{tags:["Chat"],summary:"Restore an archived session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=zs(s.data.id);return n?{session:n}:r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.delete("/chat/sessions/:id",{schema:{tags:["Chat"],summary:"Delete a chat session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);return n?(Qs(n.id),r.status(204).send()):r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.get("/chat/sessions/:id/messages",{schema:{tags:["Chat"],summary:"Get messages for a session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50},offset:{type:"integer",minimum:0,default:0}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Session not found"});let a=Xo.safeParse(t.query),{limit:i=50,offset:c=0}=a.success?a.data:{};return{messages:wt(n.id,i,c)}});let e=T.object({content:T.string().min(1,"content is required"),source:T.object({type:T.enum(["tui","web","api","channel"]),channelId:T.string().optional(),chatId:T.string().optional()}),roleId:T.string().optional(),sessionId:T.string().uuid().optional()});o.post("/chat/messages",{schema:{tags:["Chat"],summary:"Send a chat message",description:"Send a message. Creates a session if no active session exists for the source. Returns sessionId, messageId, and response.",body:{type:"object",required:["content","source"],properties:{content:{type:"string",minLength:1},source:{type:"object",required:["type"],properties:{type:{type:"string",enum:["tui","web","api","channel"]},channelId:{type:"string"},chatId:{type:"string"}}},roleId:{type:"string"},sessionId:{type:"string"}}}}},async(t,r)=>{let s=e.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{content:n,source:a,roleId:i,sessionId:c}=s.data,l=await Xe(n,a,i,c);return r.status(201).send(l)})}var Zo=O("ws"),tt=new Set,st=[],ea=50;function ta(o){st.push(o),st.length>ea&&st.shift()}function Re(o){ta(o);let e=JSON.stringify(o);for(let t of tt)t.readyState===1&&t.send(e)}function Pn(o){o.get("/chat/stream",{websocket:!0},(e,t)=>{tt.add(e);for(let r of st)e.readyState===1&&e.send(JSON.stringify(r));e.on("close",()=>{tt.delete(e)}),e.on("error",r=>{Zo.error({error:r},"Chat WebSocket error"),tt.delete(e)})}),f.on("session_created",e=>Re(e)),f.on("session_archived",e=>Re(e)),f.on("session_restored",e=>Re(e)),f.on("session_deleted",e=>Re(e)),f.on("chat_message",e=>Re(e)),f.on("task_complete_event",e=>Re(e))}var U=O("channels"),rt=class{adapters=new Map;rateLimits=new Map;healthInterval;rateLimitPerMinute;constructor(e){this.rateLimitPerMinute=e?.rateLimitPerMinute??60}async addChannel(e,t){this.adapters.set(e.id,t),t.onMessage(r=>{this.handleInbound(e.id,r)}),e.enabled&&await this.connectChannel(e.id)}async removeChannel(e){let t=this.adapters.get(e);if(t){try{await t.disconnect()}catch(r){U.error({channelId:e,error:r},"Error disconnecting channel")}this.adapters.delete(e),this.rateLimits.delete(e)}}async connectChannel(e){let t=this.adapters.get(e);if(!t)throw new Error(`No adapter registered for channel ${e}`);try{be(e,"connecting"),await t.connect(),be(e,"connected"),U.info({channelId:e,platform:t.platform},"Channel connected")}catch(r){throw be(e,"error"),U.error({channelId:e,error:r},"Failed to connect channel"),r}}async disconnectChannel(e){let t=this.adapters.get(e);if(t)try{await t.disconnect(),be(e,"disconnected"),U.info({channelId:e},"Channel disconnected")}catch(r){U.error({channelId:e,error:r},"Error disconnecting channel")}}getChannelStatus(e){let t=this.adapters.get(e);return t?t.getStatus():"disconnected"}getChannelStatuses(){let e=new Map;for(let[t,r]of this.adapters)e.set(t,r.getStatus());return e}hasAdapter(e){return this.adapters.has(e)}async sendMessage(e,t,r){let s=this.adapters.get(e);if(!s)return U.warn({channelId:e},"No adapter for outbound message"),null;if(!this.checkRateLimit(e))return U.warn({channelId:e},"Rate limit exceeded, dropping outbound message"),null;try{return await s.sendMessage(t,r)}catch(n){return U.error({channelId:e,chatId:t,error:n},"Failed to send outbound message"),null}}checkRateLimit(e){let t=Date.now(),r=this.rateLimits.get(e);return!r||t-r.windowStart>=6e4?(this.rateLimits.set(e,{count:1,windowStart:t}),!0):r.count>=this.rateLimitPerMinute?!1:(r.count++,!0)}async handleInbound(e,t){if(t.source==="system"){U.debug({channelId:e},"Skipping system message (anti-loop)");return}try{let{isRecentlySent:s}=await import("./outbound-gateway-DZTXBUTP.js"),n=t.channelMessageId??t.raw?.MsgId??"";if(n&&s(String(n))){U.debug({channelId:e,messageId:n},"Skipping delivery-sent message (anti-loop)");return}}catch{}if(!this.checkRateLimit(e)){U.warn({channelId:e,senderId:t.senderId},"Rate limit exceeded for inbound message");return}try{let{handleInboundForApproval:s}=await import("./approval-handler-HK7GQPHU.js");if(await s(e,t.chatId,t.content)){U.debug({channelId:e,chatId:t.chatId},"Inbound message consumed as approval reply");return}}catch{}let r=Gs(e);if(r?.allowedChatIds&&!r.allowedChatIds.includes(t.chatId)){U.debug({channelId:e,chatId:t.chatId},"Chat not in allowlist, ignoring");return}try{let s=await Xe(t.content,{type:"channel",channelId:e,chatId:t.chatId},r?.linkedRoleId);U.info({channelId:e,chatId:t.chatId,sessionId:s.sessionId},"Inbound message routed to session")}catch(s){U.error({channelId:e,chatId:t.chatId,error:s},"Failed to route inbound message")}}startHealthMonitor(e=3e4){this.stopHealthMonitor(),this.healthInterval=setInterval(()=>{this.checkHealth()},e)}stopHealthMonitor(){this.healthInterval&&(clearInterval(this.healthInterval),this.healthInterval=void 0)}checkHealth(){for(let[e,t]of this.adapters){let r=t.getStatus();try{be(e,r)}catch{}}}async startAll(){let e=Se(!0);for(let t of e){let r=this.adapters.get(t.id);if(r&&r.getStatus()!=="connected")try{await this.connectChannel(t.id)}catch{}}this.startHealthMonitor()}async stopAll(){this.stopHealthMonitor();for(let e of this.adapters.keys())await this.disconnectChannel(e);this.adapters.clear(),this.rateLimits.clear()}_getAdapterCount(){return this.adapters.size}_getRateLimitEntry(e){return this.rateLimits.get(e)}};ke();var Z=O("watchdog"),nt=null;function _n(o,e,t,r){if(!o.enabled){Z.info("Watchdog disabled");return}let s=o.intervalMinutes*6e4;Z.info({intervalMinutes:o.intervalMinutes},"Watchdog started"),nt=setInterval(()=>{sa(o,e,t,r)},s)}function An(){nt&&(clearInterval(nt),nt=null,Z.info("Watchdog stopped"))}function sa(o,e,t,r){let{rules:s}=o;if(s.managerHealthCheck.enabled){let n=s.managerHealthCheck.staleDurationMinutes*6e4,a=e.getLastActivityAt();if(Date.now()-a>n){let i=`ChatManager session stale (no activity for ${s.managerHealthCheck.staleDurationMinutes} min)`;if(Z.warn(i),s.managerHealthCheck.action==="restart"){let c=e.getConsecutiveStaleCount()>0;e.restartSession(),c&&(Z.fatal("ChatManager unrecoverable after session restart \u2014 exiting for supervisor restart"),process.exit(1))}else s.managerHealthCheck.action==="notify"&&r(i)}}if(!t.isHealthy()){let n="ExecutionPool is not healthy (stopped unexpectedly)";Z.warn(n),r(n)}if(s.staleTasks.enabled){let n=s.staleTasks.maxPendingMinutes*6e4,i=M("pending").filter(c=>Date.now()-c.createdAt>n);if(i.length>0){let c=`${i.length} stale task(s) pending > ${s.staleTasks.maxPendingMinutes} min`;Z.warn({count:i.length},c),s.staleTasks.action==="notify"&&r(c)}}if(s.staleRunningTasks?.enabled){let n=s.staleRunningTasks.maxRunningMinutes*6e4,i=M("running").filter(c=>{if(!c.startedAt||Date.now()-c.startedAt<n)return!1;try{let h=q().prepare("SELECT MAX(timestamp) as latest FROM step_logs WHERE task_id = ?").get(c.id)?.latest??c.startedAt;return Date.now()-h>n}catch{return!0}});if(i.length>0){let c=`${i.length} task(s) running with no activity for > ${s.staleRunningTasks.maxRunningMinutes} min \u2014 marking as failed`;Z.warn({count:i.length,taskIds:i.map(l=>l.id)},c);for(let l of i)H(l.id,{status:"failed",error:`Watchdog timeout: no activity for > ${s.staleRunningTasks.maxRunningMinutes} min`,completedAt:Date.now()}),f.emit({type:"task_status_change",taskId:l.id,oldStatus:"running",newStatus:"failed"}),t.releaseSlot(l.id);r(c)}}if(s.dbMaintenance.enabled)try{let a=q().pragma("wal_checkpoint(PASSIVE)");Z.debug({walSize:a},"WAL checkpoint")}catch(n){Z.error({error:n},"DB health check failed")}}import{z as N}from"zod";import{v4 as ra}from"uuid";var na=N.object({eventType:N.enum(["task_complete","task_error","plan_approval_request","*"]),matchCriteria:N.object({templateId:N.string().optional(),roleId:N.string().optional(),promptPattern:N.string().optional(),taskStatus:N.string().optional()}).optional().default({}),target:N.object({type:N.enum(["channel","webhook"]),channelId:N.string().optional(),chatId:N.string().optional(),webhookUrl:N.string().optional()}),formatTemplate:N.string().optional(),maxPerMinute:N.number().int().min(1).max(60).optional().default(5),skipOriginChannel:N.boolean().optional().default(!0),enabled:N.boolean().optional().default(!0)});async function Kt(o){o.get("/delivery-rules",async(e,t)=>gr()),o.post("/delivery-rules",async(e,t)=>{let r=na.safeParse(e.body);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:N.prettifyError(r.error)});let s=r.data,n={id:ra(),eventType:s.eventType,matchCriteria:s.matchCriteria,target:s.target,formatTemplate:s.formatTemplate,maxPerMinute:s.maxPerMinute,skipOriginChannel:s.skipOriginChannel,enabled:s.enabled,createdAt:Date.now()};return mr(n),t.status(201).send(n)}),o.put("/delivery-rules/:id",async(e,t)=>{if(!He(e.params.id))return t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"});let s=e.body;return fr(e.params.id,s),{id:e.params.id,updated:!0}}),o.delete("/delivery-rules/:id",async(e,t)=>He(e.params.id)?(yr(e.params.id),{id:e.params.id,deleted:!0}):t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"})),o.get("/delivery-rules/:id/log",async(e,t)=>ms(e.params.id)),o.post("/delivery-rules/:id/test",async(e,t)=>{let r=He(e.params.id);if(!r)return t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"});let{getDeliveryEngine:s}=await import("./engine-DEBMZJBM.js"),n=s();if(!n)return t.status(503).send({code:"ENGINE_NOT_READY",message:"DeliveryEngine not initialized"});let a=`[TEST] Delivery rule test at ${new Date().toISOString()}`,{createDeliveryLog:i}=await import("./delivery-log-VYTYUFCK.js"),{v4:c}=await import("uuid"),{TTL_MS:l}=await import("./delivery-log-VYTYUFCK.js"),d={id:c(),ruleId:r.id,status:"pending",target:r.target,content:a,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+l};i(d);try{return await n.attemptDeliveryPublic(d,r),{id:d.id,ruleId:r.id,status:"sent",content:a}}catch(m){let h=m instanceof Error?m.message:String(m);return t.status(500).send({code:"DELIVERY_FAILED",message:h,logId:d.id})}})}le();le();import{existsSync as ot,copyFileSync as oa,mkdirSync as zt,cpSync as aa}from"fs";import{join as ee}from"path";function Qt(){zt(A,{recursive:!0}),zt(ee(A,"logs"),{recursive:!0}),zt(ee(A,".claude"),{recursive:!0})}function En(o=process.cwd()){Qt();let e=[],t=[{from:ee(o,"data","adam.db"),to:ee(A,"adam.db"),label:"database"},{from:ee(o,"adam.config.yaml"),to:ee(A,"adam.config.yaml"),label:"config"},{from:ee(o,".env"),to:ee(A,".env"),label:".env"}];for(let{from:n,to:a,label:i}of t)ot(n)&&!ot(a)&&(oa(n,a),e.push(i));let r=ee(o,".claude","plugins"),s=ee(A,".claude","plugins");return ot(r)&&!ot(s)&&(aa(r,s,{recursive:!0}),e.push("plugins")),e}var C=O("adam");function ca(o){let e={...o};if(e.defaults&&typeof e.defaults=="object"){let t={...e.defaults};if(t.env&&typeof t.env=="object"){let r={...t.env};for(let s of Object.keys(r))r[s]&&(r[s]=r[s].slice(0,4)+"****");t.env=r}e.defaults=t}if(e.server&&typeof e.server=="object"){let t={...e.server};t.apiKey&&typeof t.apiKey=="string"&&(t.apiKey=t.apiKey.slice(0,4)+"****"),e.server=t}return e}async function da(){Qt();let o=En();o.length>0&&console.log(`[adam] Migrated to ~/.adam/: ${o.join(", ")}`);let e=Or();C.info("Starting Adam Agent Server"),e.length>0&&C.info({files:e},"Loaded env files");let t=ss();Xt(t),W().anthropic?.apiKey||process.env.ANTHROPIC_API_KEY||C.warn("ANTHROPIC_API_KEY not set \u2014 configure via Settings UI or ~/.adam/.env"),process.env.ANTHROPIC_BASE_URL&&C.info({url:process.env.ANTHROPIC_BASE_URL},"Using custom API base URL");let s=t.defaults?.claudeCodePath;try{if(!s){let{createRequire:G}=await import("module"),{dirname:je,join:X}=await import("path"),Ne=G(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");s=X(je(Ne),"cli.js")}let{execSync:b}=await import("child_process"),{chmodSync:F,accessSync:J,constants:x}=await import("fs");try{J(s,x.X_OK)}catch{C.info({path:s},"CLI not executable, fixing permissions"),F(s,493)}let L=b(`"${s}" --version`,{timeout:5e3,encoding:"utf-8"}).trim();C.info({path:s,version:L},"Claude Code CLI detected")}catch(b){let F=b;F.code==="ENOENT"?C.warn({path:s},"Claude Code CLI not found. Task execution will fail. Install: npm i -g @anthropic-ai/claude-code"):C.warn({path:s,error:(F.stderr?.trim()||String(b)).slice(0,200)},"Claude Code CLI check failed")}let a=q().prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all();C.info({tables:a.map(b=>b.name).join(", ")},"Database initialized");let i=rs(),c=wr(i);c>0&&C.info({count:c},"Seeded config DB from .env");let{getAllConfig:l}=await import("./config-WHXCZCI4.js");qe(l);let d=W();d.logging?.level&&Be(d.logging.level),C.info({config:ca(d)},"Config loaded (DB + defaults)");let m=jt(),{getToolsFingerprint:h}=await import("./adam-tools-PQC7EI3J.js"),I=h(),y=m.sdkSessionId;if(y&&m.toolsFingerprint!==I&&(C.info({old:m.toolsFingerprint?.slice(0,40),new:I.slice(0,40)},"MCP tools changed \u2014 invalidating old SDK session"),zr(),y=void 0),Ce({toolsFingerprint:I}),y){let b=process.cwd();m.workspacePath&&m.workspacePath!==b&&(C.warn({serverCwd:b,saved:m.workspacePath},"Workspace mismatch"),C.warn("SDK session may not resume correctly due to cwd mismatch")),C.info({sessionId:y.slice(0,8)},"Recovering manager SDK session")}else C.info("No previous manager SDK session found, starting fresh");m.userTaskSessionId&&C.info({sessionId:m.userTaskSessionId.slice(0,8)},"Recovering user task session"),Qr(process.cwd());let{initializeDefaultRoles:g}=await import("./role-presets-FN2RWUCP.js"),P=g();C.info({count:P.length},"Roles initialized");let oe=W().execution??{maxConcurrent:3,maxBudgetPerTaskUsd:5,pollIntervalMs:3e4},$=new Ae(y),ae=new De(oe.maxConcurrent);yn($),await $.start(),await ae.start();let Ie=M("running");if(Ie.length>0){C.warn({count:Ie.length},"Found orphaned running tasks from previous session \u2014 marking as failed");for(let b of Ie)H(b.id,{status:"failed",error:"Server restarted while task was running",completedAt:Date.now()})}let _=Nr(t,t.server.apiKey);await _.register(b=>Br(b)),await _.register(b=>Ur(b,t)),await _.register(b=>Gr(b,t.server.apiKey)),await _.register(Zr),await _.register(an),await _.register(kn),await _.register(Tn);let ie=new Vs;$s(ie),await ie.start(),Dr(),await _.register(b=>bn(b,ie)),await _.register(vn),await _.register(b=>Rn(b,ie,process.env.ADAM_WEBHOOK_API_KEY)),await _.register(wn),await _.register(Sn),await _.register(Cn);let ce=new rt;Ir(ce),await _.register(kr),await _.register(Pn),await _.register(b=>Kr(b,t.server.apiKey)),await _.register(on),await _.register(Kt),Js(),Er(),Sr(),ce.startHealthMonitor();try{let b=Se();for(let F of b)if(F.platform==="wechat"){let J=F.config;if(J.botToken){let x=new vr(F.id,J);ce.addChannel(F,x)}}}catch(b){C.error({error:b},"Failed to register WeChat adapters at startup")}try{let b=Se();for(let F of b)if(F.platform==="discord"){let J=F.config;if(J.botToken){let x=new Rr(F.id,{botToken:J.botToken});ce.addChannel(F,x)}}}catch(b){C.error({error:b},"Failed to register Discord adapters at startup")}let{host:ge,port:fe}=t.server;await _.listen({host:ge,port:fe}),C.info({host:ge,port:fe},"Server listening");let it=t.watchdog??ts.watchdog;_n(it,$,ae,b=>{C.warn({alert:b},"Watchdog alert")}),ds(b=>{f.emit({type:"log_event",timestamp:b.time??Date.now(),level:b.level??"info",component:b.component??"adam",msg:b.msg??""})}),Dn(A,{recursive:!0}),Dn(at(A,"logs"),{recursive:!0}),xn(at(A,"adam.port"),String(fe)),t.server.apiKey&&xn(at(A,"adam.key"),t.server.apiKey,{mode:384}),process.send?.({type:"ready",port:fe});let de=async()=>{C.info("Shutting down"),An(),Cr(),Xs(),xr(),await ce.stopAll(),$.stop(),ae.stop(),await ie.stop(),await _.close(),ut();try{ia(at(A,"adam.key"))}catch{}process.exit(0)};process.on("SIGINT",()=>{de()}),process.on("SIGTERM",()=>{de()})}da().catch(o=>{C.fatal(o,"Fatal error"),process.exit(1)});
|
|
130
|
+
`);try{let n=(await Zs(r,"You are a concise title generator. Reply with only the title, max 50 characters.")).trim().slice(0,50);n.length>0&&Ts(o,{title:n})}catch{}}var Vt=null;function yn(o){Vt=o}async function Xe(o,e,t,r){let s;r&&(s=K(r)),s||(s=Hs(e)),s||(s=Ge(e,t));let n=Ut(),a={id:n,sessionId:s.id,role:"user",content:o,source:e,createdAt:Date.now()};if(se(a),f.emit({type:"chat_message",sessionId:s.id,message:a}),s.messageCount===0&&jo(s.id,o),re(s.id),Pt(s.id),Vt){let i=s.id,c=s.source;(async()=>{try{let l=await Vt.handleMessage(o,i,e),d={id:Ut(),sessionId:i,role:"assistant",content:l,source:e,createdAt:Date.now()};se(d),f.emit({type:"chat_message",sessionId:i,message:d}),re(i),Pt(i),c.type==="channel"&&c.channelId&&c.chatId&&(Wt.info({sessionId:i,sourceType:c.type,hasChannelId:!!c.channelId,hasResponse:!!l},"Chat response ready, checking channel delivery"),No(c.channelId,c.chatId,l))}catch(l){(await import("./logger-BEG4WFIM.js")).getLogger("message-handler").error({error:l,sessionId:i},"ChatManager response failed");let m={id:Ut(),sessionId:i,role:"assistant",content:`\u26A0\uFE0F \u5904\u7406\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`,source:e,createdAt:Date.now()};se(m),f.emit({type:"chat_message",sessionId:i,message:m}),re(i)}})()}return{sessionId:s.id,messageId:n}}async function No(o,e,t){Wt.info({channelId:o,chatId:e.slice(0,12)},"Delivering chat response to channel");try{let{getOutboundGateway:r}=await import("./outbound-gateway-DZTXBUTP.js");await r().send({channelId:o,chatId:e,content:t,messageType:"reply"})}catch(r){Wt.error({error:r,channelId:o,chatId:e.slice(0,12)},"Channel delivery failed (non-fatal)")}}import{z as v}from"zod/v4";import{v4 as Lo}from"uuid";var hn=v.union([v.object({type:v.literal("session"),sessionId:v.string()}),v.object({type:v.literal("channel"),channelId:v.string(),chatId:v.string().optional()})]),qo=v.object({id:v.string(),prompt:v.string(),dependsOn:v.array(v.string()).optional(),outputAs:v.string().optional()}),Mo=v.object({type:v.enum(["cron","manual","event","once"]),cron:v.string().optional(),event:v.string().optional(),runAt:v.string().optional()}),$t=v.object({name:v.string().min(1),description:v.string().optional(),trigger:Mo,steps:v.array(qo).min(1),rolePreference:v.string().optional(),config:v.record(v.string(),v.unknown()).optional(),enabled:v.boolean().default(!0),goalIds:v.array(v.string()).optional(),deliverTo:v.array(hn).optional(),reportTo:v.array(hn).optional()}),dd=$t.transform(o=>({...o,deliverTo:o.deliverTo,reportTo:o.reportTo})),Bo=$t.partial().transform(o=>({...o,deliverTo:o.deliverTo,reportTo:o.reportTo})),Ze=v.object({id:v.string().min(1)});async function bn(o,e){o.post("/task-templates",{schema:{tags:["Templates"],summary:"Create a task template",description:"Create a new task template with trigger (cron/manual/event) and execution steps. Cron-triggered templates are automatically scheduled.",body:{type:"object",required:["name","trigger","steps"],properties:{name:{type:"string",minLength:1},description:{type:"string"},trigger:{type:"object",required:["type"],properties:{type:{type:"string",enum:["cron","manual","event","once"]},cron:{type:"string",description:"Cron expression (required when type is cron)"},event:{type:"string",description:"Event name (required when type is event)"},runAt:{type:"string",description:"ISO 8601 timestamp (required when type is once)"}}},steps:{type:"array",minItems:1,items:{type:"object",required:["id","prompt"],properties:{id:{type:"string"},prompt:{type:"string"},dependsOn:{type:"array",items:{type:"string"}},outputAs:{type:"string"}}}},rolePreference:{type:"string"},config:{type:"object",additionalProperties:!0},enabled:{type:"boolean",default:!0},goalIds:{type:"array",items:{type:"string"}},deliverTo:{type:"array",items:{type:"object"}},reportTo:{type:"array",items:{type:"object"}}}},response:R.templateCreated}},async(t,r)=>{let s=$t.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n={id:Lo(),...s.data,createdAt:Date.now()};return Ls(n),n.enabled&&n.trigger.type==="cron"&&n.trigger.cron?await e.scheduleJob(n.id):n.enabled&&n.trigger.type==="once"&&n.trigger.runAt&&e.scheduleOnceJob(n.id),r.status(201).send({templateId:n.id})}),o.get("/task-templates",{schema:{tags:["Templates"],summary:"List task templates",description:"List all task templates, optionally filtering to enabled-only.",querystring:{type:"object",properties:{enabled:{type:"string",enum:["true","false"],description:"Filter to enabled templates only when 'true'"}}},response:R.templateList}},async t=>{let s=t.query.enabled==="true";return{templates:Ms(s)}}),o.get("/task-templates/:id",{schema:{tags:["Templates"],summary:"Get task template by ID",description:"Retrieve a single task template by its ID.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateDetail}},async(t,r)=>{let s=Ze.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n=ne(s.data.id);return n?{template:n}:r.status(404).send({code:"NOT_FOUND",message:"Template not found"})}),o.patch("/task-templates/:id",{schema:{tags:["Templates"],summary:"Update a task template",description:"Partially update a task template. Cron schedules are automatically rescheduled if the trigger changes.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{name:{type:"string",minLength:1},description:{type:"string"},trigger:{type:"object",properties:{type:{type:"string",enum:["cron","manual","event","once"]},cron:{type:"string"},event:{type:"string"},runAt:{type:"string"}}},steps:{type:"array",items:{type:"object"}},rolePreference:{type:"string"},config:{type:"object",additionalProperties:!0},enabled:{type:"boolean"},goalIds:{type:"array",items:{type:"string"}},deliverTo:{type:"array",items:{type:"object"}},reportTo:{type:"array",items:{type:"object"}}}},response:R.templateUpdated}},async(t,r)=>{let s=Ze.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)});let n=Bo.safeParse(t.body);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(n.error)});if(!ne(s.data.id))return r.status(404).send({code:"NOT_FOUND",message:"Template not found"});qs(s.data.id,n.data),await e.unscheduleJob(s.data.id);let i=ne(s.data.id);return i?.enabled&&i.trigger.type==="cron"&&i.trigger.cron?await e.scheduleJob(i.id):i?.enabled&&i.trigger.type==="once"&&i.trigger.runAt&&e.scheduleOnceJob(i.id),{templateId:s.data.id}}),o.delete("/task-templates/:id",{schema:{tags:["Templates"],summary:"Delete a task template",description:"Delete a task template by ID. Cron jobs are automatically unscheduled.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateDeleted}},async(t,r)=>{let s=Ze.safeParse(t.params);return s.success?ne(s.data.id)?(await e.unscheduleJob(s.data.id),Bs(s.data.id),{templateId:s.data.id,deleted:!0}):r.status(404).send({code:"NOT_FOUND",message:"Template not found"}):r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)})}),o.post("/task-templates/:id/run",{schema:{tags:["Templates"],summary:"Run a task template",description:"Manually trigger execution of a task template regardless of its trigger type.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.templateRun}},async(t,r)=>{let s=Ze.safeParse(t.params);return s.success?ne(s.data.id)?{executionId:await e.runNow(s.data.id),status:"started"}:r.status(404).send({code:"NOT_FOUND",message:"Template not found"}):r.status(400).send({code:"VALIDATION_ERROR",message:v.prettifyError(s.error)})})}import{z as E}from"zod/v4";Es();var Gt=E.object({id:E.string().min(1)}),Uo=E.object({scope:E.enum(["user","project"]).optional(),cwd:E.string().optional()}),Wo=E.object({scope:E.enum(["user","project"]).optional(),cwd:E.string().optional()});async function vn(o){o.get("/plugins",{schema:{tags:["Plugins"],summary:"List all installed plugins",querystring:{type:"object",properties:{scope:{type:"string",enum:["user","project","local"]}}}}},async t=>{let r=t.query,s=We({scope:r.scope}),n=St();return{plugins:s.map(a=>({...a,globalEnabled:n[a.id]??a.enabled}))}}),o.get("/plugins/:id",{schema:{tags:["Plugins"],summary:"Get plugin by ID",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});let n=Ps(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Plugin not found"});let a=Cs(n.installPath),i=St();return{plugin:{...n,globalEnabled:i[n.id]??n.enabled,manifest:a}}}),o.post("/plugins/:id/enable",{schema:{tags:["Plugins"],summary:"Enable a plugin globally",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude CLI not found. Plugin enable/disable requires the Claude Agent SDK CLI."});try{return lr(s.data.id),{pluginId:s.data.id,enabled:!0}}catch(n){return r.status(500).send({code:"CLI_ERROR",message:n instanceof Error?n.message:"Enable failed"})}}),o.post("/plugins/:id/disable",{schema:{tags:["Plugins"],summary:"Disable a plugin globally",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(t,r)=>{let s=Gt.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude CLI not found. Plugin enable/disable requires the Claude Agent SDK CLI."});try{return pr(s.data.id),{pluginId:s.data.id,enabled:!1}}catch(n){return r.status(500).send({code:"CLI_ERROR",message:n instanceof Error?n.message:"Disable failed"})}}),o.get("/plugins/stats",{schema:{tags:["Plugins"],summary:"Get plugin usage statistics",querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50}}}}},async t=>{let r=t.query;return{stats:un(r.limit??50)}});let e=E.object({roleId:E.string().min(1)});o.get("/plugins/stats/role/:roleId",{schema:{tags:["Plugins"],summary:"Get plugin usage by role",params:{type:"object",required:["roleId"],properties:{roleId:{type:"string"}}}}},async(t,r)=>{let s=e.safeParse(t.params);return s.success?{roleId:s.data.roleId,stats:pn(s.data.roleId)}:r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(s.error)})}),o.get("/plugins/marketplace",{schema:{tags:["Marketplace"],summary:"List available marketplace plugins"}},async(t,r)=>{if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found. Install Claude Code to use marketplace features."});try{let s=ir();return{available:s.available,installed:s.installed}}catch(s){return r.status(500).send({code:"CLI_ERROR",message:s instanceof Error?s.message:"CLI command failed"})}}),o.get("/plugins/marketplaces",{schema:{tags:["Marketplace"],summary:"List known marketplace sources"}},async()=>({sources:_s()})),o.post("/plugins/install/:name",{schema:{tags:["Marketplace"],summary:"Install a plugin",params:{type:"object",required:["name"],properties:{name:{type:"string"}}},body:{type:"object",properties:{scope:{type:"string",enum:["user","project"]},cwd:{type:"string"}}}}},async(t,r)=>{let n=E.object({name:E.string().min(1)}).safeParse(t.params);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(n.error)});let a=Uo.safeParse(t.body??{});if(!a.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(a.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found"});try{return cr(n.data.name,a.data.scope??"user",a.data.cwd),{success:!0,pluginId:n.data.name}}catch(i){return r.status(500).send({code:"CLI_ERROR",message:i instanceof Error?i.message:"Install failed"})}}),o.post("/plugins/uninstall/:name",{schema:{tags:["Marketplace"],summary:"Uninstall a plugin",params:{type:"object",required:["name"],properties:{name:{type:"string"}}},body:{type:"object",properties:{scope:{type:"string",enum:["user","project"]},cwd:{type:"string"}}}}},async(t,r)=>{let n=E.object({name:E.string().min(1)}).safeParse(t.params);if(!n.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(n.error)});let a=Wo.safeParse(t.body??{});if(!a.success)return r.status(400).send({code:"VALIDATION_ERROR",message:E.prettifyError(a.error)});if(!ve())return r.status(503).send({code:"CLI_NOT_AVAILABLE",message:"Claude Code CLI not found"});try{return dr(n.data.name,a.data.scope,a.data.cwd),{success:!0,pluginId:n.data.name}}catch(i){return r.status(500).send({code:"CLI_ERROR",message:i instanceof Error?i.message:"Uninstall failed"})}})}import{z as Ht}from"zod/v4";var Vo=Ht.object({name:Ht.string().min(1)}),$o="x-api-key";async function Rn(o,e,t){o.post("/webhooks/:name",{schema:{tags:["Webhooks"],summary:"Trigger a webhook",description:"Trigger a task template execution by name or ID. Requires X-API-Key header if API key is configured.",security:[{apiKey:[]}],params:{type:"object",required:["name"],properties:{name:{type:"string",description:"Template name or ID"}}},response:R.webhookTriggered}},async(r,s)=>{if(t&&r.headers[$o]!==t)return s.status(401).send({code:"UNAUTHORIZED",message:"Invalid or missing API key"});let n=Vo.safeParse(r.params);if(!n.success)return s.status(400).send({code:"VALIDATION_ERROR",message:Ht.prettifyError(n.error)});let{name:a}=n.data,i=ne(a);if(!i){let{listTaskTemplates:c}=await import("./task-templates-7LSQ6OST.js");i=c(!1).find(d=>d.name===a||d.id===a)}if(!i)return s.status(404).send({code:"NOT_FOUND",message:`Template '${a}' not found`});if(!i.enabled)return s.status(409).send({code:"DISABLED",message:`Template '${a}' is disabled`});try{let c=await e.runNow(i.id);return s.status(202).send({code:"ACCEPTED",message:`Template '${i.name}' triggered`,executionId:c,templateId:i.id})}catch(c){let l=c instanceof Error?c.message:String(c);return s.status(500).send({code:"EXECUTION_ERROR",message:l})}}),o.get("/webhooks",{schema:{tags:["Webhooks"],summary:"List available webhooks",description:"List all enabled task templates that can be triggered via webhook, along with auth requirements.",response:R.webhookList}},async()=>{let{listTaskTemplates:r}=await import("./task-templates-7LSQ6OST.js");return{webhooks:r(!0).map(n=>({name:n.id,displayName:n.name,description:n.description,tags:n.tags,trigger:`POST /webhooks/${n.id}`})),auth:t?"X-API-Key header required":"No auth configured"}})}import{z as k}from"zod/v4";var Go=k.object({status:k.string().optional(),limit:k.coerce.number().min(1).max(100).default(20),offset:k.coerce.number().min(0).default(0)}),et=k.union([k.object({type:k.literal("session"),sessionId:k.string()}),k.object({type:k.literal("channel"),channelId:k.string(),chatId:k.string().optional()})]),Ho=k.object({input:k.string().min(1,"goal input is required"),deliverTo:k.array(et).optional(),reportTo:k.array(et).optional()}),In=k.object({id:k.string().min(1)}),Ko=k.object({name:k.string().min(1).optional(),description:k.string().optional(),status:k.enum(["active","paused","completed","failed"]).optional(),currentValue:k.number().optional(),budgetUsd:k.number().min(0).optional(),deliverTo:k.array(et).optional(),reportTo:k.array(et).optional()});async function kn(o){o.get("/goals",{schema:{tags:["Goals"],summary:"List goals",description:"List goals with optional status filter and pagination.",querystring:{type:"object",properties:{status:{type:"string",description:"Filter by goal status"},limit:{type:"integer",minimum:1,maximum:100,default:20},offset:{type:"integer",minimum:0,default:0}}},response:R.goalList}},async(e,t)=>{let r=Go.safeParse(e.query);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let{status:s,limit:n,offset:a}=r.data;return{goals:Us(s,n,a)}}),o.get("/goals/:id",{schema:{tags:["Goals"],summary:"Get goal by ID",description:"Retrieve a single goal by its ID, including metric tree and progress.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},response:R.goalDetail}},async(e,t)=>{let r=pe(e.params.id);return r?{goal:r}:t.status(404).send({code:"NOT_FOUND",message:"Goal not found"})}),o.post("/goals",{schema:{tags:["Goals"],summary:"Create a goal",description:"Create a new goal from a natural language input. The input is parsed, validated, and a metric tree is built.",body:{type:"object",required:["input"],properties:{input:{type:"string",minLength:1,description:"Natural language goal description"},deliverTo:{type:"array",items:{type:"object"},description:"Delivery targets (result output)"},reportTo:{type:"array",items:{type:"object"},description:"Report targets (status notifications)"}}},response:R.goalCreated}},async(e,t)=>{let r=Ho.safeParse(e.body);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let s=await er(r.data.input);if(!s.validationResult.isValid)return t.status(400).send({code:"INVALID_GOAL",errors:s.validationResult.errors,warnings:s.validationResult.warnings});let n=tr(s.goalState,r.data.deliverTo,r.data.reportTo);return sr(n.id,n.metricType),t.status(201).send({goal:n})}),o.patch("/goals/:id",{schema:{tags:["Goals"],summary:"Update a goal",description:"Partially update a goal's name, description, status, currentValue, or budgetUsd.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}},body:{type:"object",properties:{name:{type:"string",minLength:1},description:{type:"string"},status:{type:"string"},currentValue:{type:"number"},budgetUsd:{type:"number",minimum:0},deliverTo:{type:"array",items:{type:"object"},description:"Delivery targets (result output)"},reportTo:{type:"array",items:{type:"object"},description:"Report targets (status notifications)"}}},response:R.goalDetail}},async(e,t)=>{let r=In.safeParse(e.params);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)});let s=Ko.safeParse(e.body);return s.success?pe(r.data.id)?($e(r.data.id,{...s.data,updatedAt:Date.now()}),{goal:pe(r.data.id)}):t.status(404).send({code:"NOT_FOUND",message:"Goal not found"}):t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(s.error)})}),o.delete("/goals/:id",{schema:{tags:["Goals"],summary:"Delete a goal",description:"Delete a goal by ID.",params:{type:"object",required:["id"],properties:{id:{type:"string"}}}}},async(e,t)=>{let r=In.safeParse(e.params);return r.success?pe(r.data.id)?(Ws(r.data.id),{goalId:r.data.id,deleted:!0}):t.status(404).send({code:"NOT_FOUND",message:"Goal not found"}):t.status(400).send({code:"VALIDATION_ERROR",message:k.prettifyError(r.error)})})}import{z as Oe}from"zod/v4";var zo=Oe.object({role:Oe.string().optional(),taskType:Oe.string().optional(),limit:Oe.coerce.number().min(1).max(100).default(50)});async function Tn(o){o.get("/strategies",{schema:{tags:["Strategies"],summary:"List strategies",description:"List agent strategies with optional role/taskType filter. Returns evolutionary strategy entries used for agent routing.",querystring:{type:"object",properties:{role:{type:"string",description:"Filter by role ID"},taskType:{type:"string",description:"Filter by task type"},limit:{type:"integer",minimum:1,maximum:100,default:50}}},response:R.strategyList}},async(e,t)=>{let r=zo.safeParse(e.query);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:Oe.prettifyError(r.error)});let{role:s,taskType:n,limit:a}=r.data,i;return s&&n?i=or.getStrategies(s,n):s?i=nr(s):i=rr(a),{strategies:i.slice(0,a)}})}async function wn(o){o.get("/config",{schema:{tags:["Config"],summary:"Get current configuration",description:"Returns the current server configuration with runtime-mutable vs restart-required indication for each setting.",response:R.configGet}},async(e,t)=>{let r=W(),s=[...Le,...lt],n={},a=new Set(["anthropic.apiKey","server.apiKey"]);for(let i of s){let c=pt(r,i),l=Le.includes(i);a.has(i)&&typeof c=="string"&&c.length>0&&(c=c.slice(0,5)+"****"),n[i]={value:c??null,mutable:l}}return{config:n,mutable:[...Le],restartRequired:[...lt]}}),o.patch("/config",{schema:{tags:["Config"],summary:"Update runtime-mutable configuration",description:"Updates configuration values that can be changed at runtime. Restart-required settings are rejected but valid mutable changes are still applied (partial success).",response:R.configPatch}},async(e,t)=>{let r=e.body;if(!r||typeof r!="object")return t.status(400).send({success:!1,updated:[],errors:["Request body must be a JSON object with config key-value pairs"],message:"Validation error"});let s=Zt(r,_t);if(s.updated.includes("logging.level")){let n=r["logging.level"];typeof n=="string"&&Be(n)}if(s.updated.length>0){let n=W(),a=s.updated.map(i=>({path:i,value:pt(n,i)}));f.emit({type:"config_changed",changes:a})}return{success:s.errors.length===0,updated:s.updated,errors:s.errors,message:s.errors.length===0?`Updated ${s.updated.length} configuration value(s)`:`Updated ${s.updated.length} value(s); ${s.errors.length} rejected (restart required)`}}),o.get("/config/env-diff",async()=>{let e=Ke();return{diffs:_r(e),envFileExists:Et()!==null}}),o.post("/config/sync-to-env",async()=>{let e=Ke();return{success:!0,changed:Ar(e)}}),o.post("/config/load-from-env",async()=>{let e=Et();if(!e)return{success:!1,error:".env file not found"};let t=0;for(let[r,s]of Object.entries(e)){let n=Object.entries(Pr).find(([,a])=>a===r)?.[0];n&&(_t(n,s),t++)}return qe(Ke),{success:!0,updated:t}})}async function Sn(o){o.get("/evolution-audit",{schema:{tags:["Evolution"],summary:"List evolution audit records",description:"Returns evolution audit log entries with optional role filter.",querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:100,default:20},offset:{type:"integer",minimum:0,default:0},roleId:{type:"string"}}}}},async(e,t)=>{let{limit:r=20,offset:s=0,roleId:n}=e.query;return n?br(n,r,s):hr(r,s)})}import{z as T}from"zod/v4";var Qo=["active","archived"],Yo=T.object({source:T.object({type:T.enum(["tui","web","api","channel"]),channelId:T.string().optional(),chatId:T.string().optional()}),roleId:T.string().optional()}),Fe=T.object({id:T.string().uuid()}),Jo=T.object({status:T.enum(Qo).optional(),limit:T.coerce.number().min(1).max(100).default(100),offset:T.coerce.number().min(0).default(0)}),Xo=T.object({limit:T.coerce.number().min(1).max(200).default(50),offset:T.coerce.number().min(0).default(0)});async function Cn(o){o.post("/chat/sessions",{schema:{tags:["Chat"],summary:"Create a chat session",body:{type:"object",required:["source"],properties:{source:{type:"object",required:["type"],properties:{type:{type:"string",enum:["tui","web","api","channel"]},channelId:{type:"string"},chatId:{type:"string"}}},roleId:{type:"string"}}}}},async(t,r)=>{let s=Yo.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{source:n,roleId:a}=s.data,i=Ge(n,a);return r.status(201).send({session:i})}),o.get("/chat/sessions",{schema:{tags:["Chat"],summary:"List chat sessions",querystring:{type:"object",properties:{status:{type:"string",enum:["active","archived"]},limit:{type:"integer",minimum:1,maximum:100,default:100},offset:{type:"integer",minimum:0,default:0}}}}},async(t,r)=>{let s=Jo.safeParse(t.query);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{status:n}=s.data;return{sessions:Ys(n)}}),o.get("/chat/sessions/:id",{schema:{tags:["Chat"],summary:"Get chat session with messages",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Session not found"});let a=wt(n.id);return{session:n,messages:a}}),o.post("/chat/sessions/:id/archive",{schema:{tags:["Chat"],summary:"Archive a chat session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);return n?(Ks(n.id),{sessionId:n.id,status:"archived"}):r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.post("/chat/sessions/:id/restore",{schema:{tags:["Chat"],summary:"Restore an archived session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=zs(s.data.id);return n?{session:n}:r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.delete("/chat/sessions/:id",{schema:{tags:["Chat"],summary:"Delete a chat session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);return n?(Qs(n.id),r.status(204).send()):r.status(404).send({code:"NOT_FOUND",message:"Session not found"})}),o.get("/chat/sessions/:id/messages",{schema:{tags:["Chat"],summary:"Get messages for a session",params:{type:"object",required:["id"],properties:{id:{type:"string",format:"uuid"}}},querystring:{type:"object",properties:{limit:{type:"integer",minimum:1,maximum:200,default:50},offset:{type:"integer",minimum:0,default:0}}}}},async(t,r)=>{let s=Fe.safeParse(t.params);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let n=K(s.data.id);if(!n)return r.status(404).send({code:"NOT_FOUND",message:"Session not found"});let a=Xo.safeParse(t.query),{limit:i=50,offset:c=0}=a.success?a.data:{};return{messages:wt(n.id,i,c)}});let e=T.object({content:T.string().min(1,"content is required"),source:T.object({type:T.enum(["tui","web","api","channel"]),channelId:T.string().optional(),chatId:T.string().optional()}),roleId:T.string().optional(),sessionId:T.string().uuid().optional()});o.post("/chat/messages",{schema:{tags:["Chat"],summary:"Send a chat message",description:"Send a message. Creates a session if no active session exists for the source. Returns sessionId, messageId, and response.",body:{type:"object",required:["content","source"],properties:{content:{type:"string",minLength:1},source:{type:"object",required:["type"],properties:{type:{type:"string",enum:["tui","web","api","channel"]},channelId:{type:"string"},chatId:{type:"string"}}},roleId:{type:"string"},sessionId:{type:"string"}}}}},async(t,r)=>{let s=e.safeParse(t.body);if(!s.success)return r.status(400).send({code:"VALIDATION_ERROR",message:T.prettifyError(s.error)});let{content:n,source:a,roleId:i,sessionId:c}=s.data,l=await Xe(n,a,i,c);return r.status(201).send(l)})}var Zo=O("ws"),tt=new Set,st=[],ea=50;function ta(o){st.push(o),st.length>ea&&st.shift()}function Re(o){ta(o);let e=JSON.stringify(o);for(let t of tt)t.readyState===1&&t.send(e)}function Pn(o){o.get("/chat/stream",{websocket:!0},(e,t)=>{tt.add(e);for(let r of st)e.readyState===1&&e.send(JSON.stringify(r));e.on("close",()=>{tt.delete(e)}),e.on("error",r=>{Zo.error({error:r},"Chat WebSocket error"),tt.delete(e)})}),f.on("session_created",e=>Re(e)),f.on("session_archived",e=>Re(e)),f.on("session_restored",e=>Re(e)),f.on("session_deleted",e=>Re(e)),f.on("chat_message",e=>Re(e)),f.on("task_complete_event",e=>Re(e))}var U=O("channels"),rt=class{adapters=new Map;rateLimits=new Map;healthInterval;rateLimitPerMinute;constructor(e){this.rateLimitPerMinute=e?.rateLimitPerMinute??60}async addChannel(e,t){this.adapters.set(e.id,t),t.onMessage(r=>{this.handleInbound(e.id,r)}),e.enabled&&await this.connectChannel(e.id)}async removeChannel(e){let t=this.adapters.get(e);if(t){try{await t.disconnect()}catch(r){U.error({channelId:e,error:r},"Error disconnecting channel")}this.adapters.delete(e),this.rateLimits.delete(e)}}async connectChannel(e){let t=this.adapters.get(e);if(!t)throw new Error(`No adapter registered for channel ${e}`);try{be(e,"connecting"),await t.connect(),be(e,"connected"),U.info({channelId:e,platform:t.platform},"Channel connected")}catch(r){throw be(e,"error"),U.error({channelId:e,error:r},"Failed to connect channel"),r}}async disconnectChannel(e){let t=this.adapters.get(e);if(t)try{await t.disconnect(),be(e,"disconnected"),U.info({channelId:e},"Channel disconnected")}catch(r){U.error({channelId:e,error:r},"Error disconnecting channel")}}getChannelStatus(e){let t=this.adapters.get(e);return t?t.getStatus():"disconnected"}getChannelStatuses(){let e=new Map;for(let[t,r]of this.adapters)e.set(t,r.getStatus());return e}hasAdapter(e){return this.adapters.has(e)}async sendMessage(e,t,r){let s=this.adapters.get(e);if(!s)return U.warn({channelId:e},"No adapter for outbound message"),null;if(!this.checkRateLimit(e))return U.warn({channelId:e},"Rate limit exceeded, dropping outbound message"),null;try{return await s.sendMessage(t,r)}catch(n){return U.error({channelId:e,chatId:t,error:n},"Failed to send outbound message"),null}}checkRateLimit(e){let t=Date.now(),r=this.rateLimits.get(e);return!r||t-r.windowStart>=6e4?(this.rateLimits.set(e,{count:1,windowStart:t}),!0):r.count>=this.rateLimitPerMinute?!1:(r.count++,!0)}async handleInbound(e,t){if(t.source==="system"){U.debug({channelId:e},"Skipping system message (anti-loop)");return}try{let{isRecentlySent:s}=await import("./outbound-gateway-DZTXBUTP.js"),n=t.channelMessageId??t.raw?.MsgId??"";if(n&&s(String(n))){U.debug({channelId:e,messageId:n},"Skipping delivery-sent message (anti-loop)");return}}catch{}if(!this.checkRateLimit(e)){U.warn({channelId:e,senderId:t.senderId},"Rate limit exceeded for inbound message");return}try{let{handleInboundForApproval:s}=await import("./approval-handler-HK7GQPHU.js");if(await s(e,t.chatId,t.content)){U.debug({channelId:e,chatId:t.chatId},"Inbound message consumed as approval reply");return}}catch{}let r=Gs(e);if(r?.allowedChatIds&&!r.allowedChatIds.includes(t.chatId)){U.debug({channelId:e,chatId:t.chatId},"Chat not in allowlist, ignoring");return}try{let s=await Xe(t.content,{type:"channel",channelId:e,chatId:t.chatId},r?.linkedRoleId);U.info({channelId:e,chatId:t.chatId,sessionId:s.sessionId},"Inbound message routed to session")}catch(s){U.error({channelId:e,chatId:t.chatId,error:s},"Failed to route inbound message")}}startHealthMonitor(e=3e4){this.stopHealthMonitor(),this.healthInterval=setInterval(()=>{this.checkHealth()},e)}stopHealthMonitor(){this.healthInterval&&(clearInterval(this.healthInterval),this.healthInterval=void 0)}checkHealth(){for(let[e,t]of this.adapters){let r=t.getStatus();try{be(e,r)}catch{}}}async startAll(){let e=Se(!0);for(let t of e){let r=this.adapters.get(t.id);if(r&&r.getStatus()!=="connected")try{await this.connectChannel(t.id)}catch{}}this.startHealthMonitor()}async stopAll(){this.stopHealthMonitor();for(let e of this.adapters.keys())await this.disconnectChannel(e);this.adapters.clear(),this.rateLimits.clear()}_getAdapterCount(){return this.adapters.size}_getRateLimitEntry(e){return this.rateLimits.get(e)}};ke();var Z=O("watchdog"),nt=null;function _n(o,e,t,r){if(!o.enabled){Z.info("Watchdog disabled");return}let s=o.intervalMinutes*6e4;Z.info({intervalMinutes:o.intervalMinutes},"Watchdog started"),nt=setInterval(()=>{sa(o,e,t,r)},s)}function An(){nt&&(clearInterval(nt),nt=null,Z.info("Watchdog stopped"))}function sa(o,e,t,r){let{rules:s}=o;if(s.managerHealthCheck.enabled){let n=s.managerHealthCheck.staleDurationMinutes*6e4,a=e.getLastActivityAt();if(Date.now()-a>n){let i=`ChatManager session stale (no activity for ${s.managerHealthCheck.staleDurationMinutes} min)`;if(Z.warn(i),s.managerHealthCheck.action==="restart"){let c=e.getConsecutiveStaleCount()>0;e.restartSession(),c&&(Z.fatal("ChatManager unrecoverable after session restart \u2014 exiting for supervisor restart"),process.exit(1))}else s.managerHealthCheck.action==="notify"&&r(i)}}if(!t.isHealthy()){let n="ExecutionPool is not healthy (stopped unexpectedly)";Z.warn(n),r(n)}if(s.staleTasks.enabled){let n=s.staleTasks.maxPendingMinutes*6e4,i=M("pending").filter(c=>Date.now()-c.createdAt>n);if(i.length>0){let c=`${i.length} stale task(s) pending > ${s.staleTasks.maxPendingMinutes} min`;Z.warn({count:i.length},c),s.staleTasks.action==="notify"&&r(c)}}if(s.staleRunningTasks?.enabled){let n=s.staleRunningTasks.maxRunningMinutes*6e4,i=M("running").filter(c=>{if(!c.startedAt||Date.now()-c.startedAt<n)return!1;try{let h=q().prepare("SELECT MAX(timestamp) as latest FROM step_logs WHERE task_id = ?").get(c.id)?.latest??c.startedAt;return Date.now()-h>n}catch{return!0}});if(i.length>0){let c=`${i.length} task(s) running with no activity for > ${s.staleRunningTasks.maxRunningMinutes} min \u2014 marking as failed`;Z.warn({count:i.length,taskIds:i.map(l=>l.id)},c);for(let l of i)H(l.id,{status:"failed",error:`Watchdog timeout: no activity for > ${s.staleRunningTasks.maxRunningMinutes} min`,completedAt:Date.now()}),f.emit({type:"task_status_change",taskId:l.id,oldStatus:"running",newStatus:"failed"}),t.releaseSlot(l.id);r(c)}}if(s.dbMaintenance.enabled)try{let a=q().pragma("wal_checkpoint(PASSIVE)");Z.debug({walSize:a},"WAL checkpoint")}catch(n){Z.error({error:n},"DB health check failed")}}import{z as N}from"zod";import{v4 as ra}from"uuid";var na=N.object({eventType:N.enum(["task_complete","task_error","plan_approval_request","*"]),matchCriteria:N.object({templateId:N.string().optional(),roleId:N.string().optional(),promptPattern:N.string().optional(),taskStatus:N.string().optional()}).optional().default({}),target:N.object({type:N.enum(["channel","webhook"]),channelId:N.string().optional(),chatId:N.string().optional(),webhookUrl:N.string().optional()}),formatTemplate:N.string().optional(),maxPerMinute:N.number().int().min(1).max(60).optional().default(5),skipOriginChannel:N.boolean().optional().default(!0),enabled:N.boolean().optional().default(!0)});async function Kt(o){o.get("/delivery-rules",async(e,t)=>gr()),o.post("/delivery-rules",async(e,t)=>{let r=na.safeParse(e.body);if(!r.success)return t.status(400).send({code:"VALIDATION_ERROR",message:N.prettifyError(r.error)});let s=r.data,n={id:ra(),eventType:s.eventType,matchCriteria:s.matchCriteria,target:s.target,formatTemplate:s.formatTemplate,maxPerMinute:s.maxPerMinute,skipOriginChannel:s.skipOriginChannel,enabled:s.enabled,createdAt:Date.now()};return mr(n),t.status(201).send(n)}),o.put("/delivery-rules/:id",async(e,t)=>{if(!He(e.params.id))return t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"});let s=e.body;return fr(e.params.id,s),{id:e.params.id,updated:!0}}),o.delete("/delivery-rules/:id",async(e,t)=>He(e.params.id)?(yr(e.params.id),{id:e.params.id,deleted:!0}):t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"})),o.get("/delivery-rules/:id/log",async(e,t)=>ms(e.params.id)),o.post("/delivery-rules/:id/test",async(e,t)=>{let r=He(e.params.id);if(!r)return t.status(404).send({code:"NOT_FOUND",message:"Delivery rule not found"});let{getDeliveryEngine:s}=await import("./engine-3PNNEZNK.js"),n=s();if(!n)return t.status(503).send({code:"ENGINE_NOT_READY",message:"DeliveryEngine not initialized"});let a=`[TEST] Delivery rule test at ${new Date().toISOString()}`,{createDeliveryLog:i}=await import("./delivery-log-VYTYUFCK.js"),{v4:c}=await import("uuid"),{TTL_MS:l}=await import("./delivery-log-VYTYUFCK.js"),d={id:c(),ruleId:r.id,status:"pending",target:r.target,content:a,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+l};i(d);try{return await n.attemptDeliveryPublic(d,r),{id:d.id,ruleId:r.id,status:"sent",content:a}}catch(m){let h=m instanceof Error?m.message:String(m);return t.status(500).send({code:"DELIVERY_FAILED",message:h,logId:d.id})}})}le();le();import{existsSync as ot,copyFileSync as oa,mkdirSync as zt,cpSync as aa}from"fs";import{join as ee}from"path";function Qt(){zt(A,{recursive:!0}),zt(ee(A,"logs"),{recursive:!0}),zt(ee(A,".claude"),{recursive:!0})}function En(o=process.cwd()){Qt();let e=[],t=[{from:ee(o,"data","adam.db"),to:ee(A,"adam.db"),label:"database"},{from:ee(o,"adam.config.yaml"),to:ee(A,"adam.config.yaml"),label:"config"},{from:ee(o,".env"),to:ee(A,".env"),label:".env"}];for(let{from:n,to:a,label:i}of t)ot(n)&&!ot(a)&&(oa(n,a),e.push(i));let r=ee(o,".claude","plugins"),s=ee(A,".claude","plugins");return ot(r)&&!ot(s)&&(aa(r,s,{recursive:!0}),e.push("plugins")),e}var C=O("adam");function ca(o){let e={...o};if(e.defaults&&typeof e.defaults=="object"){let t={...e.defaults};if(t.env&&typeof t.env=="object"){let r={...t.env};for(let s of Object.keys(r))r[s]&&(r[s]=r[s].slice(0,4)+"****");t.env=r}e.defaults=t}if(e.server&&typeof e.server=="object"){let t={...e.server};t.apiKey&&typeof t.apiKey=="string"&&(t.apiKey=t.apiKey.slice(0,4)+"****"),e.server=t}return e}async function da(){Qt();let o=En();o.length>0&&console.log(`[adam] Migrated to ~/.adam/: ${o.join(", ")}`);let e=Or();C.info("Starting Adam Agent Server"),e.length>0&&C.info({files:e},"Loaded env files");let t=ss();Xt(t),W().anthropic?.apiKey||process.env.ANTHROPIC_API_KEY||C.warn("ANTHROPIC_API_KEY not set \u2014 configure via Settings UI or ~/.adam/.env"),process.env.ANTHROPIC_BASE_URL&&C.info({url:process.env.ANTHROPIC_BASE_URL},"Using custom API base URL");let s=t.defaults?.claudeCodePath;try{if(!s){let{createRequire:G}=await import("module"),{dirname:je,join:X}=await import("path"),Ne=G(import.meta.url).resolve("@anthropic-ai/claude-agent-sdk");s=X(je(Ne),"cli.js")}let{execSync:b}=await import("child_process"),{chmodSync:F,accessSync:J,constants:x}=await import("fs");try{J(s,x.X_OK)}catch{C.info({path:s},"CLI not executable, fixing permissions"),F(s,493)}let L=b(`"${s}" --version`,{timeout:5e3,encoding:"utf-8"}).trim();C.info({path:s,version:L},"Claude Code CLI detected")}catch(b){let F=b;F.code==="ENOENT"?C.warn({path:s},"Claude Code CLI not found. Task execution will fail. Install: npm i -g @anthropic-ai/claude-code"):C.warn({path:s,error:(F.stderr?.trim()||String(b)).slice(0,200)},"Claude Code CLI check failed")}let a=q().prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all();C.info({tables:a.map(b=>b.name).join(", ")},"Database initialized");let i=rs(),c=wr(i);c>0&&C.info({count:c},"Seeded config DB from .env");let{getAllConfig:l}=await import("./config-WHXCZCI4.js");qe(l);let d=W();d.logging?.level&&Be(d.logging.level),C.info({config:ca(d)},"Config loaded (DB + defaults)");let m=jt(),{getToolsFingerprint:h}=await import("./adam-tools-BB7WQGVT.js"),I=h(),y=m.sdkSessionId;if(y&&m.toolsFingerprint!==I&&(C.info({old:m.toolsFingerprint?.slice(0,40),new:I.slice(0,40)},"MCP tools changed \u2014 invalidating old SDK session"),zr(),y=void 0),Ce({toolsFingerprint:I}),y){let b=process.cwd();m.workspacePath&&m.workspacePath!==b&&(C.warn({serverCwd:b,saved:m.workspacePath},"Workspace mismatch"),C.warn("SDK session may not resume correctly due to cwd mismatch")),C.info({sessionId:y.slice(0,8)},"Recovering manager SDK session")}else C.info("No previous manager SDK session found, starting fresh");m.userTaskSessionId&&C.info({sessionId:m.userTaskSessionId.slice(0,8)},"Recovering user task session"),Qr(process.cwd());let{initializeDefaultRoles:g}=await import("./role-presets-FN2RWUCP.js"),P=g();C.info({count:P.length},"Roles initialized");let oe=W().execution??{maxConcurrent:3,maxBudgetPerTaskUsd:5,pollIntervalMs:3e4},$=new Ae(y),ae=new De(oe.maxConcurrent);yn($),await $.start(),await ae.start();let Ie=M("running");if(Ie.length>0){C.warn({count:Ie.length},"Found orphaned running tasks from previous session \u2014 marking as failed");for(let b of Ie)H(b.id,{status:"failed",error:"Server restarted while task was running",completedAt:Date.now()})}let _=Nr(t,t.server.apiKey);await _.register(b=>Br(b)),await _.register(b=>Ur(b,t)),await _.register(b=>Gr(b,t.server.apiKey)),await _.register(Zr),await _.register(an),await _.register(kn),await _.register(Tn);let ie=new Vs;$s(ie),await ie.start(),Dr(),await _.register(b=>bn(b,ie)),await _.register(vn),await _.register(b=>Rn(b,ie,process.env.ADAM_WEBHOOK_API_KEY)),await _.register(wn),await _.register(Sn),await _.register(Cn);let ce=new rt;Ir(ce),await _.register(kr),await _.register(Pn),await _.register(b=>Kr(b,t.server.apiKey)),await _.register(on),await _.register(Kt),Js(),Er(),Sr(),ce.startHealthMonitor();try{let b=Se();for(let F of b)if(F.platform==="wechat"){let J=F.config;if(J.botToken){let x=new vr(F.id,J);ce.addChannel(F,x)}}}catch(b){C.error({error:b},"Failed to register WeChat adapters at startup")}try{let b=Se();for(let F of b)if(F.platform==="discord"){let J=F.config;if(J.botToken){let x=new Rr(F.id,{botToken:J.botToken});ce.addChannel(F,x)}}}catch(b){C.error({error:b},"Failed to register Discord adapters at startup")}let{host:ge,port:fe}=t.server;await _.listen({host:ge,port:fe}),C.info({host:ge,port:fe},"Server listening");let it=t.watchdog??ts.watchdog;_n(it,$,ae,b=>{C.warn({alert:b},"Watchdog alert")}),ds(b=>{f.emit({type:"log_event",timestamp:b.time??Date.now(),level:b.level??"info",component:b.component??"adam",msg:b.msg??""})}),Dn(A,{recursive:!0}),Dn(at(A,"logs"),{recursive:!0}),xn(at(A,"adam.port"),String(fe)),t.server.apiKey&&xn(at(A,"adam.key"),t.server.apiKey,{mode:384}),process.send?.({type:"ready",port:fe});let de=async()=>{C.info("Shutting down"),An(),Cr(),Xs(),xr(),await ce.stopAll(),$.stop(),ae.stop(),await ie.stop(),await _.close(),ut();try{ia(at(A,"adam.key"))}catch{}process.exit(0)};process.on("SIGINT",()=>{de()}),process.on("SIGTERM",()=>{de()})}da().catch(o=>{C.fatal(o,"Fatal error"),process.exit(1)});
|
package/package.json
CHANGED
package/dist/chunk-HICJBGGJ.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
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 ie}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 U,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 Ue,b as le,e as Ie,f as V}from"./chunk-U36NBCR3.js";import{e as $e,f as T,h as F,i as G,j as Oe,k as we,l as ae}from"./chunk-XNWZZYAV.js";import{b,d as oe}from"./chunk-PCSZW2PE.js";import{c as I,d as Fe}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 a=y(t,"agents");if(E(a)){let d=yt(a,{withFileTypes:!0});for(let p of d){if(!p.isFile()||!p.name.endsWith(".md"))continue;let g=r(y(a,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 a of s){let l=a.scope??"user";e?.scope&&l!==e.scope||e?.projectPath&&a.projectPath!==e.projectPath||n.push({id:o,name:o.split("@")[0],version:a.version??"",scope:l,projectPath:a.projectPath,installPath:a.installPath??y(Y(),o),enabled:r[o]??a.enabled??!0,installedAt:a.installedAt??"",lastUpdated:a.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 i}from"zod";ae();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 a={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(a),W(a);let l={id:J(),goalId:e,level:"L3",parentId:a.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=ie(t,500,0),s=n.completedAt&&n.startedAt?n.completedAt-n.startedAt:0,a=new Set,l=0,u=0;for(let p of o)p.type==="tool_call"&&p.toolName&&a.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:a.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 Ut(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 it(e,t=100){return b().prepare("SELECT * FROM trials WHERE goal_id = ? ORDER BY completed_at DESC LIMIT ?").all(e,t).map(Ut)}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)),a=this.calculateBudgetSpent(t),l=r.budgetUsd>0?Math.max(0,1-a/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 a=t.targetValue>0?t.currentValue/t.targetValue:0;return s>0?a/s:0}static calculateBudgetSpent(t){let r=it(t,1e3),n=0,o=new Set;for(let s of r)if(s.taskId&&!o.has(s.taskId)){o.add(s.taskId);let a=v(s.taskId);a?.costUsd&&(n+=a.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 Ft=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 a=this.getPromptTemplate(s.prompt??"",s.result??s.error??"",r),l,u,d;try{let g=await this.callClaude(a);l=g.score,u=g.confidence,d=g.reasoning}catch(g){Ft.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 a of n){let l=r.get(a.id)??0,u=a.weight*a.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 a=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:a,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:a,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:a,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 at(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,a;do s=this.randn(),a=1+o*s;while(a<=0);a=a*a*a;let l=Math.random();if(l<1-.0331*s*s*s*s||Math.log(l)<.5*s*s+n*(1-a+Math.log(a)))return n*a/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 a=this.sample(t);a&&n.set(a.id,(n.get(a.id)||0)+1)}let o=new Map;for(let[s,a]of n)o.set(s,a/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,a,l){dt(t,o),st({id:ut(),strategyId:t,goalId:r,taskId:n,reward:o,metricL2Score:s,metricL3Score:a,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,a=n.filter(u=>u.avgReward!==void 0).map(u=>u.avgReward),l=a.length>0?a.reduce((u,d)=>u+d,0)/a.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 a={id:`strat-${ut().slice(0,8)}`,roleId:t,taskType:r,name:n,promptTemplate:o,alpha:pt,beta:pt,totalTrials:0,createdAt:Date.now()};return at(a),a}static getTopStrategies(t,r,n=3){let s=L(t,r).filter(a=>a.totalTrials>0);return s.sort((a,l)=>(l.avgReward??0)-(a.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,a){let l=fe(r,n);return this.recordTrial(t,r,n,l.reward,o,s,a),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 a=[];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),a.push(d)}return a}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)}`,a=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:a,lastAccessed:a,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`),a=tr(s,"w");try{let l=It("node",[r,...e],{cwd:t.cwd,timeout:n,stdio:["ignore",a,"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 ir={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=ir[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 a=s.join(" \xB7 "),l=Object.keys(e.mcpServers??{});l.length>0&&(a+=` \xB7 MCP: ${l.join(", ")}`);let u=e.additionalDirectories??[];if(u.length>0&&(a+=` \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});a+=` \xB7 Plugins: ${d.join(", ")}`}return a}function ar(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),a=Ee(s);for(let[,l]of a)t.includes(l)||t.push(l)}try{let n=Ue(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=ar(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&&(U(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 a=v(s.taskId);return a?(Ve(t,r==="allow"?"approved":"denied",n),r==="allow"&&n==="permanent"&&xt({id:Lt.randomUUID(),roleId:s.roleId,taskPattern:a.prompt.slice(0,100).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),maxRiskLevel:s.plan.overallRisk,createdAt:Date.now(),createdByTaskId:a.id}),ke.emit({type:"plan_approval_decision",taskId:a.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 a of e)if(a.type==="session"&&a.sessionId)s.push({type:"session",sessionId:a.sessionId});else if(a.type==="channel"){let l=a.channelId,u=a.chatId;if(!l&&a.channelName){let d=r.find(p=>p.name.toLowerCase().includes(a.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:a.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:i.string()},pr={goalId:i.string(),status:i.string().optional(),currentValue:i.number().optional(),budgetUsd:i.number().optional(),notes:i.string().optional()},mr={goalId:i.string(),goalDescription:i.string(),maxSubtasks:i.number().optional()},D=i.union([i.object({type:i.literal("session"),sessionId:i.string()}),i.object({type:i.literal("channel"),channelName:i.string()}),i.object({type:i.literal("channel"),channelId:i.string(),chatId:i.string().optional()})]),gr={prompt:i.string(),roleId:i.string().describe("Role ID. Call list_roles first to find the best role for the task."),deliverTo:i.array(D).optional().describe("Where to deliver the task output (result full text). E.g., send result to a specific channel."),reportTo:i.array(D).optional().describe("Where to send status reports (completion summary). Defaults to the originating channel/session."),toolOverrides:i.object({allowedTools:i.array(i.string()).optional(),disallowedTools:i.array(i.string()).optional()}).optional()},fr={taskId:i.string(),goalId:i.string().optional(),strategyId:i.string().optional()},hr={roleId:i.string(),taskType:i.string(),name:i.string().optional()},br={status:i.string().optional(),limit:i.number().optional()},yr={taskId:i.string(),roleId:i.string()},vr={taskId:i.string().optional(),status:i.string().optional(),limit:i.number().optional()},wr={roleId:i.string(),allowedPaths:i.array(i.string()).optional(),deniedPaths:i.array(i.string()).optional(),allowedTools:i.array(i.string()).optional(),disallowedTools:i.array(i.string()).optional(),additionalDirectories:i.array(i.object({path:i.string(),inheritPlugins:i.boolean().optional(),inheritMcp:i.boolean().optional(),inheritPermissions:i.boolean().optional()})).optional(),allowedChannels:i.array(i.string()).optional(),inheritUserSettings:i.boolean().optional().describe("Enable/disable inheriting user-level settings (global plugins, MCP servers). Default: false (isolated).")},Ir={roleId:i.string().optional(),limit:i.number().optional()},Sr={name:i.string(),cagPrompt:i.string(),traits:i.array(i.string()).optional(),allowedTools:i.array(i.string()).optional(),disallowedTools:i.array(i.string()).optional(),additionalDirectories:i.array(i.object({path:i.string(),inheritPlugins:i.boolean().optional(),inheritMcp:i.boolean().optional(),inheritPermissions:i.boolean().optional()})).optional()},kr={roleId:i.string(),reason:i.string().optional()},Tr={name:i.string(),description:i.string().optional(),roleId:i.string().optional(),metric:i.string().optional(),targetValue:i.number().optional(),deadline:i.number().optional(),budgetUsd:i.number().optional(),deliverTo:i.array(D).optional().describe("Where to deliver goal completion notifications.")},Rr={name:i.string(),description:i.string().optional(),triggerType:i.enum(["cron","event"]),triggerCron:i.string().optional(),triggerEvent:i.string().optional(),prompt:i.string(),roleId:i.string().optional(),enabled:i.boolean().optional(),goalIds:i.array(i.string()).optional(),deliverTo:i.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:i.array(D).optional().describe("Where to send status reports (completion summary).")},_r={status:i.enum(["active","retired","probation"]).optional(),limit:i.number().optional()},Mr={enabled:i.boolean().optional()},Pr={},xr={},Lr={prompt:i.string().describe("The task prompt to execute after the delay"),delayMinutes:i.number().optional().describe("Minutes from now to execute (e.g., 30 for 'half an hour later')"),runAt:i.string().optional().describe("ISO 8601 timestamp to execute at (e.g., '2026-04-01T15:00:00+08:00')"),roleId:i.string().describe("Role ID to assign the task to. Call list_roles first."),deliverTo:i.array(D).optional().describe("Where to deliver the task output (result full text)."),reportTo:i.array(D).optional().describe("Where to send status reports (completion summary).")},Er={roleId:i.string().optional().describe("If provided, shows which plugins are installed in that role's workspace.")},Cr={roleId:i.string().describe("Role ID to install the plugin under (project-scope)."),pluginId:i.string().describe("Plugin ID (e.g. 'github@anthropic'). Use list_available_plugins to discover available plugins.")},Dr={roleId:i.string().describe("Role ID to uninstall the plugin from."),pluginId:i.string().describe("Plugin ID to uninstall.")},Ar={roleId:i.string().describe("Role ID to bind the MCP server to."),mcpName:i.string().describe("Name for this MCP server (e.g., 'github', 'filesystem')."),mcpConfig:i.record(i.string(),i.unknown()).describe("MCP server configuration object.")},Nr={roleId:i.string().describe("Role ID to unbind the MCP server from."),mcpName:i.string().describe("Name of the MCP server to remove.")},jr={pluginId:i.string().describe("Plugin ID (e.g., 'github@anthropic').")},$r={pluginId:i.string().describe("Plugin ID (e.g., 'github@anthropic').")},Or={pluginId:i.string().describe("Plugin ID (e.g., 'github@anthropic').")},Ur={pluginId:i.string().describe("Plugin ID (e.g., 'github@anthropic').")},Fr={},Gr={},Vr={pluginId:i.string().describe("Plugin ID (e.g., 'github@anthropic').")},Br={roleId:i.string().describe("Role ID to associate scanned plugins with."),path:i.string().describe("Directory path to scan for .claude/settings.json.")},Wr={taskId:i.string().describe("Task ID to cancel.")},Jr={taskId:i.string().describe("Task ID to get logs for."),limit:i.number().optional().describe("Max log entries (default 20).")},qr={roleId:i.string().describe("Role ID to delete.")},Hr={},Kr={updates:i.record(i.string(),i.unknown()).describe("Config key-value pairs to update. Example: { 'defaults.maxTurns': 50, 'logging.level': 'debug' }")},Yr={roleId:i.string().describe("Role ID to list memories for."),limit:i.number().optional().describe("Max results (default 20).")},zr={templateId:i.string().describe("Template ID to update."),name:i.string().optional(),enabled:i.boolean().optional(),prompt:i.string().optional(),triggerCron:i.string().optional(),triggerEvent:i.string().optional(),roleId:i.string().optional()},Qr={templateId:i.string().describe("Template ID to delete.")},Xr={templateId:i.string().describe("Template ID to run immediately.")},Zr={enabled:i.boolean().optional().describe("Filter by enabled status.")},en={eventType:i.string().describe("Event type that triggers this rule (e.g., 'task_complete')."),channelId:i.string().describe("Channel ID to deliver to."),format:i.string().optional().describe("Format template (e.g., 'summary', 'full'). Default: 'summary'."),matchCriteria:i.record(i.string(),i.unknown()).optional().describe("JSON match criteria for event fields."),enabled:i.boolean().optional().describe("Enable this rule immediately (default true).")},tn={ruleId:i.string().describe("Delivery rule ID to delete.")},rn={roleId:i.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.`,a=o({prompt:s,options:{cwd:process.cwd(),maxTurns:1,maxBudgetUsd:.02}}),l="";for await(let d of a){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)}`,a=`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:a,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"]},a="general";for(let[O,R]of Object.entries(s))if(R.some(Ct=>o.includes(Ct))){a=O;break}let l,u=e.prompt,d=S.selectStrategy(e.roleId,a);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:i.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:i.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?(U(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 F(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(a=>a.name),agents:s.agents.map(a=>a.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)?(F(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,a={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(a),c({templateId:r,name:a.name,trigger:a.trigger})}),m("list_templates","List task templates (automations). Use this to check existing scheduled/recurring tasks before creating new ones.",{enabled:i.boolean().optional().describe("Filter by enabled status. Omit to list all."),limit:i.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 (text, image, voice, video, file) to a connected channel by name. Use this to deliver task results, media, or notifications to a specific channel (e.g., WeChat on iPad). For media: provide mediaUrl pointing to the file and mediaType.",{channelName:i.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:i.string().describe("The message content to send (text caption when sending media)"),mediaUrl:i.string().optional().describe("Local file path or remote URL of media to send. Local paths (e.g. /Users/.../file.mp3) and http(s) URLs both work."),mediaType:i.enum(["image","audio","video","file"]).optional().describe("Type of the media file. Required when mediaUrl is provided")},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-DZTXBUTP.js"),s=await n().send({channelId:r.channelId,chatId:r.chatId,content:e.message,messageType:"deliver",mediaUrl:e.mediaUrl,mediaType:e.mediaType});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,a=r.find(l=>l.source.type==="channel"&&l.source.channelId===o.id&&l.source.chatId);return a?.source.chatId?s=a.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(),a=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:a},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-25VACELK.js"),p=d();return p&&p.scheduleOnceJob(s),c({templateId:s,executeAt:a,prompt:e.prompt})}),m("cancel_scheduled_task","Cancel a previously scheduled one-shot task by its template ID. The task will not execute.",{templateId:i.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-25VACELK.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}=(ae(),x(we)),{listInstalledPlugins:a}=(ye(),x(wt)),l=s(e.roleId);if(!l)return[];let u=o(l.name);return a({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}=(ae(),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}=(ae(),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 F(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 F(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"),a=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:a.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.",Ur,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).",Fr,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;U(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=ie(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],a={};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}a[l]={value:d,mutable:!t.includes(l)}}return c({config:a,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"]&&Fe(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:i.string(),operationId:i.string().optional().describe("ID of the specific operation. If omitted, authorizes the most recent pending operation."),scope:i.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:i.string(),operationId:i.string().optional(),reason:i.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,ar as w,Yo as x,zo as y};
|