agentix-cli 0.151.0 → 0.152.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 (161) hide show
  1. package/dist/{App-WAWZFD66.js → App-NCB3Y5DS.js} +2 -2
  2. package/dist/{ChatApp-TRJIS3O4.js → ChatApp-HOWN5H7Y.js} +2 -2
  3. package/dist/{absorb-eval-CFWLHUTB.js → absorb-eval-JXRNSZII.js} +2 -2
  4. package/dist/agent-DMXUUMEU.js +2 -0
  5. package/dist/{board-dashboard-5V6RHW3E.js → board-dashboard-POWARL34.js} +402 -241
  6. package/dist/board-dashboard-POWARL34.js.map +1 -0
  7. package/dist/{chunk-X6C6U4GL.js → chunk-24QMHUU2.js} +5 -5
  8. package/dist/{chunk-X6C6U4GL.js.map → chunk-24QMHUU2.js.map} +1 -1
  9. package/dist/{chunk-ALE354ZC.js → chunk-7UH3DXAG.js} +2 -2
  10. package/dist/chunk-ADG6NBZY.js +862 -0
  11. package/dist/chunk-ADG6NBZY.js.map +1 -0
  12. package/dist/{chunk-IMITYHBT.js → chunk-CZEBLLZQ.js} +2 -2
  13. package/dist/{chunk-XD7HTMOP.js → chunk-DZUJP6L7.js} +2 -2
  14. package/dist/{chunk-TZZBGWLX.js → chunk-E4V5EADX.js} +6 -6
  15. package/dist/{chunk-XVJXXELY.js → chunk-GI5CY27P.js} +2 -2
  16. package/dist/{chunk-LVS5ESTS.js → chunk-HS7ATV4Z.js} +2 -2
  17. package/dist/{chunk-RGJZV5RY.js → chunk-ILZRO6SN.js} +2 -2
  18. package/dist/{chunk-UG2OF2EI.js → chunk-IVBCCSDR.js} +2 -2
  19. package/dist/{chunk-V3VWYIJ3.js → chunk-JDX7AYIB.js} +2 -2
  20. package/dist/{chunk-PUSBK2OQ.js → chunk-JHAQE46R.js} +46 -46
  21. package/dist/chunk-JHAQE46R.js.map +1 -0
  22. package/dist/chunk-JJOLZPUY.js +35 -0
  23. package/dist/chunk-JJOLZPUY.js.map +1 -0
  24. package/dist/{chunk-2PJKGZWP.js → chunk-JNG3P5V2.js} +2 -2
  25. package/dist/chunk-JNG3P5V2.js.map +1 -0
  26. package/dist/{chunk-2GJQDJBF.js → chunk-LDLRDBAD.js} +2 -2
  27. package/dist/{chunk-DJQIJF4R.js → chunk-LOTCKF22.js} +2 -2
  28. package/dist/{chunk-O7SYQXKS.js → chunk-MTBY46CL.js} +8 -8
  29. package/dist/{chunk-FGJNSYHM.js → chunk-P25TJ4XN.js} +3 -3
  30. package/dist/{chunk-6LFOX6Q5.js → chunk-P4EZJIQ4.js} +257 -256
  31. package/dist/chunk-P4EZJIQ4.js.map +1 -0
  32. package/dist/{chunk-X3T2GCSI.js → chunk-PC24JMEH.js} +2 -2
  33. package/dist/{chunk-EJTKLVIW.js → chunk-PGLTBNGZ.js} +2 -2
  34. package/dist/{chunk-4GXJMHSA.js → chunk-QSNKF5VD.js} +2 -2
  35. package/dist/{chunk-DFGANY25.js → chunk-R4R7EYY3.js} +2 -2
  36. package/dist/{chunk-Q5NLNLD5.js → chunk-RNAKP7WY.js} +2 -2
  37. package/dist/{chunk-L6IW6HWE.js → chunk-SQUTRMKH.js} +23 -20
  38. package/dist/chunk-SQUTRMKH.js.map +1 -0
  39. package/dist/{chunk-C5UTFHPB.js → chunk-TNZBQAUR.js} +2 -2
  40. package/dist/{chunk-Y5MFVVTM.js → chunk-U23LVMMZ.js} +2 -2
  41. package/dist/{chunk-YGDJV4ZZ.js → chunk-UFYKUC4E.js} +2 -2
  42. package/dist/{chunk-CTQ25CUL.js → chunk-VIZVF6KH.js} +2 -2
  43. package/dist/{chunk-ETBDN5WX.js → chunk-XE3CGJV4.js} +2 -2
  44. package/dist/{chunk-UALK4F3W.js → chunk-YBUCVI45.js} +2 -2
  45. package/dist/{chunk-DWXCZRBJ.js → chunk-YJZQRFET.js} +2 -2
  46. package/dist/cli.js +1 -1
  47. package/dist/{client-VT7GT3SK.js → client-6IOWB5AT.js} +2 -2
  48. package/dist/{compaction-FS6XNRLM.js → compaction-PFXWL4H7.js} +3 -3
  49. package/dist/{config-NZS2UTHI.js → config-SHIT5WJE.js} +2 -2
  50. package/dist/{config-mutate-LINLC354.js → config-mutate-6ACI5COM.js} +2 -2
  51. package/dist/config-mutator-LAEX6HOH.js +2 -0
  52. package/dist/{context-planner-3JDA7FNR.js → context-planner-DJB6CKY6.js} +2 -2
  53. package/dist/{contributions-67B3BYLV.js → contributions-N7K6LNL7.js} +2 -2
  54. package/dist/{doctor-FOKX4K2G.js → doctor-T7QAQRCJ.js} +2 -2
  55. package/dist/{follow-up-tool-JOIOYOON.js → follow-up-tool-HQ2GWF4K.js} +2 -2
  56. package/dist/{grants-QXF7N6SS.js → grants-HSLB62EG.js} +2 -2
  57. package/dist/heal-RGM7X2ZG.js +2 -0
  58. package/dist/hub-53IMEYGX.js +2 -0
  59. package/dist/index.d.ts +125 -6
  60. package/dist/index.js +1 -1
  61. package/dist/memory-extract-GHLBXV4H.js +2 -0
  62. package/dist/{program-XFZBG3EI.js → program-LSXONKPW.js} +225 -219
  63. package/dist/program-LSXONKPW.js.map +1 -0
  64. package/dist/{promote-WNYNTGKC.js → promote-626PE5VM.js} +2 -2
  65. package/dist/{providers-55NC2SFN.js → providers-BDJXGHEY.js} +2 -2
  66. package/dist/{query-ZU2DDCEH.js → query-GR3SOD6A.js} +2 -2
  67. package/dist/{query-settings-BXRIJWWO.js → query-settings-6XZHNFXE.js} +2 -2
  68. package/dist/{registry-7BITIEQ2.js → registry-SAY7ROZV.js} +2 -2
  69. package/dist/{request-planner-DLQP2NV6.js → request-planner-DWYXUVF4.js} +2 -2
  70. package/dist/{review-candidates-3BMHLIBW.js → review-candidates-GXWMKZKA.js} +2 -2
  71. package/dist/routing-TB6BBRH4.js +2 -0
  72. package/dist/schedule-tool-EI2SRMZM.js +2 -0
  73. package/dist/{scheduler-SYI5MZ3H.js → scheduler-VOZIMG5F.js} +2 -2
  74. package/dist/{seat-6JF7BYM7.js → seat-H6F6H55Y.js} +2 -2
  75. package/dist/{select-JT4I3JOH.js → select-OUBL6EMZ.js} +2 -2
  76. package/dist/{set-enabled-JRGFKA3S.js → set-enabled-NYJHFXHY.js} +2 -2
  77. package/dist/tool-FWATXW5Q.js +6 -0
  78. package/dist/tool-FWATXW5Q.js.map +1 -0
  79. package/dist/{tool-P6GVYNDO.js → tool-HXFGNBLS.js} +2 -2
  80. package/dist/wiki-PG5ZBOMH.js +2 -0
  81. package/dist/wiki-enrich-BIQZWJRB.js +2 -0
  82. package/package.json +1 -1
  83. package/dist/agent-6KCTPI7E.js +0 -2
  84. package/dist/board-dashboard-5V6RHW3E.js.map +0 -1
  85. package/dist/chunk-2PJKGZWP.js.map +0 -1
  86. package/dist/chunk-5I7NJMK6.js +0 -35
  87. package/dist/chunk-5I7NJMK6.js.map +0 -1
  88. package/dist/chunk-6LFOX6Q5.js.map +0 -1
  89. package/dist/chunk-CBML7UCP.js +0 -861
  90. package/dist/chunk-CBML7UCP.js.map +0 -1
  91. package/dist/chunk-L6IW6HWE.js.map +0 -1
  92. package/dist/chunk-PUSBK2OQ.js.map +0 -1
  93. package/dist/config-mutator-FUMSW5HD.js +0 -2
  94. package/dist/heal-U67X6NIN.js +0 -2
  95. package/dist/hub-QETWDYPD.js +0 -2
  96. package/dist/memory-extract-ATD6YLRK.js +0 -2
  97. package/dist/program-XFZBG3EI.js.map +0 -1
  98. package/dist/routing-FVZCQJ6T.js +0 -2
  99. package/dist/schedule-tool-TDVJHRQX.js +0 -2
  100. package/dist/tool-UDOUNWQT.js +0 -6
  101. package/dist/tool-UDOUNWQT.js.map +0 -1
  102. package/dist/wiki-MTZHDFHK.js +0 -2
  103. package/dist/wiki-enrich-CHR4RCRE.js +0 -2
  104. /package/dist/{App-WAWZFD66.js.map → App-NCB3Y5DS.js.map} +0 -0
  105. /package/dist/{ChatApp-TRJIS3O4.js.map → ChatApp-HOWN5H7Y.js.map} +0 -0
  106. /package/dist/{absorb-eval-CFWLHUTB.js.map → absorb-eval-JXRNSZII.js.map} +0 -0
  107. /package/dist/{agent-6KCTPI7E.js.map → agent-DMXUUMEU.js.map} +0 -0
  108. /package/dist/{chunk-ALE354ZC.js.map → chunk-7UH3DXAG.js.map} +0 -0
  109. /package/dist/{chunk-IMITYHBT.js.map → chunk-CZEBLLZQ.js.map} +0 -0
  110. /package/dist/{chunk-XD7HTMOP.js.map → chunk-DZUJP6L7.js.map} +0 -0
  111. /package/dist/{chunk-TZZBGWLX.js.map → chunk-E4V5EADX.js.map} +0 -0
  112. /package/dist/{chunk-XVJXXELY.js.map → chunk-GI5CY27P.js.map} +0 -0
  113. /package/dist/{chunk-LVS5ESTS.js.map → chunk-HS7ATV4Z.js.map} +0 -0
  114. /package/dist/{chunk-RGJZV5RY.js.map → chunk-ILZRO6SN.js.map} +0 -0
  115. /package/dist/{chunk-UG2OF2EI.js.map → chunk-IVBCCSDR.js.map} +0 -0
  116. /package/dist/{chunk-V3VWYIJ3.js.map → chunk-JDX7AYIB.js.map} +0 -0
  117. /package/dist/{chunk-2GJQDJBF.js.map → chunk-LDLRDBAD.js.map} +0 -0
  118. /package/dist/{chunk-DJQIJF4R.js.map → chunk-LOTCKF22.js.map} +0 -0
  119. /package/dist/{chunk-O7SYQXKS.js.map → chunk-MTBY46CL.js.map} +0 -0
  120. /package/dist/{chunk-FGJNSYHM.js.map → chunk-P25TJ4XN.js.map} +0 -0
  121. /package/dist/{chunk-X3T2GCSI.js.map → chunk-PC24JMEH.js.map} +0 -0
  122. /package/dist/{chunk-EJTKLVIW.js.map → chunk-PGLTBNGZ.js.map} +0 -0
  123. /package/dist/{chunk-4GXJMHSA.js.map → chunk-QSNKF5VD.js.map} +0 -0
  124. /package/dist/{chunk-DFGANY25.js.map → chunk-R4R7EYY3.js.map} +0 -0
  125. /package/dist/{chunk-Q5NLNLD5.js.map → chunk-RNAKP7WY.js.map} +0 -0
  126. /package/dist/{chunk-C5UTFHPB.js.map → chunk-TNZBQAUR.js.map} +0 -0
  127. /package/dist/{chunk-Y5MFVVTM.js.map → chunk-U23LVMMZ.js.map} +0 -0
  128. /package/dist/{chunk-YGDJV4ZZ.js.map → chunk-UFYKUC4E.js.map} +0 -0
  129. /package/dist/{chunk-CTQ25CUL.js.map → chunk-VIZVF6KH.js.map} +0 -0
  130. /package/dist/{chunk-ETBDN5WX.js.map → chunk-XE3CGJV4.js.map} +0 -0
  131. /package/dist/{chunk-UALK4F3W.js.map → chunk-YBUCVI45.js.map} +0 -0
  132. /package/dist/{chunk-DWXCZRBJ.js.map → chunk-YJZQRFET.js.map} +0 -0
  133. /package/dist/{client-VT7GT3SK.js.map → client-6IOWB5AT.js.map} +0 -0
  134. /package/dist/{compaction-FS6XNRLM.js.map → compaction-PFXWL4H7.js.map} +0 -0
  135. /package/dist/{config-NZS2UTHI.js.map → config-SHIT5WJE.js.map} +0 -0
  136. /package/dist/{config-mutate-LINLC354.js.map → config-mutate-6ACI5COM.js.map} +0 -0
  137. /package/dist/{config-mutator-FUMSW5HD.js.map → config-mutator-LAEX6HOH.js.map} +0 -0
  138. /package/dist/{context-planner-3JDA7FNR.js.map → context-planner-DJB6CKY6.js.map} +0 -0
  139. /package/dist/{contributions-67B3BYLV.js.map → contributions-N7K6LNL7.js.map} +0 -0
  140. /package/dist/{doctor-FOKX4K2G.js.map → doctor-T7QAQRCJ.js.map} +0 -0
  141. /package/dist/{follow-up-tool-JOIOYOON.js.map → follow-up-tool-HQ2GWF4K.js.map} +0 -0
  142. /package/dist/{grants-QXF7N6SS.js.map → grants-HSLB62EG.js.map} +0 -0
  143. /package/dist/{heal-U67X6NIN.js.map → heal-RGM7X2ZG.js.map} +0 -0
  144. /package/dist/{hub-QETWDYPD.js.map → hub-53IMEYGX.js.map} +0 -0
  145. /package/dist/{memory-extract-ATD6YLRK.js.map → memory-extract-GHLBXV4H.js.map} +0 -0
  146. /package/dist/{promote-WNYNTGKC.js.map → promote-626PE5VM.js.map} +0 -0
  147. /package/dist/{providers-55NC2SFN.js.map → providers-BDJXGHEY.js.map} +0 -0
  148. /package/dist/{query-ZU2DDCEH.js.map → query-GR3SOD6A.js.map} +0 -0
  149. /package/dist/{query-settings-BXRIJWWO.js.map → query-settings-6XZHNFXE.js.map} +0 -0
  150. /package/dist/{registry-7BITIEQ2.js.map → registry-SAY7ROZV.js.map} +0 -0
  151. /package/dist/{request-planner-DLQP2NV6.js.map → request-planner-DWYXUVF4.js.map} +0 -0
  152. /package/dist/{review-candidates-3BMHLIBW.js.map → review-candidates-GXWMKZKA.js.map} +0 -0
  153. /package/dist/{routing-FVZCQJ6T.js.map → routing-TB6BBRH4.js.map} +0 -0
  154. /package/dist/{schedule-tool-TDVJHRQX.js.map → schedule-tool-EI2SRMZM.js.map} +0 -0
  155. /package/dist/{scheduler-SYI5MZ3H.js.map → scheduler-VOZIMG5F.js.map} +0 -0
  156. /package/dist/{seat-6JF7BYM7.js.map → seat-H6F6H55Y.js.map} +0 -0
  157. /package/dist/{select-JT4I3JOH.js.map → select-OUBL6EMZ.js.map} +0 -0
  158. /package/dist/{set-enabled-JRGFKA3S.js.map → set-enabled-NYJHFXHY.js.map} +0 -0
  159. /package/dist/{tool-P6GVYNDO.js.map → tool-HXFGNBLS.js.map} +0 -0
  160. /package/dist/{wiki-MTZHDFHK.js.map → wiki-PG5ZBOMH.js.map} +0 -0
  161. /package/dist/{wiki-enrich-CHR4RCRE.js.map → wiki-enrich-BIQZWJRB.js.map} +0 -0
@@ -1,6 +1,6 @@
1
- import{b as ie,d as se,h as Xt}from"./chunk-BRK6M6LA.js";import{l as le,m as G,n as Gt}from"./chunk-UIBUZ2N3.js";import{a as oe,e as Kt}from"./chunk-2QNT5JDS.js";import{a as g,b as zt}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var Vt,Zt,Yt,Jt,Qt,en,tn,nn,rn,ue,de=g(()=>{"use strict";Vt=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),Zt=l.object({days:l.array(Vt).default(["mon","tue","wed","thu","fri"]),start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/),lunch:l.object({start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/)}).optional()}),Yt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),Jt=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:Zt,utilizationTarget:l.number().min(0).max(1).default(.8)}),Qt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),en=l.discriminatedUnion("type",[l.object({type:l.literal("backlog"),path:l.string().default(".agentx/backlog.md")}),l.object({type:l.literal("gitlab"),projects:l.array(l.string()).default([])}),l.object({type:l.literal("wiki"),path:l.string(),glob:l.string().default("**/*.md")})]),tn=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),nn=l.object({channel:l.string().optional(),chatId:l.string().optional(),username:l.string().optional(),senderId:l.string().optional(),client:l.string(),project:l.string().optional(),displayName:l.string().optional()}),rn=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),ue=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:Qt,workSource:en,roles:l.record(l.string(),Yt).default({}),orgChart:l.record(l.string(),Jt).default({}),projects:l.array(tn).default([]),contactMap:l.array(nn).default([]),clients:l.record(l.string(),rn).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as u}from"zod";function zr(r,t){let n=new Set(r.labels||[]);if(r.state==="closed"){let o=t.find(i=>i.kind==="closed");if(o)return o.id}for(let o of t)if(o.kind==="scoped-label"&&o.scopedLabel&&n.has(o.scopedLabel))return o.id;for(let o of t)if(o.kind==="label"&&o.mapsToLabel&&n.has(o.mapsToLabel))return o.id;let a=t.find(o=>o.kind==="open-backlog");if(a){let o=a.scopedPrefix+"::";return[...n].some(s=>s.startsWith(o))?null:a.id}return t[0]?.id??null}function Kr(r,t){let n=[],a=[],o=!1,i=!1;return t.kind==="scoped-label"&&t.scopedLabel?n.push(t.scopedLabel):t.kind==="label"&&t.mapsToLabel?n.push(t.mapsToLabel):t.kind==="closed"&&(o=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?a.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?a.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(i=!0)),{addLabels:n.length?n:void 0,removeLabels:a.length?a:void 0,closeIssue:o||void 0,reopen:i||void 0}}var an,on,sn,ln,un,dn,ce,cn,me,fe=g(()=>{"use strict";an=u.object({name:u.string(),color:u.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:u.string().optional()}),on=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:u.string(),kind:u.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:u.string().optional(),scopedLabel:u.string().optional(),scopedPrefix:u.string().default("Status"),accent:u.string().optional()}),sn=u.object({enabled:u.boolean().default(!0),staleDoingMinutes:u.number().int().min(1).default(45),respectLunchBreak:u.boolean().default(!0),respectSchedule:u.boolean().default(!0),action:u.enum(["badge","notify"]).default("badge")}),ln=u.discriminatedUnion("type",[u.object({type:u.literal("gitlab"),projects:u.array(u.string()).min(1)})]),un=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],dn=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:u.string(),source:ln,primaryToolLabel:u.string().optional(),labels:u.array(an).default([]),columns:u.array(on).min(1).default(un),timeRangeDays:u.number().int().min(1).max(365).default(30),closedWindowDays:u.number().int().min(1).max(365).default(30),reconciliation:sn.default({})}),ce=u.array(dn).default([]),cn=u.object({name:u.string(),url:u.string(),dashboardUrl:u.string().optional(),token:u.string().optional(),dashboardToken:u.string().optional()}),me=u.object({enabled:u.boolean().default(!1),port:u.number().int().default(4202),bind:u.string().default("127.0.0.1"),token:u.string().optional(),daemonUrl:u.string().default("http://localhost:18800"),daemons:u.array(cn).default([]),draftAgent:u.string().optional()}).default({})});function bn(r){let t=String(r??"").trim().toLowerCase();if(!t)return{ok:!1,error:"is empty"};let n=t.split("+").map(i=>i.trim());if(n.some(i=>!i))return{ok:!1,error:`"${r}" has an empty part; write it like opt+space`};let a=pn[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=mn[i];if(!s)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(o.has(s))return{ok:!1,error:`"${r}" names ${s} twice`};o.add(s)}return hn(a)?!ge(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...fn.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function pe(r){let t=bn(r);return t.ok?void 0:t.error}function Gr(r){let t={ctrl:"\u2303",opt:"\u2325",shift:"\u21E7",cmd:"\u2318"},n={space:"Space",period:".",comma:",",slash:"/",semicolon:";",quote:"'",minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",grave:"`",return:"Return",tab:"Tab"},a=r.split("+"),o=a.pop()??"";return a.map(i=>t[i]??i).join("")+(n[o]??o.toUpperCase())}var mn,fn,gn,pn,ge,hn,L,he=g(()=>{"use strict";mn={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},fn=["ctrl","opt","shift","cmd"],gn=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],pn={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},ge=r=>/^f([1-9]|1[0-9]|20)$/.test(r),hn=r=>/^[a-z0-9]$/.test(r)||gn.includes(r)||ge(r);L={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function ye(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(f=>parseInt(f,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),d=i-s;return d<.04?null:((i===n?(a-o)/d%6:i===a?(o-n)/d+2:(n-a)/d+4)*60+360)%360}function xn(r){let t=ye(r);if(t===null)return v.find(o=>o.id==="lagoon");let n=v[0],a=360;for(let o of v){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function Zr(r,t=N){let n=s=>v.find(d=>d.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&ye(o)!==null?xn(o):n(t)??n(N),set:!1}}var v,be,xe,V,N,ke=g(()=>{"use strict";v=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],be=["orb","character"],xe=["off","rarely","sometimes","often"],V=v.map(r=>r.id);N="lagoon"});function _e(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])yn.has(i)&&a++,kn.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:_n.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var yn,kn,_n,we=g(()=>{"use strict";yn=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),kn=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),_n=/[éèêëàâçùûîïôœ]/});function ea(r,t=Z){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+wn[_e(a)??"en"]}return n}var Z,wn,Se=g(()=>{"use strict";we();Z=500,wn={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});function ra(r,t=Y){let n=new Set(t.map(Ee)),a=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,s)=>n.has(Ee(i??s))?"":o);return!/[\p{L}\p{N}]/u.test(a)}var Y,na,Ee,ve=g(()=>{"use strict";Y=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],na="I didn't catch that.",Ee=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Sn}from"crypto";function An(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function ia(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var O,En,vn,Tn,Rn,Te,Re=g(()=>{"use strict";O={enabled:!0,defaultSeconds:120,maxSeconds:1800},En=80,vn=/^[a-f0-9]{24}$/,Tn=25e3,Rn=2e3;Te=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??An}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...O,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(A,_)=>({ok:!1,reason:A,error:_,view:this.view()});if(!n.enabled)return a("off","The floor is off on this computer (voice.floor.enabled)");let o=String(t.holder??"").replace(/\s+/g," ").trim().slice(0,En),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,d=t.id??Sn(12).toString("hex");if(!vn.test(d))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let c=this.current;if(c)return a("held",`The floor is held by ${c.holder}`);let f=this.deps.busy?.();if(f)return a("busy",`The floor is taken by ${f}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let x=this.now(),y={id:d,holder:o,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:x,expiresAt:x+i*1e3};return this.hold=y,this.ended=null,this.arm(),this.changed(),{ok:!0,id:y.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let a=this.settings,o=n??Math.min(a.defaultSeconds,a.maxSeconds);return!Number.isFinite(o)||o<=0||o>a.maxSeconds?null:(this.hold.expiresAt=this.now()+o*1e3,this.arm(),this.changed(),this.view())}release(t){return this.holds(t)?(this.end("released"),!0):!1}revoke(){return this.current?(this.end("owner"),!0):!1}next(t,n=Tn,a){return t!==this.view().seq?Promise.resolve(this.view()):new Promise(o=>{let i=()=>{clearTimeout(s),this.waiters.delete(i),o(this.view())},s=setTimeout(i,n);s.unref?.(),this.waiters.add(i),a?.addEventListener("abort",i,{once:!0})})}close(){this.disarm();for(let t of[...this.waiters])t()}end(t){this.hold&&(this.hold=null,this.ended=t,this.disarm(),this.changed())}arm(){this.disarm();let t=this.hold;if(!t||(this.expiry=setTimeout(()=>{this.hold===t&&this.view()},Math.max(0,t.expiresAt-this.now())+5),this.expiry.unref?.(),t.pid===null))return;let n=t.pid;this.watch=setInterval(()=>{this.hold===t&&!this.alive(n)&&this.end("holder gone")},Rn),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as m}from"zod";var Ae,Cn,Ce,Ie=g(()=>{"use strict";Ae=m.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Cn=m.object({id:m.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:m.boolean().default(!0),chats:m.array(m.string().min(1)).default([]),senders:m.array(m.string().min(1)).default([]),agent:m.string().min(1),prompt:m.string().max(4e3).optional(),quietHours:m.object({start:Ae,end:Ae}).optional(),autoAck:m.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),Ce=m.object({enabled:m.boolean().default(!1),secretEnv:m.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:m.number().int().min(0).max(600).default(20),timezone:m.string().optional(),allowAutoAck:m.boolean().default(!1),describeMedia:m.boolean().default(!0),wacli:m.object({bin:m.string().default("wacli"),account:m.string().optional(),store:m.string().optional()}).default({}),rules:m.array(Cn).default([])}).default({})});function Le(r){let t=$e(r.url);if(!/^https?:\/\/\S+$/i.test(t))return"url must be an http(s) address";if(t.length>1e3)return"url is longer than 1000 characters";let n=$e(r.contains);return n.length>200?"contains is longer than 200 characters":{kind:"url",url:t,...n?{contains:n}:{}}}async function Ne(r,t){let n=t.fetch??fetch,a;try{a=await n(r.url,{signal:AbortSignal.timeout(1e4),redirect:"follow"})}catch(o){return{verdict:"unverifiable",detail:`${r.url} could not be reached: ${String(o?.message??o).slice(0,200)}`}}return a.ok?r.contains&&!(await a.text()).slice(0,1e6).includes(r.contains)?{verdict:"not_met",detail:`${r.url} answered without "${r.contains}"`}:{verdict:"met",detail:`${r.url} answered${r.contains?` with "${r.contains}"`:""}`}:{verdict:"not_met",detail:`${r.url} answered HTTP ${a.status}`}}var $e,Oe=g(()=>{"use strict";$e=r=>typeof r=="string"?r.trim():""});function De(r,t){let n=In(r,t);return n&&n.project.split("/").every(a=>a!=="."&&a!=="..")?n:null}function In(r,t){let n=t.match(/^([\w.-]+(?:\/[\w.-]+)+)([#!])(\d+)$/);if(n)return r==="github"&&(n[2]==="!"||n[1].split("/").length!==2)?null:{project:n[1],number:Number(n[3]),mr:n[2]==="!"};let a;try{a=new URL(t)}catch{return null}let o=a.pathname.replace(/\/+$/,"");if(r==="github"){let s=o.match(/^\/([\w.-]+\/[\w.-]+)\/(issues|pull)\/(\d+)$/);return s?{project:s[1],number:Number(s[3]),mr:s[2]==="pull"}:null}let i=o.match(/^\/(.+?)\/-\/(issues|merge_requests)\/(\d+)$/);return i?{project:i[1],number:Number(i[3]),mr:i[2]==="merge_requests"}:null}function Pe(r){let t=j(r.provider).toLowerCase();if(t!=="github"&&t!=="gitlab")return"provider must be github or gitlab";let n=j(r.ref);if(!n||n.length>500||!De(t,n))return t==="github"?'ref must be "owner/repo#12" or the issue or pull request address':'ref must be "group/project#12" (issue), "group/project!12" (merge request) or its address';let a=j(r.state).toLowerCase();if(a&&!je.includes(a))return`state must be one of ${je.join(", ")}`;let o=j(r.notePattern);return o.length>200?"notePattern is longer than 200 characters":{kind:"issue",provider:t,ref:n,...a?{state:a}:{},...o?{notePattern:o}:{}}}async function Me(r,t){if(!t.forge)return{verdict:"unverifiable",detail:`no ${r.provider} connector on this node`};let n=De(r.provider,r.ref);if(!n)return{verdict:"unverifiable",detail:`${r.ref} is not an issue reference`};let a=await t.forge(r.provider,n,{notes:!!r.notePattern});if("error"in a)return{verdict:"unverifiable",detail:`${r.ref}: ${a.error}`};let o=r.state??(r.notePattern?null:"closed");if(o&&$n(o,a.state))return{verdict:"met",detail:`${a.url} is ${a.state}`};if(r.notePattern){let i=r.notePattern.toLowerCase();if((a.notes??[]).some(s=>s.slice(0,1e4).toLowerCase().includes(i)))return{verdict:"met",detail:`${a.url} has a note with "${r.notePattern}"`}}return{verdict:"not_met",detail:`${a.url} is ${a.state}${r.notePattern?`, no note has "${r.notePattern}"`:""}`}}function ca(r,t=fetch){let n=async(a,o)=>{let i;try{i=await t(a,{headers:o,signal:AbortSignal.timeout(1e4)})}catch(s){return{ok:!1,error:`could not be reached: ${String(s?.message??s).slice(0,200)}`}}return i.ok?{ok:!0,body:await i.json().catch(()=>null)}:{ok:!1,error:i.status===404?"not found (or not visible to the connector)":`HTTP ${i.status}`}};return async(a,o,i)=>{if(a==="github"){let w=r.github;if(!w)return{error:"no github connector on this node (channels.github or requests.checkers.github)"};let Wt=w.apiUrl.replace(/\/$/,""),K={Accept:"application/vnd.github+json",...w.token?{Authorization:`Bearer ${w.token}`}:{}},X=`${Wt}/repos/${o.project}`,E=await n(`${X}/issues/${o.number}`,K);if(!E.ok)return{error:E.error};let C=E.body?.state==="closed"?"closed":"open";if(E.body?.pull_request&&C==="closed"){let $=await n(`${X}/pulls/${o.number}`,K);$.ok&&$.body?.merged&&(C="merged")}let ae=String(E.body?.html_url??`${o.project}#${o.number}`);if(!i.notes)return{state:C,url:ae};let I=await n(`${X}/issues/${o.number}/comments?per_page=100`,K);return I.ok?{state:C,url:ae,notes:(Array.isArray(I.body)?I.body:[]).map($=>String($?.body??""))}:{error:`its notes: ${I.error}`}}let s=r.gitlab;if(!s)return{error:"no gitlab connector on this node (channels.gitlab or requests.checkers.gitlab)"};let d=s.token?{"PRIVATE-TOKEN":s.token}:{},c=`${s.url.replace(/\/$/,"")}/api/v4/projects/${encodeURIComponent(o.project)}/${o.mr?"merge_requests":"issues"}/${o.number}`,f=await n(c,d);if(!f.ok)return{error:f.error};let x=String(f.body?.state??""),y=x==="merged"?"merged":x==="closed"?"closed":"open",A=String(f.body?.web_url??`${o.project}${o.mr?"!":"#"}${o.number}`);if(!i.notes)return{state:y,url:A};let _=await n(`${c}/notes?per_page=100&sort=desc&order_by=created_at`,d);return _.ok?{state:y,url:A,notes:(Array.isArray(_.body)?_.body:[]).map(w=>String(w?.body??"")).reverse()}:{error:`its notes: ${_.error}`}}}var je,j,$n,qe=g(()=>{"use strict";je=["open","closed","merged"],j=r=>typeof r=="string"?r.trim():"";$n=(r,t)=>r===t||r==="closed"&&t==="merged"});import{execFile as Ln}from"child_process";function Fe(r,t){let n=J(r.repo),a=Object.keys(t.repos);if(!n||!Object.prototype.hasOwnProperty.call(t.repos,n))return a.length?`repo must be one of ${a.join(", ")} (requests.checkers.repos)`:"no repos are set up for this check on this node (requests.checkers.repos)";let o=J(r.commit);if(!On.test(o))return"commit must be a commit hash (7 to 64 hex characters)";let i=J(r.ref);return i&&!jn.test(i)?"ref must be a branch or tag name, for example main or origin/main":{kind:"git-ancestor",repo:n,commit:o,...i?{ref:i}:{}}}async function Ue(r,t){let n=t.settings.repos[r.repo];if(!n)return{verdict:"unverifiable",detail:`no repo "${r.repo}" in requests.checkers.repos on this node`};let a=r.ref??"HEAD",{code:o,stderr:i}=await(t.git??Dn)(n,["merge-base","--is-ancestor",r.commit,a]);if(o===0)return{verdict:"met",detail:`commit ${r.commit} is in ${a} of ${r.repo}`};if(o===1)return{verdict:"not_met",detail:`commit ${r.commit} is not in ${a} of ${r.repo} yet`};let s=i.replace(/\s+/g," ").trim().slice(0,200)||`git exited with ${o}`;return{verdict:"unverifiable",detail:`could not check ${r.commit} in ${r.repo}: ${s}`}}var Nn,On,jn,J,Dn,He=g(()=>{"use strict";Nn=1e4,On=/^[0-9a-f]{7,64}$/i,jn=/^(?!-)(?!.*\.\.)[A-Za-z0-9._\/-]{1,200}$/,J=r=>typeof r=="string"?r.trim():"";Dn=(r,t)=>new Promise(n=>{Ln("git",["-C",r,...t],{timeout:Nn,windowsHide:!0},(a,o,i)=>{n({code:a?typeof a.code=="number"?a.code:-1:0,stderr:String(i??"")})})})});function Be(r,t){let n=D(r.channel).toLowerCase(),a=D(r.chatId),o=D(r.from);if(!n||!a)return"a reply check needs channel and chatId: the chat the answer arrives in";if(!o)return"a reply check needs from: the id of the person who answers (people)";if([n,a,o].some(s=>s.length>200))return"channel, chatId and from are at most 200 characters";let i=t;if(r.after!==void 0){let s=typeof r.after=="number"?r.after:Date.parse(D(r.after));if(!Number.isFinite(s)||s<0)return"after must be epoch milliseconds or an ISO date";i=s}return{kind:"reply",channel:n,chatId:a,from:o,after:i}}async function We(r,t){if(!t.inbound)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let n=r.after??0,a=t.inbound(r.channel,r.chatId,n,r.from);if(!a)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let o=r.from.toLowerCase(),i=a.find(s=>s.at>n&&(s.person??"").toLowerCase()===o);return i?{verdict:"met",detail:`${r.from} wrote on ${r.channel} chat ${r.chatId} at ${new Date(i.at).toISOString().slice(0,16).replace("T"," ")} UTC`}:{verdict:"not_met",detail:`no message from ${r.from} on ${r.channel} chat ${r.chatId} yet`}}function pa(r){return(t,n,a,o)=>{try{return r.prepare(`SELECT person, started_at AS at FROM task_traces
1
+ import{b as ie,d as se,h as Xt}from"./chunk-BRK6M6LA.js";import{l as le,m as G,n as Gt}from"./chunk-UIBUZ2N3.js";import{a as oe,e as Kt}from"./chunk-2QNT5JDS.js";import{a as g,b as zt}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var Vt,Yt,Zt,Jt,Qt,en,tn,nn,rn,ue,de=g(()=>{"use strict";Vt=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),Yt=l.object({days:l.array(Vt).default(["mon","tue","wed","thu","fri"]),start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/),lunch:l.object({start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/)}).optional()}),Zt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),Jt=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:Yt,utilizationTarget:l.number().min(0).max(1).default(.8)}),Qt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),en=l.discriminatedUnion("type",[l.object({type:l.literal("backlog"),path:l.string().default(".agentx/backlog.md")}),l.object({type:l.literal("gitlab"),projects:l.array(l.string()).default([])}),l.object({type:l.literal("wiki"),path:l.string(),glob:l.string().default("**/*.md")})]),tn=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),nn=l.object({channel:l.string().optional(),chatId:l.string().optional(),username:l.string().optional(),senderId:l.string().optional(),client:l.string(),project:l.string().optional(),displayName:l.string().optional()}),rn=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),ue=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:Qt,workSource:en,roles:l.record(l.string(),Zt).default({}),orgChart:l.record(l.string(),Jt).default({}),projects:l.array(tn).default([]),contactMap:l.array(nn).default([]),clients:l.record(l.string(),rn).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as u}from"zod";function zr(r,t){let n=new Set(r.labels||[]);if(r.state==="closed"){let o=t.find(i=>i.kind==="closed");if(o)return o.id}for(let o of t)if(o.kind==="scoped-label"&&o.scopedLabel&&n.has(o.scopedLabel))return o.id;for(let o of t)if(o.kind==="label"&&o.mapsToLabel&&n.has(o.mapsToLabel))return o.id;let a=t.find(o=>o.kind==="open-backlog");if(a){let o=a.scopedPrefix+"::";return[...n].some(s=>s.startsWith(o))?null:a.id}return t[0]?.id??null}function Kr(r,t){let n=[],a=[],o=!1,i=!1;return t.kind==="scoped-label"&&t.scopedLabel?n.push(t.scopedLabel):t.kind==="label"&&t.mapsToLabel?n.push(t.mapsToLabel):t.kind==="closed"&&(o=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?a.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?a.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(i=!0)),{addLabels:n.length?n:void 0,removeLabels:a.length?a:void 0,closeIssue:o||void 0,reopen:i||void 0}}var an,on,sn,ln,un,dn,ce,cn,me,fe=g(()=>{"use strict";an=u.object({name:u.string(),color:u.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:u.string().optional()}),on=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:u.string(),kind:u.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:u.string().optional(),scopedLabel:u.string().optional(),scopedPrefix:u.string().default("Status"),accent:u.string().optional()}),sn=u.object({enabled:u.boolean().default(!0),staleDoingMinutes:u.number().int().min(1).default(45),respectLunchBreak:u.boolean().default(!0),respectSchedule:u.boolean().default(!0),action:u.enum(["badge","notify"]).default("badge")}),ln=u.discriminatedUnion("type",[u.object({type:u.literal("gitlab"),projects:u.array(u.string()).min(1)})]),un=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],dn=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:u.string(),source:ln,primaryToolLabel:u.string().optional(),labels:u.array(an).default([]),columns:u.array(on).min(1).default(un),timeRangeDays:u.number().int().min(1).max(365).default(30),closedWindowDays:u.number().int().min(1).max(365).default(30),reconciliation:sn.default({})}),ce=u.array(dn).default([]),cn=u.object({name:u.string(),url:u.string(),dashboardUrl:u.string().optional(),token:u.string().optional(),dashboardToken:u.string().optional()}),me=u.object({enabled:u.boolean().default(!1),port:u.number().int().default(4202),bind:u.string().default("127.0.0.1"),token:u.string().optional(),daemonUrl:u.string().default("http://localhost:18800"),daemons:u.array(cn).default([]),draftAgent:u.string().optional()}).default({})});function bn(r){let t=String(r??"").trim().toLowerCase();if(!t)return{ok:!1,error:"is empty"};let n=t.split("+").map(i=>i.trim());if(n.some(i=>!i))return{ok:!1,error:`"${r}" has an empty part; write it like opt+space`};let a=pn[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=mn[i];if(!s)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(o.has(s))return{ok:!1,error:`"${r}" names ${s} twice`};o.add(s)}return hn(a)?!ge(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...fn.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function pe(r){let t=bn(r);return t.ok?void 0:t.error}function Gr(r){let t={ctrl:"\u2303",opt:"\u2325",shift:"\u21E7",cmd:"\u2318"},n={space:"Space",period:".",comma:",",slash:"/",semicolon:";",quote:"'",minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",grave:"`",return:"Return",tab:"Tab"},a=r.split("+"),o=a.pop()??"";return a.map(i=>t[i]??i).join("")+(n[o]??o.toUpperCase())}var mn,fn,gn,pn,ge,hn,L,he=g(()=>{"use strict";mn={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},fn=["ctrl","opt","shift","cmd"],gn=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],pn={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},ge=r=>/^f([1-9]|1[0-9]|20)$/.test(r),hn=r=>/^[a-z0-9]$/.test(r)||gn.includes(r)||ge(r);L={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function ye(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(f=>parseInt(f,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),d=i-s;return d<.04?null:((i===n?(a-o)/d%6:i===a?(o-n)/d+2:(n-a)/d+4)*60+360)%360}function xn(r){let t=ye(r);if(t===null)return T.find(o=>o.id==="lagoon");let n=T[0],a=360;for(let o of T){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function Yr(r,t=N){let n=s=>T.find(d=>d.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&ye(o)!==null?xn(o):n(t)??n(N),set:!1}}var T,be,xe,V,N,ke=g(()=>{"use strict";T=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],be=["orb","character"],xe=["off","rarely","sometimes","often"],V=T.map(r=>r.id);N="lagoon"});function _e(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])yn.has(i)&&a++,kn.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:_n.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var yn,kn,_n,we=g(()=>{"use strict";yn=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),kn=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),_n=/[éèêëàâçùûîïôœ]/});function ea(r,t=Y){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+wn[_e(a)??"en"]}return n}var Y,wn,Se=g(()=>{"use strict";we();Y=500,wn={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});function ra(r,t=Z){let n=new Set(t.map(Ee)),a=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,s)=>n.has(Ee(i??s))?"":o);return!/[\p{L}\p{N}]/u.test(a)}var Z,na,Ee,Te=g(()=>{"use strict";Z=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],na="I didn't catch that.",Ee=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Sn}from"crypto";function An(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function ia(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var O,En,Tn,vn,Rn,ve,Re=g(()=>{"use strict";O={enabled:!0,defaultSeconds:120,maxSeconds:1800},En=80,Tn=/^[a-f0-9]{24}$/,vn=25e3,Rn=2e3;ve=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??An}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...O,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(A,_)=>({ok:!1,reason:A,error:_,view:this.view()});if(!n.enabled)return a("off","The floor is off on this computer (voice.floor.enabled)");let o=String(t.holder??"").replace(/\s+/g," ").trim().slice(0,En),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,d=t.id??Sn(12).toString("hex");if(!Tn.test(d))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let c=this.current;if(c)return a("held",`The floor is held by ${c.holder}`);let f=this.deps.busy?.();if(f)return a("busy",`The floor is taken by ${f}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let y=this.now(),k={id:d,holder:o,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:y,expiresAt:y+i*1e3};return this.hold=k,this.ended=null,this.arm(),this.changed(),{ok:!0,id:k.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let a=this.settings,o=n??Math.min(a.defaultSeconds,a.maxSeconds);return!Number.isFinite(o)||o<=0||o>a.maxSeconds?null:(this.hold.expiresAt=this.now()+o*1e3,this.arm(),this.changed(),this.view())}release(t){return this.holds(t)?(this.end("released"),!0):!1}revoke(){return this.current?(this.end("owner"),!0):!1}next(t,n=vn,a){return t!==this.view().seq?Promise.resolve(this.view()):new Promise(o=>{let i=()=>{clearTimeout(s),this.waiters.delete(i),o(this.view())},s=setTimeout(i,n);s.unref?.(),this.waiters.add(i),a?.addEventListener("abort",i,{once:!0})})}close(){this.disarm();for(let t of[...this.waiters])t()}end(t){this.hold&&(this.hold=null,this.ended=t,this.disarm(),this.changed())}arm(){this.disarm();let t=this.hold;if(!t||(this.expiry=setTimeout(()=>{this.hold===t&&this.view()},Math.max(0,t.expiresAt-this.now())+5),this.expiry.unref?.(),t.pid===null))return;let n=t.pid;this.watch=setInterval(()=>{this.hold===t&&!this.alive(n)&&this.end("holder gone")},Rn),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as m}from"zod";var Ae,Cn,Ce,Ie=g(()=>{"use strict";Ae=m.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Cn=m.object({id:m.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:m.boolean().default(!0),chats:m.array(m.string().min(1)).default([]),senders:m.array(m.string().min(1)).default([]),agent:m.string().min(1),prompt:m.string().max(4e3).optional(),quietHours:m.object({start:Ae,end:Ae}).optional(),autoAck:m.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),Ce=m.object({enabled:m.boolean().default(!1),secretEnv:m.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:m.number().int().min(0).max(600).default(20),timezone:m.string().optional(),allowAutoAck:m.boolean().default(!1),describeMedia:m.boolean().default(!0),wacli:m.object({bin:m.string().default("wacli"),account:m.string().optional(),store:m.string().optional()}).default({}),rules:m.array(Cn).default([])}).default({})});function Le(r){let t=$e(r.url);if(!/^https?:\/\/\S+$/i.test(t))return"url must be an http(s) address";if(t.length>1e3)return"url is longer than 1000 characters";let n=$e(r.contains);return n.length>200?"contains is longer than 200 characters":{kind:"url",url:t,...n?{contains:n}:{}}}async function Ne(r,t){let n=t.fetch??fetch,a;try{a=await n(r.url,{signal:AbortSignal.timeout(1e4),redirect:"follow"})}catch(o){return{verdict:"unverifiable",detail:`${r.url} could not be reached: ${String(o?.message??o).slice(0,200)}`}}return a.ok?r.contains&&!(await a.text()).slice(0,1e6).includes(r.contains)?{verdict:"not_met",detail:`${r.url} answered without "${r.contains}"`}:{verdict:"met",detail:`${r.url} answered${r.contains?` with "${r.contains}"`:""}`}:{verdict:"not_met",detail:`${r.url} answered HTTP ${a.status}`}}var $e,Oe=g(()=>{"use strict";$e=r=>typeof r=="string"?r.trim():""});function De(r,t){let n=In(r,t);return n&&n.project.split("/").every(a=>a!=="."&&a!=="..")?n:null}function In(r,t){let n=t.match(/^([\w.-]+(?:\/[\w.-]+)+)([#!])(\d+)$/);if(n)return r==="github"&&(n[2]==="!"||n[1].split("/").length!==2)?null:{project:n[1],number:Number(n[3]),mr:n[2]==="!"};let a;try{a=new URL(t)}catch{return null}let o=a.pathname.replace(/\/+$/,"");if(r==="github"){let s=o.match(/^\/([\w.-]+\/[\w.-]+)\/(issues|pull)\/(\d+)$/);return s?{project:s[1],number:Number(s[3]),mr:s[2]==="pull"}:null}let i=o.match(/^\/(.+?)\/-\/(issues|merge_requests)\/(\d+)$/);return i?{project:i[1],number:Number(i[3]),mr:i[2]==="merge_requests"}:null}function Pe(r){let t=j(r.provider).toLowerCase();if(t!=="github"&&t!=="gitlab")return"provider must be github or gitlab";let n=j(r.ref);if(!n||n.length>500||!De(t,n))return t==="github"?'ref must be "owner/repo#12" or the issue or pull request address':'ref must be "group/project#12" (issue), "group/project!12" (merge request) or its address';let a=j(r.state).toLowerCase();if(a&&!je.includes(a))return`state must be one of ${je.join(", ")}`;let o=j(r.notePattern);return o.length>200?"notePattern is longer than 200 characters":{kind:"issue",provider:t,ref:n,...a?{state:a}:{},...o?{notePattern:o}:{}}}async function Me(r,t){if(!t.forge)return{verdict:"unverifiable",detail:`no ${r.provider} connector on this node`};let n=De(r.provider,r.ref);if(!n)return{verdict:"unverifiable",detail:`${r.ref} is not an issue reference`};let a=await t.forge(r.provider,n,{notes:!!r.notePattern});if("error"in a)return{verdict:"unverifiable",detail:`${r.ref}: ${a.error}`};let o=r.state??(r.notePattern?null:"closed");if(o&&$n(o,a.state))return{verdict:"met",detail:`${a.url} is ${a.state}`};if(r.notePattern){let i=r.notePattern.toLowerCase();if((a.notes??[]).some(s=>s.slice(0,1e4).toLowerCase().includes(i)))return{verdict:"met",detail:`${a.url} has a note with "${r.notePattern}"`}}return{verdict:"not_met",detail:`${a.url} is ${a.state}${r.notePattern?`, no note has "${r.notePattern}"`:""}`}}function ca(r,t=fetch){let n=async(a,o)=>{let i;try{i=await t(a,{headers:o,signal:AbortSignal.timeout(1e4)})}catch(s){return{ok:!1,error:`could not be reached: ${String(s?.message??s).slice(0,200)}`}}return i.ok?{ok:!0,body:await i.json().catch(()=>null)}:{ok:!1,error:i.status===404?"not found (or not visible to the connector)":`HTTP ${i.status}`}};return async(a,o,i)=>{if(a==="github"){let w=r.github;if(!w)return{error:"no github connector on this node (channels.github or requests.checkers.github)"};let Wt=w.apiUrl.replace(/\/$/,""),K={Accept:"application/vnd.github+json",...w.token?{Authorization:`Bearer ${w.token}`}:{}},X=`${Wt}/repos/${o.project}`,E=await n(`${X}/issues/${o.number}`,K);if(!E.ok)return{error:E.error};let C=E.body?.state==="closed"?"closed":"open";if(E.body?.pull_request&&C==="closed"){let $=await n(`${X}/pulls/${o.number}`,K);$.ok&&$.body?.merged&&(C="merged")}let ae=String(E.body?.html_url??`${o.project}#${o.number}`);if(!i.notes)return{state:C,url:ae};let I=await n(`${X}/issues/${o.number}/comments?per_page=100`,K);return I.ok?{state:C,url:ae,notes:(Array.isArray(I.body)?I.body:[]).map($=>String($?.body??""))}:{error:`its notes: ${I.error}`}}let s=r.gitlab;if(!s)return{error:"no gitlab connector on this node (channels.gitlab or requests.checkers.gitlab)"};let d=s.token?{"PRIVATE-TOKEN":s.token}:{},c=`${s.url.replace(/\/$/,"")}/api/v4/projects/${encodeURIComponent(o.project)}/${o.mr?"merge_requests":"issues"}/${o.number}`,f=await n(c,d);if(!f.ok)return{error:f.error};let y=String(f.body?.state??""),k=y==="merged"?"merged":y==="closed"?"closed":"open",A=String(f.body?.web_url??`${o.project}${o.mr?"!":"#"}${o.number}`);if(!i.notes)return{state:k,url:A};let _=await n(`${c}/notes?per_page=100&sort=desc&order_by=created_at`,d);return _.ok?{state:k,url:A,notes:(Array.isArray(_.body)?_.body:[]).map(w=>String(w?.body??"")).reverse()}:{error:`its notes: ${_.error}`}}}var je,j,$n,qe=g(()=>{"use strict";je=["open","closed","merged"],j=r=>typeof r=="string"?r.trim():"";$n=(r,t)=>r===t||r==="closed"&&t==="merged"});import{execFile as Ln}from"child_process";function Ue(r,t){let n=J(r.repo),a=Object.keys(t.repos);if(!n||!Object.prototype.hasOwnProperty.call(t.repos,n))return a.length?`repo must be one of ${a.join(", ")} (requests.checkers.repos)`:"no repos are set up for this check on this node (requests.checkers.repos)";let o=J(r.commit);if(!On.test(o))return"commit must be a commit hash (7 to 64 hex characters)";let i=J(r.ref);return i&&!jn.test(i)?"ref must be a branch or tag name, for example main or origin/main":{kind:"git-ancestor",repo:n,commit:o,...i?{ref:i}:{}}}async function Fe(r,t){let n=t.settings.repos[r.repo];if(!n)return{verdict:"unverifiable",detail:`no repo "${r.repo}" in requests.checkers.repos on this node`};let a=r.ref??"HEAD",{code:o,stderr:i}=await(t.git??Dn)(n,["merge-base","--is-ancestor",r.commit,a]);if(o===0)return{verdict:"met",detail:`commit ${r.commit} is in ${a} of ${r.repo}`};if(o===1)return{verdict:"not_met",detail:`commit ${r.commit} is not in ${a} of ${r.repo} yet`};let s=i.replace(/\s+/g," ").trim().slice(0,200)||`git exited with ${o}`;return{verdict:"unverifiable",detail:`could not check ${r.commit} in ${r.repo}: ${s}`}}var Nn,On,jn,J,Dn,He=g(()=>{"use strict";Nn=1e4,On=/^[0-9a-f]{7,64}$/i,jn=/^(?!-)(?!.*\.\.)[A-Za-z0-9._\/-]{1,200}$/,J=r=>typeof r=="string"?r.trim():"";Dn=(r,t)=>new Promise(n=>{Ln("git",["-C",r,...t],{timeout:Nn,windowsHide:!0},(a,o,i)=>{n({code:a?typeof a.code=="number"?a.code:-1:0,stderr:String(i??"")})})})});function Be(r,t){let n=D(r.channel).toLowerCase(),a=D(r.chatId),o=D(r.from);if(!n||!a)return"a reply check needs channel and chatId: the chat the answer arrives in";if(!o)return"a reply check needs from: the id of the person who answers (people)";if([n,a,o].some(s=>s.length>200))return"channel, chatId and from are at most 200 characters";let i=t;if(r.after!==void 0){let s=typeof r.after=="number"?r.after:Date.parse(D(r.after));if(!Number.isFinite(s)||s<0)return"after must be epoch milliseconds or an ISO date";i=s}return{kind:"reply",channel:n,chatId:a,from:o,after:i}}async function We(r,t){if(!t.inbound)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let n=r.after??0,a=t.inbound(r.channel,r.chatId,n,r.from);if(!a)return{verdict:"unverifiable",detail:"this node keeps no record of inbound messages"};let o=r.from.toLowerCase(),i=a.find(s=>s.at>n&&(s.person??"").toLowerCase()===o);return i?{verdict:"met",detail:`${r.from} wrote on ${r.channel} chat ${r.chatId} at ${new Date(i.at).toISOString().slice(0,16).replace("T"," ")} UTC`}:{verdict:"not_met",detail:`no message from ${r.from} on ${r.channel} chat ${r.chatId} yet`}}function pa(r){return(t,n,a,o)=>{try{return r.prepare(`SELECT person, started_at AS at FROM task_traces
2
2
  WHERE (channel = ? OR channel LIKE ? ESCAPE '\\') AND chat_id = ? AND started_at > ? AND lower(person) = lower(?)
3
- ORDER BY started_at LIMIT ?`).all(t,`${t.replace(/[\\%_]/g,"\\$&")}@%`,n,a,o,Pn)}catch{return null}}}var D,Pn,ze=g(()=>{"use strict";D=r=>typeof r=="string"?r.trim():"";Pn=5});function _a(r,t=Mn,n=Date.now()){if(!r||typeof r!="object"||Array.isArray(r))return"closeWhen must be an object with a kind: url, issue, git-ancestor or reply";let a=r,o=typeof a.kind=="string"?a.kind.trim().toLowerCase():"";if(!P.includes(o))return`closeWhen.kind must be one of ${P.join(", ")}`;if(!t.enabled.includes(o))return`the ${o} check is turned off on this node (requests.checkers.enabled)`;let i=o==="url"?Le(a):o==="issue"?Pe(a):o==="git-ancestor"?Fe(a,t):Be(a,n);return typeof i=="string"?`closeWhen: ${i}`:JSON.stringify(i).length>Ke?`closeWhen is longer than ${Ke} characters`:i}async function wa(r,t){if(!t.settings.enabled.includes(r.kind))return{verdict:"unverifiable",detail:`the ${r.kind} check is turned off on this node (requests.checkers.enabled)`};try{switch(r.kind){case"url":return await Ne(r,t);case"issue":return await Me(r,t);case"git-ancestor":return await Ue(r,t);case"reply":return await We(r,t)}}catch(n){return{verdict:"unverifiable",detail:`the ${r.kind} check failed: ${String(n?.message??n).slice(0,200)}`}}}function Sa(r){switch(r.kind){case"url":return`${r.url} answers${r.contains?` with "${r.contains}"`:""}`;case"issue":{let t=[r.state||!r.notePattern?`is ${r.state??"closed"}`:null,r.notePattern?`has a note with "${r.notePattern}"`:null];return`${r.provider} ${r.ref} ${t.filter(Boolean).join(" or ")}`}case"git-ancestor":return`commit ${r.commit} is in ${r.ref??"HEAD"} of ${r.repo}`;case"reply":return`${r.from} replies on ${r.channel} chat ${r.chatId}`}}function Xe(r){if(!r)return null;try{let t=JSON.parse(r);return t&&typeof t=="object"&&P.includes(t.kind)?t:null}catch{return null}}var P,Mn,Ke,Ge=g(()=>{"use strict";Oe();qe();He();ze();P=["url","issue","git-ancestor","reply"],Mn={enabled:[...P],checkEveryMinutes:10,repos:{}},Ke=2e3});function Fn(r){r.exec(`
3
+ ORDER BY started_at LIMIT ?`).all(t,`${t.replace(/[\\%_]/g,"\\$&")}@%`,n,a,o,Pn)}catch{return null}}}var D,Pn,ze=g(()=>{"use strict";D=r=>typeof r=="string"?r.trim():"";Pn=5});function _a(r,t=Mn,n=Date.now()){if(!r||typeof r!="object"||Array.isArray(r))return"closeWhen must be an object with a kind: url, issue, git-ancestor or reply";let a=r,o=typeof a.kind=="string"?a.kind.trim().toLowerCase():"";if(!P.includes(o))return`closeWhen.kind must be one of ${P.join(", ")}`;if(!t.enabled.includes(o))return`the ${o} check is turned off on this node (requests.checkers.enabled)`;let i=o==="url"?Le(a):o==="issue"?Pe(a):o==="git-ancestor"?Ue(a,t):Be(a,n);return typeof i=="string"?`closeWhen: ${i}`:JSON.stringify(i).length>Ke?`closeWhen is longer than ${Ke} characters`:i}async function wa(r,t){if(!t.settings.enabled.includes(r.kind))return{verdict:"unverifiable",detail:`the ${r.kind} check is turned off on this node (requests.checkers.enabled)`};try{switch(r.kind){case"url":return await Ne(r,t);case"issue":return await Me(r,t);case"git-ancestor":return await Fe(r,t);case"reply":return await We(r,t)}}catch(n){return{verdict:"unverifiable",detail:`the ${r.kind} check failed: ${String(n?.message??n).slice(0,200)}`}}}function Sa(r){switch(r.kind){case"url":return`${r.url} answers${r.contains?` with "${r.contains}"`:""}`;case"issue":{let t=[r.state||!r.notePattern?`is ${r.state??"closed"}`:null,r.notePattern?`has a note with "${r.notePattern}"`:null];return`${r.provider} ${r.ref} ${t.filter(Boolean).join(" or ")}`}case"git-ancestor":return`commit ${r.commit} is in ${r.ref??"HEAD"} of ${r.repo}`;case"reply":return`${r.from} replies on ${r.channel} chat ${r.chatId}`}}function Xe(r){if(!r)return null;try{let t=JSON.parse(r);return t&&typeof t=="object"&&P.includes(t.kind)?t:null}catch{return null}}var P,Mn,Ke,Ge=g(()=>{"use strict";Oe();qe();He();ze();P=["url","issue","git-ancestor","reply"],Mn={enabled:[...P],checkEveryMinutes:10,repos:{}},Ke=2e3});function Un(r){r.exec(`
4
4
  CREATE TABLE IF NOT EXISTS requests (
5
5
  id TEXT PRIMARY KEY,
6
6
  state TEXT NOT NULL,
@@ -29,36 +29,39 @@ import{b as ie,d as se,h as Xt}from"./chunk-BRK6M6LA.js";import{l as le,m as G,n
29
29
  FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
30
30
  );
31
31
  CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
32
- `),G(r,"requests",le),G(r,"requests",[["state_changed_at","INTEGER"]]);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"],["home_kind","TEXT"],["home_link","TEXT"],["owed_to","TEXT"],["promise","INTEGER"],["due_at","INTEGER"],["close_when","TEXT"],["checked_at","INTEGER"],["verified_at","INTEGER"],["verify_state","TEXT"],["verify_detail","TEXT"],["work","TEXT"],["estimate_minutes","REAL"],["first_work","TEXT"],["first_estimate_minutes","REAL"]])if(!t.some(o=>o.name===n))try{r.exec(`ALTER TABLE requests ADD COLUMN ${n} ${a}`)}catch(o){if(!/duplicate column name/i.test(String(o?.message)))throw o}}function Ca(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function b(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,stateChangedAt:r.state_changed_at??null,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null,ownerNote:r.owner_note??null,noteSaid:!!r.note_said,askedAgent:r.asked_agent??null,home:r.home_kind&&r.home_link?{kind:r.home_kind,link:r.home_link}:null,owedTo:r.owed_to??null,promise:!!r.promise,dueAt:r.due_at??null,closeWhen:Xe(r.close_when),checkedAt:r.checked_at??null,verifiedAt:r.verified_at??null,verifyState:r.verify_state??null,verifyDetail:r.verify_detail??null,work:r.work??null,estimateMinutes:r.estimate_minutes??null,firstWork:r.first_work??null,firstEstimateMinutes:r.first_estimate_minutes??null}}var k,p,Ra,qn,Q,Aa,M,T,h,ee,Ve,Ze=g(()=>{"use strict";Gt();Ge();k=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],Ra=["issue","idea","approval","erp","card"],qn=["issue","idea","approval","erp"],Q=500,Aa="owner",M=4e3,T=500;h=r=>Array(r).fill("?").join(","),ee="state_changed_at = CASE WHEN state IS ? THEN state_changed_at ELSE ? END",Ve=class{constructor(t){this.db=t;Fn(t),t.pragma("foreign_keys = ON")}addCandidate(t){let n=t.person??t.sender??null;this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at, state_changed_at, owed_to)
32
+ `),G(r,"requests",le),G(r,"requests",[["state_changed_at","INTEGER"]]);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"],["home_kind","TEXT"],["home_link","TEXT"],["owed_to","TEXT"],["promise","INTEGER"],["due_at","INTEGER"],["close_when","TEXT"],["checked_at","INTEGER"],["verified_at","INTEGER"],["verify_state","TEXT"],["verify_detail","TEXT"],["work","TEXT"],["estimate_minutes","REAL"],["first_work","TEXT"],["first_estimate_minutes","REAL"],["headline","TEXT"],["need","TEXT"],["headline_by","TEXT"],["headline_tried_at","INTEGER"]])if(!t.some(o=>o.name===n))try{r.exec(`ALTER TABLE requests ADD COLUMN ${n} ${a}`)}catch(o){if(!/duplicate column name/i.test(String(o?.message)))throw o}}function Ca(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function b(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,stateChangedAt:r.state_changed_at??null,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null,ownerNote:r.owner_note??null,noteSaid:!!r.note_said,askedAgent:r.asked_agent??null,home:r.home_kind&&r.home_link?{kind:r.home_kind,link:r.home_link}:null,owedTo:r.owed_to??null,promise:!!r.promise,dueAt:r.due_at??null,closeWhen:Xe(r.close_when),checkedAt:r.checked_at??null,verifiedAt:r.verified_at??null,verifyState:r.verify_state??null,verifyDetail:r.verify_detail??null,work:r.work??null,estimateMinutes:r.estimate_minutes??null,firstWork:r.first_work??null,firstEstimateMinutes:r.first_estimate_minutes??null,headline:r.headline??null,need:r.need??null,headlineBy:r.headline_by==="agent"||r.headline_by==="model"?r.headline_by:null,headlineTriedAt:r.headline_tried_at??null}}var x,p,Ra,qn,Q,Aa,M,v,h,ee,Ve,Ye=g(()=>{"use strict";Gt();Ge();x=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],Ra=["issue","idea","approval","erp","card"],qn=["issue","idea","approval","erp"],Q=500,Aa="owner",M=4e3,v=500;h=r=>Array(r).fill("?").join(","),ee="state_changed_at = CASE WHEN state IS ? THEN state_changed_at ELSE ? END",Ve=class{constructor(t){this.db=t;Un(t),t.pragma("foreign_keys = ON")}addCandidate(t){let n=t.person??t.sender??null;this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at, state_changed_at, owed_to)
33
33
  VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,M),t.now,t.now,t.now,n),this.link(t.id,"run",t.runId,t.now)}addPromise(t){this.db.prepare(`INSERT INTO requests (id, state, channel, chat_id, agent_id, text, created_at, updated_at, state_changed_at, owed_to, promise, due_at, close_when, home_kind, home_link)
34
- VALUES (?, 'in_progress', ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.agentId,t.text.slice(0,M),t.now,t.now,t.now,t.owedTo,t.dueAt??null,t.closeWhen?JSON.stringify(t.closeWhen):null,t.home?.kind??null,t.home?t.home.link.slice(0,Q):null),t.home&&this.linkHome(t.id,t.home,t.now)}openPromises(t){return this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE agent_id = ? AND promise = 1 AND state IN (${h(k.length)})`).get(t,...k).n}setLoop(t,n,a){n.dueAt!==void 0&&this.db.prepare("UPDATE requests SET due_at = ?, updated_at = ? WHERE id = ?").run(n.dueAt,a,t),n.closeWhen!==void 0&&this.db.prepare("UPDATE requests SET close_when = ?, verify_state = NULL, verify_detail = NULL, updated_at = ? WHERE id = ?").run(n.closeWhen?JSON.stringify(n.closeWhen):null,a,t)}setWork(t,n){n.work!==void 0&&this.db.prepare("UPDATE requests SET work = ?, first_work = COALESCE(first_work, ?) WHERE id = ?").run(n.work,n.work,t),n.estimateMinutes!==void 0&&this.db.prepare("UPDATE requests SET estimate_minutes = ?, first_estimate_minutes = COALESCE(first_estimate_minutes, ?) WHERE id = ?").run(n.estimateMinutes,n.estimateMinutes,t)}markChecked(t,n,a,o){this.db.prepare("UPDATE requests SET checked_at = ?, verify_state = ?, verify_detail = ? WHERE id = ?").run(o,n,a.slice(0,T)||null,t)}closeVerified(t,n,a){let o=n.trim().slice(0,T)||"the check was met";return this.db.prepare(`UPDATE requests SET state = 'done', closed_at = ?, updated_at = ?, state_changed_at = ?, evidence = ?, close_reason = NULL,
34
+ VALUES (?, 'in_progress', ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.agentId,t.text.slice(0,M),t.now,t.now,t.now,t.owedTo,t.dueAt??null,t.closeWhen?JSON.stringify(t.closeWhen):null,t.home?.kind??null,t.home?t.home.link.slice(0,Q):null),t.home&&this.linkHome(t.id,t.home,t.now)}openPromises(t){return this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE agent_id = ? AND promise = 1 AND state IN (${h(x.length)})`).get(t,...x).n}setLoop(t,n,a){n.dueAt!==void 0&&this.db.prepare("UPDATE requests SET due_at = ?, updated_at = ? WHERE id = ?").run(n.dueAt,a,t),n.closeWhen!==void 0&&this.db.prepare("UPDATE requests SET close_when = ?, verify_state = NULL, verify_detail = NULL, updated_at = ? WHERE id = ?").run(n.closeWhen?JSON.stringify(n.closeWhen):null,a,t)}setWork(t,n){n.work!==void 0&&this.db.prepare("UPDATE requests SET work = ?, first_work = COALESCE(first_work, ?) WHERE id = ?").run(n.work,n.work,t),n.estimateMinutes!==void 0&&this.db.prepare("UPDATE requests SET estimate_minutes = ?, first_estimate_minutes = COALESCE(first_estimate_minutes, ?) WHERE id = ?").run(n.estimateMinutes,n.estimateMinutes,t)}setHeadline(t,n,a){if(n.headline===void 0&&n.need===void 0)return!1;let o=a==="model"?" AND headline IS NULL":"";return this.db.prepare(`UPDATE requests SET headline = COALESCE(?, headline), need = COALESCE(?, need),
35
+ headline_by = CASE WHEN ? IS NULL THEN headline_by ELSE ? END WHERE id = ?${o}`).run(n.headline??null,n.need??null,n.headline??null,a,t).changes>0}withoutHeadline(t=20){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(x.length)}) AND headline IS NULL AND headline_tried_at IS NULL
36
+ ORDER BY created_at DESC, rowid DESC LIMIT ?`).all(...x,t).map(b)}markHeadlineTried(t,n){return this.db.prepare("UPDATE requests SET headline_tried_at = ? WHERE id = ? AND headline_tried_at IS NULL").run(n,t).changes>0}markChecked(t,n,a,o){this.db.prepare("UPDATE requests SET checked_at = ?, verify_state = ?, verify_detail = ? WHERE id = ?").run(o,n,a.slice(0,v)||null,t)}closeVerified(t,n,a){let o=n.trim().slice(0,v)||"the check was met";return this.db.prepare(`UPDATE requests SET state = 'done', closed_at = ?, updated_at = ?, state_changed_at = ?, evidence = ?, close_reason = NULL,
35
37
  checked_at = ?, verified_at = ?, verify_state = 'verified', verify_detail = ?
36
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,a,a,o,a,a,o,t,...p).changes>0}dueForCheck(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(k.length)}) AND close_when IS NOT NULL
37
- AND (checked_at IS NULL OR checked_at < ?) ORDER BY COALESCE(checked_at, 0), created_at LIMIT ?`).all(...k,t,n).map(b)}overdue(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN ('in_progress', 'waiting_other') AND due_at IS NOT NULL AND due_at < ?
38
+ WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,a,a,o,a,a,o,t,...p).changes>0}dueForCheck(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(x.length)}) AND close_when IS NOT NULL
39
+ AND (checked_at IS NULL OR checked_at < ?) ORDER BY COALESCE(checked_at, 0), created_at LIMIT ?`).all(...x,t,n).map(b)}overdue(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN ('in_progress', 'waiting_other') AND due_at IS NOT NULL AND due_at < ?
38
40
  AND (updated_at <= due_at OR updated_at < ?)
39
41
  ORDER BY due_at, rowid`).all(t,n).map(b)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?b(n):null}byLink(t,n){let a=this.db.prepare("SELECT r.* FROM requests r JOIN request_links l ON l.request_id = r.id WHERE l.kind = ? AND l.ref = ?").get(t,n);return a?b(a):null}link(t,n,a,o){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(t,n,a,o)}links(t){return this.db.prepare("SELECT kind, ref, at FROM request_links WHERE request_id = ? ORDER BY at, rowid").all(t)}lastAnswer(t){try{return this.db.prepare(`SELECT t.agent_id AS agentId, t.final_response AS text, COALESCE(t.finished_at, t.started_at) AS at
40
42
  FROM request_links l JOIN task_traces t ON t.task_id = l.ref
41
43
  WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
42
- ORDER BY t.started_at DESC LIMIT 1`).get(t)??null}catch{return null}}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,a="in_progress"){this.db.prepare(`UPDATE requests SET ${ee}, state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
43
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n,a,n,t,...p)}waitOnOwner(t,n,a){this.db.prepare(`UPDATE requests SET ${ee}, state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
44
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run("waiting_owner",a,a,n.slice(0,M),t,...p)}needsAttention(t,n,a){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, state_changed_at = ?, attention_reason = ?, notified_at = NULL
45
- WHERE id = ? AND state NOT IN ('needs_attention', ${h(p.length)})`).run(a,a,n.replace(/\s+/g," ").trim().slice(0,T),t,...p).changes>0}close(t,n,a,o){let i=a.trim();if(!i)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, state_changed_at = ?, evidence = ?, close_reason = ?
46
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(n,o,o,o,n==="done"?i.slice(0,T):null,n==="done"?null:i.slice(0,T),t,...p).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(k.length)}) ORDER BY created_at, rowid`).all(...k).map(b)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(t.length)}) AND updated_at < ? AND due_at IS NULL ORDER BY created_at, rowid`).all(...t,n).map(b)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(b)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(b)}listClosedSince(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(p.length)}) AND closed_at >= ? ORDER BY closed_at DESC, rowid DESC LIMIT ?`).all(...p,t,n).map(b)}setHome(t,n,a,o={}){let i=n.link.slice(0,Q);o.touch===!1?this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ? WHERE id = ?").run(n.kind,i,t):this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ?, updated_at = ? WHERE id = ?").run(n.kind,i,a,t),this.linkHome(t,n,a)}linkHome(t,n,a){qn.includes(n.kind)&&this.link(t,n.kind,n.link.slice(0,Q),a)}query(t){let n=[`state IN (${h(t.states.length)})`],a=[...t.states];t.since!==void 0&&(n.push("created_at >= ?"),a.push(t.since)),t.closedSince!==void 0&&(n.push("closed_at >= ?"),a.push(t.closedSince));let o=n.join(" AND "),i=this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE ${o}`).get(...a).n,s=t.newest?"DESC":"ASC",d=this.db.prepare(`SELECT * FROM requests WHERE ${o} ORDER BY created_at ${s}, rowid ${s} LIMIT ? OFFSET ?`).all(...a,t.limit,t.offset??0).map(b);return{items:t.newest?d.reverse():d,total:i}}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, state_changed_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
44
+ ORDER BY t.started_at DESC LIMIT 1`).get(t)??null}catch{return null}}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,a="in_progress"){this.db.prepare(`UPDATE requests SET ${ee}, state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL,
45
+ need = CASE WHEN state IN ('waiting_owner', 'needs_attention') THEN NULL ELSE need END
46
+ WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n,a,n,t,...p)}waitOnOwner(t,n,a,o=null){this.db.prepare(`UPDATE requests SET ${ee}, state = 'waiting_owner', updated_at = ?, question = ?, need = ?, attention_reason = NULL, notified_at = NULL
47
+ WHERE id = ? AND state NOT IN (${h(p.length)})`).run("waiting_owner",a,a,n.slice(0,M),o,t,...p)}needsAttention(t,n,a){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, state_changed_at = ?, attention_reason = ?, notified_at = NULL
48
+ WHERE id = ? AND state NOT IN ('needs_attention', ${h(p.length)})`).run(a,a,n.replace(/\s+/g," ").trim().slice(0,v),t,...p).changes>0}close(t,n,a,o){let i=a.trim();if(!i)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, state_changed_at = ?, evidence = ?, close_reason = ?
49
+ WHERE id = ? AND state NOT IN (${h(p.length)})`).run(n,o,o,o,n==="done"?i.slice(0,v):null,n==="done"?null:i.slice(0,v),t,...p).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(x.length)}) ORDER BY created_at, rowid`).all(...x).map(b)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(t.length)}) AND updated_at < ? AND due_at IS NULL ORDER BY created_at, rowid`).all(...t,n).map(b)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(b)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(b)}listClosedSince(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(p.length)}) AND closed_at >= ? ORDER BY closed_at DESC, rowid DESC LIMIT ?`).all(...p,t,n).map(b)}setHome(t,n,a,o={}){let i=n.link.slice(0,Q);o.touch===!1?this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ? WHERE id = ?").run(n.kind,i,t):this.db.prepare("UPDATE requests SET home_kind = ?, home_link = ?, updated_at = ? WHERE id = ?").run(n.kind,i,a,t),this.linkHome(t,n,a)}linkHome(t,n,a){qn.includes(n.kind)&&this.link(t,n.kind,n.link.slice(0,Q),a)}query(t){let n=[`state IN (${h(t.states.length)})`],a=[...t.states];t.since!==void 0&&(n.push("created_at >= ?"),a.push(t.since)),t.closedSince!==void 0&&(n.push("closed_at >= ?"),a.push(t.closedSince));let o=n.join(" AND "),i=this.db.prepare(`SELECT COUNT(*) AS n FROM requests WHERE ${o}`).get(...a).n,s=t.newest?"DESC":"ASC",d=this.db.prepare(`SELECT * FROM requests WHERE ${o} ORDER BY created_at ${s}, rowid ${s} LIMIT ? OFFSET ?`).all(...a,t.limit,t.offset??0).map(b);return{items:t.newest?d.reverse():d,total:i}}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, state_changed_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?, need = NULL
47
50
  WHERE id = ? AND state = 'needs_attention'`).run(n,n,n,t).changes>0}handOff(t,n,a,o){return this.db.prepare(`UPDATE requests SET ${ee}, agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
48
- question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
49
- WHERE id = ? AND state IN (${h(k.length)})`).run("in_progress",o,n,o,o,a.trim().slice(0,M)||null,t,...k).changes>0}setNoteSaid(t,n,a){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${a?" AND pickup_at IS NULL":""}`).run(a?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(b).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${h(p.length)}) AND closed_at < ?`).run(...p,t).changes}}});function La(r){return Object.assign({channel:Qe,chatId:r,sender:"operator"},{[et]:!0})}function Na(r){return!!r&&r[et]===!0}function Bn(r,t,n,a=!1){let o=q(t);if(r.channels.length&&!r.channels.map(q).includes(o))return!1;if(F.has(o))return a&&!Un.has((n?.name??"").toLowerCase());let i=Hn.has(o)?n?.username:n?.id,s=i?Ye(o,i):"";return s?r.from.some(d=>{let c=d.trim().toLowerCase(),f=c.indexOf(":");return f>0&&c.slice(0,f)===o&&Ye(o,c.slice(f+1))===s}):!1}function Oa(r){if(!r)return;let t=a=>typeof a=="string"&&a?a.slice(0,120):void 0,n={name:t(r.sender),id:t(r.senderId),username:t(r.senderUsername)};return n.name||n.id||n.username?n:void 0}function Wn(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var Qe,et,F,Un,q,Hn,Ye,S,R,Je,tt=g(()=>{"use strict";Ze();Qe="requests",et=Symbol("requests.pickup");F=new Set(["voice","app","dashboard","webrtc"]),Un=new Set(["camera"]),q=r=>r.toLowerCase().split("@")[0],Hn=new Set(["github","gitlab"]),Ye=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");S=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},R=(r,t,n)=>`${r}\0${t}\0${n}`,Je=class{constructor(t,n,a,o=Date.now){this.store=t;this.settings=n;this.log=a;this.now=o}live=new Map;guard(t,n){try{n()}catch(a){this.log(`[requests] ${t} failed: ${a?.message??a}`)}}isListedOwner(t){let n=q(t.channel),a=this.settings().channels;return a.length&&!a.map(q).includes(n)?!1:t.person?.role==="owner"&&!F.has(n)}liveRequestId(t,n,a){return this.live.get(R(t,n,a))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),a=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,o=R(t.agentId,t.channel,t.chatId);if(a){this.store.link(a.id,"run",t.taskId,n),a.state==="candidate"?this.store.touch(a.id,n):this.store.progress(a.id,n),this.live.set(o,{requestId:a.id,runId:t.taskId});return}let i=t.pickup&&t.channel===Qe?this.store.get(t.chatId):null;if(i&&i.agentId===t.agentId){this.store.link(i.id,"run",t.taskId,n),this.store.touch(i.id,n),this.live.set(o,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Bn(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(o,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=R(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let a=this.store.byLink("run",t.taskId);if(!a)return;let o=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Wn(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${S(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(R(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}if(n==="waiting"){this.store.progress(o.id,i,"waiting_other");return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(o.id,`The work handed to ${s} ${d}: ${S(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${S(a)}). It said: ${S(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(R(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${S(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!k.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${S(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as zn,timingSafeEqual as rt}from"crypto";import{chmodSync as Kn,existsSync as Xn,mkdirSync as Gn,readFileSync as Vn,writeFileSync as Zn}from"fs";import{networkInterfaces as Yn}from"os";import{dirname as Jn,resolve as Qn}from"path";function Fa(r){return Object.assign(r,{[at]:!0})}function ot(r){return!!r&&r[at]===!0}function tr(r=process.cwd()){return Qn(r,".agentx","operator.key")}function Ua(r=process.cwd(),t={}){let n=tr(r);try{if(Xn(n)){let o=Vn(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=zn(32).toString("hex");return Gn(Jn(n),{recursive:!0}),Zn(n,a+`
50
- `,{mode:384}),Kn(n,384),a}catch{return null}}function nr(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let a=Buffer.from(r),o=Buffer.from(n.trim());return a.length===o.length&&rt(a,o)}function ar(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?nr(n,t[er]):!1}function or(r,t){let n=r[rr];if((Array.isArray(n)?n[0]:n)!=="1")return!1;let a=r.authorization,o=(Array.isArray(a)?a[0]:a)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let s=Buffer.from(i);for(let d of t){if(!d)continue;let c=Buffer.from(d);if(c.length===s.length&&rt(c,s))return!0}return!1}function ir(r,t=sr()){let n=nt(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let a of t)if(nt(a)===n)return!0;return!1}function sr(){return Object.values(Yn()).flatMap(r=>(r??[]).map(t=>t.address))}function Ha(r,t,n){if(ar(r,t.headers,n.key,n.operatorChannels))return!0;if(!r||typeof r!="object")return!1;let a=String(r.channel??"").toLowerCase().split("@")[0];return!n.operatorChannels.has(a)||ir(t.remoteAddress,n.ownAddresses)?!1:or(t.headers,n.peerTokens)}var er,at,rr,nt,it=g(()=>{"use strict";er="x-agentx-operator",at=Symbol("requests.operator");rr="x-agentx-operator-vouch";nt=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function Ga(r,t){return r.find(n=>n.id===t)?.name??(t===U?"Owner":t)}function st(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function lt(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=te(r.slice(0,t).trim()),a=st(n,r.slice(t+1));return a?{channel:n,value:a}:null}function ut(r){let t=new Set,n=new Map;for(let a of r){if(t.has(a.id))return`person "${a.id}" is listed twice`;if(t.add(a.id),a.id===U&&a.role!=="owner")return`the id "${U}" is kept for a person with the owner role`;for(let o of a.identities){let i=lt(o);if(!i)return`identity "${o}" of "${a.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,d=n.get(s);if(d&&d!==a.id)return`identity "${o}" belongs to both "${d}" and "${a.id}"`;n.set(s,a.id)}}return null}function lr(r,t,n){let a=te(t),i=(a==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>st(a,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(d=>{let c=lt(d);return!!c&&c.channel===a&&i.includes(c.value)}))??null:null}function ur(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:U,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function dt(r,t){let n=ie(t);if(n)return n.person?{id:n.person}:null;if(!t||se(t)!=="human")return null;let a=String(t.channel??"");if(F.has(te(a)))return ot(t)?ur(r):null;let o=s=>typeof s=="string"?s:void 0,i=lr(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function dr(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Va(r,t,n){let a=dt(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||dr(o,t))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${t}. Ask the owner if you need ${t}.`}}function Za(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function Ya(r,t){let n=dt(r,t);if(!n)return null;let a=r.find(s=>s.id===n.id);if(!a||a.role==="owner")return null;let o=a.deny?.tools??[],i=a.deny?.skills??[];return!o.length&&!i.length?null:{personId:a.id,name:a.name,tools:[...o],skills:[...i]}}var Xa,U,te,ct=g(()=>{"use strict";Xt();tt();it();Xa=["owner","member","client","guest"],U="owner";te=r=>r.toLowerCase().split("@")[0]});function eo(r){return typeof r=="string"&&mr.includes(r)}function mt(r){let t=new Set(cr);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var cr,mr,Qa,ft=g(()=>{"use strict";cr=["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_waiting","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_screen","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_note","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],mr=["read","full"],Qa=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_screen","agentx_health","agentx_crons","agentx_wiki_query"]});var Fr={};zt(Fr,{INTEGRATION_KINDS:()=>kr,WIKI_CONTRIBUTE_JOB:()=>qt,WIKI_CONTRIBUTE_MERGE_JOB:()=>Ft,WIKI_SUMMARIZE_JOB:()=>ne,approvalsConfigSchema:()=>Dt,callsSchema:()=>Tt,cameraBotSchema:()=>Et,crossFieldProblems:()=>Mt,daemonConfigSchema:()=>Pt,eventSubscriptionSchema:()=>St,expandEnvVars:()=>z,isCronExpression:()=>vt,loadDaemonConfig:()=>Mr,membersConfigSchema:()=>Nt,mergePolicyConfigSchema:()=>At,peopleConfigSchema:()=>Lt,personSchema:()=>$t,qualityReportConfigSchema:()=>jt,requestStatusConfigSchema:()=>Ot,requestsConfigSchema:()=>It,reviewGateConfigSchema:()=>Rt,validateWorkspaces:()=>qr,watchersConfigSchema:()=>Ct,withContributionJobs:()=>Ut,withSummariesJob:()=>Ht});import{z as e}from"zod";import{readFileSync as yt,existsSync as B}from"fs";import{resolve as W}from"path";function fr(r){let t=W(r,".env");if(!B(t))return;let n=yt(t,"utf-8");for(let a of n.split(`
51
- `)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),d=o.slice(i+1).trim();process.env[s]||(process.env[s]=d)}}function vt(r){let t=[[0,59],[0,23],[1,31],[1,12],[0,6]],n=r.trim().split(/\s+/);return n.length!==5?!1:n.every((a,o)=>a.split(",").every(i=>{let s=/^(\*|(\d+)(?:-(\d+))?)(?:\/(\d+))?$/.exec(i);if(!s)return!1;let[d,c]=t[o],f=s[2]===void 0?d:Number(s[2]),x=s[3]===void 0?f:Number(s[3]),y=s[4]===void 0?1:Number(s[4]);return f>=d&&x<=c&&f<=x&&y>=1}))}function Er(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function z(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(z);if(r!==null&&typeof r=="object"){let t={};for(let[n,a]of Object.entries(r))t[n]=z(a);return t}return r}function Pr(r,t){let n=[],a=new Set;for(let o of r){let i=o.path.join("."),s=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(s&&o.message.toLowerCase().includes("required")){let d=s[1],c=`tg:${d}`;if(a.has(c))continue;a.add(c),n.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
51
+ question = NULL, need = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
52
+ WHERE id = ? AND state IN (${h(x.length)})`).run("in_progress",o,n,o,o,a.trim().slice(0,M)||null,t,...x).changes>0}setNoteSaid(t,n,a){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${a?" AND pickup_at IS NULL":""}`).run(a?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(b).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${h(p.length)}) AND closed_at < ?`).run(...p,t).changes}}});function La(r){return Object.assign({channel:Qe,chatId:r,sender:"operator"},{[et]:!0})}function Na(r){return!!r&&r[et]===!0}function Bn(r,t,n,a=!1){let o=q(t);if(r.channels.length&&!r.channels.map(q).includes(o))return!1;if(U.has(o))return a&&!Fn.has((n?.name??"").toLowerCase());let i=Hn.has(o)?n?.username:n?.id,s=i?Ze(o,i):"";return s?r.from.some(d=>{let c=d.trim().toLowerCase(),f=c.indexOf(":");return f>0&&c.slice(0,f)===o&&Ze(o,c.slice(f+1))===s}):!1}function Oa(r){if(!r)return;let t=a=>typeof a=="string"&&a?a.slice(0,120):void 0,n={name:t(r.sender),id:t(r.senderId),username:t(r.senderUsername)};return n.name||n.id||n.username?n:void 0}function Wn(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var Qe,et,U,Fn,q,Hn,Ze,S,R,Je,tt=g(()=>{"use strict";Ye();Qe="requests",et=Symbol("requests.pickup");U=new Set(["voice","app","dashboard","webrtc"]),Fn=new Set(["camera"]),q=r=>r.toLowerCase().split("@")[0],Hn=new Set(["github","gitlab"]),Ze=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");S=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},R=(r,t,n)=>`${r}\0${t}\0${n}`,Je=class{constructor(t,n,a,o=Date.now){this.store=t;this.settings=n;this.log=a;this.now=o}live=new Map;guard(t,n){try{n()}catch(a){this.log(`[requests] ${t} failed: ${a?.message??a}`)}}isListedOwner(t){let n=q(t.channel),a=this.settings().channels;return a.length&&!a.map(q).includes(n)?!1:t.person?.role==="owner"&&!U.has(n)}liveRequestId(t,n,a){return this.live.get(R(t,n,a))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),a=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,o=R(t.agentId,t.channel,t.chatId);if(a){this.store.link(a.id,"run",t.taskId,n),a.state==="candidate"?this.store.touch(a.id,n):this.store.progress(a.id,n),this.live.set(o,{requestId:a.id,runId:t.taskId});return}let i=t.pickup&&t.channel===Qe?this.store.get(t.chatId):null;if(i&&i.agentId===t.agentId){this.store.link(i.id,"run",t.taskId,n),this.store.touch(i.id,n),this.live.set(o,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Bn(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(o,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=R(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let a=this.store.byLink("run",t.taskId);if(!a)return;let o=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Wn(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${S(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(R(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}if(n==="waiting"){this.store.progress(o.id,i,"waiting_other");return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(o.id,`The work handed to ${s} ${d}: ${S(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${S(a)}). It said: ${S(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(R(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${S(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!x.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${S(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as zn,timingSafeEqual as rt}from"crypto";import{chmodSync as Kn,existsSync as Xn,mkdirSync as Gn,readFileSync as Vn,writeFileSync as Yn}from"fs";import{networkInterfaces as Zn}from"os";import{dirname as Jn,resolve as Qn}from"path";function Ua(r){return Object.assign(r,{[at]:!0})}function ot(r){return!!r&&r[at]===!0}function tr(r=process.cwd()){return Qn(r,".agentx","operator.key")}function Fa(r=process.cwd(),t={}){let n=tr(r);try{if(Xn(n)){let o=Vn(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=zn(32).toString("hex");return Gn(Jn(n),{recursive:!0}),Yn(n,a+`
53
+ `,{mode:384}),Kn(n,384),a}catch{return null}}function nr(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let a=Buffer.from(r),o=Buffer.from(n.trim());return a.length===o.length&&rt(a,o)}function ar(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?nr(n,t[er]):!1}function or(r,t){let n=r[rr];if((Array.isArray(n)?n[0]:n)!=="1")return!1;let a=r.authorization,o=(Array.isArray(a)?a[0]:a)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let s=Buffer.from(i);for(let d of t){if(!d)continue;let c=Buffer.from(d);if(c.length===s.length&&rt(c,s))return!0}return!1}function ir(r,t=sr()){let n=nt(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let a of t)if(nt(a)===n)return!0;return!1}function sr(){return Object.values(Zn()).flatMap(r=>(r??[]).map(t=>t.address))}function Ha(r,t,n){if(ar(r,t.headers,n.key,n.operatorChannels))return!0;if(!r||typeof r!="object")return!1;let a=String(r.channel??"").toLowerCase().split("@")[0];return!n.operatorChannels.has(a)||ir(t.remoteAddress,n.ownAddresses)?!1:or(t.headers,n.peerTokens)}var er,at,rr,nt,it=g(()=>{"use strict";er="x-agentx-operator",at=Symbol("requests.operator");rr="x-agentx-operator-vouch";nt=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function Ga(r,t){return r.find(n=>n.id===t)?.name??(t===F?"Owner":t)}function st(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function lt(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=te(r.slice(0,t).trim()),a=st(n,r.slice(t+1));return a?{channel:n,value:a}:null}function ut(r){let t=new Set,n=new Map;for(let a of r){if(t.has(a.id))return`person "${a.id}" is listed twice`;if(t.add(a.id),a.id===F&&a.role!=="owner")return`the id "${F}" is kept for a person with the owner role`;for(let o of a.identities){let i=lt(o);if(!i)return`identity "${o}" of "${a.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,d=n.get(s);if(d&&d!==a.id)return`identity "${o}" belongs to both "${d}" and "${a.id}"`;n.set(s,a.id)}}return null}function lr(r,t,n){let a=te(t),i=(a==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>st(a,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(d=>{let c=lt(d);return!!c&&c.channel===a&&i.includes(c.value)}))??null:null}function ur(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:F,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function dt(r,t){let n=ie(t);if(n)return n.person?{id:n.person}:null;if(!t||se(t)!=="human")return null;let a=String(t.channel??"");if(U.has(te(a)))return ot(t)?ur(r):null;let o=s=>typeof s=="string"?s:void 0,i=lr(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function dr(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Va(r,t,n){let a=dt(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||dr(o,t))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${t}. Ask the owner if you need ${t}.`}}function Ya(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function Za(r,t){let n=dt(r,t);if(!n)return null;let a=r.find(s=>s.id===n.id);if(!a||a.role==="owner")return null;let o=a.deny?.tools??[],i=a.deny?.skills??[];return!o.length&&!i.length?null:{personId:a.id,name:a.name,tools:[...o],skills:[...i]}}var Xa,F,te,ct=g(()=>{"use strict";Xt();tt();it();Xa=["owner","member","client","guest"],F="owner";te=r=>r.toLowerCase().split("@")[0]});function eo(r){return typeof r=="string"&&mr.includes(r)}function mt(r){let t=new Set(cr);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var cr,mr,Qa,ft=g(()=>{"use strict";cr=["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_waiting","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_screen","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_note","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],mr=["read","full"],Qa=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_screen","agentx_health","agentx_crons","agentx_wiki_query"]});var Ur={};zt(Ur,{INTEGRATION_KINDS:()=>kr,WIKI_CONTRIBUTE_JOB:()=>qt,WIKI_CONTRIBUTE_MERGE_JOB:()=>Ut,WIKI_SUMMARIZE_JOB:()=>ne,approvalsConfigSchema:()=>Dt,callsSchema:()=>vt,cameraBotSchema:()=>Et,crossFieldProblems:()=>Mt,daemonConfigSchema:()=>Pt,eventSubscriptionSchema:()=>St,expandEnvVars:()=>z,isCronExpression:()=>Tt,loadDaemonConfig:()=>Mr,membersConfigSchema:()=>Nt,mergePolicyConfigSchema:()=>At,peopleConfigSchema:()=>Lt,personSchema:()=>$t,qualityReportConfigSchema:()=>jt,requestStatusConfigSchema:()=>Ot,requestsConfigSchema:()=>It,reviewGateConfigSchema:()=>Rt,validateWorkspaces:()=>qr,watchersConfigSchema:()=>Ct,withContributionJobs:()=>Ft,withSummariesJob:()=>Ht});import{z as e}from"zod";import{readFileSync as yt,existsSync as B}from"fs";import{resolve as W}from"path";function fr(r){let t=W(r,".env");if(!B(t))return;let n=yt(t,"utf-8");for(let a of n.split(`
54
+ `)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),d=o.slice(i+1).trim();process.env[s]||(process.env[s]=d)}}function Tt(r){let t=[[0,59],[0,23],[1,31],[1,12],[0,6]],n=r.trim().split(/\s+/);return n.length!==5?!1:n.every((a,o)=>a.split(",").every(i=>{let s=/^(\*|(\d+)(?:-(\d+))?)(?:\/(\d+))?$/.exec(i);if(!s)return!1;let[d,c]=t[o],f=s[2]===void 0?d:Number(s[2]),y=s[3]===void 0?f:Number(s[3]),k=s[4]===void 0?1:Number(s[4]);return f>=d&&y<=c&&f<=y&&k>=1}))}function Er(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function z(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(z);if(r!==null&&typeof r=="object"){let t={};for(let[n,a]of Object.entries(r))t[n]=z(a);return t}return r}function Pr(r,t){let n=[],a=new Set;for(let o of r){let i=o.path.join("."),s=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(s&&o.message.toLowerCase().includes("required")){let d=s[1],c=`tg:${d}`;if(a.has(c))continue;a.add(c),n.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
52
55
  Either:
53
56
  A) Open ${t} and set channels.telegram.accounts.${d}.token to your bot token (or "\${TG_${d.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
54
57
  B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${d}).`)}}return n}function Mr(r){let t=r?[r]:[W(process.cwd(),"agentx.json"),W(process.cwd(),".agentx/config.json")];fr(process.cwd());let n,a;for(let c of t)if(B(c)){n=yt(c,"utf-8"),a=c;break}if(!n||!a)throw new Error(`No config found. Create agentx.json or .agentx/config.json
55
- Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(c){throw new Error(`Invalid JSON in ${a}: ${c.message}`)}let i=z(o),s=Pt.safeParse(i);if(!s.success){let c=s.error.issues.map(y=>` ${y.path.join(".")}: ${y.message}`).join(`
56
- `),f=Pr(s.error.issues,a),x=f.length?`
58
+ Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(c){throw new Error(`Invalid JSON in ${a}: ${c.message}`)}let i=z(o),s=Pt.safeParse(i);if(!s.success){let c=s.error.issues.map(k=>` ${k.path.join(".")}: ${k.message}`).join(`
59
+ `),f=Pr(s.error.issues,a),y=f.length?`
57
60
 
58
61
  ${f.join(`
59
62
 
60
63
  `)}`:"";throw new Error(`Config validation failed (${a}):
61
- ${c}${x}`)}let d=Mt(s.data);if(d.length)throw new Error(`Config validation failed (${a}):
64
+ ${c}${y}`)}let d=Mt(s.data);if(d.length)throw new Error(`Config validation failed (${a}):
62
65
  ${d.map(c=>` ${c}`).join(`
63
- `)}`);return Ht(Ut(s.data))}function Mt(r){let t=[],n=r.native?.mirror;return n?.enabled&&(r.reminders?.lists?.includes(n.list)&&t.push(`native.mirror.list: "${n.list}" is also in reminders.lists; a mirrored task would be handed back to an agent. Use another list.`),r.approvals?.checkin?.lists?.includes(n.list)&&t.push(`native.mirror.list: "${n.list}" is also in approvals.checkin.lists; a mirrored task would come back as a card. Use another list.`)),t}function qr(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!B(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=W(a.workspace,".claude");B(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${a.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=a.provider||"claude",i=r.providers[o];!["claude-code","codex-cli","opencode"].includes(a.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,a]of Object.entries(r.crons))r.agents[a.agent]||t.push(`Cron "${n}": references unknown agent "${a.agent}"`);if(r.channels.telegram.enabled)for(let[n,a]of Object.entries(r.channels.telegram.accounts))r.agents[a.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${a.agentBinding}"`);return t}function Ut(r,t=Bt()){let n=Object.entries(r.agents).filter(([,s])=>s.wiki?.contribute?.enabled).map(([s])=>s).sort();if(n.length===0)return r;let a=r.wiki.contributions,o=(s,d)=>re.parse({schedule:s,timezone:a.timezone,agent:n[0],command:d,timeout:3600,onError:"log"}),i={[qt]:o(a.schedule,`${t} wiki contribute --all`),[Ft]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function Ht(r,t=Bt()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=re.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${ne} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[ne]:o.data,...r.crons}}}function Bt(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var gt,gr,pr,hr,br,xr,yr,kr,kt,_t,H,wt,St,_r,wr,Et,Sr,re,pt,ht,bt,vr,Tr,Rr,Ar,Cr,Ir,$r,Lr,Nr,Tt,Or,jr,Dr,Rt,At,Ct,It,$t,Lt,Nt,Ot,xt,jt,Dt,Pt,qt,Ft,ne,Ur=g(()=>{de();fe();Kt();he();ke();Se();ve();Re();Ie();ct();ft();gt=e.array(e.string().min(1)).superRefine((r,t)=>{let n=mt(r);n.length&&t.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${n.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),gr=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),pr=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),hr=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),br=e.union([hr,pr]),xr=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(),yr=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:xr.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),kr=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],kt=e.enum(["system","elevenlabs"]),_t=e.union([e.string(),e.record(e.string(),e.string())]),H=e.string().superRefine((r,t)=>{let n=pe(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),wt=e.object({provider:kt.optional(),system:_t.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:H.optional()}),St=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),_r=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(),br).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({}),notes:e.object({dir:e.string().min(1).optional()}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(St).default([]),integrations:e.array(yr).default([]),voice:wt.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(V).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),wr=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Et=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({}),Sr=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),wr).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:Et}).default({})}).default({})}),re=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(),taskType:e.string().trim().min(1).max(64).optional(),autonomy:oe.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});pt=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),ht=e.union([pt,e.object({repo:pt,about:e.string().max(200).optional()})]),bt={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},vr=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...bt,repos:e.array(ht).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...bt,repos:e.array(ht).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),Tr=e.object({enabled:e.boolean().default(!1),inbox:e.string().min(1).optional(),crons:e.array(e.string().min(1)).default([]),absorbAgent:e.string().min(1).optional(),maxNotesPerRun:e.number().int().min(1).max(100).default(20),maxDeferrals:e.number().int().min(1).max(20).default(3)}).refine(r=>!r.enabled||!!r.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),Rr=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()}),Ar=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Cr=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),Ir=e.object({enabled:e.boolean().default(!1),peers:e.array(Ar).default([]),inboxes:e.array(Cr).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),callbackSends:e.boolean().default(!0)}).default({})}),$r=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({}),Lr=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({}),Nr=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(),Lr).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),Tt=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0),busy:e.object({retryMinutes:e.number().int().min(1).max(60).default(5),maxWaitMinutes:e.number().int().min(1).max(240).default(10),title:e.string().min(1).max(120).default("Call waiting: {agent}"),notice:e.string().min(1).max(200).default("AgentX Voice is busy. The call rings when it is free.")}).default({})}).default({}),Or=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({}),jr=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Dr=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-]*$/),jr).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({}),Rt=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),reviewer:e.object({agent:e.string().min(1).optional(),model:e.string().min(1).optional()}).default({}),paths:e.array(e.string().min(1)).default([]),maxCostPerReview:e.number().min(0).default(2),maxMinutes:e.number().positive().max(120).default(10),maxReviewsPerPrPerDay:e.number().int().min(0).max(100).default(6),ciWaitMinutes:e.number().min(0).max(60).default(5),maxDiffKb:e.number().int().positive().max(2048).default(256)}).default({}),At=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),corePaths:e.array(e.string().min(1)).default([]),edgePaths:e.array(e.string().min(1)).default([]),label:e.string().min(1).max(50).default("core-change"),approvers:e.array(e.string().min(1)).default([]),ownerCard:e.boolean().default(!0)}).default({}),Ct=e.object({enabled:e.boolean().default(!1),skipChannels:e.array(e.string().min(1)).default([]),defaultDueMinutes:e.number().positive().max(30*24*60).default(120),noBelow:e.number().min(0).max(1).default(.2),yesAt:e.number().min(0).max(1).default(.7),escalateAfterMinutes:e.number().positive().max(7*24*60).default(30),owner:e.object({channel:e.string().min(1).optional(),chatId:e.string().min(1).optional()}).default({}),retentionDays:e.number().positive().max(3650).default(30),doneSignal:e.enum(["result","explicit"]).default("result"),evidence:e.record(e.string().min(1),e.object({accept:e.array(e.enum(["test","output","link"])).min(1),minOutputChars:e.number().int().min(1).max(2e3).default(40),linkHosts:e.array(e.string().min(1)).default([])})).default({})}).default({}).refine(r=>r.noBelow<=r.yesAt,{message:"watchers.noBelow must not be above watchers.yesAt"}),It=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([]),requireForWork:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a kind of work: a short lower-case word")).default(["code"]),requireOverMinutes:e.number().min(0).max(7*24*60).default(30)}).default({}),checkers:e.object({enabled:e.array(e.enum(["url","issue","git-ancestor","reply"])).default(["url","issue","git-ancestor","reply"]),checkEveryMinutes:e.number().positive().max(24*60).default(10),repos:e.record(e.string(),e.string().min(1)).default({}),github:e.object({apiUrl:e.string().url().default("https://api.github.com"),token:e.string().optional()}).optional(),gitlab:e.object({url:e.string().url().optional(),token:e.string().optional()}).optional()}).default({})}).default({}),$t=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({})}),Lt=e.array($t).default([]).superRefine((r,t)=>{let n=ut(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Nt=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ot=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),xt=e.string().regex(/^\d{4}-\d{2}-\d{2}$/,"use YYYY-MM-DD"),jt=e.object({enabled:e.boolean().default(!1),repo:e.string().regex(/^[\w.-]+\/[\w.-]+$/,"use owner/name").optional(),issue:e.number().int().positive().optional(),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("08:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),command:e.array(e.string().min(1)).min(1).default(["agentx","quality","report","--public"]),baseline:e.string().regex(/^[\w.-]{1,64}$/,"use letters, digits, dot, dash or underscore").default("baseline"),timeoutSeconds:e.number().int().min(10).max(3600).default(600),gates:e.array(e.object({id:e.string().min(1),label:e.string().min(1).optional(),since:xt,until:xt.optional()})).default([])}).default({}).superRefine((r,t)=>{r.enabled&&(!r.repo||!r.issue)&&t.addIssue({code:e.ZodIssueCode.custom,message:"qualityReport.enabled needs repo and issue"})}),Dt=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),forwardTo:e.string().min(1).optional(),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),Pt=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional(),connectAttemptTimeoutMs:e.number().int().min(250).max(6e4).default(5e3)}),providers:e.record(e.string(),gr).default({}),agents:e.record(e.string(),_r).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(vr).default([])}).default({})}).default({}),summaries:e.object({model:e.string().min(1).default("haiku"),batchSize:e.number().int().min(1).max(50).default(20),maxWords:e.number().int().min(5).max(120).default(35),schedule:e.string().refine(r=>r.trim()===""||vt(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(Er,'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:Sr.default({}),crons:e.record(e.string(),re).default({}),wikiNotes:Tr.default({}),services:e.record(e.string(),Rr).default({}),notifications:Or,calls:Tt,whatsappTriage:Ce,approvals:Dt,quality:e.object({specTests:e.object({enabled:e.boolean().default(!1),paths:e.array(e.string().min(1)).default(["src/daemon"]),agent:e.string().min(1).default("spec-tests"),model:e.string().min(1).optional(),maxCostPerIssue:e.number().positive().max(100).default(2),maxMinutes:e.number().int().min(1).max(120).default(20)}).default({}),canary:e.object({enabled:e.boolean().default(!1),soakMinutes:e.number().int().min(1).max(10080).default(120),thresholds:e.object({maxRestarts:e.number().int().min(0).default(1),maxCrashes:e.number().int().min(0).default(0),maxFailedTasks:e.number().int().min(0).default(3),maxErrorRateIncrease:e.number().min(0).max(1).default(.1),minTasksForRate:e.number().int().min(1).default(10)}).default({})}).default({}),reviewGate:Rt,mergePolicy:At}).default({}),shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),signals:e.object({enabled:e.boolean().default(!0),windDownSeconds:e.number().int().min(10).max(1800).default(120),allowAgents:e.array(e.string().min(1)).default([]),allowPeers:e.array(e.string().min(1)).default([]),maxPerRoot:e.number().int().min(1).max(100).default(6)}).default({}),requests:It,watchers:Ct,people:Lt,members:Nt,requestStatus:Ot,qualityReport:jt,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({}),native:e.object({adapter:e.enum(["auto","none"]).default("auto"),mirror:e.object({enabled:e.boolean().default(!1),list:e.string().min(1).refine(r=>!r.startsWith("-"),'must not start with "-"').default("AgentX Desk"),dueAfterMinutes:e.number().int().min(0).max(1440).default(5),include:e.array(e.enum(["card","request"])).min(1).default(["card","request"]),answerUrl:e.string().url().optional()}).default({}),forwardTo:e.string().min(1).optional(),notes:e.object({enabled:e.boolean().default(!1),folder:e.string().min(1).default("AgentX"),perAgentPerDay:e.number().int().min(1).max(50).default(10)}).default({})}).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:Dr,mesh:Ir.default({}),meshVoices:e.record(e.string(),wt.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:kt.default("system"),fallback:e.enum(["system","none"]).default("system"),system:_t.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(Z),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(Y)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:H.default(L.talk),stop:H.default(L.stop),paste:H.default(L.paste)}).default({}),look:e.enum(be).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(xe).default("sometimes"),palette:e.enum(V).default(N),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(O.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(O.maxSeconds)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:ue.optional(),boards:ce,dashboard:me,graph:$r,decisions:Nr,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:gt.default([]),agentxToolsByChannel:e.record(gt).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({})});qt="wiki-contribute",Ft="wiki-contribute-merge";ne="wiki-summarize"});export{zr as a,Kr as b,fe as c,bn as d,Gr as e,L as f,he as g,v as h,be as i,xe as j,V as k,Zr as l,ke as m,_e as n,we as o,ea as p,Se as q,na as r,ra as s,ve as t,Te as u,ia as v,Re as w,Ce as x,Ie as y,Ne as z,Oe as A,ca as B,qe as C,pa as D,ze as E,P as F,Mn as G,_a as H,wa as I,Sa as J,Ge as K,k as L,p as M,Ra as N,Q as O,Aa as P,M as Q,Ca as R,Ve as S,Ze as T,La as U,Na as V,F as W,Oa as X,Je as Y,tt as Z,er as _,Fa as $,ot as aa,Ua as ba,ar as ca,Ha as da,it as ea,Xa as fa,U as ga,Ga as ha,lt as ia,lr as ja,ur as ka,dt as la,Va as ma,Za as na,Ya as oa,ct as pa,mr as qa,Qa as ra,eo as sa,ft as ta,kr as ua,St as va,Et as wa,vt as xa,Tt as ya,Rt as za,At as Aa,Ct as Ba,It as Ca,$t as Da,Lt as Ea,Nt as Fa,Ot as Ga,jt as Ha,Dt as Ia,Pt as Ja,z as Ka,Mr as La,Mt as Ma,qr as Na,qt as Oa,Ft as Pa,Ut as Qa,ne as Ra,Ht as Sa,Fr as Ta,Ur as Ua};
64
- //# sourceMappingURL=chunk-L6IW6HWE.js.map
66
+ `)}`);return Ht(Ft(s.data))}function Mt(r){let t=[],n=r.native?.mirror;return n?.enabled&&(r.reminders?.lists?.includes(n.list)&&t.push(`native.mirror.list: "${n.list}" is also in reminders.lists; a mirrored task would be handed back to an agent. Use another list.`),r.approvals?.checkin?.lists?.includes(n.list)&&t.push(`native.mirror.list: "${n.list}" is also in approvals.checkin.lists; a mirrored task would come back as a card. Use another list.`)),t}function qr(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!B(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=W(a.workspace,".claude");B(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${a.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=a.provider||"claude",i=r.providers[o];!["claude-code","codex-cli","opencode"].includes(a.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,a]of Object.entries(r.crons))r.agents[a.agent]||t.push(`Cron "${n}": references unknown agent "${a.agent}"`);if(r.channels.telegram.enabled)for(let[n,a]of Object.entries(r.channels.telegram.accounts))r.agents[a.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${a.agentBinding}"`);return t}function Ft(r,t=Bt()){let n=Object.entries(r.agents).filter(([,s])=>s.wiki?.contribute?.enabled).map(([s])=>s).sort();if(n.length===0)return r;let a=r.wiki.contributions,o=(s,d)=>re.parse({schedule:s,timezone:a.timezone,agent:n[0],command:d,timeout:3600,onError:"log"}),i={[qt]:o(a.schedule,`${t} wiki contribute --all`),[Ut]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function Ht(r,t=Bt()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=re.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${ne} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[ne]:o.data,...r.crons}}}function Bt(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var gt,gr,pr,hr,br,xr,yr,kr,kt,_t,H,wt,St,_r,wr,Et,Sr,re,pt,ht,bt,Tr,vr,Rr,Ar,Cr,Ir,$r,Lr,Nr,vt,Or,jr,Dr,Rt,At,Ct,It,$t,Lt,Nt,Ot,xt,jt,Dt,Pt,qt,Ut,ne,Fr=g(()=>{de();fe();Kt();he();ke();Se();Te();Re();Ie();ct();ft();gt=e.array(e.string().min(1)).superRefine((r,t)=>{let n=mt(r);n.length&&t.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${n.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),gr=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),pr=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),hr=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),br=e.union([hr,pr]),xr=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(),yr=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:xr.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),kr=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],kt=e.enum(["system","elevenlabs"]),_t=e.union([e.string(),e.record(e.string(),e.string())]),H=e.string().superRefine((r,t)=>{let n=pe(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),wt=e.object({provider:kt.optional(),system:_t.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:H.optional()}),St=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),_r=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(),br).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({}),notes:e.object({dir:e.string().min(1).optional()}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(St).default([]),integrations:e.array(yr).default([]),voice:wt.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(V).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),wr=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Et=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({}),Sr=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),wr).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:Et}).default({})}).default({})}),re=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(),taskType:e.string().trim().min(1).max(64).optional(),autonomy:oe.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});pt=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),ht=e.union([pt,e.object({repo:pt,about:e.string().max(200).optional()})]),bt={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},Tr=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...bt,repos:e.array(ht).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...bt,repos:e.array(ht).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),vr=e.object({enabled:e.boolean().default(!1),inbox:e.string().min(1).optional(),crons:e.array(e.string().min(1)).default([]),absorbAgent:e.string().min(1).optional(),maxNotesPerRun:e.number().int().min(1).max(100).default(20),maxDeferrals:e.number().int().min(1).max(20).default(3)}).refine(r=>!r.enabled||!!r.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),Rr=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()}),Ar=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Cr=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),Ir=e.object({enabled:e.boolean().default(!1),peers:e.array(Ar).default([]),inboxes:e.array(Cr).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),callbackSends:e.boolean().default(!0)}).default({})}),$r=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({}),Lr=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({}),Nr=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(),Lr).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),vt=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0),busy:e.object({retryMinutes:e.number().int().min(1).max(60).default(5),maxWaitMinutes:e.number().int().min(1).max(240).default(10),title:e.string().min(1).max(120).default("Call waiting: {agent}"),notice:e.string().min(1).max(200).default("AgentX Voice is busy. The call rings when it is free.")}).default({})}).default({}),Or=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({}),jr=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Dr=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-]*$/),jr).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({}),Rt=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),reviewer:e.object({agent:e.string().min(1).optional(),model:e.string().min(1).optional()}).default({}),paths:e.array(e.string().min(1)).default([]),maxCostPerReview:e.number().min(0).default(2),maxMinutes:e.number().positive().max(120).default(10),maxReviewsPerPrPerDay:e.number().int().min(0).max(100).default(6),ciWaitMinutes:e.number().min(0).max(60).default(5),maxDiffKb:e.number().int().positive().max(2048).default(256)}).default({}),At=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),corePaths:e.array(e.string().min(1)).default([]),edgePaths:e.array(e.string().min(1)).default([]),label:e.string().min(1).max(50).default("core-change"),approvers:e.array(e.string().min(1)).default([]),ownerCard:e.boolean().default(!0)}).default({}),Ct=e.object({enabled:e.boolean().default(!1),skipChannels:e.array(e.string().min(1)).default([]),defaultDueMinutes:e.number().positive().max(30*24*60).default(120),noBelow:e.number().min(0).max(1).default(.2),yesAt:e.number().min(0).max(1).default(.7),escalateAfterMinutes:e.number().positive().max(7*24*60).default(30),owner:e.object({channel:e.string().min(1).optional(),chatId:e.string().min(1).optional()}).default({}),retentionDays:e.number().positive().max(3650).default(30),doneSignal:e.enum(["result","explicit"]).default("result"),evidence:e.record(e.string().min(1),e.object({accept:e.array(e.enum(["test","output","link"])).min(1),minOutputChars:e.number().int().min(1).max(2e3).default(40),linkHosts:e.array(e.string().min(1)).default([])})).default({})}).default({}).refine(r=>r.noBelow<=r.yesAt,{message:"watchers.noBelow must not be above watchers.yesAt"}),It=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([]),requireForWork:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a kind of work: a short lower-case word")).default(["code"]),requireOverMinutes:e.number().min(0).max(7*24*60).default(30)}).default({}),checkers:e.object({enabled:e.array(e.enum(["url","issue","git-ancestor","reply"])).default(["url","issue","git-ancestor","reply"]),checkEveryMinutes:e.number().positive().max(24*60).default(10),repos:e.record(e.string(),e.string().min(1)).default({}),github:e.object({apiUrl:e.string().url().default("https://api.github.com"),token:e.string().optional()}).optional(),gitlab:e.object({url:e.string().url().optional(),token:e.string().optional()}).optional()}).default({}),headlines:e.object({enabled:e.boolean().default(!0),provider:e.string().min(1).default("claude-code"),model:e.string().min(1).default("claude-haiku-4-5-20251001"),timeoutSeconds:e.number().int().min(5).max(120).default(30)}).default({})}).default({}),$t=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({})}),Lt=e.array($t).default([]).superRefine((r,t)=>{let n=ut(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Nt=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ot=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),xt=e.string().regex(/^\d{4}-\d{2}-\d{2}$/,"use YYYY-MM-DD"),jt=e.object({enabled:e.boolean().default(!1),repo:e.string().regex(/^[\w.-]+\/[\w.-]+$/,"use owner/name").optional(),issue:e.number().int().positive().optional(),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("08:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),command:e.array(e.string().min(1)).min(1).default(["agentx","quality","report","--public"]),baseline:e.string().regex(/^[\w.-]{1,64}$/,"use letters, digits, dot, dash or underscore").default("baseline"),timeoutSeconds:e.number().int().min(10).max(3600).default(600),gates:e.array(e.object({id:e.string().min(1),label:e.string().min(1).optional(),since:xt,until:xt.optional()})).default([])}).default({}).superRefine((r,t)=>{r.enabled&&(!r.repo||!r.issue)&&t.addIssue({code:e.ZodIssueCode.custom,message:"qualityReport.enabled needs repo and issue"})}),Dt=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),forwardTo:e.string().min(1).optional(),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),Pt=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional(),connectAttemptTimeoutMs:e.number().int().min(250).max(6e4).default(5e3)}),providers:e.record(e.string(),gr).default({}),agents:e.record(e.string(),_r).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(Tr).default([])}).default({})}).default({}),summaries:e.object({model:e.string().min(1).default("haiku"),batchSize:e.number().int().min(1).max(50).default(20),maxWords:e.number().int().min(5).max(120).default(35),schedule:e.string().refine(r=>r.trim()===""||Tt(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(Er,'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:Sr.default({}),crons:e.record(e.string(),re).default({}),wikiNotes:vr.default({}),services:e.record(e.string(),Rr).default({}),notifications:Or,calls:vt,whatsappTriage:Ce,approvals:Dt,quality:e.object({specTests:e.object({enabled:e.boolean().default(!1),paths:e.array(e.string().min(1)).default(["src/daemon"]),agent:e.string().min(1).default("spec-tests"),model:e.string().min(1).optional(),maxCostPerIssue:e.number().positive().max(100).default(2),maxMinutes:e.number().int().min(1).max(120).default(20)}).default({}),canary:e.object({enabled:e.boolean().default(!1),soakMinutes:e.number().int().min(1).max(10080).default(120),thresholds:e.object({maxRestarts:e.number().int().min(0).default(1),maxCrashes:e.number().int().min(0).default(0),maxFailedTasks:e.number().int().min(0).default(3),maxErrorRateIncrease:e.number().min(0).max(1).default(.1),minTasksForRate:e.number().int().min(1).default(10)}).default({})}).default({}),reviewGate:Rt,mergePolicy:At}).default({}),shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),signals:e.object({enabled:e.boolean().default(!0),windDownSeconds:e.number().int().min(10).max(1800).default(120),allowAgents:e.array(e.string().min(1)).default([]),allowPeers:e.array(e.string().min(1)).default([]),maxPerRoot:e.number().int().min(1).max(100).default(6)}).default({}),requests:It,watchers:Ct,people:Lt,members:Nt,requestStatus:Ot,qualityReport:jt,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({}),native:e.object({adapter:e.enum(["auto","none"]).default("auto"),mirror:e.object({enabled:e.boolean().default(!1),list:e.string().min(1).refine(r=>!r.startsWith("-"),'must not start with "-"').default("AgentX Desk"),dueAfterMinutes:e.number().int().min(0).max(1440).default(5),include:e.array(e.enum(["card","request"])).min(1).default(["card","request"]),answerUrl:e.string().url().optional()}).default({}),forwardTo:e.string().min(1).optional(),notes:e.object({enabled:e.boolean().default(!1),folder:e.string().min(1).default("AgentX"),perAgentPerDay:e.number().int().min(1).max(50).default(10)}).default({})}).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({}),pins:e.object({file:e.string().min(1).default(".agentx/app-pins.json"),max:e.number().int().min(1).max(50).default(12),pages:e.array(e.object({label:e.string().trim().min(1).max(40),url:e.string().max(2e3).refine(r=>{try{let t=new URL(r);return t.protocol==="https:"&&!!t.hostname&&!t.username&&!t.password}catch{return!1}},"must be an https:// address with no user name or password")}).strict()).max(50).default([])}).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:Dr,mesh:Ir.default({}),meshVoices:e.record(e.string(),wt.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:kt.default("system"),fallback:e.enum(["system","none"]).default("system"),system:_t.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(Y),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(Z)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:H.default(L.talk),stop:H.default(L.stop),paste:H.default(L.paste)}).default({}),look:e.enum(be).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(xe).default("sometimes"),palette:e.enum(V).default(N),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(O.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(O.maxSeconds)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:ue.optional(),boards:ce,dashboard:me,graph:$r,decisions:Nr,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:gt.default([]),agentxToolsByChannel:e.record(gt).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({})});qt="wiki-contribute",Ut="wiki-contribute-merge";ne="wiki-summarize"});export{zr as a,Kr as b,fe as c,bn as d,Gr as e,L as f,he as g,T as h,be as i,xe as j,V as k,Yr as l,ke as m,_e as n,we as o,ea as p,Se as q,na as r,ra as s,Te as t,ve as u,ia as v,Re as w,Ce as x,Ie as y,Ne as z,Oe as A,ca as B,qe as C,pa as D,ze as E,P as F,Mn as G,_a as H,wa as I,Sa as J,Ge as K,x as L,p as M,Ra as N,Q as O,Aa as P,M as Q,Ca as R,Ve as S,Ye as T,La as U,Na as V,U as W,Oa as X,Je as Y,tt as Z,er as _,Ua as $,ot as aa,Fa as ba,ar as ca,Ha as da,it as ea,Xa as fa,F as ga,Ga as ha,lt as ia,lr as ja,ur as ka,dt as la,Va as ma,Ya as na,Za as oa,ct as pa,mr as qa,Qa as ra,eo as sa,ft as ta,kr as ua,St as va,Et as wa,Tt as xa,vt as ya,Rt as za,At as Aa,Ct as Ba,It as Ca,$t as Da,Lt as Ea,Nt as Fa,Ot as Ga,jt as Ha,Dt as Ia,Pt as Ja,z as Ka,Mr as La,Mt as Ma,qr as Na,qt as Oa,Ut as Pa,Ft as Qa,ne as Ra,Ht as Sa,Ur as Ta,Fr as Ua};
67
+ //# sourceMappingURL=chunk-SQUTRMKH.js.map