adam-agent-server 1.4.0 → 1.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-W5AOIGEQ.js +1 -0
- package/dist/{approval-handler-JZSXM4AD.js → approval-handler-ORD4MUVM.js} +1 -1
- package/dist/audit-manager-YCJT2WP5.js +1 -0
- package/dist/bree-engine-R5YLSDCL.js +1 -0
- package/dist/{channels-PUOPR5Y2.js → channels-HYSB2EEK.js} +1 -1
- package/dist/channels-JCMPPQED.js +1 -0
- package/dist/{chunk-KO5AFX5U.js → chunk-23VZKIB6.js} +1 -1
- package/dist/{chunk-GYHOPV4Q.js → chunk-2DLVAKH7.js} +1 -1
- package/dist/chunk-2YAP4YJV.js +57 -0
- package/dist/{chunk-HYDCXE5K.js → chunk-5S6BMWD2.js} +1 -1
- package/dist/chunk-5XUR3M23.js +12 -0
- package/dist/chunk-6775OYXA.js +47 -0
- package/dist/{chunk-KOWFPY2J.js → chunk-6FXNB7NE.js} +1 -1
- package/dist/{chunk-QQWRV23T.js → chunk-7L2WQM7N.js} +1 -1
- package/dist/{chunk-L4Y3GR6W.js → chunk-BR2JY5X2.js} +1 -1
- package/dist/{chunk-7BSWC62F.js → chunk-C6BOQJJF.js} +1 -1
- package/dist/{chunk-DMZM7RU6.js → chunk-DZEVMYPB.js} +1 -1
- package/dist/{chunk-J3NIPZ73.js → chunk-GBTG5B5R.js} +2 -2
- package/dist/chunk-GY52JA5I.js +10 -0
- package/dist/{chunk-YHH3QMLL.js → chunk-H54ZXA26.js} +1 -1
- package/dist/{chunk-3567PCEJ.js → chunk-H7VDC6FY.js} +2 -2
- package/dist/{chunk-I5IUTZA3.js → chunk-HDP7A4XY.js} +1 -1
- package/dist/{chunk-XF4IERYF.js → chunk-HTPUEIFT.js} +1 -1
- package/dist/{chunk-XAMLLKKA.js → chunk-ISZJV72D.js} +1 -1
- package/dist/{chunk-4VHBKJD5.js → chunk-JAS3TUZX.js} +2 -2
- package/dist/chunk-MTWLLE26.js +49 -0
- package/dist/{chunk-EZGMA3VV.js → chunk-QVKI7H7W.js} +1 -1
- package/dist/{chunk-24GTCFEV.js → chunk-QWCRZDZS.js} +1 -1
- package/dist/{chunk-NZEDILAK.js → chunk-R4GIIQ7G.js} +1 -1
- package/dist/chunk-RAW263MQ.js +99 -0
- package/dist/{chunk-T7GEINGZ.js → chunk-S3BAIZ4Q.js} +1 -1
- package/dist/chunk-VRJ7R766.js +1 -0
- package/dist/{chunk-CKIVKM5T.js → chunk-XL46AGRZ.js} +2 -2
- package/dist/{chunk-6THDALGC.js → chunk-Y3AMO6WC.js} +1 -1
- package/dist/{chunk-RUY23IJK.js → chunk-YVS565QY.js} +1 -1
- package/dist/{chunk-JKPSEMUZ.js → chunk-Z4D3L2HR.js} +1 -1
- package/dist/cli.js +1 -1
- package/dist/{config-CBNOT66B.js → config-EMNKHR3W.js} +1 -1
- package/dist/{db-XQUI4IBL.js → db-YUYXVV3A.js} +1 -1
- package/dist/{delivery-log-T56ZYDWO.js → delivery-log-VKONLSVD.js} +1 -1
- package/dist/engine-BM5BMPIC.js +1 -0
- package/dist/{evolution-audit-JZ2U7J4C.js → evolution-audit-LZSQPDHH.js} +1 -1
- package/dist/index.js +18 -12
- package/dist/learner-IJN6B7KV.js +1 -0
- package/dist/{memories-EKREXLT6.js → memories-ZII5QSTJ.js} +1 -1
- package/dist/{memory-extractor-JO7OHBZP.js → memory-extractor-DIYJFBCI.js} +2 -2
- package/dist/memory-service-QMYJPBAE.js +1 -0
- package/dist/outbound-gateway-6K6P2BEH.js +1 -0
- package/dist/role-presets-K2BDRZBS.js +1 -0
- package/dist/roles-L34L5MK3.js +1 -0
- package/dist/{session-manager-PWJLU6KZ.js → session-manager-GRJ3FV3L.js} +1 -1
- package/dist/{task-templates-ED2UCUPE.js → task-templates-23YOAF3E.js} +1 -1
- package/dist/workflow-executor-JTUWX5DC.js +1 -0
- package/package.json +1 -1
- package/dist/adam-tools-KTLBI4PA.js +0 -1
- package/dist/audit-manager-BPJEAX22.js +0 -1
- package/dist/bree-engine-CRK73AI4.js +0 -1
- package/dist/channels-WMTZJAO4.js +0 -1
- package/dist/chunk-DBI36EGR.js +0 -83
- package/dist/chunk-HQ66TFYI.js +0 -12
- package/dist/chunk-I67UMGJM.js +0 -10
- package/dist/chunk-NOUSHXGX.js +0 -6
- package/dist/chunk-WRETNOC3.js +0 -99
- package/dist/chunk-ZRUVORAJ.js +0 -49
- package/dist/engine-7DFJOADQ.js +0 -1
- package/dist/learner-4EO7ZKK4.js +0 -1
- package/dist/memory-service-Y3HVQYHM.js +0 -1
- package/dist/outbound-gateway-U5LP54JG.js +0 -1
- package/dist/role-presets-HWZHXBBA.js +0 -1
- package/dist/roles-3AEHVOEW.js +0 -1
- package/dist/workflow-executor-XFTTJQNE.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as r,d as s}from"./chunk-
|
|
1
|
+
import{b as r,d as s}from"./chunk-JAS3TUZX.js";import{c as i}from"./chunk-FCV2DPZQ.js";function p(e){let n=r().prepare("SELECT value FROM config WHERE key = ?").get(e);if(n)try{return JSON.parse(n.value)}catch{return n.value}}function E(e,t){let n=r(),o=JSON.stringify(t),u=Date.now();n.prepare(`INSERT INTO config (key, value, updated_at) VALUES (?, ?, ?)
|
|
2
2
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`).run(e,o,u)}function k(){let t=r().prepare("SELECT key, value FROM config").all(),n={};for(let o of t)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return n}function b(e){let t=r(),n=t.prepare("INSERT OR IGNORE INTO config (key, value, updated_at) VALUES (?, ?, ?)"),o=Date.now(),u=0;return t.transaction(()=>{for(let[c,a]of Object.entries(e)){if(a==null||a==="")continue;n.run(c,JSON.stringify(a),o).changes>0&&u++}})(),u}function w(){return r().prepare("SELECT COUNT(*) as count FROM config").get().count===0}function O(e){return r().prepare("DELETE FROM config WHERE key = ?").run(e).changes>0}var d=i(()=>{s()});export{p as a,E as b,k as c,b as d,w as e,O as f,d as g};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as a,d as u}from"./chunk-
|
|
1
|
+
import{b as a,d as u}from"./chunk-JAS3TUZX.js";u();function l(e){return{id:e.id,eventType:e.event_type,matchCriteria:JSON.parse(e.match_criteria),target:JSON.parse(e.target),formatTemplate:e.format_template??void 0,maxPerMinute:e.max_per_minute,skipOriginChannel:e.skip_origin_channel===1,enabled:e.enabled===1,createdAt:e.created_at,createdBy:e.created_by??void 0}}function d(e){a().prepare(`
|
|
2
2
|
INSERT INTO delivery_rules (id, event_type, match_criteria, target, format_template,
|
|
3
3
|
max_per_minute, skip_origin_channel, enabled, created_at, created_by)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{l as f,r as h}from"./chunk-GBTG5B5R.js";import{b as u,d as E}from"./chunk-JAS3TUZX.js";E();h();function l(e){return{id:e.id,roleId:e.role_id,type:e.type,content:e.content,embedding:e.embedding?new Float32Array(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength/4):void 0,keywords:e.keywords?JSON.parse(e.keywords):[],importance:e.importance,sourceType:e.source_type,sourceTaskId:e.source_task_id??void 0,evidence:e.evidence?JSON.parse(e.evidence):void 0,createdAt:e.created_at,lastAccessed:e.last_accessed,retrievedCount:e.retrieved_count,tier:e.tier,supersededBy:e.superseded_by??void 0}}function b(e){return Buffer.from(e.buffer,e.byteOffset,e.byteLength)}function v(e){u().prepare(`
|
|
2
2
|
INSERT INTO memories (id, role_id, type, content, embedding, keywords,
|
|
3
3
|
importance, source_type, source_task_id, evidence,
|
|
4
4
|
created_at, last_accessed, retrieved_count, tier, superseded_by)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{f as s,j as w}from"./chunk-
|
|
1
|
+
import{f as s,j as w}from"./chunk-QWCRZDZS.js";import{k as i,l as f,o as g,r as y}from"./chunk-GBTG5B5R.js";import{c as p,h}from"./chunk-INNDBLZE.js";y();w();h();import{v4 as c}from"uuid";var t=p("store"),a="role-chat-manager",l=[{name:"Engineer",cagPrompt:`Role: General-purpose software engineer.
|
|
2
2
|
Capabilities: Read, write, and edit code; run shell commands; search codebases.
|
|
3
3
|
Approach: Analyze requirements \u2192 implement \u2192 test \u2192 verify. Write tests for new code. Follow existing code patterns.
|
|
4
4
|
Best for: Feature implementation, bug fixes, refactoring, build/deploy scripts.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{a as p,g as N}from"./chunk-QQWRV23T.js";import{b as o,d as C}from"./chunk-4VHBKJD5.js";import{b as l,h as g}from"./chunk-WBAPIPST.js";import{c,e as A}from"./chunk-FCV2DPZQ.js";import*as h from"os";import*as y from"path";function u(e){return e.startsWith("~/")||e==="~"?y.join(h.homedir(),e.slice(1)):e}var _=c(()=>{"use strict";g()});function R(e){return w.includes(e)}function S(e){return v[e]}function E(){return w.map(e=>v[e])}function V(e,i=e!=="none"){return E().map(s=>T(s,e,i))}function T(e,i,s=i!=="none"){return process.platform==="darwin"?e.status==="runtime-enforced"&&(i!=="sandbox-exec"||!s)?{...e,availability:"runtime-unavailable",editable:!1,effectiveDisabledReason:"Current runtime has no macOS sandbox backend; Adam cannot enforce this capability on Roles."}:e.status==="runtime-enforced"?{...e,availability:"editable",editable:!0}:{...e,availability:e.status,editable:!1,effectiveDisabledReason:e.disabledReason}:{...e,availability:"platform-unsupported",editable:!1,effectiveDisabledReason:"macOS only"}}function z(e){if(!e?.length)return;for(let s of e)if(!R(s.id))throw new Error(`Unknown OS capability: ${s.id}`);let i=d(e);if(i?.length){for(let s of i){let t=S(s.id);if(t.status!=="runtime-enforced")throw new Error(`OS capability '${t.label}' is not editable in Role settings`);if(t.supportsTargets){if(!s.targets?.length)throw new Error(`OS capability '${t.label}' requires at least one target bundle id`);for(let n of s.targets)if(!D(n))throw new Error(`Invalid automation target bundle id: ${n}`)}else if(s.targets?.length)throw new Error(`OS capability '${t.label}' does not accept targets`)}return i}}function d(e){if(!e||e.length===0)return;let i=new Set,s=[];for(let t of e){if(!R(t.id))throw new Error(`Unknown OS capability: ${t.id}`);if(i.has(t.id))continue;i.add(t.id);let n=S(t.id),a={id:t.id};n.supportsTargets&&t.targets?.length&&(a.targets=[...new Set(t.targets.map(r=>r.trim()).filter(Boolean))]),s.push(a)}return s.length>0?s.sort((t,n)=>t.id.localeCompare(n.id)):void 0}function D(e){return x.test(e)}var w,v,x,O=c(()=>{"use strict";w=["location-services","calendars","contacts","files-and-folders","full-disk-access","homekit","media-and-apple-music","passkeys-access-for-web-browsers","photos","reminders","accessibility","app-management","automation","bluetooth","camera","developer-tools","focus","input-monitoring","local-network","microphone","motion-and-fitness","remote-desktop","screen-and-system-audio-recording","speech-recognition"],v={"location-services":{id:"location-services",label:"Location Services",description:"Access device location and region context.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},calendars:{id:"calendars",label:"Calendars",description:"Access Calendar data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},contacts:{id:"contacts",label:"Contacts",description:"Access Contacts data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"files-and-folders":{id:"files-and-folders",label:"Files & Folders",description:"Host-level file access categories managed outside Role sandboxing.",platform:"darwin",status:"host-only",disabledReason:"Role file boundaries are already controlled by visiblePaths and deniedReadPaths."},"full-disk-access":{id:"full-disk-access",label:"Full Disk Access",description:"Host-level macOS grant for protected storage locations.",platform:"darwin",status:"host-only",disabledReason:"This is a host app permission, not a Role-level control."},homekit:{id:"homekit",label:"HomeKit",description:"Access HomeKit devices and home automation data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"media-and-apple-music":{id:"media-and-apple-music",label:"Media & Apple Music",description:"Access Apple Music and media library data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"passkeys-access-for-web-browsers":{id:"passkeys-access-for-web-browsers",label:"Passkeys Access for Web Browsers",description:"Access passkeys for browser-integrated authentication.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},photos:{id:"photos",label:"Photos",description:"Access the Photos library via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},reminders:{id:"reminders",label:"Reminders",description:"Access Reminder data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},accessibility:{id:"accessibility",label:"Accessibility",description:"Control desktop UI and accessibility automation surfaces.",platform:"darwin",status:"runtime-enforced"},"app-management":{id:"app-management",label:"App Management",description:"Manage or inspect other installed applications.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},automation:{id:"automation",label:"Automation",description:"Launch and control other apps via Apple Events.",platform:"darwin",status:"runtime-enforced",supportsTargets:!0},bluetooth:{id:"bluetooth",label:"Bluetooth",description:"Access nearby Bluetooth devices.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},camera:{id:"camera",label:"Camera",description:"Capture camera input.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"developer-tools":{id:"developer-tools",label:"Developer Tools",description:"Use system developer tooling privileges.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},focus:{id:"focus",label:"Focus",description:"Access Focus state and related automation.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"input-monitoring":{id:"input-monitoring",label:"Input Monitoring",description:"Observe keyboard and input device activity.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"local-network":{id:"local-network",label:"Local Network",description:"Discover and communicate with devices on the local network.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},microphone:{id:"microphone",label:"Microphone",description:"Capture microphone input.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"motion-and-fitness":{id:"motion-and-fitness",label:"Motion & Fitness",description:"Access motion and fitness sensor data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"remote-desktop":{id:"remote-desktop",label:"Remote Desktop",description:"Control or observe remote desktop sessions.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"screen-and-system-audio-recording":{id:"screen-and-system-audio-recording",label:"Screen & System Audio Recording",description:"Capture the screen and system audio.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"speech-recognition":{id:"speech-recognition",label:"Speech Recognition",description:"Use system speech recognition services.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."}},x=/^[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/});var L={};A(L,{createRole:()=>J,deleteRole:()=>U,getRole:()=>P,getRoleByName:()=>I,listRoles:()=>B,updateRole:()=>k,validateAdditionalDirectories:()=>f});import{existsSync as M}from"fs";import{resolve as m}from"path";function f(e,i){for(let s of e){let t=typeof s=="string"?s:s.path;if(!t.startsWith("/")&&!t.startsWith("~/")&&t!=="~")throw new Error(`additionalDirectories must be absolute paths: '${t}' is not absolute`);let n=m(u(t));if(!n.startsWith("/"))throw new Error(`additionalDirectories must be absolute paths: '${t}' is not absolute`);for(let a of l){let r=m(u(a));if(n.startsWith(r))throw new Error(`additionalDirectories cannot include hardcoded denied path: '${t}' matches '${a}'`)}if(i?.length)for(let a of i){let r=m(u(a));if(n.startsWith(r)||r.startsWith(n))throw new Error(`additionalDirectories cannot overlap with deniedReadPaths: '${t}' conflicts with '${a}'`)}if(!M(n))throw new Error(`additionalDirectories path does not exist: '${t}'`)}}function b(e){return{id:e.id,name:e.name,cagPrompt:e.cag_prompt,learnedRules:e.learned_rules?JSON.parse(e.learned_rules):[],memoryStreamId:e.memory_stream_id,status:e.status,performanceScore:e.performance_score??void 0,preferences:e.preferences?JSON.parse(e.preferences):{},createdAt:e.created_at,updatedAt:e.updated_at??void 0,allowedTools:e.allowed_tools?JSON.parse(e.allowed_tools):void 0,disallowedTools:e.disallowed_tools?JSON.parse(e.disallowed_tools):void 0,evaluationCriteria:e.evaluation_criteria?JSON.parse(e.evaluation_criteria):void 0,executionMode:e.execution_mode??void 0,model:e.model??void 0,maxBudgetUsd:e.max_budget_usd??void 0,approvalRequired:e.approval_required?JSON.parse(e.approval_required):void 0,source:e.source??void 0,additionalDirectories:(()=>{if(e.additional_directories!==null)try{let i=JSON.parse(e.additional_directories);return Array.isArray(i)?i.map(s=>typeof s=="string"?{path:s}:s):void 0}catch{return}})(),allowedChannels:e.allowed_channels?JSON.parse(e.allowed_channels):void 0,mcpServers:e.mcp_servers?JSON.parse(e.mcp_servers):void 0,inheritUserSettings:e.inherit_user_settings===1?!0:void 0,permissionMode:e.permission_mode??void 0,allowedBashPatterns:e.allowed_bash_patterns?JSON.parse(e.allowed_bash_patterns):void 0,deniedBashPatterns:e.denied_bash_patterns?JSON.parse(e.denied_bash_patterns):void 0,envVars:e.env_vars?JSON.parse(e.env_vars):void 0,osCapabilities:e.os_capabilities?d(JSON.parse(e.os_capabilities)):void 0}}function J(e){let i=p("defaults.deniedReadPaths")??[...l];e.additionalDirectories&&f(e.additionalDirectories,i),o().prepare(`
|
|
1
|
+
import{a as p,g as N}from"./chunk-7L2WQM7N.js";import{b as o,d as C}from"./chunk-JAS3TUZX.js";import{b as l,h as g}from"./chunk-WBAPIPST.js";import{c,e as A}from"./chunk-FCV2DPZQ.js";import*as h from"os";import*as y from"path";function u(e){return e.startsWith("~/")||e==="~"?y.join(h.homedir(),e.slice(1)):e}var _=c(()=>{"use strict";g()});function R(e){return w.includes(e)}function S(e){return v[e]}function E(){return w.map(e=>v[e])}function V(e,i=e!=="none"){return E().map(s=>T(s,e,i))}function T(e,i,s=i!=="none"){return process.platform==="darwin"?e.status==="runtime-enforced"&&(i!=="sandbox-exec"||!s)?{...e,availability:"runtime-unavailable",editable:!1,effectiveDisabledReason:"Current runtime has no macOS sandbox backend; Adam cannot enforce this capability on Roles."}:e.status==="runtime-enforced"?{...e,availability:"editable",editable:!0}:{...e,availability:e.status,editable:!1,effectiveDisabledReason:e.disabledReason}:{...e,availability:"platform-unsupported",editable:!1,effectiveDisabledReason:"macOS only"}}function z(e){if(!e?.length)return;for(let s of e)if(!R(s.id))throw new Error(`Unknown OS capability: ${s.id}`);let i=d(e);if(i?.length){for(let s of i){let t=S(s.id);if(t.status!=="runtime-enforced")throw new Error(`OS capability '${t.label}' is not editable in Role settings`);if(t.supportsTargets){if(!s.targets?.length)throw new Error(`OS capability '${t.label}' requires at least one target bundle id`);for(let n of s.targets)if(!D(n))throw new Error(`Invalid automation target bundle id: ${n}`)}else if(s.targets?.length)throw new Error(`OS capability '${t.label}' does not accept targets`)}return i}}function d(e){if(!e||e.length===0)return;let i=new Set,s=[];for(let t of e){if(!R(t.id))throw new Error(`Unknown OS capability: ${t.id}`);if(i.has(t.id))continue;i.add(t.id);let n=S(t.id),a={id:t.id};n.supportsTargets&&t.targets?.length&&(a.targets=[...new Set(t.targets.map(r=>r.trim()).filter(Boolean))]),s.push(a)}return s.length>0?s.sort((t,n)=>t.id.localeCompare(n.id)):void 0}function D(e){return x.test(e)}var w,v,x,O=c(()=>{"use strict";w=["location-services","calendars","contacts","files-and-folders","full-disk-access","homekit","media-and-apple-music","passkeys-access-for-web-browsers","photos","reminders","accessibility","app-management","automation","bluetooth","camera","developer-tools","focus","input-monitoring","local-network","microphone","motion-and-fitness","remote-desktop","screen-and-system-audio-recording","speech-recognition"],v={"location-services":{id:"location-services",label:"Location Services",description:"Access device location and region context.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},calendars:{id:"calendars",label:"Calendars",description:"Access Calendar data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},contacts:{id:"contacts",label:"Contacts",description:"Access Contacts data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"files-and-folders":{id:"files-and-folders",label:"Files & Folders",description:"Host-level file access categories managed outside Role sandboxing.",platform:"darwin",status:"host-only",disabledReason:"Role file boundaries are already controlled by visiblePaths and deniedReadPaths."},"full-disk-access":{id:"full-disk-access",label:"Full Disk Access",description:"Host-level macOS grant for protected storage locations.",platform:"darwin",status:"host-only",disabledReason:"This is a host app permission, not a Role-level control."},homekit:{id:"homekit",label:"HomeKit",description:"Access HomeKit devices and home automation data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"media-and-apple-music":{id:"media-and-apple-music",label:"Media & Apple Music",description:"Access Apple Music and media library data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"passkeys-access-for-web-browsers":{id:"passkeys-access-for-web-browsers",label:"Passkeys Access for Web Browsers",description:"Access passkeys for browser-integrated authentication.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},photos:{id:"photos",label:"Photos",description:"Access the Photos library via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},reminders:{id:"reminders",label:"Reminders",description:"Access Reminder data via macOS privacy controls.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},accessibility:{id:"accessibility",label:"Accessibility",description:"Control desktop UI and accessibility automation surfaces.",platform:"darwin",status:"runtime-enforced"},"app-management":{id:"app-management",label:"App Management",description:"Manage or inspect other installed applications.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},automation:{id:"automation",label:"Automation",description:"Launch and control other apps via Apple Events.",platform:"darwin",status:"runtime-enforced",supportsTargets:!0},bluetooth:{id:"bluetooth",label:"Bluetooth",description:"Access nearby Bluetooth devices.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},camera:{id:"camera",label:"Camera",description:"Capture camera input.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"developer-tools":{id:"developer-tools",label:"Developer Tools",description:"Use system developer tooling privileges.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},focus:{id:"focus",label:"Focus",description:"Access Focus state and related automation.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"input-monitoring":{id:"input-monitoring",label:"Input Monitoring",description:"Observe keyboard and input device activity.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"local-network":{id:"local-network",label:"Local Network",description:"Discover and communicate with devices on the local network.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},microphone:{id:"microphone",label:"Microphone",description:"Capture microphone input.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"motion-and-fitness":{id:"motion-and-fitness",label:"Motion & Fitness",description:"Access motion and fitness sensor data.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"remote-desktop":{id:"remote-desktop",label:"Remote Desktop",description:"Control or observe remote desktop sessions.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"screen-and-system-audio-recording":{id:"screen-and-system-audio-recording",label:"Screen & System Audio Recording",description:"Capture the screen and system audio.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."},"speech-recognition":{id:"speech-recognition",label:"Speech Recognition",description:"Use system speech recognition services.",platform:"darwin",status:"registered-unwired",disabledReason:"Not wired into Adam runtime yet."}},x=/^[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/});var L={};A(L,{createRole:()=>J,deleteRole:()=>U,getRole:()=>P,getRoleByName:()=>I,listRoles:()=>B,updateRole:()=>k,validateAdditionalDirectories:()=>f});import{existsSync as M}from"fs";import{resolve as m}from"path";function f(e,i){for(let s of e){let t=typeof s=="string"?s:s.path;if(!t.startsWith("/")&&!t.startsWith("~/")&&t!=="~")throw new Error(`additionalDirectories must be absolute paths: '${t}' is not absolute`);let n=m(u(t));if(!n.startsWith("/"))throw new Error(`additionalDirectories must be absolute paths: '${t}' is not absolute`);for(let a of l){let r=m(u(a));if(n.startsWith(r))throw new Error(`additionalDirectories cannot include hardcoded denied path: '${t}' matches '${a}'`)}if(i?.length)for(let a of i){let r=m(u(a));if(n.startsWith(r)||r.startsWith(n))throw new Error(`additionalDirectories cannot overlap with deniedReadPaths: '${t}' conflicts with '${a}'`)}if(!M(n))throw new Error(`additionalDirectories path does not exist: '${t}'`)}}function b(e){return{id:e.id,name:e.name,cagPrompt:e.cag_prompt,learnedRules:e.learned_rules?JSON.parse(e.learned_rules):[],memoryStreamId:e.memory_stream_id,status:e.status,performanceScore:e.performance_score??void 0,preferences:e.preferences?JSON.parse(e.preferences):{},createdAt:e.created_at,updatedAt:e.updated_at??void 0,allowedTools:e.allowed_tools?JSON.parse(e.allowed_tools):void 0,disallowedTools:e.disallowed_tools?JSON.parse(e.disallowed_tools):void 0,evaluationCriteria:e.evaluation_criteria?JSON.parse(e.evaluation_criteria):void 0,executionMode:e.execution_mode??void 0,model:e.model??void 0,maxBudgetUsd:e.max_budget_usd??void 0,approvalRequired:e.approval_required?JSON.parse(e.approval_required):void 0,source:e.source??void 0,additionalDirectories:(()=>{if(e.additional_directories!==null)try{let i=JSON.parse(e.additional_directories);return Array.isArray(i)?i.map(s=>typeof s=="string"?{path:s}:s):void 0}catch{return}})(),allowedChannels:e.allowed_channels?JSON.parse(e.allowed_channels):void 0,mcpServers:e.mcp_servers?JSON.parse(e.mcp_servers):void 0,inheritUserSettings:e.inherit_user_settings===1?!0:void 0,permissionMode:e.permission_mode??void 0,allowedBashPatterns:e.allowed_bash_patterns?JSON.parse(e.allowed_bash_patterns):void 0,deniedBashPatterns:e.denied_bash_patterns?JSON.parse(e.denied_bash_patterns):void 0,envVars:e.env_vars?JSON.parse(e.env_vars):void 0,osCapabilities:e.os_capabilities?d(JSON.parse(e.os_capabilities)):void 0}}function J(e){let i=p("defaults.deniedReadPaths")??[...l];e.additionalDirectories&&f(e.additionalDirectories,i),o().prepare(`
|
|
2
2
|
INSERT INTO roles (id, name, cag_prompt, learned_rules, memory_stream_id, status,
|
|
3
3
|
performance_score, preferences, created_at, updated_at,
|
|
4
4
|
allowed_tools, disallowed_tools, evaluation_criteria, execution_mode, model,
|
|
5
5
|
max_budget_usd, approval_required, source, additional_directories, allowed_channels, mcp_servers, inherit_user_settings,
|
|
6
6
|
permission_mode, allowed_bash_patterns, denied_bash_patterns, env_vars, os_capabilities)
|
|
7
7
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
8
|
-
`).run(e.id,e.name,e.cagPrompt,JSON.stringify(e.learnedRules),e.memoryStreamId,e.status,e.performanceScore??null,e.preferences?JSON.stringify(e.preferences):null,e.createdAt,e.updatedAt??null,e.allowedTools?JSON.stringify(e.allowedTools):null,e.disallowedTools?JSON.stringify(e.disallowedTools):null,e.evaluationCriteria?JSON.stringify(e.evaluationCriteria):null,e.executionMode??null,e.model??null,e.maxBudgetUsd??null,e.approvalRequired?JSON.stringify(e.approvalRequired):null,e.source??null,e.additionalDirectories?JSON.stringify(e.additionalDirectories):null,e.allowedChannels?JSON.stringify(e.allowedChannels):null,e.mcpServers?JSON.stringify(e.mcpServers):null,e.inheritUserSettings?1:0,e.permissionMode??null,e.allowedBashPatterns?JSON.stringify(e.allowedBashPatterns):null,e.deniedBashPatterns?JSON.stringify(e.deniedBashPatterns):null,e.envVars?JSON.stringify(e.envVars):null,e.osCapabilities?JSON.stringify(d(e.osCapabilities)):null)}function P(e){let s=o().prepare("SELECT * FROM roles WHERE id = ?").get(e);return s?b(s):void 0}function I(e){let s=o().prepare("SELECT * FROM roles WHERE name = ?").get(e);return s?b(s):void 0}function k(e,i){let s=o(),t=[],n=[];if("name"in i&&(t.push("name = ?"),n.push(i.name)),"cagPrompt"in i&&(t.push("cag_prompt = ?"),n.push(i.cagPrompt)),"learnedRules"in i&&(t.push("learned_rules = ?"),n.push(JSON.stringify(i.learnedRules))),"memoryStreamId"in i&&(t.push("memory_stream_id = ?"),n.push(i.memoryStreamId)),"status"in i&&(t.push("status = ?"),n.push(i.status)),"performanceScore"in i&&(t.push("performance_score = ?"),n.push(i.performanceScore??null)),"preferences"in i&&(t.push("preferences = ?"),n.push(i.preferences?JSON.stringify(i.preferences):null)),"updatedAt"in i&&(t.push("updated_at = ?"),n.push(i.updatedAt??null)),"allowedTools"in i&&(t.push("allowed_tools = ?"),n.push(i.allowedTools?JSON.stringify(i.allowedTools):null)),"disallowedTools"in i&&(t.push("disallowed_tools = ?"),n.push(i.disallowedTools?JSON.stringify(i.disallowedTools):null)),"evaluationCriteria"in i&&(t.push("evaluation_criteria = ?"),n.push(i.evaluationCriteria?JSON.stringify(i.evaluationCriteria):null)),"executionMode"in i&&(t.push("execution_mode = ?"),n.push(i.executionMode??null)),"model"in i&&(t.push("model = ?"),n.push(i.model??null)),"maxBudgetUsd"in i&&(t.push("max_budget_usd = ?"),n.push(i.maxBudgetUsd??null)),"approvalRequired"in i&&(t.push("approval_required = ?"),n.push(i.approvalRequired?JSON.stringify(i.approvalRequired):null)),"source"in i&&(t.push("source = ?"),n.push(i.source??null)),"additionalDirectories"in i){let a=p("defaults.deniedReadPaths")??[...l];i.additionalDirectories&&f(i.additionalDirectories,a),t.push("additional_directories = ?"),n.push(i.additionalDirectories?JSON.stringify(i.additionalDirectories):null)}"allowedChannels"in i&&(t.push("allowed_channels = ?"),n.push(i.allowedChannels?JSON.stringify(i.allowedChannels):null)),"mcpServers"in i&&(t.push("mcp_servers = ?"),n.push(i.mcpServers?JSON.stringify(i.mcpServers):null)),"inheritUserSettings"in i&&(t.push("inherit_user_settings = ?"),n.push(i.inheritUserSettings?1:0)),"permissionMode"in i&&(t.push("permission_mode = ?"),n.push(i.permissionMode??null)),"allowedBashPatterns"in i&&(t.push("allowed_bash_patterns = ?"),n.push(i.allowedBashPatterns?JSON.stringify(i.allowedBashPatterns):null)),"deniedBashPatterns"in i&&(t.push("denied_bash_patterns = ?"),n.push(i.deniedBashPatterns?JSON.stringify(i.deniedBashPatterns):null)),"envVars"in i&&(t.push("env_vars = ?"),n.push(i.envVars?JSON.stringify(i.envVars):null)),"osCapabilities"in i&&(t.push("os_capabilities = ?"),n.push(i.osCapabilities?JSON.stringify(d(i.osCapabilities)):null)),t.length!==0&&(n.push(e),s.prepare(`UPDATE roles SET ${t.join(", ")} WHERE id = ?`).run(...n))}function B(e,i,s=0){let t=o(),n="SELECT * FROM roles",a=[];return e&&(n+=" WHERE status = ?",a.push(e)),n+=" ORDER BY COALESCE(updated_at, created_at) DESC",typeof i=="number"&&(n+=" LIMIT ? OFFSET ?",a.push(i,s)),t.prepare(n).all(...a).map(b)}function U(e){o().prepare("DELETE FROM roles WHERE id = ?").run(e)}var F=c(()=>{C();g();_();N();O()});export{u as a,_ as b,
|
|
8
|
+
`).run(e.id,e.name,e.cagPrompt,JSON.stringify(e.learnedRules),e.memoryStreamId,e.status,e.performanceScore??null,e.preferences?JSON.stringify(e.preferences):null,e.createdAt,e.updatedAt??null,e.allowedTools?JSON.stringify(e.allowedTools):null,e.disallowedTools?JSON.stringify(e.disallowedTools):null,e.evaluationCriteria?JSON.stringify(e.evaluationCriteria):null,e.executionMode??null,e.model??null,e.maxBudgetUsd??null,e.approvalRequired?JSON.stringify(e.approvalRequired):null,e.source??null,e.additionalDirectories?JSON.stringify(e.additionalDirectories):null,e.allowedChannels?JSON.stringify(e.allowedChannels):null,e.mcpServers?JSON.stringify(e.mcpServers):null,e.inheritUserSettings?1:0,e.permissionMode??null,e.allowedBashPatterns?JSON.stringify(e.allowedBashPatterns):null,e.deniedBashPatterns?JSON.stringify(e.deniedBashPatterns):null,e.envVars?JSON.stringify(e.envVars):null,e.osCapabilities?JSON.stringify(d(e.osCapabilities)):null)}function P(e){let s=o().prepare("SELECT * FROM roles WHERE id = ?").get(e);return s?b(s):void 0}function I(e){let s=o().prepare("SELECT * FROM roles WHERE name = ?").get(e);return s?b(s):void 0}function k(e,i){let s=o(),t=[],n=[];if("name"in i&&(t.push("name = ?"),n.push(i.name)),"cagPrompt"in i&&(t.push("cag_prompt = ?"),n.push(i.cagPrompt)),"learnedRules"in i&&(t.push("learned_rules = ?"),n.push(JSON.stringify(i.learnedRules))),"memoryStreamId"in i&&(t.push("memory_stream_id = ?"),n.push(i.memoryStreamId)),"status"in i&&(t.push("status = ?"),n.push(i.status)),"performanceScore"in i&&(t.push("performance_score = ?"),n.push(i.performanceScore??null)),"preferences"in i&&(t.push("preferences = ?"),n.push(i.preferences?JSON.stringify(i.preferences):null)),"updatedAt"in i&&(t.push("updated_at = ?"),n.push(i.updatedAt??null)),"allowedTools"in i&&(t.push("allowed_tools = ?"),n.push(i.allowedTools?JSON.stringify(i.allowedTools):null)),"disallowedTools"in i&&(t.push("disallowed_tools = ?"),n.push(i.disallowedTools?JSON.stringify(i.disallowedTools):null)),"evaluationCriteria"in i&&(t.push("evaluation_criteria = ?"),n.push(i.evaluationCriteria?JSON.stringify(i.evaluationCriteria):null)),"executionMode"in i&&(t.push("execution_mode = ?"),n.push(i.executionMode??null)),"model"in i&&(t.push("model = ?"),n.push(i.model??null)),"maxBudgetUsd"in i&&(t.push("max_budget_usd = ?"),n.push(i.maxBudgetUsd??null)),"approvalRequired"in i&&(t.push("approval_required = ?"),n.push(i.approvalRequired?JSON.stringify(i.approvalRequired):null)),"source"in i&&(t.push("source = ?"),n.push(i.source??null)),"additionalDirectories"in i){let a=p("defaults.deniedReadPaths")??[...l];i.additionalDirectories&&f(i.additionalDirectories,a),t.push("additional_directories = ?"),n.push(i.additionalDirectories?JSON.stringify(i.additionalDirectories):null)}"allowedChannels"in i&&(t.push("allowed_channels = ?"),n.push(i.allowedChannels?JSON.stringify(i.allowedChannels):null)),"mcpServers"in i&&(t.push("mcp_servers = ?"),n.push(i.mcpServers?JSON.stringify(i.mcpServers):null)),"inheritUserSettings"in i&&(t.push("inherit_user_settings = ?"),n.push(i.inheritUserSettings?1:0)),"permissionMode"in i&&(t.push("permission_mode = ?"),n.push(i.permissionMode??null)),"allowedBashPatterns"in i&&(t.push("allowed_bash_patterns = ?"),n.push(i.allowedBashPatterns?JSON.stringify(i.allowedBashPatterns):null)),"deniedBashPatterns"in i&&(t.push("denied_bash_patterns = ?"),n.push(i.deniedBashPatterns?JSON.stringify(i.deniedBashPatterns):null)),"envVars"in i&&(t.push("env_vars = ?"),n.push(i.envVars?JSON.stringify(i.envVars):null)),"osCapabilities"in i&&(t.push("os_capabilities = ?"),n.push(i.osCapabilities?JSON.stringify(d(i.osCapabilities)):null)),t.length!==0&&(n.push(e),s.prepare(`UPDATE roles SET ${t.join(", ")} WHERE id = ?`).run(...n))}function B(e,i,s=0){let t=o(),n="SELECT * FROM roles",a=[];return e&&(n+=" WHERE status = ?",a.push(e)),n+=" ORDER BY COALESCE(updated_at, created_at) DESC",typeof i=="number"&&(n+=" LIMIT ? OFFSET ?",a.push(i,s)),t.prepare(n).all(...a).map(b)}function U(e){o().prepare("DELETE FROM roles WHERE id = ?").run(e)}var F=c(()=>{C();g();_();N();O()});export{u as a,_ as b,w as c,x as d,S as e,V as f,z as g,d as h,O as i,f as j,J as k,P as l,I as m,k as n,B as o,U as p,L as q,F as r};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{q as C}from"./chunk-6775OYXA.js";import{a as A}from"./chunk-YHVFZB6Q.js";import{b as y}from"./chunk-ISZJV72D.js";import{b as _}from"./chunk-XL46AGRZ.js";import{b}from"./chunk-23VZKIB6.js";import{a as g}from"./chunk-L7JP7DUO.js";import{d as v}from"./chunk-7K4AQBDD.js";import{l as x,r as z}from"./chunk-GBTG5B5R.js";import{b as h,d as $}from"./chunk-JAS3TUZX.js";import{c as E,h as O}from"./chunk-INNDBLZE.js";O();z();$();function D(p){return{id:p.id,templateId:p.template_id,status:p.status,stepStatuses:JSON.parse(p.step_statuses),startedAt:p.started_at,completedAt:p.completed_at??void 0,error:p.error??void 0}}function M(p,e){h().prepare(`
|
|
2
|
+
INSERT INTO workflow_executions (id, template_id, status, step_statuses, started_at)
|
|
3
|
+
VALUES (?, ?, 'running', '{}', ?)
|
|
4
|
+
`).run(p,e,Date.now())}function I(p){let t=h().prepare("SELECT * FROM workflow_executions WHERE id = ?").get(p);return t?D(t):void 0}function R(p,e){let t=h(),s=[],r=[];e.status!==void 0&&(s.push("status = ?"),r.push(e.status)),e.stepStatuses!==void 0&&(s.push("step_statuses = ?"),r.push(JSON.stringify(e.stepStatuses))),e.completedAt!==void 0&&(s.push("completed_at = ?"),r.push(e.completedAt)),e.error!==void 0&&(s.push("error = ?"),r.push(e.error)),s.length!==0&&(r.push(p),t.prepare(`UPDATE workflow_executions SET ${s.join(", ")} WHERE id = ?`).run(...r))}function F(p,e=50,t=0){let s=h(),r="SELECT * FROM workflow_executions",o=[];return p&&(r+=" WHERE template_id = ?",o.push(p)),r+=" ORDER BY started_at DESC LIMIT ? OFFSET ?",o.push(e,t),s.prepare(r).all(...o).map(D)}var m=E("scheduler"),P=class{maxRetries;baseDelayMs;constructor(e){this.maxRetries=e?.maxRetries??3,this.baseDelayMs=e?.baseDelayMs??1e3}async execute(e,t){let s=v(),r={timeout:e.config?.timeout??s.timeout,approvalRequired:s.approvalRequired,approvalTimeout:s.approvalTimeout,plugins:e.config?.plugins,mcpServers:e.config?.mcpServers,model:e.config?.model??s.model,maxTurns:e.config?.maxTurns??s.maxTurns,maxBudgetUsd:e.config?.maxBudgetUsd??s.maxBudgetUsd,env:{...s.env,...e.config?.env},claudeCodePath:s.claudeCodePath},o={templateId:e.id,executionId:t,stepResults:new Map,stepStatuses:{},config:r,continueOnError:e.config?.continueOnError??!1,failedStepIds:new Set,rolePreference:e.rolePreference,deliverTo:e.deliverTo,reportTo:e.reportTo};M(t,e.id),A(t),g.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:"running"});let i=this.groupIntoLayers(e.steps);for(let f of i){if(this.syncExternalState(o)==="cancelled")return this.finalizeCancelledWorkflow(e,o);let k=f.filter(u=>!this.shouldSkip(u,o)),W=f.filter(u=>this.shouldSkip(u,o));for(let u of W){let d={stepId:u.id,taskId:"",status:"skipped",error:"Skipped: dependency failed"};o.stepResults.set(u.id,d),o.stepStatuses[u.id]={taskId:"",status:"skipped",error:"Skipped: dependency failed"},m.info({stepId:u.id,executionId:t},"Step skipped due to failed dependency")}if(k.length===0)continue;let T=await Promise.allSettled(k.map(u=>this.executeStep(u,o)));if(this.syncExternalState(o)==="cancelled")return this.finalizeCancelledWorkflow(e,o);for(let u=0;u<k.length;u++){let d=k[u],c=T[u];if(c.status==="rejected"){m.error({stepId:d.id,error:c.reason},"Workflow step threw");let S={stepId:d.id,taskId:"",status:"failed",error:String(c.reason)};o.stepResults.set(d.id,S),o.failedStepIds.add(d.id),o.stepStatuses[d.id]={taskId:"",status:"failed",error:String(c.reason)}}let w=o.stepResults.get(d.id);if(w?.status==="failed"&&(o.failedStepIds.add(d.id),!o.continueOnError)){if(this.isWorkflowCancelled(o.executionId))return this.finalizeCancelledWorkflow(e,o);let S="failed";return R(t,{status:S,stepStatuses:o.stepStatuses,completedAt:Date.now(),error:w.error}),g.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:S}),m.warn({stepId:d.id,executionId:t},"Workflow step failed, workflow aborted"),{executionId:t,status:S,stepResults:o.stepResults}}}if(this.isWorkflowCancelled(o.executionId))return this.finalizeCancelledWorkflow(e,o);R(t,{stepStatuses:o.stepStatuses})}if(this.isWorkflowCancelled(o.executionId))return this.finalizeCancelledWorkflow(e,o);let n=o.failedStepIds.size>0,l=[...o.stepResults.values()].some(f=>f.status==="skipped"||f.status==="cancelled"),a=n||l?"partial":"completed";return R(t,{status:a,stepStatuses:o.stepStatuses,completedAt:Date.now()}),g.emit({type:"workflow_status_change",executionId:t,templateId:e.id,status:a}),m.info({executionId:t,status:a,completedSteps:o.stepResults.size,totalSteps:e.steps.length,failedSteps:o.failedStepIds.size},"Workflow completed"),await this.deliverWorkflowResult(o,a),{executionId:t,status:a,stepResults:o.stepResults}}groupIntoLayers(e){let t=new Map(e.map(n=>[n.id,n])),s=new Map,r=new Map;for(let n of e)s.set(n.id,0),r.set(n.id,[]);for(let n of e)if(n.dependsOn)for(let l of n.dependsOn)t.has(l)&&(s.set(n.id,(s.get(n.id)??0)+1),r.get(l)?.push(n.id));let o=[],i=new Set(e.map(n=>n.id));for(;i.size>0;){let n=[];for(let l of i)if((s.get(l)??0)===0){let a=t.get(l);a&&n.push(a)}if(n.length===0){m.warn({remaining:[...i]},"Cycle detected in step dependencies");for(let l of i){let a=t.get(l);a&&o.push([a])}break}o.push(n);for(let l of n){i.delete(l.id);for(let a of r.get(l.id)??[])s.set(a,(s.get(a)??0)-1)}}return o}syncExternalState(e){let t=I(e.executionId);if(t){for(let[s,r]of Object.entries(t.stepStatuses))(r.status==="skipped"||r.status==="failed"||r.status==="cancelled")&&!e.stepResults.has(s)&&!e.failedStepIds.has(s)&&(r.status==="skipped"?e.stepResults.set(s,{stepId:s,taskId:r.taskId,status:"skipped",error:r.error??"Manually skipped via API"}):r.status==="cancelled"?e.stepResults.set(s,{stepId:s,taskId:r.taskId,status:"cancelled",error:r.error??"Cancelled"}):(e.failedStepIds.add(s),e.stepResults.set(s,{stepId:s,taskId:r.taskId,status:"failed",error:r.error})),e.stepStatuses[s]=r,m.info({stepId:s,status:r.status,executionId:e.executionId},"Synced external step status from DB"));return t.status==="cancelled"?"cancelled":void 0}}shouldSkip(e,t){return e.dependsOn?e.dependsOn.some(s=>t.failedStepIds.has(s)?!0:t.stepResults.get(s)?.status==="skipped"):!1}async executeStep(e,t){let s=this.resolveVariables(e.prompt,t.stepResults),r=e.roleId??t.rolePreference,o=r?x(r):void 0,i=(e.config?.timeout??t.config?.timeout??600)*1e3,n="",l="failed",a;for(let d=1;d<=this.maxRetries;d++){let c=await C({prompt:s,roleId:r,requirements:e.requirements,autoSelectRole:e.autoSelectRole,config:{...t.config,...e.config?.timeout!==void 0?{timeout:e.config.timeout}:{},...e.config?.maxTurns!==void 0?{maxTurns:e.config.maxTurns}:{}},sourceSessionId:t.templateId,parentId:t.executionId,templateId:t.templateId,stepId:e.id});if(!c.ok){a=c;break}if(n=c.taskId,t.stepStatuses[e.id]={taskId:n,status:"running",roleId:r},m.debug({stepId:e.id,taskId:n,roleId:r,attempt:d},"Workflow step task created via admission"),l=await this.waitForTaskCompletion(n,i),l==="completed"||l==="cancelled")break;if(d<this.maxRetries){let w=this.baseDelayMs*Math.pow(2,d-1);m.info({stepId:e.id,attempt:d,maxRetries:this.maxRetries,delayMs:w},"Workflow step failed, retrying"),await this.sleep(w)}}if(a&&!a.ok){let d={stepId:e.id,taskId:"",status:"failed",roleId:r,roleName:o?.name,error:`Admission failed: ${a.reason}`,admissionError:{code:a.code,reason:a.reason,candidates:a.candidates?.map(c=>({roleId:c.roleId,name:c.name,fitScore:c.fitScore}))}};t.stepResults.set(e.id,d),t.stepStatuses[e.id]={taskId:"",status:"failed",roleId:r,error:a.reason},m.warn({stepId:e.id,admissionCode:a.code,reason:a.reason},"Workflow step admission failed");return}let f=y(n),k=I(t.executionId),W=k?.stepStatuses[e.id],T=l==="completed"?"completed":W?.status==="skipped"?"skipped":W?.status==="cancelled"||k?.status==="cancelled"?"cancelled":"failed",u={stepId:e.id,taskId:n,status:T,roleId:r,roleName:o?.name,result:f?.result,error:f?.error};t.stepResults.set(e.id,u),t.stepStatuses[e.id]={taskId:n,status:u.status,roleId:r,result:f?.result,error:f?.error}}async deliverWorkflowResult(e,t){let s=_();if(e.deliverTo&&e.deliverTo.length>0){let r=this.assembleWorkflowSummary(e);for(let o of e.deliverTo)if(o.type==="channel"){let i=b(o.channelId);try{await s.send({taskId:e.executionId,channelId:o.channelId,chatId:o.chatId,platform:i?.platform,content:r,messageType:"deliver"})}catch(n){m.error({executionId:e.executionId,channelId:o.channelId,error:n},"Workflow delivery failed")}}}if(e.reportTo&&e.reportTo.length>0){let r=[...e.stepResults.values()].filter(a=>a.status==="completed").length,o=e.failedStepIds.size,i=[...e.stepResults.values()].filter(a=>a.status==="skipped").length,n=e.stepResults.size,l=`Workflow ${t}: ${r}/${n} steps completed${o>0?`, ${o} failed`:""}${i>0?`, ${i} skipped`:""}`;for(let a of e.reportTo)if(a.type==="channel"){let f=b(a.channelId);try{await s.send({taskId:e.executionId,channelId:a.channelId,chatId:a.chatId,platform:f?.platform,content:l,messageType:"report"})}catch(k){m.error({executionId:e.executionId,channelId:a.channelId,error:k},"Workflow report delivery failed")}}}}assembleWorkflowSummary(e){let t=[];for(let[s,r]of e.stepResults){let o=r.status==="completed"?"OK":r.status==="skipped"?"SKIP":"FAIL",i=r.roleName?` (${r.roleName})`:"",n=r.result??r.error??"No output";t.push(`## [${o}] Step: ${s}${i}
|
|
5
|
+
|
|
6
|
+
${n}`)}return t.join(`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
`)}resolveVariables(e,t){return e.replace(/\{\{([^}]+)\.result\}\}/g,(s,r)=>t.get(r)?.result??`[no result from ${r}]`)}waitForTaskCompletion(e,t=6e5){return new Promise(s=>{let r=!1,o=Date.now(),i=()=>{r=!0,g.off("task_status_change",n)},n=a=>{r||a.taskId!==e||(a.newStatus==="completed"?(i(),s("completed")):a.newStatus==="failed"?(i(),s("failed")):a.newStatus==="cancelled"&&(i(),s("cancelled")))};g.on("task_status_change",n);let l=()=>{if(r)return;if(Date.now()-o>t){i(),s("failed");return}let a=y(e);if(!a){i(),s("failed");return}if(a.status==="completed"){i(),s("completed");return}if(a.status==="failed"){i(),s("failed");return}if(a.status==="cancelled"){i(),s("cancelled");return}setTimeout(l,5e3)};setTimeout(l,100)})}sleep(e){return new Promise(t=>setTimeout(t,e))}isWorkflowCancelled(e){return I(e)?.status==="cancelled"}finalizeCancelledWorkflow(e,t){let s=I(t.executionId);return R(t.executionId,{status:"cancelled",stepStatuses:s?.stepStatuses??t.stepStatuses,completedAt:s?.completedAt??Date.now(),error:s?.error}),m.info({executionId:t.executionId,templateId:e.id},"Workflow cancelled"),{executionId:t.executionId,status:"cancelled",stepResults:t.stepResults}}};export{I as a,R as b,F as c,P as d};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as t,d}from"./chunk-
|
|
1
|
+
import{b as t,d}from"./chunk-JAS3TUZX.js";d();function s(e){return{id:e.id,taskId:e.task_id,roleId:void 0,plan:JSON.parse(e.plan_json),status:e.status,approvalType:e.approval_type??void 0,deviationReport:e.deviation_report_json?JSON.parse(e.deviation_report_json):void 0,learnedRules:e.learned_rules_json?JSON.parse(e.learned_rules_json):void 0,createdAt:e.created_at,approvedAt:e.approved_at??void 0,reviewedAt:e.reviewed_at??void 0}}function p(e){t().prepare(`
|
|
2
2
|
INSERT INTO task_plans (id, task_id, plan_json, status, approval_type,
|
|
3
3
|
deviation_report_json, learned_rules_json, created_at, approved_at, reviewed_at)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{f as S}from"./chunk-
|
|
1
|
+
import{f as S}from"./chunk-BR2JY5X2.js";import{b as y}from"./chunk-YVS565QY.js";import{b as g}from"./chunk-ISZJV72D.js";import{b as C}from"./chunk-XL46AGRZ.js";import{b as R}from"./chunk-23VZKIB6.js";import{b as v}from"./chunk-2DLVAKH7.js";import{e as m}from"./chunk-HDP7A4XY.js";import{a as h}from"./chunk-L7JP7DUO.js";import{a as k,b as P,c as o,d as f,e as T,f as x,g as E}from"./chunk-QVKI7H7W.js";import{c as w,h as _}from"./chunk-INNDBLZE.js";_();import{v4 as M}from"uuid";var l=w("admin"),I=new Map,u=null,p=null,c=null,D=class{constructor(){h.on("task_status_change",e=>{(e.newStatus==="completed"||e.newStatus==="failed")&&this.handleTaskStatusChange(e.taskId,e.newStatus).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed")})}),h.on("plan_approval_request",e=>{this.handlePlanApprovalRequest(e.taskId,e.planId,e.plan).catch(n=>{l.error({taskId:e.taskId,error:n},"Delivery processing failed (plan_approval)")})}),l.info("DeliveryEngine initialized")}async handlePlanApprovalRequest(e,n,r){let t=g(e),i=this.getSourceChannelForTask(e);if(i){let d=y(r),{sendApprovalToChannel:b}=await import("./approval-handler-ORD4MUVM.js");await b(i.channelId,i.chatId,n,e,d)}let a=y(r)+`
|
|
2
2
|
|
|
3
|
-
Task: ${e}`;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=S(e,n);if(i.length!==0){l.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){l.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:M(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+k,source:"rule"};P(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=C();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=R(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?(
|
|
3
|
+
Task: ${e}`;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=S(e,n);if(i.length!==0){l.debug({eventType:e,ruleCount:i.length,taskId:t},"Matched delivery rules");for(let a of i){if(!this.checkRateLimit(a)){l.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:M(),ruleId:a.id,taskId:t,status:"pending",target:a.target,content:r,attempts:0,createdAt:Date.now(),expiresAt:Date.now()+k,source:"rule"};P(d),await this.attemptDelivery(d,a)}}}async attemptDeliveryPublic(e,n){return this.attemptDelivery(e,n)}async attemptDelivery(e,n){let r=C();try{if(e.target.type==="channel"){let t=e.target.chatId;!t&&e.target.channelId&&(t=R(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?(f(e.id),l.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?(f(e.id),l.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),l.warn({entryId:e.id,error:i},"Delivery attempt failed")}}checkRateLimit(e){let n=Date.now(),r=6e4,t=I.get(e.id);t||(t=[],I.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=x("rule",50),r=[...e,...n];if(r.length!==0){l.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 $(){return c}function H(){c||(c=new D,u=setInterval(()=>{c?.retryPending().catch(s=>{l.error({error:s},"Delivery retry scan failed")})},6e4),p=setInterval(()=>{try{let s=E();s>0&&l.info({cleaned:s},"Expired delivery log entries cleaned up")}catch(s){l.error({error:s},"Delivery cleanup failed")}},36e5),l.info("DeliveryEngine started with retry (60s) and cleanup (1h) timers"))}function J(){u&&(clearInterval(u),u=null),p&&(clearInterval(p),p=null),c=null,I.clear(),l.info("DeliveryEngine stopped")}export{D as a,$ as b,H as c,J as d};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as n,d as o}from"./chunk-
|
|
1
|
+
import{b as n,d as o}from"./chunk-JAS3TUZX.js";o();function a(e){return{id:e.id,sessionId:e.session_id,role:e.role,content:e.content,source:{type:e.source_type},taskId:e.task_id??void 0,channelMessageId:e.channel_message_id??void 0,metadata:e.metadata?JSON.parse(e.metadata):void 0,createdAt:e.created_at}}function c(e){n().prepare(`
|
|
2
2
|
INSERT INTO chat_messages (id, session_id, role, content, source_type, task_id,
|
|
3
3
|
channel_message_id, metadata, created_at)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as c,b as m}from"./chunk-
|
|
1
|
+
import{a as c,b as m}from"./chunk-S3BAIZ4Q.js";import{b as a,d as _}from"./chunk-JAS3TUZX.js";import{c as s,h as f}from"./chunk-INNDBLZE.js";import{readFileSync as p,existsSync as g}from"fs";import{fileURLToPath as A}from"url";import{dirname as I,join as o}from"path";var O=A(import.meta.url),l=I(O),r,n;function u(){let e=o(l,"..","package.json");if(g(e))return e;let i=o(l,"..","..","package.json");return g(i)?i:o(process.cwd(),"package.json")}function P(){if(r===void 0){let e=u();r=JSON.parse(p(e,"utf-8")).version}return r}function b(){if(n===void 0){let e=u();n=JSON.parse(p(e,"utf-8")).name}return n}_();f();import{dirname as h,join as T}from"path";import{fileURLToPath as y}from"url";var k=h(y(import.meta.url)),d=T(k,"..");var x=d,U=s("cli:register-ai-digest"),t="ai-hourly-digest";function R(){try{if(m(t)){console.log(`[INFO] AI Digest template already exists (${t})`);return}}catch{}let e={id:t,name:"AI Hourly Digest",description:"\u6BCF\u5C0F\u65F6\u641C\u7D22 AI \u524D\u6CBF\u6587\u7AE0\uFF0C\u603B\u7ED3\u540E\u4FDD\u5B58\u5230 Omnifocus",trigger:{type:"cron",cron:"0 * * * *"},enabled:!0,steps:[{id:"search_ai_news",prompt:`\u641C\u7D22\u8FC7\u53BB 24 \u5C0F\u65F6\u5185\u5173\u4E8E AI/\u4EBA\u5DE5\u667A\u80FD\u7684\u6700\u65B0\u524D\u6CBF\u6587\u7AE0\u3002
|
|
2
2
|
|
|
3
3
|
\u641C\u7D22\u6765\u6E90:
|
|
4
4
|
1. Hacker News AI \u677F\u5757 (https://news.ycombinator.com/front?day=1)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as i,d as a}from"./chunk-
|
|
1
|
+
import{b as i,d as a}from"./chunk-JAS3TUZX.js";a();function l(t){return{id:t.id,parentId:t.parent_id??void 0,status:t.status,prompt:t.prompt,originalPrompt:t.original_prompt??void 0,config:JSON.parse(t.config),result:t.result??void 0,error:t.error??void 0,sdkSessionId:t.sdk_session_id??void 0,templateId:t.template_id??void 0,roleId:t.role_id??void 0,stepId:t.step_id??void 0,sourceSessionId:t.source_session_id??void 0,deliverTo:t.deliver_to?JSON.parse(t.deliver_to):void 0,reportTo:t.report_to?JSON.parse(t.report_to):void 0,createdAt:t.created_at,startedAt:t.started_at??void 0,completedAt:t.completed_at??void 0,costUsd:t.cost_usd??void 0,tokenUsage:t.token_usage?JSON.parse(t.token_usage):void 0,numTurns:t.num_turns??void 0,totalDurationMs:t.total_duration_ms??void 0}}function c(t){i().prepare(`
|
|
2
2
|
INSERT INTO tasks (id, parent_id, status, prompt, original_prompt, config, result, error,
|
|
3
3
|
sdk_session_id, template_id, role_id, step_id, source_session_id, notify_targets, deliver_to, report_to,
|
|
4
4
|
created_at, started_at, completed_at,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{e as A,h as
|
|
1
|
+
import{e as A,h as O}from"./chunk-WBAPIPST.js";import{c as R,h as X}from"./chunk-INNDBLZE.js";import{c as m}from"./chunk-FCV2DPZQ.js";import p from"better-sqlite3";import{existsSync as S,mkdirSync as u}from"fs";import{dirname as g}from"path";function D(e){e.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS server_state (
|
|
3
3
|
id INTEGER PRIMARY KEY CHECK(id = 1),
|
|
4
4
|
sdk_session_id TEXT,
|
|
@@ -633,4 +633,4 @@ import{e as A,h as X}from"./chunk-WBAPIPST.js";import{c as R,h as O}from"./chunk
|
|
|
633
633
|
ON artifact_access_log (execution_id, timestamp);
|
|
634
634
|
CREATE INDEX IF NOT EXISTS idx_artifact_access_log_role
|
|
635
635
|
ON artifact_access_log (role_id, timestamp);
|
|
636
|
-
`;e.exec(E),e.exec(s),e.prepare("PRAGMA table_info(tasks)").all().some(t=>t.name==="step_id")||e.prepare("ALTER TABLE tasks ADD COLUMN step_id TEXT").run(),e.exec("UPDATE server_state SET schema_version = 26 WHERE id = 1")}e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="os_capabilities")||e.prepare("ALTER TABLE roles ADD COLUMN os_capabilities TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<27&&e.prepare("UPDATE server_state SET schema_version = 27 WHERE id = 1").run();{let E=[[/\brm -rf\b/,["rm -rf *"]],[/^git push/,["git push*"]],[/^git reset/,["git reset*"]],[/\bcurl.*POST\b/i,["curl * -X POST*","curl * --request POST*"]]],s=e.prepare("SELECT key, value FROM config WHERE key = 'defaults.approvalRequired'").all();for(let T of s)try{let t=JSON.parse(T.value),i=[];for(let n of t){let a=!1;for(let[d,r]of E)if(d.test(n)){i.push(...r),a=!0,I.info({from:n,to:r},"Config: migrated approvalRequired pattern from regex to glob");break}a||(/[.+?^${}()|[\]\\]/.test(n)&&I.warn({pattern:n},"Config: approvalRequired pattern contains regex metacharacters that won't work with glob matching; update to glob syntax (use * for wildcards)"),i.push(n))}let N=[...new Set(i)];e.prepare("UPDATE config SET value = ?, updated_at = ? WHERE key = ?").run(JSON.stringify(N),Date.now(),T.key)}catch{}}}function K(){if(o)return o;let e=process.env.ADAM_DB_PATH||A,l=g(e);return S(l)||u(l,{recursive:!0}),o=new p(e),o.pragma("journal_mode = WAL"),o.pragma("foreign_keys = ON"),o.pragma("trusted_schema = ON"),
|
|
636
|
+
`;e.exec(E),e.exec(s),e.prepare("PRAGMA table_info(tasks)").all().some(t=>t.name==="step_id")||e.prepare("ALTER TABLE tasks ADD COLUMN step_id TEXT").run(),e.exec("UPDATE server_state SET schema_version = 26 WHERE id = 1")}e.prepare("PRAGMA table_info(roles)").all().some(T=>T.name==="os_capabilities")||e.prepare("ALTER TABLE roles ADD COLUMN os_capabilities TEXT DEFAULT NULL").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<27&&e.prepare("UPDATE server_state SET schema_version = 27 WHERE id = 1").run();{let E=e.prepare("PRAGMA table_info(manager_decisions)").all();E.some(T=>T.name==="requirements_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN requirements_json TEXT").run(),E.some(T=>T.name==="fit_score")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN fit_score REAL").run(),E.some(T=>T.name==="candidates_json")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN candidates_json TEXT").run(),E.some(T=>T.name==="tie_break_reason")||e.prepare("ALTER TABLE manager_decisions ADD COLUMN tie_break_reason TEXT").run(),(e.prepare("SELECT schema_version FROM server_state WHERE id = 1").get()?.schema_version??0)<28&&e.prepare("UPDATE server_state SET schema_version = 28 WHERE id = 1").run()}{let E=[[/\brm -rf\b/,["rm -rf *"]],[/^git push/,["git push*"]],[/^git reset/,["git reset*"]],[/\bcurl.*POST\b/i,["curl * -X POST*","curl * --request POST*"]]],s=e.prepare("SELECT key, value FROM config WHERE key = 'defaults.approvalRequired'").all();for(let T of s)try{let t=JSON.parse(T.value),i=[];for(let n of t){let a=!1;for(let[d,r]of E)if(d.test(n)){i.push(...r),a=!0,I.info({from:n,to:r},"Config: migrated approvalRequired pattern from regex to glob");break}a||(/[.+?^${}()|[\]\\]/.test(n)&&I.warn({pattern:n},"Config: approvalRequired pattern contains regex metacharacters that won't work with glob matching; update to glob syntax (use * for wildcards)"),i.push(n))}let N=[...new Set(i)];e.prepare("UPDATE config SET value = ?, updated_at = ? WHERE key = ?").run(JSON.stringify(N),Date.now(),T.key)}catch{}}}function K(){if(o)return o;let e=process.env.ADAM_DB_PATH||A,l=g(e);return S(l)||u(l,{recursive:!0}),o=new p(e),o.pragma("journal_mode = WAL"),o.pragma("foreign_keys = ON"),o.pragma("trusted_schema = ON"),D(o),o}function W(){o&&(o.close(),o=null)}var I,o,C=m(()=>{O();X();I=R("store"),o=null});export{D as a,K as b,W as c,C as d};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import{d as _}from"./chunk-GY52JA5I.js";import{i as v,j as y,q as b}from"./chunk-6775OYXA.js";import{b as k}from"./chunk-ISZJV72D.js";import{a as d}from"./chunk-L7JP7DUO.js";import{p as I}from"./chunk-C6BOQJJF.js";import{a as x,b as c,d as u,f as C}from"./chunk-S3BAIZ4Q.js";import{d as w}from"./chunk-7K4AQBDD.js";import{o as T,r as O}from"./chunk-GBTG5B5R.js";import{c as h,h as E}from"./chunk-INNDBLZE.js";E();O();import{v4 as l}from"uuid";import{CronExpressionParser as W}from"cron-parser";var n=h("scheduler"),m="ai-hourly-digest";function D(){if(c(m)){n.debug({templateId:m},"Built-in template already exists");return}let e={id:m,name:"AI Hourly Digest",description:"\u6BCF\u5C0F\u65F6\u641C\u7D22 AI \u524D\u6CBF\u6587\u7AE0\uFF0C\u603B\u7ED3\u540E\u4FDD\u5B58\u5230 Omnifocus",trigger:{type:"cron",cron:"0 * * * *"},enabled:!0,steps:[{id:"search_ai_news",prompt:`\u641C\u7D22\u8FC7\u53BB 24 \u5C0F\u65F6\u5185\u5173\u4E8E AI/\u4EBA\u5DE5\u667A\u80FD\u7684\u6700\u65B0\u524D\u6CBF\u6587\u7AE0\u3002
|
|
2
|
+
|
|
3
|
+
\u641C\u7D22\u6765\u6E90:
|
|
4
|
+
1. Hacker News AI \u677F\u5757 (https://news.ycombinator.com/front?day=1)
|
|
5
|
+
2. ArXiv cs.AI \u6700\u65B0\u8BBA\u6587 (https://arxiv.org/list/cs.AI/recent)
|
|
6
|
+
3. Reddit r/MachineLearning \u70ED\u95E8\u5E16\u5B50
|
|
7
|
+
|
|
8
|
+
\u627E\u51FA\u4E00\u7BC7\u6700\u6709\u4EF7\u503C\u3001\u6700\u6709\u6280\u672F\u6DF1\u5EA6\u7684\u6587\u7AE0\u3002
|
|
9
|
+
|
|
10
|
+
\u8F93\u51FA\u683C\u5F0F:
|
|
11
|
+
- \u6807\u9898\uFF1A[\u6587\u7AE0\u6807\u9898]
|
|
12
|
+
- \u6765\u6E90\uFF1A[\u7F51\u7AD9/\u5E73\u53F0\u540D\u79F0]
|
|
13
|
+
- \u94FE\u63A5\uFF1A[\u5B8C\u6574 URL]
|
|
14
|
+
- \u6838\u5FC3\u4EF7\u503C\uFF1A[1-2 \u53E5\u8BDD\u8BF4\u660E\u4E3A\u4EC0\u4E48\u8FD9\u7BC7\u6587\u7AE0\u503C\u5F97\u770B]`},{id:"summarize_article",dependsOn:["search_ai_news"],prompt:`\u9605\u8BFB\u5E76\u603B\u7ED3\u8FD9\u7BC7\u6587\u7AE0\u3002
|
|
15
|
+
|
|
16
|
+
\u6587\u7AE0\u4FE1\u606F:
|
|
17
|
+
{{search_ai_news.result}}
|
|
18
|
+
|
|
19
|
+
\u8BF7:
|
|
20
|
+
1. \u7528 WebFetch \u83B7\u53D6\u6587\u7AE0\u5B8C\u6574\u5185\u5BB9
|
|
21
|
+
2. \u63D0\u53D6\u6838\u5FC3\u89C2\u70B9\u548C\u6280\u672F\u7EC6\u8282
|
|
22
|
+
3. \u7528\u4E2D\u6587\u5199\u51FA 300-500 \u5B57\u7684\u603B\u7ED3
|
|
23
|
+
|
|
24
|
+
\u603B\u7ED3\u7ED3\u6784:
|
|
25
|
+
## \u6838\u5FC3\u53D1\u73B0
|
|
26
|
+
[\u6587\u7AE0\u6700\u91CD\u8981\u7684\u53D1\u73B0/\u521B\u65B0\u70B9]
|
|
27
|
+
|
|
28
|
+
## \u6280\u672F\u7EC6\u8282
|
|
29
|
+
[\u5173\u952E\u7684\u6280\u672F\u65B9\u6CD5/\u5B9E\u73B0\u7EC6\u8282]
|
|
30
|
+
|
|
31
|
+
## \u5F71\u54CD/\u610F\u4E49
|
|
32
|
+
[\u8FD9\u9879\u5DE5\u4F5C\u7684\u610F\u4E49\u6216\u5BF9\u884C\u4E1A\u7684\u5F71\u54CD]
|
|
33
|
+
|
|
34
|
+
## \u539F\u6587\u94FE\u63A5
|
|
35
|
+
[\u6587\u7AE0 URL]`},{id:"save_to_omnifocus",dependsOn:["summarize_article"],prompt:`\u5C06\u6587\u7AE0\u603B\u7ED3\u4FDD\u5B58\u5230 Omnifocus\u3002
|
|
36
|
+
|
|
37
|
+
\u603B\u7ED3\u5185\u5BB9:
|
|
38
|
+
{{summarize_article.result}}
|
|
39
|
+
|
|
40
|
+
\u63D0\u53D6\u6587\u7AE0\u6807\u9898\u548C\u5B8C\u6574\u603B\u7ED3\uFF0C\u7136\u540E\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u6DFB\u52A0\u5230 Omnifocus Inbox\uFF1A
|
|
41
|
+
|
|
42
|
+
osascript /Users/norvyn/Code/Projects/Adam/scripts/add-to-omnifocus.applescript "[\u6587\u7AE0\u6807\u9898] AI \u524D\u6CBF\u901F\u9012" "[\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9]"
|
|
43
|
+
|
|
44
|
+
\u6CE8\u610F\uFF1A
|
|
45
|
+
- \u5C06 [\u6587\u7AE0\u6807\u9898] \u66FF\u6362\u4E3A\u5B9E\u9645\u6807\u9898
|
|
46
|
+
- \u5C06 [\u5B8C\u6574\u603B\u7ED3\u5185\u5BB9] \u66FF\u6362\u4E3A\u5B8C\u6574\u7684\u603B\u7ED3\u6587\u672C\uFF08\u5305\u542B\u6838\u5FC3\u53D1\u73B0\u3001\u6280\u672F\u7EC6\u8282\u3001\u5F71\u54CD/\u610F\u4E49\u548C\u539F\u6587\u94FE\u63A5\uFF09
|
|
47
|
+
- \u603B\u7ED3\u5185\u5BB9\u4F7F\u7528\u6362\u884C\u7B26\u5206\u9694\u5404\u90E8\u5206
|
|
48
|
+
|
|
49
|
+
\u5B8C\u6210\u540E\u8F93\u51FA\uFF1A\u5DF2\u4FDD\u5B58\u5230 Omnifocus\uFF1A[\u4EFB\u52A1\u6807\u9898]`}],config:{timeout:300},tags:["ai","digest","hourly","automation"],createdAt:Date.now()};x(e),n.info({templateId:m,cron:"0 * * * *"},"Registered built-in AI Hourly Digest template")}var A=class{cronJobs=new Map;workflowExecutor=new _;started=!1;taskCompletionHandler=null;workflowCompletionHandler=null;async start(){if(this.started)return;this.started=!0,D();let e=u(!0),t=0;for(let r of e)r.trigger.type==="cron"&&r.trigger.cron&&(this.scheduleCronJob(r),t++);let s=0;for(let r of e)r.trigger.type==="once"&&r.trigger.runAt&&(this.scheduleOnceJob(r.id),s++);this.taskCompletionHandler=r=>{r.newStatus==="completed"&&this.checkEventTriggers(r.taskId).catch(o=>{n.error({taskId:r.taskId,error:o},"Event trigger check failed")})},d.on("task_status_change",this.taskCompletionHandler),this.workflowCompletionHandler=r=>{(r.status==="completed"||r.status==="partial")&&this.checkWorkflowEventTriggers(r.templateId).catch(o=>{n.error({templateId:r.templateId,error:o},"Workflow event trigger check failed")})},d.on("workflow_status_change",this.workflowCompletionHandler),this.cronJobs.set("memory-cleanup",setInterval(()=>{this.runMemoryCleanup()},36e5)),n.info({cronCount:t,onceCount:s},"Bree engine started with cron jobs + memory cleanup")}runMemoryCleanup(){try{let e=T(void 0,1e3,0),t=0;for(let s of e)t+=I(s.id);t>0&&n.info({totalCleaned:t},"Memory cleanup completed")}catch(e){n.warn({error:e},"Memory cleanup failed")}}async stop(){for(let[,e]of this.cronJobs)clearTimeout(e),clearInterval(e);this.cronJobs.clear(),this.taskCompletionHandler&&(d.off("task_status_change",this.taskCompletionHandler),this.taskCompletionHandler=null),this.workflowCompletionHandler&&(d.off("workflow_status_change",this.workflowCompletionHandler),this.workflowCompletionHandler=null),this.started=!1,n.info("Bree engine stopped")}scheduleCronJob(e){let t=`template-${e.id}`;this.cronJobs.has(t)&&(clearTimeout(this.cronJobs.get(t)),this.cronJobs.delete(t));let s;try{s=W.parse(e.trigger.cron)}catch{n.warn({templateId:e.id,cron:e.trigger.cron},"Invalid cron expression");return}let r=()=>{let p=s.next().getTime()-Date.now();return Math.max(p,1e3)},o=()=>{this.executeCronTrigger(e.id).catch(p=>{n.error({templateId:e.id,error:p},"Cron trigger failed")});let f=setTimeout(o,r());this.cronJobs.set(t,f)},i=r(),a=setTimeout(o,i);this.cronJobs.set(t,a),n.debug({jobName:t,nextRun:new Date(Date.now()+i).toISOString()},"Scheduled cron job")}async executeCronTrigger(e){let t=c(e);!t||!t.enabled||(n.info({templateName:t.name},"Cron triggered"),await this.executeWorkflow(t,l()))}async scheduleJob(e){let t=c(e);t&&t.trigger.type==="cron"&&t.trigger.cron&&this.scheduleCronJob(t)}async unscheduleJob(e){let t=`template-${e}`,s=this.cronJobs.get(t);s&&(clearTimeout(s),this.cronJobs.delete(t))}async runNow(e){let t=c(e);if(!t)throw new Error(`Template ${e} not found`);let s=l();return this.executeWorkflow(t,s).catch(r=>{n.error({templateId:e,error:r},"Workflow execution failed")}),s}async checkEventTriggers(e){let t=k(e);if(!t)return;let s=u(!0),r=s.filter(o=>o.trigger.type==="event"&&o.trigger.event==="task_complete");for(let o of r)n.debug({templateName:o.name},"Event trigger matched"),await this.executeWorkflow(o,l());if(t.templateId){let o=s.filter(i=>i.trigger.type!=="event"||!i.trigger.event?!1:i.trigger.event===`template_complete:${t.templateId}`);for(let i of o)n.info({templateName:i.name,sourceTemplateId:t.templateId},"Template complete trigger matched"),await this.executeWorkflow(i,l())}}async executeWorkflow(e,t){if(n.info({templateName:e.name,executionId:t},"Executing workflow"),e.goalIds&&e.goalIds.length>0){for(let r of e.goalIds){let o=y(r);if(!o){n.warn({goalId:r,templateId:e.id},"Goal reference not found, skipping");continue}let i=l();v({id:i,name:o.name,description:o.description,roleId:o.roleId,metricType:o.metricType,targetValue:o.targetValue,currentValue:0,deadline:o.deadline,budgetUsd:o.budgetUsd,status:"active",createdAt:Date.now(),sourceSessionId:e.sourceSessionId,deliverTo:e.deliverTo,reportTo:e.reportTo});let a=await b({prompt:`Decompose and execute goal: ${o.name}. ${o.description??""}`,roleId:e.rolePreference??o.roleId,config:{...w()},deliverTo:e.deliverTo,reportTo:e.reportTo,sourceSessionId:e.sourceSessionId,parentId:i,templateId:e.id});if(!a.ok){n.error({templateId:e.id,sourceGoalId:r,newGoalId:i,code:a.code,reason:a.reason},"Decomposition task admission failed");continue}n.info({templateId:e.id,sourceGoalId:r,newGoalId:i,taskId:a.taskId},"Goal reference triggered, dispatched decomposition task")}return}let s=await this.workflowExecutor.execute(e,t);n.info({templateName:e.name,executionId:t,status:s.status,steps:s.stepResults.size},"Workflow execution finished")}async checkWorkflowEventTriggers(e){let s=u(!0).filter(r=>r.trigger.type!=="event"||!r.trigger.event?!1:r.trigger.event===`workflow_complete:${e}`);for(let r of s)n.info({templateName:r.name,sourceTemplateId:e},"Workflow complete trigger matched"),await this.executeWorkflow(r,l())}scheduleOnceJob(e){let t=c(e);if(!t||!t.enabled||t.trigger.type!=="once")return;let r=(t.trigger.runAt?new Date(t.trigger.runAt).getTime():0)-Date.now();if(r<=0){n.info({templateId:e,runAt:t.trigger.runAt},"Once-shot template past due, executing immediately"),this.executeOnceTrigger(e).catch(a=>{n.error({templateId:e,error:a},"Once trigger execution failed")});return}let o=`template-${e}`;this.cronJobs.has(o)&&clearTimeout(this.cronJobs.get(o));let i=setTimeout(()=>{this.cronJobs.delete(o),this.executeOnceTrigger(e).catch(a=>{n.error({templateId:e,error:a},"Once trigger execution failed")})},r);this.cronJobs.set(o,i),n.info({templateId:e,runAt:t.trigger.runAt,delayMs:r},"Scheduled once-shot job")}async executeOnceTrigger(e){let t=c(e);!t||!t.enabled||(n.info({templateName:t.name},"Once-shot triggered"),await this.executeWorkflow(t,l()),C(e),n.info({templateId:e},"Once-shot template auto-disabled after execution"))}},J=null;function V(){return J}function F(g){J=g}export{A as a,V as b,F as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as s,d as o}from"./chunk-
|
|
1
|
+
import{b as s,d as o}from"./chunk-JAS3TUZX.js";o();function i(e){return{id:e.id,ruleId:e.rule_id??void 0,taskId:e.task_id??void 0,status:e.status,target:JSON.parse(e.target),content:e.content,attempts:e.attempts,error:e.error??void 0,createdAt:e.created_at,deliveredAt:e.delivered_at??void 0,expiresAt:e.expires_at,source:e.source,messageType:e.message_type??void 0}}var u=1440*60*1e3;function p(e){s().prepare(`
|
|
2
2
|
INSERT INTO delivery_log (id, rule_id, task_id, status, target, content,
|
|
3
3
|
attempts, error, created_at, delivered_at, expires_at, source, message_type)
|
|
4
4
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as y,r as T}from"./chunk-GBTG5B5R.js";import{d as h,h as F}from"./chunk-WBAPIPST.js";import{c as R,h as P}from"./chunk-INNDBLZE.js";import{c as v,e as A}from"./chunk-FCV2DPZQ.js";import{readFileSync as b,writeFileSync as C,existsSync as k}from"fs";import{join as W}from"path";function w(e){let n=W(d(e),".env");if(!k(n))return null;let i=b(n,"utf-8"),t={};for(let o of i.split(`
|
|
2
2
|
`)){let s=o.trim();if(!s||s.startsWith("#"))continue;let c=s.startsWith("export ")?s.slice(7).trim():s,u=c.indexOf("=");if(u===-1)continue;let f=c.slice(0,u).trim(),r=c.slice(u+1).trim();(r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"))&&(r=r.slice(1,-1)),!(r.includes("$")&&(r=r.replace(/\$\{(\w+)\}|\$(\w+)/g,(p,l,a)=>{let g=l??a;return t[g]??process.env[g]??""}),!r))&&(t[f]=r)}return t}function V(e,n){let i=w(e);if(!i)return n;let t={...n},o=0;for(let[s,c]of Object.entries(i)){if(s.startsWith("ANTHROPIC_")){x.warn({roleName:e,key:s},"Role .env contains ANTHROPIC_* key; ignored (managed globally)");continue}s in t||(t[s]=c,o++)}return o>0&&x.info({roleName:e,seeded:o},"Seeded role envVars from .env file"),Object.keys(t).length>0?t:void 0}function M(e,n){let i=w(e);if(!i)return[];let t=n??{},o=[];for(let[s,c]of Object.entries(i)){if(s.startsWith("ANTHROPIC_"))continue;let u=t[s]??"";u!==c&&o.push({envKey:s,dbValue:u,envValue:c})}for(let[s,c]of Object.entries(t))s in i||o.push({envKey:s,dbValue:c,envValue:""});return o}function N(e,n){let i=W(d(e),".env"),t=n??{},o=[],s=new Set;if(k(i)){let u=b(i,"utf-8");for(let f of u.split(`
|
|
3
3
|
`)){let r=f.trim();if(!r||r.startsWith("#")){o.push(f);continue}let p=r.startsWith("export ")?r.slice(7).trim():r,l=p.indexOf("=");if(l===-1){o.push(f);continue}let a=p.slice(0,l).trim(),g=r.startsWith("export ")?"export ":"";a in t&&(o.push(`${g}${a}=${t[a]}`),s.add(a))}}let c=0;for(let[u,f]of Object.entries(t)){if(s.has(u)){c++;continue}f&&f.length>0&&(o.push(`${u}=${f}`),c++)}return C(i,o.join(`
|
|
4
4
|
`)+`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as l}from"./chunk-2CMR5AG7.js";import{d as f,k as g,m as p,n as h,o as M,q as b}from"./chunk-
|
|
1
|
+
import{a as l}from"./chunk-2CMR5AG7.js";import{d as f,k as g,m as p,n as h,o as M,q as b}from"./chunk-C6BOQJJF.js";function v(t,n){let i=0,s=0,m=0;for(let e=0;e<t.length;e++)i+=t[e]*n[e],s+=t[e]*t[e],m+=n[e]*n[e];let o=Math.sqrt(s)*Math.sqrt(m);return o===0?0:i/o}async function S(t,n,i={}){let s=i.topK??10,m=i.hybridConfig??M,o;try{o=await l(n)}catch{}let e=o??new Float32Array(384),a=b(t,e,n,s*2,m,{excludeSuperseded:!0}),d=t?h(t):g,y=a.map(r=>{let u=r.embedding?v(e,r.embedding):0,C=Math.min(.3,(r.retrievedCount??0)*.05),x=p(r.createdAt,u,r.importance,d)+C;return{...r,score:x}});y.sort((r,u)=>u.score-r.score);let c=y.slice(0,s);for(let r of c)f(r.id);return c}async function T(t,n,i=5,s=2e3){try{let{estimateTokens:m}=await import("./token-estimator-HMPVGDCN.js"),o=await S(n,t,{topK:i});if(o.length===0)return"";let e=[],a=0,d=m(`[Memory Context \u2014 retrieved from prior interactions]
|
|
2
2
|
|
|
3
3
|
[User Request]
|
|
4
4
|
`);for(let c of o){let r=m(`- [${c.tier??"episodic"}] ${c.content}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import{b as He,c as Qe,d as N,e as et}from"./chunk-5XUR3M23.js";import{a as pe,d as Ke,e as me}from"./chunk-H54ZXA26.js";import{b as fe,c as Ye,d as Ge,e as Xe,f as Ze}from"./chunk-YHVFZB6Q.js";import{j as je}from"./chunk-VRJ7R766.js";import{a as Le,b as $e}from"./chunk-Y3AMO6WC.js";import{b as B,c as O,d as J,f as Oe}from"./chunk-ISZJV72D.js";import{a as U,e as tt}from"./chunk-5S6BMWD2.js";import{a as Ve}from"./chunk-DZEVMYPB.js";import{e as G,f as We,j as ze}from"./chunk-QWCRZDZS.js";import{a as y}from"./chunk-L7JP7DUO.js";import{b as Fe}from"./chunk-QVKI7H7W.js";import{b as Je}from"./chunk-R4GIIQ7G.js";import{b as qe}from"./chunk-T33BLZV2.js";import{d as z,i as Be}from"./chunk-GSMC3VUM.js";import{a as Y,b as Ne,l as R,n as L,o as ue,r as $}from"./chunk-GBTG5B5R.js";import{a as Ue,g as Ft}from"./chunk-7L2WQM7N.js";import{b as _,d as q}from"./chunk-JAS3TUZX.js";import{d as le,h as jt}from"./chunk-WBAPIPST.js";import{c as b,h as P}from"./chunk-INNDBLZE.js";q();function Kt(e){return{id:e.id,roleId:e.role_id,taskId:e.task_id,scores:JSON.parse(e.score_json),emaScore:e.ema_score,createdAt:e.created_at}}function ot(e){_().prepare(`
|
|
2
|
+
INSERT INTO role_scores (id, role_id, task_id, score_json, ema_score, created_at)
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
4
|
+
`).run(e.id,e.roleId,e.taskId,JSON.stringify(e.scores),e.emaScore,e.createdAt)}function X(e,t=50){return _().prepare("SELECT * FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT ?").all(e,t).map(Kt)}function rt(e){return _().prepare("SELECT ema_score FROM role_scores WHERE role_id = ? ORDER BY created_at DESC LIMIT 1").get(e)?.ema_score}function nt(e){let r=_().prepare(`
|
|
5
|
+
SELECT token_usage FROM tasks
|
|
6
|
+
WHERE role_id = ? AND status = 'completed' AND token_usage IS NOT NULL
|
|
7
|
+
ORDER BY completed_at DESC LIMIT 50
|
|
8
|
+
`).all(e);if(r.length===0)return 1e4;let i=r.map(s=>{let n=JSON.parse(s.token_usage);return(n.input??0)+(n.output??0)}).sort((s,n)=>s-n);return i[Math.floor(i.length/2)]}P();import{v4 as Ht}from"uuid";var qt=b("audit"),Z={taskSuccess:.3,planAccuracy:.25,permissionCompliance:.25,efficiency:.2},it=.3;function Jt(e,t){let r=B(e),i=r?.status==="completed"?1:0,s=1,n=Ke(e);n?.deviationReport&&(s=n.deviationReport.overallAccuracy);let o=1,a=$e(e,1e3),c=a.filter(g=>g.type==="tool_result"||g.type==="permission_denied").length,d=a.filter(g=>g.type==="permission_denied").length;c>0&&(o=1-d/c);let u=1;if(r?.tokenUsage){let g=r.tokenUsage.input+r.tokenUsage.output,E=t?nt(t):1e4;g>E&&(u=Math.max(0,1-(g-E)/E))}let l=i*Z.taskSuccess+s*Z.planAccuracy+o*Z.permissionCompliance+u*Z.efficiency;return{taskSuccess:i,planAccuracy:s,permissionCompliance:o,efficiency:u,weighted:l}}function st(e,t){let r=Jt(t,e),i=rt(e),s=i!==void 0?it*r.weighted+(1-it)*i:r.weighted;return ot({id:Ht(),roleId:e,taskId:t,scores:r,emaScore:s,createdAt:Date.now()}),qt.debug({roleId:e,taskId:t,scores:{...r,weighted:r.weighted.toFixed(3)},ema:s.toFixed(3)},"Task score recorded"),s}$();$();P();var Yt=b("audit");function Q(e,t=7){let r=R(e),i=X(e,100),s=Date.now(),n=s-t*24*60*60*1e3,o=i.filter(p=>p.createdAt>=n),a=o.map(p=>p.emaScore),c=o.length>0?o.reduce((p,K)=>p+K.scores.weighted,0)/o.length:1,d=[],u=o.filter(p=>p.scores.taskSuccess<.5);u.length>0&&d.push({category:"task_failures",count:u.length,examples:u.slice(0,3).map(p=>p.taskId)});let l=o.filter(p=>p.scores.planAccuracy<.5);l.length>0&&d.push({category:"plan_deviations",count:l.length,examples:l.slice(0,3).map(p=>p.taskId)});let g=o.filter(p=>p.scores.permissionCompliance<.8);g.length>0&&d.push({category:"permission_violations",count:g.length,examples:g.slice(0,3).map(p=>p.taskId)});let E=o.filter(p=>p.scores.efficiency<.3);E.length>0&&d.push({category:"inefficiency",count:E.length,examples:E.slice(0,3).map(p=>p.taskId)});let W=[],C=[];return u.length>o.length*.3&&(W.push("High task failure rate"),C.push({action:"add_rule",detail:"Add rule: verify task feasibility before execution"})),g.length>0&&(W.push("Permission boundary violations"),C.push({action:"adjust_permission",detail:"Review and expand allowedTools if tasks legitimately need wider access"})),l.length>o.length*.5&&(W.push("Frequent plan deviations"),C.push({action:"add_rule",detail:"Add rule: follow execution plan steps more closely, request plan revision if steps are unclear"})),Yt.info({roleId:e,taskCount:o.length,avgScore:c.toFixed(3),failureCategories:d.map(p=>p.category)},"Diagnostic report generated"),{roleId:e,agentName:r?.name??"Unknown",period:{start:n,end:s},taskCount:o.length,avgScore:c,scoreHistory:a,failureBehaviors:d,rootCauses:W,recommendations:C}}P();var ee=b("audit"),at=.4,Gt=5;function dt(e,t,r=at){if(t>=r)return;let i=R(e);if(!i||i.status==="retired"||i.status==="dead")return;ee.warn({roleId:e,emaScore:t,threshold:r},"Agent EMA below threshold, retiring");let s=Q(e),n=JSON.stringify(i.learnedRules),o=Xt(i.learnedRules,s);L(e,{status:"retired",learnedRules:o});let a=[...s.failureBehaviors.map(d=>`${d.category}: ${d.count} occurrences`),...s.rootCauses.map(d=>`Root cause: ${d}`),...s.recommendations.map(d=>`Recommendation [${d.action}]: ${d.detail}`)].join(`
|
|
9
|
+
`),c=tt(n,JSON.stringify(o));return U({timestamp:Date.now(),oldRules:n,newRules:JSON.stringify(o),diff:a?`--- Diagnostic Report ---
|
|
10
|
+
${a}
|
|
11
|
+
|
|
12
|
+
--- Rules Diff ---
|
|
13
|
+
${c}`:c,roleId:e,source:"audit"}),ee.info({roleId:e,oldRulesCount:i.learnedRules.length,newRulesCount:o.length,recommendations:s.recommendations.length},"Agent retired with targeted learnedRules modification"),s}function ct(e){let t=R(e);return!t||t.status!=="retired"?!1:(L(e,{status:"probation"}),U({timestamp:Date.now(),oldRules:"status: retired",newRules:"status: probation",diff:`- status: retired
|
|
14
|
+
+ status: probation`,roleId:e,source:"audit"}),ee.info({roleId:e},"Agent reinstated to probation"),!0)}function lt(e,t,r=at,i=Gt){let s=R(e);return!s||s.status!=="probation"||X(e,i+1).length<i?!1:t>=r?(L(e,{status:"active"}),U({timestamp:Date.now(),oldRules:"status: probation",newRules:"status: idle",diff:`- status: probation
|
|
15
|
+
+ status: idle (graduated, EMA: ${t.toFixed(3)})`,roleId:e,source:"audit"}),ee.info({roleId:e,emaScore:t},"Agent graduated from probation to active"),!0):!1}function Xt(e,t){let r=[...e];for(let i of t.recommendations){let s=`[audit:${i.action}] ${i.detail}`;r.includes(s)||r.push(s)}if(t.failureBehaviors.length>0){let s=`[audit:diagnostic] Failure patterns detected: ${t.failureBehaviors.map(n=>`${n.category}(${n.count})`).join(", ")}. Review and adjust behavior accordingly.`;r.includes(s)||r.push(s)}return r}import{spawn as Et}from"child_process";$();import{query as po}from"@anthropic-ai/claude-agent-sdk";import{v4 as _t}from"uuid";function ut(e){let t=e.roleName?`## Role Context
|
|
16
|
+
- Role: ${e.roleName}
|
|
17
|
+
${e.roleCagPrompt?`- CAG Prompt: ${e.roleCagPrompt}`:""}`:"",r=e.allowedTools&&e.allowedTools.length>0?`## Available Tools
|
|
18
|
+
You have access to: ${e.allowedTools.join(", ")}. Use them as needed to complete the task.`:"",i=e.workflowStep?`## Workflow Step Context
|
|
19
|
+
You are executing step \`${e.workflowStep.stepId}\` of workflow \`${e.workflowStep.executionId}\`.
|
|
20
|
+
Other workflow steps may have already published structured data or files for you to use, and your output may be consumed by downstream steps.
|
|
21
|
+
|
|
22
|
+
### Artifact tools (use these to share data across steps)
|
|
23
|
+
- \`write_artifact\`: Save small structured JSON for downstream steps. Use for fields, flags, URLs, or summaries. Example: save extracted metadata.
|
|
24
|
+
- \`read_artifact\`: Read structured JSON previously written by an upstream step. Use for fields or state, not files.
|
|
25
|
+
- \`publish_artifact_file\`: Publish a file from your workspace into workflow storage. Use for audio, video, reports, images, or other large outputs.
|
|
26
|
+
- \`fetch_artifact_file\`: Copy an upstream file artifact into your current workspace. Use when you need to process a file produced by another step.
|
|
27
|
+
- \`list_artifacts\`: Discover what upstream artifacts exist before choosing a read or fetch call.
|
|
28
|
+
|
|
29
|
+
### When to use which
|
|
30
|
+
- Small JSON, fields, numbers, status, URLs: \`write_artifact\` and \`read_artifact\`
|
|
31
|
+
- Files such as audio, video, reports, images, or large outputs: \`publish_artifact_file\` and \`fetch_artifact_file\`
|
|
32
|
+
- Discover upstream output first: \`list_artifacts\`
|
|
33
|
+
|
|
34
|
+
The artifact tools handle storage and isolation automatically; never write to ~/.adam/ or other shared directories yourself.`:"";return`# Execution Agent \u2014 Task Focus
|
|
35
|
+
|
|
36
|
+
You are executing a specific task assigned to you. Your job is to complete the work, not manage goals or strategies.
|
|
37
|
+
|
|
38
|
+
## Task
|
|
39
|
+
- Task ID: ${e.taskId}
|
|
40
|
+
- Prompt: ${e.prompt}
|
|
41
|
+
|
|
42
|
+
${t}
|
|
43
|
+
|
|
44
|
+
${r}
|
|
45
|
+
|
|
46
|
+
${i}
|
|
47
|
+
|
|
48
|
+
## Focus
|
|
49
|
+
- Focus entirely on completing the task
|
|
50
|
+
- Use the standard SDK tools to do the work
|
|
51
|
+
- Do NOT attempt strategic decisions \u2014 just execute
|
|
52
|
+
|
|
53
|
+
## Constraints
|
|
54
|
+
- You have standard SDK tools only (no adam-tools MCP)
|
|
55
|
+
- Stay within your assigned permissions and allowed paths
|
|
56
|
+
- File writes: persistent outputs go under your working directory${e.cwd?` (\`${e.cwd}\`)`:""}. Temporary files may use \`os.tmpdir()\` (auto-redirected by the sandbox to a per-task dir). Do NOT write to absolute paths like \`/tmp/*\`, \`/var/*\`, \`~/Documents/*\`, or anywhere outside your workspace; the sandbox will reject them.
|
|
57
|
+
- Report completion with a clear result summary
|
|
58
|
+
- If WebSearch or WebFetch fails (network error, invalid params), report the failure honestly \u2014 do not fabricate data
|
|
59
|
+
- If a tool is unavailable, state it clearly in the result rather than guessing
|
|
60
|
+
`}import{isAbsolute as Zt,relative as Qt,resolve as eo}from"path";Ne();P();var to=new Set(["Read","Glob","Grep","LSP"]),oo=new Set(["Edit","Write","NotebookEdit"]);function ge(e){let t=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${t}$`)}function he(e){return eo(Y(e))}function pt(e,t){return t.some(r=>{let i=he(r),s=Qt(i,e);return s===""||!s.startsWith("..")&&!Zt(s)})}function mt(e,t,r){return async(i,s,{agentID:n,blockedPath:o})=>{if(o){let c=he(o);if(r?.deniedReadPaths?.length)for(let d of r.deniedReadPaths){let u=he(d);if(pt(c,[u]))return ro.warn({toolName:i,blockedPath:o,agentID:n,deniedPath:d},"Denied: path in deniedReadPaths (absolute blacklist)"),{behavior:"deny",message:`Access denied: ${o} is in the global denied read paths list. This restriction is configured in Settings > Advanced and cannot be overridden by privilege escalation.`}}return r?.roleScope?.length&&pt(c,r.roleScope)?{behavior:"allow",updatedInput:s}:t?await t(i,s,`blockedPath:${o}`,n):{behavior:"deny",message:`Access denied: ${o} is outside this role's allowed scope (cwd + additionalDirectories). Configure additionalDirectories to expand access.`}}if(to.has(i))return{behavior:"allow",updatedInput:s};if(oo.has(i))return{behavior:"allow",updatedInput:s};let a=e(n??"");if(i==="Bash"&&a){let c=s.command??"";if(a.allowedBashPatterns?.length)for(let d of a.allowedBashPatterns)try{if(ge(d).test(c))return{behavior:"allow",updatedInput:s}}catch{}if(a.deniedBashPatterns?.length)for(let d of a.deniedBashPatterns)try{if(ge(d).test(c))return{behavior:"deny",message:`Bash command denied by pattern: ${d}`}}catch{}}if(a?.disallowedTools?.includes(i))return{behavior:"deny",message:`Tool ${i} is not allowed for this role.`};if(t&&a?.approvalRequired?.length){let c=i==="Bash"?s.command??"":`${i} ${JSON.stringify(s)}`;for(let d of a.approvalRequired)try{if(ge(d).test(c))return await t(i,s,d,n)}catch{}}return{behavior:"allow",updatedInput:s}}}var ro=b("manager");function ft(e){return{SessionStart:[{hooks:[async t=>{if(!e.roleId)return{};let r=t.source,i=e.roleId==="role-chat-manager";if(!i&&r!=="startup"&&r!=="resume")return{};try{let{queryMemoryByTier:s}=await import("./memory-service-QMYJPBAE.js"),n=e.taskPrompt||"role context and recent interactions",o=i?["semantic","working"]:["semantic","episodic"],a=await s(e.roleId,n,o,{topK:5});if(a.length>0)return{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:`[Memory Context]
|
|
61
|
+
${a.map(u=>`- [${u.tier??"episodic"}] ${u.content}`).join(`
|
|
62
|
+
`)}
|
|
63
|
+
|
|
64
|
+
`}}}catch{}return{}}]}],SubagentStart:[{hooks:[async t=>{let r=e.roleId??t.agent_id;if(!r)return{};try{let i=e.taskPrompt||"role context",s=await Je(i,r,5);if(s)return{hookSpecificOutput:{hookEventName:"SubagentStart",additionalContext:s}}}catch{}return{}}]}],SubagentStop:[{hooks:[async t=>{let r=t.agent_id;if(!r||!e.currentTaskId)return{};try{let{createMemory:i}=await import("./memories-ZII5QSTJ.js"),{getDb:s}=await import("./db-YUYXVV3A.js"),n=t.transcript;if(!n||n.length<=100)return{};if(s().prepare("SELECT 1 FROM memories WHERE source_task_id = ? AND type = 'thought' LIMIT 1").get(e.currentTaskId))return{};let a=`[Task ${e.currentTaskId} reasoning] ${n.slice(0,3e3)}`;i({id:`session-${Date.now()}`,roleId:e.roleId??r,type:"thought",content:a,keywords:[],importance:3,sourceType:"task_complete",sourceTaskId:e.currentTaskId,createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"episodic"})}catch{}return{}}]}],PostToolUse:[{hooks:[async t=>{if(!e.currentTaskId)return{};let r=t.tool_name,i=t.tool_input,s=t.tool_response,n=typeof s=="string"?s:JSON.stringify(s??"");try{Le({id:`step-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,taskId:e.currentTaskId,index:0,type:"tool_call",content:`${r}: ${JSON.stringify(i??{})} \u2192 ${n.slice(0,200)}`,toolName:r,toolInput:i,toolOutput:n,timestamp:Date.now()})}catch{}return{}}]}],PreCompact:[{hooks:[async t=>{let r=t.compact_summary;if(!r)return{};try{let{createMemory:i}=await import("./memories-ZII5QSTJ.js");i({id:`compact-${Date.now()}`,roleId:e.roleId??"role-chat-manager",type:"thought",content:r.slice(0,5e3),keywords:["compaction","context","decisions"],importance:4,sourceType:"pre_compact",createdAt:Date.now(),lastAccessed:Date.now(),retrievedCount:0,tier:"working"})}catch{}return{}}]}]}}$();ze();jt();P();q();import{randomUUID as no}from"crypto";function gt(e,t,r){let s=_().prepare(`
|
|
65
|
+
INSERT INTO task_plugins (id, task_id, plugin_path, plugin_name, role_id, used_at)
|
|
66
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
67
|
+
`),n=Date.now();for(let o of t){let a=o.split("/").pop()??o;s.run(no(),e,o,a,r??null,n)}}function Xo(e){return _().prepare(`
|
|
68
|
+
SELECT plugin_name as pluginName, COUNT(*) as usageCount
|
|
69
|
+
FROM task_plugins
|
|
70
|
+
WHERE role_id = ?
|
|
71
|
+
GROUP BY plugin_path
|
|
72
|
+
ORDER BY usageCount DESC
|
|
73
|
+
`).all(e)}function Zo(e=50){return _().prepare(`
|
|
74
|
+
SELECT plugin_path as pluginPath, plugin_name as pluginName, COUNT(*) as usageCount, MAX(used_at) as lastUsed
|
|
75
|
+
FROM task_plugins
|
|
76
|
+
GROUP BY plugin_path
|
|
77
|
+
ORDER BY usageCount DESC
|
|
78
|
+
LIMIT ?
|
|
79
|
+
`).all(e)}$();ze();import{createSdkMcpServer as so,tool as A}from"@anthropic-ai/claude-agent-sdk";import{z as v}from"zod";import{v4 as yt}from"uuid";q();function ht(e){return{id:e.id,executionId:e.execution_id,stepId:e.step_id,key:e.key,kind:e.kind,value:e.value_json?JSON.parse(e.value_json):void 0,blobPath:e.blob_path??void 0,mime:e.mime??void 0,sizeBytes:e.size_bytes,createdAt:e.created_at}}function Ie(e){_().prepare(`
|
|
80
|
+
INSERT INTO workflow_artifacts (
|
|
81
|
+
id, execution_id, step_id, key, kind, value_json, blob_path, mime, size_bytes, created_at
|
|
82
|
+
)
|
|
83
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
84
|
+
`).run(e.id,e.executionId,e.stepId,e.key,e.kind,e.value!==void 0?JSON.stringify(e.value):null,e.blobPath??null,e.mime??null,e.sizeBytes,e.createdAt)}function ye(e,t,r){let s=_().prepare(`
|
|
85
|
+
SELECT * FROM workflow_artifacts
|
|
86
|
+
WHERE execution_id = ? AND step_id = ? AND key = ?
|
|
87
|
+
`).get(e,t,r);return s?ht(s):void 0}function ke(e,t){let r=_(),i="SELECT * FROM workflow_artifacts WHERE execution_id = ?",s=[e];return t&&(i+=" AND step_id = ?",s.push(t)),i+=" ORDER BY created_at ASC",r.prepare(i).all(...s).map(ht)}function tr(e){let t=_(),r=ke(e);return t.prepare("DELETE FROM workflow_artifacts WHERE execution_id = ?").run(e),r}function It(e){_().prepare("DELETE FROM workflow_artifacts WHERE id = ?").run(e)}function or(e){return _().prepare(`
|
|
88
|
+
SELECT id
|
|
89
|
+
FROM workflow_executions
|
|
90
|
+
WHERE status != 'running' AND COALESCE(completed_at, started_at) < ?
|
|
91
|
+
`).all(e).map(i=>i.id)}P();q();var io=b("audit");function I(e){try{_().prepare(`
|
|
92
|
+
INSERT INTO artifact_access_log (
|
|
93
|
+
timestamp, task_id, role_id, execution_id, step_id, tool, artifact_key, artifact_id,
|
|
94
|
+
size_bytes, outcome, error_reason
|
|
95
|
+
)
|
|
96
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
97
|
+
`).run(e.timestamp,e.taskId??null,e.roleId??null,e.executionId,e.stepId??null,e.tool,e.artifactKey??null,e.artifactId??null,e.sizeBytes??null,e.outcome,e.errorReason??null)}catch(t){io.error({err:t,entry:e},"Failed to write artifact access log")}}var ao=/^[A-Za-z0-9._-]{1,256}$/,co=/^[A-Za-z0-9._-]{1,128}$/,kt=256*1024,lo=/^[a-z]+\/[a-z0-9.+-]+$/;async function uo(e){let{listChannels:t}=await import("./channels-HYSB2EEK.js"),r=t(),{listSessions:i}=await import("./session-manager-GRJ3FV3L.js"),s=[...i("active"),...i("archived")],n=r.find(c=>c.name.toLowerCase().includes(e.toLowerCase()));if(!n)return null;let a=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:a}}function f(e){return{content:[{type:"text",text:JSON.stringify(e)}]}}function te(e){return ao.test(e)?null:"Invalid artifact key. Use only letters, numbers, dot, underscore, or dash (1-256 chars)."}function we(e){return co.test(e)?null:"Invalid stepId format. Use only letters, numbers, dot, underscore, or dash (1-128 chars)."}function wt(e,t){let r=e?R(e):void 0,i=async()=>{if(!t)return{error:"artifact tools require a task context"};let n=B(t);if(!n)return{error:`task not found: ${t}`};if(!n.parentId)return{error:"this task is not a workflow step (no execution context)"};if(!n.stepId)return{error:"this task is not a workflow step (no step_id)"};let o=n.roleId??e;if(!o)return{error:"this workflow task has no role context"};let a=R(o);return a?{executionId:n.parentId,stepId:n.stepId,roleId:o,roleWorkspacePath:G(a.name),taskId:t}:{error:`role not found: ${o}`}},s=[...Qe(e),A("list_channels","List all available channels. Use this to discover what channels can be used with send_to_channel.",{},async()=>{let{listChannels:n}=await import("./channels-HYSB2EEK.js"),o=n();return f({channels:o.map(a=>({id:a.id,name:a.name,enabled:a.enabled,type:a.config?.type??"unknown"}))})}),A("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:v.string().describe("The channel name, e.g., 'WeChat on iPad'"),message:v.string().describe("The message content to send")},async n=>{if(r?.allowedChannels!==void 0){if(r.allowedChannels.length===0)return f({error:"This role is not allowed to send to any channels"});if(!r.allowedChannels.some(l=>l.toLowerCase()===n.channelName.toLowerCase()))return f({error:`Channel "${n.channelName}" is not in the allowed channels list for this role`})}let o=await uo(n.channelName);if(!o)return f({error:`Channel "${n.channelName}" not found or has no chatId available`});let{getOutboundGateway:a}=await import("./outbound-gateway-6K6P2BEH.js"),d=await a().send({channelId:o.channelId,chatId:o.chatId,content:n.message,messageType:"reply"});return f({success:d.success,channelName:n.channelName})}),A("write_artifact","Persist a small structured value (JSON <= 256KB) for downstream workflow steps to read. USE THIS for: extracted fields, status flags, URL lists, summaries, structured key-value data. Do NOT use for: files (audio, video, reports). For files use publish_artifact_file instead.",{key:v.string(),value:v.unknown()},async n=>{let o=await i();if("error"in o)return f({error:o.error});let a=te(n.key);if(a)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:n.key,outcome:"denied",errorReason:a}),f({error:a});try{let c=JSON.stringify(n.value),d=Buffer.byteLength(c,"utf8");if(d>kt){let l=`Artifact JSON exceeds ${kt} bytes`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:n.key,sizeBytes:d,outcome:"denied",errorReason:l}),f({error:l})}let u=yt();return Ie({id:u,executionId:o.executionId,stepId:o.stepId,key:n.key,kind:"json",value:n.value,sizeBytes:d,createdAt:Date.now()}),I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:n.key,artifactId:u,sizeBytes:d,outcome:"success"}),f({success:!0,artifactId:u,sizeBytes:d})}catch(c){let d=c instanceof Error?c.message:String(c);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"write_artifact",artifactKey:n.key,outcome:"error",errorReason:d}),f({error:d})}}),A("read_artifact","Read a structured value previously written by an upstream step's write_artifact. Returns the JSON value. For files, use fetch_artifact_file instead.",{stepId:v.string(),key:v.string()},async n=>{let o=await i();if("error"in o)return f({error:o.error});let a=we(n.stepId),c=te(n.key),d=a??c;if(d)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:n.key,outcome:"denied",errorReason:d}),f({error:d});let u=ye(o.executionId,n.stepId,n.key);if(!u){let l=`no artifact at ${n.stepId}/${n.key}`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:n.key,outcome:"error",errorReason:l}),f({error:l})}if(u.kind!=="json"){let l="artifact is a file; use fetch_artifact_file";return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:n.key,artifactId:u.id,sizeBytes:u.sizeBytes,outcome:"denied",errorReason:l}),f({error:l})}return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"read_artifact",artifactKey:n.key,artifactId:u.id,sizeBytes:u.sizeBytes,outcome:"success"}),f({value:u.value,sizeBytes:u.sizeBytes})}),A("publish_artifact_file","Publish a file from your workspace as a workflow artifact. The file is COPIED to the workflow's shared storage. USE THIS for: generated audio, video, reports, images, or large outputs. Do NOT use for: small structured values; use write_artifact instead. If you publish with cleanup=true, this step will not be retryable through publish; only choose cleanup=true when you do not need the source file again.",{key:v.string(),sourcePath:v.string(),mime:v.string().optional(),cleanup:v.boolean().optional()},async n=>{let o=await i();if("error"in o)return f({error:o.error});let a=te(n.key);if(a)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"publish_artifact_file",artifactKey:n.key,outcome:"denied",errorReason:a}),f({error:a});if(n.mime&&!lo.test(n.mime)){let l=`Invalid MIME type: ${n.mime}`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"publish_artifact_file",artifactKey:n.key,outcome:"denied",errorReason:l}),f({error:l})}try{fe(n.sourcePath,o.roleWorkspacePath,!0)}catch(l){let g=l instanceof Error?l.message:String(l);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"publish_artifact_file",artifactKey:n.key,outcome:"denied",errorReason:g}),f({error:g})}let c=yt(),d=null,u=!1;try{let l=Ye({executionId:o.executionId,artifactId:c,sourcePath:n.sourcePath});return d=l.blobPath,Ie({id:c,executionId:o.executionId,stepId:o.stepId,key:n.key,kind:"file",blobPath:d,mime:n.mime,sizeBytes:l.sizeBytes,createdAt:Date.now()}),u=!0,n.cleanup===!0&&Ge(n.sourcePath),I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"publish_artifact_file",artifactKey:n.key,artifactId:c,sizeBytes:l.sizeBytes,outcome:"success"}),f({success:!0,artifactId:c,sizeBytes:l.sizeBytes})}catch(l){if(u)try{It(c)}catch{}if(d)try{Ze(d)}catch{}let g=l instanceof Error?l.message:String(l);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"publish_artifact_file",artifactKey:n.key,artifactId:c,outcome:"error",errorReason:g}),f({error:g})}}),A("fetch_artifact_file","Copy an upstream step's published file into your current Role workspace. Use this when an earlier step published audio, video, reports, or other files you need to process.",{stepId:v.string(),key:v.string(),destPath:v.string()},async n=>{let o=await i();if("error"in o)return f({error:o.error});let a=we(n.stepId),c=te(n.key),d=a??c;if(d)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,outcome:"denied",errorReason:d}),f({error:d});try{fe(n.destPath,o.roleWorkspacePath,!1)}catch(l){let g=l instanceof Error?l.message:String(l);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,outcome:"denied",errorReason:g}),f({error:g})}let u=ye(o.executionId,n.stepId,n.key);if(!u){let l=`no artifact at ${n.stepId}/${n.key}`;return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,outcome:"error",errorReason:l}),f({error:l})}if(u.kind!=="file"||!u.blobPath){let l="artifact is not a file";return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,artifactId:u.id,outcome:"denied",errorReason:l}),f({error:l})}try{let l=Xe({blobPath:u.blobPath,destPath:n.destPath});return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,artifactId:u.id,sizeBytes:l.sizeBytes,outcome:"success"}),f({success:!0,sizeBytes:l.sizeBytes,mime:u.mime,destPath:n.destPath})}catch(l){let g=l instanceof Error?l.message:String(l);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"fetch_artifact_file",artifactKey:n.key,artifactId:u.id,outcome:"error",errorReason:g}),f({error:g})}}),A("list_artifacts","Discover artifacts published by upstream steps in this workflow. Returns step_id, key, kind ('json' or 'file'), size, mime. Use this to learn what is available before calling read_artifact or fetch_artifact_file.",{stepId:v.string().optional()},async n=>{let o=await i();if("error"in o)return f({error:o.error});let a=n.stepId?we(n.stepId):null;if(a)return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"list_artifacts",outcome:"denied",errorReason:a}),f({error:a});let c=ke(o.executionId,n.stepId);return I({timestamp:Date.now(),taskId:o.taskId,roleId:o.roleId,executionId:o.executionId,stepId:o.stepId,tool:"list_artifacts",sizeBytes:c.length,outcome:"success"}),f({artifacts:c.map(d=>({id:d.id,stepId:d.stepId,key:d.key,kind:d.kind,sizeBytes:d.sizeBytes,mime:d.mime,createdAt:d.createdAt}))})})];return so({name:"execution-tools",version:"1.0.0",tools:s})}Ft();Ne();import{realpathSync as mo}from"fs";var w=b("execution"),bt=new Set;async function fo(e,t){if(t&&bt.has(t))return w.info({taskId:e,roleName:t},"Sandbox bypass: approved from session cache"),!0;let r=_t(),i={steps:[{index:0,description:"Execute task without OS sandbox \u2014 filesystem isolation not enforced",toolsNeeded:[],expectedOutput:"Task result or denial message",riskLevel:"high"}],requiredPermissions:{allowedTools:[],disallowedTools:[],approvalRequired:[],maxBudgetUsd:0,plugins:[]},overallRisk:"high"};return pe({id:r,taskId:e,plan:i,status:"pending",createdAt:Date.now()}),y.emit({type:"plan_approval_request",taskId:e,planId:r,plan:i}),w.info({taskId:e,operationId:r,roleName:t},"Sandbox unavailable: awaiting privilege escalation decision"),new Promise(s=>{let o=setTimeout(()=>{c(),me(r,"denied"),w.warn({taskId:e,operationId:r},"Sandbox bypass timed out, auto-denied"),s(!1)},12e4),a=d=>{d.planId===r&&(c(),d.decision==="allow"?(w.info({taskId:e,operationId:r},"Sandbox bypass approved by user"),t&&bt.add(t),s(!0)):(w.info({taskId:e,operationId:r},"Sandbox bypass denied by user"),s(!1)))},c=()=>{clearTimeout(o),y.off("plan_approval_decision",a)};y.on("plan_approval_decision",a)})}var oe=class{async execute(t,r){let i=Date.now(),s,n,o;O(t.id,{status:"running",startedAt:Date.now()}),y.emit({type:"task_status_change",taskId:t.id,oldStatus:t.status,newStatus:"running"}),w.info({taskId:t.id,roleId:t.roleId},"ExecutionManager: starting task");try{let a=t.config.executionProfile;if(!a){let m=t.roleId?R(t.roleId):void 0;if(m){w.info({taskId:t.id,roleId:t.roleId},"Lazy-backfilled executionProfile from live Role"),a=m;let h=B(t.id);h&&O(t.id,{config:{...h.config,executionProfile:m}})}}let c=le;a&&(We(a),c=G(a.name));let d={taskId:t.id,prompt:t.prompt,roleName:a?.name,roleCagPrompt:a?.cagPrompt,allowedTools:a?.allowedTools,cwd:c,workflowStep:t.parentId&&t.stepId?{executionId:t.parentId,stepId:t.stepId}:void 0},u=ut(d),l=ft({currentTaskId:t.id,roleId:t.roleId,taskPrompt:t.prompt}),g=t.config.approvalTimeout??300,E=async(m,h,k,D)=>{let x=_t(),Ce=He(D??t.roleId,t.prompt,"medium");if(Ce)return w.info({operationId:x,ruleId:Ce.id,taskId:t.id},"Auto-approved by permanent rule"),{behavior:"allow",updatedInput:h};let Ae={steps:[{index:0,description:`${m}: ${JSON.stringify(h).slice(0,300)}`,toolsNeeded:[m],expectedOutput:"",riskLevel:"medium"}],requiredPermissions:{},overallRisk:"medium"};return pe({id:x,taskId:t.id,roleId:D??t.roleId,plan:Ae,status:"pending",createdAt:Date.now()}),y.emit({type:"plan_approval_request",taskId:t.id,planId:x,plan:Ae}),w.info({taskId:t.id,operationId:x,toolName:m,matchedPattern:k},"Privilege escalation: awaiting user decision"),new Promise(ce=>{let zt=setTimeout(()=>{Me(),me(x,"denied"),w.warn({taskId:t.id,operationId:x},"Privilege escalation timed out, auto-denied"),ce({behavior:"deny",message:`Operation timed out after ${g}s. Auto-denied. Try a safer alternative that does not require approval.`})},g*1e3),De=M=>{if(M.planId===x)if(Me(),M.decision==="allow")w.info({taskId:t.id,operationId:x,approvalType:M.approvalType},"Operation authorized by user"),ce({behavior:"allow",updatedInput:h});else{let Vt=M.reason?`Operation denied by user: ${M.reason}. Try a safer alternative.`:"Operation denied by user. Try a safer alternative approach.";w.info({taskId:t.id,operationId:x,reason:M.reason??"no reason given"},"Operation denied by user"),ce({behavior:"deny",message:Vt})}},Me=()=>{clearTimeout(zt),y.off("plan_approval_decision",De)};y.on("plan_approval_decision",De)})},C=(Ue("defaults.deniedReadPaths")??[]).map(m=>{let h=Y(m);try{return mo(h)}catch{return h}}),p=a,K=p?.additionalDirectories??[],se=p?je(p):[],ve=[...K.map(m=>m.path)].filter((m,h,k)=>k.indexOf(m)===h),Dt=mt(m=>({disallowedTools:p?.disallowedTools,approvalRequired:p?.approvalRequired??t.config.approvalRequired,allowedBashPatterns:p?.allowedBashPatterns,deniedBashPatterns:p?.deniedBashPatterns}),E,{deniedReadPaths:C,roleScope:[c,...ve]}),Mt=Be({roleEnvVars:p?.envVars,taskEnv:t.config.env}),Bt=t.config.maxBudgetUsd??z().defaults.maxBudgetUsd,Ot=t.config.maxTurns??100,Lt=wt(t.roleId??"",t.id),$t=p?.mcpServers??{},Nt=t.config.mcpServers??{},Ut={...$t,...Nt,"execution-tools":Lt},ae=[{path:c,mode:"rw"}];t.roleId===Ve&&ae.push({path:le,mode:"ro"});for(let m of K)ae.push({path:m.path,mode:m.mode??"rw"});let Se=N();if(Se.platform==="none"&&!await fo(t.id,a?.name))return O(t.id,{status:"failed",error:"Sandbox unavailable; execution denied by user"}),{taskId:t.id,status:"failed",error:"Sandbox bypass denied"};let Te=p?.permissionMode??"default",Wt=po({prompt:t.prompt,options:{cwd:c,additionalDirectories:ve,systemPrompt:u,maxTurns:Ot,maxBudgetUsd:Bt,allowedTools:p?.allowedTools,model:p?.model,mcpServers:Ut,settingSources:p?.inheritUserSettings?["project","user"]:["project"],hooks:l,canUseTool:Dt,env:Mt,plugins:se.map(m=>({type:"local",path:m})),permissionMode:Te,...Te==="bypassPermissions"?{allowDangerouslySkipPermissions:!0}:{},spawnClaudeCodeProcess:m=>{let h=Se.spawn({command:m.command,args:m.args,cwd:m.cwd,env:m.env,signal:m.signal,visiblePaths:ae,deniedReadPaths:C,osCapabilities:p?.osCapabilities}),k=h;k.pid&&(xt(k.pid,t.roleId??"unknown",t.id),k.on("exit",()=>Rt(k.pid)));let D="";return k.stderr?.on("data",x=>{D+=x.toString()}),k.on("exit",x=>{x!==null&&x!==0&&D.includes("sandbox")&&(w.error({taskId:t.id,roleId:t.roleId,exitCode:x,stderr:D.slice(0,500)},"Sandbox wrapper failed \u2014 task process exited before execution"),re({roleId:t.roleId??"unknown",taskId:t.id,path:c,operation:`sandbox_init_failure:exit_${x}`,timestamp:Date.now()}))}),h},stderr:m=>{m.trim()&&w.debug({stderr:m.trim().slice(0,500)},"ExecutionManager SDK stderr")}}}),H="",Ee=0,Pe=()=>{w.warn({taskId:t.id},"ExecutionManager: abort signal received")};r&&r.addEventListener("abort",Pe);try{for await(let m of Wt){let h=m;if(w.debug({eventType:h.type,taskId:t.id},"ExecutionManager SDK event"),h.type==="result"&&typeof h.result=="string"&&(H=h.result),h.type==="result"){Ee++,typeof h.total_cost_usd=="number"&&(n=h.total_cost_usd);let k=h.usage;k?.input_tokens!==void 0&&k?.output_tokens!==void 0&&(s={input:k.input_tokens,output:k.output_tokens})}if(h.token_usage){let k=h.token_usage;k.input_tokens!==void 0&&k.output_tokens!==void 0&&(s={input:k.input_tokens,output:k.output_tokens})}}}finally{r&&r.removeEventListener("abort",Pe)}o=Ee;let de=Date.now()-i;return O(t.id,{status:"completed",result:H,completedAt:Date.now(),costUsd:n,tokenUsage:s,numTurns:o,totalDurationMs:de}),y.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"completed"}),y.emit({type:"task_complete_event",taskId:t.id,result:H}),se.length>0&>(t.id,se,t.roleId),w.info({taskId:t.id,durationMs:de,costUsd:n},"ExecutionManager: task completed"),{taskId:t.id,status:"completed",result:H,costUsd:n,tokenUsage:s,numTurns:o,durationMs:de}}catch(a){let c=a instanceof Error?a.message:String(a),d=Date.now()-i;return(c.includes("Prompt is too long")||c.includes("prompt is too long"))&&w.warn({taskId:t.id,error:c},"Task prompt exceeds model context window \u2014 task failed"),O(t.id,{status:"failed",error:c,completedAt:Date.now(),totalDurationMs:d}),y.emit({type:"task_status_change",taskId:t.id,oldStatus:"running",newStatus:"failed"}),y.emit({type:"task_complete_event",taskId:t.id,error:c}),w.error({taskId:t.id,error:a},"ExecutionManager: task failed"),{taskId:t.id,status:"failed",error:c,durationMs:d}}}};P();var S=b("execution-pool"),be=new Map;function xt(e,t,r){be.set(e,{roleId:t,taskId:r})}function Rt(e){be.delete(e)}function _e(e){return be.get(e)}var vt=class{slots;running=!1;pollTimeoutId=null;executor;constructor(t,r){this.slots=Array.from({length:t},(i,s)=>({index:s,taskId:null,abortController:null})),this.executor=r??new oe}async start(){if(this.running)return;this.running=!0,y.on("task_created",i=>{this.onTaskCreated(i.taskId)}),y.on("task_status_change",i=>{i.newStatus==="pending"&&this.pickupPendingTasks()});let r=z().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,r),S.info({maxConcurrent:this.slots.length},"ExecutionPool started")}stop(){this.running=!1,this.pollTimeoutId&&(clearTimeout(this.pollTimeoutId),this.pollTimeoutId=null);for(let t of this.slots)t.abortController&&(t.abortController.abort(),t.taskId=null,t.abortController=null);S.info("ExecutionPool stopped")}poll=()=>{if(!this.running)return;this.pickupPendingTasks();let r=z().execution?.pollIntervalMs??3e4;this.pollTimeoutId=setTimeout(this.poll,r)};async onTaskCreated(t){this.running&&await this.pickupPendingTasks()}async pickupPendingTasks(){if(!this.running)return;let t=this.slots.find(a=>a.taskId===null);if(!t){S.debug("No free slots available");return}let r=J("pending");if(r.length===0)return;let s=[...r].sort((a,c)=>a.createdAt-c.createdAt)[0];t.taskId=s.id,t.abortController=new AbortController;let n=t.index,o=s.id;S.info({slotIndex:n,taskId:o},"ExecutionPool: claimed slot for task"),this.emitSlotChange(),this.executeTask(s,n).catch(a=>{S.error({taskId:o,error:a},"ExecutionPool: executeTask failed unexpectedly")})}async executeTask(t,r){let i=this.slots[r];if(!i)return;let s="completed";try{y.emit({type:"execution_task_start",taskId:t.id,slotIndex:r});let n=await this.executor.execute(t,i.abortController?.signal);s=n.status,S.info({taskId:t.id,status:n.status,slotIndex:r},"ExecutionPool: task finished")}finally{i.taskId=null,i.abortController=null,y.emit({type:"execution_task_end",taskId:t.id,slotIndex:r,status:s}),this.emitSlotChange(),this.runPostCompletion(t.id,t.roleId).catch(n=>{S.error({taskId:t.id,error:n},"Post-completion processing failed (non-fatal)")}),this.running&&this.pickupPendingTasks()}}emitSlotChange(){let t=this.slots.filter(s=>s.taskId!==null).length,r=J("pending");y.emit({type:"execution_slot_change",active:t,max:this.slots.length,queued:r.length});let i=qe();y.emit({type:"stats_update",activeTasks:t,queuedTasks:r.length,totalCostToday:Oe(i)})}async runPostCompletion(t,r){if(r){try{let{processTaskCompletion:i}=await import("./memory-extractor-DIYJFBCI.js"),s=await i(t,r);s>0&&S.debug({taskId:t,roleId:r,memoriesStored:s},"Post-completion: memories extracted")}catch(i){S.error({taskId:t,roleId:r,error:i},"Post-completion: memory extraction failed")}try{let{processTaskReview:i}=await import("./learner-IJN6B7KV.js");await i(t)}catch(i){S.error({taskId:t,roleId:r,error:i},"Post-completion: task review failed")}try{let{evaluateTaskCompletion:i}=await import("./audit-manager-YCJT2WP5.js");i(t,r)}catch(i){S.error({taskId:t,roleId:r,error:i},"Post-completion: audit evaluation failed")}}}getStatus(){let t=this.slots.filter(i=>i.taskId!==null).length,r=J("pending");return{active:t,max:this.slots.length,queued:r.length}}isHealthy(){return this.running}releaseSlot(t){let r=this.slots.find(i=>i.taskId===t);r&&(S.warn({taskId:t,slotIndex:r.index},"ExecutionPool: force-releasing slot"),r.abortController&&r.abortController.abort(),r.taskId=null,r.abortController=null,this.emitSlotChange(),this.running&&this.pickupPendingTasks())}};P();var T=b("audit"),go="sandbox_violation",V=new Map,xe=1440*60*1e3,ne=[],ho=100;function Re(e){let t=e.roleId,r=V.get(t)??{count:0,timestamps:[]};r.count++,r.timestamps.push(e.timestamp);let i=Date.now()-xe;if(r.timestamps=r.timestamps.filter(s=>s>=i),V.set(t,r),r.count%100===0)for(let[s,n]of V.entries()){let o=Date.now()-xe;n.timestamps.filter(a=>a>=o).length===0&&V.delete(s)}ne.push(e),ne.length>ho&&ne.shift();try{Fe({id:`sv-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,ruleId:void 0,taskId:e.taskId,status:"delivered",target:{type:"channel",channelId:"audit"},content:"",attempts:1,messageType:go,source:"audit",createdAt:e.timestamp,deliveredAt:e.timestamp,expiresAt:e.timestamp+864e5,error:`${e.operation} on ${e.path}`})}catch(s){T.error({error:s},"Failed to record violation to delivery_log")}try{let s=R(e.roleId);U({timestamp:e.timestamp,oldRules:"sandbox_violation",newRules:`${e.operation} on ${e.path}`,diff:`Sandbox violation: ${e.operation} on ${e.path} (taskId=${e.taskId??"unknown"})`,roleId:e.roleId,source:"audit"})}catch(s){T.error({error:s},"Failed to record violation to evolution_audit")}y.emit({type:"sandbox_violation",roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp})}async function Pt(){let e=N();if(e.platform==="none")return T.info("Sandbox platform is 'none'; violation watcher not started"),()=>{};if(!await e.isAvailable())return T.warn({platform:e.platform},"Sandbox platform detected but not available; violation watcher not started"),()=>{};let r=null;return e.platform==="sandbox-exec"?r=Io():e.platform==="landlock"&&(r=await yo()),()=>{if(r){let i=r;r=null,i.kill("SIGTERM");let s=setTimeout(()=>{try{i.kill("SIGKILL")}catch{}},2e3);i.on("exit",()=>clearTimeout(s))}T.info("Violation watcher stopped")}}function Io(){let e=Et("log",["stream","--predicate",'subsystem == "com.apple.sandbox"',"--style","ndjson","--signal","exit"],{stdio:["ignore","pipe","pipe"]});return e.stdout?.on("data",t=>{let r=t.toString().split(`
|
|
98
|
+
`).filter(Boolean);for(let i of r)try{let s=JSON.parse(i),n=s.eventMessage??s.message??"";if(n.includes("deny")&&(n.includes("file-read")||n.includes("file-write"))){let o=ko(s,n);o&&Re(o)}}catch{}}),e.stderr?.on("data",t=>{T.debug({msg:t.toString()},"log stream stderr")}),e.on("error",t=>{T.warn({error:t},"macOS violation watcher failed to start")}),T.info("macOS sandbox violation watcher started (log stream)"),e}async function yo(){let e=await St("journalctl",["-kf","--no-pager","-o","short","--grep","landlock"]);if(e)return Tt(e),T.info("Linux violation watcher started (journalctl -kf)"),e;let t=await St("dmesg",["-w","-t"]);return t?(Tt(t),T.info("Linux violation watcher started (dmesg -w)"),t):(T.warn("Linux violation watcher unavailable: neither journalctl nor dmesg accessible. Sandbox enforcement still active; monitoring disabled."),null)}async function St(e,t){return new Promise(r=>{let i=Et(e,t,{stdio:["ignore","pipe","pipe"]}),s=setTimeout(()=>r(i),500);i.on("error",()=>{clearTimeout(s),r(null)}),i.on("exit",n=>{n!==0&&(clearTimeout(s),r(null))})})}function Tt(e){e.stdout?.on("data",t=>{let r=t.toString().split(`
|
|
99
|
+
`).filter(Boolean);for(let i of r)if(i.includes("landlock")&&i.includes("denied")){let s=wo(i);s&&Re(s)}}),e.stderr?.on("data",t=>{T.debug({msg:t.toString().trim()},"Linux watcher stderr")})}function ko(e,t){let r=t.match(/(?:path|file)=["']([^"']+)["']/),i=t.match(/deny\s+(file-read|file-write|file-[^\s]+)/),s=r?.[1],n=i?.[1]??"unknown";if(!s)return null;let o=typeof e.processID=="number"?e.processID:void 0,a=o?_e(o):void 0;return{roleId:a?.roleId??"unknown",taskId:a?.taskId,path:s,operation:n,timestamp:Date.now(),count:1}}function wo(e){let t=e.match(/path="([^"]+)"/)??e.match(/\/[\w\-\.\/\+ ]+/g),r=e.match(/deny\s+(\w+)/),i=e.match(/pid=(\d+)/),s=Array.isArray(t)?t[t.length-1]:t?.[1],n=r?.[1]??"unknown";if(!s)return null;let o=i?parseInt(i[1],10):void 0,a=o?_e(o):void 0;return{roleId:a?.roleId??"unknown",taskId:a?.taskId,path:s,operation:n,timestamp:Date.now(),count:1}}function re(e){Re({roleId:e.roleId,taskId:e.taskId,path:e.path,operation:e.operation,timestamp:e.timestamp,count:1})}function Ct(e){let t=V.get(e);if(!t)return 0;let r=Date.now()-xe;return t.timestamps.filter(i=>i>=r).length}function At(){return[...ne]}$();P();var j=b("audit"),bo=.4,_o=1440*60*1e3,F=null,ie=null;function pn(e,t,r=bo){let i=R(t);if(!i||i.status==="retired"||i.status==="inactive"||i.status==="dead")return;let s=st(t,e);L(t,{performanceScore:s}),lt(t,s,r)?j.info({roleId:t,emaScore:s},"Probation role graduated"):s<r&&dt(t,s,r)&&ct(t)}async function mn(){F===null&&(F=setInterval(()=>{j.info("Running daily diagnostic reports");let e=ue(void 0,1e3);for(let t of e)if(!(t.status==="retired"||t.status==="inactive"))try{Q(t.id)}catch(r){j.error({roleId:t.id,error:r},"Daily diagnostic failed")}},_o),ie=await Pt(),j.info("AuditManager started"))}function fn(){F!==null&&(clearInterval(F),F=null),ie!==null&&(ie(),ie=null),j.info("AuditManager stopped")}function gn(e){re(e)}async function hn(){let e=N(),t=ue(void 0,1e3),i=Date.now()-1440*60*1e3,s=At(),n=s.filter(c=>c.timestamp>=i).length,o=t.map(c=>{let d=s.filter(l=>l.roleId===c.id),u=d[d.length-1];return{roleId:c.id,roleName:c.name,sandboxed:e.platform!=="none",violationCount:Ct(c.id),lastViolation:u?.timestamp}}),a=await et();return{platform:e.platform,available:a,violationCount24h:n,rolePostures:o}}export{X as a,rt as b,mt as c,ft as d,Xo as e,Zo as f,ke as g,tr as h,or as i,pn as j,mn as k,fn as l,gn as m,hn as n,vt as o};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as s,d as l}from"./chunk-
|
|
1
|
+
import{b as s,d as l}from"./chunk-JAS3TUZX.js";l();function o(e){let n={type:e.trigger_type,cron:e.trigger_type==="once"?void 0:e.trigger_cron??void 0,event:e.trigger_event??void 0,runAt:e.trigger_type==="once"?e.trigger_cron??void 0:void 0};return{id:e.id,name:e.name,description:e.description??void 0,trigger:n,steps:JSON.parse(e.steps),rolePreference:e.role_preference??void 0,config:e.config?JSON.parse(e.config):void 0,tags:e.tags?JSON.parse(e.tags):void 0,enabled:e.enabled===1,createdAt:e.created_at,updatedAt:e.updated_at??void 0,sourceSessionId:e.source_session_id??void 0,deliverTo:e.deliver_to?JSON.parse(e.deliver_to):void 0,reportTo:e.report_to?JSON.parse(e.report_to):void 0,goalIds:e.goal_ids?JSON.parse(e.goal_ids):void 0}}function u(e){s().prepare(`
|
|
2
2
|
INSERT INTO task_templates (id, name, description, trigger_type, trigger_cron,
|
|
3
3
|
trigger_event, steps, role_preference, config, tags, enabled, created_at, updated_at,
|
|
4
4
|
source_session_id, deliver_to, report_to, goal_ids)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as T,j as $}from"./chunk-QWCRZDZS.js";import{e as R,i as x}from"./chunk-GBTG5B5R.js";import{c as J,e as E}from"./chunk-FCV2DPZQ.js";var F={};E(F,{getGlobalEnabledState:()=>k,getInstalledPlugin:()=>N,getPluginManifest:()=>j,listInstalledPlugins:()=>v,listMarketplaceSources:()=>L,resolvePluginPaths:()=>A,scanDirectoryConfig:()=>w});import{existsSync as m,readFileSync as y,readdirSync as I}from"fs";import{join as u}from"path";import M from"os";function h(n){try{if(!m(n))return null;let t=y(n,"utf-8");return JSON.parse(t)}catch{return null}}function k(){return h(O())?.enabledPlugins??{}}function j(n){let t=n;function o(e,s){let l={};try{if(!m(e))return l;let c=y(e,"utf-8").replace(/^```yaml\r?\n/,"").replace(/^```\r?\n/,"");for(let d of s){let r=new RegExp(`^${d}:\\s*(.+)$`,"m"),g=c.match(r);g&&(l[d]=g[1].trim())}}catch{}return l}try{let e={name:"",skills:[],agents:[],mcpServers:[],hooks:[],lspServers:[]},s=u(t,".claude-plugin","plugin.json");if(m(s))try{let r=JSON.parse(y(s,"utf-8"));e.name=r.name??"",e.version=r.version,e.description=r.description,Array.isArray(r.lspServers)&&(e.lspServers=r.lspServers),Array.isArray(r.mcpServers)&&(e.mcpServers=r.mcpServers),Array.isArray(r.hooks)&&(e.hooks=r.hooks)}catch{}let l=u(t,"skills");if(m(l)){let r=I(l,{withFileTypes:!0});for(let g of r){if(!g.isDirectory()&&!g.isSymbolicLink())continue;let p=u(l,g.name,"SKILL.md"),i=o(p,["name","description"]);i.name&&e.skills.push({name:i.name,description:i.description??""})}}let a=u(t,"agents");if(m(a)){let r=I(a,{withFileTypes:!0});for(let g of r){if(!g.isFile()||!g.name.endsWith(".md"))continue;let p=o(u(a,g.name),["name","description"]);p.name&&e.agents.push({name:p.name,description:p.description??""})}}let c=u(t,".mcp.json");if(m(c))try{let r=JSON.parse(y(c,"utf-8"));r.mcpServers&&typeof r.mcpServers=="object"&&(e.mcpServers=Object.keys(r.mcpServers))}catch{}let d=u(t,"hooks","hooks.json");if(m(d))try{let r=JSON.parse(y(d,"utf-8"));Array.isArray(r)&&(e.hooks=r.map(g=>typeof g=="object"&&g!==null&&"event"in g?String(g.event):String(g)))}catch{}return e}catch{return null}}function v(n){let t=h(S());if(!t?.plugins)return[];let o=k(),e=[];for(let[s,l]of Object.entries(t.plugins))if(!(!Array.isArray(l)||l.length===0))for(let a of l){let c=a.scope??"user";n?.scope&&c!==n.scope||n?.projectPath&&a.projectPath!==n.projectPath||e.push({id:s,name:s.split("@")[0],version:a.version??"",scope:c,projectPath:a.projectPath,installPath:a.installPath??u(P(),s),enabled:o[s]??a.enabled??!0,installedAt:a.installedAt??"",lastUpdated:a.lastUpdated??""})}return e}function N(n){let t=h(S());if(!t?.plugins?.[n])return null;let o=t.plugins[n];if(!Array.isArray(o)||o.length===0)return null;let e=o[0],s=k();return{id:n,name:n.split("@")[0],version:e.version??"",scope:e.scope??"user",projectPath:e.projectPath,installPath:e.installPath??u(P(),n),enabled:s[n]??e.enabled??!0,installedAt:e.installedAt??"",lastUpdated:e.lastUpdated??""}}function A(n){let t=h(S()),o=new Map;for(let e of n){let s=t?.plugins?.[e];Array.isArray(s)&&s.length>0&&o.set(e,s[0].installPath??u(P(),e))}return o}function L(){return h(C())?.marketplaces??[]}function w(n){let t=u(n,".claude","settings.json"),o=h(t);return{enabledPlugins:o?.enabledPlugins??{},mcpServers:o?.mcpServers??{},allowedTools:o?.allowedTools??[],disallowedTools:o?.disallowedTools??[]}}var P,S,C,O,D=J(()=>{"use strict";P=()=>u(M.homedir(),".claude","plugins"),S=()=>u(P(),"installed_plugins.json"),C=()=>u(P(),"known_marketplaces.json"),O=()=>u(M.homedir(),".claude","settings.json")});D();$();x();var _={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 z(n,t){let o=n.allowedTools??[],e=n.osCapabilities??[];if(o.length===0&&e.length===0&&Object.keys(n.mcpServers??{}).length===0&&(n.additionalDirectories?.length??0)===0&&(!t||t.plugins.length===0))return"No tool permissions";let s=new Map,l=[];for(let p of o){let i=_[p];if(i){let f=s.get(i.category)??[];f.push(i.label),s.set(i.category,f)}else l.push(p)}let a=[];for(let[p,i]of s)a.push(`${p} (${i.join(", ")})`);l.length>0&&a.push(l.join(", "));let c=a.join(" \xB7 "),d=p=>{c=c?`${c} \xB7 ${p}`:p},r=Object.keys(n.mcpServers??{});r.length>0&&d(`MCP: ${r.join(", ")}`);let g=n.additionalDirectories??[];if(g.length>0&&d(`Dirs: ${g.map(p=>p.path).join(", ")}`),e.length>0){let p=e.map(i=>{let f=R(i.id);return i.id==="automation"&&i.targets?.length?`${f.label} (${i.targets.join(", ")})`:f.label});d(`OS: ${p.join(", ")}`)}if(t&&t.plugins.length>0){let p=t.plugins.map(i=>{let f=[];return i.skills.length>0&&f.push(`skills: ${i.skills.map(b=>b.name).join(", ")}`),i.agents.length>0&&f.push(`agents: ${i.agents.map(b=>b.name).join(", ")}`),f.length>0?`${i.name} (${f.join("; ")})`:i.name});d(`Plugins: ${p.join(", ")}`)}return c}function W(n){let t=[],o=n.additionalDirectories??[];for(let e of o){if(!e.inheritPlugins&&!e.inheritMcp)continue;let s=w(e.path),l=Object.entries(s.enabledPlugins).filter(([,c])=>c).map(([c])=>c),a=A(l);for(let[,c]of a)t.includes(c)||t.push(c)}try{let e=T(n.name),s=v({scope:"project",projectPath:e});for(let l of s)l.installPath&&!t.includes(l.installPath)&&t.push(l.installPath)}catch{}return t}function Q(n){let t=W(n),o=[];for(let e of t){let s=j(e);s&&o.push({name:s.name||e.split("/").pop()||"unknown",description:s.description,skills:s.skills,agents:s.agents,mcpServers:s.mcpServers,hooks:s.hooks})}return{plugins:o}}export{k as a,j as b,v as c,N as d,L as e,w as f,F as g,D as h,z as i,W as j,Q as k};
|