agentix-cli 0.137.3 → 0.138.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 (127) hide show
  1. package/dist/{App-TOAWET76.js → App-F42CYCKX.js} +2 -2
  2. package/dist/{ChatApp-4DRCRKFS.js → ChatApp-RPMQBKHV.js} +2 -2
  3. package/dist/{absorb-eval-OXNL5QGQ.js → absorb-eval-HRPEHJSO.js} +2 -2
  4. package/dist/{agent-GALMGMNJ.js → agent-L5CJF3GH.js} +2 -2
  5. package/dist/{board-dashboard-2A6VSQ7V.js → board-dashboard-33NGOGWC.js} +440 -285
  6. package/dist/board-dashboard-33NGOGWC.js.map +1 -0
  7. package/dist/{chunk-XZIKAHFU.js → chunk-375MXG3H.js} +2 -2
  8. package/dist/{chunk-5ADXRVYT.js → chunk-4HHHVWDB.js} +5 -5
  9. package/dist/{chunk-5RHCM3L7.js → chunk-6AUWEL6V.js} +2 -2
  10. package/dist/{chunk-635B6SXI.js → chunk-6VP2KMUM.js} +2 -2
  11. package/dist/{chunk-WCXXXAHV.js → chunk-7DYVNET6.js} +1 -1
  12. package/dist/chunk-7DYVNET6.js.map +1 -0
  13. package/dist/{chunk-3K3LRLZX.js → chunk-7V73QTQ7.js} +2 -2
  14. package/dist/{chunk-PNITKKDR.js → chunk-7YZL5MUL.js} +9 -9
  15. package/dist/{chunk-PNITKKDR.js.map → chunk-7YZL5MUL.js.map} +1 -1
  16. package/dist/{chunk-GIQKQD2B.js → chunk-AGQYUOZY.js} +2 -2
  17. package/dist/{chunk-2JKKGS77.js → chunk-AP4DADXG.js} +2 -2
  18. package/dist/{chunk-TEM7IIDC.js → chunk-CZZJEFUM.js} +2 -2
  19. package/dist/{chunk-23LWLYOK.js → chunk-DBJUGKX2.js} +2 -2
  20. package/dist/{chunk-B6PMIUVV.js → chunk-EGPCEQJN.js} +2 -2
  21. package/dist/{chunk-ZYUVKFX2.js → chunk-GAIXI26T.js} +2 -2
  22. package/dist/{chunk-KHYF6KTY.js → chunk-HJCFLGVT.js} +13 -13
  23. package/dist/chunk-HJCFLGVT.js.map +1 -0
  24. package/dist/{chunk-VDG6Y5L3.js → chunk-HQH44RGL.js} +2 -2
  25. package/dist/{chunk-BXXP6DTB.js → chunk-JIJDBCV7.js} +2 -2
  26. package/dist/{chunk-Z2QOQBUS.js → chunk-LA6P3TUK.js} +2 -2
  27. package/dist/{chunk-SQ37I2MD.js → chunk-MTDVAO5C.js} +2 -2
  28. package/dist/{chunk-7JUISIE7.js → chunk-QGSUENRK.js} +2 -2
  29. package/dist/{chunk-PNYBZPPB.js → chunk-SK47VJMQ.js} +3 -3
  30. package/dist/{chunk-RWMDDMYX.js → chunk-TFH6S7IT.js} +2 -2
  31. package/dist/{chunk-QY5YUHGW.js → chunk-TVW5ZKJY.js} +2 -2
  32. package/dist/{chunk-ID4DCD2T.js → chunk-UPNKRCFX.js} +7 -7
  33. package/dist/{chunk-IIFHX625.js → chunk-UPQTTOVQ.js} +2 -2
  34. package/dist/{chunk-E3AEOQMK.js → chunk-VVX4RXMV.js} +2 -2
  35. package/dist/{chunk-PLPDG6GE.js → chunk-XBARUCG5.js} +2 -2
  36. package/dist/{chunk-MXDWLBIA.js → chunk-XVYIPVSC.js} +2 -2
  37. package/dist/{chunk-JC5KLH2K.js → chunk-Y7IHOQC7.js} +2 -2
  38. package/dist/cli.js +1 -1
  39. package/dist/{client-PWE4BJH4.js → client-EB55Y6EJ.js} +2 -2
  40. package/dist/{config-E53FBZ47.js → config-7DRUA5R3.js} +2 -2
  41. package/dist/{config-mutate-ZEHN6JMZ.js → config-mutate-GGA7VXXH.js} +2 -2
  42. package/dist/config-mutator-POFVILXH.js +2 -0
  43. package/dist/{contributions-CLLCLS3O.js → contributions-TZ26MTML.js} +2 -2
  44. package/dist/{doctor-XKT5FWPO.js → doctor-GTRZ7GWF.js} +2 -2
  45. package/dist/{follow-up-tool-ZFRZUZLI.js → follow-up-tool-PNB7KMCY.js} +2 -2
  46. package/dist/{hub-N5ADP3LO.js → hub-QWJR4E6V.js} +2 -2
  47. package/dist/index.js +1 -1
  48. package/dist/{program-3TO4YAY7.js → program-KMUCHLDU.js} +23 -23
  49. package/dist/{program-3TO4YAY7.js.map → program-KMUCHLDU.js.map} +1 -1
  50. package/dist/{promote-M4UBD2R6.js → promote-HAPXWGYH.js} +2 -2
  51. package/dist/{push-bridge-HNQG2TOI.js → push-bridge-276ZLSUT.js} +2 -2
  52. package/dist/{query-KMQHF5HW.js → query-ICLOVLZ3.js} +2 -2
  53. package/dist/{query-settings-PENAE4UG.js → query-settings-7AXUOHDL.js} +2 -2
  54. package/dist/{registry-GYKSYSDD.js → registry-IUNSHCOL.js} +2 -2
  55. package/dist/{request-planner-GBX6DHRQ.js → request-planner-TDCLF2CH.js} +2 -2
  56. package/dist/{review-candidates-SYMRJGI2.js → review-candidates-QCBXLWG6.js} +2 -2
  57. package/dist/{routing-S3L44JLL.js → routing-YUP3HHL5.js} +2 -2
  58. package/dist/schedule-tool-3C22NBMN.js +2 -0
  59. package/dist/{scheduler-AW4F5ZKS.js → scheduler-7NK2FH5V.js} +2 -2
  60. package/dist/{seat-QBBNCOFO.js → seat-PTPPQOTP.js} +2 -2
  61. package/dist/{select-ZCFIMYWS.js → select-2XSTWMBR.js} +2 -2
  62. package/dist/{set-enabled-4F27A3U2.js → set-enabled-SS5Q3OX7.js} +2 -2
  63. package/dist/{tool-M462KSMF.js → tool-QCMSXEDB.js} +2 -2
  64. package/dist/{tool-G6XTO24J.js → tool-RK4LDFFH.js} +2 -2
  65. package/dist/{wiki-JXVHIEZI.js → wiki-Q2E44YAE.js} +2 -2
  66. package/dist/wiki-enrich-6ULCDOTX.js +2 -0
  67. package/package.json +1 -1
  68. package/dist/board-dashboard-2A6VSQ7V.js.map +0 -1
  69. package/dist/chunk-KHYF6KTY.js.map +0 -1
  70. package/dist/chunk-WCXXXAHV.js.map +0 -1
  71. package/dist/config-mutator-AK775RTM.js +0 -2
  72. package/dist/schedule-tool-FXUFRZHR.js +0 -2
  73. package/dist/wiki-enrich-6776OMUB.js +0 -2
  74. /package/dist/{App-TOAWET76.js.map → App-F42CYCKX.js.map} +0 -0
  75. /package/dist/{ChatApp-4DRCRKFS.js.map → ChatApp-RPMQBKHV.js.map} +0 -0
  76. /package/dist/{absorb-eval-OXNL5QGQ.js.map → absorb-eval-HRPEHJSO.js.map} +0 -0
  77. /package/dist/{agent-GALMGMNJ.js.map → agent-L5CJF3GH.js.map} +0 -0
  78. /package/dist/{chunk-XZIKAHFU.js.map → chunk-375MXG3H.js.map} +0 -0
  79. /package/dist/{chunk-5ADXRVYT.js.map → chunk-4HHHVWDB.js.map} +0 -0
  80. /package/dist/{chunk-5RHCM3L7.js.map → chunk-6AUWEL6V.js.map} +0 -0
  81. /package/dist/{chunk-635B6SXI.js.map → chunk-6VP2KMUM.js.map} +0 -0
  82. /package/dist/{chunk-3K3LRLZX.js.map → chunk-7V73QTQ7.js.map} +0 -0
  83. /package/dist/{chunk-GIQKQD2B.js.map → chunk-AGQYUOZY.js.map} +0 -0
  84. /package/dist/{chunk-2JKKGS77.js.map → chunk-AP4DADXG.js.map} +0 -0
  85. /package/dist/{chunk-TEM7IIDC.js.map → chunk-CZZJEFUM.js.map} +0 -0
  86. /package/dist/{chunk-23LWLYOK.js.map → chunk-DBJUGKX2.js.map} +0 -0
  87. /package/dist/{chunk-B6PMIUVV.js.map → chunk-EGPCEQJN.js.map} +0 -0
  88. /package/dist/{chunk-ZYUVKFX2.js.map → chunk-GAIXI26T.js.map} +0 -0
  89. /package/dist/{chunk-VDG6Y5L3.js.map → chunk-HQH44RGL.js.map} +0 -0
  90. /package/dist/{chunk-BXXP6DTB.js.map → chunk-JIJDBCV7.js.map} +0 -0
  91. /package/dist/{chunk-Z2QOQBUS.js.map → chunk-LA6P3TUK.js.map} +0 -0
  92. /package/dist/{chunk-SQ37I2MD.js.map → chunk-MTDVAO5C.js.map} +0 -0
  93. /package/dist/{chunk-7JUISIE7.js.map → chunk-QGSUENRK.js.map} +0 -0
  94. /package/dist/{chunk-PNYBZPPB.js.map → chunk-SK47VJMQ.js.map} +0 -0
  95. /package/dist/{chunk-RWMDDMYX.js.map → chunk-TFH6S7IT.js.map} +0 -0
  96. /package/dist/{chunk-QY5YUHGW.js.map → chunk-TVW5ZKJY.js.map} +0 -0
  97. /package/dist/{chunk-ID4DCD2T.js.map → chunk-UPNKRCFX.js.map} +0 -0
  98. /package/dist/{chunk-IIFHX625.js.map → chunk-UPQTTOVQ.js.map} +0 -0
  99. /package/dist/{chunk-E3AEOQMK.js.map → chunk-VVX4RXMV.js.map} +0 -0
  100. /package/dist/{chunk-PLPDG6GE.js.map → chunk-XBARUCG5.js.map} +0 -0
  101. /package/dist/{chunk-MXDWLBIA.js.map → chunk-XVYIPVSC.js.map} +0 -0
  102. /package/dist/{chunk-JC5KLH2K.js.map → chunk-Y7IHOQC7.js.map} +0 -0
  103. /package/dist/{client-PWE4BJH4.js.map → client-EB55Y6EJ.js.map} +0 -0
  104. /package/dist/{config-E53FBZ47.js.map → config-7DRUA5R3.js.map} +0 -0
  105. /package/dist/{config-mutate-ZEHN6JMZ.js.map → config-mutate-GGA7VXXH.js.map} +0 -0
  106. /package/dist/{config-mutator-AK775RTM.js.map → config-mutator-POFVILXH.js.map} +0 -0
  107. /package/dist/{contributions-CLLCLS3O.js.map → contributions-TZ26MTML.js.map} +0 -0
  108. /package/dist/{doctor-XKT5FWPO.js.map → doctor-GTRZ7GWF.js.map} +0 -0
  109. /package/dist/{follow-up-tool-ZFRZUZLI.js.map → follow-up-tool-PNB7KMCY.js.map} +0 -0
  110. /package/dist/{hub-N5ADP3LO.js.map → hub-QWJR4E6V.js.map} +0 -0
  111. /package/dist/{promote-M4UBD2R6.js.map → promote-HAPXWGYH.js.map} +0 -0
  112. /package/dist/{push-bridge-HNQG2TOI.js.map → push-bridge-276ZLSUT.js.map} +0 -0
  113. /package/dist/{query-KMQHF5HW.js.map → query-ICLOVLZ3.js.map} +0 -0
  114. /package/dist/{query-settings-PENAE4UG.js.map → query-settings-7AXUOHDL.js.map} +0 -0
  115. /package/dist/{registry-GYKSYSDD.js.map → registry-IUNSHCOL.js.map} +0 -0
  116. /package/dist/{request-planner-GBX6DHRQ.js.map → request-planner-TDCLF2CH.js.map} +0 -0
  117. /package/dist/{review-candidates-SYMRJGI2.js.map → review-candidates-QCBXLWG6.js.map} +0 -0
  118. /package/dist/{routing-S3L44JLL.js.map → routing-YUP3HHL5.js.map} +0 -0
  119. /package/dist/{schedule-tool-FXUFRZHR.js.map → schedule-tool-3C22NBMN.js.map} +0 -0
  120. /package/dist/{scheduler-AW4F5ZKS.js.map → scheduler-7NK2FH5V.js.map} +0 -0
  121. /package/dist/{seat-QBBNCOFO.js.map → seat-PTPPQOTP.js.map} +0 -0
  122. /package/dist/{select-ZCFIMYWS.js.map → select-2XSTWMBR.js.map} +0 -0
  123. /package/dist/{set-enabled-4F27A3U2.js.map → set-enabled-SS5Q3OX7.js.map} +0 -0
  124. /package/dist/{tool-M462KSMF.js.map → tool-QCMSXEDB.js.map} +0 -0
  125. /package/dist/{tool-G6XTO24J.js.map → tool-RK4LDFFH.js.map} +0 -0
  126. /package/dist/{wiki-JXVHIEZI.js.map → wiki-Q2E44YAE.js.map} +0 -0
  127. /package/dist/{wiki-enrich-6776OMUB.js.map → wiki-enrich-6ULCDOTX.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{Aa as m,sa as l}from"./chunk-KHYF6KTY.js";m();import{existsSync as g,readFileSync as u,writeFileSync as a,copyFileSync as y}from"fs";import{resolve as p}from"path";function P(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(!g(t))throw new Error(`agentx.json not found at ${t}`);let i=JSON.parse(u(t,"utf-8")),o=e(i),s=typeof o=="string"?{summary:o}:o,c=JSON.stringify(i,null,2)+`
1
+ import{Aa as m,sa as l}from"./chunk-HJCFLGVT.js";m();import{existsSync as g,readFileSync as u,writeFileSync as a,copyFileSync as y}from"fs";import{resolve as p}from"path";function P(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(!g(t))throw new Error(`agentx.json not found at ${t}`);let i=JSON.parse(u(t,"utf-8")),o=e(i),s=typeof o=="string"?{summary:o}:o,c=JSON.stringify(i,null,2)+`
2
2
  `,f=t+".tmp";a(f,c,"utf-8");try{JSON.parse(u(f,"utf-8"))}catch(d){throw new Error(`config did not round-trip cleanly: ${d.message}`)}let r;return n.skipBackup||(r=`${t}.bak.${Date.now()}`,y(t,r)),a(t,c,"utf-8"),n.skipReload||h().catch(()=>{}),{summary:s.summary,payload:s.payload,backupPath:r}}function S(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(g(t)&&!n.overwrite)throw new Error(`agentx.json already exists at ${t}. Pass overwrite=true to replace it.`);return a(t,JSON.stringify(e,null,2)+`
3
3
  `,"utf-8"),{file:t}}async function h(){try{let n=l().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";await fetch(`${n}/reload`,{method:"POST"}).catch(()=>null)}catch{}}export{P as a,S as b};
4
- //# sourceMappingURL=chunk-GIQKQD2B.js.map
4
+ //# sourceMappingURL=chunk-AGQYUOZY.js.map
@@ -1,8 +1,8 @@
1
- import{a as D,b as _}from"./chunk-RKPAVWXF.js";import{a as R,b as q,c as O,d as B,f as k,g as v,h as E,i as w,j as y}from"./chunk-5RHCM3L7.js";import{a as T,b as C,c as I,d as x,e as P}from"./chunk-BXXP6DTB.js";import{existsSync as X,readFileSync as F}from"fs";var J=new Set(["cron","heartbeat","api","a2a","mesh"]),M=160;function s(n){return typeof n=="string"&&n.trim()?n.trim():void 0}function S(n,e=M){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function V(n){let e=T(n);if(!X(e))throw new Error(`config not found at ${e}`);return JSON.parse(F(e,"utf-8"))}function W(n,e){return n?.agents?.[e]?.admin===!0}function Y(n,e,t){return W(n,t.agentId)||e?.createdBy===t.agentId}function Z(n,e){let t=e?.createdBy?`agent "${e.createdBy}"`:"the operator";return`Not allowed: "${n}" was created by ${t}. Agents manage only schedules they created (unless configured admin).`}function K(n,e){let t=s(n.notify);if(t!=="none"){if(t&&t!=="here"){let r=t.split(":");return r.length<2||!r[0]||!r[1]?"invalid":{channel:r[0],chatId:r.slice(1).join(":")}}if(e.channel&&e.chatId&&!J.has(e.channel))return{channel:e.channel,chatId:e.chatId,...e.accountId?{accountId:e.accountId}:{}}}}function Q(n,e,t){let r=e.timezone||"UTC",d=e.enabled&&!y(e)?w(E(e.schedule,r,t),r):"\u2014",h=e.approval?`pending ${e.approval.action} approval`:e.enabled?"active":"paused",f=[`- ${n} [${h}] ${e.schedule} \u2014 ${v(e.schedule)} (${r})`,` agent: ${e.agent}; created by: ${e.createdBy||"operator"}; next: ${d}`];return e.notify&&f.push(` notify: ${e.notify.channel} ${e.notify.chatId}${e.deliverResult===!1?" (failures only)":" (results and failures)"}`),e.command?f.push(` command: ${S(String(e.command))}`):e.prompt&&f.push(` prompt: ${S(String(e.prompt))}`),f.join(`
1
+ import{a as D,b as _}from"./chunk-RKPAVWXF.js";import{a as R,b as q,c as O,d as B,f as k,g as v,h as E,i as w,j as y}from"./chunk-6AUWEL6V.js";import{a as T,b as C,c as I,d as x,e as P}from"./chunk-JIJDBCV7.js";import{existsSync as X,readFileSync as F}from"fs";var J=new Set(["cron","heartbeat","api","a2a","mesh"]),M=160;function s(n){return typeof n=="string"&&n.trim()?n.trim():void 0}function S(n,e=M){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function V(n){let e=T(n);if(!X(e))throw new Error(`config not found at ${e}`);return JSON.parse(F(e,"utf-8"))}function W(n,e){return n?.agents?.[e]?.admin===!0}function Y(n,e,t){return W(n,t.agentId)||e?.createdBy===t.agentId}function Z(n,e){let t=e?.createdBy?`agent "${e.createdBy}"`:"the operator";return`Not allowed: "${n}" was created by ${t}. Agents manage only schedules they created (unless configured admin).`}function K(n,e){let t=s(n.notify);if(t!=="none"){if(t&&t!=="here"){let r=t.split(":");return r.length<2||!r[0]||!r[1]?"invalid":{channel:r[0],chatId:r.slice(1).join(":")}}if(e.channel&&e.chatId&&!J.has(e.channel))return{channel:e.channel,chatId:e.chatId,...e.accountId?{accountId:e.accountId}:{}}}}function Q(n,e,t){let r=e.timezone||"UTC",d=e.enabled&&!y(e)?w(E(e.schedule,r,t),r):"\u2014",h=e.approval?`pending ${e.approval.action} approval`:e.enabled?"active":"paused",f=[`- ${n} [${h}] ${e.schedule} \u2014 ${v(e.schedule)} (${r})`,` agent: ${e.agent}; created by: ${e.createdBy||"operator"}; next: ${d}`];return e.notify&&f.push(` notify: ${e.notify.channel} ${e.notify.chatId}${e.deliverResult===!1?" (failures only)":" (results and failures)"}`),e.command?f.push(` command: ${S(String(e.command))}`):e.prompt&&f.push(` prompt: ${S(String(e.prompt))}`),f.join(`
2
2
  `)}async function b(n,e,t){let r=n?.notifications?.destination;if(!r?.channel||!r?.chatId)return"No operator notification destination is configured (notifications.destination); the operator must check `agentx schedule list`.";if(!e.notifyOperator)return"Operator notification is unavailable in this context.";try{return await e.notifyOperator({channel:r.channel,chatId:r.chatId,accountId:r.accountId},t),"The operator has been notified."}catch(d){return`Could not notify the operator (${d?.message??d}); the request is still recorded.`}}async function re(n,e,t={}){let r=(s(n.action)||"list").toLowerCase(),d=t.now?t.now():new Date,h;try{h=V(t.configPath)}catch(a){return`Error: ${a.message}`}let f=h.crons||{};if(r==="list"){let a=n.mine===!0,l=Object.entries(f).filter(([,i])=>!a||e&&i?.createdBy===e.agentId);return l.length?l.map(([i,p])=>Q(i,p,d)).join(`
3
3
  `):a?"You have no schedules.":"No schedules."}if(!e?.agentId)return"Error: caller agent is unknown (AGENTX_AGENT_ID not set). Pass callerAgentId.";if(!h.agents?.[e.agentId])return`Error: caller "${e.agentId}" is not an agent on this node.`;let o=s(n.id),m=a=>C(a,{configPath:t.configPath,reload:t.reload});if(r==="create"){let a=s(n.when),l=s(n.prompt);if(!a||!l)return"Error: create needs `when` (plain English) and `prompt`.";let i=D(a);if(!i)return`Error: couldn't parse "${a}". ${q}.`;let p=s(n.agent)||e.agentId;if(!h.agents?.[p])return`Error: agent "${p}" not found on this node.`;let g=s(n.timezone)||R;if(!B(g))return`Error: unknown timezone "${g}".`;let u=o||_(i.matched,p);if(!O(u))return`Error: invalid id "${u}" (letters, digits, "-" and "_" only).`;if(f[u])return`Error: a schedule "${u}" already exists. Pick another \`id\`.`;let $=K(n,e);if($==="invalid")return'Error: `notify` must be "here", "none", or "channel:chatId".';let z={action:"create",requestedBy:e.agentId,requestedAt:d.toISOString()},L=k({parsed:i,agent:p,prompt:l,timezone:g,notify:$,enabled:!1,createdBy:e.agentId,approval:z}),A=await m(U=>I(U,`crons.${u}`,L));if(!A.success)return`Error: ${A.error}`;let N=w(E(i.cron,g,d),g),G=[`Schedule approval requested by ${e.agentId}`,`Create: ${u}`,`When: ${i.human} \u2014 cron \`${i.cron}\` (${g})`,`Next fire: ${N}`,`Agent: ${p}`,$?`Results and failures go to: ${$.channel} ${$.chatId}${$.channel==="voice"?" (as a push notification)":""}`:"Results go to: run log only (no chat)",`Prompt: ${S(l,400)}`,"",`Approve: agentx schedule approve ${u}`,`Reject: agentx schedule reject ${u}`].join(`
4
4
  `),H=await b(h,t,G);return[`Requested schedule "${u}": ${i.human} (cron ${i.cron}, ${g}); next fire would be ${N}.`,"It is saved DISABLED and will not run until the operator approves it.",H].join(`
5
5
  `)}if(!o)return`Error: ${r} needs \`id\`.`;let c=f[o];if(!c)return`Error: schedule "${o}" not found.`;if(!Y(h,c,e))return Z(o,c);if(r==="pause"||r==="resume"){let a=r==="resume";if(a&&y(c))return`"${o}" is still awaiting operator approval; it can't be resumed until approved.`;if(c.enabled===a)return`"${o}" is already ${a?"active":"paused"}.`;let l=await m(i=>I(i,`crons.${o}.enabled`,a));return l.success?`"${o}" ${a?"resumed":"paused"}.`:`Error: ${l.error}`}if(r==="delete"){if(y(c)&&c.approval.requestedBy===e.agentId){let u=await m($=>P($,`crons.${o}`));return u.success?`Withdrew the pending request "${o}".`:`Error: ${u.error}`}if(y(c))return`"${o}" is a creation request still awaiting approval; only its requester or the operator (\`agentx schedule reject ${o}\`) can drop it.`;if(c.approval?.action==="delete")return`Deletion of "${o}" is already awaiting approval.`;let a={action:"delete",requestedBy:e.agentId,requestedAt:d.toISOString()},l=await m(u=>{if(!x(u,`crons.${o}`))throw new Error(`schedule "${o}" not found`);I(u,`crons.${o}.approval`,a)});if(!l.success)return`Error: ${l.error}`;let i=c.timezone||"UTC",p=[`Schedule approval requested by ${e.agentId}`,`Delete: ${o}`,`When: ${v(c.schedule)} \u2014 cron \`${c.schedule}\` (${i})`,`Next fire: ${c.enabled?w(E(c.schedule,i,d),i):"\u2014 (paused)"}`,`Agent: ${c.agent}`,"",`Approve: agentx schedule approve ${o}`,`Reject: agentx schedule reject ${o}`].join(`
6
6
  `),g=await b(h,t,p);return[`Deletion of "${o}" requested. It keeps its current state until the operator approves.`,g].join(`
7
7
  `)}return`Error: unknown action "${r}". Use list, create, pause, resume or delete.`}function oe(n,e=process.env){let t=s(e.AGENTX_AGENT_ID)||s(n.callerAgentId);if(!t)return null;let r=!!(s(e.AGENTX_CHANNEL)&&s(e.AGENTX_CHAT_ID)),d=s(r?e.AGENTX_CHANNEL:n.channel),h=s(r?e.AGENTX_CHAT_ID:n.chatId),f=s(n.accountId);return{agentId:t,channel:d,chatId:h,...f?{accountId:f}:{}}}export{re as a,oe as b};
8
- //# sourceMappingURL=chunk-2JKKGS77.js.map
8
+ //# sourceMappingURL=chunk-AP4DADXG.js.map
@@ -1,2 +1,2 @@
1
- import{c as d,g}from"./chunk-WCXXXAHV.js";import{a as f}from"./chunk-5HLD66CW.js";var k=/^[A-Za-z0-9._-]{1,64}$/,m=/^[A-Za-z0-9_-]{1,64}$/,A=100,w=1e3,E=6e4,P=15*6e4;function p(r){return(r.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"node").slice(0,64)}function _(r,t,n){let i=/^bearer /i.test(r)?r.slice(7).trim():"",e="Phones paired with another computer need that computer's own peer token: give it a token in mesh.peers on both computers.";if(!i||n&&i===n)return{error:e};let a=new Set(t.filter(s=>s.token===i).map(s=>p(s.name)));if(a.size===0)return{error:e};if(a.size>1)return{error:`Several mesh.peers entries share this token (${[...a].join(", ")}). Give each computer its own token.`};let[o]=a,u=t.filter(s=>s.token!==i&&p(s.name)===o).map(s=>s.name);return u.length?{error:`mesh.peers names ${u.map(s=>`"${s}"`).join(", ")} too close to this computer's name: rename one so they differ in letters or digits.`}:{origin:o}}function C(r,t){let n=r.indexOf(":");return n<0?{ok:!0}:"error"in t?{error:t.error}:r.slice(0,n)!==t.origin?{error:`${r} is a phone paired with another computer; only that computer can send to it.`}:{ok:!0}}function x(r,t,n){let i=r.toLowerCase(),e=t.find(a=>a.name.toLowerCase()===i);return e?e.token?n&&e.token===n?`mesh.peers "${e.name}" uses the shared MESH_TOKEN, so phones paired here can't turn notifications on. Give this pair a token of its own on both computers.`:null:`mesh.peers "${e.name}" has no token, so phones paired here can't turn notifications on. Give it a token of its own on both computers.`:null}function O(r){return new Set(r.map(t=>p(t.name)))}function j(r,t,n,i){let e=r&&typeof r=="object"?r:{};if("error"in t)return{status:403,body:{error:t.error}};let a=t.origin;if(!k.test(a))return{status:403,body:{error:"this peer's name can't be used as a notification origin"}};if(!n)return{status:503,body:{error:i??"Notifications are not set up on the computer that sends them."}};if(e.op==="roster"){if(!Array.isArray(e.active)||e.active.length>w||!e.active.every(l=>typeof l=="string"&&m.test(l)))return{status:400,body:{error:"active must be a list of device ids"}};let h=n.store();return h?{status:200,body:{ok:!0,removed:h.pruneOrigin(a,e.active)}}:{status:503,body:{error:n.reason??"the database is unavailable"}}}if(e.op!=="app")return{status:400,body:{error:"op must be app or roster"}};let o=e.call&&typeof e.call=="object"?e.call:{},u=o.device&&typeof o.device=="object"?o.device:{},s=typeof o.path=="string"?o.path:"",c=o.method==="GET"||o.method==="POST"?o.method:"";if(!d(s)||!c)return{status:404,body:{error:"not found"}};if(typeof u.id!="string"||!m.test(u.id))return{status:400,body:{error:"device.id is required"}};let b=typeof u.name=="string"&&u.name.trim()?u.name.trim():u.id,v=o.body&&typeof o.body=="object"&&!Array.isArray(o.body)?o.body:{};return g({path:s,method:c,body:v,device:{id:f(a,u.id),name:S(`${b} (${a})`,A)}},n)}var y=class{constructor(t){this.deps=t}lastKey=null;lastSentAt=0;failing=!1;async tick(){let t=(this.deps.now??Date.now)(),n;try{n=[...new Set(this.deps.active())].sort()}catch(e){return this.deps.log?.(`push: phone list not read, not sent this time: ${e?.message??e}`),!1}let i=n.join(",");if(i===this.lastKey&&t-this.lastSentAt<P)return!1;try{let e=await this.deps.send(n);if(e&&typeof e=="object"&&typeof e.status=="number"&&e.status!==200)throw new Error(`${e.status} ${typeof e.body?.error=="string"?e.body.error:"refused"}`);return this.lastKey=i,this.lastSentAt=t,this.failing&&this.deps.log?.("push: phone list sent to the push host again"),this.failing=!1,!0}catch(e){return this.failing||this.deps.log?.(`push: phone list not sent to the push host, retrying every minute: ${e?.message??e}`),this.failing=!0,!1}}};function S(r,t){let n=[...r];return n.length>t?n.slice(0,t-1).join("")+"\u2026":r}export{E as a,P as b,p as c,_ as d,C as e,x as f,O as g,j as h,y as i};
2
- //# sourceMappingURL=chunk-TEM7IIDC.js.map
1
+ import{c as d,g}from"./chunk-7DYVNET6.js";import{a as f}from"./chunk-5HLD66CW.js";var k=/^[A-Za-z0-9._-]{1,64}$/,m=/^[A-Za-z0-9_-]{1,64}$/,A=100,w=1e3,E=6e4,P=15*6e4;function p(r){return(r.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"node").slice(0,64)}function _(r,t,n){let i=/^bearer /i.test(r)?r.slice(7).trim():"",e="Phones paired with another computer need that computer's own peer token: give it a token in mesh.peers on both computers.";if(!i||n&&i===n)return{error:e};let a=new Set(t.filter(s=>s.token===i).map(s=>p(s.name)));if(a.size===0)return{error:e};if(a.size>1)return{error:`Several mesh.peers entries share this token (${[...a].join(", ")}). Give each computer its own token.`};let[o]=a,u=t.filter(s=>s.token!==i&&p(s.name)===o).map(s=>s.name);return u.length?{error:`mesh.peers names ${u.map(s=>`"${s}"`).join(", ")} too close to this computer's name: rename one so they differ in letters or digits.`}:{origin:o}}function C(r,t){let n=r.indexOf(":");return n<0?{ok:!0}:"error"in t?{error:t.error}:r.slice(0,n)!==t.origin?{error:`${r} is a phone paired with another computer; only that computer can send to it.`}:{ok:!0}}function x(r,t,n){let i=r.toLowerCase(),e=t.find(a=>a.name.toLowerCase()===i);return e?e.token?n&&e.token===n?`mesh.peers "${e.name}" uses the shared MESH_TOKEN, so phones paired here can't turn notifications on. Give this pair a token of its own on both computers.`:null:`mesh.peers "${e.name}" has no token, so phones paired here can't turn notifications on. Give it a token of its own on both computers.`:null}function O(r){return new Set(r.map(t=>p(t.name)))}function j(r,t,n,i){let e=r&&typeof r=="object"?r:{};if("error"in t)return{status:403,body:{error:t.error}};let a=t.origin;if(!k.test(a))return{status:403,body:{error:"this peer's name can't be used as a notification origin"}};if(!n)return{status:503,body:{error:i??"Notifications are not set up on the computer that sends them."}};if(e.op==="roster"){if(!Array.isArray(e.active)||e.active.length>w||!e.active.every(l=>typeof l=="string"&&m.test(l)))return{status:400,body:{error:"active must be a list of device ids"}};let h=n.store();return h?{status:200,body:{ok:!0,removed:h.pruneOrigin(a,e.active)}}:{status:503,body:{error:n.reason??"the database is unavailable"}}}if(e.op!=="app")return{status:400,body:{error:"op must be app or roster"}};let o=e.call&&typeof e.call=="object"?e.call:{},u=o.device&&typeof o.device=="object"?o.device:{},s=typeof o.path=="string"?o.path:"",c=o.method==="GET"||o.method==="POST"?o.method:"";if(!d(s)||!c)return{status:404,body:{error:"not found"}};if(typeof u.id!="string"||!m.test(u.id))return{status:400,body:{error:"device.id is required"}};let b=typeof u.name=="string"&&u.name.trim()?u.name.trim():u.id,v=o.body&&typeof o.body=="object"&&!Array.isArray(o.body)?o.body:{};return g({path:s,method:c,body:v,device:{id:f(a,u.id),name:S(`${b} (${a})`,A)}},n)}var y=class{constructor(t){this.deps=t}lastKey=null;lastSentAt=0;failing=!1;async tick(){let t=(this.deps.now??Date.now)(),n;try{n=[...new Set(this.deps.active())].sort()}catch(e){return this.deps.log?.(`push: phone list not read, not sent this time: ${e?.message??e}`),!1}let i=n.join(",");if(i===this.lastKey&&t-this.lastSentAt<P)return!1;try{let e=await this.deps.send(n);if(e&&typeof e=="object"&&typeof e.status=="number"&&e.status!==200)throw new Error(`${e.status} ${typeof e.body?.error=="string"?e.body.error:"refused"}`);return this.lastKey=i,this.lastSentAt=t,this.failing&&this.deps.log?.("push: phone list sent to the push host again"),this.failing=!1,!0}catch(e){return this.failing||this.deps.log?.(`push: phone list not sent to the push host, retrying every minute: ${e?.message??e}`),this.failing=!0,!1}}};function S(r,t){let n=[...r];return n.length>t?n.slice(0,t-1).join("")+"\u2026":r}export{E as a,P as b,p as c,_ as d,C as e,x as f,O as g,j as h,y as i};
2
+ //# sourceMappingURL=chunk-CZZJEFUM.js.map
@@ -1,4 +1,4 @@
1
- import{b as S,c as O}from"./chunk-BXXP6DTB.js";import{h as B,j as J}from"./chunk-3UOTLMXD.js";import{a as I,b as P}from"./chunk-FCPTN6NF.js";import{a as X,b as ue}from"./chunk-7I7IEX4S.js";import{d as F}from"./chunk-QIJLFPWE.js";import{execFile as Ae}from"child_process";import{writeFileSync as ie,mkdirSync as x,existsSync as b,readFileSync as ke}from"fs";import{resolve as v}from"path";var le=["off","shadow","authoritative"],ge={telegram:"INTENT_LEDGER_MODE_TELEGRAM",slack:"INTENT_LEDGER_MODE_SLACK",whatsapp:"INTENT_LEDGER_MODE_WHATSAPP",discord:"INTENT_LEDGER_MODE_DISCORD",gitlab:"INTENT_LEDGER_MODE_GITLAB",github:"INTENT_LEDGER_MODE_GITHUB",workflow:"INTENT_LEDGER_MODE_WORKFLOW",cron:"INTENT_LEDGER_MODE_CRON",mesh:"INTENT_LEDGER_MODE_MESH"},me="INTENT_LEDGER_MODE";function G(i,e=process.env){let t=U(e[ge[i]]);if(t)return t;let n=U(e[me]);return n||"off"}function U(i){if(typeof i!="string")return null;let e=i.trim().toLowerCase();return le.includes(e)?e:null}P();import he from"better-sqlite3";import{existsSync as Ue,mkdirSync as fe}from"fs";import{dirname as pe,resolve as Ee}from"path";var T=class{db;path;constructor(e={}){this.path=Ee(process.cwd(),e.path??".agentx/intent/ledger.sqlite"),fe(pe(this.path),{recursive:!0}),this.db=new he(this.path),this.db.pragma("journal_mode = WAL"),this.db.pragma("synchronous = NORMAL"),this.db.pragma("foreign_keys = ON"),ye(this.db)}close(){this.db.close()}schemaVersion(){return this.db.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0}recordEvent(e){if(e.sourceEventId!==null){let n=this.findEventBySourceId(e.source,e.sourceEventId);if(n)return n}let t={id:e.id??I(e.ts),ts:e.ts,source:e.source,sourceEventId:e.sourceEventId,project:e.project,subject:e.subject,intent:e.intent,rawJson:e.rawJson};return this.db.prepare(`INSERT INTO intent_events (id, ts, source, source_event_id, project, subject, intent, raw_json)
1
+ import{b as S,c as O}from"./chunk-JIJDBCV7.js";import{h as B,j as J}from"./chunk-3UOTLMXD.js";import{a as I,b as P}from"./chunk-FCPTN6NF.js";import{a as X,b as ue}from"./chunk-7I7IEX4S.js";import{d as F}from"./chunk-QIJLFPWE.js";import{execFile as Ae}from"child_process";import{writeFileSync as ie,mkdirSync as x,existsSync as b,readFileSync as ke}from"fs";import{resolve as v}from"path";var le=["off","shadow","authoritative"],ge={telegram:"INTENT_LEDGER_MODE_TELEGRAM",slack:"INTENT_LEDGER_MODE_SLACK",whatsapp:"INTENT_LEDGER_MODE_WHATSAPP",discord:"INTENT_LEDGER_MODE_DISCORD",gitlab:"INTENT_LEDGER_MODE_GITLAB",github:"INTENT_LEDGER_MODE_GITHUB",workflow:"INTENT_LEDGER_MODE_WORKFLOW",cron:"INTENT_LEDGER_MODE_CRON",mesh:"INTENT_LEDGER_MODE_MESH"},me="INTENT_LEDGER_MODE";function G(i,e=process.env){let t=U(e[ge[i]]);if(t)return t;let n=U(e[me]);return n||"off"}function U(i){if(typeof i!="string")return null;let e=i.trim().toLowerCase();return le.includes(e)?e:null}P();import he from"better-sqlite3";import{existsSync as Ue,mkdirSync as fe}from"fs";import{dirname as pe,resolve as Ee}from"path";var T=class{db;path;constructor(e={}){this.path=Ee(process.cwd(),e.path??".agentx/intent/ledger.sqlite"),fe(pe(this.path),{recursive:!0}),this.db=new he(this.path),this.db.pragma("journal_mode = WAL"),this.db.pragma("synchronous = NORMAL"),this.db.pragma("foreign_keys = ON"),ye(this.db)}close(){this.db.close()}schemaVersion(){return this.db.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0}recordEvent(e){if(e.sourceEventId!==null){let n=this.findEventBySourceId(e.source,e.sourceEventId);if(n)return n}let t={id:e.id??I(e.ts),ts:e.ts,source:e.source,sourceEventId:e.sourceEventId,project:e.project,subject:e.subject,intent:e.intent,rawJson:e.rawJson};return this.db.prepare(`INSERT INTO intent_events (id, ts, source, source_event_id, project, subject, intent, raw_json)
2
2
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.ts,t.source,t.sourceEventId,t.project,t.subject,t.intent,t.rawJson),t}findEventBySourceId(e,t){let n=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
3
3
  FROM intent_events WHERE source = ? AND source_event_id = ?`).get(e,t);return n?Y(n):null}getEventById(e){let t=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
4
4
  FROM intent_events WHERE id = ?`).get(e);return t?Y(t):null}recordDecision(e){this.db.prepare(`INSERT INTO intent_decisions (event_id, decided_at, decided_by, agent_id, outcome, reason)
@@ -125,4 +125,4 @@ ${se(o.block,r.prompt)}`,r.maxOutputTokens),agentId:r.agent,autonomy:r.autonomy,
125
125
  `);return t.length<=e?t.join(`
126
126
  `):t.slice(-e).join(`
127
127
  `)}function Xe(i,e,t){return new Promise((n,r)=>{Ae("/bin/sh",["-c",i],{timeout:e,maxBuffer:8*1024*1024,...t?{env:t}:{}},(s,a,o)=>{if(s&&s.killed){r(new Error(`command timed out after ${Math.round(e/1e3)}s`));return}n({stdout:String(a??""),stderr:String(o??""),code:s?typeof s.code=="number"?s.code:1:0})})})}export{T as a,V as b,ot as c,we as d,at as e,ct as f,$ as g,ee as h,G as i,We as j,z as k,Q as l,lt as m,Ce as n,oe as o,ae as p,ce as q,C as r,M as s};
128
- //# sourceMappingURL=chunk-23LWLYOK.js.map
128
+ //# sourceMappingURL=chunk-DBJUGKX2.js.map
@@ -1,4 +1,4 @@
1
- import{c as w}from"./chunk-XZIKAHFU.js";function T(t){let r=1779033703^t.length;for(let s=0;s<t.length;s++)r=Math.imul(r^t.charCodeAt(s),3432918353),r=r<<13|r>>>19;let o=r>>>0;return()=>{o=o+1831565813>>>0;let s=o;return s=Math.imul(s^s>>>15,s|1),s^=s+Math.imul(s^s>>>7,s|61),((s^s>>>14)>>>0)/4294967296}}function _(t,r,o){let s=T(o),i=[...t].sort((e,u)=>e.path.localeCompare(u.path));for(let e=i.length-1;e>0;e--){let u=Math.floor(s()*(e+1));[i[e],i[u]]=[i[u],i[e]]}return i.slice(0,Math.max(0,r)).sort((e,u)=>e.path.localeCompare(u.path))}var R=new Set("about after again also because been before being between could does doing during each from have having here into just more most only other over same should some such than that their them then there these they this those through under until very were what when where which while will with would your yours user assistant agent message entry please thanks".split(" "));function k(t){let r=new Set;for(let o of t.toLowerCase().matchAll(/[\p{L}\p{N}][\p{L}\p{N}_-]{3,}/gu))R.has(o[0])||r.add(o[0]);return r}function E(t,r){let o=k(t);if(o.size===0)return 1;let s=k(r),i=0;for(let e of o)s.has(e)&&i++;return i/o.size}var W=.15;function $(t){let r=w(t);return{commits:r.commits,urls:r.urls,numbers:r.numbers}}function j(t,r,o){return t.includes(r)||o.some(s=>s.startsWith(r)||r.startsWith(s))}var y=t=>t.toLowerCase().replace(/\/+$/,"");function N(t,r,o){let s=t.sources.map(a=>r.get(a)).filter(a=>!!a),i=t.sources.filter(a=>!r.has(a)),e=s.filter(a=>k(a.content).size>=5&&E(a.content,t.content)<W).map(a=>a.id),u=[...s.map(a=>`${a.date??""}
1
+ import{c as w}from"./chunk-375MXG3H.js";function T(t){let r=1779033703^t.length;for(let s=0;s<t.length;s++)r=Math.imul(r^t.charCodeAt(s),3432918353),r=r<<13|r>>>19;let o=r>>>0;return()=>{o=o+1831565813>>>0;let s=o;return s=Math.imul(s^s>>>15,s|1),s^=s+Math.imul(s^s>>>7,s|61),((s^s>>>14)>>>0)/4294967296}}function _(t,r,o){let s=T(o),i=[...t].sort((e,u)=>e.path.localeCompare(u.path));for(let e=i.length-1;e>0;e--){let u=Math.floor(s()*(e+1));[i[e],i[u]]=[i[u],i[e]]}return i.slice(0,Math.max(0,r)).sort((e,u)=>e.path.localeCompare(u.path))}var R=new Set("about after again also because been before being between could does doing during each from have having here into just more most only other over same should some such than that their them then there these they this those through under until very were what when where which while will with would your yours user assistant agent message entry please thanks".split(" "));function k(t){let r=new Set;for(let o of t.toLowerCase().matchAll(/[\p{L}\p{N}][\p{L}\p{N}_-]{3,}/gu))R.has(o[0])||r.add(o[0]);return r}function E(t,r){let o=k(t);if(o.size===0)return 1;let s=k(r),i=0;for(let e of o)s.has(e)&&i++;return i/o.size}var W=.15;function $(t){let r=w(t);return{commits:r.commits,urls:r.urls,numbers:r.numbers}}function j(t,r,o){return t.includes(r)||o.some(s=>s.startsWith(r)||r.startsWith(s))}var y=t=>t.toLowerCase().replace(/\/+$/,"");function N(t,r,o){let s=t.sources.map(a=>r.get(a)).filter(a=>!!a),i=t.sources.filter(a=>!r.has(a)),e=s.filter(a=>k(a.content).size>=5&&E(a.content,t.content)<W).map(a=>a.id),u=[...s.map(a=>`${a.date??""}
2
2
  ${a.content}`),t.previous??""].join(`
3
3
  `),l=u.toLowerCase(),d=$(u),p=new Set(d.urls.map(y)),g=new Set(d.numbers),n=$(t.content),c=[];for(let a of n.commits)j(l,a,d.commits)||c.push(`commit ${a}`);for(let a of n.urls)!p.has(y(a))&&!l.includes(y(a))&&c.push(`link ${a}`);for(let a of n.numbers)/^\d{1,2}$/.test(a)||!g.has(a)&&!l.includes(a)&&c.push(`number ${a}`);let h=[];for(let a of s){let m=$(a.content);if(m.commits.length===0&&m.urls.length===0)continue;let v=o(a.id),S=(v.length>0?v:[t.content]).join(`
4
4
  `).toLowerCase(),x=$(S);for(let b of m.commits)j(S,b,x.commits)||h.push({entry:a.id,fact:`commit ${b}`});for(let b of m.urls)S.includes(y(b))||h.push({entry:a.id,fact:`link ${b}`})}return{path:t.path,title:t.title,type:t.type,sources:t.sources.length,missingSources:i,weakSources:e,ungrounded:c,lost:h}}function U(t,r){let o=r.toLowerCase(),s=w(r).commits,i=[];for(let e of t){let u=w(e.content),l=[...u.commits.filter(d=>!j(o,d,s)).map(d=>`commit ${d}`),...u.urls.filter(d=>!o.includes(y(d))).map(d=>`link ${d}`)];l.length>0&&i.push({entry:e.id,facts:l})}return i}var P=new Set("the and for with from into of on in at to by an a".split(" "));function L(t){return new Set((t||"").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(r=>(r.length>1||/\d/.test(r))&&!P.has(r)&&!R.has(r)))}function M(t,r){if(t.size===0||r.size===0)return 0;let o=0;for(let s of t)r.has(s)&&o++;return o/(t.size+r.size-o)}function D(t,r,o={}){let s=o.titleMin??.75,i=o.sourcesMin??.5,e=t.map(l=>({...l,tt:L(l.title),ss:new Set(l.sources??[])})),u=[];for(let l=0;l<e.length;l++)for(let d=l+1;d<e.length;d++){let p=e[l],g=e[d];if(r&&!r.has(p.path)&&!r.has(g.path))continue;let n=(p.type??"")===(g.type??"")?M(p.tt,g.tt):0;if(n>=s){u.push({a:p.path,b:g.path,reason:"title",score:n});continue}if(p.ss.size>=2&&g.ss.size>=2){let c=M(p.ss,g.ss);c>=i&&u.push({a:p.path,b:g.path,reason:"sources",score:c})}}return u.sort((l,d)=>d.score-l.score||l.a.localeCompare(d.a))}var A=4e3;function J(t,r){let o=r.map(i=>{let e=i.content.length>A?`${i.content.slice(0,A)}
@@ -33,4 +33,4 @@ Reply with JSON only, no fencing:
33
33
  {"claims": 0, "supported": 0, "unsupported": [], "contradicted": [], "off_subject": [], "missing": [], "verdict": "good"}`}function z(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,o=l=>Array.isArray(l)?l.map(d=>String(d)):[],s=l=>typeof l=="number"&&Number.isFinite(l)&&l>=0?Math.round(l):NaN,i=s(r.claims);if(Number.isNaN(i))return null;let e=Math.min(i,Number.isNaN(s(r.supported))?i-o(r.unsupported).length:s(r.supported)),u=r.verdict==="good"||r.verdict==="minor"||r.verdict==="major"?r.verdict:null;return u?{claims:i,supported:Math.max(0,e),unsupported:o(r.unsupported),contradicted:o(r.contradicted),offSubject:o(r.off_subject??r.offSubject),missing:o(r.missing),verdict:u}:null}function I(t,r,o,s=[],i=5,e){let u={};for(let n of t)u[n.type??"untyped"]=(u[n.type??"untyped"]??0)+1;let l=new Set,d=new Set;for(let n of t)for(let c of n.lost)l.add(c.entry),d.add(`${c.entry}|${c.fact}`);let p=new Set(r.flatMap(n=>[n.a,n.b]).filter(n=>t.some(c=>c.path===n))),g={sample:{articles:t.length,seed:o.seed,since:o.since,byType:u},citations:{withSources:t.filter(n=>n.sources>0).length,missingSources:t.reduce((n,c)=>n+c.missingSources.length,0),weakSources:t.reduce((n,c)=>n+c.weakSources.length,0),articlesWithWeak:t.filter(n=>n.weakSources.length>0).length},grounding:{articlesWithUngrounded:t.filter(n=>n.ungrounded.length>0).length,ungroundedFacts:t.reduce((n,c)=>n+c.ungrounded.length,0)},lost:{entriesWithLostFacts:l.size,lostFacts:d.size},duplicates:{pairs:r.length,articlesInPair:p.size},...e?{uncited:{entries:e.entries,withLostFacts:e.lost.length}}:{},examples:{ungrounded:t.filter(n=>n.ungrounded.length>0).slice(0,i).map(n=>({path:n.path,facts:n.ungrounded.slice(0,6)})),lost:t.flatMap(n=>n.lost.map(c=>({path:n.path,...c}))).slice(0,i),weak:t.filter(n=>n.weakSources.length>0).slice(0,i).map(n=>({path:n.path,entries:n.weakSources})),duplicates:r.slice(0,i),uncited:(e?.lost??[]).slice(0,i).map(n=>({entry:n.entry,facts:n.facts.slice(0,4)})),judged:s.filter(n=>n.verdict.verdict!=="good").slice(0,i).map(n=>({path:n.path,verdict:n.verdict.verdict,unsupported:n.verdict.unsupported.slice(0,4),contradicted:n.verdict.contradicted.slice(0,4),offSubject:n.verdict.offSubject,missing:n.verdict.missing.slice(0,4)}))}};if(s.length>0){let n=s.map(a=>a.verdict),c=n.reduce((a,m)=>a+m.claims,0),h=n.reduce((a,m)=>a+m.supported,0);g.judge={judged:n.length,claims:c,supported:h,supportRate:c>0?h/c:1,unsupported:n.reduce((a,m)=>a+m.unsupported.length,0),contradicted:n.reduce((a,m)=>a+m.contradicted.length,0),articlesWithWrongMerge:n.filter(a=>a.offSubject.length>0).length,missingFacts:n.reduce((a,m)=>a+m.missing.length,0),verdicts:{good:n.filter(a=>a.verdict==="good").length,minor:n.filter(a=>a.verdict==="minor").length,major:n.filter(a=>a.verdict==="major").length}}}return g}var f=(t,r)=>r>0?`${Math.round(t/r*100)}%`:"\u2013";function O(t){let r=t.sample.articles,o=["# Wiki absorb scorecard","",`Sample: ${r} articles (seed \`${t.sample.seed}\`${t.sample.since?`, changed since ${t.sample.since}`:""}). Types: ${Object.entries(t.sample.byType).map(([e,u])=>`${e} ${u}`).join(", ")||"\u2013"}.`,"","| Check | Result | Lower is better? |","|---|---|---|",`| Articles citing at least one entry | ${t.citations.withSources}/${r} (${f(t.citations.withSources,r)}) | no |`,`| Cited ids with no entry | ${t.citations.missingSources} | yes |`,`| Articles with a weak citation (entry shares <${Math.round(W*100)}% of its words) | ${t.citations.articlesWithWeak}/${r} (${f(t.citations.articlesWithWeak,r)}) | yes |`,`| Articles with an ungrounded commit, link or number | ${t.grounding.articlesWithUngrounded}/${r} (${f(t.grounding.articlesWithUngrounded,r)}) | yes |`,`| Ungrounded facts | ${t.grounding.ungroundedFacts} | yes |`,`| Commits or links lost from cited entries | ${t.lost.lostFacts} across ${t.lost.entriesWithLostFacts} entries | yes |`,`| Sampled articles in a likely duplicate pair | ${t.duplicates.articlesInPair}/${r} (${f(t.duplicates.articlesInPair,r)}) | yes |`];if(t.uncited&&o.push(`| Entries read in the window but cited by no article | ${t.uncited.entries} | \u2013 |`,`| \u2026of which carry a commit or link no article has | ${t.uncited.withLostFacts} | yes |`),t.judge){let e=t.judge;o.push(`| Judge: claims supported by the cited entries | ${e.supported}/${e.claims} (${f(e.supported,e.claims)}) | no |`,`| Judge: unsupported / contradicted claims | ${e.unsupported} / ${e.contradicted} | yes |`,`| Judge: articles with an off-subject source (wrong merge) | ${e.articlesWithWrongMerge}/${e.judged} (${f(e.articlesWithWrongMerge,e.judged)}) | yes |`,`| Judge: facts missing from the article | ${e.missingFacts} | yes |`,`| Judge verdicts good / minor / major | ${e.verdicts.good} / ${e.verdicts.minor} / ${e.verdicts.major} | \u2013 |`)}let s=t.examples,i=(e,u)=>{u.length!==0&&o.push("",`## ${e}`,"",...u)};return i("Examples: ungrounded facts",s.ungrounded.map(e=>`- \`${e.path}\`: ${e.facts.join("; ")}`)),i("Examples: lost facts",s.lost.map(e=>`- \`${e.path}\` \u2190 entry \`${e.entry}\`: ${e.fact}`)),i("Examples: weak citations",s.weak.map(e=>`- \`${e.path}\`: ${e.entries.map(u=>`\`${u}\``).join(", ")}`)),i("Examples: uncited entries with facts no article has",s.uncited.map(e=>`- \`${e.entry}\`: ${e.facts.join("; ")}`)),i("Examples: likely duplicates",s.duplicates.map(e=>`- \`${e.a}\` \u2194 \`${e.b}\` (${e.reason}, ${e.score.toFixed(2)})`)),i("Examples: judge findings",s.judged.map(e=>{let u=[e.unsupported.length?`unsupported: ${e.unsupported.join(" | ")}`:"",e.contradicted.length?`contradicted: ${e.contradicted.join(" | ")}`:"",e.offSubject.length?`off-subject: ${e.offSubject.join(", ")}`:"",e.missing.length?`missing: ${e.missing.join(" | ")}`:""].filter(Boolean);return`- \`${e.path}\` (${e.verdict}): ${u.join("; ")}`})),o.push("","## Method","","- The sample is drawn with a seeded shuffle from the articles changed in the window, so the same seed and window give the same articles.","- Ungrounded: a commit hash, link or number (three digits or more, or a date) in the article that no cited entry and no earlier version of the article contains.","- Lost: a commit hash or link in a cited entry that no article citing that entry contains.","- Uncited: entries the absorb ledger marks as read in the window that no article cites; those carrying a commit or link that no article on the node has are counted as lost, since absorb will not offer them again.","- Weak citation: a cited entry sharing fewer than 15% of its distinctive words with the article.","- Duplicate: two articles of the same type whose titles share at least 75% of their words, or which share at least half their sources.","- Judge (optional): one model call per article reads the article and its cited entries and lists unsupported, contradicted, off-subject and missing items."),o.join(`
34
34
  `)+`
35
35
  `}function V(t){if(!t||typeof t!="object")return{};let r=t,o=r.usage??{},s=i=>typeof i=="number"&&Number.isFinite(i)?i:void 0;return{costUsd:s(r.total_cost_usd)??s(r.cost_usd),apiMs:s(r.duration_api_ms),inputTokens:s(o.input_tokens),outputTokens:s(o.output_tokens),cacheReadTokens:s(o.cache_read_input_tokens),cacheWriteTokens:s(o.cache_creation_input_tokens)}}function C(t,r){return t.length===0?0:t[Math.min(t.length-1,Math.floor(r*t.length))]}function Y(t){let r=new Map,o=i=>{let e=i||"(none)",u=r.get(e);return u||r.set(e,u={calls:[],runs:[]}),u};for(let i of t)i.kind==="call"?o(i.label).calls.push(i):i.kind==="run"&&o(i.label).runs.push(i);let s=[];for(let[i,{calls:e,runs:u}]of r){if(e.length===0)continue;let l=e.map(n=>n.wallMs).sort((n,c)=>n-c),d;if(u.length>0)d=u.reduce((n,c)=>n+(Date.parse(c.endedAt)-Date.parse(c.startedAt)),0);else{let n=e.map(h=>Date.parse(h.at)-h.wallMs),c=e.map(h=>Date.parse(h.at));d=Math.max(...c)-Math.min(...n)}let p=e.reduce((n,c)=>n+c.entries,0),g=e.reduce((n,c)=>n+(c.costUsd??0),0);s.push({label:i,calls:e.length,failed:e.filter(n=>n.failed).length,entries:p,articles:e.reduce((n,c)=>n+c.articles,0),refused:e.reduce((n,c)=>n+c.refused,0),heldCited:e.reduce((n,c)=>n+(c.heldCited??0),0),wallMs:d,callMsP50:C(l,.5),callMsP95:C(l,.95),prepMs:e.reduce((n,c)=>n+(c.prepMs??0),0),costUsd:g,costPerEntry:p>0?g/p:0,entriesPerMinute:d>0?p/d*6e4:0,promptChars:e.reduce((n,c)=>n+c.promptChars,0)})}return s.sort((i,e)=>i.label.localeCompare(e.label))}export{T as a,_ as b,k as c,E as d,W as e,N as f,U as g,D as h,A as i,J as j,z as k,I as l,O as m,V as n,Y as o};
36
- //# sourceMappingURL=chunk-B6PMIUVV.js.map
36
+ //# sourceMappingURL=chunk-EGPCEQJN.js.map
@@ -48,7 +48,7 @@ The "modified" field is optional and can contain updated values to pass forward.
48
48
  ... (output truncated)`:i;return s.exitCode!==0?{tool_use_id:e.id,content:`Command exited with code ${s.exitCode}:
49
49
  ${c}`,is_error:!0}:{tool_use_id:e.id,content:c||"(no output)"}}async editFile(e){let t=String(e.input.path||""),o=e.input.edits,n=ge.resolve(this.cwd,t);if(!o||o.length===0)return{tool_use_id:e.id,content:"No edits provided.",is_error:!0};let s=await W.checkFileWrite(t);if(s==="deny")return{tool_use_id:e.id,content:`File write blocked by permissions: ${t}`,is_error:!0};if(s==="skip")return{tool_use_id:e.id,content:`File write skipped (plan mode): ${t}`};if(f.has("pre:file-write")){let a=await f.execute("pre:file-write",{event:"pre:file-write",file:n,cwd:this.cwd});if(a.blocked)return{tool_use_id:e.id,content:a.message||`File edit blocked by pre:file-write hook: ${t}`,is_error:!0}}let i=await re.readFile(n,"utf8"),c=[];for(let a of o)i.includes(a.old_text)?(i=i.replace(a.old_text,a.new_text),c.push(`Replaced: "${a.old_text.slice(0,40)}..."`)):c.push(`Not found: "${a.old_text.slice(0,40)}..."`);return this.options.dryRun||await re.writeFile(n,i,"utf8"),f.has("post:file-write")&&await f.execute("post:file-write",{event:"post:file-write",file:n,fileContent:i,cwd:this.cwd}),{tool_use_id:e.id,content:`Edited ${t}:
50
50
  ${c.join(`
51
- `)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-XY5N7TUU.js"),{getGlobalRegistry:i}=await import("./registry-GYKSYSDD.js"),c=i();if(!c)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(c).spawn({targetAgentId:t,prompt:o,parentAgentId:"orchestrator",timeout:n*1e3});return p.success?{tool_use_id:e.id,content:`Sub-agent "${t}" completed (${Math.round(p.duration/1e3)}s):
51
+ `)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-XY5N7TUU.js"),{getGlobalRegistry:i}=await import("./registry-IUNSHCOL.js"),c=i();if(!c)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(c).spawn({targetAgentId:t,prompt:o,parentAgentId:"orchestrator",timeout:n*1e3});return p.success?{tool_use_id:e.id,content:`Sub-agent "${t}" completed (${Math.round(p.duration/1e3)}s):
52
52
 
53
53
  ${p.content}`}:{tool_use_id:e.id,content:`Sub-agent "${t}" failed: ${p.error}`,is_error:!0}}catch(s){return{tool_use_id:e.id,content:`Failed to spawn sub-agent: ${s.message}`,is_error:!0}}}async askUser(e){let t=String(e.input.question||""),o=e.input.options,n=t;return o?.length&&(n+=`
54
54
  Options: ${o.join(", ")}`),{tool_use_id:e.id,content:"Question sent to user.",followUp:n}}};async function Ae(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,cwd:s,maxIterations:i=20,enabledTools:c,interactive:a=!0,overwrite:p=!1,dryRun:l=!1,onProgress:d,abortSignal:u}=r,m=u?{...n,abortSignal:u}:n;if(!e.generateRaw)return dt(r);let I=new se(s,{interactive:a,overwrite:p,dryRun:l,acmeContext:r.acmeContext,abortSignal:u}),D=be(c);if(r.acmeContext)for(let g of at)D.push({name:g.name,description:g.description,input_schema:g.input_schema});let E=new Set;if(r.mcpTools?.length)for(let g of r.mcpTools)D.push({name:g.name,description:g.description,input_schema:g.input_schema}),E.add(g.name);let C=o.filter(g=>g.role!=="system").map(g=>({role:g.role,content:g.content})),B=[],G=0,F=0,A=0,O="",j,_=0;for(;_<i;){if(_++,u?.aborted)throw new Error("cancelled");d?.({type:"iteration_start",iteration:_}),b.step(_,`Agentic loop iteration (${D.length} tools available)`);let g,M=!!e.generateRawStream&&!!d;try{if(M){let T=null,U=null,v="";for await(let x of e.generateRawStream(C,t,D,m))x.type==="text_delta"?(v+=x.text,d?.({type:"text_delta",text:x.text})):x.type==="thinking_delta"?d?.({type:"thinking_delta",text:x.text}):x.type==="raw_result"?T=x.result:x.type==="error"&&(U=x.error);if(U&&!T)throw new Error(U);if(!T)throw new Error("generateRawStream returned no raw_result event");g=T,g._streamedText=v}else g=await e.generateRaw(C,t,D,m)}catch(T){if(T.message?.includes("not available"))return dt(r);throw T}G+=g.usage.input_tokens+g.usage.output_tokens,F+=g.usage.input_tokens,A+=g.usage.output_tokens;let P=g._streamedText;for(let T of g.content)T.type==="text"&&(O+=T.text,P===void 0&&d?.({type:"text_delta",text:T.text}));if(P!==void 0&&delete g._streamedText,g.stop_reason==="end_turn"||g.stop_reason==="max_tokens")break;if(g.stop_reason==="tool_use"){let T=g.content.filter(v=>v.type==="tool_use");if(T.length===0)break;C.push({role:"assistant",content:g.content});let U=[];for(let v of T){d?.({type:"tool_call",name:v.name,id:v.id,input:v.input}),b.step(_,`Tool call: ${v.name}`);let x;if(E.has(v.name)&&r.mcpDispatch){let h=await r.mcpDispatch(v.name,v.input);x={tool_use_id:v.id,content:h.content,is_error:h.isError}}else x=await I.execute({name:v.name,id:v.id,input:v.input});d?.({type:"tool_result",name:v.name,id:v.id,content:x.content.slice(0,200),is_error:x.is_error}),x.files?.length&&(B.push(...x.files),d?.({type:"files_created",files:x.files})),x.followUp&&(j=x.followUp),U.push({type:"tool_result",tool_use_id:x.tool_use_id,content:x.content,is_error:x.is_error})}if(C.push({role:"user",content:U}),j)break;continue}break}return d?.({type:"complete",iterations:_,totalTokens:G}),{files:B,content:O,followUp:j,tokensUsed:G,inputTokens:F||void 0,outputTokens:A||void 0,iterations:_}}async function dt(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,maxIterations:s=5}=r,c=[{role:"system",content:t+`
@@ -123,4 +123,4 @@ ${r.projectInstructions}`),r.memoryContext&&o.push(r.memoryContext),o.push(`# Ou
123
123
  Generate output appropriate for: ${e}. Use the \`create_files\` tool to output all files.`),o.join(`
124
124
 
125
125
  `)}export{qe as a,Vt as b,Yt as c,We as d,ze as e,Ve as f,Ye as g,Pe as h,ee as i,Re as j,le as k,te as l,Tt as m,oe as n,Mt as o,f as p,et as q,tt as r,Me as s,de as t,W as u,ne as v,it as w,Ee as x,$e as y,se as z,mt as A,Zn as B,er as C};
126
- //# sourceMappingURL=chunk-ZYUVKFX2.js.map
126
+ //# sourceMappingURL=chunk-GAIXI26T.js.map
@@ -1,4 +1,4 @@
1
- import{b as z,d as H,h as lt}from"./chunk-BRK6M6LA.js";import{l as W,m as K,n as dt}from"./chunk-UIBUZ2N3.js";import{a as U,e as st}from"./chunk-2QNT5JDS.js";import{a as f,b as it}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var ut,ct,mt,ft,gt,pt,bt,ht,xt,X,Z=f(()=>{"use strict";ut=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),ct=l.object({days:l.array(ut).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()}),mt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),ft=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:ct,utilizationTarget:l.number().min(0).max(1).default(.8)}),gt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),pt=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")})]),bt=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),ht=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()}),xt=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),X=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:gt,workSource:pt,roles:l.record(l.string(),mt).default({}),orgChart:l.record(l.string(),ft).default({}),projects:l.array(bt).default([]),contactMap:l.array(ht).default([]),clients:l.record(l.string(),xt).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as d}from"zod";function Gn(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 Yn(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 yt,wt,St,kt,_t,Et,V,vt,G,Y=f(()=>{"use strict";yt=d.object({name:d.string(),color:d.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:d.string().optional()}),wt=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:d.string(),kind:d.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:d.string().optional(),scopedLabel:d.string().optional(),scopedPrefix:d.string().default("Status"),accent:d.string().optional()}),St=d.object({enabled:d.boolean().default(!0),staleDoingMinutes:d.number().int().min(1).default(45),respectLunchBreak:d.boolean().default(!0),respectSchedule:d.boolean().default(!0),action:d.enum(["badge","notify"]).default("badge")}),kt=d.discriminatedUnion("type",[d.object({type:d.literal("gitlab"),projects:d.array(d.string()).min(1)})]),_t=[{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"}],Et=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:d.string(),source:kt,primaryToolLabel:d.string().optional(),labels:d.array(yt).default([]),columns:d.array(wt).min(1).default(_t),timeRangeDays:d.number().int().min(1).max(365).default(30),closedWindowDays:d.number().int().min(1).max(365).default(30),reconciliation:St.default({})}),V=d.array(Et).default([]),vt=d.object({name:d.string(),url:d.string(),dashboardUrl:d.string().optional(),token:d.string().optional(),dashboardToken:d.string().optional()}),G=d.object({enabled:d.boolean().default(!1),port:d.number().int().default(4202),bind:d.string().default("127.0.0.1"),token:d.string().optional(),daemonUrl:d.string().default("http://localhost:18800"),daemons:d.array(vt).default([]),draftAgent:d.string().optional()}).default({})});function jt(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=It[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=Tt[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 Ct(a)?!J(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...At.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function Q(r){let t=jt(r);return t.ok?void 0:t.error}function Qn(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 Tt,At,Rt,It,J,Ct,E,ee=f(()=>{"use strict";Tt={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},At=["ctrl","opt","shift","cmd"],Rt=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],It={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},J=r=>/^f([1-9]|1[0-9]|20)$/.test(r),Ct=r=>/^[a-z0-9]$/.test(r)||Rt.includes(r)||J(r);E={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function re(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(g=>parseInt(g,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),u=i-s;return u<.04?null:((i===n?(a-o)/u%6:i===a?(o-n)/u+2:(n-a)/u+4)*60+360)%360}function Ot(r){let t=re(r);if(t===null)return S.find(o=>o.id==="lagoon");let n=S[0],a=360;for(let o of S){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function tr(r,t=v){let n=s=>S.find(u=>u.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&re(o)!==null?Ot(o):n(t)??n(v),set:!1}}var S,te,ne,N,v,ae=f(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],te=["orb","character"],ne=["off","rarely","sometimes","often"],N=S.map(r=>r.id);v="lagoon"});function oe(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])Lt.has(i)&&a++,Nt.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:$t.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var Lt,Nt,$t,ie=f(()=>{"use strict";Lt=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(" ")),Nt=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(" ")),$t=/[éèêëàâçùûîïôœ]/});function or(r,t=$){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+Dt[oe(a)??"en"]}return n}var $,Dt,se=f(()=>{"use strict";ie();$=500,Dt={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 lr(r,t=D){let n=new Set(t.map(le)),a=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,s)=>n.has(le(i??s))?"":o);return!/[\p{L}\p{N}]/u.test(a)}var D,sr,le,de=f(()=>{"use strict";D=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],sr="I didn't catch that.",le=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Pt}from"crypto";function Ut(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function cr(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var T,qt,Mt,Ft,Bt,ue,ce=f(()=>{"use strict";T={enabled:!0,defaultSeconds:120,maxSeconds:1800},qt=80,Mt=/^[a-f0-9]{24}$/,Ft=25e3,Bt=2e3;ue=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??Ut}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...T,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(at,ot)=>({ok:!1,reason:at,error:ot,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,qt),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,u=t.id??Pt(12).toString("hex");if(!Mt.test(u))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let m=this.current;if(m)return a("held",`The floor is held by ${m.holder}`);let g=this.deps.busy?.();if(g)return a("busy",`The floor is taken by ${g}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let b=this.now(),_={id:u,holder:o,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:b,expiresAt:b+i*1e3};return this.hold=_,this.ended=null,this.arm(),this.changed(),{ok:!0,id:_.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let a=this.settings,o=n??Math.min(a.defaultSeconds,a.maxSeconds);return!Number.isFinite(o)||o<=0||o>a.maxSeconds?null:(this.hold.expiresAt=this.now()+o*1e3,this.arm(),this.changed(),this.view())}release(t){return this.holds(t)?(this.end("released"),!0):!1}revoke(){return this.current?(this.end("owner"),!0):!1}next(t,n=Ft,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")},Bt),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as c}from"zod";var me,zt,fe,ge=f(()=>{"use strict";me=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),zt=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:me,end:me}).optional(),autoAck:c.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),fe=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(zt).default([])}).default({})});function Ht(r){r.exec(`
1
+ import{b as z,d as H,h as lt}from"./chunk-BRK6M6LA.js";import{l as W,m as K,n as dt}from"./chunk-UIBUZ2N3.js";import{a as U,e as st}from"./chunk-2QNT5JDS.js";import{a as f,b as it}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var ut,ct,mt,ft,gt,pt,bt,ht,xt,X,Z=f(()=>{"use strict";ut=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),ct=l.object({days:l.array(ut).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()}),mt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),ft=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:ct,utilizationTarget:l.number().min(0).max(1).default(.8)}),gt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),pt=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")})]),bt=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),ht=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()}),xt=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),X=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:gt,workSource:pt,roles:l.record(l.string(),mt).default({}),orgChart:l.record(l.string(),ft).default({}),projects:l.array(bt).default([]),contactMap:l.array(ht).default([]),clients:l.record(l.string(),xt).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as d}from"zod";function Gn(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 Yn(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 yt,wt,St,kt,_t,Et,V,vt,G,Y=f(()=>{"use strict";yt=d.object({name:d.string(),color:d.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:d.string().optional()}),wt=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:d.string(),kind:d.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:d.string().optional(),scopedLabel:d.string().optional(),scopedPrefix:d.string().default("Status"),accent:d.string().optional()}),St=d.object({enabled:d.boolean().default(!0),staleDoingMinutes:d.number().int().min(1).default(45),respectLunchBreak:d.boolean().default(!0),respectSchedule:d.boolean().default(!0),action:d.enum(["badge","notify"]).default("badge")}),kt=d.discriminatedUnion("type",[d.object({type:d.literal("gitlab"),projects:d.array(d.string()).min(1)})]),_t=[{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"}],Et=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:d.string(),source:kt,primaryToolLabel:d.string().optional(),labels:d.array(yt).default([]),columns:d.array(wt).min(1).default(_t),timeRangeDays:d.number().int().min(1).max(365).default(30),closedWindowDays:d.number().int().min(1).max(365).default(30),reconciliation:St.default({})}),V=d.array(Et).default([]),vt=d.object({name:d.string(),url:d.string(),dashboardUrl:d.string().optional(),token:d.string().optional(),dashboardToken:d.string().optional()}),G=d.object({enabled:d.boolean().default(!1),port:d.number().int().default(4202),bind:d.string().default("127.0.0.1"),token:d.string().optional(),daemonUrl:d.string().default("http://localhost:18800"),daemons:d.array(vt).default([]),draftAgent:d.string().optional()}).default({})});function Ot(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=It[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=Tt[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 Ct(a)?!J(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...At.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function Q(r){let t=Ot(r);return t.ok?void 0:t.error}function Qn(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 Tt,At,Rt,It,J,Ct,E,ee=f(()=>{"use strict";Tt={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},At=["ctrl","opt","shift","cmd"],Rt=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],It={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},J=r=>/^f([1-9]|1[0-9]|20)$/.test(r),Ct=r=>/^[a-z0-9]$/.test(r)||Rt.includes(r)||J(r);E={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function re(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(g=>parseInt(g,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),u=i-s;return u<.04?null:((i===n?(a-o)/u%6:i===a?(o-n)/u+2:(n-a)/u+4)*60+360)%360}function jt(r){let t=re(r);if(t===null)return S.find(o=>o.id==="lagoon");let n=S[0],a=360;for(let o of S){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function tr(r,t=v){let n=s=>S.find(u=>u.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&re(o)!==null?jt(o):n(t)??n(v),set:!1}}var S,te,ne,N,v,ae=f(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],te=["orb","character"],ne=["off","rarely","sometimes","often"],N=S.map(r=>r.id);v="lagoon"});function oe(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])Lt.has(i)&&a++,Nt.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:$t.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var Lt,Nt,$t,ie=f(()=>{"use strict";Lt=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(" ")),Nt=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(" ")),$t=/[éèêëàâçùûîïôœ]/});function or(r,t=$){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+Dt[oe(a)??"en"]}return n}var $,Dt,se=f(()=>{"use strict";ie();$=500,Dt={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 lr(r,t=D){let n=new Set(t.map(le)),a=r.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,s)=>n.has(le(i??s))?"":o);return!/[\p{L}\p{N}]/u.test(a)}var D,sr,le,de=f(()=>{"use strict";D=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],sr="I didn't catch that.",le=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Pt}from"crypto";function Ut(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function cr(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var T,qt,Mt,Ft,Bt,ue,ce=f(()=>{"use strict";T={enabled:!0,defaultSeconds:120,maxSeconds:1800},qt=80,Mt=/^[a-f0-9]{24}$/,Ft=25e3,Bt=2e3;ue=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??Ut}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...T,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(at,ot)=>({ok:!1,reason:at,error:ot,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,qt),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,u=t.id??Pt(12).toString("hex");if(!Mt.test(u))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let m=this.current;if(m)return a("held",`The floor is held by ${m.holder}`);let g=this.deps.busy?.();if(g)return a("busy",`The floor is taken by ${g}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let h=this.now(),_={id:u,holder:o,agentId:t.agentId||null,sound:t.sound===!0,hide:t.hide===!0,pid:s,since:h,expiresAt:h+i*1e3};return this.hold=_,this.ended=null,this.arm(),this.changed(),{ok:!0,id:_.id,view:this.view()}}renew(t,n){if(!this.holds(t))return null;let a=this.settings,o=n??Math.min(a.defaultSeconds,a.maxSeconds);return!Number.isFinite(o)||o<=0||o>a.maxSeconds?null:(this.hold.expiresAt=this.now()+o*1e3,this.arm(),this.changed(),this.view())}release(t){return this.holds(t)?(this.end("released"),!0):!1}revoke(){return this.current?(this.end("owner"),!0):!1}next(t,n=Ft,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")},Bt),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as c}from"zod";var me,zt,fe,ge=f(()=>{"use strict";me=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),zt=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:me,end:me}).optional(),autoAck:c.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),fe=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(zt).default([])}).default({})});function Ht(r){r.exec(`
2
2
  CREATE TABLE IF NOT EXISTS requests (
3
3
  id TEXT PRIMARY KEY,
4
4
  state TEXT NOT NULL,
@@ -27,28 +27,28 @@ import{b as z,d as H,h as lt}from"./chunk-BRK6M6LA.js";import{l as W,m as K,n as
27
27
  FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
28
28
  );
29
29
  CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
30
- `),K(r,"requests",W);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"]])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 br(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function x(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null,ownerNote:r.owner_note??null,noteSaid:!!r.note_said,askedAgent:r.asked_agent??null}}var y,p,P,q,h,pe,be=f(()=>{"use strict";dt();y=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],P=4e3,q=500;h=r=>Array(r).fill("?").join(","),pe=class{constructor(t){this.db=t;Ht(t),t.pragma("foreign_keys = ON")}addCandidate(t){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
30
+ `),K(r,"requests",W);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"]])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 br(r){return!!r.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function x(r){return{id:r.id,state:r.state,channel:r.channel,chatId:r.chat_id,sender:r.sender??null,person:r.person??null,agentId:r.agent_id,text:r.text,createdAt:r.created_at,updatedAt:r.updated_at,attentionReason:r.attention_reason??null,notifiedAt:r.notified_at??null,question:r.question??null,closedAt:r.closed_at??null,evidence:r.evidence??null,closeReason:r.close_reason??null,ownerNote:r.owner_note??null,noteSaid:!!r.note_said,askedAgent:r.asked_agent??null}}var y,p,P,q,b,pe,be=f(()=>{"use strict";dt();y=["in_progress","waiting_owner","waiting_other","needs_attention"],p=["done","declined","dropped"],P=4e3,q=500;b=r=>Array(r).fill("?").join(","),pe=class{constructor(t){this.db=t;Ht(t),t.pragma("foreign_keys = ON")}addCandidate(t){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
31
31
  VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,P),t.now,t.now),this.link(t.id,"run",t.runId,t.now)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?x(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?x(a):null}link(t,n,a,o){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(t,n,a,o)}links(t){return this.db.prepare("SELECT kind, ref, at FROM request_links WHERE request_id = ? ORDER BY at, rowid").all(t)}lastAnswer(t){try{return this.db.prepare(`SELECT t.agent_id AS agentId, t.final_response AS text, COALESCE(t.finished_at, t.started_at) AS at
32
32
  FROM request_links l JOIN task_traces t ON t.task_id = l.ref
33
33
  WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
34
34
  ORDER BY t.started_at DESC LIMIT 1`).get(t)??null}catch{return null}}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,a="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
35
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n,t,...p)}waitOnOwner(t,n,a){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
36
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(a,n.slice(0,P),t,...p)}needsAttention(t,n,a){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
37
- WHERE id = ? AND state NOT IN ('needs_attention', ${h(p.length)})`).run(a,n.replace(/\s+/g," ").trim().slice(0,q),t,...p).changes>0}close(t,n,a,o){let i=a.trim();if(!i)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, evidence = ?, close_reason = ?
38
- WHERE id = ? AND state NOT IN (${h(p.length)})`).run(n,o,o,n==="done"?i.slice(0,q):null,n==="done"?null:i.slice(0,q),t,...p).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(y.length)}) ORDER BY created_at, rowid`).all(...y).map(x)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${h(t.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...t,n).map(x)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(x)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(x)}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
35
+ WHERE id = ? AND state NOT IN (${b(p.length)})`).run(a,n,t,...p)}waitOnOwner(t,n,a){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
36
+ WHERE id = ? AND state NOT IN (${b(p.length)})`).run(a,n.slice(0,P),t,...p)}needsAttention(t,n,a){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
37
+ WHERE id = ? AND state NOT IN ('needs_attention', ${b(p.length)})`).run(a,n.replace(/\s+/g," ").trim().slice(0,q),t,...p).changes>0}close(t,n,a,o){let i=a.trim();if(!i)throw new Error(n==="done"?"a finished request needs a link to the evidence":`a ${n} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, evidence = ?, close_reason = ?
38
+ WHERE id = ? AND state NOT IN (${b(p.length)})`).run(n,o,o,n==="done"?i.slice(0,q):null,n==="done"?null:i.slice(0,q),t,...p).changes>0}discardCandidate(t){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(t).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${b(y.length)}) ORDER BY created_at, rowid`).all(...y).map(x)}quietSince(t,n){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${b(t.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...t,n).map(x)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(x)}markNotified(t,n){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(n,t)}listByState(t){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(t).map(x)}listClosedSince(t,n=50){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${b(p.length)}) AND closed_at >= ? ORDER BY closed_at DESC, rowid DESC LIMIT ?`).all(...p,t,n).map(x)}requestPickup(t,n){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
39
39
  WHERE id = ? AND state = 'needs_attention'`).run(n,n,t).changes>0}handOff(t,n,a,o){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
40
40
  question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
41
- WHERE id = ? AND state IN (${h(y.length)})`).run(n,o,o,a.trim().slice(0,P)||null,t,...y).changes>0}setNoteSaid(t,n,a){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${a?" AND pickup_at IS NULL":""}`).run(a?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(x).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${h(p.length)}) AND closed_at < ?`).run(...p,t).changes}}});function yr(r){return Object.assign({channel:ye,chatId:r,sender:"operator"},{[we]:!0})}function wr(r){return!!r&&r[we]===!0}function Xt(r,t,n,a=!1){let o=A(t);if(r.channels.length&&!r.channels.map(A).includes(o))return!1;if(R.has(o))return a&&!Wt.has((n?.name??"").toLowerCase());let i=Kt.has(o)?n?.username:n?.id,s=i?he(o,i):"";return s?r.from.some(u=>{let m=u.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&he(o,m.slice(g+1))===s}):!1}function Sr(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 Zt(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var ye,we,R,Wt,A,Kt,he,w,k,xe,Se=f(()=>{"use strict";be();ye="requests",we=Symbol("requests.pickup");R=new Set(["voice","app","dashboard","webrtc"]),Wt=new Set(["camera"]),A=r=>r.toLowerCase().split("@")[0],Kt=new Set(["github","gitlab"]),he=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");w=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},k=(r,t,n)=>`${r}\0${t}\0${n}`,xe=class{constructor(t,n,a,o=Date.now){this.store=t;this.settings=n;this.log=a;this.now=o}live=new Map;guard(t,n){try{n()}catch(a){this.log(`[requests] ${t} failed: ${a?.message??a}`)}}isListedOwner(t){let n=A(t.channel),a=this.settings().channels;return a.length&&!a.map(A).includes(n)?!1:t.person?.role==="owner"&&!R.has(n)}liveRequestId(t,n,a){return this.live.get(k(t,n,a))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),a=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,o=k(t.agentId,t.channel,t.chatId);if(a){this.store.link(a.id,"run",t.taskId,n),a.state==="candidate"?this.store.touch(a.id,n):this.store.progress(a.id,n),this.live.set(o,{requestId:a.id,runId:t.taskId});return}let i=t.pickup&&t.channel===ye?this.store.get(t.chatId):null;if(i&&i.agentId===t.agentId){this.store.link(i.id,"run",t.taskId,n),this.store.touch(i.id,n),this.live.set(o,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Xt(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(o,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=k(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let a=this.store.byLink("run",t.taskId);if(!a)return;let o=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Zt(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${w(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(k(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}let u={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} ${u}: ${w(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${w(a)}). It said: ${w(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(k(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${w(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!y.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${w(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Vt,timingSafeEqual as _e}from"crypto";import{chmodSync as Gt,existsSync as Yt,mkdirSync as Jt,readFileSync as Qt,writeFileSync as en}from"fs";import{networkInterfaces as tn}from"os";import{dirname as nn,resolve as rn}from"path";function Ar(r){return Object.assign(r,{[Ee]:!0})}function ve(r){return!!r&&r[Ee]===!0}function on(r=process.cwd()){return rn(r,".agentx","operator.key")}function Rr(r=process.cwd(),t={}){let n=on(r);try{if(Yt(n)){let o=Qt(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=Vt(32).toString("hex");return Jt(nn(n),{recursive:!0}),en(n,a+`
42
- `,{mode:384}),Gt(n,384),a}catch{return null}}function sn(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let a=Buffer.from(r),o=Buffer.from(n.trim());return a.length===o.length&&_e(a,o)}function dn(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?sn(n,t[an]):!1}function un(r,t){let n=r[ln];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 u of t){if(!u)continue;let m=Buffer.from(u);if(m.length===s.length&&_e(m,s))return!0}return!1}function cn(r,t=mn()){let n=ke(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let a of t)if(ke(a)===n)return!0;return!1}function mn(){return Object.values(tn()).flatMap(r=>(r??[]).map(t=>t.address))}function Ir(r,t,n){if(dn(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)||cn(t.remoteAddress,n.ownAddresses)?!1:un(t.headers,n.peerTokens)}var an,Ee,ln,ke,Te=f(()=>{"use strict";an="x-agentx-operator",Ee=Symbol("requests.operator");ln="x-agentx-operator-vouch";ke=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function $r(r,t){return r.find(n=>n.id===t)?.name??(t===I?"Owner":t)}function Ae(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function Re(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=M(r.slice(0,t).trim()),a=Ae(n,r.slice(t+1));return a?{channel:n,value:a}:null}function Ie(r){let t=new Set,n=new Map;for(let a of r){if(t.has(a.id))return`person "${a.id}" is listed twice`;if(t.add(a.id),a.id===I&&a.role!=="owner")return`the id "${I}" is kept for a person with the owner role`;for(let o of a.identities){let i=Re(o);if(!i)return`identity "${o}" of "${a.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,u=n.get(s);if(u&&u!==a.id)return`identity "${o}" belongs to both "${u}" and "${a.id}"`;n.set(s,a.id)}}return null}function fn(r,t,n){let a=M(t),i=(a==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>Ae(a,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(u=>{let m=Re(u);return!!m&&m.channel===a&&i.includes(m.value)}))??null:null}function gn(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:I,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function Ce(r,t){let n=z(t);if(n)return n.person?{id:n.person}:null;if(!t||H(t)!=="human")return null;let a=String(t.channel??"");if(R.has(M(a)))return ve(t)?gn(r):null;let o=s=>typeof s=="string"?s:void 0,i=fn(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function pn(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Dr(r,t,n){let a=Ce(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||pn(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 Pr(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function qr(r,t){let n=Ce(r,t);if(!n)return null;let a=r.find(s=>s.id===n.id);if(!a||a.role==="owner")return null;let o=a.deny?.tools??[],i=a.deny?.skills??[];return!o.length&&!i.length?null:{personId:a.id,name:a.name,tools:[...o],skills:[...i]}}var Nr,I,M,je=f(()=>{"use strict";lt();Se();Te();Nr=["owner","member","client","guest"],I="owner";M=r=>r.toLowerCase().split("@")[0]});function Br(r){return typeof r=="string"&&hn.includes(r)}function Oe(r){let t=new Set(bn);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var bn,hn,Fr,Le=f(()=>{"use strict";bn=["agentx_generate","agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_channel_reply","agentx_channel_label","agentx_send","agentx_send_agent","agentx_recent","agentx_events","agentx_signal","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],hn=["read","full"],Fr=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_health","agentx_crons","agentx_wiki_query"]});var Wn={};it(Wn,{INTEGRATION_KINDS:()=>vn,WIKI_CONTRIBUTE_JOB:()=>Qe,WIKI_CONTRIBUTE_MERGE_JOB:()=>et,WIKI_SUMMARIZE_JOB:()=>F,approvalsConfigSchema:()=>Ye,callsSchema:()=>We,cameraBotSchema:()=>ze,daemonConfigSchema:()=>Je,eventSubscriptionSchema:()=>Ue,expandEnvVars:()=>L,isCronExpression:()=>He,loadDaemonConfig:()=>zn,membersConfigSchema:()=>Ve,peopleConfigSchema:()=>Ze,personSchema:()=>Xe,requestStatusConfigSchema:()=>Ge,requestsConfigSchema:()=>Ke,validateWorkspaces:()=>Hn,withContributionJobs:()=>tt,withSummariesJob:()=>nt});import{z as e}from"zod";import{readFileSync as qe,existsSync as j}from"fs";import{resolve as O}from"path";function xn(r){let t=O(r,".env");if(!j(t))return;let n=qe(t,"utf-8");for(let a of n.split(`
43
- `)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),u=o.slice(i+1).trim();process.env[s]||(process.env[s]=u)}}function He(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[u,m]=t[o],g=s[2]===void 0?u:Number(s[2]),b=s[3]===void 0?g:Number(s[3]),_=s[4]===void 0?1:Number(s[4]);return g>=u&&b<=m&&g<=b&&_>=1}))}function In(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function L(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(L);if(r!==null&&typeof r=="object"){let t={};for(let[n,a]of Object.entries(r))t[n]=L(a);return t}return r}function Un(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 u=s[1],m=`tg:${u}`;if(a.has(m))continue;a.add(m),n.push(`Hint: Telegram account "${u}" is enabled but has no bot token.
41
+ WHERE id = ? AND state IN (${b(y.length)})`).run(n,o,o,a.trim().slice(0,P)||null,t,...y).changes>0}setNoteSaid(t,n,a){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${a?" AND pickup_at IS NULL":""}`).run(a?1:null,t,n)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(x).filter(t=>t.state==="in_progress").sort((t,n)=>t.createdAt-n.createdAt)}pruneClosed(t){return this.db.prepare(`DELETE FROM requests WHERE state IN (${b(p.length)}) AND closed_at < ?`).run(...p,t).changes}}});function yr(r){return Object.assign({channel:ye,chatId:r,sender:"operator"},{[we]:!0})}function wr(r){return!!r&&r[we]===!0}function Xt(r,t,n,a=!1){let o=A(t);if(r.channels.length&&!r.channels.map(A).includes(o))return!1;if(R.has(o))return a&&!Wt.has((n?.name??"").toLowerCase());let i=Kt.has(o)?n?.username:n?.id,s=i?he(o,i):"";return s?r.from.some(u=>{let m=u.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&he(o,m.slice(g+1))===s}):!1}function Sr(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 Zt(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var ye,we,R,Wt,A,Kt,he,w,k,xe,Se=f(()=>{"use strict";be();ye="requests",we=Symbol("requests.pickup");R=new Set(["voice","app","dashboard","webrtc"]),Wt=new Set(["camera"]),A=r=>r.toLowerCase().split("@")[0],Kt=new Set(["github","gitlab"]),he=(r,t)=>r==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.trim().toLowerCase().replace(/^@/,"");w=(r,t=200)=>{let n=r.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-1)}\u2026`:n},k=(r,t,n)=>`${r}\0${t}\0${n}`,xe=class{constructor(t,n,a,o=Date.now){this.store=t;this.settings=n;this.log=a;this.now=o}live=new Map;guard(t,n){try{n()}catch(a){this.log(`[requests] ${t} failed: ${a?.message??a}`)}}isListedOwner(t){let n=A(t.channel),a=this.settings().channels;return a.length&&!a.map(A).includes(n)?!1:t.person?.role==="owner"&&!R.has(n)}liveRequestId(t,n,a){return this.live.get(k(t,n,a))?.requestId??null}taskStarted(t){t.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let n=this.now(),a=t.resumedFrom?this.store.byLink("run",t.resumedFrom):null,o=k(t.agentId,t.channel,t.chatId);if(a){this.store.link(a.id,"run",t.taskId,n),a.state==="candidate"?this.store.touch(a.id,n):this.store.progress(a.id,n),this.live.set(o,{requestId:a.id,runId:t.taskId});return}let i=t.pickup&&t.channel===ye?this.store.get(t.chatId):null;if(i&&i.agentId===t.agentId){this.store.link(i.id,"run",t.taskId,n),this.store.touch(i.id,n),this.live.set(o,{requestId:i.id,runId:t.taskId});return}!t.humanRoot||!(Xt(this.settings(),t.channel,t.sender,t.operator===!0)||this.isListedOwner(t))||(this.live.set(o,{requestId:`req-${t.taskId}`,runId:t.taskId}),this.store.addCandidate({id:`req-${t.taskId}`,runId:t.taskId,channel:t.channel,chatId:t.chatId,sender:t.sender?.name??t.sender?.username??t.sender?.id??null,person:t.person?.id??null,agentId:t.agentId,text:t.requestText??t.fullMessage??t.messagePreview,now:n}))})}taskCompleted(t){t.taskId&&this.guard("run end",()=>{let n=k(t.agentId,t.channel,t.chatId);this.live.get(n)?.runId===t.taskId&&this.live.delete(n);let a=this.store.byLink("run",t.taskId);if(!a)return;let o=this.now();if(!t.interrupted){if(t.error&&t.errorKind!=="cancelled"&&!t.stopped&&t.errorKind!=="stopped"){let i=Zt(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${w(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(k(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}let u={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} ${u}: ${w(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${w(a)}). It said: ${w(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(k(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${w(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!y.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${w(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Vt,timingSafeEqual as _e}from"crypto";import{chmodSync as Gt,existsSync as Yt,mkdirSync as Jt,readFileSync as Qt,writeFileSync as en}from"fs";import{networkInterfaces as tn}from"os";import{dirname as nn,resolve as rn}from"path";function Ar(r){return Object.assign(r,{[Ee]:!0})}function ve(r){return!!r&&r[Ee]===!0}function on(r=process.cwd()){return rn(r,".agentx","operator.key")}function Rr(r=process.cwd(),t={}){let n=on(r);try{if(Yt(n)){let o=Qt(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=Vt(32).toString("hex");return Jt(nn(n),{recursive:!0}),en(n,a+`
42
+ `,{mode:384}),Gt(n,384),a}catch{return null}}function sn(r,t){let n=Array.isArray(t)?t[0]:t;if(!r||!n)return!1;let a=Buffer.from(r),o=Buffer.from(n.trim());return a.length===o.length&&_e(a,o)}function dn(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?sn(n,t[an]):!1}function un(r,t){let n=r[ln];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 u of t){if(!u)continue;let m=Buffer.from(u);if(m.length===s.length&&_e(m,s))return!0}return!1}function cn(r,t=mn()){let n=ke(r??"");if(!n||n==="::1"||n.startsWith("127."))return!0;for(let a of t)if(ke(a)===n)return!0;return!1}function mn(){return Object.values(tn()).flatMap(r=>(r??[]).map(t=>t.address))}function Ir(r,t,n){if(dn(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)||cn(t.remoteAddress,n.ownAddresses)?!1:un(t.headers,n.peerTokens)}var an,Ee,ln,ke,Te=f(()=>{"use strict";an="x-agentx-operator",Ee=Symbol("requests.operator");ln="x-agentx-operator-vouch";ke=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function $r(r,t){return r.find(n=>n.id===t)?.name??(t===I?"Owner":t)}function Ae(r,t){let n=t.trim().toLowerCase();return r==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.replace(/^@/,"")}function Re(r){let t=r.indexOf(":");if(t<=0||t===r.length-1)return null;let n=M(r.slice(0,t).trim()),a=Ae(n,r.slice(t+1));return a?{channel:n,value:a}:null}function Ie(r){let t=new Set,n=new Map;for(let a of r){if(t.has(a.id))return`person "${a.id}" is listed twice`;if(t.add(a.id),a.id===I&&a.role!=="owner")return`the id "${I}" is kept for a person with the owner role`;for(let o of a.identities){let i=Re(o);if(!i)return`identity "${o}" of "${a.id}" must be written channel:id`;let s=`${i.channel}:${i.value}`,u=n.get(s);if(u&&u!==a.id)return`identity "${o}" belongs to both "${u}" and "${a.id}"`;n.set(s,a.id)}}return null}function fn(r,t,n){let a=M(t),i=(a==="whatsapp"?[n?.id]:[n?.id,n?.username]).filter(s=>typeof s=="string"&&!!s).map(s=>Ae(a,s)).filter(Boolean);return i.length?r.find(s=>s.identities.some(u=>{let m=Re(u);return!!m&&m.channel===a&&i.includes(m.value)}))??null:null}function gn(r){let t=r.filter(n=>n.role==="owner");return t.length===0?{id:I,role:"owner"}:t.length===1?{id:t[0].id,role:"owner"}:null}function Ce(r,t){let n=z(t);if(n)return n.person?{id:n.person}:null;if(!t||H(t)!=="human")return null;let a=String(t.channel??"");if(R.has(M(a)))return ve(t)?gn(r):null;let o=s=>typeof s=="string"?s:void 0,i=fn(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function pn(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function Dr(r,t,n){let a=Ce(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||pn(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 Pr(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function qr(r,t){let n=Ce(r,t);if(!n)return null;let a=r.find(s=>s.id===n.id);if(!a||a.role==="owner")return null;let o=a.deny?.tools??[],i=a.deny?.skills??[];return!o.length&&!i.length?null:{personId:a.id,name:a.name,tools:[...o],skills:[...i]}}var Nr,I,M,Oe=f(()=>{"use strict";lt();Se();Te();Nr=["owner","member","client","guest"],I="owner";M=r=>r.toLowerCase().split("@")[0]});function Br(r){return typeof r=="string"&&hn.includes(r)}function je(r){let t=new Set(bn);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var bn,hn,Fr,Le=f(()=>{"use strict";bn=["agentx_generate","agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_channel_reply","agentx_channel_label","agentx_send","agentx_send_agent","agentx_recent","agentx_events","agentx_signal","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],hn=["read","full"],Fr=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_health","agentx_crons","agentx_wiki_query"]});var Wn={};it(Wn,{INTEGRATION_KINDS:()=>vn,WIKI_CONTRIBUTE_JOB:()=>Qe,WIKI_CONTRIBUTE_MERGE_JOB:()=>et,WIKI_SUMMARIZE_JOB:()=>F,approvalsConfigSchema:()=>Ye,callsSchema:()=>We,cameraBotSchema:()=>ze,daemonConfigSchema:()=>Je,eventSubscriptionSchema:()=>Ue,expandEnvVars:()=>L,isCronExpression:()=>He,loadDaemonConfig:()=>zn,membersConfigSchema:()=>Ve,peopleConfigSchema:()=>Ze,personSchema:()=>Xe,requestStatusConfigSchema:()=>Ge,requestsConfigSchema:()=>Ke,validateWorkspaces:()=>Hn,withContributionJobs:()=>tt,withSummariesJob:()=>nt});import{z as e}from"zod";import{readFileSync as qe,existsSync as O}from"fs";import{resolve as j}from"path";function xn(r){let t=j(r,".env");if(!O(t))return;let n=qe(t,"utf-8");for(let a of n.split(`
43
+ `)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),u=o.slice(i+1).trim();process.env[s]||(process.env[s]=u)}}function He(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[u,m]=t[o],g=s[2]===void 0?u:Number(s[2]),h=s[3]===void 0?g:Number(s[3]),_=s[4]===void 0?1:Number(s[4]);return g>=u&&h<=m&&g<=h&&_>=1}))}function In(r){try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}}function L(r){if(typeof r=="string")return r.replace(/\$\{(\w+)\}/g,(t,n)=>process.env[n]||"");if(Array.isArray(r))return r.map(L);if(r!==null&&typeof r=="object"){let t={};for(let[n,a]of Object.entries(r))t[n]=L(a);return t}return r}function Un(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 u=s[1],m=`tg:${u}`;if(a.has(m))continue;a.add(m),n.push(`Hint: Telegram account "${u}" is enabled but has no bot token.
44
44
  Either:
45
45
  A) Open ${t} and set channels.telegram.accounts.${u}.token to your bot token (or "\${TG_${u.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
46
- B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${u}).`)}}return n}function zn(r){let t=r?[r]:[O(process.cwd(),"agentx.json"),O(process.cwd(),".agentx/config.json")];xn(process.cwd());let n,a;for(let u of t)if(j(u)){n=qe(u,"utf-8"),a=u;break}if(!n||!a)throw new Error(`No config found. Create agentx.json or .agentx/config.json
47
- Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(u){throw new Error(`Invalid JSON in ${a}: ${u.message}`)}let i=L(o),s=Je.safeParse(i);if(!s.success){let u=s.error.issues.map(b=>` ${b.path.join(".")}: ${b.message}`).join(`
46
+ B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${u}).`)}}return n}function zn(r){let t=r?[r]:[j(process.cwd(),"agentx.json"),j(process.cwd(),".agentx/config.json")];xn(process.cwd());let n,a;for(let u of t)if(O(u)){n=qe(u,"utf-8"),a=u;break}if(!n||!a)throw new Error(`No config found. Create agentx.json or .agentx/config.json
47
+ Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(u){throw new Error(`Invalid JSON in ${a}: ${u.message}`)}let i=L(o),s=Je.safeParse(i);if(!s.success){let u=s.error.issues.map(h=>` ${h.path.join(".")}: ${h.message}`).join(`
48
48
  `),m=Un(s.error.issues,a),g=m.length?`
49
49
 
50
50
  ${m.join(`
51
51
 
52
52
  `)}`:"";throw new Error(`Config validation failed (${a}):
53
- ${u}${g}`)}return nt(tt(s.data))}function Hn(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!j(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=O(a.workspace,".claude");j(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${a.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=a.provider||"claude",i=r.providers[o];!["claude-code","codex-cli","opencode"].includes(a.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,a]of Object.entries(r.crons))r.agents[a.agent]||t.push(`Cron "${n}": references unknown agent "${a.agent}"`);if(r.channels.telegram.enabled)for(let[n,a]of Object.entries(r.channels.telegram.accounts))r.agents[a.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${a.agentBinding}"`);return t}function tt(r,t=rt()){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,u)=>B.parse({schedule:s,timezone:a.timezone,agent:n[0],command:u,timeout:3600,onError:"log"}),i={[Qe]:o(a.schedule,`${t} wiki contribute --all`),[et]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function nt(r,t=rt()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=B.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${F} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[F]:o.data,...r.crons}}}function rt(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var Ne,yn,wn,Sn,kn,_n,En,vn,Me,Fe,C,Be,Ue,Tn,An,ze,Rn,B,$e,De,Pe,Cn,jn,On,Ln,Nn,$n,Dn,Pn,qn,We,Mn,Fn,Bn,Ke,Xe,Ze,Ve,Ge,Ye,Je,Qe,et,F,Kn=f(()=>{Z();Y();st();ee();ae();se();de();ce();ge();je();Le();Ne=e.array(e.string().min(1)).superRefine((r,t)=>{let n=Oe(r);n.length&&t.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${n.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),yn=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),wn=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),Sn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),kn=e.union([Sn,wn]),_n=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(),En=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:_n.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),vn=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Me=e.enum(["system","elevenlabs"]),Fe=e.union([e.string(),e.record(e.string(),e.string())]),C=e.string().superRefine((r,t)=>{let n=Q(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),Be=e.object({provider:Me.optional(),system:Fe.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:C.optional()}),Ue=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),Tn=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(),kn).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({}),notes:e.object({dir:e.string().min(1).optional()}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(Ue).default([]),integrations:e.array(En).default([]),voice:Be.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(N).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),An=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),ze=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({}),Rn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),An).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:ze}).default({})}).default({})}),B=e.object({enabled:e.boolean().default(!0),schedule:e.string(),timezone:e.string().default("UTC"),agent:e.string(),prompt:e.string().default(""),command:e.string().optional(),timeout:e.number().default(600),model:e.string().optional(),maxOutputTokens:e.number().int().min(50).max(8e3).optional(),autonomy:U.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});$e=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),De=e.union([$e,e.object({repo:$e,about:e.string().max(200).optional()})]),Pe={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},Cn=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),jn=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"}),On=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()}),Ln=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Nn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),$n=e.object({enabled:e.boolean().default(!1),peers:e.array(Ln).default([]),inboxes:e.array(Nn).default([]),discovery:e.enum(["static","mdns"]).default("static"),healthCheck:e.object({interval:e.number().default(60),timeout:e.number().default(10)}).default({}),feed:e.object({enabled:e.boolean().default(!0),skipTypes:e.array(e.string().min(1)).default(["task:step"])}).default({}),delegation:e.object({asyncWhenHuman:e.boolean().default(!0),timeoutMinutes:e.number().int().min(1).max(240).default(30),requeueRelayOnRestart:e.boolean().default(!0)}).default({})}),Dn=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({}),Pn=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({}),qn=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(),Pn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),We=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0)}).default({}),Mn=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({}),Fn=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Bn=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-]*$/),Fn).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),Ke=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),Xe=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({})}),Ze=e.array(Xe).default([]).superRefine((r,t)=>{let n=Ie(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Ve=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ge=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Ye=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({}),Je=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(),yn).default({}),agents:e.record(e.string(),Tn).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(Cn).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()===""||He(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(In,'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:Rn.default({}),crons:e.record(e.string(),B).default({}),wikiNotes:jn.default({}),services:e.record(e.string(),On).default({}),notifications:Mn,calls:We,whatsappTriage:fe,approvals:Ye,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:Ke,people:Ze,members:Ve,requestStatus:Ge,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),app:e.object({android:e.object({packageName:e.string().regex(/^[a-zA-Z][\w]*(\.[a-zA-Z][\w]*)+$/,"must look like com.example.app").default("dev.agentx.phone"),certFingerprints:e.array(e.string().regex(/^([0-9A-Fa-f]{2}:){31}[0-9A-Fa-f]{2}$/,"must be 32 hex pairs separated by colons")).default([])}).default({}),places:e.object({enabled:e.boolean().default(!0),file:e.string().min(1).default(".agentx/places.json"),defaultRadiusMeters:e.number().int().min(50).max(5e4).default(150),minRadiusMeters:e.number().int().min(50).max(5e4).default(100),maxRadiusMeters:e.number().int().min(50).max(5e4).default(5e3),maxPlaces:e.number().int().min(1).max(100).default(50),maxRulesPerPlace:e.number().int().min(1).max(50).default(10),cooldownMinutes:e.number().int().min(0).max(1440).default(10),maxEventAgeMinutes:e.number().int().min(1).max(1440).default(30),syncMinutes:e.number().int().min(15).max(1440).default(60)}).default({})}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:Bn,mesh:$n.default({}),meshVoices:e.record(e.string(),Be.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:Me.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Fe.optional(),locale:e.string().default("en"),listener:e.string().optional(),pronunciations:e.array(e.object({written:e.string().trim().min(1).max(80),spoken:e.string().trim().min(1).max(120),languages:e.array(e.enum(["en","fr","ar"])).optional()}).strict()).max(200).default([]),pointer:e.boolean().default(!0),stt:e.enum(["auto","elevenlabs","local"]).default("auto"),allowUnmeasured:e.boolean().default(!1),spokenMaxChars:e.number().int().min(300).max(1500).default($),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(D)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:C.default(E.talk),stop:C.default(E.stop),paste:C.default(E.paste)}).default({}),look:e.enum(te).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(ne).default("sometimes"),palette:e.enum(N).default(v),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(T.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(T.maxSeconds)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:X.optional(),boards:V,dashboard:G,graph:Dn,decisions:qn,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),followUp:e.object({enabled:e.boolean().default(!0),agents:e.record(e.boolean()).default({}),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(2),approval:e.enum(["start","step"]).default("step")}).default({}),required:e.object({enabled:e.boolean().default(!1),agents:e.record(e.boolean()).default({}),exemptQuestions:e.boolean().default(!0),retentionDays:e.number().int().min(0).max(3650).default(30)}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),tierTwoThresholdTokensByChannel:e.record(e.number().int().min(5e4).max(2e5)).default({}),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(0).max(1e4).optional(),maxClaudeCodeDispatchesPer5h:e.number().int().min(0).max(5e4).optional(),continuityStateTurns:e.number().int().min(0).max(5).default(0),profileByChannel:e.record(e.enum(["full","lean"])).default({}),lean:e.object({mcpServers:e.array(e.string().min(1)).default(["agentx"]),settingSources:e.array(e.enum(["user","project","local"])).default(["project","local"]),contextOnDemand:e.boolean().default(!0),tools:e.array(e.string().min(1)).default([]),toolsByChannel:e.record(e.array(e.string().min(1))).default({}),agentxTools:Ne.default([]),agentxToolsByChannel:e.record(Ne).default({})}).default({}),triage:e.object({models:e.object({"claude-code":e.string().min(1).optional(),"codex-cli":e.string().min(1).optional()}).default({}),actions:e.array(e.string().min(1)).default(["labeled","unlabeled","closed"])}).default({}),memoryIndexMaxChars:e.number().int().min(0).max(2e5).default(0),resumeGate:e.object({mode:e.enum(["off","shadow","active"]).default("off"),freshTokens:e.number().int().min(1e3).max(2e5).default(3e4),cacheTtlMinutes:e.number().int().min(1).max(1440).default(60),cacheWriteFactor:e.number().min(1).max(4).default(2),margin:e.number().min(1).max(10).default(1.5)}).default({}),observationPack:e.object({enabled:e.boolean().default(!1),limitBytes:e.number().int().min(1024).max(1048576).default(10240),headBytes:e.number().int().min(0).max(65536).default(1024),tailBytes:e.number().int().min(0).max(65536).default(1024),tools:e.array(e.string().min(1)).default(["Bash","Grep","Read","WebFetch","mcp__.*"]),retentionDays:e.number().int().min(0).max(3650).default(0)}).default({})}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})});Qe="wiki-contribute",et="wiki-contribute-merge";F="wiki-summarize"});export{Gn as a,Yn as b,Y as c,jt as d,Qn as e,E as f,ee as g,S as h,te as i,ne as j,N as k,tr as l,ae as m,oe as n,ie as o,or as p,se as q,sr as r,lr as s,de as t,ue as u,cr as v,ce as w,fe as x,ge as y,y as z,p as A,P as B,br as C,pe as D,be as E,yr as F,wr as G,R as H,Sr as I,xe as J,Se as K,an as L,Ar as M,ve as N,Rr as O,dn as P,Ir as Q,Te as R,Nr as S,I as T,$r as U,Re as V,fn as W,gn as X,Ce as Y,Dr as Z,Pr as _,qr as $,je as aa,hn as ba,Fr as ca,Br as da,Le as ea,vn as fa,Ue as ga,ze as ha,He as ia,We as ja,Ke as ka,Xe as la,Ze as ma,Ve as na,Ge as oa,Ye as pa,Je as qa,L as ra,zn as sa,Hn as ta,Qe as ua,et as va,tt as wa,F as xa,nt as ya,Wn as za,Kn as Aa};
54
- //# sourceMappingURL=chunk-KHYF6KTY.js.map
53
+ ${u}${g}`)}return nt(tt(s.data))}function Hn(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!O(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=j(a.workspace,".claude");O(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 tt(r,t=rt()){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,u)=>B.parse({schedule:s,timezone:a.timezone,agent:n[0],command:u,timeout:3600,onError:"log"}),i={[Qe]:o(a.schedule,`${t} wiki contribute --all`),[et]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function nt(r,t=rt()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=B.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${F} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[F]:o.data,...r.crons}}}function rt(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var Ne,yn,wn,Sn,kn,_n,En,vn,Me,Fe,C,Be,Ue,Tn,An,ze,Rn,B,$e,De,Pe,Cn,On,jn,Ln,Nn,$n,Dn,Pn,qn,We,Mn,Fn,Bn,Ke,Xe,Ze,Ve,Ge,Ye,Je,Qe,et,F,Kn=f(()=>{Z();Y();st();ee();ae();se();de();ce();ge();Oe();Le();Ne=e.array(e.string().min(1)).superRefine((r,t)=>{let n=je(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__".`})}),yn=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),wn=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),Sn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),kn=e.union([Sn,wn]),_n=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(),En=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:_n.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),vn=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Me=e.enum(["system","elevenlabs"]),Fe=e.union([e.string(),e.record(e.string(),e.string())]),C=e.string().superRefine((r,t)=>{let n=Q(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),Be=e.object({provider:Me.optional(),system:Fe.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:C.optional()}),Ue=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),Tn=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(),kn).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({}),notes:e.object({dir:e.string().min(1).optional()}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(Ue).default([]),integrations:e.array(En).default([]),voice:Be.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(N).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),An=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),ze=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({}),Rn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),An).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:ze}).default({})}).default({})}),B=e.object({enabled:e.boolean().default(!0),schedule:e.string(),timezone:e.string().default("UTC"),agent:e.string(),prompt:e.string().default(""),command:e.string().optional(),timeout:e.number().default(600),model:e.string().optional(),maxOutputTokens:e.number().int().min(50).max(8e3).optional(),autonomy:U.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(r=>Array.isArray(r)?r:[r]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(r=>!!(r.command?.trim()||r.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(r=>!(r.command?.trim()&&r.autonomy&&r.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"});$e=e.string().regex(/^(?!.*(?:^|\/)\.+(?:\/|$))[\w.-]+(\/[\w.-]+)+$/,"expected owner/name"),De=e.union([$e,e.object({repo:$e,about:e.string().max(200).optional()})]),Pe={tokenEnv:e.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional(),tokenFile:e.string().optional()},Cn=e.discriminatedUnion("type",[e.object({type:e.literal("github"),apiUrl:e.string().url().default("https://api.github.com"),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("gitlab"),url:e.string().url().optional(),...Pe,repos:e.array(De).min(1)}),e.object({type:e.literal("agentx"),url:e.string().url().optional(),peers:e.boolean().default(!0)})]),On=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"}),jn=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()}),Ln=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Nn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),$n=e.object({enabled:e.boolean().default(!1),peers:e.array(Ln).default([]),inboxes:e.array(Nn).default([]),discovery:e.enum(["static","mdns"]).default("static"),healthCheck:e.object({interval:e.number().default(60),timeout:e.number().default(10)}).default({}),feed:e.object({enabled:e.boolean().default(!0),skipTypes:e.array(e.string().min(1)).default(["task:step"])}).default({}),delegation:e.object({asyncWhenHuman:e.boolean().default(!0),timeoutMinutes:e.number().int().min(1).max(240).default(30),requeueRelayOnRestart:e.boolean().default(!0)}).default({})}),Dn=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({}),Pn=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({}),qn=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(),Pn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),We=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0)}).default({}),Mn=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({}),Fn=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Bn=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-]*$/),Fn).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),Ke=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),Xe=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({})}),Ze=e.array(Xe).default([]).superRefine((r,t)=>{let n=Ie(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Ve=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ge=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Ye=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({}),Je=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(),yn).default({}),agents:e.record(e.string(),Tn).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(Cn).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()===""||He(r),'expected a cron of 5 fields, such as "30 23 * * *"').optional(),timezone:e.string().refine(In,'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:Rn.default({}),crons:e.record(e.string(),B).default({}),wikiNotes:On.default({}),services:e.record(e.string(),jn).default({}),notifications:Mn,calls:We,whatsappTriage:fe,approvals:Ye,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:Ke,people:Ze,members:Ve,requestStatus:Ge,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),app:e.object({android:e.object({packageName:e.string().regex(/^[a-zA-Z][\w]*(\.[a-zA-Z][\w]*)+$/,"must look like com.example.app").default("dev.agentx.phone"),certFingerprints:e.array(e.string().regex(/^([0-9A-Fa-f]{2}:){31}[0-9A-Fa-f]{2}$/,"must be 32 hex pairs separated by colons")).default([])}).default({}),places:e.object({enabled:e.boolean().default(!0),file:e.string().min(1).default(".agentx/places.json"),defaultRadiusMeters:e.number().int().min(50).max(5e4).default(150),minRadiusMeters:e.number().int().min(50).max(5e4).default(100),maxRadiusMeters:e.number().int().min(50).max(5e4).default(5e3),maxPlaces:e.number().int().min(1).max(100).default(50),maxRulesPerPlace:e.number().int().min(1).max(50).default(10),cooldownMinutes:e.number().int().min(0).max(1440).default(10),maxEventAgeMinutes:e.number().int().min(1).max(1440).default(30),syncMinutes:e.number().int().min(15).max(1440).default(60)}).default({})}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:Bn,mesh:$n.default({}),meshVoices:e.record(e.string(),Be.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:Me.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Fe.optional(),locale:e.string().default("en"),listener:e.string().optional(),pronunciations:e.array(e.object({written:e.string().trim().min(1).max(80),spoken:e.string().trim().min(1).max(120),languages:e.array(e.enum(["en","fr","ar"])).optional()}).strict()).max(200).default([]),pointer:e.boolean().default(!0),stt:e.enum(["auto","elevenlabs","local"]).default("auto"),allowUnmeasured:e.boolean().default(!1),spokenMaxChars:e.number().int().min(300).max(1500).default($),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(D)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:C.default(E.talk),stop:C.default(E.stop),paste:C.default(E.paste)}).default({}),look:e.enum(te).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(ne).default("sometimes"),palette:e.enum(N).default(v),floor:e.object({enabled:e.boolean().default(!0),defaultSeconds:e.number().int().min(5).max(3600).default(T.defaultSeconds),maxSeconds:e.number().int().min(5).max(14400).default(T.maxSeconds)}).default({}),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:X.optional(),boards:V,dashboard:G,graph:Dn,decisions:qn,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),followUp:e.object({enabled:e.boolean().default(!0),agents:e.record(e.boolean()).default({}),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(2),approval:e.enum(["start","step"]).default("step")}).default({}),required:e.object({enabled:e.boolean().default(!1),agents:e.record(e.boolean()).default({}),exemptQuestions:e.boolean().default(!0),retentionDays:e.number().int().min(0).max(3650).default(30)}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),tierTwoThresholdTokensByChannel:e.record(e.number().int().min(5e4).max(2e5)).default({}),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(0).max(1e4).optional(),maxClaudeCodeDispatchesPer5h:e.number().int().min(0).max(5e4).optional(),continuityStateTurns:e.number().int().min(0).max(5).default(0),profileByChannel:e.record(e.enum(["full","lean"])).default({}),lean:e.object({mcpServers:e.array(e.string().min(1)).default(["agentx"]),settingSources:e.array(e.enum(["user","project","local"])).default(["project","local"]),contextOnDemand:e.boolean().default(!0),tools:e.array(e.string().min(1)).default([]),toolsByChannel:e.record(e.array(e.string().min(1))).default({}),agentxTools:Ne.default([]),agentxToolsByChannel:e.record(Ne).default({})}).default({}),triage:e.object({models:e.object({"claude-code":e.string().min(1).optional(),"codex-cli":e.string().min(1).optional()}).default({}),actions:e.array(e.string().min(1)).default(["labeled","unlabeled","closed"])}).default({}),memoryIndexMaxChars:e.number().int().min(0).max(2e5).default(0),resumeGate:e.object({mode:e.enum(["off","shadow","active"]).default("off"),freshTokens:e.number().int().min(1e3).max(2e5).default(3e4),cacheTtlMinutes:e.number().int().min(1).max(1440).default(60),cacheWriteFactor:e.number().min(1).max(4).default(2),margin:e.number().min(1).max(10).default(1.5)}).default({}),observationPack:e.object({enabled:e.boolean().default(!1),limitBytes:e.number().int().min(1024).max(1048576).default(10240),headBytes:e.number().int().min(0).max(65536).default(1024),tailBytes:e.number().int().min(0).max(65536).default(1024),tools:e.array(e.string().min(1)).default(["Bash","Grep","Read","WebFetch","mcp__.*"]),retentionDays:e.number().int().min(0).max(3650).default(0)}).default({})}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})});Qe="wiki-contribute",et="wiki-contribute-merge";F="wiki-summarize"});export{Gn as a,Yn as b,Y as c,Ot as d,Qn as e,E as f,ee as g,S as h,te as i,ne as j,N as k,tr as l,ae as m,oe as n,ie as o,or as p,se as q,sr as r,lr as s,de as t,ue as u,cr as v,ce as w,fe as x,ge as y,y as z,p as A,P as B,br as C,pe as D,be as E,yr as F,wr as G,R as H,Sr as I,xe as J,Se as K,an as L,Ar as M,ve as N,Rr as O,dn as P,Ir as Q,Te as R,Nr as S,I as T,$r as U,Re as V,fn as W,gn as X,Ce as Y,Dr as Z,Pr as _,qr as $,Oe as aa,hn as ba,Fr as ca,Br as da,Le as ea,vn as fa,Ue as ga,ze as ha,He as ia,We as ja,Ke as ka,Xe as la,Ze as ma,Ve as na,Ge as oa,Ye as pa,Je as qa,L as ra,zn as sa,Hn as ta,Qe as ua,et as va,tt as wa,F as xa,nt as ya,Wn as za,Kn as Aa};
54
+ //# sourceMappingURL=chunk-HJCFLGVT.js.map