agentix-cli 0.144.0 → 0.145.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-N2U77ED7.js → App-MYHUCIKZ.js} +2 -2
- package/dist/{ChatApp-GYVTECF6.js → ChatApp-D6QN6HJP.js} +2 -2
- package/dist/{absorb-eval-WSAVWCZV.js → absorb-eval-UAGD42BG.js} +2 -2
- package/dist/{agent-SLRGXBMK.js → agent-HEGEDDUE.js} +2 -2
- package/dist/{board-dashboard-B3T7VCRQ.js → board-dashboard-4KIFLAFO.js} +4 -4
- package/dist/{chunk-UNZRZOED.js → chunk-42BEORFZ.js} +2 -2
- package/dist/chunk-4NKPVTVP.js +62 -0
- package/dist/{chunk-DPIQCHXB.js.map → chunk-4NKPVTVP.js.map} +1 -1
- package/dist/{chunk-CZWEXRIE.js → chunk-5E37FADJ.js} +2 -2
- package/dist/{chunk-UII54DAP.js → chunk-BPOMIEEE.js} +2 -2
- package/dist/{chunk-VYLMC5DO.js → chunk-EV76NT3E.js} +2 -2
- package/dist/{chunk-QI4FYJGJ.js → chunk-GMVWDQFF.js} +2 -2
- package/dist/{chunk-PJGLIAEP.js → chunk-HCSIM2QW.js} +283 -283
- package/dist/chunk-HCSIM2QW.js.map +1 -0
- package/dist/{chunk-RV4WJZW5.js → chunk-HP2NWDCS.js} +2 -2
- package/dist/{chunk-MXWAREAQ.js → chunk-HSRNH4NR.js} +2 -2
- package/dist/{chunk-BAO77R4L.js → chunk-JTDQO4LI.js} +2 -2
- package/dist/{chunk-4JHMV3D3.js → chunk-KAGLCJA3.js} +2 -2
- package/dist/{chunk-3LAQ74H7.js → chunk-LJ62ABOZ.js} +2 -2
- package/dist/{chunk-M7527M7D.js → chunk-MMBFAVBR.js} +2 -2
- package/dist/{chunk-SVNYI6GR.js → chunk-OFJKTKRM.js} +2 -2
- package/dist/{chunk-45TKVOJX.js → chunk-P42M6CYF.js} +2 -2
- package/dist/{chunk-RGBQULXX.js → chunk-QXPMWP4R.js} +2 -2
- package/dist/{chunk-JGX5IWNX.js → chunk-SANYTBHX.js} +2 -2
- package/dist/{chunk-R5VGRKUW.js → chunk-SH5TNMS5.js} +2 -2
- package/dist/{chunk-KV4ZA7FS.js → chunk-TJZGAKIB.js} +4 -4
- package/dist/{chunk-KV4ZA7FS.js.map → chunk-TJZGAKIB.js.map} +1 -1
- package/dist/{chunk-DFWPTNZ5.js → chunk-TM3I6C4V.js} +2 -2
- package/dist/{chunk-LVQHNTXV.js → chunk-VDJZ2Q3M.js} +2 -2
- package/dist/{chunk-SFUNL7RV.js → chunk-VMMCT27Z.js} +2 -2
- package/dist/{chunk-Q73QQPDB.js → chunk-VTVEJ3RA.js} +2 -2
- package/dist/{chunk-GWBBWYGM.js → chunk-VXBL2DET.js} +2 -2
- package/dist/{chunk-GOAMSJ2D.js → chunk-WUBSX6S5.js} +2 -2
- package/dist/{chunk-EX4AREN5.js → chunk-YEFEUSB2.js} +2 -2
- package/dist/{chunk-2GJFLPS7.js → chunk-YUY35PY7.js} +3 -3
- package/dist/{chunk-TTBCXVPJ.js → chunk-YWDXRGVC.js} +5 -5
- package/dist/cli.js +1 -1
- package/dist/{client-B7FXDTYK.js → client-ZU5AWBXQ.js} +2 -2
- package/dist/config-Q4MNOHRI.js +2 -0
- package/dist/{config-mutate-XQRUAVEH.js → config-mutate-DVARJ4KM.js} +2 -2
- package/dist/config-mutator-5NYGSUJD.js +2 -0
- package/dist/{contributions-ESUSYUQG.js → contributions-HKWDGIQV.js} +2 -2
- package/dist/{doctor-DIYZGSIS.js → doctor-RTVGZP3X.js} +2 -2
- package/dist/{follow-up-tool-QXEYEWX7.js → follow-up-tool-2T4SIFY2.js} +2 -2
- package/dist/{grants-MM7U6GCK.js → grants-O7SJ2J4B.js} +2 -2
- package/dist/{hub-OC7PH2AR.js → hub-3LDKRLTH.js} +2 -2
- package/dist/index.d.ts +82 -0
- package/dist/index.js +1 -1
- package/dist/{program-LZPM6I2Q.js → program-MAM4NX5P.js} +23 -23
- package/dist/{promote-SIC6RWCX.js → promote-YOV5ELNF.js} +2 -2
- package/dist/{query-OP2MSR2G.js → query-LTKK3M2Y.js} +2 -2
- package/dist/{query-settings-67332F5V.js → query-settings-ACXSGMDU.js} +2 -2
- package/dist/{registry-G2ZG5TIN.js → registry-NIAPKDQF.js} +2 -2
- package/dist/{request-planner-THTPE3FP.js → request-planner-433C7M3L.js} +2 -2
- package/dist/{review-candidates-7PS7CHXF.js → review-candidates-SI3QBYNH.js} +2 -2
- package/dist/{routing-PE7DB7WA.js → routing-CXT77HBF.js} +2 -2
- package/dist/schedule-tool-3R4ISM5R.js +2 -0
- package/dist/{scheduler-YTXCIQTZ.js → scheduler-SFHWPWCA.js} +2 -2
- package/dist/{seat-6DMK4274.js → seat-CJVTUIM2.js} +2 -2
- package/dist/{select-CLDYPAOS.js → select-JHGDG4H2.js} +2 -2
- package/dist/{set-enabled-ZH2DH4GU.js → set-enabled-NOJGCJAL.js} +2 -2
- package/dist/{tool-MKDTKBJ4.js → tool-ERK543LL.js} +2 -2
- package/dist/{tool-4AO3ZMAY.js → tool-YOSMTSJM.js} +2 -2
- package/dist/{wiki-CH2HYJVI.js → wiki-2LLXQUEP.js} +2 -2
- package/dist/wiki-enrich-6C2O2MNV.js +2 -0
- package/package.json +1 -1
- package/dist/chunk-DPIQCHXB.js +0 -62
- package/dist/chunk-PJGLIAEP.js.map +0 -1
- package/dist/config-MLP33NWR.js +0 -2
- package/dist/config-mutator-5JFTMQ43.js +0 -2
- package/dist/schedule-tool-3FXRKJGN.js +0 -2
- package/dist/wiki-enrich-VEAYFVR2.js +0 -2
- /package/dist/{App-N2U77ED7.js.map → App-MYHUCIKZ.js.map} +0 -0
- /package/dist/{ChatApp-GYVTECF6.js.map → ChatApp-D6QN6HJP.js.map} +0 -0
- /package/dist/{absorb-eval-WSAVWCZV.js.map → absorb-eval-UAGD42BG.js.map} +0 -0
- /package/dist/{agent-SLRGXBMK.js.map → agent-HEGEDDUE.js.map} +0 -0
- /package/dist/{board-dashboard-B3T7VCRQ.js.map → board-dashboard-4KIFLAFO.js.map} +0 -0
- /package/dist/{chunk-UNZRZOED.js.map → chunk-42BEORFZ.js.map} +0 -0
- /package/dist/{chunk-CZWEXRIE.js.map → chunk-5E37FADJ.js.map} +0 -0
- /package/dist/{chunk-UII54DAP.js.map → chunk-BPOMIEEE.js.map} +0 -0
- /package/dist/{chunk-VYLMC5DO.js.map → chunk-EV76NT3E.js.map} +0 -0
- /package/dist/{chunk-QI4FYJGJ.js.map → chunk-GMVWDQFF.js.map} +0 -0
- /package/dist/{chunk-RV4WJZW5.js.map → chunk-HP2NWDCS.js.map} +0 -0
- /package/dist/{chunk-MXWAREAQ.js.map → chunk-HSRNH4NR.js.map} +0 -0
- /package/dist/{chunk-BAO77R4L.js.map → chunk-JTDQO4LI.js.map} +0 -0
- /package/dist/{chunk-4JHMV3D3.js.map → chunk-KAGLCJA3.js.map} +0 -0
- /package/dist/{chunk-3LAQ74H7.js.map → chunk-LJ62ABOZ.js.map} +0 -0
- /package/dist/{chunk-M7527M7D.js.map → chunk-MMBFAVBR.js.map} +0 -0
- /package/dist/{chunk-SVNYI6GR.js.map → chunk-OFJKTKRM.js.map} +0 -0
- /package/dist/{chunk-45TKVOJX.js.map → chunk-P42M6CYF.js.map} +0 -0
- /package/dist/{chunk-RGBQULXX.js.map → chunk-QXPMWP4R.js.map} +0 -0
- /package/dist/{chunk-JGX5IWNX.js.map → chunk-SANYTBHX.js.map} +0 -0
- /package/dist/{chunk-R5VGRKUW.js.map → chunk-SH5TNMS5.js.map} +0 -0
- /package/dist/{chunk-DFWPTNZ5.js.map → chunk-TM3I6C4V.js.map} +0 -0
- /package/dist/{chunk-LVQHNTXV.js.map → chunk-VDJZ2Q3M.js.map} +0 -0
- /package/dist/{chunk-SFUNL7RV.js.map → chunk-VMMCT27Z.js.map} +0 -0
- /package/dist/{chunk-Q73QQPDB.js.map → chunk-VTVEJ3RA.js.map} +0 -0
- /package/dist/{chunk-GWBBWYGM.js.map → chunk-VXBL2DET.js.map} +0 -0
- /package/dist/{chunk-GOAMSJ2D.js.map → chunk-WUBSX6S5.js.map} +0 -0
- /package/dist/{chunk-EX4AREN5.js.map → chunk-YEFEUSB2.js.map} +0 -0
- /package/dist/{chunk-2GJFLPS7.js.map → chunk-YUY35PY7.js.map} +0 -0
- /package/dist/{chunk-TTBCXVPJ.js.map → chunk-YWDXRGVC.js.map} +0 -0
- /package/dist/{client-B7FXDTYK.js.map → client-ZU5AWBXQ.js.map} +0 -0
- /package/dist/{config-MLP33NWR.js.map → config-Q4MNOHRI.js.map} +0 -0
- /package/dist/{config-mutate-XQRUAVEH.js.map → config-mutate-DVARJ4KM.js.map} +0 -0
- /package/dist/{config-mutator-5JFTMQ43.js.map → config-mutator-5NYGSUJD.js.map} +0 -0
- /package/dist/{contributions-ESUSYUQG.js.map → contributions-HKWDGIQV.js.map} +0 -0
- /package/dist/{doctor-DIYZGSIS.js.map → doctor-RTVGZP3X.js.map} +0 -0
- /package/dist/{follow-up-tool-QXEYEWX7.js.map → follow-up-tool-2T4SIFY2.js.map} +0 -0
- /package/dist/{grants-MM7U6GCK.js.map → grants-O7SJ2J4B.js.map} +0 -0
- /package/dist/{hub-OC7PH2AR.js.map → hub-3LDKRLTH.js.map} +0 -0
- /package/dist/{program-LZPM6I2Q.js.map → program-MAM4NX5P.js.map} +0 -0
- /package/dist/{promote-SIC6RWCX.js.map → promote-YOV5ELNF.js.map} +0 -0
- /package/dist/{query-OP2MSR2G.js.map → query-LTKK3M2Y.js.map} +0 -0
- /package/dist/{query-settings-67332F5V.js.map → query-settings-ACXSGMDU.js.map} +0 -0
- /package/dist/{registry-G2ZG5TIN.js.map → registry-NIAPKDQF.js.map} +0 -0
- /package/dist/{request-planner-THTPE3FP.js.map → request-planner-433C7M3L.js.map} +0 -0
- /package/dist/{review-candidates-7PS7CHXF.js.map → review-candidates-SI3QBYNH.js.map} +0 -0
- /package/dist/{routing-PE7DB7WA.js.map → routing-CXT77HBF.js.map} +0 -0
- /package/dist/{schedule-tool-3FXRKJGN.js.map → schedule-tool-3R4ISM5R.js.map} +0 -0
- /package/dist/{scheduler-YTXCIQTZ.js.map → scheduler-SFHWPWCA.js.map} +0 -0
- /package/dist/{seat-6DMK4274.js.map → seat-CJVTUIM2.js.map} +0 -0
- /package/dist/{select-CLDYPAOS.js.map → select-JHGDG4H2.js.map} +0 -0
- /package/dist/{set-enabled-ZH2DH4GU.js.map → set-enabled-NOJGCJAL.js.map} +0 -0
- /package/dist/{tool-MKDTKBJ4.js.map → tool-ERK543LL.js.map} +0 -0
- /package/dist/{tool-4AO3ZMAY.js.map → tool-YOSMTSJM.js.map} +0 -0
- /package/dist/{wiki-CH2HYJVI.js.map → wiki-2LLXQUEP.js.map} +0 -0
- /package/dist/{wiki-enrich-VEAYFVR2.js.map → wiki-enrich-6C2O2MNV.js.map} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=promote-
|
|
1
|
+
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t}from"./chunk-QXPMWP4R.js";import"./chunk-AQASR6KR.js";import"./chunk-2AXFYDWF.js";import"./chunk-MEFPXHQJ.js";import"./chunk-HP2NWDCS.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-BPOMIEEE.js";import"./chunk-WPNRDEHW.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{b as DEFAULT_PROMOTE_TYPES,a as PROMOTER_OWNER,c as PROMOTION_LEDGER_FILE,j as appendPromotionLedger,s as approveProposal,n as callPromotionLlm,p as estimateTokens,r as evidenceFor,m as getUnpromotedMemories,k as groupCandidates,h as listAllAgentMemories,d as memoryKey,e as memoryStamp,g as mergeSources,f as parseMemoryStamp,l as parsePromotionResponse,i as readPromotionLedger,t as rejectProposal,o as runPromotion,q as sourceKind};
|
|
2
|
+
//# sourceMappingURL=promote-YOV5ELNF.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g,h,i,j}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=query-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i,j}from"./chunk-YUY35PY7.js";import"./chunk-SKSYII3K.js";import"./chunk-BPOMIEEE.js";import"./chunk-WPNRDEHW.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-6TURWSMN.js";import"./chunk-QD6IICK7.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{c as AUTO_SUMMARY_COVERAGE,a as CATALOG_SELECTOR_MODEL,b as CATALOG_SYNTH_MODEL,h as DEFAULT_GRAPH_WEIGHT,g as SHARED_CATALOG_LINES,d as agenticQuery,f as catalogPool,i as rankCatalogPool,e as retrieveArticles,j as sharedQueryEnabled};
|
|
2
|
+
//# sourceMappingURL=query-LTKK3M2Y.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{b as u}from"./chunk-MEFPXHQJ.js";import{c as a}from"./chunk-SKSYII3K.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-6TURWSMN.js";import"./chunk-QD6IICK7.js";import"./chunk-QIJLFPWE.js";import{readFileSync as f}from"fs";import{resolve as d}from"path";var g={shared:!0,method:"auto",summaries:a,notes:{enabled:!1,types:["project","reference"],dirs:{}}};function y(n,t,e=process.cwd()){if(!n.notes.enabled||!t)return;let r=n.notes.dirs[t];return{owner:t,dir:r?d(e,r):new u({baseDir:d(e,".agentx")}).dirOf(t),types:n.notes.types}}function E(n,t,e=process.env,r=process.cwd()){let i=e.AGENTX_AGENT_ID;if(!(!i||i!==t))return y(n,t,r)}function p(n){if(n)try{return f(n,"utf-8").trim().split(`
|
|
2
|
-
`)[0].trim()||void 0}catch{return}}function c(n,t){try{let e=new URL(n);return e.protocol==="https:"&&e.origin===new URL(t).origin}catch{return!1}}var l=n=>n.map(t=>typeof t=="string"?{repo:t}:{repo:t.repo,about:t.about});function h(n,t=process.env){let e=[];for(let r of n.wiki.query.live.sources){if(r.type==="agentx"){let o=n.node.bind.replace(/^0\.0\.0\.0:/,"127.0.0.1:");e.push({type:"agentx",url:r.url??`http://${o}`,peers:r.peers});continue}let i=(r.tokenEnv?t[r.tokenEnv]:void 0)||p(r.tokenFile);if(r.type==="github"){let o=n.channels.github,s=c(r.apiUrl,"https://api.github.com")?o?.token||p(o?.tokenFile):void 0;e.push({type:"github",apiUrl:r.apiUrl,token:i||s||void 0,repos:l(r.repos)})}else{let o=n.channels.gitlab,s=r.url??o?.host;if(!s)continue;let m=o?.host&&(!r.url||c(s,o.host))?o.token:void 0;e.push({type:"gitlab",url:s,token:i||m||void 0,repos:l(r.repos)})}}return e}function v(n,t=process.env){let e=n.wiki.query;return{shared:e.shared,method:e.method,summaries:{candidates:e.candidates,sharedCandidates:e.sharedCandidates,noteCandidates:e.notes.candidates,maxPages:e.maxPages,pageChars:e.pageChars,linkedPages:e.linkedPages,linkedChars:e.linkedChars,navigatorModel:e.navigatorModel,answerModel:e.answerModel,live:{enabled:e.live.enabled,maxReads:e.live.maxReads,timeoutMs:e.live.timeoutMs,plannerModel:e.live.plannerModel,sources:h(n,t)}},notes:{enabled:e.notes.enabled,types:e.notes.types,dirs:Object.fromEntries(Object.entries(n.agents).flatMap(([r,i])=>i.wiki?.notes?.dir?[[r,i.wiki.notes.dir]]:[]))}}}async function M(n){try{let{loadDaemonConfig:t}=await import("./config-
|
|
3
|
-
//# sourceMappingURL=query-settings-
|
|
2
|
+
`)[0].trim()||void 0}catch{return}}function c(n,t){try{let e=new URL(n);return e.protocol==="https:"&&e.origin===new URL(t).origin}catch{return!1}}var l=n=>n.map(t=>typeof t=="string"?{repo:t}:{repo:t.repo,about:t.about});function h(n,t=process.env){let e=[];for(let r of n.wiki.query.live.sources){if(r.type==="agentx"){let o=n.node.bind.replace(/^0\.0\.0\.0:/,"127.0.0.1:");e.push({type:"agentx",url:r.url??`http://${o}`,peers:r.peers});continue}let i=(r.tokenEnv?t[r.tokenEnv]:void 0)||p(r.tokenFile);if(r.type==="github"){let o=n.channels.github,s=c(r.apiUrl,"https://api.github.com")?o?.token||p(o?.tokenFile):void 0;e.push({type:"github",apiUrl:r.apiUrl,token:i||s||void 0,repos:l(r.repos)})}else{let o=n.channels.gitlab,s=r.url??o?.host;if(!s)continue;let m=o?.host&&(!r.url||c(s,o.host))?o.token:void 0;e.push({type:"gitlab",url:s,token:i||m||void 0,repos:l(r.repos)})}}return e}function v(n,t=process.env){let e=n.wiki.query;return{shared:e.shared,method:e.method,summaries:{candidates:e.candidates,sharedCandidates:e.sharedCandidates,noteCandidates:e.notes.candidates,maxPages:e.maxPages,pageChars:e.pageChars,linkedPages:e.linkedPages,linkedChars:e.linkedChars,navigatorModel:e.navigatorModel,answerModel:e.answerModel,live:{enabled:e.live.enabled,maxReads:e.live.maxReads,timeoutMs:e.live.timeoutMs,plannerModel:e.live.plannerModel,sources:h(n,t)}},notes:{enabled:e.notes.enabled,types:e.notes.types,dirs:Object.fromEntries(Object.entries(n.agents).flatMap(([r,i])=>i.wiki?.notes?.dir?[[r,i.wiki.notes.dir]]:[]))}}}async function M(n){try{let{loadDaemonConfig:t}=await import("./config-Q4MNOHRI.js");return v(t(n))}catch{return g}}export{g as DEFAULT_QUERY_SETTINGS,M as loadQuerySettings,c as mayLendToken,y as noteSourceFor,h as resolveLiveSources,v as resolveQuerySettings,E as toolNoteSourceFor};
|
|
3
|
+
//# sourceMappingURL=query-settings-ACXSGMDU.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ba as a,ca as b,da as c,ea as d,fa as e,ga as f,ha as g,ia as h,ja as i,ka as j,la as k,ma as l,na as m,oa as n}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=registry-
|
|
1
|
+
import{ba as a,ca as b,da as c,ea as d,fa as e,ga as f,ha as g,ia as h,ja as i,ka as j,la as k,ma as l,na as m,oa as n}from"./chunk-YWDXRGVC.js";import"./chunk-P42M6CYF.js";import"./chunk-MEFPXHQJ.js";import"./chunk-SZDACK6O.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-5TTHN7DP.js";import"./chunk-LJ62ABOZ.js";import"./chunk-VMMCT27Z.js";import"./chunk-3UOTLMXD.js";import"./chunk-36AXN6ZB.js";import"./chunk-PE5V2LI7.js";import"./chunk-GQ76J72O.js";import"./chunk-ILEC3IAV.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-VWTBHLMX.js";import"./chunk-VTVEJ3RA.js";import"./chunk-HP2NWDCS.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-YUY35PY7.js";import"./chunk-SKSYII3K.js";import"./chunk-BPOMIEEE.js";import"./chunk-WPNRDEHW.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-KAGLCJA3.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-MYVHVJWZ.js";import"./chunk-6TURWSMN.js";import"./chunk-AV7T3SYT.js";import"./chunk-Y5MFVVTM.js";import"./chunk-QD6IICK7.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-DSYKYZMT.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{m as AgentRegistry,a as EDIT_TOOL_INSTRUCTION,h as TRACE_STEP_SUMMARY_BYTES,e as buildEntryMeta,f as buildEventDigest,g as buildWikiContext,i as clipForTrace,b as codingInstructions,l as emitTraceStepsFromStreamEvent,k as firstMissingRequiredTool,d as getGlobalRegistry,n as richReplyPrompt,c as setGlobalRegistry,j as tallyToolUses};
|
|
2
|
+
//# sourceMappingURL=registry-NIAPKDQF.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{p as f,s as h,v as g,y as m,z as E}from"./chunk-
|
|
1
|
+
import{p as f,s as h,v as g,y as m,z as E}from"./chunk-SH5TNMS5.js";import{a as p,f as w}from"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";E();w();var l="request-gate",x="request-context",q=.1,C=3e3;function b(t,s){return s??f(t)??C}async function k(t,s,n,r=Math.random){let d=g(l)==="active";if(d){let e=h().seats[l]?.holdout??q;if(r()<e)return{active:!0,preprocess:!1,arm:"holdout"}}let i=d?"treatment":void 0,a=await m(l,{request:t.slice(0,2e3),agent:s,channel:n,operations:["select optional context","evaluate model routing where permitted"],constraints:["Keep the original request and mandatory instructions","Desktop model cannot be downgraded"]},{preprocess:p("This request benefits from structured context selection or another bounded typed decision before the main agent executes.",{true:"Relevant context must be selected, or a bounded routing decision can help. Follow-ups and ambiguous references need context.",false:"Typed preprocessing adds no useful decision; send the request to the configured main agent with existing context."})},{timeoutMs:b(l)});if(!a||a.mode!=="active")return{active:!1,preprocess:!1,arm:i};let c=a.answers.preprocess?.noul;return{active:!0,preprocess:Number.isFinite(c)&&c>=.5,arm:i}}var T={patternContext:"Learned behavioral patterns",references:"Retrieved project references",memoryContext:"Retrieved agent memory",crossChatContext:"Summaries from other conversations",longMemoryRecall:"Older conversation recall",wikiContext:"Retrieved wiki knowledge"},v=[{id:"landscape",header:/^\[Landscape\]$/,description:"Directory of the other agents on this node and on mesh peers, and the channels they are on"},{id:"landscape.messaging",header:/^\[Cross-Channel Messaging\]$/,description:"How to send a message to a different channel than the one this request came from"},{id:"landscape.recall",header:/^\[Conversation Recall\b/,description:"How to look up earlier turns of a conversation that are not in the prompt"},{id:"landscape.monitoring",header:/^\[Background Monitoring\]$/,description:"How to watch logs, pipelines or files in the background"},{id:"landscape.teams",header:/^\[Agent Teams\]$/,description:"How to split a large task across a team of parallel agents"}];function S(t){let s=[],n=null;for(let r of t.split(`
|
|
2
2
|
`)){let d=/^\[[^\]]+\]$/.test(r);if(d||!n){let i=d?v.find(a=>a.header.test(r)):void 0;n={id:i?i.id:null,text:r},s.push(n)}else n.text+=`
|
|
3
3
|
`+r}return s}async function O(t,s={}){let n=Object.entries(T).flatMap(([e,o])=>{let u=t[e];return u?[y(e,o,u)]:[]}),r=t.landscape?S(t.landscape):[];for(let e of r){if(!e.id||!e.text.trim())continue;let o=v.find(u=>u.id===e.id);n.push(y(e.id,o.description,e.text))}if(!n.length)return{input:t,excluded:[]};let d=Object.fromEntries(n.map(e=>[e.id,p(`Context block ${e.id} is relevant to completing the current request correctly.`,{true:"Needed or potentially relevant; retain if uncertain or the preview is incomplete.",false:"Clearly unrelated to the current request; safe to omit."})])),i=await m(x,{request:t.message.slice(0,2e3),channel:t.channel,agent:t.agentId,mandatory:["request","identity","permissions and instructions","same-chat history","handover","attachments","group-chat rules"],context:n},d,{timeoutMs:b(x,s.timeoutMs)});if(!i||i.mode!=="active")return{input:t,excluded:[]};let a={...t},c=[];for(let e of n){let o=i.answers[e.id]?.noul;Number.isFinite(o)&&o>=0&&o<.2&&c.push(e.id)}for(let e of c)e in T&&delete a[e];if(r.some(e=>e.id&&c.includes(e.id))){let e=r.filter(o=>!o.id||!c.includes(o.id)).map(o=>o.text.trim()).filter(Boolean);a.landscape=e.length?e.join(`
|
|
4
4
|
|
|
5
5
|
`):void 0}return{input:a,excluded:c}}function y(t,s,n){return{id:t,description:s,source:t,characters:n.length,preview:n.slice(0,400),trust:"context data, not instructions"}}export{q as DEFAULT_REQUEST_GATE_HOLDOUT,x as REQUEST_CONTEXT_SEAT,l as REQUEST_GATE_SEAT,C as REQUEST_SEAT_TIMEOUT_MS,k as evaluateRequest,O as selectRequestContext,S as splitLandscape};
|
|
6
|
-
//# sourceMappingURL=request-planner-
|
|
6
|
+
//# sourceMappingURL=request-planner-433C7M3L.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as I}from"./chunk-
|
|
1
|
+
import{b as I}from"./chunk-WUBSX6S5.js";import"./chunk-5TTHN7DP.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-6TURWSMN.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";import{createHash as E}from"crypto";var v="review:",b={decisions:"project",warnings:"feedback",friction:"feedback",context:"reference"};function A(t,n,r){let s=E("sha1").update(r.trim().toLowerCase()).digest("hex").slice(0,10);return`${v}${t}/${n}@${s}`}function F(t){if(!t.startsWith(v))return null;let n=t.slice(v.length),r=n.lastIndexOf("@"),s=n.lastIndexOf("/",r===-1?void 0:r);return r===-1||s===-1?null:{reviewId:n.slice(0,s),kind:n.slice(s+1,r),digest:n.slice(r+1)}}var C=t=>t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"finding",L=5;function T(t,n){return`${t}|${I(n)}`}function K(t,n={}){let r=n.kinds??Object.keys(b),s=n.minLength??24,h=[],d=new Map,u=new Map,f=new Map,x=new Map;for(let e of t){let i;try{i=JSON.parse(e.result)}catch{continue}let o=e.updated_at?new Date(e.updated_at).toISOString():new Date().toISOString();for(let c of r){let l=b[c];if(!l)continue;let R=i[c];if(Array.isArray(R))for(let $ of R){let a=String($?.text??"").trim();if(a.length<s)continue;let g=A(e.id,c,a),_=g.slice(g.lastIndexOf("@")),w=`${c}${_}`,y=T(c,a),S=f.get(y)??new Set;if(S.add(e.session_id??e.id),f.set(y,S),d.has(w))continue;let O=String($?.evidence??"").trim(),k={occurrences:1,agentId:e.agent,key:`${e.agent}/${l}_${C(a)}`,stamp:g,memory:{name:C(a),type:l,description:a.slice(0,200),body:"",createdAt:o,updatedAt:o}};x.set(g,{text:a,evidence:O,agent:e.agent,source:e.source}),d.set(w,k),u.set(w,y),h.push(k)}}}for(let[e,i]of d){let o=f.get(u.get(e)??"");i.occurrences=o?.size??1,i.sessions=[...o??[]].slice(0,L);let c=x.get(i.stamp);i.memory.body=D(c,i.occurrences)}let m=new Map;for(let[e,i]of d){let o=u.get(e)??e,c=m.get(o)??[];c.push(i),m.set(o,c)}let M=[...m.values()].sort((e,i)=>i[0].occurrences-e[0].occurrences),p=[];for(let e=0;p.length<h.length;e++){let i=!1;for(let o of M)e<o.length&&(p.push(o[e]),i=!0);if(!i)break}return p}function D(t,n){let r=`${t.agent}${t.source?` via ${t.source}`:""}`,s=[];return n>1?(s.push(`Observed in ${n} separate sessions. Most recently stated as:`),s.push(`> ${t.text}`),s.push(`Recurring across ${n} sessions is what makes this worth recording \u2014 any single occurrence is session state, the repetition is the finding.`)):s.push(t.text),t.evidence&&s.push(`**Evidence:** ${t.evidence}`),s.push(`_From ${n>1?"session reviews":"a session review"} of ${r}._`),s.join(`
|
|
2
2
|
|
|
3
3
|
`)}export{L as MAX_EVIDENCE_SESSIONS,b as PROMOTABLE_KINDS,v as REVIEW_STAMP_PREFIX,F as parseReviewStamp,A as reviewStamp,K as reviewsToCandidates};
|
|
4
|
-
//# sourceMappingURL=review-candidates-
|
|
4
|
+
//# sourceMappingURL=review-candidates-SI3QBYNH.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b,c,d,e,f}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=routing-
|
|
1
|
+
import{a,b,c,d,e,f}from"./chunk-KAGLCJA3.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{e as DEFAULT_TRIAGE_ACTIONS,a as DOWNGRADE_BELOW,b as channelKeepsConfiguredModel,c as cheapModelForEngine,d as routeTaskModel,f as triageModelFor};
|
|
2
|
+
//# sourceMappingURL=routing-CXT77HBF.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a,b}from"./chunk-EV76NT3E.js";import"./chunk-RKPAVWXF.js";import"./chunk-SANYTBHX.js";import"./chunk-LJ62ABOZ.js";import"./chunk-VMMCT27Z.js";import"./chunk-3UOTLMXD.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-QIJLFPWE.js";export{b as resolveScheduleCaller,a as runScheduleTool};
|
|
2
|
+
//# sourceMappingURL=schedule-tool-3R4ISM5R.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as a,o as b,p as c,q as d,r as e,s as f}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=scheduler-
|
|
1
|
+
import{n as a,o as b,p as c,q as d,r as e,s as f}from"./chunk-LJ62ABOZ.js";import"./chunk-VMMCT27Z.js";import"./chunk-3UOTLMXD.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-QIJLFPWE.js";export{a as AGENT_RUN_TIMEOUT_FLOOR,f as CronScheduler,b as agentRunTimeout,e as cronRunId,d as getNextCronDate,c as runLinkIds};
|
|
2
|
+
//# sourceMappingURL=scheduler-SFHWPWCA.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i,x as j,y as k,z as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=seat-
|
|
1
|
+
import{o as a,p as b,q as c,r as d,s as e,t as f,u as g,v as h,w as i,x as j,y as k,z as l}from"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";l();export{a as DEFAULT_SEAT_TIMEOUT_MS,k as askSeat,c as configureDecisions,b as configuredSeatTimeout,e as decisionsRuntime,h as getSeatMode,i as labelSeatCall,f as parseSeatMode,j as recordSeatOutcome,d as resetDecisionsRuntime,g as seatEnvVar};
|
|
2
|
+
//# sourceMappingURL=seat-CJVTUIM2.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{y as S,z as w}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=select-
|
|
1
|
+
import{y as S,z as w}from"./chunk-SH5TNMS5.js";import{a as g,b as h,f as R}from"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import{e as f}from"./chunk-JHCI6XCJ.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";w();R();var p="skill-select";function y(l){return{task:d(l.task,1200),...l.agent?{agent:l.agent}:{},skills:l.candidates.map(t=>({name:t.name,purpose:d(t.description,300),...t.category?{category:t.category}:{},...t.tags?.length?{tags:t.tags.slice(0,8)}:{}}))}}function b(l){let t={};for(let i of l)t[i.name]=d(i.description,300);return{anyRelevant:g("At least one of these skills is about the task at hand.",{true:"The task is the kind of work one of these skills exists for, and following it would change how the work is done \u2014 it names the same system, the same procedure or the same kind of artefact.",false:"None of them is about this task. They may share vocabulary with it, mention the same tools, or belong to the same project without bearing on what is being asked. Sharing words with a task is not being about it."}),best:h(t,"Which skill is this task most about?")}}function v(l){let t=l.anyRelevant,i=l.best,o=Object.entries(i.probabilities??{}).map(([e,s])=>({name:e,p:Number(s)||0})).sort((e,s)=>s.p-e.p);return{anyRelevant:t.noul,name:i.choice,confidence:i.confidence,ranked:o}}function d(l,t){return l.length>t?`${l.slice(0,t)}\u2026`:l}var x=.1,A=12;async function E(l,t,i={}){let o=i.minRelevant??.6,e=f(l,t).filter(n=>n.relevance>=x).slice(0,A),s=e.map(n=>({name:n.skill.frontmatter.name,lexical:n.relevance}));if(e.length===0)return{skill:null,anyRelevant:0,confidence:0,shortlist:s,judged:!1,reason:"no skill mentions anything in this task"};if(e.length===1)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`only ${e[0].skill.frontmatter.name} matched (${e[0].matchReason})`};let r=e.map(n=>({name:n.skill.frontmatter.name,description:n.skill.frontmatter.description,category:n.skill.frontmatter.category??null,tags:n.skill.frontmatter.tags})),m=await S(p,y({task:t,agent:i.agent??null,candidates:r}),b(r),{incumbent:{best:r[0].name},features:{agent:i.agent??"unknown",candidates:r.length}});if(!m)return{skill:e[0].skill,anyRelevant:e[0].relevance,confidence:e[0].relevance,shortlist:s,judged:!1,reason:`seat off \u2014 lexical top match (${e[0].matchReason})`};let a=v(m.answers),c=s.map(n=>({...n,p:a.ranked.find(k=>k.name===n.name)?.p??0})).sort((n,k)=>(k.p??0)-(n.p??0));if(a.anyRelevant<o)return{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`nothing on the shortlist is about this task (${a.anyRelevant.toFixed(2)} below ${o})`};let u=e.find(n=>n.skill.frontmatter.name===a.name);return u?{skill:u.skill,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`${a.name} (confidence ${a.confidence.toFixed(2)})`}:{skill:null,anyRelevant:a.anyRelevant,confidence:a.confidence,shortlist:c,judged:!0,reason:`seat chose "${a.name}", which was not on the shortlist`}}export{E as pickSkillForTask};
|
|
2
|
+
//# sourceMappingURL=select-JHGDG4H2.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=set-enabled-
|
|
1
|
+
import{b as a}from"./chunk-VMMCT27Z.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-QIJLFPWE.js";async function i(o,r,s={}){let e=null,n=await a(l=>{let t=l.crons?.[o];if(t?r&&t.approval?.action==="create"?e={ok:!1,status:409,error:`schedule "${o}" is waiting for approval: agentx schedule approve ${o}`}:t.enabled===r&&(e={ok:!0,id:o,enabled:r,changed:!1}):e={ok:!1,status:404,error:`no schedule "${o}"`},e)throw new Error("no write");t.enabled=r,e={ok:!0,id:o,enabled:r,changed:!0}},{configPath:s.configPath,reload:!1});return e&&(!e.ok||!e.changed)?e:n.success?e??{ok:!1,status:500,error:"mutation did not run"}:{ok:!1,status:500,error:n.error||"could not write agentx.json"}}export{i as setCronEnabled};
|
|
2
|
+
//# sourceMappingURL=set-enabled-NOJGCJAL.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as f}from"./chunk-
|
|
1
|
+
import{b as f}from"./chunk-EV76NT3E.js";import"./chunk-RKPAVWXF.js";import{f as y}from"./chunk-VY7TBMJU.js";import{b as u}from"./chunk-DG2DC43E.js";import"./chunk-WBG6NA7R.js";import"./chunk-SANYTBHX.js";import"./chunk-LJ62ABOZ.js";import"./chunk-VMMCT27Z.js";import"./chunk-3UOTLMXD.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-QIJLFPWE.js";var w=new Set(["cron","heartbeat","api","a2a","mesh","approvals","requests"]);function c(t){return typeof t=="string"?t.trim():""}async function b(t,s){let d=s.fetch??fetch,l=s.daemonUrl.replace(/\/$/,""),i=(c(t.action)||"create").toLowerCase(),o=f(t,s.env??process.env);if(i==="status"){let n=c(t.id);if(!n)return"Error: `id` is required for status (the card id you got when you raised it).";try{let a=await d(`${l}/approvals/${encodeURIComponent(n)}`,{signal:AbortSignal.timeout(1e4)}),r=await a.json().catch(()=>({}));if(!a.ok)return`Error: ${r?.error||`HTTP ${a.status}`}`;let e=r.card;if(o&&e.raised_by!==o.agentId)return`Error: card "${n}" was raised by another agent.`;if(e.status==="pending")return`Card ${e.id} is still waiting for the operator. It expires ${e.expires}; then "${e.if_silent}" applies.`;if(e.status==="decided"){let h=e.verdict==="yes"?y(e).join(`
|
|
2
2
|
`):"";return`Card ${e.id}: the operator said ${String(e.verdict).toUpperCase()}.${e.note?` Note: ${e.note}`:""}${h?`
|
|
3
3
|
${h}`:""}`}return e.status==="resolved"?`Card ${e.id} was closed by ${e.raised_by}: ${e.resolution??"answered outside the card"}.`:`Card ${e.id} expired unanswered; the default applied: ${e.outcome??e.if_silent}.`}catch(a){return`Error: couldn't reach the daemon (${a?.message??a}).`}}if(i==="resolve"){let n=c(t.id),a=c(t.reason);if(!n)return"Error: `id` is required for resolve (the card id you got when you raised it).";if(!a)return'Error: `reason` is required for resolve: where the owner answered and what you did, e.g. "approved in chat, done".';if(!o)return"Error: couldn't tell which agent you are. Pass callerAgentId.";try{let r=await d(`${l}/approvals/${encodeURIComponent(n)}/resolve`,{method:"POST",headers:{"Content-Type":"application/json",...u(s.env??process.env)},body:JSON.stringify({raised_by:o.agentId,reason:a}),signal:AbortSignal.timeout(1e4)}),e=await r.json().catch(()=>({}));return r.ok?`Card ${e.card.id} is closed. It left the operator's inbox, so nobody will be asked about it again.`:`Error: ${e?.error||`HTTP ${r.status}`}`}catch(r){return`Error: couldn't reach the daemon (${r?.message??r}).`}}if(i!=="create")return`Error: unknown action "${i}". Use create, status or resolve.`;if(!o)return"Error: couldn't tell which agent you are. Pass callerAgentId.";let p=o.channel&&o.chatId&&!w.has(o.channel)?{channel:o.channel,chatId:o.chatId,...o.accountId?{accountId:o.accountId}:{}}:void 0,$={title:t.title,ask:t.ask,recommend:t.recommend,if_silent:t.if_silent,expires:t.expires,source:t.source,choices:t.choices,draft:t.draft,say:t.say,context:t.context,followup:t.followup,raised_by:o.agentId,...p?{reply:p}:{}};try{let n=await d(`${l}/approvals`,{method:"POST",headers:{"Content-Type":"application/json",...u(s.env??process.env)},body:JSON.stringify($),signal:AbortSignal.timeout(1e4)}),a=await n.json().catch(()=>({}));if(!n.ok)return`Error: ${a?.error||`HTTP ${n.status}`}`;let r=a.card;return[`Decision card ${r.id} is in the operator's Approvals inbox.`,`If nobody answers by ${r.expires}, "${r.if_silent}" applies.`,"You will get a message with the result. Tell the requester it is waiting for approval; don't ask the operator again in chat.",`If the operator answers the same thing in chat and you act on it, close the card with {action:"resolve", id:"${r.id}", reason:"approved in chat, done"} so it is not asked again.`].join(" ")}catch(n){return`Error: couldn't reach the daemon (${n?.message??n}).`}}export{b as runApprovalTool};
|
|
4
|
-
//# sourceMappingURL=tool-
|
|
4
|
+
//# sourceMappingURL=tool-ERK543LL.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{b as p}from"./chunk-
|
|
1
|
+
import{b as p}from"./chunk-EV76NT3E.js";import"./chunk-RKPAVWXF.js";import{b as h}from"./chunk-DG2DC43E.js";import"./chunk-WBG6NA7R.js";import"./chunk-SANYTBHX.js";import"./chunk-LJ62ABOZ.js";import"./chunk-VMMCT27Z.js";import"./chunk-3UOTLMXD.js";import"./chunk-FCPTN6NF.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-QIJLFPWE.js";var w=45e3,f=t=>typeof t=="string"?t.trim():"",g={in_progress:"in progress",waiting_owner:"waiting on the owner",waiting_other:"waiting on another agent",needs_attention:"needs attention"};function m(t){return t.length?t.map(e=>{let a=new Date(e.createdAt).toISOString().slice(0,16).replace("T"," "),d=e.state==="waiting_owner"&&e.question?` Question: ${e.question}`:e.state==="needs_attention"&&e.attentionReason?` ${e.attentionReason}`:"",o=String(e.text).replace(/\s+/g," ").trim(),i=[e.promise&&e.owedTo?` Promised to ${e.owedTo}.`:"",e.dueAt?` Due ${new Date(e.dueAt).toISOString().slice(0,16).replace("T"," ")} UTC.`:"",e.closeWhen?` Closes on its check (${e.closeWhen.kind})${e.verifyState?`: ${e.verifyState}`:""}.`:""].join("");return`- ${e.id} [${g[e.state]??e.state}] ${a} UTC, ${e.channel}, ${e.agentId}: ${o.length>160?`${o.slice(0,159)}\u2026`:o}.${d}${i}`}).join(`
|
|
2
2
|
`):"No open requests."}function $(t){return(t??[]).map(e=>`${e.idx}. ${e.name} (${e.agentId}, ${e.kind}) [${e.state}]${e.needsApproval?` approval: ${e.approval}`:""}`)}async function v(t,e){let a=e.fetch??fetch,d=e.daemonUrl.replace(/\/$/,""),o=(f(t.action)||"list").toLowerCase();try{if(o==="list"){let u=await a(`${d}/requests`,{signal:AbortSignal.timeout(1e4)}),r=await u.json().catch(()=>({}));return u.ok?r.enabled?`${r.count} open request${r.count===1?"":"s"}, oldest first.
|
|
3
3
|
${m(r.items??[])}`:"Requests are turned off on this node (requests.enabled), so nothing is recorded.":`Error: ${r?.error||`HTTP ${u.status}`}`}let i=e.env??process.env,l=p(t,i);if(!l)return"Error: couldn't tell which agent you are. Pass callerAgentId.";let c=await a(`${d}/requests`,{method:"POST",headers:{"Content-Type":"application/json",...h(i)},body:JSON.stringify({action:o,agentId:l.agentId,id:t.id,question:t.question,evidence:t.evidence,reason:t.reason,steps:t.steps,step:t.step,status:t.status,note:t.note,home:t.home,owedTo:t.owedTo,text:t.text,due:t.due,closeWhen:t.closeWhen}),signal:AbortSignal.timeout(o==="done"?w:1e4)}),s=await c.json().catch(()=>({}));if(!c.ok)return`Error: ${s?.error||`HTTP ${c.status}`}`;let n=s.request;return o==="accept"&&s.plan?[`Request ${n.id} is open with a plan of ${s.steps.length} steps. The daemon hands each step to its agent in order, nudges a step that goes quiet, and tells the owner when it is finished or blocked.`,...$(s.steps),`Steps the owner approves get a decision card now; an approved message is sent by the daemon itself. Report your own steps with {action:"step", id:"${n.id}", step:<n>, status:"progress"|"done"|"blocked"}.`].join(`
|
|
4
4
|
`):o==="step"?[`Step reported. Plan of ${n.id}:`,...$(s.steps)].join(`
|
|
5
5
|
`):o==="accept"?`Request ${n.id} is open and in progress. Close it with done (and a link to the evidence) or decline (and the reason); it stays on the owner's list until then.`:o==="wait"?`Request ${n.id} is waiting on the owner with your question. Ask them the question now, once.`:o==="promise"?`Promise ${n.id} is open, owed to ${n.owedTo}${n.dueAt?`, due ${new Date(n.dueAt).toISOString().slice(0,16).replace("T"," ")} UTC`:""}. `+(n.closeWhen?"The daemon checks its evidence and closes it once the check is met.":`Close it with {action:"done", id:"${n.id}", evidence:"<link>"} when it is kept.`):o==="done"&&s.verify==="unverified"?`Request ${n.id} stays open: its check could not say whether it is finished (${s.detail}). It is marked unverified; the daemon checks again, and the owner can close it by hand.`:o==="done"?`Request ${n.id} is closed as done${s.verified?" (its check was met)":""}. Evidence: ${n.evidence}`:`Request ${n.id} is closed as declined. Reason: ${n.closeReason}`}catch(i){return`Error: couldn't reach the daemon (${i?.message??i}).`}}export{w as DONE_TIMEOUT_MS,m as describeOpen,$ as describeSteps,v as runRequestTool};
|
|
6
|
-
//# sourceMappingURL=tool-
|
|
6
|
+
//# sourceMappingURL=tool-YOSMTSJM.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-VWTBHLMX.js";import{a as b}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=wiki-
|
|
1
|
+
import"./chunk-VWTBHLMX.js";import{a as b}from"./chunk-VTVEJ3RA.js";import{a}from"./chunk-HP2NWDCS.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import{d as c}from"./chunk-YUY35PY7.js";import"./chunk-SKSYII3K.js";import"./chunk-BPOMIEEE.js";import"./chunk-WPNRDEHW.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-SH5TNMS5.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-6TURWSMN.js";import"./chunk-QD6IICK7.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-4NKPVTVP.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{b as WikiHub,a as WikiStore,c as agenticQuery};
|
|
2
|
+
//# sourceMappingURL=wiki-2LLXQUEP.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentix-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.145.0",
|
|
4
4
|
"description": "The self-hosted agent harness for small teams. Runs a team of AI agents across Telegram, WhatsApp, GitLab, GitHub, crons, webhooks and mesh tasks, on Claude Code, Codex, OpenCode or any LLM API. Web wizard for operators, CLI for engineers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
package/dist/chunk-DPIQCHXB.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import{b as oe,d as ae,h as Wt}from"./chunk-BRK6M6LA.js";import{l as ie,m as se,n as zt}from"./chunk-UIBUZ2N3.js";import{a as re,e as Bt}from"./chunk-2QNT5JDS.js";import{a as f,b as Ht}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var Kt,Xt,Gt,Vt,Zt,Yt,Jt,Qt,en,le,ue=f(()=>{"use strict";Kt=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),Xt=l.object({days:l.array(Kt).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([])}),Vt=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:Xt,utilizationTarget:l.number().min(0).max(1).default(.8)}),Zt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),Yt=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")})]),Jt=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),Qt=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()}),en=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),le=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:Zt,workSource:Yt,roles:l.record(l.string(),Gt).default({}),orgChart:l.record(l.string(),Vt).default({}),projects:l.array(Jt).default([]),contactMap:l.array(Qt).default([]),clients:l.record(l.string(),en).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 d}from"zod";function Hr(r,t){let n=new Set(r.labels||[]);if(r.state==="closed"){let a=t.find(i=>i.kind==="closed");if(a)return a.id}for(let a of t)if(a.kind==="scoped-label"&&a.scopedLabel&&n.has(a.scopedLabel))return a.id;for(let a of t)if(a.kind==="label"&&a.mapsToLabel&&n.has(a.mapsToLabel))return a.id;let o=t.find(a=>a.kind==="open-backlog");if(o){let a=o.scopedPrefix+"::";return[...n].some(s=>s.startsWith(a))?null:o.id}return t[0]?.id??null}function Br(r,t){let n=[],o=[],a=!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"&&(a=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?o.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?o.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(i=!0)),{addLabels:n.length?n:void 0,removeLabels:o.length?o:void 0,closeIssue:a||void 0,reopen:i||void 0}}var tn,nn,rn,on,an,sn,de,ln,ce,me=f(()=>{"use strict";tn=d.object({name:d.string(),color:d.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:d.string().optional()}),nn=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:d.string(),kind:d.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:d.string().optional(),scopedLabel:d.string().optional(),scopedPrefix:d.string().default("Status"),accent:d.string().optional()}),rn=d.object({enabled:d.boolean().default(!0),staleDoingMinutes:d.number().int().min(1).default(45),respectLunchBreak:d.boolean().default(!0),respectSchedule:d.boolean().default(!0),action:d.enum(["badge","notify"]).default("badge")}),on=d.discriminatedUnion("type",[d.object({type:d.literal("gitlab"),projects:d.array(d.string()).min(1)})]),an=[{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"}],sn=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:d.string(),source:on,primaryToolLabel:d.string().optional(),labels:d.array(tn).default([]),columns:d.array(nn).min(1).default(an),timeRangeDays:d.number().int().min(1).max(365).default(30),closedWindowDays:d.number().int().min(1).max(365).default(30),reconciliation:rn.default({})}),de=d.array(sn).default([]),ln=d.object({name:d.string(),url:d.string(),dashboardUrl:d.string().optional(),token:d.string().optional(),dashboardToken:d.string().optional()}),ce=d.object({enabled:d.boolean().default(!1),port:d.number().int().default(4202),bind:d.string().default("127.0.0.1"),token:d.string().optional(),daemonUrl:d.string().default("http://localhost:18800"),daemons:d.array(ln).default([]),draftAgent:d.string().optional()}).default({})});function gn(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 o=mn[n[n.length-1]]??n[n.length-1],a=new Set;for(let i of n.slice(0,-1)){let s=un[i];if(!s)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(a.has(s))return{ok:!1,error:`"${r}" names ${s} twice`};a.add(s)}return fn(o)?!fe(o)&&!["ctrl","opt","cmd"].some(i=>a.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...dn.filter(i=>a.has(i)),o].join("+")}:{ok:!1,error:`"${o}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function ge(r){let t=gn(r);return t.ok?void 0:t.error}function zr(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"},o=r.split("+"),a=o.pop()??"";return o.map(i=>t[i]??i).join("")+(n[a]??a.toUpperCase())}var un,dn,cn,mn,fe,fn,O,pe=f(()=>{"use strict";un={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},dn=["ctrl","opt","shift","cmd"],cn=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],mn={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},fe=r=>/^f([1-9]|1[0-9]|20)$/.test(r),fn=r=>/^[a-z0-9]$/.test(r)||cn.includes(r)||fe(r);O={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function xe(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,o,a]=t.slice(1).map(g=>parseInt(g,16)/255),i=Math.max(n,o,a),s=Math.min(n,o,a),u=i-s;return u<.04?null:((i===n?(o-a)/u%6:i===o?(a-n)/u+2:(n-o)/u+4)*60+360)%360}function pn(r){let t=xe(r);if(t===null)return T.find(a=>a.id==="lagoon");let n=T[0],o=360;for(let a of T){let i=Math.abs(a.hue-t),s=Math.min(i,360-i);s<o&&(n=a,o=s)}return n}function Xr(r,t=L){let n=s=>T.find(u=>u.id===s),o=n(r?.palette);if(o)return{...o,set:!0};let a=r?.color;return{...a&&xe(a)!==null?pn(a):n(t)??n(L),set:!1}}var T,he,be,G,L,ye=f(()=>{"use strict";T=[{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"]}],he=["orb","character"],be=["off","rarely","sometimes","often"],G=T.map(r=>r.id);L="lagoon"});function ke(r){let t=(r.match(/[-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let o=0,a=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])hn.has(i)&&o++,bn.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?a++:xn.test(i)&&(a+=.5);return o===a?null:o>a?"en":"fr"}var hn,bn,xn,we=f(()=>{"use strict";hn=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(" ")),bn=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(" ")),xn=/[éèêëàâçùûîïôœ]/});function Yr(r,t=V){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,o=>o.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 o=n.slice(0,t),a=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(a>=t/2?o.slice(0,a):o.replace(/\s+\S*$/,"")+"...")+" "+yn[ke(o)??"en"]}return n}var V,yn,Se=f(()=>{"use strict";we();V=500,yn={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 eo(r,t=Z){let n=new Set(t.map(_e)),o=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(a,i,s)=>n.has(_e(i??s))?"":a);return!/[\p{L}\p{N}]/u.test(o)}var Z,Qr,_e,Ee=f(()=>{"use strict";Z=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],Qr="I didn't catch that.",_e=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as kn}from"crypto";function Tn(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function ro(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),o=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${o?` (${o})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var N,wn,Sn,_n,En,Te,ve=f(()=>{"use strict";N={enabled:!0,defaultSeconds:120,maxSeconds:1800},wn=80,Sn=/^[a-f0-9]{24}$/,_n=25e3,En=2e3;Te=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??Tn}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...N,...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,o=(A,w)=>({ok:!1,reason:A,error:w,view:this.view()});if(!n.enabled)return o("off","The floor is off on this computer (voice.floor.enabled)");let a=String(t.holder??"").replace(/\s+/g," ").trim().slice(0,wn),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,u=t.id??kn(12).toString("hex");if(!Sn.test(u))return o("invalid","id is 24 hex characters, as a take returned it");if(!a||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return o("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let c=this.current;if(c)return o("held",`The floor is held by ${c.holder}`);let g=this.deps.busy?.();if(g)return o("busy",`The floor is taken by ${g}`);if(s!==null&&!this.alive(s))return o("invalid",`No process ${s} runs on this computer`);let b=this.now(),k={id:u,holder:a,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:b,expiresAt:b+i*1e3};return this.hold=k,this.ended=null,this.arm(),this.changed(),{ok:!0,id:k.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let o=this.settings,a=n??Math.min(o.defaultSeconds,o.maxSeconds);return!Number.isFinite(a)||a<=0||a>o.maxSeconds?null:(this.hold.expiresAt=this.now()+a*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=_n,o){return t!==this.view().seq?Promise.resolve(this.view()):new Promise(a=>{let i=()=>{clearTimeout(s),this.waiters.delete(i),a(this.view())},s=setTimeout(i,n);s.unref?.(),this.waiters.add(i),o?.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")},En),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 m}from"zod";var Re,vn,Ae,Ie=f(()=>{"use strict";Re=m.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),vn=m.object({id:m.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:m.boolean().default(!0),chats:m.array(m.string().min(1)).default([]),senders:m.array(m.string().min(1)).default([]),agent:m.string().min(1),prompt:m.string().max(4e3).optional(),quietHours:m.object({start:Re,end:Re}).optional(),autoAck:m.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),Ae=m.object({enabled:m.boolean().default(!1),secretEnv:m.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:m.number().int().min(0).max(600).default(20),timezone:m.string().optional(),allowAutoAck:m.boolean().default(!1),describeMedia:m.boolean().default(!0),wacli:m.object({bin:m.string().default("wacli"),account:m.string().optional(),store:m.string().optional()}).default({}),rules:m.array(vn).default([])}).default({})});function $e(r){let t=Ce(r.url);if(!/^https?:\/\/\S+$/i.test(t))return"url must be an http(s) address";if(t.length>1e3)return"url is longer than 1000 characters";let n=Ce(r.contains);return n.length>200?"contains is longer than 200 characters":{kind:"url",url:t,...n?{contains:n}:{}}}async function Oe(r,t){let n=t.fetch??fetch,o;try{o=await n(r.url,{signal:AbortSignal.timeout(1e4),redirect:"follow"})}catch(a){return{verdict:"unverifiable",detail:`${r.url} could not be reached: ${String(a?.message??a).slice(0,200)}`}}return o.ok?r.contains&&!(await o.text()).slice(0,1e6).includes(r.contains)?{verdict:"not_met",detail:`${r.url} answered without "${r.contains}"`}:{verdict:"met",detail:`${r.url} answered${r.contains?` with "${r.contains}"`:""}`}:{verdict:"not_met",detail:`${r.url} answered HTTP ${o.status}`}}var Ce,Le=f(()=>{"use strict";Ce=r=>typeof r=="string"?r.trim():""});function je(r,t){let n=Rn(r,t);return n&&n.project.split("/").every(o=>o!=="."&&o!=="..")?n:null}function Rn(r,t){let n=t.match(/^([\w.-]+(?:\/[\w.-]+)+)([#!])(\d+)$/);if(n)return r==="github"&&(n[2]==="!"||n[1].split("/").length!==2)?null:{project:n[1],number:Number(n[3]),mr:n[2]==="!"};let o;try{o=new URL(t)}catch{return null}let a=o.pathname.replace(/\/+$/,"");if(r==="github"){let s=a.match(/^\/([\w.-]+\/[\w.-]+)\/(issues|pull)\/(\d+)$/);return s?{project:s[1],number:Number(s[3]),mr:s[2]==="pull"}:null}let i=a.match(/^\/(.+?)\/-\/(issues|merge_requests)\/(\d+)$/);return i?{project:i[1],number:Number(i[3]),mr:i[2]==="merge_requests"}:null}function De(r){let t=j(r.provider).toLowerCase();if(t!=="github"&&t!=="gitlab")return"provider must be github or gitlab";let n=j(r.ref);if(!n||n.length>500||!je(t,n))return t==="github"?'ref must be "owner/repo#12" or the issue or pull request address':'ref must be "group/project#12" (issue), "group/project!12" (merge request) or its address';let o=j(r.state).toLowerCase();if(o&&!Ne.includes(o))return`state must be one of ${Ne.join(", ")}`;let a=j(r.notePattern);return a.length>200?"notePattern is longer than 200 characters":{kind:"issue",provider:t,ref:n,...o?{state:o}:{},...a?{notePattern:a}:{}}}async function Pe(r,t){if(!t.forge)return{verdict:"unverifiable",detail:`no ${r.provider} connector on this node`};let n=je(r.provider,r.ref);if(!n)return{verdict:"unverifiable",detail:`${r.ref} is not an issue reference`};let o=await t.forge(r.provider,n,{notes:!!r.notePattern});if("error"in o)return{verdict:"unverifiable",detail:`${r.ref}: ${o.error}`};let a=r.state??(r.notePattern?null:"closed");if(a&&An(a,o.state))return{verdict:"met",detail:`${o.url} is ${o.state}`};if(r.notePattern){let i=r.notePattern.toLowerCase();if((o.notes??[]).some(s=>s.slice(0,1e4).toLowerCase().includes(i)))return{verdict:"met",detail:`${o.url} has a note with "${r.notePattern}"`}}return{verdict:"not_met",detail:`${o.url} is ${o.state}${r.notePattern?`, no note has "${r.notePattern}"`:""}`}}function lo(r,t=fetch){let n=async(o,a)=>{let i;try{i=await t(o,{headers:a,signal:AbortSignal.timeout(1e4)})}catch(s){return{ok:!1,error:`could not be reached: ${String(s?.message??s).slice(0,200)}`}}return i.ok?{ok:!0,body:await i.json().catch(()=>null)}:{ok:!1,error:i.status===404?"not found (or not visible to the connector)":`HTTP ${i.status}`}};return async(o,a,i)=>{if(o==="github"){let S=r.github;if(!S)return{error:"no github connector on this node (channels.github or requests.checkers.github)"};let Ut=S.apiUrl.replace(/\/$/,""),K={Accept:"application/vnd.github+json",...S.token?{Authorization:`Bearer ${S.token}`}:{}},X=`${Ut}/repos/${a.project}`,E=await n(`${X}/issues/${a.number}`,K);if(!E.ok)return{error:E.error};let I=E.body?.state==="closed"?"closed":"open";if(E.body?.pull_request&&I==="closed"){let $=await n(`${X}/pulls/${a.number}`,K);$.ok&&$.body?.merged&&(I="merged")}let ne=String(E.body?.html_url??`${a.project}#${a.number}`);if(!i.notes)return{state:I,url:ne};let C=await n(`${X}/issues/${a.number}/comments?per_page=100`,K);return C.ok?{state:I,url:ne,notes:(Array.isArray(C.body)?C.body:[]).map($=>String($?.body??""))}:{error:`its notes: ${C.error}`}}let s=r.gitlab;if(!s)return{error:"no gitlab connector on this node (channels.gitlab or requests.checkers.gitlab)"};let u=s.token?{"PRIVATE-TOKEN":s.token}:{},c=`${s.url.replace(/\/$/,"")}/api/v4/projects/${encodeURIComponent(a.project)}/${a.mr?"merge_requests":"issues"}/${a.number}`,g=await n(c,u);if(!g.ok)return{error:g.error};let b=String(g.body?.state??""),k=b==="merged"?"merged":b==="closed"?"closed":"open",A=String(g.body?.web_url??`${a.project}${a.mr?"!":"#"}${a.number}`);if(!i.notes)return{state:k,url:A};let w=await n(`${c}/notes?per_page=100&sort=desc&order_by=created_at`,u);return w.ok?{state:k,url:A,notes:(Array.isArray(w.body)?w.body:[]).map(S=>String(S?.body??"")).reverse()}:{error:`its notes: ${w.error}`}}}var Ne,j,An,Me=f(()=>{"use strict";Ne=["open","closed","merged"],j=r=>typeof r=="string"?r.trim():"";An=(r,t)=>r===t||r==="closed"&&t==="merged"});import{execFile as In}from"child_process";function qe(r,t){let n=Y(r.repo),o=Object.keys(t.repos);if(!n||!Object.prototype.hasOwnProperty.call(t.repos,n))return o.length?`repo must be one of ${o.join(", ")} (requests.checkers.repos)`:"no repos are set up for this check on this node (requests.checkers.repos)";let a=Y(r.commit);if(!$n.test(a))return"commit must be a commit hash (7 to 64 hex characters)";let i=Y(r.ref);return i&&!On.test(i)?"ref must be a branch or tag name, for example main or origin/main":{kind:"git-ancestor",repo:n,commit:a,...i?{ref:i}:{}}}async function Fe(r,t){let n=t.settings.repos[r.repo];if(!n)return{verdict:"unverifiable",detail:`no repo "${r.repo}" in requests.checkers.repos on this node`};let o=r.ref??"HEAD",{code:a,stderr:i}=await(t.git??Ln)(n,["merge-base","--is-ancestor",r.commit,o]);if(a===0)return{verdict:"met",detail:`commit ${r.commit} is in ${o} of ${r.repo}`};if(a===1)return{verdict:"not_met",detail:`commit ${r.commit} is not in ${o} of ${r.repo} yet`};let s=i.replace(/\s+/g," ").trim().slice(0,200)||`git exited with ${a}`;return{verdict:"unverifiable",detail:`could not check ${r.commit} in ${r.repo}: ${s}`}}var Cn,$n,On,Y,Ln,Ue=f(()=>{"use strict";Cn=1e4,$n=/^[0-9a-f]{7,64}$/i,On=/^(?!-)(?!.*\.\.)[A-Za-z0-9._\/-]{1,200}$/,Y=r=>typeof r=="string"?r.trim():"";Ln=(r,t)=>new Promise(n=>{In("git",["-C",r,...t],{timeout:Cn,windowsHide:!0},(o,a,i)=>{n({code:o?typeof o.code=="number"?o.code:-1:0,stderr:String(i??"")})})})});function He(r,t){let n=D(r.channel).toLowerCase(),o=D(r.chatId),a=D(r.from);if(!n||!o)return"a reply check needs channel and chatId: the chat the answer arrives in";if(!a)return"a reply check needs from: the id of the person who answers (people)";if([n,o,a].some(s=>s.length>200))return"channel, chatId and from are at most 200 characters";let i=t;if(r.after!==void 0){let s=typeof r.after=="number"?r.after:Date.parse(D(r.after));if(!Number.isFinite(s)||s<0)return"after must be epoch milliseconds or an ISO date";i=s}return{kind:"reply",channel:n,chatId:o,from:a,after:i}}async function Be(r,t){if(!t.inbound)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let n=r.after??0,o=t.inbound(r.channel,r.chatId,n,r.from);if(!o)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let a=r.from.toLowerCase(),i=o.find(s=>s.at>n&&(s.person??"").toLowerCase()===a);return i?{verdict:"met",detail:`${r.from} wrote on ${r.channel} chat ${r.chatId} at ${new Date(i.at).toISOString().slice(0,16).replace("T"," ")} UTC`}:{verdict:"not_met",detail:`no message from ${r.from} on ${r.channel} chat ${r.chatId} yet`}}function fo(r){return(t,n,o,a)=>{try{return r.prepare(`SELECT person, started_at AS at FROM task_traces
|
|
2
|
-
WHERE (channel = ? OR channel LIKE ? ESCAPE '\\') AND chat_id = ? AND started_at > ? AND lower(person) = lower(?)
|
|
3
|
-
ORDER BY started_at LIMIT ?`).all(t,`${t.replace(/[\\%_]/g,"\\$&")}@%`,n,o,a,Nn)}catch{return null}}}var D,Nn,We=f(()=>{"use strict";D=r=>typeof r=="string"?r.trim():"";Nn=5});function yo(r,t=jn,n=Date.now()){if(!r||typeof r!="object"||Array.isArray(r))return"closeWhen must be an object with a kind: url, issue, git-ancestor or reply";let o=r,a=typeof o.kind=="string"?o.kind.trim().toLowerCase():"";if(!P.includes(a))return`closeWhen.kind must be one of ${P.join(", ")}`;if(!t.enabled.includes(a))return`the ${a} check is turned off on this node (requests.checkers.enabled)`;let i=a==="url"?$e(o):a==="issue"?De(o):a==="git-ancestor"?qe(o,t):He(o,n);return typeof i=="string"?`closeWhen: ${i}`:JSON.stringify(i).length>ze?`closeWhen is longer than ${ze} characters`:i}async function ko(r,t){if(!t.settings.enabled.includes(r.kind))return{verdict:"unverifiable",detail:`the ${r.kind} check is turned off on this node (requests.checkers.enabled)`};try{switch(r.kind){case"url":return await Oe(r,t);case"issue":return await Pe(r,t);case"git-ancestor":return await Fe(r,t);case"reply":return await Be(r,t)}}catch(n){return{verdict:"unverifiable",detail:`the ${r.kind} check failed: ${String(n?.message??n).slice(0,200)}`}}}function wo(r){switch(r.kind){case"url":return`${r.url} answers${r.contains?` with "${r.contains}"`:""}`;case"issue":{let t=[r.state||!r.notePattern?`is ${r.state??"closed"}`:null,r.notePattern?`has a note with "${r.notePattern}"`:null];return`${r.provider} ${r.ref} ${t.filter(Boolean).join(" or ")}`}case"git-ancestor":return`commit ${r.commit} is in ${r.ref??"HEAD"} of ${r.repo}`;case"reply":return`${r.from} replies on ${r.channel} chat ${r.chatId}`}}function Ke(r){if(!r)return null;try{let t=JSON.parse(r);return t&&typeof t=="object"&&P.includes(t.kind)?t:null}catch{return null}}var P,jn,ze,Xe=f(()=>{"use strict";Le();Me();Ue();We();P=["url","issue","git-ancestor","reply"],jn={enabled:[...P],checkEveryMinutes:10,repos:{}},ze=2e3});function Pn(r){r.exec(`
|
|
4
|
-
CREATE TABLE IF NOT EXISTS requests (
|
|
5
|
-
id TEXT PRIMARY KEY,
|
|
6
|
-
state TEXT NOT NULL,
|
|
7
|
-
channel TEXT NOT NULL,
|
|
8
|
-
chat_id TEXT NOT NULL,
|
|
9
|
-
sender TEXT,
|
|
10
|
-
agent_id TEXT NOT NULL,
|
|
11
|
-
text TEXT NOT NULL,
|
|
12
|
-
created_at INTEGER NOT NULL,
|
|
13
|
-
updated_at INTEGER NOT NULL,
|
|
14
|
-
attention_reason TEXT,
|
|
15
|
-
notified_at INTEGER,
|
|
16
|
-
question TEXT,
|
|
17
|
-
closed_at INTEGER,
|
|
18
|
-
evidence TEXT,
|
|
19
|
-
close_reason TEXT
|
|
20
|
-
);
|
|
21
|
-
CREATE INDEX IF NOT EXISTS idx_requests_state_created ON requests(state, created_at);
|
|
22
|
-
CREATE INDEX IF NOT EXISTS idx_requests_chat ON requests(agent_id, channel, chat_id, created_at);
|
|
23
|
-
CREATE TABLE IF NOT EXISTS request_links (
|
|
24
|
-
request_id TEXT NOT NULL,
|
|
25
|
-
kind TEXT NOT NULL,
|
|
26
|
-
ref TEXT NOT NULL,
|
|
27
|
-
at INTEGER NOT NULL,
|
|
28
|
-
PRIMARY KEY (kind, ref),
|
|
29
|
-
FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
|
|
30
|
-
);
|
|
31
|
-
CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
|
|
32
|
-
`),se(r,"requests",ie);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,o]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"],["home_kind","TEXT"],["home_link","TEXT"],["owed_to","TEXT"],["promise","INTEGER"],["due_at","INTEGER"],["close_when","TEXT"],["checked_at","INTEGER"],["verified_at","INTEGER"],["verify_state","TEXT"],["verify_detail","TEXT"]])if(!t.some(a=>a.name===n))try{r.exec(`ALTER TABLE requests ADD COLUMN ${n} ${o}`)}catch(a){if(!/duplicate column name/i.test(String(a?.message)))throw a}}function Ro(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function x(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,owedTo:r.owed_to??null,promise:!!r.promise,dueAt:r.due_at??null,closeWhen:Ke(r.close_when),checkedAt:r.checked_at??null,verifiedAt:r.verified_at??null,verifyState:r.verify_state??null,verifyDetail:r.verify_detail??null}}var y,p,To,Dn,J,vo,M,v,h,Ge,Ve=f(()=>{"use strict";zt();Xe();y=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],To=["issue","idea","approval","erp","card"],Dn=["issue","idea","approval","erp"],J=500,vo="owner",M=4e3,v=500;h=r=>Array(r).fill("?").join(","),Ge=class{constructor(t){this.db=t;Pn(t),t.pragma("foreign_keys = ON")}addCandidate(t){let n=t.person??t.sender??null;this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at, owed_to)
|
|
33
|
-
VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,M),t.now,t.now,n),this.link(t.id,"run",t.runId,t.now)}addPromise(t){this.db.prepare(`INSERT INTO requests (id, state, channel, chat_id, agent_id, text, created_at, updated_at, owed_to, promise, due_at, close_when, home_kind, home_link)
|
|
34
|
-
VALUES (?, 'in_progress', ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.agentId,t.text.slice(0,M),t.now,t.now,t.owedTo,t.dueAt??null,t.closeWhen?JSON.stringify(t.closeWhen):null,t.home?.kind??null,t.home?t.home.link.slice(0,J):null),t.home&&this.linkHome(t.id,t.home,t.now)}openPromises(t){return this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE agent_id = ? AND promise = 1 AND state IN (${h(y.length)})`).get(t,...y).n}setLoop(t,n,o){n.dueAt!==void 0&&this.db.prepare("UPDATE requests SET due_at = ?, updated_at = ? WHERE id = ?").run(n.dueAt,o,t),n.closeWhen!==void 0&&this.db.prepare("UPDATE requests SET close_when = ?, verify_state = NULL, verify_detail = NULL, updated_at = ? WHERE id = ?").run(n.closeWhen?JSON.stringify(n.closeWhen):null,o,t)}markChecked(t,n,o,a){this.db.prepare("UPDATE requests SET checked_at = ?, verify_state = ?, verify_detail = ? WHERE id = ?").run(a,n,o.slice(0,v)||null,t)}closeVerified(t,n,o){let a=n.trim().slice(0,v)||"the check was met";return this.db.prepare(`UPDATE requests SET state = 'done', closed_at = ?, updated_at = ?, evidence = ?, close_reason = NULL,
|
|
35
|
-
checked_at = ?, verified_at = ?, verify_state = 'verified', verify_detail = ?
|
|
36
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(o,o,a,o,o,a,t,...p).changes>0}dueForCheck(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(y.length)}) AND close_when IS NOT NULL
|
|
37
|
-
AND (checked_at IS NULL OR checked_at < ?) ORDER BY COALESCE(checked_at, 0), created_at LIMIT ?`).all(...y,t,n).map(x)}overdue(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN ('in_progress', 'waiting_other') AND due_at IS NOT NULL AND due_at < ?
|
|
38
|
-
AND (updated_at <= due_at OR updated_at < ?)
|
|
39
|
-
ORDER BY due_at, rowid`).all(t,n).map(x)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?x(n):null}byLink(t,n){let o=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 o?x(o):null}link(t,n,o,a){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(t,n,o,a)}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
|
|
40
|
-
FROM request_links l JOIN task_traces t ON t.task_id = l.ref
|
|
41
|
-
WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
|
|
42
|
-
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,o="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
|
|
43
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(o,n,t,...p)}waitOnOwner(t,n,o){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
|
|
44
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(o,n.slice(0,M),t,...p)}needsAttention(t,n,o){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
|
|
45
|
-
WHERE id = ? AND state NOT IN ('needs_attention', ${h(p.length)})`).run(o,n.replace(/\s+/g," ").trim().slice(0,v),t,...p).changes>0}close(t,n,o,a){let i=o.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 = ?
|
|
46
|
-
WHERE id = ? AND state NOT IN (${h(p.length)})`).run(n,a,a,n==="done"?i.slice(0,v):null,n==="done"?null:i.slice(0,v),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(x)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(t.length)}) AND updated_at < ? AND due_at IS NULL ORDER BY created_at, rowid`).all(...t,n).map(x)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(x)}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(x)}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(x)}setHome(t,n,o,a={}){let i=n.link.slice(0,J);a.touch===!1?this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ? WHERE id = ?").run(n.kind,i,t):this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ?, updated_at = ? WHERE id = ?").run(n.kind,i,o,t),this.linkHome(t,n,o)}linkHome(t,n,o){Dn.includes(n.kind)&&this.link(t,n.kind,n.link.slice(0,J),o)}query(t){let n=[`state IN (${h(t.states.length)})`],o=[...t.states];t.since!==void 0&&(n.push("created_at >= ?"),o.push(t.since)),t.closedSince!==void 0&&(n.push("closed_at >= ?"),o.push(t.closedSince));let a=n.join(" AND "),i=this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE ${a}`).get(...o).n,s=t.newest?"DESC":"ASC",u=this.db.prepare(`SELECT * FROM requests WHERE ${a} ORDER BY created_at ${s}, rowid ${s} LIMIT ? OFFSET ?`).all(...o,t.limit,t.offset??0).map(x);return{items:t.newest?u.reverse():u,total:i}}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
|
|
47
|
-
WHERE id = ? AND state = 'needs_attention'`).run(n,n,t).changes>0}handOff(t,n,o,a){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
|
|
48
|
-
question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
|
|
49
|
-
WHERE id = ? AND state IN (${h(y.length)})`).run(n,a,a,o.trim().slice(0,M)||null,t,...y).changes>0}setNoteSaid(t,n,o){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${o?" AND pickup_at IS NULL":""}`).run(o?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(x).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 Co(r){return Object.assign({channel:Je,chatId:r,sender:"operator"},{[Qe]:!0})}function $o(r){return!!r&&r[Qe]===!0}function Fn(r,t,n,o=!1){let a=q(t);if(r.channels.length&&!r.channels.map(q).includes(a))return!1;if(F.has(a))return o&&!Mn.has((n?.name??"").toLowerCase());let i=qn.has(a)?n?.username:n?.id,s=i?Ze(a,i):"";return s?r.from.some(u=>{let c=u.trim().toLowerCase(),g=c.indexOf(":");return g>0&&c.slice(0,g)===a&&Ze(a,c.slice(g+1))===s}):!1}function Oo(r){if(!r)return;let t=o=>typeof o=="string"&&o?o.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 Un(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var Je,Qe,F,Mn,q,qn,Ze,_,R,Ye,et=f(()=>{"use strict";Ve();Je="requests",Qe=Symbol("requests.pickup");F=new Set(["voice","app","dashboard","webrtc"]),Mn=new Set(["camera"]),q=r=>r.toLowerCase().split("@")[0],qn=new Set(["github","gitlab"]),Ze=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");_=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},R=(r,t,n)=>`${r}\0${t}\0${n}`,Ye=class{constructor(t,n,o,a=Date.now){this.store=t;this.settings=n;this.log=o;this.now=a}live=new Map;guard(t,n){try{n()}catch(o){this.log(`[requests] ${t} failed: ${o?.message??o}`)}}isListedOwner(t){let n=q(t.channel),o=this.settings().channels;return o.length&&!o.map(q).includes(n)?!1:t.person?.role==="owner"&&!F.has(n)}liveRequestId(t,n,o){return this.live.get(R(t,n,o))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),o=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,a=R(t.agentId,t.channel,t.chatId);if(o){this.store.link(o.id,"run",t.taskId,n),o.state==="candidate"?this.store.touch(o.id,n):this.store.progress(o.id,n),this.live.set(a,{requestId:o.id,runId:t.taskId});return}let i=t.pickup&&t.channel===Je?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(a,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Fn(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(a,{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=R(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let o=this.store.byLink("run",t.taskId);if(!o)return;let a=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Un(t.error);this.store.needsAttention(o.id,`${t.agentId} ${i}: ${_(t.error)}`,a)&&this.log(`[requests] ${o.id} needs attention: run ${t.taskId} ${i}`);return}o.state==="candidate"?this.store.discardCandidate(o.id):this.store.touch(o.id,a)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(R(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let o=this.now();this.store.link(n.requestId,"delegation",t.id,o),this.store.progress(n.requestId,o,"waiting_other")})}delegationDone(t,n,o){this.guard("delegation end",()=>{let a=this.store.byLink("delegation",t.id);if(!a)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(a.id,i);return}let u={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(a.id,`The work handed to ${s} ${u}: ${_(o)}`,i)&&this.log(`[requests] ${a.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,o){this.guard("delegation relay",()=>{let a=this.store.byLink("delegation",t.id);if(!a)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(a.id,`The answer from ${i} was not passed on after a restart (${_(o)}). It said: ${_(n)}`,this.now())&&this.log(`[requests] ${a.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let o=this.live.get(R(t.raised_by,n.channel,n.chatId))?.requestId;if(!o)return;let a=this.now();this.store.link(o,"card",t.id,a),this.store.waitOnOwner(o,t.ask,a)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let o=this.now(),a=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,o):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${_(t.ask)}); "${a}" was applied`,o)&&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 o=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,o):this.store.progress(n.id,o):(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 (${_(t.reason)})`,o)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Hn,timingSafeEqual as nt}from"crypto";import{chmodSync as Bn,existsSync as Wn,mkdirSync as zn,readFileSync as Kn,writeFileSync as Xn}from"fs";import{networkInterfaces as Gn}from"os";import{dirname as Vn,resolve as Zn}from"path";function Mo(r){return Object.assign(r,{[rt]:!0})}function ot(r){return!!r&&r[rt]===!0}function Jn(r=process.cwd()){return Zn(r,".agentx","operator.key")}function qo(r=process.cwd(),t={}){let n=Jn(r);try{if(Wn(n)){let a=Kn(n,"utf-8").trim();if(a)return a}if(!t.create)return null;let o=Hn(32).toString("hex");return zn(Vn(n),{recursive:!0}),Xn(n,o+`
|
|
50
|
-
`,{mode:384}),Bn(n,384),o}catch{return null}}function Qn(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let o=Buffer.from(r),a=Buffer.from(n.trim());return o.length===a.length&&nt(o,a)}function tr(r,t,n,o){if(!r||typeof r!="object")return!1;let a=String(r.channel??"").toLowerCase().split("@")[0];return o.has(a)?Qn(n,t[Yn]):!1}function nr(r,t){let n=r[er];if((Array.isArray(n)?n[0]:n)!=="1")return!1;let o=r.authorization,a=(Array.isArray(o)?o[0]:o)||"",i=a.toLowerCase().startsWith("bearer ")?a.slice(7).trim():"";if(!i)return!1;let s=Buffer.from(i);for(let u of t){if(!u)continue;let c=Buffer.from(u);if(c.length===s.length&&nt(c,s))return!0}return!1}function rr(r,t=or()){let n=tt(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let o of t)if(tt(o)===n)return!0;return!1}function or(){return Object.values(Gn()).flatMap(r=>(r??[]).map(t=>t.address))}function Fo(r,t,n){if(tr(r,t.headers,n.key,n.operatorChannels))return!0;if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return!n.operatorChannels.has(o)||rr(t.remoteAddress,n.ownAddresses)?!1:nr(t.headers,n.peerTokens)}var Yn,rt,er,tt,at=f(()=>{"use strict";Yn="x-agentx-operator",rt=Symbol("requests.operator");er="x-agentx-operator-vouch";tt=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function Ko(r,t){return r.find(n=>n.id===t)?.name??(t===U?"Owner":t)}function it(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function st(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=Q(r.slice(0,t).trim()),o=it(n,r.slice(t+1));return o?{channel:n,value:o}:null}function lt(r){let t=new Set,n=new Map;for(let o of r){if(t.has(o.id))return`person "${o.id}" is listed twice`;if(t.add(o.id),o.id===U&&o.role!=="owner")return`the id "${U}" is kept for a person with the owner role`;for(let a of o.identities){let i=st(a);if(!i)return`identity "${a}" of "${o.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,u=n.get(s);if(u&&u!==o.id)return`identity "${a}" belongs to both "${u}" and "${o.id}"`;n.set(s,o.id)}}return null}function ar(r,t,n){let o=Q(t),i=(o==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>it(o,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(u=>{let c=st(u);return!!c&&c.channel===o&&i.includes(c.value)}))??null:null}function ir(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:U,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function ut(r,t){let n=oe(t);if(n)return n.person?{id:n.person}:null;if(!t||ae(t)!=="human")return null;let o=String(t.channel??"");if(F.has(Q(o)))return ot(t)?ir(r):null;let a=s=>typeof s=="string"?s:void 0,i=ar(r,o,{id:a(t.senderId),username:a(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function sr(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Xo(r,t,n){let o=ut(r,n);if(!o)return null;let a=r.find(s=>s.id===o.id);if(!a||sr(a,t))return null;let i=(a.agents??[]).join(", ");return{person:a,note:`${a.name}, you can reach ${i} here, not ${t}. Ask the owner if you need ${t}.`}}function Go(r,t){let n=r.trim().split("*").map(o=>o.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function Vo(r,t){let n=ut(r,t);if(!n)return null;let o=r.find(s=>s.id===n.id);if(!o||o.role==="owner")return null;let a=o.deny?.tools??[],i=o.deny?.skills??[];return!a.length&&!i.length?null:{personId:o.id,name:o.name,tools:[...a],skills:[...i]}}var zo,U,Q,dt=f(()=>{"use strict";Wt();et();at();zo=["owner","member","client","guest"],U="owner";Q=r=>r.toLowerCase().split("@")[0]});function Jo(r){return typeof r=="string"&&ur.includes(r)}function ct(r){let t=new Set(lr);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var lr,ur,Yo,mt=f(()=>{"use strict";lr=["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"],ur=["read","full"],Yo=["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 Pr={};Ht(Pr,{INTEGRATION_KINDS:()=>br,WIKI_CONTRIBUTE_JOB:()=>Dt,WIKI_CONTRIBUTE_MERGE_JOB:()=>Pt,WIKI_SUMMARIZE_JOB:()=>ee,approvalsConfigSchema:()=>Nt,callsSchema:()=>Tt,cameraBotSchema:()=>_t,daemonConfigSchema:()=>jt,eventSubscriptionSchema:()=>St,expandEnvVars:()=>z,isCronExpression:()=>Et,loadDaemonConfig:()=>jr,membersConfigSchema:()=>$t,peopleConfigSchema:()=>Ct,personSchema:()=>It,qualityReportConfigSchema:()=>Lt,requestStatusConfigSchema:()=>Ot,requestsConfigSchema:()=>At,reviewGateConfigSchema:()=>vt,validateWorkspaces:()=>Dr,watchersConfigSchema:()=>Rt,withContributionJobs:()=>Mt,withSummariesJob:()=>qt});import{z as e}from"zod";import{readFileSync as xt,existsSync as B}from"fs";import{resolve as W}from"path";function dr(r){let t=W(r,".env");if(!B(t))return;let n=xt(t,"utf-8");for(let o of n.split(`
|
|
51
|
-
`)){let a=o.trim();if(!a||a.startsWith("#"))continue;let i=a.indexOf("=");if(i===-1)continue;let s=a.slice(0,i).trim(),u=a.slice(i+1).trim();process.env[s]||(process.env[s]=u)}}function Et(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((o,a)=>o.split(",").every(i=>{let s=/^(\*|(\d+)(?:-(\d+))?)(?:\/(\d+))?$/.exec(i);if(!s)return!1;let[u,c]=t[a],g=s[2]===void 0?u:Number(s[2]),b=s[3]===void 0?g:Number(s[3]),k=s[4]===void 0?1:Number(s[4]);return g>=u&&b<=c&&g<=b&&k>=1}))}function wr(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function z(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(z);if(r!==null&&typeof r=="object"){let t={};for(let[n,o]of Object.entries(r))t[n]=z(o);return t}return r}function Nr(r,t){let n=[],o=new Set;for(let a of r){let i=a.path.join("."),s=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(s&&a.message.toLowerCase().includes("required")){let u=s[1],c=`tg:${u}`;if(o.has(c))continue;o.add(c),n.push(`Hint: Telegram account "${u}" is enabled but has no bot token.
|
|
52
|
-
Either:
|
|
53
|
-
A) Open ${t} and set channels.telegram.accounts.${u}.token to your bot token (or "\${TG_${u.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
|
|
54
|
-
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.${u}).`)}}return n}function jr(r){let t=r?[r]:[W(process.cwd(),"agentx.json"),W(process.cwd(),".agentx/config.json")];dr(process.cwd());let n,o;for(let u of t)if(B(u)){n=xt(u,"utf-8"),o=u;break}if(!n||!o)throw new Error(`No config found. Create agentx.json or .agentx/config.json
|
|
55
|
-
Searched: ${t.join(", ")}`);let a;try{a=JSON.parse(n)}catch(u){throw new Error(`Invalid JSON in ${o}: ${u.message}`)}let i=z(a),s=jt.safeParse(i);if(!s.success){let u=s.error.issues.map(b=>` ${b.path.join(".")}: ${b.message}`).join(`
|
|
56
|
-
`),c=Nr(s.error.issues,o),g=c.length?`
|
|
57
|
-
|
|
58
|
-
${c.join(`
|
|
59
|
-
|
|
60
|
-
`)}`:"";throw new Error(`Config validation failed (${o}):
|
|
61
|
-
${u}${g}`)}return qt(Mt(s.data))}function Dr(r){let t=[];for(let[n,o]of Object.entries(r.agents)){if(!B(o.workspace)){t.push(`Agent "${n}": workspace not found at ${o.workspace}`);continue}if(o.tier==="claude-code"){let s=W(o.workspace,".claude");B(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${o.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let a=o.provider||"claude",i=r.providers[a];!["claude-code","codex-cli","opencode"].includes(o.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${a}" has no API key configured. Set providers.${a}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,o]of Object.entries(r.crons))r.agents[o.agent]||t.push(`Cron "${n}": references unknown agent "${o.agent}"`);if(r.channels.telegram.enabled)for(let[n,o]of Object.entries(r.channels.telegram.accounts))r.agents[o.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${o.agentBinding}"`);return t}function Mt(r,t=Ft()){let n=Object.entries(r.agents).filter(([,s])=>s.wiki?.contribute?.enabled).map(([s])=>s).sort();if(n.length===0)return r;let o=r.wiki.contributions,a=(s,u)=>te.parse({schedule:s,timezone:o.timezone,agent:n[0],command:u,timeout:3600,onError:"log"}),i={[Dt]:a(o.schedule,`${t} wiki contribute --all`),[Pt]:a(o.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function qt(r,t=Ft()){let n=r.wiki.summaries,o=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!o)return r;let a=te.safeParse({schedule:n.schedule,timezone:n.timezone,agent:o,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!a.success)throw new Error(`wiki.summaries: the ${ee} job can't be built: ${a.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[ee]:a.data,...r.crons}}}function Ft(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var ft,cr,mr,fr,gr,pr,hr,br,yt,kt,H,wt,St,xr,yr,_t,kr,te,gt,pt,ht,Sr,_r,Er,Tr,vr,Rr,Ar,Ir,Cr,Tt,$r,Or,Lr,vt,Rt,At,It,Ct,$t,Ot,bt,Lt,Nt,jt,Dt,Pt,ee,Mr=f(()=>{ue();me();Bt();pe();ye();Se();Ee();ve();Ie();dt();mt();ft=e.array(e.string().min(1)).superRefine((r,t)=>{let n=ct(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__".`})}),cr=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),mr=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),fr=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),gr=e.union([fr,mr]),pr=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(),hr=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:pr.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),br=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],yt=e.enum(["system","elevenlabs"]),kt=e.union([e.string(),e.record(e.string(),e.string())]),H=e.string().superRefine((r,t)=>{let n=ge(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),wt=e.object({provider:yt.optional(),system:kt.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:H.optional()}),St=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)}),xr=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(),gr).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(St).default([]),integrations:e.array(hr).default([]),voice:wt.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(G).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),yr=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),_t=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({}),kr=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),yr).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:_t}).default({})}).default({})}),te=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:re.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)"});gt=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),pt=e.union([gt,e.object({repo:gt,about:e.string().max(200).optional()})]),ht={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},Sr=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...ht,repos:e.array(pt).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...ht,repos:e.array(pt).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),_r=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"}),Er=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()}),Tr=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),vr=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),Rr=e.object({enabled:e.boolean().default(!1),peers:e.array(Tr).default([]),inboxes:e.array(vr).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({})}),Ar=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({}),Ir=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({}),Cr=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(),Ir).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),Tt=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({}),$r=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({}),Or=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Lr=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-]*$/),Or).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({}),vt=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({}),Rt=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"}),At=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({}),checkers:e.object({enabled:e.array(e.enum(["url","issue","git-ancestor","reply"])).default(["url","issue","git-ancestor","reply"]),checkEveryMinutes:e.number().positive().max(24*60).default(10),repos:e.record(e.string(),e.string().min(1)).default({}),github:e.object({apiUrl:e.string().url().default("https://api.github.com"),token:e.string().optional()}).optional(),gitlab:e.object({url:e.string().url().optional(),token:e.string().optional()}).optional()}).default({})}).default({}),It=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({})}),Ct=e.array(It).default([]).superRefine((r,t)=>{let n=lt(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),$t=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ot=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),bt=e.string().regex(/^\d{4}-\d{2}-\d{2}$/,"use YYYY-MM-DD"),Lt=e.object({enabled:e.boolean().default(!1),repo:e.string().regex(/^[\w.-]+\/[\w.-]+$/,"use owner/name").optional(),issue:e.number().int().positive().optional(),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("08:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),command:e.array(e.string().min(1)).min(1).default(["agentx","quality","report","--public"]),baseline:e.string().regex(/^[\w.-]{1,64}$/,"use letters, digits, dot, dash or underscore").default("baseline"),timeoutSeconds:e.number().int().min(10).max(3600).default(600),gates:e.array(e.object({id:e.string().min(1),label:e.string().min(1).optional(),since:bt,until:bt.optional()})).default([])}).default({}).superRefine((r,t)=>{r.enabled&&(!r.repo||!r.issue)&&t.addIssue({code:e.ZodIssueCode.custom,message:"qualityReport.enabled needs repo and issue"})}),Nt=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({}),jt=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(),cr).default({}),agents:e.record(e.string(),xr).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(Sr).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()===""||Et(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(wr,'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:kr.default({}),crons:e.record(e.string(),te).default({}),wikiNotes:_r.default({}),services:e.record(e.string(),Er).default({}),notifications:$r,calls:Tt,whatsappTriage:Ae,approvals:Nt,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:vt}).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:At,watchers:Rt,people:Ct,members:$t,requestStatus:Ot,qualityReport:Lt,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:Lr,mesh:Rr.default({}),meshVoices:e.record(e.string(),wt.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:yt.default("system"),fallback:e.enum(["system","none"]).default("system"),system:kt.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(V),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(Z)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:H.default(O.talk),stop:H.default(O.stop),paste:H.default(O.paste)}).default({}),look:e.enum(he).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(be).default("sometimes"),palette:e.enum(G).default(L),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(N.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(N.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:le.optional(),boards:de,dashboard:ce,graph:Ar,decisions:Cr,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:ft.default([]),agentxToolsByChannel:e.record(ft).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({})});Dt="wiki-contribute",Pt="wiki-contribute-merge";ee="wiki-summarize"});export{Hr as a,Br as b,me as c,gn as d,zr as e,O as f,pe as g,T as h,he as i,be as j,G as k,Xr as l,ye as m,ke as n,we as o,Yr as p,Se as q,Qr as r,eo as s,Ee as t,Te as u,ro as v,ve as w,Ae as x,Ie as y,Oe as z,Le as A,lo as B,Me as C,fo as D,We as E,P as F,jn as G,yo as H,ko as I,wo as J,Xe as K,y as L,p as M,To as N,J as O,vo as P,M as Q,Ro as R,Ge as S,Ve as T,Co as U,$o as V,F as W,Oo as X,Ye as Y,et as Z,Yn as _,Mo as $,ot as aa,qo as ba,tr as ca,Fo as da,at as ea,zo as fa,U as ga,Ko as ha,st as ia,ar as ja,ir as ka,ut as la,Xo as ma,Go as na,Vo as oa,dt as pa,ur as qa,Yo as ra,Jo as sa,mt as ta,br as ua,St as va,_t as wa,Et as xa,Tt as ya,vt as za,Rt as Aa,At as Ba,It as Ca,Ct as Da,$t as Ea,Ot as Fa,Lt as Ga,Nt as Ha,jt as Ia,z as Ja,jr as Ka,Dr as La,Dt as Ma,Pt as Na,Mt as Oa,ee as Pa,qt as Qa,Pr as Ra,Mr as Sa};
|
|
62
|
-
//# sourceMappingURL=chunk-DPIQCHXB.js.map
|