agentix-cli 0.142.0 → 0.143.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/{App-VHAMAS4I.js → App-UTDCBFZI.js} +2 -2
- package/dist/{ChatApp-Y7HOL45K.js → ChatApp-7P22XAL2.js} +2 -2
- package/dist/{absorb-eval-VHACXZ3H.js → absorb-eval-EGO6JJOV.js} +2 -2
- package/dist/{agent-M7ID5U3U.js → agent-AI6LNZV2.js} +2 -2
- package/dist/{board-dashboard-VHUZMYOV.js → board-dashboard-ZKN5Y3GJ.js} +320 -268
- package/dist/board-dashboard-ZKN5Y3GJ.js.map +1 -0
- package/dist/{chunk-5SEUBOUH.js → chunk-3WBOWXAN.js} +2 -2
- package/dist/{chunk-JH6C2Y5D.js → chunk-5BXAKMYK.js} +2 -2
- package/dist/{chunk-GPCBOXZM.js → chunk-6CTQPGBR.js} +2 -2
- package/dist/{chunk-EMA67BJ5.js → chunk-7H6HDN3K.js} +2 -2
- package/dist/{chunk-3E4AEZ2J.js → chunk-AJUWIBLV.js} +2 -2
- package/dist/{chunk-WEHEI3JO.js → chunk-DKLVB5L6.js} +5 -5
- package/dist/{chunk-WEHEI3JO.js.map → chunk-DKLVB5L6.js.map} +1 -1
- package/dist/{chunk-7H7LUBPC.js → chunk-ERG5OUKH.js} +2 -2
- package/dist/{chunk-UF4OTZ7D.js → chunk-GB4YT5IG.js} +270 -269
- package/dist/chunk-GB4YT5IG.js.map +1 -0
- package/dist/{chunk-KEBTFUOZ.js → chunk-HPQ3AAG3.js} +2 -2
- package/dist/{chunk-NFI4BCCO.js → chunk-IABJLTZN.js} +2 -2
- package/dist/chunk-K22XMF6M.js +62 -0
- package/dist/chunk-K22XMF6M.js.map +1 -0
- package/dist/{chunk-ZWL44UJS.js → chunk-L4RCA3OC.js} +2 -2
- package/dist/{chunk-QTS7MHIA.js → chunk-MFUN3ZS3.js} +2 -2
- package/dist/{chunk-SLJFY2AQ.js → chunk-N2HLL25P.js} +2 -2
- package/dist/{chunk-TFNBUHRW.js → chunk-NYWIN4BW.js} +2 -2
- package/dist/{chunk-25XO6P7W.js → chunk-O2CYERSX.js} +2 -2
- package/dist/{chunk-2TLOZN7P.js → chunk-OMO7UTWW.js} +2 -2
- package/dist/{chunk-S6QUFAHD.js → chunk-PYI7ZAU3.js} +2 -2
- package/dist/{chunk-S6QUFAHD.js.map → chunk-PYI7ZAU3.js.map} +1 -1
- package/dist/{chunk-7Y3FEIX7.js → chunk-QVPBSV5Z.js} +2 -2
- package/dist/{chunk-B5744ATM.js → chunk-RB5W3FVO.js} +2 -2
- package/dist/{chunk-S3LWGPNZ.js → chunk-SDSSRNSU.js} +3 -3
- package/dist/{chunk-3NKCOZQO.js → chunk-THWDSPX4.js} +2 -2
- package/dist/{chunk-6YPJVGYF.js → chunk-WY5ZOEOE.js} +2 -2
- package/dist/{chunk-MLLMBE2W.js → chunk-XWHD2Z3Z.js} +2 -2
- package/dist/{chunk-6PJKKLKV.js → chunk-YVNGPYXN.js} +52 -52
- package/dist/chunk-YVNGPYXN.js.map +1 -0
- package/dist/{chunk-IFUN332M.js → chunk-YYPTXXCJ.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/{client-ISQF24N5.js → client-E66ELJK7.js} +2 -2
- package/dist/{config-Z64VWERV.js → config-3C3Z7VKG.js} +2 -2
- package/dist/{config-mutate-YZ3IH6CJ.js → config-mutate-QBDKJNHA.js} +2 -2
- package/dist/config-mutator-ZI3SQIUN.js +2 -0
- package/dist/{contributions-FQGIRD44.js → contributions-L5XZJ3DP.js} +2 -2
- package/dist/{doctor-FMW2SSCN.js → doctor-3ZUFSE6R.js} +2 -2
- package/dist/{follow-up-tool-I7PPM2R5.js → follow-up-tool-6OCQUSC3.js} +2 -2
- package/dist/{hub-Z3X4LWMI.js → hub-MOQRSVCQ.js} +2 -2
- package/dist/index.d.ts +169 -55
- package/dist/index.js +1 -1
- package/dist/{program-I7WCAMBP.js → program-AR6F763U.js} +218 -216
- package/dist/program-AR6F763U.js.map +1 -0
- package/dist/{promote-7YUBVKRC.js → promote-ZGJEPCBE.js} +2 -2
- package/dist/{query-TMALX5BE.js → query-JLTHESIZ.js} +2 -2
- package/dist/{query-settings-3PEV5GIH.js → query-settings-GMEL3EKR.js} +2 -2
- package/dist/{registry-6ZIBMOZQ.js → registry-MFD3XJBR.js} +2 -2
- package/dist/{request-planner-GLNHHQXA.js → request-planner-4ORFYSAT.js} +2 -2
- package/dist/{review-candidates-DJXNTOG6.js → review-candidates-77NDFTGM.js} +2 -2
- package/dist/{routing-YWP2AF56.js → routing-3FL3KYPJ.js} +2 -2
- package/dist/schedule-tool-5KJMXBRZ.js +2 -0
- package/dist/{scheduler-HK362U53.js → scheduler-QLL7ZHYW.js} +2 -2
- package/dist/{seat-4PPUZXFN.js → seat-RBKONP63.js} +2 -2
- package/dist/{select-ULCUVM7N.js → select-MOUDR6PQ.js} +2 -2
- package/dist/{set-enabled-G4PLW5WK.js → set-enabled-JKYF3QIA.js} +2 -2
- package/dist/tool-C4JNMTEF.js +6 -0
- package/dist/tool-C4JNMTEF.js.map +1 -0
- package/dist/{tool-KGOC2NUZ.js → tool-Y3ZTSZGE.js} +2 -2
- package/dist/{wiki-32G6TGCI.js → wiki-3FSSLQAE.js} +2 -2
- package/dist/wiki-enrich-HQWXZRID.js +2 -0
- package/package.json +1 -1
- package/dist/board-dashboard-VHUZMYOV.js.map +0 -1
- package/dist/chunk-6PJKKLKV.js.map +0 -1
- package/dist/chunk-JYPXNH4C.js +0 -54
- package/dist/chunk-JYPXNH4C.js.map +0 -1
- package/dist/chunk-UF4OTZ7D.js.map +0 -1
- package/dist/config-mutator-3HTNXOPU.js +0 -2
- package/dist/program-I7WCAMBP.js.map +0 -1
- package/dist/schedule-tool-4O4XWGVA.js +0 -2
- package/dist/tool-CBDT7TAG.js +0 -6
- package/dist/tool-CBDT7TAG.js.map +0 -1
- package/dist/wiki-enrich-XBRY4ZRD.js +0 -2
- /package/dist/{App-VHAMAS4I.js.map → App-UTDCBFZI.js.map} +0 -0
- /package/dist/{ChatApp-Y7HOL45K.js.map → ChatApp-7P22XAL2.js.map} +0 -0
- /package/dist/{absorb-eval-VHACXZ3H.js.map → absorb-eval-EGO6JJOV.js.map} +0 -0
- /package/dist/{agent-M7ID5U3U.js.map → agent-AI6LNZV2.js.map} +0 -0
- /package/dist/{chunk-5SEUBOUH.js.map → chunk-3WBOWXAN.js.map} +0 -0
- /package/dist/{chunk-JH6C2Y5D.js.map → chunk-5BXAKMYK.js.map} +0 -0
- /package/dist/{chunk-GPCBOXZM.js.map → chunk-6CTQPGBR.js.map} +0 -0
- /package/dist/{chunk-EMA67BJ5.js.map → chunk-7H6HDN3K.js.map} +0 -0
- /package/dist/{chunk-3E4AEZ2J.js.map → chunk-AJUWIBLV.js.map} +0 -0
- /package/dist/{chunk-7H7LUBPC.js.map → chunk-ERG5OUKH.js.map} +0 -0
- /package/dist/{chunk-KEBTFUOZ.js.map → chunk-HPQ3AAG3.js.map} +0 -0
- /package/dist/{chunk-NFI4BCCO.js.map → chunk-IABJLTZN.js.map} +0 -0
- /package/dist/{chunk-ZWL44UJS.js.map → chunk-L4RCA3OC.js.map} +0 -0
- /package/dist/{chunk-QTS7MHIA.js.map → chunk-MFUN3ZS3.js.map} +0 -0
- /package/dist/{chunk-SLJFY2AQ.js.map → chunk-N2HLL25P.js.map} +0 -0
- /package/dist/{chunk-TFNBUHRW.js.map → chunk-NYWIN4BW.js.map} +0 -0
- /package/dist/{chunk-25XO6P7W.js.map → chunk-O2CYERSX.js.map} +0 -0
- /package/dist/{chunk-2TLOZN7P.js.map → chunk-OMO7UTWW.js.map} +0 -0
- /package/dist/{chunk-7Y3FEIX7.js.map → chunk-QVPBSV5Z.js.map} +0 -0
- /package/dist/{chunk-B5744ATM.js.map → chunk-RB5W3FVO.js.map} +0 -0
- /package/dist/{chunk-S3LWGPNZ.js.map → chunk-SDSSRNSU.js.map} +0 -0
- /package/dist/{chunk-3NKCOZQO.js.map → chunk-THWDSPX4.js.map} +0 -0
- /package/dist/{chunk-6YPJVGYF.js.map → chunk-WY5ZOEOE.js.map} +0 -0
- /package/dist/{chunk-MLLMBE2W.js.map → chunk-XWHD2Z3Z.js.map} +0 -0
- /package/dist/{chunk-IFUN332M.js.map → chunk-YYPTXXCJ.js.map} +0 -0
- /package/dist/{client-ISQF24N5.js.map → client-E66ELJK7.js.map} +0 -0
- /package/dist/{config-Z64VWERV.js.map → config-3C3Z7VKG.js.map} +0 -0
- /package/dist/{config-mutate-YZ3IH6CJ.js.map → config-mutate-QBDKJNHA.js.map} +0 -0
- /package/dist/{config-mutator-3HTNXOPU.js.map → config-mutator-ZI3SQIUN.js.map} +0 -0
- /package/dist/{contributions-FQGIRD44.js.map → contributions-L5XZJ3DP.js.map} +0 -0
- /package/dist/{doctor-FMW2SSCN.js.map → doctor-3ZUFSE6R.js.map} +0 -0
- /package/dist/{follow-up-tool-I7PPM2R5.js.map → follow-up-tool-6OCQUSC3.js.map} +0 -0
- /package/dist/{hub-Z3X4LWMI.js.map → hub-MOQRSVCQ.js.map} +0 -0
- /package/dist/{promote-7YUBVKRC.js.map → promote-ZGJEPCBE.js.map} +0 -0
- /package/dist/{query-TMALX5BE.js.map → query-JLTHESIZ.js.map} +0 -0
- /package/dist/{query-settings-3PEV5GIH.js.map → query-settings-GMEL3EKR.js.map} +0 -0
- /package/dist/{registry-6ZIBMOZQ.js.map → registry-MFD3XJBR.js.map} +0 -0
- /package/dist/{request-planner-GLNHHQXA.js.map → request-planner-4ORFYSAT.js.map} +0 -0
- /package/dist/{review-candidates-DJXNTOG6.js.map → review-candidates-77NDFTGM.js.map} +0 -0
- /package/dist/{routing-YWP2AF56.js.map → routing-3FL3KYPJ.js.map} +0 -0
- /package/dist/{schedule-tool-4O4XWGVA.js.map → schedule-tool-5KJMXBRZ.js.map} +0 -0
- /package/dist/{scheduler-HK362U53.js.map → scheduler-QLL7ZHYW.js.map} +0 -0
- /package/dist/{seat-4PPUZXFN.js.map → seat-RBKONP63.js.map} +0 -0
- /package/dist/{select-ULCUVM7N.js.map → select-MOUDR6PQ.js.map} +0 -0
- /package/dist/{set-enabled-G4PLW5WK.js.map → set-enabled-JKYF3QIA.js.map} +0 -0
- /package/dist/{tool-KGOC2NUZ.js.map → tool-Y3ZTSZGE.js.map} +0 -0
- /package/dist/{wiki-32G6TGCI.js.map → wiki-3FSSLQAE.js.map} +0 -0
- /package/dist/{wiki-enrich-XBRY4ZRD.js.map → wiki-enrich-HQWXZRID.js.map} +0 -0
package/dist/chunk-JYPXNH4C.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import{b as H,d as z,h as dt}from"./chunk-BRK6M6LA.js";import{l as W,m as K,n as ct}from"./chunk-UIBUZ2N3.js";import{a as U,e as ut}from"./chunk-2QNT5JDS.js";import{a as f,b as lt}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var mt,ft,gt,pt,bt,ht,xt,yt,wt,X,Z=f(()=>{"use strict";mt=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),ft=l.object({days:l.array(mt).default(["mon","tue","wed","thu","fri"]),start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/),lunch:l.object({start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/)}).optional()}),gt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),pt=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:ft,utilizationTarget:l.number().min(0).max(1).default(.8)}),bt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),ht=l.discriminatedUnion("type",[l.object({type:l.literal("backlog"),path:l.string().default(".agentx/backlog.md")}),l.object({type:l.literal("gitlab"),projects:l.array(l.string()).default([])}),l.object({type:l.literal("wiki"),path:l.string(),glob:l.string().default("**/*.md")})]),xt=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),yt=l.object({channel:l.string().optional(),chatId:l.string().optional(),username:l.string().optional(),senderId:l.string().optional(),client:l.string(),project:l.string().optional(),displayName:l.string().optional()}),wt=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),X=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:bt,workSource:ht,roles:l.record(l.string(),gt).default({}),orgChart:l.record(l.string(),pt).default({}),projects:l.array(xt).default([]),contactMap:l.array(yt).default([]),clients:l.record(l.string(),wt).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as u}from"zod";function Qn(r,t){let n=new Set(r.labels||[]);if(r.state==="closed"){let o=t.find(i=>i.kind==="closed");if(o)return o.id}for(let o of t)if(o.kind==="scoped-label"&&o.scopedLabel&&n.has(o.scopedLabel))return o.id;for(let o of t)if(o.kind==="label"&&o.mapsToLabel&&n.has(o.mapsToLabel))return o.id;let a=t.find(o=>o.kind==="open-backlog");if(a){let o=a.scopedPrefix+"::";return[...n].some(s=>s.startsWith(o))?null:a.id}return t[0]?.id??null}function er(r,t){let n=[],a=[],o=!1,i=!1;return t.kind==="scoped-label"&&t.scopedLabel?n.push(t.scopedLabel):t.kind==="label"&&t.mapsToLabel?n.push(t.mapsToLabel):t.kind==="closed"&&(o=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?a.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?a.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(i=!0)),{addLabels:n.length?n:void 0,removeLabels:a.length?a:void 0,closeIssue:o||void 0,reopen:i||void 0}}var St,kt,_t,Et,vt,Tt,V,Rt,G,Y=f(()=>{"use strict";St=u.object({name:u.string(),color:u.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:u.string().optional()}),kt=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:u.string(),kind:u.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:u.string().optional(),scopedLabel:u.string().optional(),scopedPrefix:u.string().default("Status"),accent:u.string().optional()}),_t=u.object({enabled:u.boolean().default(!0),staleDoingMinutes:u.number().int().min(1).default(45),respectLunchBreak:u.boolean().default(!0),respectSchedule:u.boolean().default(!0),action:u.enum(["badge","notify"]).default("badge")}),Et=u.discriminatedUnion("type",[u.object({type:u.literal("gitlab"),projects:u.array(u.string()).min(1)})]),vt=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],Tt=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:u.string(),source:Et,primaryToolLabel:u.string().optional(),labels:u.array(St).default([]),columns:u.array(kt).min(1).default(vt),timeRangeDays:u.number().int().min(1).max(365).default(30),closedWindowDays:u.number().int().min(1).max(365).default(30),reconciliation:_t.default({})}),V=u.array(Tt).default([]),Rt=u.object({name:u.string(),url:u.string(),dashboardUrl:u.string().optional(),token:u.string().optional(),dashboardToken:u.string().optional()}),G=u.object({enabled:u.boolean().default(!1),port:u.number().int().default(4202),bind:u.string().default("127.0.0.1"),token:u.string().optional(),daemonUrl:u.string().default("http://localhost:18800"),daemons:u.array(Rt).default([]),draftAgent:u.string().optional()}).default({})});function Lt(r){let t=String(r??"").trim().toLowerCase();if(!t)return{ok:!1,error:"is empty"};let n=t.split("+").map(i=>i.trim());if(n.some(i=>!i))return{ok:!1,error:`"${r}" has an empty part; write it like opt+space`};let a=jt[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=At[i];if(!s)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(o.has(s))return{ok:!1,error:`"${r}" names ${s} twice`};o.add(s)}return Ot(a)?!J(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...It.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function Q(r){let t=Lt(r);return t.ok?void 0:t.error}function nr(r){let t={ctrl:"\u2303",opt:"\u2325",shift:"\u21E7",cmd:"\u2318"},n={space:"Space",period:".",comma:",",slash:"/",semicolon:";",quote:"'",minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",grave:"`",return:"Return",tab:"Tab"},a=r.split("+"),o=a.pop()??"";return a.map(i=>t[i]??i).join("")+(n[o]??o.toUpperCase())}var At,It,Ct,jt,J,Ot,E,ee=f(()=>{"use strict";At={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},It=["ctrl","opt","shift","cmd"],Ct=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],jt={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},J=r=>/^f([1-9]|1[0-9]|20)$/.test(r),Ot=r=>/^[a-z0-9]$/.test(r)||Ct.includes(r)||J(r);E={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function re(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(g=>parseInt(g,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),d=i-s;return d<.04?null:((i===n?(a-o)/d%6:i===a?(o-n)/d+2:(n-a)/d+4)*60+360)%360}function Nt(r){let t=re(r);if(t===null)return S.find(o=>o.id==="lagoon");let n=S[0],a=360;for(let o of S){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function ar(r,t=v){let n=s=>S.find(d=>d.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&re(o)!==null?Nt(o):n(t)??n(v),set:!1}}var S,te,ne,N,v,ae=f(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],te=["orb","character"],ne=["off","rarely","sometimes","often"],N=S.map(r=>r.id);v="lagoon"});function oe(r){let t=(r.match(/[-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])$t.has(i)&&a++,Dt.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:Pt.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var $t,Dt,Pt,ie=f(()=>{"use strict";$t=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),Dt=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),Pt=/[éèêëàâçùûîïôœ]/});function lr(r,t=$){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+qt[oe(a)??"en"]}return n}var $,qt,se=f(()=>{"use strict";ie();$=500,qt={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});function cr(r,t=D){let n=new Set(t.map(le)),a=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,s)=>n.has(le(i??s))?"":o);return!/[\p{L}\p{N}]/u.test(a)}var D,dr,le,ue=f(()=>{"use strict";D=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],dr="I didn't catch that.",le=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Mt}from"crypto";function zt(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function gr(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var T,Ft,Bt,Ut,Ht,de,ce=f(()=>{"use strict";T={enabled:!0,defaultSeconds:120,maxSeconds:1800},Ft=80,Bt=/^[a-f0-9]{24}$/,Ut=25e3,Ht=2e3;de=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??zt}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...T,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(it,st)=>({ok:!1,reason:it,error:st,view:this.view()});if(!n.enabled)return a("off","The floor is off on this computer (voice.floor.enabled)");let o=String(t.holder??"").replace(/\s+/g," ").trim().slice(0,Ft),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,d=t.id??Mt(12).toString("hex");if(!Bt.test(d))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let m=this.current;if(m)return a("held",`The floor is held by ${m.holder}`);let g=this.deps.busy?.();if(g)return a("busy",`The floor is taken by ${g}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let x=this.now(),_={id:d,holder:o,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:x,expiresAt:x+i*1e3};return this.hold=_,this.ended=null,this.arm(),this.changed(),{ok:!0,id:_.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let a=this.settings,o=n??Math.min(a.defaultSeconds,a.maxSeconds);return!Number.isFinite(o)||o<=0||o>a.maxSeconds?null:(this.hold.expiresAt=this.now()+o*1e3,this.arm(),this.changed(),this.view())}release(t){return this.holds(t)?(this.end("released"),!0):!1}revoke(){return this.current?(this.end("owner"),!0):!1}next(t,n=Ut,a){return t!==this.view().seq?Promise.resolve(this.view()):new Promise(o=>{let i=()=>{clearTimeout(s),this.waiters.delete(i),o(this.view())},s=setTimeout(i,n);s.unref?.(),this.waiters.add(i),a?.addEventListener("abort",i,{once:!0})})}close(){this.disarm();for(let t of[...this.waiters])t()}end(t){this.hold&&(this.hold=null,this.ended=t,this.disarm(),this.changed())}arm(){this.disarm();let t=this.hold;if(!t||(this.expiry=setTimeout(()=>{this.hold===t&&this.view()},Math.max(0,t.expiresAt-this.now())+5),this.expiry.unref?.(),t.pid===null))return;let n=t.pid;this.watch=setInterval(()=>{this.hold===t&&!this.alive(n)&&this.end("holder gone")},Ht),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as c}from"zod";var me,Wt,fe,ge=f(()=>{"use strict";me=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Wt=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:me,end:me}).optional(),autoAck:c.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),fe=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(Wt).default([])}).default({})});function Xt(r){r.exec(`
|
|
2
|
-
CREATE TABLE IF NOT EXISTS requests (
|
|
3
|
-
id TEXT PRIMARY KEY,
|
|
4
|
-
state TEXT NOT NULL,
|
|
5
|
-
channel TEXT NOT NULL,
|
|
6
|
-
chat_id TEXT NOT NULL,
|
|
7
|
-
sender TEXT,
|
|
8
|
-
agent_id TEXT NOT NULL,
|
|
9
|
-
text TEXT NOT NULL,
|
|
10
|
-
created_at INTEGER NOT NULL,
|
|
11
|
-
updated_at INTEGER NOT NULL,
|
|
12
|
-
attention_reason TEXT,
|
|
13
|
-
notified_at INTEGER,
|
|
14
|
-
question TEXT,
|
|
15
|
-
closed_at INTEGER,
|
|
16
|
-
evidence TEXT,
|
|
17
|
-
close_reason TEXT
|
|
18
|
-
);
|
|
19
|
-
CREATE INDEX IF NOT EXISTS idx_requests_state_created ON requests(state, created_at);
|
|
20
|
-
CREATE INDEX IF NOT EXISTS idx_requests_chat ON requests(agent_id, channel, chat_id, created_at);
|
|
21
|
-
CREATE TABLE IF NOT EXISTS request_links (
|
|
22
|
-
request_id TEXT NOT NULL,
|
|
23
|
-
kind TEXT NOT NULL,
|
|
24
|
-
ref TEXT NOT NULL,
|
|
25
|
-
at INTEGER NOT NULL,
|
|
26
|
-
PRIMARY KEY (kind, ref),
|
|
27
|
-
FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
|
|
28
|
-
);
|
|
29
|
-
CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
|
|
30
|
-
`),K(r,"requests",W);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"],["home_kind","TEXT"],["home_link","TEXT"]])if(!t.some(o=>o.name===n))try{r.exec(`ALTER TABLE requests ADD COLUMN ${n} ${a}`)}catch(o){if(!/duplicate column name/i.test(String(o?.message)))throw o}}function wr(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function b(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null,ownerNote:r.owner_note??null,noteSaid:!!r.note_said,askedAgent:r.asked_agent??null,home:r.home_kind&&r.home_link?{kind:r.home_kind,link:r.home_link}:null}}var y,p,yr,Kt,P,q,h,pe,be=f(()=>{"use strict";ct();y=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],yr=["issue","idea","approval","erp","card"],Kt=500,P=4e3,q=500;h=r=>Array(r).fill("?").join(","),pe=class{constructor(t){this.db=t;Xt(t),t.pragma("foreign_keys = ON")}addCandidate(t){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
|
|
31
|
-
VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,P),t.now,t.now),this.link(t.id,"run",t.runId,t.now)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?b(n):null}byLink(t,n){let a=this.db.prepare("SELECT r.* FROM requests r JOIN request_links l ON l.request_id = r.id WHERE l.kind = ? AND l.ref = ?").get(t,n);return a?b(a):null}link(t,n,a,o){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(t,n,a,o)}links(t){return this.db.prepare("SELECT kind, ref, at FROM request_links WHERE request_id = ? ORDER BY at, rowid").all(t)}lastAnswer(t){try{return this.db.prepare(`SELECT t.agent_id AS agentId, t.final_response AS text, COALESCE(t.finished_at, t.started_at) AS at
|
|
32
|
-
FROM request_links l JOIN task_traces t ON t.task_id = l.ref
|
|
33
|
-
WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
|
|
34
|
-
ORDER BY t.started_at DESC LIMIT 1`).get(t)??null}catch{return null}}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,a="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
|
|
35
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n,t,...p)}waitOnOwner(t,n,a){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
|
|
36
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n.slice(0,P),t,...p)}needsAttention(t,n,a){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
|
|
37
|
-
WHERE id = ? AND state NOT IN ('needs_attention', ${h(p.length)})`).run(a,n.replace(/\s+/g," ").trim().slice(0,q),t,...p).changes>0}close(t,n,a,o){let i=a.trim();if(!i)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, evidence = ?, close_reason = ?
|
|
38
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(n,o,o,n==="done"?i.slice(0,q):null,n==="done"?null:i.slice(0,q),t,...p).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(y.length)}) ORDER BY created_at, rowid`).all(...y).map(b)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(t.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...t,n).map(b)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(b)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(b)}listClosedSince(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(p.length)}) AND closed_at >= ? ORDER BY closed_at DESC, rowid DESC LIMIT ?`).all(...p,t,n).map(b)}listSince(t,n=500){return this.db.prepare("SELECT * FROM requests WHERE state != 'candidate' AND created_at >= ? ORDER BY created_at, rowid LIMIT ?").all(t,n).map(b)}setHome(t,n,a){this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ?, updated_at = ? WHERE id = ?").run(n.kind,n.link.slice(0,Kt),a,t)}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
|
|
39
|
-
WHERE id = ? AND state = 'needs_attention'`).run(n,n,t).changes>0}handOff(t,n,a,o){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
|
|
40
|
-
question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
|
|
41
|
-
WHERE id = ? AND state IN (${h(y.length)})`).run(n,o,o,a.trim().slice(0,P)||null,t,...y).changes>0}setNoteSaid(t,n,a){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${a?" AND pickup_at IS NULL":""}`).run(a?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(b).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${h(p.length)}) AND closed_at < ?`).run(...p,t).changes}}});function _r(r){return Object.assign({channel:ye,chatId:r,sender:"operator"},{[we]:!0})}function Er(r){return!!r&&r[we]===!0}function Gt(r,t,n,a=!1){let o=R(t);if(r.channels.length&&!r.channels.map(R).includes(o))return!1;if(A.has(o))return a&&!Zt.has((n?.name??"").toLowerCase());let i=Vt.has(o)?n?.username:n?.id,s=i?he(o,i):"";return s?r.from.some(d=>{let m=d.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&he(o,m.slice(g+1))===s}):!1}function vr(r){if(!r)return;let t=a=>typeof a=="string"&&a?a.slice(0,120):void 0,n={name:t(r.sender),id:t(r.senderId),username:t(r.senderUsername)};return n.name||n.id||n.username?n:void 0}function Yt(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var ye,we,A,Zt,R,Vt,he,w,k,xe,Se=f(()=>{"use strict";be();ye="requests",we=Symbol("requests.pickup");A=new Set(["voice","app","dashboard","webrtc"]),Zt=new Set(["camera"]),R=r=>r.toLowerCase().split("@")[0],Vt=new Set(["github","gitlab"]),he=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");w=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},k=(r,t,n)=>`${r}\0${t}\0${n}`,xe=class{constructor(t,n,a,o=Date.now){this.store=t;this.settings=n;this.log=a;this.now=o}live=new Map;guard(t,n){try{n()}catch(a){this.log(`[requests] ${t} failed: ${a?.message??a}`)}}isListedOwner(t){let n=R(t.channel),a=this.settings().channels;return a.length&&!a.map(R).includes(n)?!1:t.person?.role==="owner"&&!A.has(n)}liveRequestId(t,n,a){return this.live.get(k(t,n,a))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),a=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,o=k(t.agentId,t.channel,t.chatId);if(a){this.store.link(a.id,"run",t.taskId,n),a.state==="candidate"?this.store.touch(a.id,n):this.store.progress(a.id,n),this.live.set(o,{requestId:a.id,runId:t.taskId});return}let i=t.pickup&&t.channel===ye?this.store.get(t.chatId):null;if(i&&i.agentId===t.agentId){this.store.link(i.id,"run",t.taskId,n),this.store.touch(i.id,n),this.live.set(o,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Gt(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(o,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=k(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let a=this.store.byLink("run",t.taskId);if(!a)return;let o=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Yt(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${w(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(k(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(o.id,`The work handed to ${s} ${d}: ${w(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${w(a)}). It said: ${w(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(k(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${w(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!y.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${w(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Jt,timingSafeEqual as _e}from"crypto";import{chmodSync as Qt,existsSync as en,mkdirSync as tn,readFileSync as nn,writeFileSync as rn}from"fs";import{networkInterfaces as an}from"os";import{dirname as on,resolve as sn}from"path";function jr(r){return Object.assign(r,{[Ee]:!0})}function ve(r){return!!r&&r[Ee]===!0}function un(r=process.cwd()){return sn(r,".agentx","operator.key")}function Or(r=process.cwd(),t={}){let n=un(r);try{if(en(n)){let o=nn(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=Jt(32).toString("hex");return tn(on(n),{recursive:!0}),rn(n,a+`
|
|
42
|
-
`,{mode:384}),Qt(n,384),a}catch{return null}}function dn(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let a=Buffer.from(r),o=Buffer.from(n.trim());return a.length===o.length&&_e(a,o)}function mn(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?dn(n,t[ln]):!1}function fn(r,t){let n=r[cn];if((Array.isArray(n)?n[0]:n)!=="1")return!1;let a=r.authorization,o=(Array.isArray(a)?a[0]:a)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let s=Buffer.from(i);for(let d of t){if(!d)continue;let m=Buffer.from(d);if(m.length===s.length&&_e(m,s))return!0}return!1}function gn(r,t=pn()){let n=ke(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let a of t)if(ke(a)===n)return!0;return!1}function pn(){return Object.values(an()).flatMap(r=>(r??[]).map(t=>t.address))}function Lr(r,t,n){if(mn(r,t.headers,n.key,n.operatorChannels))return!0;if(!r||typeof r!="object")return!1;let a=String(r.channel??"").toLowerCase().split("@")[0];return!n.operatorChannels.has(a)||gn(t.remoteAddress,n.ownAddresses)?!1:fn(t.headers,n.peerTokens)}var ln,Ee,cn,ke,Te=f(()=>{"use strict";ln="x-agentx-operator",Ee=Symbol("requests.operator");cn="x-agentx-operator-vouch";ke=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function Mr(r,t){return r.find(n=>n.id===t)?.name??(t===I?"Owner":t)}function Re(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function Ae(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=M(r.slice(0,t).trim()),a=Re(n,r.slice(t+1));return a?{channel:n,value:a}:null}function Ie(r){let t=new Set,n=new Map;for(let a of r){if(t.has(a.id))return`person "${a.id}" is listed twice`;if(t.add(a.id),a.id===I&&a.role!=="owner")return`the id "${I}" is kept for a person with the owner role`;for(let o of a.identities){let i=Ae(o);if(!i)return`identity "${o}" of "${a.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,d=n.get(s);if(d&&d!==a.id)return`identity "${o}" belongs to both "${d}" and "${a.id}"`;n.set(s,a.id)}}return null}function bn(r,t,n){let a=M(t),i=(a==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>Re(a,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(d=>{let m=Ae(d);return!!m&&m.channel===a&&i.includes(m.value)}))??null:null}function hn(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:I,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function Ce(r,t){let n=H(t);if(n)return n.person?{id:n.person}:null;if(!t||z(t)!=="human")return null;let a=String(t.channel??"");if(A.has(M(a)))return ve(t)?hn(r):null;let o=s=>typeof s=="string"?s:void 0,i=bn(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function xn(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Fr(r,t,n){let a=Ce(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||xn(o,t))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${t}. Ask the owner if you need ${t}.`}}function Br(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function Ur(r,t){let n=Ce(r,t);if(!n)return null;let a=r.find(s=>s.id===n.id);if(!a||a.role==="owner")return null;let o=a.deny?.tools??[],i=a.deny?.skills??[];return!o.length&&!i.length?null:{personId:a.id,name:a.name,tools:[...o],skills:[...i]}}var qr,I,M,je=f(()=>{"use strict";dt();Se();Te();qr=["owner","member","client","guest"],I="owner";M=r=>r.toLowerCase().split("@")[0]});function Wr(r){return typeof r=="string"&&wn.includes(r)}function Oe(r){let t=new Set(yn);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var yn,wn,zr,Le=f(()=>{"use strict";yn=["agentx_generate","agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_channel_reply","agentx_channel_label","agentx_send","agentx_send_agent","agentx_recent","agentx_events","agentx_signal","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],wn=["read","full"],zr=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_health","agentx_crons","agentx_wiki_query"]});var Zn={};lt(Zn,{INTEGRATION_KINDS:()=>An,WIKI_CONTRIBUTE_JOB:()=>tt,WIKI_CONTRIBUTE_MERGE_JOB:()=>nt,WIKI_SUMMARIZE_JOB:()=>F,approvalsConfigSchema:()=>Qe,callsSchema:()=>We,cameraBotSchema:()=>He,daemonConfigSchema:()=>et,eventSubscriptionSchema:()=>Ue,expandEnvVars:()=>L,isCronExpression:()=>ze,loadDaemonConfig:()=>Kn,membersConfigSchema:()=>Ye,peopleConfigSchema:()=>Ge,personSchema:()=>Ve,requestStatusConfigSchema:()=>Je,requestsConfigSchema:()=>Ze,reviewGateConfigSchema:()=>Ke,validateWorkspaces:()=>Xn,watchersConfigSchema:()=>Xe,withContributionJobs:()=>rt,withSummariesJob:()=>at});import{z as e}from"zod";import{readFileSync as qe,existsSync as j}from"fs";import{resolve as O}from"path";function Sn(r){let t=O(r,".env");if(!j(t))return;let n=qe(t,"utf-8");for(let a of n.split(`
|
|
43
|
-
`)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),d=o.slice(i+1).trim();process.env[s]||(process.env[s]=d)}}function ze(r){let t=[[0,59],[0,23],[1,31],[1,12],[0,6]],n=r.trim().split(/\s+/);return n.length!==5?!1:n.every((a,o)=>a.split(",").every(i=>{let s=/^(\*|(\d+)(?:-(\d+))?)(?:\/(\d+))?$/.exec(i);if(!s)return!1;let[d,m]=t[o],g=s[2]===void 0?d:Number(s[2]),x=s[3]===void 0?g:Number(s[3]),_=s[4]===void 0?1:Number(s[4]);return g>=d&&x<=m&&g<=x&&_>=1}))}function On(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function L(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(L);if(r!==null&&typeof r=="object"){let t={};for(let[n,a]of Object.entries(r))t[n]=L(a);return t}return r}function Wn(r,t){let n=[],a=new Set;for(let o of r){let i=o.path.join("."),s=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(s&&o.message.toLowerCase().includes("required")){let d=s[1],m=`tg:${d}`;if(a.has(m))continue;a.add(m),n.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
|
|
44
|
-
Either:
|
|
45
|
-
A) Open ${t} and set channels.telegram.accounts.${d}.token to your bot token (or "\${TG_${d.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
|
|
46
|
-
B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${d}).`)}}return n}function Kn(r){let t=r?[r]:[O(process.cwd(),"agentx.json"),O(process.cwd(),".agentx/config.json")];Sn(process.cwd());let n,a;for(let d of t)if(j(d)){n=qe(d,"utf-8"),a=d;break}if(!n||!a)throw new Error(`No config found. Create agentx.json or .agentx/config.json
|
|
47
|
-
Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(d){throw new Error(`Invalid JSON in ${a}: ${d.message}`)}let i=L(o),s=et.safeParse(i);if(!s.success){let d=s.error.issues.map(x=>` ${x.path.join(".")}: ${x.message}`).join(`
|
|
48
|
-
`),m=Wn(s.error.issues,a),g=m.length?`
|
|
49
|
-
|
|
50
|
-
${m.join(`
|
|
51
|
-
|
|
52
|
-
`)}`:"";throw new Error(`Config validation failed (${a}):
|
|
53
|
-
${d}${g}`)}return at(rt(s.data))}function Xn(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!j(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=O(a.workspace,".claude");j(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${a.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=a.provider||"claude",i=r.providers[o];!["claude-code","codex-cli","opencode"].includes(a.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,a]of Object.entries(r.crons))r.agents[a.agent]||t.push(`Cron "${n}": references unknown agent "${a.agent}"`);if(r.channels.telegram.enabled)for(let[n,a]of Object.entries(r.channels.telegram.accounts))r.agents[a.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${a.agentBinding}"`);return t}function rt(r,t=ot()){let n=Object.entries(r.agents).filter(([,s])=>s.wiki?.contribute?.enabled).map(([s])=>s).sort();if(n.length===0)return r;let a=r.wiki.contributions,o=(s,d)=>B.parse({schedule:s,timezone:a.timezone,agent:n[0],command:d,timeout:3600,onError:"log"}),i={[tt]:o(a.schedule,`${t} wiki contribute --all`),[nt]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function at(r,t=ot()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=B.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${F} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[F]:o.data,...r.crons}}}function ot(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var Ne,kn,_n,En,vn,Tn,Rn,An,Me,Fe,C,Be,Ue,In,Cn,He,jn,B,$e,De,Pe,Ln,Nn,$n,Dn,Pn,qn,Mn,Fn,Bn,We,Un,Hn,zn,Ke,Xe,Ze,Ve,Ge,Ye,Je,Qe,et,tt,nt,F,Vn=f(()=>{Z();Y();ut();ee();ae();se();ue();ce();ge();je();Le();Ne=e.array(e.string().min(1)).superRefine((r,t)=>{let n=Oe(r);n.length&&t.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${n.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),kn=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),_n=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),En=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),vn=e.union([En,_n]),Tn=e.object({tokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),privateAppTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),apiKeyEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),refreshTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientIdEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientSecretEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),auth:e.literal("keyring").optional(),sessionDir:e.string().optional()}).strict(),Rn=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:Tn.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),An=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Me=e.enum(["system","elevenlabs"]),Fe=e.union([e.string(),e.record(e.string(),e.string())]),C=e.string().superRefine((r,t)=>{let n=Q(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),Be=e.object({provider:Me.optional(),system:Fe.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:C.optional()}),Ue=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),In=e.object({name:e.string(),workspace:e.string(),tier:e.enum(["claude-code","codex-cli","opencode","sdk","orchestrator"]).default("claude-code"),provider:e.string().optional(),model:e.string().optional(),systemPrompt:e.string().optional(),mentions:e.array(e.string()).default([]),intents:e.array(e.string()).default([]),maxDelegationDepth:e.number().int().min(0).max(50).default(5),mcp:e.record(e.string(),vn).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({}),notes:e.object({dir:e.string().min(1).optional()}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(Ue).default([]),integrations:e.array(Rn).default([]),voice:Be.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(N).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),Cn=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),He=e.object({frameIntervalSeconds:e.number().int().min(0).max(3600).default(0),maxSessionMinutes:e.number().int().min(1).max(240).default(10),maxFrameEdge:e.number().int().min(160).max(3840).default(1024),keepFrames:e.boolean().default(!1),streamFrameSeconds:e.number().int().min(2).max(60).default(5),streamMaxSeconds:e.number().int().min(10).max(600).default(60)}).default({}),jn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),Cn).default({}),policy:e.object({dm:e.enum(["pair","block"]).default("pair"),group:e.enum(["mention-required","all"]).default("mention-required"),allowFrom:e.array(e.string()).optional()}).default({})}).default({}),whatsapp:e.object({enabled:e.boolean().default(!1),sessionDir:e.string().default(".agentx/whatsapp-sessions"),defaultAgent:e.string().optional(),allowFrom:e.array(e.string()).optional(),routes:e.array(e.object({contact:e.string().optional(),group:e.string().optional(),agent:e.string()})).default([]),ingest:e.object({enabled:e.boolean().default(!1),mode:e.enum(["metadata-only","messages"]).default("metadata-only"),allowContacts:e.array(e.string()).default([]),allowGroups:e.array(e.string()).default([]),denyContacts:e.array(e.string()).default([]),denyGroups:e.array(e.string()).default([]),messageCap:e.number().int().min(1).max(500).default(50),historyDays:e.number().int().min(1).max(365).default(30),contactRefreshDays:e.number().int().min(1).max(90).default(7),throttle:e.object({minMsBetweenCalls:e.number().int().min(100).default(1500),maxCallsPerMinute:e.number().int().min(1).default(20),maxChatsPerSweep:e.number().int().min(1).default(25)}).default({}),retentionDays:e.number().int().min(0).default(0)}).default({})}).default({}),gitlab:e.object({enabled:e.boolean().default(!1),webhookPort:e.number().default(18810),webhookSecret:e.string().optional(),host:e.string().default("https://gitlab.com"),token:e.string().optional(),autoReplyLegacy:e.boolean().default(!0),routes:e.array(e.object({project:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),gitlabUsernames:e.array(e.string()).default([]),keywords:e.array(e.string()).default([]),token:e.string().optional(),node:e.string().optional()})).default([]),agentUsernamePrefixes:e.array(e.string().min(1)).default([])}).default({}),github:e.object({enabled:e.boolean().default(!1),autoReplyLegacy:e.boolean().default(!0),cloudSessions:e.boolean().default(!1),token:e.string().optional(),tokenFile:e.string().optional(),appId:e.number().optional(),clientId:e.string().optional(),privateKeyFile:e.string().optional(),webhookSecret:e.string().optional(),routes:e.array(e.object({repo:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),githubUsernames:e.array(e.string()).default([]),token:e.string().optional(),tokenFile:e.string().optional(),node:e.string().optional()})).default([]),issueActions:e.array(e.string().min(1)).default(["opened","reopened","assigned"]),pullRequestActions:e.array(e.string().min(1)).default(["opened","reopened","ready_for_review"]),ignoreOwnChanges:e.boolean().default(!0),debounceSeconds:e.number().min(0).max(3600).default(30)}).default({}),ntfy:e.object({enabled:e.boolean().default(!1),server:e.string().default("https://ntfy.sh"),topic:e.string().optional(),token:e.string().optional(),defaultPriority:e.number().int().min(1).max(5).default(3),defaultTitle:e.string().optional()}).default({}),push:e.object({enabled:e.boolean().default(!1),keysFile:e.string().default(".agentx/push-keys.json"),subject:e.string().regex(/^(mailto:|https:\/\/)/,"must start with mailto: or https://").optional(),relayTo:e.string().optional(),ttlSeconds:e.number().int().min(0).max(2419200).default(86400),keepRecent:e.number().int().min(0).max(1e3).default(50),allowedHosts:e.array(e.string().min(1)).default(["fcm.googleapis.com","push.services.mozilla.com","push.apple.com","notify.windows.com"])}).default({}),webrtc:e.object({enabled:e.boolean().default(!1),stunServers:e.array(e.string()).default(["stun:stun.l.google.com:19302"]),turnServers:e.array(e.object({urls:e.string(),username:e.string().optional(),credential:e.string().optional()})).default([]),allowedCallers:e.array(e.string()).default([]),ringNotify:e.array(e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()})).default([]),callUrlBase:e.string().optional(),bot:e.object({enabled:e.boolean().default(!1),defaultAgentId:e.string().optional(),whisperBackend:e.enum(["auto","mlx","openai"]).default("auto"),whisperModel:e.string().optional(),whisperLanguage:e.string().default("auto"),mlxBinary:e.string().optional(),transcriptChannel:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),maxCallMinutes:e.number().int().min(1).max(240).default(30)}).default({}),camera:e.object({width:e.number().int().min(160).max(3840).default(1280),height:e.number().int().min(120).max(2160).default(720),frameRate:e.number().int().min(1).max(60).default(15),maxSeconds:e.number().int().min(10).max(7200).default(600),voiceInput:e.boolean().default(!0),speakAnswers:e.boolean().default(!0),bot:He}).default({})}).default({})}),B=e.object({enabled:e.boolean().default(!0),schedule:e.string(),timezone:e.string().default("UTC"),agent:e.string(),prompt:e.string().default(""),command:e.string().optional(),timeout:e.number().default(600),model:e.string().optional(),maxOutputTokens:e.number().int().min(50).max(8e3).optional(),autonomy:U.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});$e=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),De=e.union([$e,e.object({repo:$e,about:e.string().max(200).optional()})]),Pe={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},Ln=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),Nn=e.object({enabled:e.boolean().default(!1),inbox:e.string().min(1).optional(),crons:e.array(e.string().min(1)).default([]),absorbAgent:e.string().min(1).optional(),maxNotesPerRun:e.number().int().min(1).max(100).default(20),maxDeferrals:e.number().int().min(1).max(20).default(3)}).refine(r=>!r.enabled||!!r.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),$n=e.object({name:e.string(),triggers:e.array(e.object({pattern:e.string(),channel:e.string().optional()})),allowedContacts:e.array(e.string()).optional(),agent:e.string(),prompt:e.string(),schedule:e.string().optional(),timezone:e.string().default("UTC"),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}),Dn=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Pn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),qn=e.object({enabled:e.boolean().default(!1),peers:e.array(Dn).default([]),inboxes:e.array(Pn).default([]),discovery:e.enum(["static","mdns"]).default("static"),healthCheck:e.object({interval:e.number().default(60),timeout:e.number().default(10)}).default({}),feed:e.object({enabled:e.boolean().default(!0),skipTypes:e.array(e.string().min(1)).default(["task:step"])}).default({}),delegation:e.object({asyncWhenHuman:e.boolean().default(!0),timeoutMinutes:e.number().int().min(1).max(240).default(30),requeueRelayOnRestart:e.boolean().default(!0)}).default({})}),Mn=e.object({enabled:e.boolean().default(!1),baseDir:e.string().default(".agentx/graph"),draftAgent:e.string().optional(),reviewAgent:e.string().optional(),autoApproveStructure:e.enum(["strict","extend-leaves","any"]).default("extend-leaves"),autoApproveConfidence:e.number().min(0).max(1).default(1),classifierModel:e.string().default("claude-haiku-4-5-20251001"),retrievalWeights:e.object({graph:e.number().min(0).default(.6),bm25:e.number().min(0).default(.4)}).default({})}).default({}),Fn=e.object({mode:e.enum(["off","shadow","active"]).default("off"),backend:e.string().optional(),model:e.string().optional(),timeoutMs:e.number().int().min(100).optional(),temperature:e.number().min(.01).default(1),explore:e.number().min(0).max(1).default(.15),holdout:e.number().min(0).max(1).optional()}).default({}),Bn=e.object({enabled:e.boolean().default(!1),dbPath:e.string().default(".agentx/decisions/decisions.sqlite"),redactState:e.boolean().default(!1),keepStateRows:e.number().int().min(0).default(2e3),defaultBackend:e.string().default("local"),backends:e.object({local:e.object({provider:e.string().default("claude-code"),model:e.string().default("claude-haiku-4-5-20251001"),structureMode:e.enum(["auto","tool","text"]).default("auto"),normalizeProbabilities:e.boolean().default(!0),nRetryMalformedStructure:e.number().int().min(0).max(3).default(1),maxStateChars:e.number().int().min(500).default(24e3)}).default({}),simpleJev:e.object({baseUrl:e.string().default("http://127.0.0.1:8000/v1"),model:e.string().optional(),apiKeyEnv:e.string().optional(),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(6e3),maxChoiceOptions:e.number().int().min(2).max(255).default(50)}).default({}),jev:e.object({baseUrl:e.string().default("https://openrouter.ai/api/alpha"),path:e.string().default("/decisions"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("OPENROUTER_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({}),typesafe:e.object({baseUrl:e.string().default("https://api.typesafe.ai/v1"),path:e.string().default("/systemone"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("TYPESAFE_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({})}).default({}),seats:e.record(e.string(),Fn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),We=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0),busy:e.object({retryMinutes:e.number().int().min(1).max(60).default(5),maxWaitMinutes:e.number().int().min(1).max(240).default(10),title:e.string().min(1).max(120).default("Call waiting: {agent}"),notice:e.string().min(1).max(200).default("AgentX Voice is busy. The call rings when it is free.")}).default({})}).default({}),Un=e.object({longTaskThreshold:e.number().default(30),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),channel:e.string().optional(),on:e.object({taskComplete:e.boolean().default(!0),taskError:e.boolean().default(!0),taskQueued:e.boolean().default(!1)}).default({}),local:e.object({banner:e.boolean().default(!0),sound:e.boolean().default(!0),soundName:e.string().regex(/^[\w -]+$/).default("Glass"),volume:e.number().min(0).max(1).default(.4),icon:e.string().optional()}).default({})}).default({}),Hn=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),zn=e.object({maxPixels:e.number().int().positive().default(12e5),timeoutMs:e.number().int().positive().default(5e3),intervalMs:e.number().int().positive().default(100),changeThreshold:e.number().min(0).max(1).default(.015),stableMs:e.number().int().nonnegative().default(400),regions:e.record(e.string().regex(/^[a-z][\w-]*$/),Hn).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),Ke=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),reviewer:e.object({agent:e.string().min(1).optional(),model:e.string().min(1).optional()}).default({}),paths:e.array(e.string().min(1)).default([]),maxCostPerReview:e.number().min(0).default(2),maxMinutes:e.number().positive().max(120).default(10),maxReviewsPerPrPerDay:e.number().int().min(0).max(100).default(6),ciWaitMinutes:e.number().min(0).max(60).default(5),maxDiffKb:e.number().int().positive().max(2048).default(256)}).default({}),Xe=e.object({enabled:e.boolean().default(!1),skipChannels:e.array(e.string().min(1)).default([]),defaultDueMinutes:e.number().positive().max(30*24*60).default(120),noBelow:e.number().min(0).max(1).default(.2),yesAt:e.number().min(0).max(1).default(.7),escalateAfterMinutes:e.number().positive().max(7*24*60).default(30),owner:e.object({channel:e.string().min(1).optional(),chatId:e.string().min(1).optional()}).default({}),retentionDays:e.number().positive().max(3650).default(30),doneSignal:e.enum(["result","explicit"]).default("result")}).default({}).refine(r=>r.noBelow<=r.yesAt,{message:"watchers.noBelow must not be above watchers.yesAt"}),Ze=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),Ve=e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]{0,39}$/,"lower-case letters, digits, - and _"),name:e.string().min(1).max(80),say:e.string().trim().min(1).max(120).optional(),role:e.enum(["owner","member","client","guest"]).default("member"),identities:e.array(e.string().regex(/^[A-Za-z][\w-]*:\S.*$/,"write it as channel:id")).default([]),agents:e.array(e.string().min(1)).default([]),deny:e.object({tools:e.array(e.string().min(1)).default([]),skills:e.array(e.string().min(1)).default([])}).strict().default({})}),Ge=e.array(Ve).default([]).superRefine((r,t)=>{let n=Ie(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Ye=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Je=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Qe=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),forwardTo:e.string().min(1).optional(),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),et=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional(),connectAttemptTimeoutMs:e.number().int().min(250).max(6e4).default(5e3)}),providers:e.record(e.string(),kn).default({}),agents:e.record(e.string(),In).default({}),wiki:e.object({contributions:e.object({schedule:e.string().default("40 22 * * *"),mergeSchedule:e.string().default("20 23 * * *"),timezone:e.string().default("UTC"),maxCostUsd:e.number().min(0).max(20).default(.5),model:e.string().default("sonnet")}).default({}),query:e.object({shared:e.boolean().default(!0),method:e.enum(["auto","summaries","catalog"]).default("auto"),candidates:e.number().int().min(1).max(50).default(12),sharedCandidates:e.number().int().min(0).max(50).default(4),notes:e.object({enabled:e.boolean().default(!1),types:e.array(e.string().min(1)).default(["project","reference"]),candidates:e.number().int().min(1).max(50).default(4)}).default({}),maxPages:e.number().int().min(1).max(10).default(3),pageChars:e.number().int().min(200).max(4e4).default(4e3),linkedPages:e.number().int().min(0).max(10).default(0),linkedChars:e.number().int().min(200).max(4e4).default(6e3),navigatorModel:e.string().min(1).default("haiku"),answerModel:e.string().min(1).default("sonnet"),live:e.object({enabled:e.boolean().default(!0),maxReads:e.number().int().min(0).max(20).default(6),timeoutMs:e.number().int().min(1e3).max(12e4).default(15e3),plannerModel:e.string().min(1).default("haiku"),sources:e.array(Ln).default([])}).default({})}).default({}),summaries:e.object({model:e.string().min(1).default("haiku"),batchSize:e.number().int().min(1).max(50).default(20),maxWords:e.number().int().min(5).max(120).default(35),schedule:e.string().refine(r=>r.trim()===""||ze(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(On,'expected a time zone such as "UTC" or "Europe/Paris"').default("UTC"),agent:e.string().min(1).optional()}).default({}),curator:e.object({enabled:e.boolean().default(!0),agent:e.string().min(1).optional()}).default({})}).default({}),channels:jn.default({}),crons:e.record(e.string(),B).default({}),wikiNotes:Nn.default({}),services:e.record(e.string(),$n).default({}),notifications:Un,calls:We,whatsappTriage:fe,approvals:Qe,quality:e.object({specTests:e.object({enabled:e.boolean().default(!1),paths:e.array(e.string().min(1)).default(["src/daemon"]),agent:e.string().min(1).default("spec-tests"),model:e.string().min(1).optional(),maxCostPerIssue:e.number().positive().max(100).default(2),maxMinutes:e.number().int().min(1).max(120).default(20)}).default({}),canary:e.object({enabled:e.boolean().default(!1),soakMinutes:e.number().int().min(1).max(10080).default(120),thresholds:e.object({maxRestarts:e.number().int().min(0).default(1),maxCrashes:e.number().int().min(0).default(0),maxFailedTasks:e.number().int().min(0).default(3),maxErrorRateIncrease:e.number().min(0).max(1).default(.1),minTasksForRate:e.number().int().min(1).default(10)}).default({})}).default({}),reviewGate:Ke}).default({}),shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),signals:e.object({enabled:e.boolean().default(!0),windDownSeconds:e.number().int().min(10).max(1800).default(120),allowAgents:e.array(e.string().min(1)).default([]),allowPeers:e.array(e.string().min(1)).default([]),maxPerRoot:e.number().int().min(1).max(100).default(6)}).default({}),requests:Ze,watchers:Xe,people:Ge,members:Ye,requestStatus:Je,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),app:e.object({android:e.object({packageName:e.string().regex(/^[a-zA-Z][\w]*(\.[a-zA-Z][\w]*)+$/,"must look like com.example.app").default("dev.agentx.phone"),certFingerprints:e.array(e.string().regex(/^([0-9A-Fa-f]{2}:){31}[0-9A-Fa-f]{2}$/,"must be 32 hex pairs separated by colons")).default([])}).default({}),places:e.object({enabled:e.boolean().default(!0),file:e.string().min(1).default(".agentx/places.json"),defaultRadiusMeters:e.number().int().min(50).max(5e4).default(150),minRadiusMeters:e.number().int().min(50).max(5e4).default(100),maxRadiusMeters:e.number().int().min(50).max(5e4).default(5e3),maxPlaces:e.number().int().min(1).max(100).default(50),maxRulesPerPlace:e.number().int().min(1).max(50).default(10),cooldownMinutes:e.number().int().min(0).max(1440).default(10),maxEventAgeMinutes:e.number().int().min(1).max(1440).default(30),syncMinutes:e.number().int().min(15).max(1440).default(60)}).default({})}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:zn,mesh:qn.default({}),meshVoices:e.record(e.string(),Be.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:Me.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Fe.optional(),locale:e.string().default("en"),listener:e.string().optional(),pronunciations:e.array(e.object({written:e.string().trim().min(1).max(80),spoken:e.string().trim().min(1).max(120),languages:e.array(e.enum(["en","fr","ar"])).optional()}).strict()).max(200).default([]),pointer:e.boolean().default(!0),stt:e.enum(["auto","elevenlabs","local"]).default("auto"),allowUnmeasured:e.boolean().default(!1),spokenMaxChars:e.number().int().min(300).max(1500).default($),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(D)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:C.default(E.talk),stop:C.default(E.stop),paste:C.default(E.paste)}).default({}),look:e.enum(te).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(ne).default("sometimes"),palette:e.enum(N).default(v),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(T.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(T.maxSeconds)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:X.optional(),boards:V,dashboard:G,graph:Mn,decisions:Bn,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),followUp:e.object({enabled:e.boolean().default(!0),agents:e.record(e.boolean()).default({}),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(2),approval:e.enum(["start","step"]).default("step")}).default({}),required:e.object({enabled:e.boolean().default(!1),agents:e.record(e.boolean()).default({}),exemptQuestions:e.boolean().default(!0),retentionDays:e.number().int().min(0).max(3650).default(30)}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),tierTwoThresholdTokensByChannel:e.record(e.number().int().min(5e4).max(2e5)).default({}),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(0).max(1e4).optional(),maxClaudeCodeDispatchesPer5h:e.number().int().min(0).max(5e4).optional(),continuityStateTurns:e.number().int().min(0).max(5).default(0),profileByChannel:e.record(e.enum(["full","lean"])).default({}),lean:e.object({mcpServers:e.array(e.string().min(1)).default(["agentx"]),settingSources:e.array(e.enum(["user","project","local"])).default(["project","local"]),contextOnDemand:e.boolean().default(!0),tools:e.array(e.string().min(1)).default([]),toolsByChannel:e.record(e.array(e.string().min(1))).default({}),agentxTools:Ne.default([]),agentxToolsByChannel:e.record(Ne).default({})}).default({}),triage:e.object({models:e.object({"claude-code":e.string().min(1).optional(),"codex-cli":e.string().min(1).optional()}).default({}),actions:e.array(e.string().min(1)).default(["labeled","unlabeled","closed"])}).default({}),memoryIndexMaxChars:e.number().int().min(0).max(2e5).default(0),resumeGate:e.object({mode:e.enum(["off","shadow","active"]).default("off"),freshTokens:e.number().int().min(1e3).max(2e5).default(3e4),cacheTtlMinutes:e.number().int().min(1).max(1440).default(60),cacheWriteFactor:e.number().min(1).max(4).default(2),margin:e.number().min(1).max(10).default(1.5)}).default({}),observationPack:e.object({enabled:e.boolean().default(!1),limitBytes:e.number().int().min(1024).max(1048576).default(10240),headBytes:e.number().int().min(0).max(65536).default(1024),tailBytes:e.number().int().min(0).max(65536).default(1024),tools:e.array(e.string().min(1)).default(["Bash","Grep","Read","WebFetch","mcp__.*"]),retentionDays:e.number().int().min(0).max(3650).default(0)}).default({})}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})});tt="wiki-contribute",nt="wiki-contribute-merge";F="wiki-summarize"});export{Qn as a,er as b,Y as c,Lt as d,nr as e,E as f,ee as g,S as h,te as i,ne as j,N as k,ar as l,ae as m,oe as n,ie as o,lr as p,se as q,dr as r,cr as s,ue as t,de as u,gr as v,ce as w,fe as x,ge as y,y as z,p as A,yr as B,Kt as C,P as D,wr as E,pe as F,be as G,_r as H,Er as I,A as J,vr as K,xe as L,Se as M,ln as N,jr as O,ve as P,Or as Q,mn as R,Lr as S,Te as T,qr as U,I as V,Mr as W,Ae as X,bn as Y,hn as Z,Ce as _,Fr as $,Br as aa,Ur as ba,je as ca,wn as da,zr as ea,Wr as fa,Le as ga,An as ha,Ue as ia,He as ja,ze as ka,We as la,Ke as ma,Xe as na,Ze as oa,Ve as pa,Ge as qa,Ye as ra,Je as sa,Qe as ta,et as ua,L as va,Kn as wa,Xn as xa,tt as ya,nt as za,rt as Aa,F as Ba,at as Ca,Zn as Da,Vn as Ea};
|
|
54
|
-
//# sourceMappingURL=chunk-JYPXNH4C.js.map
|