agentix-cli 0.139.2 → 0.141.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 (128) hide show
  1. package/README.md +15 -2
  2. package/dist/{App-VINKWTYN.js → App-A6YSBIEL.js} +2 -2
  3. package/dist/{ChatApp-RGHQCRBX.js → ChatApp-Q7UHDR5P.js} +2 -2
  4. package/dist/{absorb-eval-AERHBOQA.js → absorb-eval-WTKVCJXT.js} +2 -2
  5. package/dist/{agent-5CEDGNDW.js → agent-DHCLFYIQ.js} +2 -2
  6. package/dist/{board-dashboard-F5GP2X22.js → board-dashboard-6K34ZQB5.js} +4 -4
  7. package/dist/{chunk-IMUTN7PT.js → chunk-27UKZZTZ.js} +2 -2
  8. package/dist/{chunk-JS2LEURJ.js → chunk-6DZSDM35.js} +2 -2
  9. package/dist/{chunk-J7U3BASX.js → chunk-6MARQ33D.js} +2 -2
  10. package/dist/chunk-CELYB3UW.js +174 -0
  11. package/dist/chunk-CELYB3UW.js.map +1 -0
  12. package/dist/{chunk-STIZFWDJ.js → chunk-COWWOA7H.js} +2 -2
  13. package/dist/{chunk-WTMZW5X7.js → chunk-CV7ISZKU.js} +2 -2
  14. package/dist/{chunk-O6WW7ATO.js → chunk-HPGMY6YB.js} +2 -2
  15. package/dist/chunk-HW5FTKTU.js +54 -0
  16. package/dist/{chunk-MGM33GOW.js.map → chunk-HW5FTKTU.js.map} +1 -1
  17. package/dist/{chunk-4LNJR5PC.js → chunk-HYOXWAQP.js} +3 -3
  18. package/dist/chunk-HYOXWAQP.js.map +1 -0
  19. package/dist/{chunk-HWYU6XG2.js → chunk-I6P3BKWJ.js} +2 -2
  20. package/dist/{chunk-HGU5B7IY.js → chunk-JLM6CXIH.js} +2 -2
  21. package/dist/{chunk-65LN6GQP.js → chunk-L7OTWV5X.js} +320 -280
  22. package/dist/chunk-L7OTWV5X.js.map +1 -0
  23. package/dist/{chunk-JJZVFDG6.js → chunk-LYSCMFAM.js} +2 -2
  24. package/dist/{chunk-LMZCB7TT.js → chunk-MSRFTAWH.js} +2 -2
  25. package/dist/{chunk-NQGLKWDO.js → chunk-MT5QTEUL.js} +2 -2
  26. package/dist/{chunk-EJIY45FZ.js → chunk-MWB33O72.js} +2 -2
  27. package/dist/{chunk-B65EC44C.js → chunk-NJHNV4QP.js} +2 -2
  28. package/dist/{chunk-P4TSZDVO.js → chunk-OG44FK7T.js} +2 -2
  29. package/dist/{chunk-ANDEMOYE.js → chunk-OW2AND54.js} +2 -2
  30. package/dist/{chunk-BUKXFZEO.js → chunk-S5DS2V3X.js} +2 -2
  31. package/dist/{chunk-HXLB2XCT.js → chunk-T7LDVJMP.js} +3 -3
  32. package/dist/{chunk-7KAQHNLT.js → chunk-UJRJUSDY.js} +2 -2
  33. package/dist/{chunk-QN2OTBVC.js → chunk-UVJUURNO.js} +2 -2
  34. package/dist/{chunk-NMYPZR4W.js → chunk-VJC372D6.js} +2 -2
  35. package/dist/{chunk-AXHP6TMT.js → chunk-W4JLZJHU.js} +2 -2
  36. package/dist/{chunk-Z5IHT6RK.js → chunk-YDPXS6T4.js} +2 -2
  37. package/dist/cli.js +1 -1
  38. package/dist/{client-2KZWK6YT.js → client-T5BDAOBA.js} +2 -2
  39. package/dist/config-PCTNYBE3.js +2 -0
  40. package/dist/{config-mutate-HXWAXWHC.js → config-mutate-2WZOX6Y6.js} +2 -2
  41. package/dist/config-mutator-M65NF7SF.js +2 -0
  42. package/dist/{contributions-OSIKL25B.js → contributions-HVCHGNPO.js} +2 -2
  43. package/dist/{doctor-TOSA3RWP.js → doctor-NHEMFVQG.js} +2 -2
  44. package/dist/{follow-up-tool-M2KCLRQQ.js → follow-up-tool-7ENUC5TI.js} +2 -2
  45. package/dist/{hub-XGWCWKMT.js → hub-KTS6KFMG.js} +2 -2
  46. package/dist/index.d.ts +441 -0
  47. package/dist/index.js +1 -1
  48. package/dist/{program-SJT7PIFO.js → program-QQ6N3PVM.js} +241 -236
  49. package/dist/program-QQ6N3PVM.js.map +1 -0
  50. package/dist/{promote-YVWRKIAU.js → promote-CGF5G6PE.js} +2 -2
  51. package/dist/{query-X4AFOKZ7.js → query-AJVLRTTT.js} +2 -2
  52. package/dist/{query-settings-HV2RFQK7.js → query-settings-GF3CRGHA.js} +2 -2
  53. package/dist/registry-HYQ3N4B6.js +2 -0
  54. package/dist/{request-planner-MY6VKTVC.js → request-planner-4KQSVQHO.js} +2 -2
  55. package/dist/{review-candidates-BRTBB5XV.js → review-candidates-KC3AJDAL.js} +2 -2
  56. package/dist/{routing-CSVLOGNS.js → routing-5VGAZXNZ.js} +2 -2
  57. package/dist/schedule-tool-XETP3D45.js +2 -0
  58. package/dist/{scheduler-OUAVAU4O.js → scheduler-UZNAC46U.js} +2 -2
  59. package/dist/{seat-H2QR3CRX.js → seat-BTSSQDZX.js} +2 -2
  60. package/dist/{select-EEL5AZ2I.js → select-MYLQ3QGJ.js} +2 -2
  61. package/dist/{set-enabled-IBGEH6U6.js → set-enabled-QJ4GM624.js} +2 -2
  62. package/dist/{tool-GJ75MWV5.js → tool-HTPNTSCA.js} +2 -2
  63. package/dist/{tool-DFPOFXGA.js → tool-HZHMB5Q3.js} +2 -2
  64. package/dist/{wiki-ISKHNG3P.js → wiki-ZWFSQ5SL.js} +2 -2
  65. package/dist/wiki-enrich-HQCWHX6Z.js +2 -0
  66. package/package.json +3 -2
  67. package/dist/chunk-4LNJR5PC.js.map +0 -1
  68. package/dist/chunk-65LN6GQP.js.map +0 -1
  69. package/dist/chunk-LGB6ILTW.js +0 -160
  70. package/dist/chunk-LGB6ILTW.js.map +0 -1
  71. package/dist/chunk-MGM33GOW.js +0 -54
  72. package/dist/config-THFRJMZD.js +0 -2
  73. package/dist/config-mutator-JZOAWRBH.js +0 -2
  74. package/dist/program-SJT7PIFO.js.map +0 -1
  75. package/dist/registry-Q7VNRLZA.js +0 -2
  76. package/dist/schedule-tool-GUKYTQTY.js +0 -2
  77. package/dist/wiki-enrich-JNQ2RPWU.js +0 -2
  78. /package/dist/{App-VINKWTYN.js.map → App-A6YSBIEL.js.map} +0 -0
  79. /package/dist/{ChatApp-RGHQCRBX.js.map → ChatApp-Q7UHDR5P.js.map} +0 -0
  80. /package/dist/{absorb-eval-AERHBOQA.js.map → absorb-eval-WTKVCJXT.js.map} +0 -0
  81. /package/dist/{agent-5CEDGNDW.js.map → agent-DHCLFYIQ.js.map} +0 -0
  82. /package/dist/{board-dashboard-F5GP2X22.js.map → board-dashboard-6K34ZQB5.js.map} +0 -0
  83. /package/dist/{chunk-IMUTN7PT.js.map → chunk-27UKZZTZ.js.map} +0 -0
  84. /package/dist/{chunk-JS2LEURJ.js.map → chunk-6DZSDM35.js.map} +0 -0
  85. /package/dist/{chunk-J7U3BASX.js.map → chunk-6MARQ33D.js.map} +0 -0
  86. /package/dist/{chunk-STIZFWDJ.js.map → chunk-COWWOA7H.js.map} +0 -0
  87. /package/dist/{chunk-WTMZW5X7.js.map → chunk-CV7ISZKU.js.map} +0 -0
  88. /package/dist/{chunk-O6WW7ATO.js.map → chunk-HPGMY6YB.js.map} +0 -0
  89. /package/dist/{chunk-HWYU6XG2.js.map → chunk-I6P3BKWJ.js.map} +0 -0
  90. /package/dist/{chunk-HGU5B7IY.js.map → chunk-JLM6CXIH.js.map} +0 -0
  91. /package/dist/{chunk-JJZVFDG6.js.map → chunk-LYSCMFAM.js.map} +0 -0
  92. /package/dist/{chunk-LMZCB7TT.js.map → chunk-MSRFTAWH.js.map} +0 -0
  93. /package/dist/{chunk-NQGLKWDO.js.map → chunk-MT5QTEUL.js.map} +0 -0
  94. /package/dist/{chunk-EJIY45FZ.js.map → chunk-MWB33O72.js.map} +0 -0
  95. /package/dist/{chunk-B65EC44C.js.map → chunk-NJHNV4QP.js.map} +0 -0
  96. /package/dist/{chunk-P4TSZDVO.js.map → chunk-OG44FK7T.js.map} +0 -0
  97. /package/dist/{chunk-ANDEMOYE.js.map → chunk-OW2AND54.js.map} +0 -0
  98. /package/dist/{chunk-BUKXFZEO.js.map → chunk-S5DS2V3X.js.map} +0 -0
  99. /package/dist/{chunk-HXLB2XCT.js.map → chunk-T7LDVJMP.js.map} +0 -0
  100. /package/dist/{chunk-7KAQHNLT.js.map → chunk-UJRJUSDY.js.map} +0 -0
  101. /package/dist/{chunk-QN2OTBVC.js.map → chunk-UVJUURNO.js.map} +0 -0
  102. /package/dist/{chunk-NMYPZR4W.js.map → chunk-VJC372D6.js.map} +0 -0
  103. /package/dist/{chunk-AXHP6TMT.js.map → chunk-W4JLZJHU.js.map} +0 -0
  104. /package/dist/{chunk-Z5IHT6RK.js.map → chunk-YDPXS6T4.js.map} +0 -0
  105. /package/dist/{client-2KZWK6YT.js.map → client-T5BDAOBA.js.map} +0 -0
  106. /package/dist/{config-THFRJMZD.js.map → config-PCTNYBE3.js.map} +0 -0
  107. /package/dist/{config-mutate-HXWAXWHC.js.map → config-mutate-2WZOX6Y6.js.map} +0 -0
  108. /package/dist/{config-mutator-JZOAWRBH.js.map → config-mutator-M65NF7SF.js.map} +0 -0
  109. /package/dist/{contributions-OSIKL25B.js.map → contributions-HVCHGNPO.js.map} +0 -0
  110. /package/dist/{doctor-TOSA3RWP.js.map → doctor-NHEMFVQG.js.map} +0 -0
  111. /package/dist/{follow-up-tool-M2KCLRQQ.js.map → follow-up-tool-7ENUC5TI.js.map} +0 -0
  112. /package/dist/{hub-XGWCWKMT.js.map → hub-KTS6KFMG.js.map} +0 -0
  113. /package/dist/{promote-YVWRKIAU.js.map → promote-CGF5G6PE.js.map} +0 -0
  114. /package/dist/{query-X4AFOKZ7.js.map → query-AJVLRTTT.js.map} +0 -0
  115. /package/dist/{query-settings-HV2RFQK7.js.map → query-settings-GF3CRGHA.js.map} +0 -0
  116. /package/dist/{registry-Q7VNRLZA.js.map → registry-HYQ3N4B6.js.map} +0 -0
  117. /package/dist/{request-planner-MY6VKTVC.js.map → request-planner-4KQSVQHO.js.map} +0 -0
  118. /package/dist/{review-candidates-BRTBB5XV.js.map → review-candidates-KC3AJDAL.js.map} +0 -0
  119. /package/dist/{routing-CSVLOGNS.js.map → routing-5VGAZXNZ.js.map} +0 -0
  120. /package/dist/{schedule-tool-GUKYTQTY.js.map → schedule-tool-XETP3D45.js.map} +0 -0
  121. /package/dist/{scheduler-OUAVAU4O.js.map → scheduler-UZNAC46U.js.map} +0 -0
  122. /package/dist/{seat-H2QR3CRX.js.map → seat-BTSSQDZX.js.map} +0 -0
  123. /package/dist/{select-EEL5AZ2I.js.map → select-MYLQ3QGJ.js.map} +0 -0
  124. /package/dist/{set-enabled-IBGEH6U6.js.map → set-enabled-QJ4GM624.js.map} +0 -0
  125. /package/dist/{tool-GJ75MWV5.js.map → tool-HTPNTSCA.js.map} +0 -0
  126. /package/dist/{tool-DFPOFXGA.js.map → tool-HZHMB5Q3.js.map} +0 -0
  127. /package/dist/{wiki-ISKHNG3P.js.map → wiki-ZWFSQ5SL.js.map} +0 -0
  128. /package/dist/{wiki-enrich-JNQ2RPWU.js.map → wiki-enrich-HQCWHX6Z.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{c as P,d as N}from"./chunk-OWNQ2FD4.js";import{b as I}from"./chunk-KEXBEUSU.js";import{a as B}from"./chunk-ROLSSYXE.js";import{a as M,b as E,c as R,d as T,e as j,j as O}from"./chunk-7KAQHNLT.js";import{y as C,z as K}from"./chunk-LMZCB7TT.js";import{c as _,d as x}from"./chunk-QOYAX2FT.js";import{readFileSync as $,writeFileSync as b,appendFileSync as V,existsSync as w,mkdirSync as L,readdirSync as D,statSync as F}from"fs";import{resolve as h,join as Y,relative as k,dirname as z}from"path";K();function U(A){return B.includes(A)}function G(A){if(!A)return;let t;try{t=JSON.parse(A)}catch{return}if(!Array.isArray(t))return;let e=t.filter(s=>typeof s=="object"&&s!==null&&typeof s.property=="string"&&s.property!==""&&typeof s.value=="string"&&s.value!=="");return e.length?e:void 0}function H(A,t){let e=a=>{let o=/^(.*Z)(?:-(\d+))?\.md$/.exec(a);return o?[o[1],o[2]?Number(o[2]):0]:[a,0]},[s,i]=e(A),[n,r]=e(t);return s<n?-1:s>n?1:i-r}var J=class{baseDir;rawDir;log;lockWaitMs=5e3;constructor(t=h(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki]")){this.baseDir=t,this.rawDir=h(t,"raw/entries"),this.log=e,L(this.rawDir,{recursive:!0}),L(h(t,"raw"),{recursive:!0}),this.ensureSchema()}canRead(t,e){return t.access==="public"?!0:e?!!(t.owner===e||t.access==="shared"&&t.sharedWith?.includes(e)):!1}canWrite(t,e){return t.owner===e}addEntry(t){let e=`${t.date}_${t.id}.md`,s=h(this.rawDir,e),i=["---",`id: ${t.id}`,`date: ${t.date}`,`agent: ${t.agentId}`,`source: ${t.source}`];if(t.sourceContext&&i.push(`context: ${t.sourceContext}`),t.meta)for(let[n,r]of Object.entries(t.meta))i.push(`${n}: ${JSON.stringify(r)}`);return i.push("---","",t.content),b(s,i.join(`
1
+ import{c as P,d as N}from"./chunk-OWNQ2FD4.js";import{b as I}from"./chunk-KEXBEUSU.js";import{a as B}from"./chunk-ROLSSYXE.js";import{a as M,b as E,c as R,d as T,e as j,j as O}from"./chunk-UJRJUSDY.js";import{y as C,z as K}from"./chunk-MSRFTAWH.js";import{c as _,d as x}from"./chunk-QOYAX2FT.js";import{readFileSync as $,writeFileSync as b,appendFileSync as V,existsSync as w,mkdirSync as L,readdirSync as D,statSync as F}from"fs";import{resolve as h,join as Y,relative as k,dirname as z}from"path";K();function U(A){return B.includes(A)}function G(A){if(!A)return;let t;try{t=JSON.parse(A)}catch{return}if(!Array.isArray(t))return;let e=t.filter(s=>typeof s=="object"&&s!==null&&typeof s.property=="string"&&s.property!==""&&typeof s.value=="string"&&s.value!=="");return e.length?e:void 0}function H(A,t){let e=a=>{let o=/^(.*Z)(?:-(\d+))?\.md$/.exec(a);return o?[o[1],o[2]?Number(o[2]):0]:[a,0]},[s,i]=e(A),[n,r]=e(t);return s<n?-1:s>n?1:i-r}var J=class{baseDir;rawDir;log;lockWaitMs=5e3;constructor(t=h(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki]")){this.baseDir=t,this.rawDir=h(t,"raw/entries"),this.log=e,L(this.rawDir,{recursive:!0}),L(h(t,"raw"),{recursive:!0}),this.ensureSchema()}canRead(t,e){return t.access==="public"?!0:e?!!(t.owner===e||t.access==="shared"&&t.sharedWith?.includes(e)):!1}canWrite(t,e){return t.owner===e}addEntry(t){let e=`${t.date}_${t.id}.md`,s=h(this.rawDir,e),i=["---",`id: ${t.id}`,`date: ${t.date}`,`agent: ${t.agentId}`,`source: ${t.source}`];if(t.sourceContext&&i.push(`context: ${t.sourceContext}`),t.meta)for(let[n,r]of Object.entries(t.meta))i.push(`${n}: ${JSON.stringify(r)}`);return i.push("---","",t.content),b(s,i.join(`
2
2
  `)),this.appendLog("ingest",`${t.id} from ${t.agentId} via ${t.source}`),e}readEntries(t){if(t.length===0||!w(this.rawDir))return[];let e=new Set(t),s=[];for(let i of D(this.rawDir)){let n=i.replace(/\.md$/,"").replace(/^\d{4}-\d{2}-\d{2}_/,"");if(!e.has(n))continue;let r=this.parseEntry($(h(this.rawDir,i),"utf-8"),i);r&&s.push(r)}return s}listEntries(t){if(!w(this.rawDir))return[];let e=D(this.rawDir).filter(i=>i.endsWith(".md")).sort(),s=[];for(let i of e){let n=$(h(this.rawDir,i),"utf-8"),r=this.parseEntry(n,i);r&&(t?.agentId&&r.agentId!==t.agentId||t?.after&&r.date<t.after||t?.before&&r.date>t.before||s.push(r))}return s}parseEntry(t,e){let s=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!s)return null;let i=s[1],n=s[2].trim(),r=c=>i.match(new RegExp(`^${c}:\\s*(.+)$`,"m"))?.[1]?.trim()||"",a=new Set(["id","date","agent","source","context"]),o={};for(let c of i.split(`
3
3
  `)){let l=c.match(/^(\w+):\s*(.+)$/);if(!(!l||a.has(l[1])))try{o[l[1]]=JSON.parse(l[2])}catch{o[l[1]]=l[2].trim()}}return{id:r("id")||e.replace(".md",""),date:r("date"),agentId:r("agent"),source:r("source"),sourceContext:r("context")||void 0,content:n,meta:Object.keys(o).length>0?o:void 0}}withArticleLock(t,e){let s=`${h(this.baseDir,"_locks",t)}.lock`;return N(h(this.baseDir,t),e,{lock:s,what:`wiki page ${t}`,timeoutMs:this.lockWaitMs,staleMs:1e4})}writeArticle(t,e,s,i){try{return this.withArticleLock(t,()=>this.writeArticleLocked(t,e,s,i))}catch(n){if(!(n instanceof P))throw n;return this.log(n.message),!1}}writeArticleLocked(t,e,s,i){let n=this.readArticle(t);if(n&&!this.canWrite(n.meta,i))return this.log(`Permission denied: "${i}" cannot write "${t}" (owner: ${n.meta.owner})`),!1;e.type&&!I(e.type)&&(this.log(`Dropping invalid article type "${e.type}" for "${t}" \u2014 enum is [person, project, place, concept, event, decision, pattern]`),e={...e,type:void 0});let r=h(this.baseDir,t);n&&this.saveVersion(t,r),L(z(r),{recursive:!0});let a=["---",`title: "${e.title}"`];e.type&&a.push(`type: ${e.type}`),e.related?.length&&a.push(`related: [${e.related.map(c=>`"${c}"`).join(", ")}]`),a.push(`tags: [${(e.tags||[]).map(c=>`"${c}"`).join(", ")}]`,`owner: ${e.owner}`,`access: ${e.access}`),e.sharedWith?.length&&a.push(`shared_with: [${e.sharedWith.map(c=>`"${c}"`).join(", ")}]`),a.push(`created: ${e.created}`,`last_updated: ${e.lastUpdated}`,`sources: [${e.sources.map(c=>`"${c}"`).join(", ")}]`),e.graphPath?.length&&a.push(`graph_path: [${e.graphPath.map(c=>`"${c}"`).join(", ")}]`),e.class&&a.push(`class: ${e.class}`),e.importance&&a.push(`importance: ${e.importance}`),e.importanceProposed&&a.push(`importance_proposed: ${e.importanceProposed}`),e.date&&a.push(`date: ${e.date}`),e.rolledUpInto&&a.push(`rolled_up_into: ${JSON.stringify(e.rolledUpInto)}`),e.aliases?.length&&a.push(`aliases: ${JSON.stringify(e.aliases)}`),e.statements?.length&&a.push(`statements: ${JSON.stringify(e.statements)}`),a.push("---","",s),b(r,a.join(`
4
4
  `));let o=n?"update":"create";return this.appendLog(o,`${e.title} [${(e.tags||[]).slice(0,5).join(", ")}] by ${i} at ${t}`),!0}saveVersion(t,e){try{if(!w(e))return;let s=$(e,"utf-8"),i=new Date().toISOString().replace(/[:.]/g,"-"),n=h(this.baseDir,"_versions",t.replace(/\.md$/,""));L(n,{recursive:!0});for(let r=0;;r++)try{b(h(n,`${r?`${i}-${r}`:i}.md`),s,{flag:"wx"});return}catch(a){if(a.code!=="EEXIST")throw a}}catch{}}getVersions(t){let e=h(this.baseDir,"_versions",t.replace(/\.md$/,""));if(!w(e))return[];try{return D(e).filter(s=>s.endsWith(".md")).sort(H).reverse().map(s=>({timestamp:s.replace(/\.md$/,"").replace(/-/g,(i,n)=>n<19?n===10?"T":n===13||n===16?":":"-":i),path:h(e,s)}))}catch{return[]}}restoreVersion(t,e){let s=this.getVersions(t),i=s.find(n=>n.timestamp===e)??s.find(n=>n.timestamp.startsWith(e));return i?this.withArticleLock(t,()=>this.restoreLocked(t,i.path,e)):!1}restoreLocked(t,e,s){try{let i=$(e,"utf-8"),n=h(this.baseDir,t);return this.saveVersion(t,n),b(n,i),this.appendLog("restore",`${t} restored to ${s}`),!0}catch{return!1}}readArticle(t){let e=h(this.baseDir,t);if(!w(e))return null;let s=$(e,"utf-8");return this.parseArticle(s,t)}readArticleAs(t,e){let s=this.readArticle(t);return!s||!this.canRead(s.meta,e)?null:s}parseArticle(t,e){let s=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!s)return null;let i=s[1],n=s[2].trim(),r=W=>i.match(new RegExp(`^${W}:\\s*(.+)$`,"m"))?.[1]?.trim().replace(/^"(.*)"$/,"$1")||"",a=W=>{let v=i.match(new RegExp(`^${W}:\\s*\\[(.*)\\]$`,"m"));return v?[...v[1].matchAll(/\s*(?:"(.*?)"(?=\s*(?:,|$))|([^,]+))/g)].map(S=>(S[1]??S[2]).trim()).filter(Boolean):[]},o=r("type")||r("kind"),l=new Set(["person","project","place","concept","event","decision","pattern"]).has(o)?o:void 0,g=a("tags").filter((W,v,S)=>W&&S.indexOf(W)===v),d=a("related"),p=a("graph_path"),m=a("aliases"),u=r("importance"),f=r("importance_proposed"),y=r("date");return{meta:{title:r("title"),type:l,related:d.length?d:void 0,tags:g,owner:r("owner"),access:r("access")||"public",sharedWith:a("shared_with"),created:r("created"),lastUpdated:r("last_updated"),sources:a("sources"),graphPath:p.length?p:void 0,class:/^[a-z][a-z0-9_]*$/.test(r("class"))?r("class"):void 0,importance:U(u)?u:void 0,importanceProposed:U(f)?f:void 0,date:/^\d{4}-\d{2}-\d{2}/.test(y)?y.slice(0,10):void 0,rolledUpInto:r("rolled_up_into")||void 0,aliases:m.length?m:void 0,statements:G(r("statements"))},content:n,path:e}}listCache=new Map;listArticles(t){return this.listCached(t)}listAllArticles(){return this.listCached(null)}listCached(t){let e=[],s=[];this.walkDir(this.baseDir,(o,c)=>{if(!o.endsWith(".md"))return;let l=k(this.baseDir,o);l.startsWith("raw/")||l.startsWith("_")||(e.push(l),s.push(`${l}:${c?.mtimeMs??"?"}:${c?.size??"?"}`))});let i=s.join("|"),n=t??"\0all",r=this.listCache.get(n);if(r&&r.signature===i)return r.articles.slice();let a=[];for(let o of e){let c=this.readArticle(o);c&&(t===null||this.canRead(c.meta,t))&&a.push(c)}return this.listCache.set(n,{signature:i,articles:a}),a.slice()}search(t,e,s=10){let i=t.toLowerCase(),n=[];if(this.walkDir(this.baseDir,d=>{if(!d.endsWith(".md"))return;let p=k(this.baseDir,d);if(p.startsWith("raw/")||p.startsWith("_"))return;let m=this.readArticle(p);!m||!this.canRead(m.meta,e)||n.push(m)}),n.length===0)return[];let r=n.map(d=>d.content),a=h(this.baseDir,"_bm25_cache.json"),o=x(r,a),c=_(t,o),l=new Map(c.map(d=>[d.docIndex,d.score]));return n.map((d,p)=>{let m=l.get(p)??0;return d.meta.title.toLowerCase().includes(i)&&(m+=10),d.meta.tags?.some(u=>u.toLowerCase().includes(i))&&(m+=5),{article:d,score:m}}).filter(d=>d.score>0).sort((d,p)=>p.score-d.score).slice(0,s).map(d=>d.article)}async findRelevantReranked(t,e,s=10,i={}){let n=Math.max(s,i.shortlist??E),r=this.findRelevant(t,e,n);if(r.length<2)return r.slice(0,s);let a=r.map((l,g)=>({id:`c${g}`,title:l.meta.title||`(untitled ${g})`,tags:l.meta.tags,excerpt:l.content})),o=await C(M,R({query:t,candidates:a,excerptChars:i.excerptChars}),T(a),{incumbent:{best:a[0].id},features:{agent:e??"unknown"}});return!o||o.mode!=="active"?r.slice(0,s):j(o.answers,a).ranked.map(l=>r[Number(l.slice(1))]).filter(l=>!!l).slice(0,s)}findRelevant(t,e,s=3,i,n={graph:.6,bm25:.4}){let r=[];if(this.walkDir(this.baseDir,u=>{if(!u.endsWith(".md"))return;let f=k(this.baseDir,u);if(f.startsWith("raw/")||f.startsWith("_"))return;let y=this.readArticle(f);!y||!this.canRead(y.meta,e)||r.push(y)}),r.length===0)return[];let a=r.map(u=>`${u.meta.title} ${(u.meta.tags||[]).join(" ")} ${u.content}`),o=h(this.baseDir,"_bm25_relevance_cache.json"),c=x(a,o),l=_(t,c),g=l.reduce((u,f)=>Math.max(u,f.score),0)||1,d=new Map(l.map(u=>[u.docIndex,u.score/g])),p=!!(i&&i.length>0);return r.map((u,f)=>{let y=d.get(f)??0,W=0;p&&u.meta.graphPath?.length&&(W=O(i,u.meta.graphPath));let v=p?n.graph*W+n.bm25*y:y;return{article:u,score:v}}).filter(u=>u.score>0).sort((u,f)=>f.score-u.score).slice(0,s).map(u=>u.article)}buildContext(t,e=4e3){if(t.length===0)return"";let s=["[Wiki Knowledge]"],i=0;for(let n of t){let r=`
@@ -102,4 +102,4 @@ We use GitLab for version control.
102
102
  There are ${e.length} unprocessed entries. Read each, understand what it means, and create or update wiki articles.
103
103
 
104
104
  ${s}`}walkDir(t,e){if(w(t))for(let s of D(t)){let i=Y(t,s),n=F(i);n.isDirectory()?this.walkDir(i,e):e(i,n)}}};export{J as a};
105
- //# sourceMappingURL=chunk-STIZFWDJ.js.map
105
+ //# sourceMappingURL=chunk-COWWOA7H.js.map
@@ -1,4 +1,4 @@
1
- import t from"chalk";import{spawn as S}from"child_process";import{resolve as j}from"path";var E=l=>l||j(process.cwd(),".agentx/wiki");function N(l){return async d=>{let{claudeCliEnv:e}=await import("./workspace-env-ROH45HXN.js"),h=["-p","-","--output-format","json","--max-turns","1","--model",l,"--tools","","--strict-mcp-config","--mcp-config",'{"mcpServers":{}}',"--settings",'{"disableAllHooks":true}',"--setting-sources","","--no-session-persistence"],y=await new Promise(($,a)=>{let s=S("claude",h,{env:e(),stdio:["pipe","pipe","pipe"]}),p="",g="",i=setTimeout(()=>s.kill("SIGTERM"),24e4);s.stdout.on("data",r=>{p+=r}),s.stderr.on("data",r=>{g+=r}),s.on("error",r=>{clearTimeout(i),a(r)}),s.on("close",r=>{clearTimeout(i),r===0?$(p):a(new Error(`claude exited ${r}: ${g.trim().slice(0,200)}`))}),s.stdin.end(d)}),c=JSON.parse(y);if(c.is_error)throw new Error(`model error: ${String(c.result).slice(0,200)}`);return{text:String(c.result??""),costUsd:Number(c.total_cost_usd)||0}}}function I(l){l.command("enrich [entities...]").description("write a full overview, sourced typed facts and linked history on entity pages (person, organization, project, place, assets)").option("--dir <path>","wiki directory (default .agentx/wiki)").option("--types <list>","comma-separated entity types","person,organization,project,place,device,server,app,domain,account").option("--max <n>","most entities per run","10").option("--max-cost <usd>","stop before the next call once the run spent this much","1").option("--model <m>","model","sonnet").option("--force","redo entities whose sources did not change").option("--dry-run","show what would be written, write nothing").option("--create <title>","first create a page for a thing other pages only name, then enrich it (needs --as and --owner)").option("--as <type>","type of the page --create makes, e.g. organization").option("--owner <agent>","agent whose wiki gets the page --create makes").option("--json","print the run as JSON").action(async(d,e)=>{let{WikiHub:h}=await import("./hub-XGWCWKMT.js"),{GraphCache:y}=await import("./graph-ZVKV3JBD.js"),{loadOntology:c}=await import("./load-LQ2I2PQI.js"),{loadRoster:$}=await import("./roster-BZGKG2ZA.js"),{ENRICH_TYPES:a,loadEnrichState:s,runEnrich:p,saveEnrichState:g}=await import("./enrich-FPK3OW77.js"),i=E(e.dir),r=e.types.split(",").map(o=>o.trim()).filter(Boolean),b=r.filter(o=>!a.includes(o));if(b.length){console.error(t.red(` not an entity type this job handles: ${b.join(", ")} (use ${a.join(", ")})`)),process.exitCode=1;return}let x=Number(e.max);if(!Number.isInteger(x)||x<1){console.error(t.red(" --max must be a whole number of entities, 1 or more")),process.exitCode=1;return}let w=Number(e.maxCost);if(!Number.isFinite(w)||w<=0){console.error(t.red(" --max-cost must be a positive number of dollars")),process.exitCode=1;return}let m=new h(i,()=>{});if(e.create){let{createEntityPage:o}=await import("./enrich-FPK3OW77.js");if(!e.as||!a.includes(e.as)||!e.owner){console.error(t.red(` --create needs --as <${a.join("|")}> and --owner <agent>`)),process.exitCode=1;return}if(m.syncedFrom(e.owner)){console.error(t.red(` ${e.owner}'s pages are copied from another node; pick an agent that runs here`)),process.exitCode=1;return}if(e.dryRun)console.log(t.dim(` --dry-run: would create "${e.create}" (${e.as}) in ${e.owner}'s wiki`));else{let f=o(m,e.create,e.as,e.owner,new Date().toISOString().slice(0,10));console.log(f?t.green(` created ${e.owner}/${f}`):t.dim(` ${e.owner} already has a page titled "${e.create}"`))}d=[...d,e.create],r.includes(e.as)||r.push(e.as)}let{ontology:v}=c(i),k=new y().get(m,v,$(i,m.listAgents([]),v.agent_names)),C=s(i),u=await p(m,k,N(e.model),{types:r,only:d,max:x,maxCostUsd:w,dryRun:!!e.dryRun,force:!!e.force,today:new Date().toISOString().slice(0,10),save:o=>g(i,o)},C);if(e.json){console.log(JSON.stringify(u,null,2));return}for(let o of u.outcomes){let f=o.status==="written"?t.green("\u2713"):o.status==="dry-run"?t.cyan("~"):t.yellow("\xB7");console.log(` ${f} ${o.title} ${t.dim(`${o.status} \xB7 ${o.page??"no page"} \xB7 overview ${o.overview?"yes":"no"} \xB7 ${o.statements} facts \xB7 ${o.links} links \xB7 $${o.costUsd.toFixed(3)}`)}`);for(let n of o.facts??[])console.log(t.dim(` fact: ${n.property} \u2192 ${n.value}${n.role?` (${n.role})`:""} \xB7 source ${n.source}`));for(let n of o.dropped.slice(0,6))console.log(t.dim(` dropped: ${n}`));o.preview&&console.log(t.dim(o.preview.split(`
1
+ import t from"chalk";import{spawn as S}from"child_process";import{resolve as j}from"path";var E=l=>l||j(process.cwd(),".agentx/wiki");function N(l){return async d=>{let{claudeCliEnv:e}=await import("./workspace-env-ROH45HXN.js"),h=["-p","-","--output-format","json","--max-turns","1","--model",l,"--tools","","--strict-mcp-config","--mcp-config",'{"mcpServers":{}}',"--settings",'{"disableAllHooks":true}',"--setting-sources","","--no-session-persistence"],y=await new Promise(($,a)=>{let s=S("claude",h,{env:e(),stdio:["pipe","pipe","pipe"]}),p="",g="",i=setTimeout(()=>s.kill("SIGTERM"),24e4);s.stdout.on("data",r=>{p+=r}),s.stderr.on("data",r=>{g+=r}),s.on("error",r=>{clearTimeout(i),a(r)}),s.on("close",r=>{clearTimeout(i),r===0?$(p):a(new Error(`claude exited ${r}: ${g.trim().slice(0,200)}`))}),s.stdin.end(d)}),c=JSON.parse(y);if(c.is_error)throw new Error(`model error: ${String(c.result).slice(0,200)}`);return{text:String(c.result??""),costUsd:Number(c.total_cost_usd)||0}}}function I(l){l.command("enrich [entities...]").description("write a full overview, sourced typed facts and linked history on entity pages (person, organization, project, place, assets)").option("--dir <path>","wiki directory (default .agentx/wiki)").option("--types <list>","comma-separated entity types","person,organization,project,place,device,server,app,domain,account").option("--max <n>","most entities per run","10").option("--max-cost <usd>","stop before the next call once the run spent this much","1").option("--model <m>","model","sonnet").option("--force","redo entities whose sources did not change").option("--dry-run","show what would be written, write nothing").option("--create <title>","first create a page for a thing other pages only name, then enrich it (needs --as and --owner)").option("--as <type>","type of the page --create makes, e.g. organization").option("--owner <agent>","agent whose wiki gets the page --create makes").option("--json","print the run as JSON").action(async(d,e)=>{let{WikiHub:h}=await import("./hub-KTS6KFMG.js"),{GraphCache:y}=await import("./graph-ZVKV3JBD.js"),{loadOntology:c}=await import("./load-LQ2I2PQI.js"),{loadRoster:$}=await import("./roster-BZGKG2ZA.js"),{ENRICH_TYPES:a,loadEnrichState:s,runEnrich:p,saveEnrichState:g}=await import("./enrich-FPK3OW77.js"),i=E(e.dir),r=e.types.split(",").map(o=>o.trim()).filter(Boolean),b=r.filter(o=>!a.includes(o));if(b.length){console.error(t.red(` not an entity type this job handles: ${b.join(", ")} (use ${a.join(", ")})`)),process.exitCode=1;return}let x=Number(e.max);if(!Number.isInteger(x)||x<1){console.error(t.red(" --max must be a whole number of entities, 1 or more")),process.exitCode=1;return}let w=Number(e.maxCost);if(!Number.isFinite(w)||w<=0){console.error(t.red(" --max-cost must be a positive number of dollars")),process.exitCode=1;return}let m=new h(i,()=>{});if(e.create){let{createEntityPage:o}=await import("./enrich-FPK3OW77.js");if(!e.as||!a.includes(e.as)||!e.owner){console.error(t.red(` --create needs --as <${a.join("|")}> and --owner <agent>`)),process.exitCode=1;return}if(m.syncedFrom(e.owner)){console.error(t.red(` ${e.owner}'s pages are copied from another node; pick an agent that runs here`)),process.exitCode=1;return}if(e.dryRun)console.log(t.dim(` --dry-run: would create "${e.create}" (${e.as}) in ${e.owner}'s wiki`));else{let f=o(m,e.create,e.as,e.owner,new Date().toISOString().slice(0,10));console.log(f?t.green(` created ${e.owner}/${f}`):t.dim(` ${e.owner} already has a page titled "${e.create}"`))}d=[...d,e.create],r.includes(e.as)||r.push(e.as)}let{ontology:v}=c(i),k=new y().get(m,v,$(i,m.listAgents([]),v.agent_names)),C=s(i),u=await p(m,k,N(e.model),{types:r,only:d,max:x,maxCostUsd:w,dryRun:!!e.dryRun,force:!!e.force,today:new Date().toISOString().slice(0,10),save:o=>g(i,o)},C);if(e.json){console.log(JSON.stringify(u,null,2));return}for(let o of u.outcomes){let f=o.status==="written"?t.green("\u2713"):o.status==="dry-run"?t.cyan("~"):t.yellow("\xB7");console.log(` ${f} ${o.title} ${t.dim(`${o.status} \xB7 ${o.page??"no page"} \xB7 overview ${o.overview?"yes":"no"} \xB7 ${o.statements} facts \xB7 ${o.links} links \xB7 $${o.costUsd.toFixed(3)}`)}`);for(let n of o.facts??[])console.log(t.dim(` fact: ${n.property} \u2192 ${n.value}${n.role?` (${n.role})`:""} \xB7 source ${n.source}`));for(let n of o.dropped.slice(0,6))console.log(t.dim(` dropped: ${n}`));o.preview&&console.log(t.dim(o.preview.split(`
2
2
  `).slice(0,12).map(n=>` | ${n}`).join(`
3
3
  `)))}u.outcomes.length===0&&console.log(t.dim(" nothing to do: no entity of these types changed since the last run (--force redoes them)")),console.log(t.dim(` spent $${u.costUsd.toFixed(3)} of $${w}${u.capped?" \xB7 stopped at the cap":""}`))})}export{N as a,I as b};
4
- //# sourceMappingURL=chunk-WTMZW5X7.js.map
4
+ //# sourceMappingURL=chunk-CV7ISZKU.js.map
@@ -1,6 +1,6 @@
1
- import{d as h}from"./chunk-B65EC44C.js";var d=["main contact","primary contact","point of contact","billing contact","technical contact","decision maker"],f=/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g,w=/\b(role|title|position|job)\s*\**\s*[::]\s*\**\s*([^\n;|]+)/gi;function L(t,c,e=[]){let l=[c,...e].join(`
1
+ import{d as h}from"./chunk-NJHNV4QP.js";var d=["main contact","primary contact","point of contact","billing contact","technical contact","decision maker"],f=/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g,w=/\b(role|title|position|job)\s*\**\s*[::]\s*\**\s*([^\n;|]+)/gi;function L(t,c,e=[]){let l=[c,...e].join(`
2
2
  `),a=l.toLowerCase(),i=h(t,l);for(let s of p(t.match(f)??[]))a.includes(s.toLowerCase())||i.push(`email ${s}`);let m=t.toLowerCase();for(let s of d)m.includes(s)&&!a.includes(s)&&i.push(`marker "${s}"`);for(let s of t.matchAll(w)){let n=s[2].replace(/\*+/g,"").trim();n&&!a.includes(n.toLowerCase())&&i.push(`${s[1].toLowerCase()} "${n}"`)}return p(i)}function p(t){return[...new Set(t)]}var $=.9,g=/^\s*(?:wait\b|here(?:'s| is) the (?:updated|modified|patched|revised)|i (?:must|need to|will|should) (?:output|return|write)|(?:okay|ok|sure)[,.!]\s|let me\b|as requested\b)/im;function k(t,c){let e=[],l=t.split(`
3
3
  `).filter(o=>o.trim()).length,a=c.split(`
4
4
  `).filter(o=>o.trim()).length;l>=5&&a<Math.floor(l*$)&&e.push(`the article shrinks from ${l} to ${a} lines`);let i=c.match(g);i&&!t.match(g)&&e.push(`it contains the model's own commentary ("${i[0].trim().slice(0,40)}")`);let m=o=>{let r=new Map;for(let u of o.split(`
5
5
  `))/^#{1,6} /.test(u)&&r.set(u.trim(),(r.get(u.trim())??0)+1);return r},s=m(t);for(let[o,r]of m(c))r>1&&r>(s.get(o)??0)&&e.push(`the heading "${o}" appears ${r} times`);let n=L(t,c);return n.length&&e.push(`it drops ${n.length} fact(s): ${n.slice(0,6).join(", ")}${n.length>6?", \u2026":""}`),e}export{L as a,k as b};
6
- //# sourceMappingURL=chunk-O6WW7ATO.js.map
6
+ //# sourceMappingURL=chunk-HPGMY6YB.js.map
@@ -0,0 +1,54 @@
1
+ import{b as z,d as H,h as dt}from"./chunk-BRK6M6LA.js";import{l as W,m as K,n as ct}from"./chunk-UIBUZ2N3.js";import{a as U,e as ut}from"./chunk-2QNT5JDS.js";import{a as f,b as lt}from"./chunk-QIJLFPWE.js";import{z as l}from"zod";var mt,ft,gt,pt,bt,ht,xt,yt,wt,X,Z=f(()=>{"use strict";mt=l.enum(["mon","tue","wed","thu","fri","sat","sun"]),ft=l.object({days:l.array(mt).default(["mon","tue","wed","thu","fri"]),start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/),lunch:l.object({start:l.string().regex(/^\d{2}:\d{2}$/),end:l.string().regex(/^\d{2}:\d{2}$/)}).optional()}),gt=l.object({title:l.string(),responsibilities:l.array(l.string()).default([]),sopPath:l.string().optional(),kpis:l.array(l.string()).default([])}),pt=l.object({role:l.string(),reportsTo:l.string().optional(),schedule:ft,utilizationTarget:l.number().min(0).max(1).default(.8)}),bt=l.object({channel:l.string(),chatId:l.string(),accountId:l.string().optional()}),ht=l.discriminatedUnion("type",[l.object({type:l.literal("backlog"),path:l.string().default(".agentx/backlog.md")}),l.object({type:l.literal("gitlab"),projects:l.array(l.string()).default([])}),l.object({type:l.literal("wiki"),path:l.string(),glob:l.string().default("**/*.md")})]),xt=l.object({id:l.string(),pm:l.string().optional(),client:l.string().optional()}),yt=l.object({channel:l.string().optional(),chatId:l.string().optional(),username:l.string().optional(),senderId:l.string().optional(),client:l.string(),project:l.string().optional(),displayName:l.string().optional()}),wt=l.object({name:l.string().optional(),kind:l.enum(["client","internal","own"]).optional(),respondWithin:l.string().optional(),standing:l.array(l.string()).default([])}),X=l.object({enabled:l.boolean().default(!1),timezone:l.string().default("UTC"),mainChannel:bt,workSource:ht,roles:l.record(l.string(),gt).default({}),orgChart:l.record(l.string(),pt).default({}),projects:l.array(xt).default([]),contactMap:l.array(yt).default([]),clients:l.record(l.string(),wt).default({}),workTickMinutes:l.number().int().min(1).max(60).default(15),idleQueueThreshold:l.number().int().min(0).default(0),standup:l.object({enabled:l.boolean().default(!0),plansDir:l.string().default(".agentx/plans"),maxAgentsPerDay:l.number().int().min(1).max(100).default(20),dryRun:l.boolean().default(!1)}).default({})})});import{z as u}from"zod";function Jn(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 Qn(r,t){let n=[],a=[],o=!1,i=!1;return t.kind==="scoped-label"&&t.scopedLabel?n.push(t.scopedLabel):t.kind==="label"&&t.mapsToLabel?n.push(t.mapsToLabel):t.kind==="closed"&&(o=!0),r&&(r.kind==="scoped-label"&&r.scopedLabel?a.push(r.scopedLabel):r.kind==="label"&&r.mapsToLabel?a.push(r.mapsToLabel):r.kind==="closed"&&t.kind!=="closed"&&(i=!0)),{addLabels:n.length?n:void 0,removeLabels:a.length?a:void 0,closeIssue:o||void 0,reopen:i||void 0}}var St,kt,_t,Et,vt,Tt,V,At,G,Y=f(()=>{"use strict";St=u.object({name:u.string(),color:u.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:u.string().optional()}),kt=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:u.string(),kind:u.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:u.string().optional(),scopedLabel:u.string().optional(),scopedPrefix:u.string().default("Status"),accent:u.string().optional()}),_t=u.object({enabled:u.boolean().default(!0),staleDoingMinutes:u.number().int().min(1).default(45),respectLunchBreak:u.boolean().default(!0),respectSchedule:u.boolean().default(!0),action:u.enum(["badge","notify"]).default("badge")}),Et=u.discriminatedUnion("type",[u.object({type:u.literal("gitlab"),projects:u.array(u.string()).min(1)})]),vt=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],Tt=u.object({id:u.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:u.string(),source:Et,primaryToolLabel:u.string().optional(),labels:u.array(St).default([]),columns:u.array(kt).min(1).default(vt),timeRangeDays:u.number().int().min(1).max(365).default(30),closedWindowDays:u.number().int().min(1).max(365).default(30),reconciliation:_t.default({})}),V=u.array(Tt).default([]),At=u.object({name:u.string(),url:u.string(),dashboardUrl:u.string().optional(),token:u.string().optional(),dashboardToken:u.string().optional()}),G=u.object({enabled:u.boolean().default(!1),port:u.number().int().default(4202),bind:u.string().default("127.0.0.1"),token:u.string().optional(),daemonUrl:u.string().default("http://localhost:18800"),daemons:u.array(At).default([]),draftAgent:u.string().optional()}).default({})});function Lt(r){let t=String(r??"").trim().toLowerCase();if(!t)return{ok:!1,error:"is empty"};let n=t.split("+").map(i=>i.trim());if(n.some(i=>!i))return{ok:!1,error:`"${r}" has an empty part; write it like opt+space`};let a=jt[n[n.length-1]]??n[n.length-1],o=new Set;for(let i of n.slice(0,-1)){let s=Rt[i];if(!s)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(o.has(s))return{ok:!1,error:`"${r}" names ${s} twice`};o.add(s)}return Ot(a)?!J(a)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${r}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...It.filter(i=>o.has(i)),a].join("+")}:{ok:!1,error:`"${a}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function Q(r){let t=Lt(r);return t.ok?void 0:t.error}function tr(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 Rt,It,Ct,jt,J,Ot,E,ee=f(()=>{"use strict";Rt={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},It=["ctrl","opt","shift","cmd"],Ct=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],jt={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},J=r=>/^f([1-9]|1[0-9]|20)$/.test(r),Ot=r=>/^[a-z0-9]$/.test(r)||Ct.includes(r)||J(r);E={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function re(r){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!t)return null;let[n,a,o]=t.slice(1).map(g=>parseInt(g,16)/255),i=Math.max(n,a,o),s=Math.min(n,a,o),d=i-s;return d<.04?null:((i===n?(a-o)/d%6:i===a?(o-n)/d+2:(n-a)/d+4)*60+360)%360}function Nt(r){let t=re(r);if(t===null)return S.find(o=>o.id==="lagoon");let n=S[0],a=360;for(let o of S){let i=Math.abs(o.hue-t),s=Math.min(i,360-i);s<a&&(n=o,a=s)}return n}function rr(r,t=v){let n=s=>S.find(d=>d.id===s),a=n(r?.palette);if(a)return{...a,set:!0};let o=r?.color;return{...o&&re(o)!==null?Nt(o):n(t)??n(v),set:!1}}var S,te,ne,N,v,ae=f(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],te=["orb","character"],ne=["off","rarely","sometimes","often"],N=S.map(r=>r.id);v="lagoon"});function oe(r){let t=(r.match(/[؀-ۿ]/g)??[]).length,n=(r.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(t&&t>=n)return"ar";let a=0,o=0;for(let i of r.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])$t.has(i)&&a++,Dt.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:Pt.test(i)&&(o+=.5);return a===o?null:a>o?"en":"fr"}var $t,Dt,Pt,ie=f(()=>{"use strict";$t=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),Dt=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),Pt=/[éèêëàâçùûîïôœ]/});function sr(r,t=$){let n=r;if(n=n.replace(/```[\s\S]*?```/g,". "),n=n.replace(/`[^`]*`/g,""),n=n.replace(/\*\*(.*?)\*\*/g,"$1"),n=n.replace(/__(.*?)__/g,"$1"),n=n.replace(/\*([^*]+)\*/g,"$1"),n=n.replace(/_([^_]+)_/g,"$1"),n=n.replace(/~~(.*?)~~/g,"$1"),n=n.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),n=n.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),n=n.replace(/^#{1,6}\s+/gm,""),n=n.replace(/^[\s]*[-*+]\s+/gm,". "),n=n.replace(/^[\s]*\d+\.\s+/gm,". "),n=n.replace(/^[-=_]{3,}$/gm,""),n=n.replace(/^>\s*/gm,""),n=n.replace(/https?:\/\/\S+/g,"link"),n=n.replace(/\/\w+(\/\w+)+/g,a=>a.split("/").filter(Boolean).join(" slash ")),n=n.replace(/&/g," and "),n=n.replace(/@/g," at "),n=n.replace(/=>/g," returns "),n=n.replace(/->/g," to "),n=n.replace(/\|/g," or "),n=n.replace(/\be\.g\./gi,"for example"),n=n.replace(/\bi\.e\./gi,"that is"),n=n.replace(/\betc\./gi,"etcetera"),n=n.replace(/\bvs\.?\b/gi,"versus"),n=n.replace(/\n{2,}/g,". "),n=n.replace(/\n/g," "),n=n.replace(/\s+/g," "),n=n.replace(/\.\s*\./g,"."),n=n.replace(/\s+([.,!?])/g,"$1"),n=n.trim().replace(/^[.,:;]+\s*/,""),n.length>t){let a=n.slice(0,t),o=([...n.slice(0,t+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;n=(o>=t/2?a.slice(0,o):a.replace(/\s+\S*$/,"")+"...")+" "+qt[oe(a)??"en"]}return n}var $,qt,se=f(()=>{"use strict";ie();$=500,qt={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});function dr(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,ur,le,ue=f(()=>{"use strict";D=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],ur="I didn't catch that.",le=r=>r.toLowerCase().replace(/[_\s]+/g," ").trim()});import{randomBytes as Mt}from"crypto";function Ht(r){try{return process.kill(r,0),!0}catch(t){return t?.code==="EPERM"}}function fr(r,t=Date.now()){if(!r.held)return"The floor is free.";let n=Math.max(0,Math.round(((r.expiresAt??t)-t)/1e3)),a=[r.sound?"plays sound":"",r.hide?"character and bubbles hidden":""].filter(Boolean).join(", ");return`The floor is held by ${r.holder}${a?` (${a})`:""} for up to ${n} more seconds: other lines wait until it is free.`}var T,Ft,Bt,Ut,zt,de,ce=f(()=>{"use strict";T={enabled:!0,defaultSeconds:120,maxSeconds:1800},Ft=80,Bt=/^[a-f0-9]{24}$/,Ut=25e3,zt=2e3;de=class{constructor(t={}){this.deps=t;this.now=t.now??Date.now,this.alive=t.alive??Ht}hold=null;seq=0;ended=null;expiry=null;watch=null;waiters=new Set;now;alive;get settings(){return{...T,...this.deps.settings?.()}}get current(){return this.hold&&this.now()>=this.hold.expiresAt&&this.end("expired"),this.hold}view(){let t=this.current;return{seq:this.seq,held:!!t,holder:t?.holder??null,agentId:t?.agentId??null,sound:t?.sound??!1,hide:t?.hide??!1,since:t?.since??null,expiresAt:t?.expiresAt??null,ended:this.ended}}holds(t){let n=this.current;return!!n&&typeof t=="string"&&t===n.id}take(t){let n=this.settings,a=(it,st)=>({ok:!1,reason:it,error:st,view:this.view()});if(!n.enabled)return a("off","The floor is off on this computer (voice.floor.enabled)");let o=String(t.holder??"").replace(/\s+/g," ").trim().slice(0,Ft),i=t.seconds??Math.min(n.defaultSeconds,n.maxSeconds),s=t.pid??null,d=t.id??Mt(12).toString("hex");if(!Bt.test(d))return a("invalid","id is 24 hex characters, as a take returned it");if(!o||!Number.isFinite(i)||i<=0||i>n.maxSeconds||s!==null&&!(Number.isInteger(s)&&s>1))return a("invalid",`Required: holder (who takes the floor); seconds is up to ${n.maxSeconds}; pid is a process on this computer`);let m=this.current;if(m)return a("held",`The floor is held by ${m.holder}`);let g=this.deps.busy?.();if(g)return a("busy",`The floor is taken by ${g}`);if(s!==null&&!this.alive(s))return a("invalid",`No process ${s} runs on this computer`);let h=this.now(),_={id:d,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=Ut,a){return t!==this.view().seq?Promise.resolve(this.view()):new Promise(o=>{let i=()=>{clearTimeout(s),this.waiters.delete(i),o(this.view())},s=setTimeout(i,n);s.unref?.(),this.waiters.add(i),a?.addEventListener("abort",i,{once:!0})})}close(){this.disarm();for(let t of[...this.waiters])t()}end(t){this.hold&&(this.hold=null,this.ended=t,this.disarm(),this.changed())}arm(){this.disarm();let t=this.hold;if(!t||(this.expiry=setTimeout(()=>{this.hold===t&&this.view()},Math.max(0,t.expiresAt-this.now())+5),this.expiry.unref?.(),t.pid===null))return;let n=t.pid;this.watch=setInterval(()=>{this.hold===t&&!this.alive(n)&&this.end("holder gone")},zt),this.watch.unref?.()}disarm(){this.expiry&&clearTimeout(this.expiry),this.watch&&clearInterval(this.watch),this.expiry=this.watch=null}changed(){this.seq++;try{this.deps.onChange?.(this.view(),this.hold?.id??null)}catch{}for(let t of[...this.waiters])t()}}});import{z as c}from"zod";var me,Wt,fe,ge=f(()=>{"use strict";me=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Wt=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:me,end:me}).optional(),autoAck:c.boolean().default(!1)}).refine(r=>r.chats.length>0||r.senders.length>0,{message:"a rule needs at least one chat or sender"}),fe=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(Wt).default([])}).default({})});function Kt(r){r.exec(`
2
+ CREATE TABLE IF NOT EXISTS requests (
3
+ id TEXT PRIMARY KEY,
4
+ state TEXT NOT NULL,
5
+ channel TEXT NOT NULL,
6
+ chat_id TEXT NOT NULL,
7
+ sender TEXT,
8
+ agent_id TEXT NOT NULL,
9
+ text TEXT NOT NULL,
10
+ created_at INTEGER NOT NULL,
11
+ updated_at INTEGER NOT NULL,
12
+ attention_reason TEXT,
13
+ notified_at INTEGER,
14
+ question TEXT,
15
+ closed_at INTEGER,
16
+ evidence TEXT,
17
+ close_reason TEXT
18
+ );
19
+ CREATE INDEX IF NOT EXISTS idx_requests_state_created ON requests(state, created_at);
20
+ CREATE INDEX IF NOT EXISTS idx_requests_chat ON requests(agent_id, channel, chat_id, created_at);
21
+ CREATE TABLE IF NOT EXISTS request_links (
22
+ request_id TEXT NOT NULL,
23
+ kind TEXT NOT NULL,
24
+ ref TEXT NOT NULL,
25
+ at INTEGER NOT NULL,
26
+ PRIMARY KEY (kind, ref),
27
+ FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
28
+ );
29
+ CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
30
+ `),K(r,"requests",W);let t=r.prepare("PRAGMA table_info(requests)").all();for(let[n,a]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"]])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 xr(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";ct();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;Kt(t),t.pragma("foreign_keys = ON")}addCandidate(t){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
31
+ VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.channel,t.chatId,t.sender??null,t.person??null,t.agentId,t.text.slice(0,P),t.now,t.now),this.link(t.id,"run",t.runId,t.now)}get(t){let n=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(t);return n?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
+ FROM request_links l JOIN task_traces t ON t.task_id = l.ref
33
+ WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
34
+ ORDER BY t.started_at DESC LIMIT 1`).get(t)??null}catch{return null}}touch(t,n){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(n,t)}progress(t,n,a="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
35
+ WHERE id = ? AND state NOT IN (${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
+ WHERE id = ? AND state = 'needs_attention'`).run(n,n,t).changes>0}handOff(t,n,a,o){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
40
+ question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
41
+ WHERE id = ? AND state IN (${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 Sr(r){return Object.assign({channel:ye,chatId:r,sender:"operator"},{[we]:!0})}function kr(r){return!!r&&r[we]===!0}function Vt(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&&!Xt.has((n?.name??"").toLowerCase());let i=Zt.has(o)?n?.username:n?.id,s=i?he(o,i):"";return s?r.from.some(d=>{let m=d.trim().toLowerCase(),g=m.indexOf(":");return g>0&&m.slice(0,g)===o&&he(o,m.slice(g+1))===s}):!1}function _r(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 Gt(r){return/\btimed? ?out\b|timeout/i.test(r)?"timed out":"failed"}var ye,we,R,Xt,A,Zt,he,w,k,xe,Se=f(()=>{"use strict";be();ye="requests",we=Symbol("requests.pickup");R=new Set(["voice","app","dashboard","webrtc"]),Xt=new Set(["camera"]),A=r=>r.toLowerCase().split("@")[0],Zt=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||!(Vt(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=Gt(t.error);this.store.needsAttention(a.id,`${t.agentId} ${i}: ${w(t.error)}`,o)&&this.log(`[requests] ${a.id} needs attention: run ${t.taskId} ${i}`);return}a.state==="candidate"?this.store.discardCandidate(a.id):this.store.touch(a.id,o)}})}delegationStarted(t){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let n=this.live.get(k(t.caller,t.origin.channel,t.origin.chatId));if(!n)return;let a=this.now();this.store.link(n.requestId,"delegation",t.id,a),this.store.progress(n.requestId,a,"waiting_other")})}delegationDone(t,n,a){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=this.now(),s=t.peer?`${t.callee} on ${t.peer}`:t.callee;if(n==="done"){this.store.progress(o.id,i);return}let d={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[n];this.store.needsAttention(o.id,`The work handed to ${s} ${d}: ${w(a)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} ${n}`)})}relayFailed(t,n,a){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",t.id);if(!o)return;let i=t.peer?`${t.callee} on ${t.peer}`:t.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${w(a)}). It said: ${w(n)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${t.id} answer not relayed`)})}cardRaised(t,n){n&&this.guard("card",()=>{if(!this.settings().enabled)return;let a=this.live.get(k(t.raised_by,n.channel,n.chatId))?.requestId;if(!a)return;let o=this.now();this.store.link(a,"card",t.id,o),this.store.waitOnOwner(a,t.ask,o)})}cardResolved(t){this.guard("card result",()=>{let n=this.store.byLink("card",t.id);if(!n)return;let a=this.now(),o=t.outcome??t.if_silent;t.status==="decided"||t.status==="resolved"?n.state==="waiting_owner"&&this.store.progress(n.id,a):this.store.needsAttention(n.id,`Your answer did not come before the card expired (${w(t.ask)}); "${o}" was applied`,a)&&this.log(`[requests] ${n.id} needs attention: card ${t.id} expired unanswered`)})}closingNote(t){try{let n=this.store.byLink("delegation",t);return!n||!y.includes(n.state)?void 0:`This is part of the owner's open request ${n.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${n.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(t){this.guard("restart",()=>{let n=this.store.byLink("run",t.taskId);if(!n)return;let a=this.now();t.decision==="resumed"?n.state==="candidate"?this.store.touch(n.id,a):this.store.progress(n.id,a):(t.decision==="reported"||t.decision==="resume-failed"||t.decision==="skipped")&&this.store.needsAttention(n.id,`Cut off by a restart and not picked up again (${w(t.reason)})`,a)&&this.log(`[requests] ${n.id} needs attention: run ${t.taskId} cut off by a restart`)})}}});import{randomBytes as Yt,timingSafeEqual as _e}from"crypto";import{chmodSync as Jt,existsSync as Qt,mkdirSync as en,readFileSync as tn,writeFileSync as nn}from"fs";import{networkInterfaces as rn}from"os";import{dirname as an,resolve as on}from"path";function Ir(r){return Object.assign(r,{[Ee]:!0})}function ve(r){return!!r&&r[Ee]===!0}function ln(r=process.cwd()){return on(r,".agentx","operator.key")}function Cr(r=process.cwd(),t={}){let n=ln(r);try{if(Qt(n)){let o=tn(n,"utf-8").trim();if(o)return o}if(!t.create)return null;let a=Yt(32).toString("hex");return en(an(n),{recursive:!0}),nn(n,a+`
42
+ `,{mode:384}),Jt(n,384),a}catch{return null}}function un(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 cn(r,t,n,a){if(!r||typeof r!="object")return!1;let o=String(r.channel??"").toLowerCase().split("@")[0];return a.has(o)?un(n,t[sn]):!1}function mn(r,t){let n=r[dn];if((Array.isArray(n)?n[0]:n)!=="1")return!1;let a=r.authorization,o=(Array.isArray(a)?a[0]:a)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let s=Buffer.from(i);for(let d of t){if(!d)continue;let m=Buffer.from(d);if(m.length===s.length&&_e(m,s))return!0}return!1}function fn(r,t=gn()){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 gn(){return Object.values(rn()).flatMap(r=>(r??[]).map(t=>t.address))}function jr(r,t,n){if(cn(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)||fn(t.remoteAddress,n.ownAddresses)?!1:mn(t.headers,n.peerTokens)}var sn,Ee,dn,ke,Te=f(()=>{"use strict";sn="x-agentx-operator",Ee=Symbol("requests.operator");dn="x-agentx-operator-vouch";ke=r=>r.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function Pr(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}`,d=n.get(s);if(d&&d!==a.id)return`identity "${o}" belongs to both "${d}" and "${a.id}"`;n.set(s,a.id)}}return null}function pn(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(d=>{let m=Re(d);return!!m&&m.channel===a&&i.includes(m.value)}))??null:null}function bn(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)?bn(r):null;let o=s=>typeof s=="string"?s:void 0,i=pn(r,a,{id:o(t.senderId),username:o(t.senderUsername)});return i?{id:i.id,role:i.role}:null}function hn(r,t){let n=r.agents??[];return r.role==="owner"||n.length===0||n.includes(t)}function qr(r,t,n){let a=Ce(r,n);if(!a)return null;let o=r.find(s=>s.id===a.id);if(!o||hn(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 Mr(r,t){let n=r.trim().split("*").map(a=>a.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(t.trim())}function Fr(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 Dr,I,M,je=f(()=>{"use strict";dt();Se();Te();Dr=["owner","member","client","guest"],I="owner";M=r=>r.toLowerCase().split("@")[0]});function zr(r){return typeof r=="string"&&yn.includes(r)}function Oe(r){let t=new Set(xn);return r.map(n=>n.trim()).filter(n=>n&&!t.has(n))}var xn,yn,Ur,Le=f(()=>{"use strict";xn=["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"],yn=["read","full"],Ur=["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 Xn={};lt(Xn,{INTEGRATION_KINDS:()=>An,WIKI_CONTRIBUTE_JOB:()=>tt,WIKI_CONTRIBUTE_MERGE_JOB:()=>nt,WIKI_SUMMARIZE_JOB:()=>F,approvalsConfigSchema:()=>Qe,callsSchema:()=>We,cameraBotSchema:()=>ze,daemonConfigSchema:()=>et,eventSubscriptionSchema:()=>Ue,expandEnvVars:()=>L,isCronExpression:()=>He,loadDaemonConfig:()=>Wn,membersConfigSchema:()=>Ye,peopleConfigSchema:()=>Ge,personSchema:()=>Ve,requestStatusConfigSchema:()=>Je,requestsConfigSchema:()=>Ze,reviewGateConfigSchema:()=>Ke,validateWorkspaces:()=>Kn,watchersConfigSchema:()=>Xe,withContributionJobs:()=>rt,withSummariesJob:()=>at});import{z as e}from"zod";import{readFileSync as qe,existsSync as j}from"fs";import{resolve as O}from"path";function wn(r){let t=O(r,".env");if(!j(t))return;let n=qe(t,"utf-8");for(let a of n.split(`
43
+ `)){let o=a.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let s=o.slice(0,i).trim(),d=o.slice(i+1).trim();process.env[s]||(process.env[s]=d)}}function 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[d,m]=t[o],g=s[2]===void 0?d:Number(s[2]),h=s[3]===void 0?g:Number(s[3]),_=s[4]===void 0?1:Number(s[4]);return g>=d&&h<=m&&g<=h&&_>=1}))}function jn(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 Hn(r,t){let n=[],a=new Set;for(let o of r){let i=o.path.join("."),s=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(s&&o.message.toLowerCase().includes("required")){let d=s[1],m=`tg:${d}`;if(a.has(m))continue;a.add(m),n.push(`Hint: Telegram account "${d}" is enabled but has no bot token.
44
+ Either:
45
+ A) Open ${t} and set channels.telegram.accounts.${d}.token to your bot token (or "\${TG_${d.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
46
+ B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${d}).`)}}return n}function Wn(r){let t=r?[r]:[O(process.cwd(),"agentx.json"),O(process.cwd(),".agentx/config.json")];wn(process.cwd());let n,a;for(let d of t)if(j(d)){n=qe(d,"utf-8"),a=d;break}if(!n||!a)throw new Error(`No config found. Create agentx.json or .agentx/config.json
47
+ Searched: ${t.join(", ")}`);let o;try{o=JSON.parse(n)}catch(d){throw new Error(`Invalid JSON in ${a}: ${d.message}`)}let i=L(o),s=et.safeParse(i);if(!s.success){let d=s.error.issues.map(h=>` ${h.path.join(".")}: ${h.message}`).join(`
48
+ `),m=Hn(s.error.issues,a),g=m.length?`
49
+
50
+ ${m.join(`
51
+
52
+ `)}`:"";throw new Error(`Config validation failed (${a}):
53
+ ${d}${g}`)}return at(rt(s.data))}function Kn(r){let t=[];for(let[n,a]of Object.entries(r.agents)){if(!j(a.workspace)){t.push(`Agent "${n}": workspace not found at ${a.workspace}`);continue}if(a.tier==="claude-code"){let s=O(a.workspace,".claude");j(s)||t.push(`Agent "${n}": no .claude/ directory in workspace ${a.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=a.provider||"claude",i=r.providers[o];!["claude-code","codex-cli","opencode"].includes(a.tier)&&(!i||!i.apiKey)&&t.push(`Agent "${n}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[n,a]of Object.entries(r.crons))r.agents[a.agent]||t.push(`Cron "${n}": references unknown agent "${a.agent}"`);if(r.channels.telegram.enabled)for(let[n,a]of Object.entries(r.channels.telegram.accounts))r.agents[a.agentBinding]||t.push(`Telegram account "${n}": references unknown agent "${a.agentBinding}"`);return t}function rt(r,t=ot()){let n=Object.entries(r.agents).filter(([,s])=>s.wiki?.contribute?.enabled).map(([s])=>s).sort();if(n.length===0)return r;let a=r.wiki.contributions,o=(s,d)=>B.parse({schedule:s,timezone:a.timezone,agent:n[0],command:d,timeout:3600,onError:"log"}),i={[tt]:o(a.schedule,`${t} wiki contribute --all`),[nt]:o(a.mergeSchedule,`${t} wiki contributions merge`)};return{...r,crons:{...i,...r.crons}}}function at(r,t=ot()){let n=r.wiki.summaries,a=n.agent??r.node.defaultAgent??Object.keys(r.agents).sort()[0];if(!n.schedule?.trim()||!a)return r;let o=B.safeParse({schedule:n.schedule,timezone:n.timezone,agent:a,command:`${t} wiki summarize --all`,timeout:3600,onError:"log"});if(!o.success)throw new Error(`wiki.summaries: the ${F} job can't be built: ${o.error.issues.map(i=>i.message).join("; ")}`);return{...r,crons:{[F]:o.data,...r.crons}}}function ot(){let r=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(r)?`"${process.execPath}" "${r}"`:"agentx"}var Ne,Sn,kn,_n,En,vn,Tn,An,Me,Fe,C,Be,Ue,Rn,In,ze,Cn,B,$e,De,Pe,On,Ln,Nn,$n,Dn,Pn,qn,Mn,Fn,We,Bn,Un,zn,Ke,Xe,Ze,Ve,Ge,Ye,Je,Qe,et,tt,nt,F,Zn=f(()=>{Z();Y();ut();ee();ae();se();ue();ce();ge();je();Le();Ne=e.array(e.string().min(1)).superRefine((r,t)=>{let n=Oe(r);n.length&&t.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${n.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),Sn=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),kn=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),_n=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),En=e.union([_n,kn]),vn=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(),Tn=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:vn.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),An=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Me=e.enum(["system","elevenlabs"]),Fe=e.union([e.string(),e.record(e.string(),e.string())]),C=e.string().superRefine((r,t)=>{let n=Q(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${n}`})}),Be=e.object({provider:Me.optional(),system:Fe.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:C.optional()}),Ue=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),Rn=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(),En).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(Tn).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()}),In=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({}),Cn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),In).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()},On=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)})]),Ln=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"}),Nn=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()}),$n=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),Dn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),Pn=e.object({enabled:e.boolean().default(!1),peers:e.array($n).default([]),inboxes:e.array(Dn).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({})}),qn=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({}),Mn=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({}),Fn=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(),Mn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),We=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0),busy:e.object({retryMinutes:e.number().int().min(1).max(60).default(5),maxWaitMinutes:e.number().int().min(1).max(240).default(10),title:e.string().min(1).max(120).default("Call waiting: {agent}"),notice:e.string().min(1).max(200).default("AgentX Voice is busy. The call rings when it is free.")}).default({})}).default({}),Bn=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({}),Un=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),zn=e.object({maxPixels:e.number().int().positive().default(12e5),timeoutMs:e.number().int().positive().default(5e3),intervalMs:e.number().int().positive().default(100),changeThreshold:e.number().min(0).max(1).default(.015),stableMs:e.number().int().nonnegative().default(400),regions:e.record(e.string().regex(/^[a-z][\w-]*$/),Un).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),Ke=e.object({enabled:e.boolean().default(!1),mode:e.enum(["advisory","required"]).default("advisory"),reviewer:e.object({agent:e.string().min(1).optional(),model:e.string().min(1).optional()}).default({}),paths:e.array(e.string().min(1)).default([]),maxCostPerReview:e.number().min(0).default(2),maxMinutes:e.number().positive().max(120).default(10),maxReviewsPerPrPerDay:e.number().int().min(0).max(100).default(6),ciWaitMinutes:e.number().min(0).max(60).default(5),maxDiffKb:e.number().int().positive().max(2048).default(256)}).default({}),Xe=e.object({enabled:e.boolean().default(!1),skipChannels:e.array(e.string().min(1)).default([]),defaultDueMinutes:e.number().positive().max(30*24*60).default(120),noBelow:e.number().min(0).max(1).default(.2),yesAt:e.number().min(0).max(1).default(.7),escalateAfterMinutes:e.number().positive().max(7*24*60).default(30),owner:e.object({channel:e.string().min(1).optional(),chatId:e.string().min(1).optional()}).default({}),retentionDays:e.number().positive().max(3650).default(30),doneSignal:e.enum(["result","explicit"]).default("result")}).default({}).refine(r=>r.noBelow<=r.yesAt,{message:"watchers.noBelow must not be above watchers.yesAt"}),Ze=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),Ve=e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]{0,39}$/,"lower-case letters, digits, - and _"),name:e.string().min(1).max(80),say:e.string().trim().min(1).max(120).optional(),role:e.enum(["owner","member","client","guest"]).default("member"),identities:e.array(e.string().regex(/^[A-Za-z][\w-]*:\S.*$/,"write it as channel:id")).default([]),agents:e.array(e.string().min(1)).default([]),deny:e.object({tools:e.array(e.string().min(1)).default([]),skills:e.array(e.string().min(1)).default([])}).strict().default({})}),Ge=e.array(Ve).default([]).superRefine((r,t)=>{let n=Ie(r);n&&t.addIssue({code:e.ZodIssueCode.custom,message:n})}),Ye=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Je=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Qe=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),forwardTo:e.string().min(1).optional(),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(r=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:r}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),et=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional(),connectAttemptTimeoutMs:e.number().int().min(250).max(6e4).default(5e3)}),providers:e.record(e.string(),Sn).default({}),agents:e.record(e.string(),Rn).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(On).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(jn,'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:Cn.default({}),crons:e.record(e.string(),B).default({}),wikiNotes:Ln.default({}),services:e.record(e.string(),Nn).default({}),notifications:Bn,calls:We,whatsappTriage:fe,approvals:Qe,quality:e.object({specTests:e.object({enabled:e.boolean().default(!1),paths:e.array(e.string().min(1)).default(["src/daemon"]),agent:e.string().min(1).default("spec-tests"),model:e.string().min(1).optional(),maxCostPerIssue:e.number().positive().max(100).default(2),maxMinutes:e.number().int().min(1).max(120).default(20)}).default({}),canary:e.object({enabled:e.boolean().default(!1),soakMinutes:e.number().int().min(1).max(10080).default(120),thresholds:e.object({maxRestarts:e.number().int().min(0).default(1),maxCrashes:e.number().int().min(0).default(0),maxFailedTasks:e.number().int().min(0).default(3),maxErrorRateIncrease:e.number().min(0).max(1).default(.1),minTasksForRate:e.number().int().min(1).default(10)}).default({})}).default({}),reviewGate:Ke}).default({}),shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),signals:e.object({enabled:e.boolean().default(!0),windDownSeconds:e.number().int().min(10).max(1800).default(120),allowAgents:e.array(e.string().min(1)).default([]),allowPeers:e.array(e.string().min(1)).default([]),maxPerRoot:e.number().int().min(1).max(100).default(6)}).default({}),requests:Ze,watchers:Xe,people:Ge,members:Ye,requestStatus:Je,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),app:e.object({android:e.object({packageName:e.string().regex(/^[a-zA-Z][\w]*(\.[a-zA-Z][\w]*)+$/,"must look like com.example.app").default("dev.agentx.phone"),certFingerprints:e.array(e.string().regex(/^([0-9A-Fa-f]{2}:){31}[0-9A-Fa-f]{2}$/,"must be 32 hex pairs separated by colons")).default([])}).default({}),places:e.object({enabled:e.boolean().default(!0),file:e.string().min(1).default(".agentx/places.json"),defaultRadiusMeters:e.number().int().min(50).max(5e4).default(150),minRadiusMeters:e.number().int().min(50).max(5e4).default(100),maxRadiusMeters:e.number().int().min(50).max(5e4).default(5e3),maxPlaces:e.number().int().min(1).max(100).default(50),maxRulesPerPlace:e.number().int().min(1).max(50).default(10),cooldownMinutes:e.number().int().min(0).max(1440).default(10),maxEventAgeMinutes:e.number().int().min(1).max(1440).default(30),syncMinutes:e.number().int().min(15).max(1440).default(60)}).default({})}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:zn,mesh:Pn.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:qn,decisions:Fn,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),followUp:e.object({enabled:e.boolean().default(!0),agents:e.record(e.boolean()).default({}),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(2),approval:e.enum(["start","step"]).default("step")}).default({}),required:e.object({enabled:e.boolean().default(!1),agents:e.record(e.boolean()).default({}),exemptQuestions:e.boolean().default(!0),retentionDays:e.number().int().min(0).max(3650).default(30)}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),tierTwoThresholdTokensByChannel:e.record(e.number().int().min(5e4).max(2e5)).default({}),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(0).max(1e4).optional(),maxClaudeCodeDispatchesPer5h:e.number().int().min(0).max(5e4).optional(),continuityStateTurns:e.number().int().min(0).max(5).default(0),profileByChannel:e.record(e.enum(["full","lean"])).default({}),lean:e.object({mcpServers:e.array(e.string().min(1)).default(["agentx"]),settingSources:e.array(e.enum(["user","project","local"])).default(["project","local"]),contextOnDemand:e.boolean().default(!0),tools:e.array(e.string().min(1)).default([]),toolsByChannel:e.record(e.array(e.string().min(1))).default({}),agentxTools:Ne.default([]),agentxToolsByChannel:e.record(Ne).default({})}).default({}),triage:e.object({models:e.object({"claude-code":e.string().min(1).optional(),"codex-cli":e.string().min(1).optional()}).default({}),actions:e.array(e.string().min(1)).default(["labeled","unlabeled","closed"])}).default({}),memoryIndexMaxChars:e.number().int().min(0).max(2e5).default(0),resumeGate:e.object({mode:e.enum(["off","shadow","active"]).default("off"),freshTokens:e.number().int().min(1e3).max(2e5).default(3e4),cacheTtlMinutes:e.number().int().min(1).max(1440).default(60),cacheWriteFactor:e.number().min(1).max(4).default(2),margin:e.number().min(1).max(10).default(1.5)}).default({}),observationPack:e.object({enabled:e.boolean().default(!1),limitBytes:e.number().int().min(1024).max(1048576).default(10240),headBytes:e.number().int().min(0).max(65536).default(1024),tailBytes:e.number().int().min(0).max(65536).default(1024),tools:e.array(e.string().min(1)).default(["Bash","Grep","Read","WebFetch","mcp__.*"]),retentionDays:e.number().int().min(0).max(3650).default(0)}).default({})}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})});tt="wiki-contribute",nt="wiki-contribute-merge";F="wiki-summarize"});export{Jn as a,Qn as b,Y as c,Lt as d,tr as e,E as f,ee as g,S as h,te as i,ne as j,N as k,rr as l,ae as m,oe as n,ie as o,sr as p,se as q,ur as r,dr as s,ue as t,de as u,fr as v,ce as w,fe as x,ge as y,y as z,p as A,P as B,xr as C,pe as D,be as E,Sr as F,kr as G,R as H,_r as I,xe as J,Se as K,sn as L,Ir as M,ve as N,Cr as O,cn as P,jr as Q,Te as R,Dr as S,I as T,Pr as U,Re as V,pn as W,bn as X,Ce as Y,qr as Z,Mr as _,Fr as $,je as aa,yn as ba,Ur as ca,zr as da,Le as ea,An 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,Qe as ra,et as sa,L as ta,Wn as ua,Kn as va,tt as wa,nt as xa,rt as ya,F as za,at as Aa,Xn as Ba,Zn as Ca};
54
+ //# sourceMappingURL=chunk-HW5FTKTU.js.map