agentix-cli 0.133.0 → 0.134.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/{App-WQPA77VJ.js → App-4UVAI5C5.js} +2 -2
  2. package/dist/{ChatApp-TGW66I4Y.js → ChatApp-COO67WIR.js} +2 -2
  3. package/dist/absorb-eval-WU7JR3BT.js +2 -0
  4. package/dist/{agent-FWHYHXWC.js → agent-2GPJGHHG.js} +2 -2
  5. package/dist/{board-dashboard-GKE4KWJH.js → board-dashboard-PUQPL4AX.js} +24 -8
  6. package/dist/board-dashboard-PUQPL4AX.js.map +1 -0
  7. package/dist/{chunk-ZN5DC6WS.js → chunk-3XVST5XX.js} +2 -2
  8. package/dist/{note-reader-LPPIYYLT.js → chunk-4LWFJ4MZ.js} +3 -3
  9. package/dist/{note-reader-LPPIYYLT.js.map → chunk-4LWFJ4MZ.js.map} +1 -1
  10. package/dist/{chunk-F5PVUB4Y.js → chunk-4XMALK7X.js} +2 -2
  11. package/dist/{chunk-VH2ASPFQ.js → chunk-AHO4CQRK.js} +2 -2
  12. package/dist/chunk-DDEDSYLF.js +105 -0
  13. package/dist/chunk-DDEDSYLF.js.map +1 -0
  14. package/dist/{chunk-2BF6HJJD.js → chunk-DYGQF3MI.js} +4 -4
  15. package/dist/chunk-DYGQF3MI.js.map +1 -0
  16. package/dist/{chunk-JA5Y4LDP.js → chunk-ERULJ2ZL.js} +2 -2
  17. package/dist/chunk-FEEXOWK5.js +41 -0
  18. package/dist/chunk-FEEXOWK5.js.map +1 -0
  19. package/dist/{chunk-RJFPCW7T.js → chunk-FWDRBUMS.js} +2 -2
  20. package/dist/chunk-G4HDRJVN.js +87 -0
  21. package/dist/chunk-G4HDRJVN.js.map +1 -0
  22. package/dist/{chunk-KUOH5MFS.js → chunk-K445URSN.js} +2 -2
  23. package/dist/{chunk-D5IHICX3.js → chunk-LUYN6RAC.js} +2 -2
  24. package/dist/{chunk-4NEO5KB2.js → chunk-MM3F74K4.js} +15 -15
  25. package/dist/{chunk-4NEO5KB2.js.map → chunk-MM3F74K4.js.map} +1 -1
  26. package/dist/{chunk-F7GKG5ZO.js → chunk-NXRSIWQA.js} +3 -3
  27. package/dist/chunk-NXRSIWQA.js.map +1 -0
  28. package/dist/chunk-NZQBS7GN.js +2 -0
  29. package/dist/{chunk-KBJNJGBP.js.map → chunk-NZQBS7GN.js.map} +1 -1
  30. package/dist/{chunk-3TETB22A.js → chunk-P3I7AATX.js} +2 -2
  31. package/dist/{chunk-V4IFJLQS.js → chunk-RDEFA6Y6.js} +2 -2
  32. package/dist/{chunk-HIUHKOKK.js → chunk-RJOA7QBB.js} +2 -2
  33. package/dist/{chunk-GZY5DYXT.js → chunk-RRGITX5B.js} +2 -2
  34. package/dist/{chunk-IDZXAOBC.js → chunk-SFVDQNTY.js} +67 -67
  35. package/dist/chunk-SFVDQNTY.js.map +1 -0
  36. package/dist/{chunk-GUEIF7ZF.js → chunk-SMAI7U6H.js} +2 -2
  37. package/dist/{chunk-S2UXDEGW.js → chunk-SSQMFHSM.js} +2 -2
  38. package/dist/{chunk-PHCWYKQW.js → chunk-TDGDH4RA.js} +2 -2
  39. package/dist/chunk-URN74FTP.js +55 -0
  40. package/dist/chunk-URN74FTP.js.map +1 -0
  41. package/dist/{chunk-4XPVU3N2.js → chunk-VQYVL72V.js} +2 -2
  42. package/dist/{chunk-ANC5QXFB.js → chunk-XOUO4XNA.js} +2 -2
  43. package/dist/{chunk-OQV3LWJI.js → chunk-XWO6ALJQ.js} +2 -2
  44. package/dist/{chunk-SJPQQ4OF.js → chunk-YSXE65O7.js} +234 -234
  45. package/dist/chunk-YSXE65O7.js.map +1 -0
  46. package/dist/cli.js +1 -1
  47. package/dist/{client-7UW2ELPP.js → client-NFPBE6L4.js} +2 -2
  48. package/dist/{config-TNYVPT4R.js → config-GHMRBRDL.js} +2 -2
  49. package/dist/{config-mutate-GV7BVG3I.js → config-mutate-2XV27EFV.js} +2 -2
  50. package/dist/config-mutator-6ITNU5DT.js +2 -0
  51. package/dist/{contributions-J57B3KIX.js → contributions-74M6YOCZ.js} +2 -2
  52. package/dist/{contributions-J57B3KIX.js.map → contributions-74M6YOCZ.js.map} +1 -1
  53. package/dist/{doctor-ROKIYJRT.js → doctor-UBXVMGJG.js} +2 -2
  54. package/dist/{follow-up-tool-S2U7DFSW.js → follow-up-tool-EARVITTS.js} +2 -2
  55. package/dist/{hub-HOVJC4HR.js → hub-VTDFUAEH.js} +2 -2
  56. package/dist/index.d.ts +279 -84
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/note-reader-IDE6RI34.js +2 -0
  60. package/dist/notes-settings-VPXI5IIS.js +2 -0
  61. package/dist/{program-LAOU5DQ3.js → program-3URNCVEZ.js} +254 -254
  62. package/dist/program-3URNCVEZ.js.map +1 -0
  63. package/dist/{promote-FVWRM4BE.js → promote-B2BADAEP.js} +2 -2
  64. package/dist/push-bridge-325SXDGN.js +1 -1
  65. package/dist/query-2VIIGGDS.js +2 -0
  66. package/dist/query-settings-VJ3POZS3.js +3 -0
  67. package/dist/query-settings-VJ3POZS3.js.map +1 -0
  68. package/dist/registry-PRCISYBO.js +2 -0
  69. package/dist/{request-planner-JOXSAAHO.js → request-planner-MFAIVLUQ.js} +2 -2
  70. package/dist/{review-candidates-6N5435V7.js → review-candidates-6WMDVVIZ.js} +2 -2
  71. package/dist/{routing-6G2QVFIG.js → routing-OPCLHIYW.js} +2 -2
  72. package/dist/schedule-tool-KPVTMYL3.js +2 -0
  73. package/dist/{scheduler-WOH2O3EP.js → scheduler-G3WWYETY.js} +2 -2
  74. package/dist/{seat-I2FBJDTV.js → seat-3HM4J7IX.js} +2 -2
  75. package/dist/{select-5YZQJLLD.js → select-VEFE2ESF.js} +2 -2
  76. package/dist/{set-enabled-CQEUZLHU.js → set-enabled-US5BYKFZ.js} +2 -2
  77. package/dist/{tool-PIJXUBEC.js → tool-HUSCHORN.js} +2 -2
  78. package/dist/{tool-R77KFLZ3.js → tool-XLWLXGB5.js} +2 -2
  79. package/dist/wiki-SXWJ5NJQ.js +2 -0
  80. package/dist/wiki-SXWJ5NJQ.js.map +1 -0
  81. package/package.json +1 -1
  82. package/dist/absorb-eval-37XZJACN.js +0 -2
  83. package/dist/board-dashboard-GKE4KWJH.js.map +0 -1
  84. package/dist/chunk-2BF6HJJD.js.map +0 -1
  85. package/dist/chunk-57Y2WZT2.js +0 -55
  86. package/dist/chunk-57Y2WZT2.js.map +0 -1
  87. package/dist/chunk-BI6VG4DV.js +0 -37
  88. package/dist/chunk-BI6VG4DV.js.map +0 -1
  89. package/dist/chunk-F7GKG5ZO.js.map +0 -1
  90. package/dist/chunk-IDZXAOBC.js.map +0 -1
  91. package/dist/chunk-IZDKRNXC.js +0 -52
  92. package/dist/chunk-IZDKRNXC.js.map +0 -1
  93. package/dist/chunk-KBJNJGBP.js +0 -2
  94. package/dist/chunk-RTHZQGFC.js +0 -105
  95. package/dist/chunk-RTHZQGFC.js.map +0 -1
  96. package/dist/chunk-SJPQQ4OF.js.map +0 -1
  97. package/dist/config-mutator-AKCR3VKM.js +0 -2
  98. package/dist/notes-settings-WMOH2V75.js +0 -2
  99. package/dist/program-LAOU5DQ3.js.map +0 -1
  100. package/dist/query-HBCL3FHO.js +0 -2
  101. package/dist/query-settings-RD6GEN2V.js +0 -3
  102. package/dist/query-settings-RD6GEN2V.js.map +0 -1
  103. package/dist/registry-NT4H7HYP.js +0 -2
  104. package/dist/schedule-tool-3NYUPKSC.js +0 -2
  105. package/dist/wiki-GCOFERTB.js +0 -2
  106. /package/dist/{App-WQPA77VJ.js.map → App-4UVAI5C5.js.map} +0 -0
  107. /package/dist/{ChatApp-TGW66I4Y.js.map → ChatApp-COO67WIR.js.map} +0 -0
  108. /package/dist/{absorb-eval-37XZJACN.js.map → absorb-eval-WU7JR3BT.js.map} +0 -0
  109. /package/dist/{agent-FWHYHXWC.js.map → agent-2GPJGHHG.js.map} +0 -0
  110. /package/dist/{chunk-ZN5DC6WS.js.map → chunk-3XVST5XX.js.map} +0 -0
  111. /package/dist/{chunk-F5PVUB4Y.js.map → chunk-4XMALK7X.js.map} +0 -0
  112. /package/dist/{chunk-VH2ASPFQ.js.map → chunk-AHO4CQRK.js.map} +0 -0
  113. /package/dist/{chunk-JA5Y4LDP.js.map → chunk-ERULJ2ZL.js.map} +0 -0
  114. /package/dist/{chunk-RJFPCW7T.js.map → chunk-FWDRBUMS.js.map} +0 -0
  115. /package/dist/{chunk-KUOH5MFS.js.map → chunk-K445URSN.js.map} +0 -0
  116. /package/dist/{chunk-D5IHICX3.js.map → chunk-LUYN6RAC.js.map} +0 -0
  117. /package/dist/{chunk-3TETB22A.js.map → chunk-P3I7AATX.js.map} +0 -0
  118. /package/dist/{chunk-V4IFJLQS.js.map → chunk-RDEFA6Y6.js.map} +0 -0
  119. /package/dist/{chunk-HIUHKOKK.js.map → chunk-RJOA7QBB.js.map} +0 -0
  120. /package/dist/{chunk-GZY5DYXT.js.map → chunk-RRGITX5B.js.map} +0 -0
  121. /package/dist/{chunk-GUEIF7ZF.js.map → chunk-SMAI7U6H.js.map} +0 -0
  122. /package/dist/{chunk-S2UXDEGW.js.map → chunk-SSQMFHSM.js.map} +0 -0
  123. /package/dist/{chunk-PHCWYKQW.js.map → chunk-TDGDH4RA.js.map} +0 -0
  124. /package/dist/{chunk-4XPVU3N2.js.map → chunk-VQYVL72V.js.map} +0 -0
  125. /package/dist/{chunk-ANC5QXFB.js.map → chunk-XOUO4XNA.js.map} +0 -0
  126. /package/dist/{chunk-OQV3LWJI.js.map → chunk-XWO6ALJQ.js.map} +0 -0
  127. /package/dist/{client-7UW2ELPP.js.map → client-NFPBE6L4.js.map} +0 -0
  128. /package/dist/{config-TNYVPT4R.js.map → config-GHMRBRDL.js.map} +0 -0
  129. /package/dist/{config-mutate-GV7BVG3I.js.map → config-mutate-2XV27EFV.js.map} +0 -0
  130. /package/dist/{config-mutator-AKCR3VKM.js.map → config-mutator-6ITNU5DT.js.map} +0 -0
  131. /package/dist/{doctor-ROKIYJRT.js.map → doctor-UBXVMGJG.js.map} +0 -0
  132. /package/dist/{follow-up-tool-S2U7DFSW.js.map → follow-up-tool-EARVITTS.js.map} +0 -0
  133. /package/dist/{hub-HOVJC4HR.js.map → hub-VTDFUAEH.js.map} +0 -0
  134. /package/dist/{notes-settings-WMOH2V75.js.map → note-reader-IDE6RI34.js.map} +0 -0
  135. /package/dist/{promote-FVWRM4BE.js.map → notes-settings-VPXI5IIS.js.map} +0 -0
  136. /package/dist/{query-HBCL3FHO.js.map → promote-B2BADAEP.js.map} +0 -0
  137. /package/dist/{registry-NT4H7HYP.js.map → query-2VIIGGDS.js.map} +0 -0
  138. /package/dist/{routing-6G2QVFIG.js.map → registry-PRCISYBO.js.map} +0 -0
  139. /package/dist/{request-planner-JOXSAAHO.js.map → request-planner-MFAIVLUQ.js.map} +0 -0
  140. /package/dist/{review-candidates-6N5435V7.js.map → review-candidates-6WMDVVIZ.js.map} +0 -0
  141. /package/dist/{schedule-tool-3NYUPKSC.js.map → routing-OPCLHIYW.js.map} +0 -0
  142. /package/dist/{scheduler-WOH2O3EP.js.map → schedule-tool-KPVTMYL3.js.map} +0 -0
  143. /package/dist/{seat-I2FBJDTV.js.map → scheduler-G3WWYETY.js.map} +0 -0
  144. /package/dist/{wiki-GCOFERTB.js.map → seat-3HM4J7IX.js.map} +0 -0
  145. /package/dist/{select-5YZQJLLD.js.map → select-VEFE2ESF.js.map} +0 -0
  146. /package/dist/{set-enabled-CQEUZLHU.js.map → set-enabled-US5BYKFZ.js.map} +0 -0
  147. /package/dist/{tool-PIJXUBEC.js.map → tool-HUSCHORN.js.map} +0 -0
  148. /package/dist/{tool-R77KFLZ3.js.map → tool-XLWLXGB5.js.map} +0 -0
@@ -38,8 +38,8 @@ import{b as U,d as F,h as at}from"./chunk-BRK6M6LA.js";import{l as z,m as H,n as
38
38
  WHERE id = ? AND state NOT IN (${b(p.length)})`).run(t,o,o,t==="done"?i.slice(0,P):null,t==="done"?null:i.slice(0,P),n,...p).changes>0}discardCandidate(n){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(n).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${b(x.length)}) ORDER BY created_at, rowid`).all(...x).map(h)}quietSince(n,t){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${b(n.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...n,t).map(h)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(h)}markNotified(n,t){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(t,n)}listByState(n){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(n).map(h)}requestPickup(n,t){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
39
39
  WHERE id = ? AND state = 'needs_attention'`).run(t,t,n).changes>0}handOff(n,t,r,o){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
40
40
  question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
41
- WHERE id = ? AND state IN (${b(x.length)})`).run(t,o,o,r.trim().slice(0,$)||null,n,...x).changes>0}setNoteSaid(n,t,r){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${r?" AND pickup_at IS NULL":""}`).run(r?1:null,n,t)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(h).filter(n=>n.state==="in_progress").sort((n,t)=>n.createdAt-t.createdAt)}pruneClosed(n){return this.db.prepare(`DELETE FROM requests WHERE state IN (${b(p.length)}) AND closed_at < ?`).run(...p,n).changes}}});function oa(a){return Object.assign({channel:pe,chatId:a,sender:"operator"},{[be]:!0})}function ia(a){return!!a&&a[be]===!0}function Pt(a,n,t,r=!1){let o=T(n);if(a.channels.length&&!a.channels.map(T).includes(o))return!1;if(A.has(o))return r&&!Nt.has((t?.name??"").toLowerCase());let i=$t.has(o)?t?.username:t?.id,l=i?fe(o,i):"";return l?a.from.some(d=>{let m=d.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&fe(o,m.slice(g+1))===l}):!1}function sa(a){if(!a)return;let n=r=>typeof r=="string"&&r?r.slice(0,120):void 0,t={name:n(a.sender),id:n(a.senderId),username:n(a.senderUsername)};return t.name||t.id||t.username?t:void 0}function qt(a){return/\btimed? ?out\b|timeout/i.test(a)?"timed out":"failed"}var pe,be,A,Nt,T,$t,fe,y,S,ge,he=f(()=>{"use strict";me();pe="requests",be=Symbol("requests.pickup");A=new Set(["voice","app","dashboard","webrtc"]),Nt=new Set(["camera"]),T=a=>a.toLowerCase().split("@")[0],$t=new Set(["github","gitlab"]),fe=(a,n)=>a==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.trim().toLowerCase().replace(/^@/,"");y=(a,n=200)=>{let t=a.replace(/\s+/g," ").trim();return t.length>n?`${t.slice(0,n-1)}\u2026`:t},S=(a,n,t)=>`${a}\0${n}\0${t}`,ge=class{constructor(n,t,r,o=Date.now){this.store=n;this.settings=t;this.log=r;this.now=o}live=new Map;guard(n,t){try{t()}catch(r){this.log(`[requests] ${n} failed: ${r?.message??r}`)}}isListedOwner(n){let t=T(n.channel),r=this.settings().channels;return r.length&&!r.map(T).includes(t)?!1:n.person?.role==="owner"&&!A.has(t)}liveRequestId(n,t,r){return this.live.get(S(n,t,r))?.requestId??null}taskStarted(n){n.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let t=this.now(),r=n.resumedFrom?this.store.byLink("run",n.resumedFrom):null,o=S(n.agentId,n.channel,n.chatId);if(r){this.store.link(r.id,"run",n.taskId,t),r.state==="candidate"?this.store.touch(r.id,t):this.store.progress(r.id,t),this.live.set(o,{requestId:r.id,runId:n.taskId});return}let i=n.pickup&&n.channel===pe?this.store.get(n.chatId):null;if(i&&i.agentId===n.agentId){this.store.link(i.id,"run",n.taskId,t),this.store.touch(i.id,t),this.live.set(o,{requestId:i.id,runId:n.taskId});return}!n.humanRoot||!(Pt(this.settings(),n.channel,n.sender,n.operator===!0)||this.isListedOwner(n))||(this.live.set(o,{requestId:`req-${n.taskId}`,runId:n.taskId}),this.store.addCandidate({id:`req-${n.taskId}`,runId:n.taskId,channel:n.channel,chatId:n.chatId,sender:n.sender?.name??n.sender?.username??n.sender?.id??null,person:n.person?.id??null,agentId:n.agentId,text:n.requestText??n.fullMessage??n.messagePreview,now:t}))})}taskCompleted(n){n.taskId&&this.guard("run end",()=>{let t=S(n.agentId,n.channel,n.chatId);this.live.get(t)?.runId===n.taskId&&this.live.delete(t);let r=this.store.byLink("run",n.taskId);if(!r)return;let o=this.now();if(!n.interrupted){if(n.error&&n.errorKind!=="cancelled"&&!n.stopped&&n.errorKind!=="stopped"){let i=qt(n.error);this.store.needsAttention(r.id,`${n.agentId} ${i}: ${y(n.error)}`,o)&&this.log(`[requests] ${r.id} needs attention: run ${n.taskId} ${i}`);return}r.state==="candidate"?this.store.discardCandidate(r.id):this.store.touch(r.id,o)}})}delegationStarted(n){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let t=this.live.get(S(n.caller,n.origin.channel,n.origin.chatId));if(!t)return;let r=this.now();this.store.link(t.requestId,"delegation",n.id,r),this.store.progress(t.requestId,r,"waiting_other")})}delegationDone(n,t,r){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=this.now(),l=n.peer?`${n.callee} on ${n.peer}`:n.callee;if(t==="done"){this.store.progress(o.id,i);return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[t];this.store.needsAttention(o.id,`The work handed to ${l} ${d}: ${y(r)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} ${t}`)})}relayFailed(n,t,r){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=n.peer?`${n.callee} on ${n.peer}`:n.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${y(r)}). It said: ${y(t)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} answer not relayed`)})}cardRaised(n,t){t&&this.guard("card",()=>{if(!this.settings().enabled)return;let r=this.live.get(S(n.raised_by,t.channel,t.chatId))?.requestId;if(!r)return;let o=this.now();this.store.link(r,"card",n.id,o),this.store.waitOnOwner(r,n.ask,o)})}cardResolved(n){this.guard("card result",()=>{let t=this.store.byLink("card",n.id);if(!t)return;let r=this.now(),o=n.outcome??n.if_silent;n.status==="decided"?t.state==="waiting_owner"&&this.store.progress(t.id,r):this.store.needsAttention(t.id,`Your answer did not come before the card expired (${y(n.ask)}); "${o}" was applied`,r)&&this.log(`[requests] ${t.id} needs attention: card ${n.id} expired unanswered`)})}closingNote(n){try{let t=this.store.byLink("delegation",n);return!t||!x.includes(t.state)?void 0:`This is part of the owner's open request ${t.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${t.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(n){this.guard("restart",()=>{let t=this.store.byLink("run",n.taskId);if(!t)return;let r=this.now();n.decision==="resumed"?t.state==="candidate"?this.store.touch(t.id,r):this.store.progress(t.id,r):(n.decision==="reported"||n.decision==="resume-failed"||n.decision==="skipped")&&this.store.needsAttention(t.id,`Cut off by a restart and not picked up again (${y(n.reason)})`,r)&&this.log(`[requests] ${t.id} needs attention: run ${n.taskId} cut off by a restart`)})}}});import{randomBytes as Dt,timingSafeEqual as ye}from"crypto";import{chmodSync as Mt,existsSync as Bt,mkdirSync as Ut,readFileSync as Ft,writeFileSync as zt}from"fs";import{networkInterfaces as Ht}from"os";import{dirname as Wt,resolve as Kt}from"path";function fa(a){return Object.assign(a,{[ke]:!0})}function we(a){return!!a&&a[ke]===!0}function Zt(a=process.cwd()){return Kt(a,".agentx","operator.key")}function ga(a=process.cwd(),n={}){let t=Zt(a);try{if(Bt(t)){let o=Ft(t,"utf-8").trim();if(o)return o}if(!n.create)return null;let r=Dt(32).toString("hex");return Ut(Wt(t),{recursive:!0}),zt(t,r+`
42
- `,{mode:384}),Mt(t,384),r}catch{return null}}function Gt(a,n){let t=Array.isArray(n)?n[0]:n;if(!a||!t)return!1;let r=Buffer.from(a),o=Buffer.from(t.trim());return r.length===o.length&&ye(r,o)}function Vt(a,n,t,r){if(!a||typeof a!="object")return!1;let o=String(a.channel??"").toLowerCase().split("@")[0];return r.has(o)?Gt(t,n[Xt]):!1}function Jt(a,n){let t=a[Yt];if((Array.isArray(t)?t[0]:t)!=="1")return!1;let r=a.authorization,o=(Array.isArray(r)?r[0]:r)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let l=Buffer.from(i);for(let d of n){if(!d)continue;let m=Buffer.from(d);if(m.length===l.length&&ye(m,l))return!0}return!1}function Qt(a,n=en()){let t=xe(a??"");if(!t||t==="::1"||t.startsWith("127."))return!0;for(let r of n)if(xe(r)===t)return!0;return!1}function en(){return Object.values(Ht()).flatMap(a=>(a??[]).map(n=>n.address))}function pa(a,n,t){if(Vt(a,n.headers,t.key,t.operatorChannels))return!0;if(!a||typeof a!="object")return!1;let r=String(a.channel??"").toLowerCase().split("@")[0];return!t.operatorChannels.has(r)||Qt(n.remoteAddress,t.ownAddresses)?!1:Jt(n.headers,t.peerTokens)}var Xt,ke,Yt,xe,Se=f(()=>{"use strict";Xt="x-agentx-operator",ke=Symbol("requests.operator");Yt="x-agentx-operator-vouch";xe=a=>a.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function wa(a,n){return a.find(t=>t.id===n)?.name??(n===R?"Owner":n)}function _e(a,n){let t=n.trim().toLowerCase();return a==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.replace(/^@/,"")}function Ee(a){let n=a.indexOf(":");if(n<=0||n===a.length-1)return null;let t=q(a.slice(0,n).trim()),r=_e(t,a.slice(n+1));return r?{channel:t,value:r}:null}function Te(a){let n=new Set,t=new Map;for(let r of a){if(n.has(r.id))return`person "${r.id}" is listed twice`;if(n.add(r.id),r.id===R&&r.role!=="owner")return`the id "${R}" is kept for a person with the owner role`;for(let o of r.identities){let i=Ee(o);if(!i)return`identity "${o}" of "${r.id}" must be written channel:id`;let l=`${i.channel}:${i.value}`,d=t.get(l);if(d&&d!==r.id)return`identity "${o}" belongs to both "${d}" and "${r.id}"`;t.set(l,r.id)}}return null}function tn(a,n,t){let r=q(n),i=(r==="whatsapp"?[t?.id]:[t?.id,t?.username]).filter(l=>typeof l=="string"&&!!l).map(l=>_e(r,l)).filter(Boolean);return i.length?a.find(l=>l.identities.some(d=>{let m=Ee(d);return!!m&&m.channel===r&&i.includes(m.value)}))??null:null}function nn(a){let n=a.filter(t=>t.role==="owner");return n.length===0?{id:R,role:"owner"}:n.length===1?{id:n[0].id,role:"owner"}:null}function Ae(a,n){let t=U(n);if(t)return t.person?{id:t.person}:null;if(!n||F(n)!=="human")return null;let r=String(n.channel??"");if(A.has(q(r)))return we(n)?nn(a):null;let o=l=>typeof l=="string"?l:void 0,i=tn(a,r,{id:o(n.senderId),username:o(n.senderUsername)});return i?{id:i.id,role:i.role}:null}function an(a,n){let t=a.agents??[];return a.role==="owner"||t.length===0||t.includes(n)}function Sa(a,n,t){let r=Ae(a,t);if(!r)return null;let o=a.find(l=>l.id===r.id);if(!o||an(o,n))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${n}. Ask the owner if you need ${n}.`}}function _a(a,n){let t=a.trim().split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${t}$`,"i").test(n.trim())}function Ea(a,n){let t=Ae(a,n);if(!t)return null;let r=a.find(l=>l.id===t.id);if(!r||r.role==="owner")return null;let o=r.deny?.tools??[],i=r.deny?.skills??[];return!o.length&&!i.length?null:{personId:r.id,name:r.name,tools:[...o],skills:[...i]}}var ka,R,q,Re=f(()=>{"use strict";at();he();Se();ka=["owner","member","client","guest"],R="owner";q=a=>a.toLowerCase().split("@")[0]});function Ra(a){return typeof a=="string"&&on.includes(a)}function ve(a){let n=new Set(rn);return a.map(t=>t.trim()).filter(t=>t&&!n.has(t))}var rn,on,Aa,Ie=f(()=>{"use strict";rn=["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"],on=["read","full"],Aa=["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 Nn={};tt(Nn,{INTEGRATION_KINDS:()=>gn,WIKI_CONTRIBUTE_JOB:()=>Ge,WIKI_CONTRIBUTE_MERGE_JOB:()=>Ye,WIKI_SUMMARIZE_JOB:()=>D,approvalsConfigSchema:()=>Xe,callsSchema:()=>Ue,cameraBotSchema:()=>Me,daemonConfigSchema:()=>Ze,eventSubscriptionSchema:()=>De,expandEnvVars:()=>j,isCronExpression:()=>Be,loadDaemonConfig:()=>On,membersConfigSchema:()=>We,peopleConfigSchema:()=>He,personSchema:()=>ze,requestStatusConfigSchema:()=>Ke,requestsConfigSchema:()=>Fe,validateWorkspaces:()=>Ln,withContributionJobs:()=>Ve,withSummariesJob:()=>Je});import{z as e}from"zod";import{readFileSync as Ne,existsSync as I}from"fs";import{resolve as C}from"path";function sn(a){let n=C(a,".env");if(!I(n))return;let t=Ne(n,"utf-8");for(let r of t.split(`
41
+ WHERE id = ? AND state IN (${b(x.length)})`).run(t,o,o,r.trim().slice(0,$)||null,n,...x).changes>0}setNoteSaid(n,t,r){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${r?" AND pickup_at IS NULL":""}`).run(r?1:null,n,t)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(h).filter(n=>n.state==="in_progress").sort((n,t)=>n.createdAt-t.createdAt)}pruneClosed(n){return this.db.prepare(`DELETE FROM requests WHERE state IN (${b(p.length)}) AND closed_at < ?`).run(...p,n).changes}}});function oa(a){return Object.assign({channel:pe,chatId:a,sender:"operator"},{[be]:!0})}function ia(a){return!!a&&a[be]===!0}function Pt(a,n,t,r=!1){let o=T(n);if(a.channels.length&&!a.channels.map(T).includes(o))return!1;if(A.has(o))return r&&!Nt.has((t?.name??"").toLowerCase());let i=$t.has(o)?t?.username:t?.id,l=i?fe(o,i):"";return l?a.from.some(d=>{let m=d.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&fe(o,m.slice(g+1))===l}):!1}function sa(a){if(!a)return;let n=r=>typeof r=="string"&&r?r.slice(0,120):void 0,t={name:n(a.sender),id:n(a.senderId),username:n(a.senderUsername)};return t.name||t.id||t.username?t:void 0}function Dt(a){return/\btimed? ?out\b|timeout/i.test(a)?"timed out":"failed"}var pe,be,A,Nt,T,$t,fe,y,S,ge,he=f(()=>{"use strict";me();pe="requests",be=Symbol("requests.pickup");A=new Set(["voice","app","dashboard","webrtc"]),Nt=new Set(["camera"]),T=a=>a.toLowerCase().split("@")[0],$t=new Set(["github","gitlab"]),fe=(a,n)=>a==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.trim().toLowerCase().replace(/^@/,"");y=(a,n=200)=>{let t=a.replace(/\s+/g," ").trim();return t.length>n?`${t.slice(0,n-1)}\u2026`:t},S=(a,n,t)=>`${a}\0${n}\0${t}`,ge=class{constructor(n,t,r,o=Date.now){this.store=n;this.settings=t;this.log=r;this.now=o}live=new Map;guard(n,t){try{t()}catch(r){this.log(`[requests] ${n} failed: ${r?.message??r}`)}}isListedOwner(n){let t=T(n.channel),r=this.settings().channels;return r.length&&!r.map(T).includes(t)?!1:n.person?.role==="owner"&&!A.has(t)}liveRequestId(n,t,r){return this.live.get(S(n,t,r))?.requestId??null}taskStarted(n){n.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let t=this.now(),r=n.resumedFrom?this.store.byLink("run",n.resumedFrom):null,o=S(n.agentId,n.channel,n.chatId);if(r){this.store.link(r.id,"run",n.taskId,t),r.state==="candidate"?this.store.touch(r.id,t):this.store.progress(r.id,t),this.live.set(o,{requestId:r.id,runId:n.taskId});return}let i=n.pickup&&n.channel===pe?this.store.get(n.chatId):null;if(i&&i.agentId===n.agentId){this.store.link(i.id,"run",n.taskId,t),this.store.touch(i.id,t),this.live.set(o,{requestId:i.id,runId:n.taskId});return}!n.humanRoot||!(Pt(this.settings(),n.channel,n.sender,n.operator===!0)||this.isListedOwner(n))||(this.live.set(o,{requestId:`req-${n.taskId}`,runId:n.taskId}),this.store.addCandidate({id:`req-${n.taskId}`,runId:n.taskId,channel:n.channel,chatId:n.chatId,sender:n.sender?.name??n.sender?.username??n.sender?.id??null,person:n.person?.id??null,agentId:n.agentId,text:n.requestText??n.fullMessage??n.messagePreview,now:t}))})}taskCompleted(n){n.taskId&&this.guard("run end",()=>{let t=S(n.agentId,n.channel,n.chatId);this.live.get(t)?.runId===n.taskId&&this.live.delete(t);let r=this.store.byLink("run",n.taskId);if(!r)return;let o=this.now();if(!n.interrupted){if(n.error&&n.errorKind!=="cancelled"&&!n.stopped&&n.errorKind!=="stopped"){let i=Dt(n.error);this.store.needsAttention(r.id,`${n.agentId} ${i}: ${y(n.error)}`,o)&&this.log(`[requests] ${r.id} needs attention: run ${n.taskId} ${i}`);return}r.state==="candidate"?this.store.discardCandidate(r.id):this.store.touch(r.id,o)}})}delegationStarted(n){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let t=this.live.get(S(n.caller,n.origin.channel,n.origin.chatId));if(!t)return;let r=this.now();this.store.link(t.requestId,"delegation",n.id,r),this.store.progress(t.requestId,r,"waiting_other")})}delegationDone(n,t,r){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=this.now(),l=n.peer?`${n.callee} on ${n.peer}`:n.callee;if(t==="done"){this.store.progress(o.id,i);return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[t];this.store.needsAttention(o.id,`The work handed to ${l} ${d}: ${y(r)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} ${t}`)})}relayFailed(n,t,r){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=n.peer?`${n.callee} on ${n.peer}`:n.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${y(r)}). It said: ${y(t)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} answer not relayed`)})}cardRaised(n,t){t&&this.guard("card",()=>{if(!this.settings().enabled)return;let r=this.live.get(S(n.raised_by,t.channel,t.chatId))?.requestId;if(!r)return;let o=this.now();this.store.link(r,"card",n.id,o),this.store.waitOnOwner(r,n.ask,o)})}cardResolved(n){this.guard("card result",()=>{let t=this.store.byLink("card",n.id);if(!t)return;let r=this.now(),o=n.outcome??n.if_silent;n.status==="decided"?t.state==="waiting_owner"&&this.store.progress(t.id,r):this.store.needsAttention(t.id,`Your answer did not come before the card expired (${y(n.ask)}); "${o}" was applied`,r)&&this.log(`[requests] ${t.id} needs attention: card ${n.id} expired unanswered`)})}closingNote(n){try{let t=this.store.byLink("delegation",n);return!t||!x.includes(t.state)?void 0:`This is part of the owner's open request ${t.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${t.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(n){this.guard("restart",()=>{let t=this.store.byLink("run",n.taskId);if(!t)return;let r=this.now();n.decision==="resumed"?t.state==="candidate"?this.store.touch(t.id,r):this.store.progress(t.id,r):(n.decision==="reported"||n.decision==="resume-failed"||n.decision==="skipped")&&this.store.needsAttention(t.id,`Cut off by a restart and not picked up again (${y(n.reason)})`,r)&&this.log(`[requests] ${t.id} needs attention: run ${n.taskId} cut off by a restart`)})}}});import{randomBytes as qt,timingSafeEqual as ye}from"crypto";import{chmodSync as Mt,existsSync as Bt,mkdirSync as Ut,readFileSync as Ft,writeFileSync as zt}from"fs";import{networkInterfaces as Ht}from"os";import{dirname as Wt,resolve as Kt}from"path";function fa(a){return Object.assign(a,{[ke]:!0})}function we(a){return!!a&&a[ke]===!0}function Zt(a=process.cwd()){return Kt(a,".agentx","operator.key")}function ga(a=process.cwd(),n={}){let t=Zt(a);try{if(Bt(t)){let o=Ft(t,"utf-8").trim();if(o)return o}if(!n.create)return null;let r=qt(32).toString("hex");return Ut(Wt(t),{recursive:!0}),zt(t,r+`
42
+ `,{mode:384}),Mt(t,384),r}catch{return null}}function Gt(a,n){let t=Array.isArray(n)?n[0]:n;if(!a||!t)return!1;let r=Buffer.from(a),o=Buffer.from(t.trim());return r.length===o.length&&ye(r,o)}function Vt(a,n,t,r){if(!a||typeof a!="object")return!1;let o=String(a.channel??"").toLowerCase().split("@")[0];return r.has(o)?Gt(t,n[Xt]):!1}function Jt(a,n){let t=a[Yt];if((Array.isArray(t)?t[0]:t)!=="1")return!1;let r=a.authorization,o=(Array.isArray(r)?r[0]:r)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let l=Buffer.from(i);for(let d of n){if(!d)continue;let m=Buffer.from(d);if(m.length===l.length&&ye(m,l))return!0}return!1}function Qt(a,n=en()){let t=xe(a??"");if(!t||t==="::1"||t.startsWith("127."))return!0;for(let r of n)if(xe(r)===t)return!0;return!1}function en(){return Object.values(Ht()).flatMap(a=>(a??[]).map(n=>n.address))}function pa(a,n,t){if(Vt(a,n.headers,t.key,t.operatorChannels))return!0;if(!a||typeof a!="object")return!1;let r=String(a.channel??"").toLowerCase().split("@")[0];return!t.operatorChannels.has(r)||Qt(n.remoteAddress,t.ownAddresses)?!1:Jt(n.headers,t.peerTokens)}var Xt,ke,Yt,xe,Se=f(()=>{"use strict";Xt="x-agentx-operator",ke=Symbol("requests.operator");Yt="x-agentx-operator-vouch";xe=a=>a.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function wa(a,n){return a.find(t=>t.id===n)?.name??(n===R?"Owner":n)}function _e(a,n){let t=n.trim().toLowerCase();return a==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.replace(/^@/,"")}function Ee(a){let n=a.indexOf(":");if(n<=0||n===a.length-1)return null;let t=D(a.slice(0,n).trim()),r=_e(t,a.slice(n+1));return r?{channel:t,value:r}:null}function Te(a){let n=new Set,t=new Map;for(let r of a){if(n.has(r.id))return`person "${r.id}" is listed twice`;if(n.add(r.id),r.id===R&&r.role!=="owner")return`the id "${R}" is kept for a person with the owner role`;for(let o of r.identities){let i=Ee(o);if(!i)return`identity "${o}" of "${r.id}" must be written channel:id`;let l=`${i.channel}:${i.value}`,d=t.get(l);if(d&&d!==r.id)return`identity "${o}" belongs to both "${d}" and "${r.id}"`;t.set(l,r.id)}}return null}function tn(a,n,t){let r=D(n),i=(r==="whatsapp"?[t?.id]:[t?.id,t?.username]).filter(l=>typeof l=="string"&&!!l).map(l=>_e(r,l)).filter(Boolean);return i.length?a.find(l=>l.identities.some(d=>{let m=Ee(d);return!!m&&m.channel===r&&i.includes(m.value)}))??null:null}function nn(a){let n=a.filter(t=>t.role==="owner");return n.length===0?{id:R,role:"owner"}:n.length===1?{id:n[0].id,role:"owner"}:null}function Ae(a,n){let t=U(n);if(t)return t.person?{id:t.person}:null;if(!n||F(n)!=="human")return null;let r=String(n.channel??"");if(A.has(D(r)))return we(n)?nn(a):null;let o=l=>typeof l=="string"?l:void 0,i=tn(a,r,{id:o(n.senderId),username:o(n.senderUsername)});return i?{id:i.id,role:i.role}:null}function an(a,n){let t=a.agents??[];return a.role==="owner"||t.length===0||t.includes(n)}function Sa(a,n,t){let r=Ae(a,t);if(!r)return null;let o=a.find(l=>l.id===r.id);if(!o||an(o,n))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${n}. Ask the owner if you need ${n}.`}}function _a(a,n){let t=a.trim().split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${t}$`,"i").test(n.trim())}function Ea(a,n){let t=Ae(a,n);if(!t)return null;let r=a.find(l=>l.id===t.id);if(!r||r.role==="owner")return null;let o=r.deny?.tools??[],i=r.deny?.skills??[];return!o.length&&!i.length?null:{personId:r.id,name:r.name,tools:[...o],skills:[...i]}}var ka,R,D,Re=f(()=>{"use strict";at();he();Se();ka=["owner","member","client","guest"],R="owner";D=a=>a.toLowerCase().split("@")[0]});function Ra(a){return typeof a=="string"&&on.includes(a)}function ve(a){let n=new Set(rn);return a.map(t=>t.trim()).filter(t=>t&&!n.has(t))}var rn,on,Aa,Ie=f(()=>{"use strict";rn=["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"],on=["read","full"],Aa=["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 Nn={};tt(Nn,{INTEGRATION_KINDS:()=>gn,WIKI_CONTRIBUTE_JOB:()=>Ge,WIKI_CONTRIBUTE_MERGE_JOB:()=>Ye,WIKI_SUMMARIZE_JOB:()=>q,approvalsConfigSchema:()=>Xe,callsSchema:()=>Ue,cameraBotSchema:()=>Me,daemonConfigSchema:()=>Ze,eventSubscriptionSchema:()=>qe,expandEnvVars:()=>j,isCronExpression:()=>Be,loadDaemonConfig:()=>On,membersConfigSchema:()=>We,peopleConfigSchema:()=>He,personSchema:()=>ze,requestStatusConfigSchema:()=>Ke,requestsConfigSchema:()=>Fe,validateWorkspaces:()=>Ln,withContributionJobs:()=>Ve,withSummariesJob:()=>Je});import{z as e}from"zod";import{readFileSync as Ne,existsSync as I}from"fs";import{resolve as C}from"path";function sn(a){let n=C(a,".env");if(!I(n))return;let t=Ne(n,"utf-8");for(let r of t.split(`
43
43
  `)){let o=r.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let l=o.slice(0,i).trim(),d=o.slice(i+1).trim();process.env[l]||(process.env[l]=d)}}function Be(a){let n=[[0,59],[0,23],[1,31],[1,12],[0,6]],t=a.trim().split(/\s+/);return t.length!==5?!1:t.every((r,o)=>r.split(",").every(i=>{let l=/^(\*|(\d+)(?:-(\d+))?)(?:\/(\d+))?$/.exec(i);if(!l)return!1;let[d,m]=n[o],g=l[2]===void 0?d:Number(l[2]),k=l[3]===void 0?g:Number(l[3]),et=l[4]===void 0?1:Number(l[4]);return g>=d&&k<=m&&g<=k&&et>=1}))}function xn(a){try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!0}catch{return!1}}function j(a){if(typeof a=="string")return a.replace(/\$\{(\w+)\}/g,(n,t)=>process.env[t]||"");if(Array.isArray(a))return a.map(j);if(a!==null&&typeof a=="object"){let n={};for(let[t,r]of Object.entries(a))n[t]=j(r);return n}return a}function jn(a,n){let t=[],r=new Set;for(let o of a){let i=o.path.join("."),l=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(l&&o.message.toLowerCase().includes("required")){let d=l[1],m=`tg:${d}`;if(r.has(m))continue;r.add(m),t.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
44
44
  Either:
45
45
  A) Open ${n} and set channels.telegram.accounts.${d}.token to your bot token (or "\${TG_${d.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
@@ -50,5 +50,5 @@ Searched: ${n.join(", ")}`);let o;try{o=JSON.parse(t)}catch(d){throw new Error(`
50
50
  ${m.join(`
51
51
 
52
52
  `)}`:"";throw new Error(`Config validation failed (${r}):
53
- ${d}${g}`)}return Je(Ve(l.data))}function Ln(a){let n=[];for(let[t,r]of Object.entries(a.agents)){if(!I(r.workspace)){n.push(`Agent "${t}": workspace not found at ${r.workspace}`);continue}if(r.tier==="claude-code"){let l=C(r.workspace,".claude");I(l)||n.push(`Agent "${t}": no .claude/ directory in workspace ${r.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=r.provider||"claude",i=a.providers[o];!["claude-code","codex-cli","opencode"].includes(r.tier)&&(!i||!i.apiKey)&&n.push(`Agent "${t}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[t,r]of Object.entries(a.crons))a.agents[r.agent]||n.push(`Cron "${t}": references unknown agent "${r.agent}"`);if(a.channels.telegram.enabled)for(let[t,r]of Object.entries(a.channels.telegram.accounts))a.agents[r.agentBinding]||n.push(`Telegram account "${t}": references unknown agent "${r.agentBinding}"`);return n}function Ve(a,n=Qe()){let t=Object.entries(a.agents).filter(([,l])=>l.wiki?.contribute?.enabled).map(([l])=>l).sort();if(t.length===0)return a;let r=a.wiki.contributions,o=(l,d)=>M.parse({schedule:l,timezone:r.timezone,agent:t[0],command:d,timeout:3600,onError:"log"}),i={[Ge]:o(r.schedule,`${n} wiki contribute --all`),[Ye]:o(r.mergeSchedule,`${n} wiki contributions merge`)};return{...a,crons:{...i,...a.crons}}}function Je(a,n=Qe()){let t=a.wiki.summaries,r=t.agent??a.node.defaultAgent??Object.keys(a.agents).sort()[0];if(!t.schedule?.trim()||!r)return a;let o=M.safeParse({schedule:t.schedule,timezone:t.timezone,agent:r,command:`${n} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${D} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...a,crons:{[D]:o.data,...a.crons}}}function Qe(){let a=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(a)?`"${process.execPath}" "${a}"`:"agentx"}var Ce,ln,un,dn,cn,mn,fn,gn,$e,Pe,v,qe,De,pn,bn,Me,hn,M,je,Oe,Le,yn,kn,wn,Sn,_n,En,Tn,An,Rn,Ue,vn,In,Cn,Fe,ze,He,We,Ke,Xe,Ze,Ge,Ye,D,$n=f(()=>{K();G();nt();J();ne();oe();se();de();Re();Ie();Ce=e.array(e.string().min(1)).superRefine((a,n)=>{let t=ve(a);t.length&&n.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${t.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),ln=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),un=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),dn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),cn=e.union([dn,un]),mn=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(),fn=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:mn.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),gn=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],$e=e.enum(["system","elevenlabs"]),Pe=e.union([e.string(),e.record(e.string(),e.string())]),v=e.string().superRefine((a,n)=>{let t=V(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${t}`})}),qe=e.object({provider:$e.optional(),system:Pe.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:v.optional()}),De=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)}),pn=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(),cn).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({})}).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(De).default([]),integrations:e.array(fn).default([]),voice:qe.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(O).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),bn=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Me=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({}),hn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),bn).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:Me}).default({})}).default({})}),M=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:B.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(a=>Array.isArray(a)?a:[a]),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(a=>!!(a.command?.trim()||a.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(a=>!(a.command?.trim()&&a.autonomy&&a.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});je=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),Oe=e.union([je,e.object({repo:je,about:e.string().max(200).optional()})]),Le={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},yn=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...Le,repos:e.array(Oe).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...Le,repos:e.array(Oe).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),kn=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(a=>!a.enabled||!!a.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),wn=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()}),Sn=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),_n=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),En=e.object({enabled:e.boolean().default(!1),peers:e.array(Sn).default([]),inboxes:e.array(_n).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({})}),Tn=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({}),An=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({}),Rn=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(),An).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),Ue=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)}).default({}),vn=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({}),In=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Cn=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-]*$/),In).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({}),Fe=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),ze=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({})}),He=e.array(ze).default([]).superRefine((a,n)=>{let t=Te(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:t})}),We=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ke=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Xe=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(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!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(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!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({}),Ze=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional()}),providers:e.record(e.string(),ln).default({}),agents:e.record(e.string(),pn).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),maxPages:e.number().int().min(1).max(10).default(3),linkedPages:e.number().int().min(0).max(10).default(0),pageChars:e.number().int().min(200).max(4e4).default(4e3),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(yn).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(a=>a.trim()===""||Be(a),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(xn,'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:hn.default({}),crons:e.record(e.string(),M).default({}),wikiNotes:kn.default({}),services:e.record(e.string(),wn).default({}),notifications:vn,calls:Ue,whatsappTriage:ue,approvals:Xe,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:Fe,people:He,members:We,requestStatus:Ke,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:Cn,mesh:En.default({}),meshVoices:e.record(e.string(),qe.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:$e.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Pe.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(L),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(N)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:v.default(_.talk),stop:v.default(_.stop),paste:v.default(_.paste)}).default({}),look:e.enum(Q).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(ee).default("sometimes"),palette:e.enum(O).default(E),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:W.optional(),boards:X,dashboard:Z,graph:Tn,decisions:Rn,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)}).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:Ce.default([]),agentxToolsByChannel:e.record(Ce).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({})});Ge="wiki-contribute",Ye="wiki-contribute-merge";D="wiki-summarize"});export{Mn as a,Bn as b,G as c,At as d,Fn as e,_ as f,J as g,w as h,Q as i,ee as j,O as k,Hn as l,ne as m,ae as n,re as o,Zn as p,oe as q,Yn as r,Vn as s,se as t,ue as u,de as v,x as w,p as x,$ as y,na as z,ce as A,me as B,oa as C,ia as D,A as E,sa as F,ge as G,he as H,Xt as I,fa as J,we as K,ga as L,Vt as M,pa as N,Se as O,ka as P,R as Q,wa as R,Ee as S,tn as T,nn as U,Ae as V,Sa as W,_a as X,Ea as Y,Re as Z,on as _,Aa as $,Ra as aa,Ie as ba,gn as ca,De as da,Me as ea,Be as fa,Ue as ga,Fe as ha,ze as ia,He as ja,We as ka,Ke as la,Xe as ma,Ze as na,j as oa,On as pa,Ln as qa,Ge as ra,Ye as sa,Ve as ta,D as ua,Je as va,Nn as wa,$n as xa};
54
- //# sourceMappingURL=chunk-2BF6HJJD.js.map
53
+ ${d}${g}`)}return Je(Ve(l.data))}function Ln(a){let n=[];for(let[t,r]of Object.entries(a.agents)){if(!I(r.workspace)){n.push(`Agent "${t}": workspace not found at ${r.workspace}`);continue}if(r.tier==="claude-code"){let l=C(r.workspace,".claude");I(l)||n.push(`Agent "${t}": no .claude/ directory in workspace ${r.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=r.provider||"claude",i=a.providers[o];!["claude-code","codex-cli","opencode"].includes(r.tier)&&(!i||!i.apiKey)&&n.push(`Agent "${t}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[t,r]of Object.entries(a.crons))a.agents[r.agent]||n.push(`Cron "${t}": references unknown agent "${r.agent}"`);if(a.channels.telegram.enabled)for(let[t,r]of Object.entries(a.channels.telegram.accounts))a.agents[r.agentBinding]||n.push(`Telegram account "${t}": references unknown agent "${r.agentBinding}"`);return n}function Ve(a,n=Qe()){let t=Object.entries(a.agents).filter(([,l])=>l.wiki?.contribute?.enabled).map(([l])=>l).sort();if(t.length===0)return a;let r=a.wiki.contributions,o=(l,d)=>M.parse({schedule:l,timezone:r.timezone,agent:t[0],command:d,timeout:3600,onError:"log"}),i={[Ge]:o(r.schedule,`${n} wiki contribute --all`),[Ye]:o(r.mergeSchedule,`${n} wiki contributions merge`)};return{...a,crons:{...i,...a.crons}}}function Je(a,n=Qe()){let t=a.wiki.summaries,r=t.agent??a.node.defaultAgent??Object.keys(a.agents).sort()[0];if(!t.schedule?.trim()||!r)return a;let o=M.safeParse({schedule:t.schedule,timezone:t.timezone,agent:r,command:`${n} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${q} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...a,crons:{[q]:o.data,...a.crons}}}function Qe(){let a=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(a)?`"${process.execPath}" "${a}"`:"agentx"}var Ce,ln,un,dn,cn,mn,fn,gn,$e,Pe,v,De,qe,pn,bn,Me,hn,M,je,Oe,Le,yn,kn,wn,Sn,_n,En,Tn,An,Rn,Ue,vn,In,Cn,Fe,ze,He,We,Ke,Xe,Ze,Ge,Ye,q,$n=f(()=>{K();G();nt();J();ne();oe();se();de();Re();Ie();Ce=e.array(e.string().min(1)).superRefine((a,n)=>{let t=ve(a);t.length&&n.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${t.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),ln=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),un=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),dn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),cn=e.union([dn,un]),mn=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(),fn=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:mn.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),gn=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],$e=e.enum(["system","elevenlabs"]),Pe=e.union([e.string(),e.record(e.string(),e.string())]),v=e.string().superRefine((a,n)=>{let t=V(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${t}`})}),De=e.object({provider:$e.optional(),system:Pe.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:v.optional()}),qe=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)}),pn=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(),cn).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(qe).default([]),integrations:e.array(fn).default([]),voice:De.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(O).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),bn=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Me=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({}),hn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),bn).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:Me}).default({})}).default({})}),M=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:B.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(a=>Array.isArray(a)?a:[a]),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(a=>!!(a.command?.trim()||a.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(a=>!(a.command?.trim()&&a.autonomy&&a.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});je=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),Oe=e.union([je,e.object({repo:je,about:e.string().max(200).optional()})]),Le={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},yn=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...Le,repos:e.array(Oe).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...Le,repos:e.array(Oe).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),kn=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(a=>!a.enabled||!!a.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),wn=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()}),Sn=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),_n=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),En=e.object({enabled:e.boolean().default(!1),peers:e.array(Sn).default([]),inboxes:e.array(_n).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({})}),Tn=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({}),An=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({}),Rn=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(),An).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),Ue=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)}).default({}),vn=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({}),In=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Cn=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-]*$/),In).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({}),Fe=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),ze=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({})}),He=e.array(ze).default([]).superRefine((a,n)=>{let t=Te(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:t})}),We=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ke=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Xe=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(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!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(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!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({}),Ze=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional()}),providers:e.record(e.string(),ln).default({}),agents:e.record(e.string(),pn).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(yn).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(a=>a.trim()===""||Be(a),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(xn,'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:hn.default({}),crons:e.record(e.string(),M).default({}),wikiNotes:kn.default({}),services:e.record(e.string(),wn).default({}),notifications:vn,calls:Ue,whatsappTriage:ue,approvals:Xe,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:Fe,people:He,members:We,requestStatus:Ke,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:Cn,mesh:En.default({}),meshVoices:e.record(e.string(),De.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:$e.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Pe.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(L),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(N)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:v.default(_.talk),stop:v.default(_.stop),paste:v.default(_.paste)}).default({}),look:e.enum(Q).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(ee).default("sometimes"),palette:e.enum(O).default(E),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:W.optional(),boards:X,dashboard:Z,graph:Tn,decisions:Rn,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:Ce.default([]),agentxToolsByChannel:e.record(Ce).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({})});Ge="wiki-contribute",Ye="wiki-contribute-merge";q="wiki-summarize"});export{Mn as a,Bn as b,G as c,At as d,Fn as e,_ as f,J as g,w as h,Q as i,ee as j,O as k,Hn as l,ne as m,ae as n,re as o,Zn as p,oe as q,Yn as r,Vn as s,se as t,ue as u,de as v,x as w,p as x,$ as y,na as z,ce as A,me as B,oa as C,ia as D,A as E,sa as F,ge as G,he as H,Xt as I,fa as J,we as K,ga as L,Vt as M,pa as N,Se as O,ka as P,R as Q,wa as R,Ee as S,tn as T,nn as U,Ae as V,Sa as W,_a as X,Ea as Y,Re as Z,on as _,Aa as $,Ra as aa,Ie as ba,gn as ca,qe as da,Me as ea,Be as fa,Ue as ga,Fe as ha,ze as ia,He as ja,We as ka,Ke as la,Xe as ma,Ze as na,j as oa,On as pa,Ln as qa,Ge as ra,Ye as sa,Ve as ta,q as ua,Je as va,Nn as wa,$n as xa};
54
+ //# sourceMappingURL=chunk-DYGQF3MI.js.map