agentix-cli 0.81.0 → 0.82.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 (111) hide show
  1. package/apps/mac-voice/Sources/AgentXVoice/CallModel.swift +11 -0
  2. package/apps/mac-voice/Sources/AgentXVoice/Calls.swift +7 -4
  3. package/apps/mac-voice/Sources/AgentXVoice/main.swift +15 -3
  4. package/dist/{App-HF6W6CV2.js → App-3AZUZJPW.js} +2 -2
  5. package/dist/{ChatApp-74VBWP7R.js → ChatApp-ACIKF3GC.js} +2 -2
  6. package/dist/{agent-BDEPUFBQ.js → agent-X2UYZ3ZE.js} +2 -2
  7. package/dist/{board-dashboard-TWEF5XVE.js → board-dashboard-65HGTFRC.js} +485 -235
  8. package/dist/board-dashboard-65HGTFRC.js.map +1 -0
  9. package/dist/{chunk-ATXE3EMV.js → chunk-5LD6TA4A.js} +2 -2
  10. package/dist/{chunk-ES7Z64Z5.js → chunk-6G72CCT2.js} +2 -2
  11. package/dist/{chunk-LUL4ILAQ.js → chunk-6PTO6DWW.js} +2 -2
  12. package/dist/{chunk-HYE2UUQ4.js → chunk-AW3YGAVS.js} +160 -160
  13. package/dist/chunk-AW3YGAVS.js.map +1 -0
  14. package/dist/{chunk-GUAJNZIX.js → chunk-BM6ZLX6F.js} +2 -2
  15. package/dist/{chunk-5GXCOHDM.js → chunk-C4YY6746.js} +2 -2
  16. package/dist/{chunk-4KJ3PCAI.js → chunk-CG3FSQ23.js} +2 -2
  17. package/dist/{chunk-JG3O5GL6.js → chunk-CT36XINH.js} +2 -2
  18. package/dist/{chunk-BDM4VTBR.js → chunk-E3SVSIUU.js} +3 -3
  19. package/dist/chunk-E3SVSIUU.js.map +1 -0
  20. package/dist/{chunk-WWU2D65N.js → chunk-E63BQ6VJ.js} +2 -2
  21. package/dist/chunk-FSHQMXM3.js +5 -0
  22. package/dist/{chunk-XF65CDNS.js.map → chunk-FSHQMXM3.js.map} +1 -1
  23. package/dist/{chunk-TW4L6RP2.js → chunk-ISRGFMQC.js} +2 -2
  24. package/dist/{chunk-EFV7U5LD.js → chunk-KUUIIZEH.js} +64 -64
  25. package/dist/chunk-KUUIIZEH.js.map +1 -0
  26. package/dist/chunk-LLNPKE7H.js +11 -0
  27. package/dist/chunk-LLNPKE7H.js.map +1 -0
  28. package/dist/{chunk-74FSHUB3.js → chunk-LQLMNBJS.js} +2 -2
  29. package/dist/{chunk-XQ7MVPWP.js → chunk-ONGL6EKZ.js} +2 -2
  30. package/dist/{chunk-ZDDJNKU5.js → chunk-PLTX6YGD.js} +2 -2
  31. package/dist/{chunk-LTHQXWZN.js → chunk-VQN36LEB.js} +2 -2
  32. package/dist/{chunk-BB3ESU74.js → chunk-WIGJ5BVG.js} +2 -2
  33. package/dist/{chunk-HUQRPEDP.js → chunk-X7STXQOX.js} +2 -2
  34. package/dist/chunk-XMDA4JYK.js +748 -0
  35. package/dist/chunk-XMDA4JYK.js.map +1 -0
  36. package/dist/{chunk-ZUAV3PTL.js → chunk-ZUCJK5PL.js} +2 -2
  37. package/dist/cli.js +1 -1
  38. package/dist/client-QE4D43K3.js +2 -0
  39. package/dist/config-ME774GIO.js +2 -0
  40. package/dist/config-mutator-2AUDHSVD.js +2 -0
  41. package/dist/{doctor-6EWW7NC2.js → doctor-GS2ZHLWU.js} +2 -2
  42. package/dist/index.js +1 -1
  43. package/dist/{program-FUYHN2F7.js → program-R646G4NP.js} +195 -195
  44. package/dist/{program-FUYHN2F7.js.map → program-R646G4NP.js.map} +1 -1
  45. package/dist/{promote-ZZWMGVO2.js → promote-ZJCGGVRD.js} +2 -2
  46. package/dist/{query-OQBB7EFS.js → query-UMGPOBEJ.js} +2 -2
  47. package/dist/{registry-PLSOZ3CL.js → registry-WD5B2DQQ.js} +2 -2
  48. package/dist/{request-planner-HX44G2SX.js → request-planner-L2S4KMMU.js} +2 -2
  49. package/dist/{review-candidates-FBDLPU6H.js → review-candidates-R23QNJ2Q.js} +2 -2
  50. package/dist/{routing-3SZHWHUA.js → routing-PUQUADQ6.js} +2 -2
  51. package/dist/schedule-tool-3DAJU764.js +2 -0
  52. package/dist/scheduler-JTPIGC5K.js +2 -0
  53. package/dist/{seat-2HJG3UNW.js → seat-O5IC5M5D.js} +2 -2
  54. package/dist/{select-UKAOL7QB.js → select-KCCT7OJZ.js} +2 -2
  55. package/dist/{set-enabled-ADFSNG5A.js → set-enabled-FEUPS2WI.js} +2 -2
  56. package/dist/{tool-MSXWU44P.js → tool-WGPZW3SR.js} +2 -2
  57. package/dist/{tool-X7YEIJVZ.js → tool-YOXUNCTU.js} +2 -2
  58. package/dist/wiki-QSBAE5ZK.js +2 -0
  59. package/package.json +1 -1
  60. package/dist/board-dashboard-TWEF5XVE.js.map +0 -1
  61. package/dist/chunk-BDM4VTBR.js.map +0 -1
  62. package/dist/chunk-EFV7U5LD.js.map +0 -1
  63. package/dist/chunk-HYE2UUQ4.js.map +0 -1
  64. package/dist/chunk-OVN5LVJY.js +0 -11
  65. package/dist/chunk-OVN5LVJY.js.map +0 -1
  66. package/dist/chunk-VVW4JYV6.js +0 -740
  67. package/dist/chunk-VVW4JYV6.js.map +0 -1
  68. package/dist/chunk-XF65CDNS.js +0 -5
  69. package/dist/client-JDY2FZUF.js +0 -2
  70. package/dist/config-JCETBKWT.js +0 -2
  71. package/dist/config-mutator-YQWTY47O.js +0 -2
  72. package/dist/schedule-tool-5FULSHWJ.js +0 -2
  73. package/dist/scheduler-ITOKSMYT.js +0 -2
  74. package/dist/wiki-QUVWB4IN.js +0 -2
  75. /package/dist/{App-HF6W6CV2.js.map → App-3AZUZJPW.js.map} +0 -0
  76. /package/dist/{ChatApp-74VBWP7R.js.map → ChatApp-ACIKF3GC.js.map} +0 -0
  77. /package/dist/{agent-BDEPUFBQ.js.map → agent-X2UYZ3ZE.js.map} +0 -0
  78. /package/dist/{chunk-ATXE3EMV.js.map → chunk-5LD6TA4A.js.map} +0 -0
  79. /package/dist/{chunk-ES7Z64Z5.js.map → chunk-6G72CCT2.js.map} +0 -0
  80. /package/dist/{chunk-LUL4ILAQ.js.map → chunk-6PTO6DWW.js.map} +0 -0
  81. /package/dist/{chunk-GUAJNZIX.js.map → chunk-BM6ZLX6F.js.map} +0 -0
  82. /package/dist/{chunk-5GXCOHDM.js.map → chunk-C4YY6746.js.map} +0 -0
  83. /package/dist/{chunk-4KJ3PCAI.js.map → chunk-CG3FSQ23.js.map} +0 -0
  84. /package/dist/{chunk-JG3O5GL6.js.map → chunk-CT36XINH.js.map} +0 -0
  85. /package/dist/{chunk-WWU2D65N.js.map → chunk-E63BQ6VJ.js.map} +0 -0
  86. /package/dist/{chunk-TW4L6RP2.js.map → chunk-ISRGFMQC.js.map} +0 -0
  87. /package/dist/{chunk-74FSHUB3.js.map → chunk-LQLMNBJS.js.map} +0 -0
  88. /package/dist/{chunk-XQ7MVPWP.js.map → chunk-ONGL6EKZ.js.map} +0 -0
  89. /package/dist/{chunk-ZDDJNKU5.js.map → chunk-PLTX6YGD.js.map} +0 -0
  90. /package/dist/{chunk-LTHQXWZN.js.map → chunk-VQN36LEB.js.map} +0 -0
  91. /package/dist/{chunk-BB3ESU74.js.map → chunk-WIGJ5BVG.js.map} +0 -0
  92. /package/dist/{chunk-HUQRPEDP.js.map → chunk-X7STXQOX.js.map} +0 -0
  93. /package/dist/{chunk-ZUAV3PTL.js.map → chunk-ZUCJK5PL.js.map} +0 -0
  94. /package/dist/{client-JDY2FZUF.js.map → client-QE4D43K3.js.map} +0 -0
  95. /package/dist/{config-JCETBKWT.js.map → config-ME774GIO.js.map} +0 -0
  96. /package/dist/{config-mutator-YQWTY47O.js.map → config-mutator-2AUDHSVD.js.map} +0 -0
  97. /package/dist/{doctor-6EWW7NC2.js.map → doctor-GS2ZHLWU.js.map} +0 -0
  98. /package/dist/{promote-ZZWMGVO2.js.map → promote-ZJCGGVRD.js.map} +0 -0
  99. /package/dist/{query-OQBB7EFS.js.map → query-UMGPOBEJ.js.map} +0 -0
  100. /package/dist/{registry-PLSOZ3CL.js.map → registry-WD5B2DQQ.js.map} +0 -0
  101. /package/dist/{request-planner-HX44G2SX.js.map → request-planner-L2S4KMMU.js.map} +0 -0
  102. /package/dist/{review-candidates-FBDLPU6H.js.map → review-candidates-R23QNJ2Q.js.map} +0 -0
  103. /package/dist/{routing-3SZHWHUA.js.map → routing-PUQUADQ6.js.map} +0 -0
  104. /package/dist/{schedule-tool-5FULSHWJ.js.map → schedule-tool-3DAJU764.js.map} +0 -0
  105. /package/dist/{scheduler-ITOKSMYT.js.map → scheduler-JTPIGC5K.js.map} +0 -0
  106. /package/dist/{seat-2HJG3UNW.js.map → seat-O5IC5M5D.js.map} +0 -0
  107. /package/dist/{select-UKAOL7QB.js.map → select-KCCT7OJZ.js.map} +0 -0
  108. /package/dist/{set-enabled-ADFSNG5A.js.map → set-enabled-FEUPS2WI.js.map} +0 -0
  109. /package/dist/{tool-MSXWU44P.js.map → tool-WGPZW3SR.js.map} +0 -0
  110. /package/dist/{tool-X7YEIJVZ.js.map → tool-YOXUNCTU.js.map} +0 -0
  111. /package/dist/{wiki-QUVWB4IN.js.map → wiki-QSBAE5ZK.js.map} +0 -0
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-LUL4ILAQ.js";import{resolve as a}from"path";import{existsSync as d,readdirSync as c,mkdirSync as l}from"fs";var g=class{baseDir;agentsDir;mode;sharedStore;agentStores=new Map;log;constructor(t=a(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki-hub]"),r="graph"){this.baseDir=t,this.agentsDir=a(t,"agents"),this.mode=r,this.log=e,l(this.agentsDir,{recursive:!0}),this.sharedStore=new o(t,e)}getMode(){return this.mode}getAgentWiki(t){let e=`${t}:${this.mode}`;if(this.agentStores.has(e))return this.agentStores.get(e);let r=a(this.agentsDir,t,this.mode),i=new o(r,this.log);return this.agentStores.set(e,i),i}getBaseDir(){return this.baseDir}getSharedStore(){return this.sharedStore}listAgents(){let t=new Set,e=this.sharedStore.listEntries();for(let r of e)t.add(r.agentId);if(d(this.agentsDir))for(let r of c(this.agentsDir))!r.startsWith("_")&&!r.startsWith(".")&&t.add(r);return[...t].sort()}getAgentEntries(t){return this.sharedStore.listEntries({agentId:t})}getUnabsorbedEntries(t){let e=this.getAgentWiki(t),r=this.getAgentEntries(t),i=new Set,n=e.rebuildIndex();for(let s of n.articles)if(s.sources)for(let h of s.sources)i.add(h);return r.filter(s=>!i.has(s.id))}summary(){return this.listAgents().map(e=>{let r=this.getAgentEntries(e),n=this.getAgentWiki(e).rebuildIndex(),s=this.getUnabsorbedEntries(e);return{agentId:e,totalEntries:r.length,totalArticles:n.articles.length,unabsorbed:s.length,articles:n.articles}})}};export{g as a};
2
- //# sourceMappingURL=chunk-ATXE3EMV.js.map
1
+ import{a as o}from"./chunk-6PTO6DWW.js";import{resolve as a}from"path";import{existsSync as d,readdirSync as c,mkdirSync as l}from"fs";var g=class{baseDir;agentsDir;mode;sharedStore;agentStores=new Map;log;constructor(t=a(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki-hub]"),r="graph"){this.baseDir=t,this.agentsDir=a(t,"agents"),this.mode=r,this.log=e,l(this.agentsDir,{recursive:!0}),this.sharedStore=new o(t,e)}getMode(){return this.mode}getAgentWiki(t){let e=`${t}:${this.mode}`;if(this.agentStores.has(e))return this.agentStores.get(e);let r=a(this.agentsDir,t,this.mode),i=new o(r,this.log);return this.agentStores.set(e,i),i}getBaseDir(){return this.baseDir}getSharedStore(){return this.sharedStore}listAgents(){let t=new Set,e=this.sharedStore.listEntries();for(let r of e)t.add(r.agentId);if(d(this.agentsDir))for(let r of c(this.agentsDir))!r.startsWith("_")&&!r.startsWith(".")&&t.add(r);return[...t].sort()}getAgentEntries(t){return this.sharedStore.listEntries({agentId:t})}getUnabsorbedEntries(t){let e=this.getAgentWiki(t),r=this.getAgentEntries(t),i=new Set,n=e.rebuildIndex();for(let s of n.articles)if(s.sources)for(let h of s.sources)i.add(h);return r.filter(s=>!i.has(s.id))}summary(){return this.listAgents().map(e=>{let r=this.getAgentEntries(e),n=this.getAgentWiki(e).rebuildIndex(),s=this.getUnabsorbedEntries(e);return{agentId:e,totalEntries:r.length,totalArticles:n.articles.length,unabsorbed:s.length,articles:n.articles}})}};export{g as a};
2
+ //# sourceMappingURL=chunk-5LD6TA4A.js.map
@@ -1,4 +1,4 @@
1
- import{b as Xe,c as et}from"./chunk-GLQLCBJS.js";import{c as Ge}from"./chunk-SZDACK6O.js";import{b as ce}from"./chunk-AFRHKA7B.js";import{b as ze,e as Je,f as qe,i as Ve,k as Ze,l as Qe,q as tt}from"./chunk-4KJ3PCAI.js";import{c as Ue,e as Ke,f as Be}from"./chunk-KA2UIZXG.js";import{e as _e,g as Le,h as He,i as de}from"./chunk-GQ76J72O.js";import{a as Ye}from"./chunk-GV7S5BAX.js";import{a as Ce,b as oe,c as se,d as Me,e as ae}from"./chunk-QD6IICK7.js";import{v as Fe,w as an}from"./chunk-5GXCOHDM.js";import{b as je,f as sn}from"./chunk-72SZI2UW.js";import{c as Ee,d as De}from"./chunk-QOYAX2FT.js";import{a as ie,i as on}from"./chunk-PN6XHTG5.js";import{existsSync as dn,mkdirSync as nt,readFileSync as cn,writeFileSync as ln,renameSync as un}from"fs";import{resolve as rt,dirname as pn}from"path";var it=class{filePath;log;constructor(e={}){let t=e.baseDir??rt(process.cwd(),".agentx");this.filePath=rt(t,"handover.json"),this.log=e.log??console.error.bind(console,"[handover]"),nt(t,{recursive:!0})}key(e,t,n){return`${e}::${t}::${n||"-"}`}load(){if(!dn(this.filePath))return{version:1,overrides:{}};try{let e=cn(this.filePath,"utf-8"),t=JSON.parse(e);return!t||typeof t!="object"?{version:1,overrides:{}}:(t.overrides||(t.overrides={}),t)}catch(e){return this.log(`load failed, starting empty: ${e?.message||e}`),{version:1,overrides:{}}}}save(e){nt(pn(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp-${process.pid}`;ln(t,JSON.stringify(e,null,2)),un(t,this.filePath)}get(e,t,n){let o=this.load().overrides[this.key(e,t,n)];if(o&&!(o.expiresAt&&Date.parse(o.expiresAt)<Date.now()))return o}set(e){if(!e.channel||!e.chatId||!e.toAgent)throw new Error("channel, chatId and toAgent are required");let t=this.load(),n={...e,createdAt:e.createdAt??new Date().toISOString()};return t.overrides[this.key(n.channel,n.chatId,n.accountId)]=n,this.save(t),n}remove(e,t,n){let i=this.load(),o=this.key(e,t,n);return o in i.overrides?(delete i.overrides[o],this.save(i),!0):!1}consumeSummary(e,t,n){let i=this.load(),o=i.overrides[this.key(e,t,n)];if(!o||!o.summary||o.summaryConsumedAt)return;let s=o.summary;return o.summaryConsumedAt=new Date().toISOString(),this.save(i),s}listActive(){let e=this.load(),t=Date.now();return Object.values(e.overrides).filter(n=>!n.expiresAt||Date.parse(n.expiresAt)>=t)}listByAgent(e){let t=this.listActive();return{incoming:t.filter(n=>n.toAgent===e),outgoing:t.filter(n=>n.fromAgent===e)}}};import{readFileSync as ct,writeFileSync as le,appendFileSync as hn,mkdirSync as yn,existsSync as lt,statSync as wn}from"fs";import{resolve as U}from"path";var ot="[Agent Memory \u2014 persistent facts from past conversations]",fn=2400;function st(r,e){return r?`UNVERIFIED (${e===null?"age unknown":`${e}d old`}) `:""}function gn(r,e=Date.now()){let t=Ke(r,e),n=r.undated?"UNVERIFIED (never checked) ":st(t,_e(r.verifiedAt,e));return{line:`- [wiki ${r.id}] ${n}${r.subject} \xB7 ${r.attribute}: ${r.value} (${r.source}, checked ${r.verifiedAt.slice(0,10)} by ${r.verifiedBy})`,unverified:t}}function mn(r,e){let n=!r.source.chatId.startsWith("-")&&/^\d+$/.test(r.source.chatId)?"DM":r.source.chatId,i=He(r,e);return{line:`- [${r.category}] ${st(i,Le(r,e))}${r.content} (${n}, ${r.source.date})`,unverified:i}}function at(r,e=[],t=Date.now()){let n=[],i=new Set,o=ot.length,s=!1;for(let a of r){let d=e.length>0?Be(a.content,e):null,c,u,p=d&&Date.parse(a.createdAt)>Date.parse(d.verifiedAt)&&!a.content.toLowerCase().includes(d.value.toLowerCase());if(d&&!p){if(i.has(d.id))continue;i.add(d.id),c=gn(d,t),u=d.id}else c=mn(a,t),d&&(c.line+=` [differs from wiki ${d.id}]`);let f=c.unverified&&!s?de.length:0;if(o+f+c.line.length>fn)break;n.push({fact:a,...c,...u?{wikiRef:u}:{}}),o+=f+c.line.length,f&&(s=!0)}return n}function dt(r){if(r.length===0)return"";let e=r.some(t=>t.unverified)?[de]:[];return[ot,...e,...r.map(t=>t.line),"[End Memory]"].join(`
1
+ import{b as Xe,c as et}from"./chunk-GLQLCBJS.js";import{c as Ge}from"./chunk-SZDACK6O.js";import{b as ce}from"./chunk-AFRHKA7B.js";import{b as ze,e as Je,f as qe,i as Ve,k as Ze,l as Qe,q as tt}from"./chunk-CG3FSQ23.js";import{c as Ue,e as Ke,f as Be}from"./chunk-KA2UIZXG.js";import{e as _e,g as Le,h as He,i as de}from"./chunk-GQ76J72O.js";import{a as Ye}from"./chunk-GV7S5BAX.js";import{a as Ce,b as oe,c as se,d as Me,e as ae}from"./chunk-QD6IICK7.js";import{v as Fe,w as an}from"./chunk-C4YY6746.js";import{b as je,f as sn}from"./chunk-72SZI2UW.js";import{c as Ee,d as De}from"./chunk-QOYAX2FT.js";import{a as ie,i as on}from"./chunk-PN6XHTG5.js";import{existsSync as dn,mkdirSync as nt,readFileSync as cn,writeFileSync as ln,renameSync as un}from"fs";import{resolve as rt,dirname as pn}from"path";var it=class{filePath;log;constructor(e={}){let t=e.baseDir??rt(process.cwd(),".agentx");this.filePath=rt(t,"handover.json"),this.log=e.log??console.error.bind(console,"[handover]"),nt(t,{recursive:!0})}key(e,t,n){return`${e}::${t}::${n||"-"}`}load(){if(!dn(this.filePath))return{version:1,overrides:{}};try{let e=cn(this.filePath,"utf-8"),t=JSON.parse(e);return!t||typeof t!="object"?{version:1,overrides:{}}:(t.overrides||(t.overrides={}),t)}catch(e){return this.log(`load failed, starting empty: ${e?.message||e}`),{version:1,overrides:{}}}}save(e){nt(pn(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp-${process.pid}`;ln(t,JSON.stringify(e,null,2)),un(t,this.filePath)}get(e,t,n){let o=this.load().overrides[this.key(e,t,n)];if(o&&!(o.expiresAt&&Date.parse(o.expiresAt)<Date.now()))return o}set(e){if(!e.channel||!e.chatId||!e.toAgent)throw new Error("channel, chatId and toAgent are required");let t=this.load(),n={...e,createdAt:e.createdAt??new Date().toISOString()};return t.overrides[this.key(n.channel,n.chatId,n.accountId)]=n,this.save(t),n}remove(e,t,n){let i=this.load(),o=this.key(e,t,n);return o in i.overrides?(delete i.overrides[o],this.save(i),!0):!1}consumeSummary(e,t,n){let i=this.load(),o=i.overrides[this.key(e,t,n)];if(!o||!o.summary||o.summaryConsumedAt)return;let s=o.summary;return o.summaryConsumedAt=new Date().toISOString(),this.save(i),s}listActive(){let e=this.load(),t=Date.now();return Object.values(e.overrides).filter(n=>!n.expiresAt||Date.parse(n.expiresAt)>=t)}listByAgent(e){let t=this.listActive();return{incoming:t.filter(n=>n.toAgent===e),outgoing:t.filter(n=>n.fromAgent===e)}}};import{readFileSync as ct,writeFileSync as le,appendFileSync as hn,mkdirSync as yn,existsSync as lt,statSync as wn}from"fs";import{resolve as U}from"path";var ot="[Agent Memory \u2014 persistent facts from past conversations]",fn=2400;function st(r,e){return r?`UNVERIFIED (${e===null?"age unknown":`${e}d old`}) `:""}function gn(r,e=Date.now()){let t=Ke(r,e),n=r.undated?"UNVERIFIED (never checked) ":st(t,_e(r.verifiedAt,e));return{line:`- [wiki ${r.id}] ${n}${r.subject} \xB7 ${r.attribute}: ${r.value} (${r.source}, checked ${r.verifiedAt.slice(0,10)} by ${r.verifiedBy})`,unverified:t}}function mn(r,e){let n=!r.source.chatId.startsWith("-")&&/^\d+$/.test(r.source.chatId)?"DM":r.source.chatId,i=He(r,e);return{line:`- [${r.category}] ${st(i,Le(r,e))}${r.content} (${n}, ${r.source.date})`,unverified:i}}function at(r,e=[],t=Date.now()){let n=[],i=new Set,o=ot.length,s=!1;for(let a of r){let d=e.length>0?Be(a.content,e):null,c,u,p=d&&Date.parse(a.createdAt)>Date.parse(d.verifiedAt)&&!a.content.toLowerCase().includes(d.value.toLowerCase());if(d&&!p){if(i.has(d.id))continue;i.add(d.id),c=gn(d,t),u=d.id}else c=mn(a,t),d&&(c.line+=` [differs from wiki ${d.id}]`);let f=c.unverified&&!s?de.length:0;if(o+f+c.line.length>fn)break;n.push({fact:a,...c,...u?{wikiRef:u}:{}}),o+=f+c.line.length,f&&(s=!0)}return n}function dt(r){if(r.length===0)return"";let e=r.some(t=>t.unverified)?[de]:[];return[ot,...e,...r.map(t=>t.line),"[End Memory]"].join(`
2
2
  `)}var ut=200,kn=7,pt=class{memoryDir;ledger;constructor(e=process.cwd()){this.memoryDir=U(e,".agentx/memory"),this.ledger=new Ue(U(e,".agentx/wiki")),lt(this.memoryDir)||yn(this.memoryDir,{recursive:!0})}filePath(e){return U(this.memoryDir,`${e}.jsonl`)}addMemory(e,t){if(t.category==="secret"||oe(t.content))return!1;let n=t.source.trust??Ce(t.source.channel),i=t.review??Me(n),o={...t,source:{...t.source,trust:n},...i?{review:i}:{},id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,createdAt:new Date().toISOString()};return hn(this.filePath(e),JSON.stringify(o)+`
3
3
  `),!0}parsedCache=new Map;getAll(e){let t=this.filePath(e);if(!lt(t))return[];try{let{mtimeMs:n,size:i}=wn(t),o=this.parsedCache.get(t);if(o&&o.mtimeMs===n&&o.size===i)return o.facts.slice();let a=ct(t,"utf-8").split(`
4
4
  `).filter(d=>d.trim()).map(d=>{try{return JSON.parse(d)}catch{return null}}).filter(d=>d!==null);return this.parsedCache.set(t,{mtimeMs:n,size:i,facts:a}),a.slice()}catch{return[]}}findRelevant(e,t,n=8){let i=this.getAll(t).filter(ae);if(i.length===0)return[];let o=i.map(g=>`${g.keywords.join(" ")} ${g.content}`),s=U(this.memoryDir,`${t}_bm25_cache.json`),a=De(o,s),d=Ee(e,a),c=new Map(d.map(g=>[g.docIndex,g.score])),p=i.map((g,h)=>{let m=c.get(h)??0;return g.category==="commitment"&&(m+=1),{memory:g,score:m}}).filter(g=>g.score>0);if(p.length===0)return i.slice(-n);let f=p.sort((g,h)=>h.score-g.score).slice(0,n).map(g=>g.memory);if(f.length>0)try{this.recordAccess(t,f.map(g=>g.id))}catch{}return f}buildContext(e){return dt(this.contextLines(e))}contextFacts(e){return this.contextLines(e).map(t=>t.fact)}contextLines(e){let t=[];try{t=this.ledger.list()}catch{}return at(e,t)}recordAccess(e,t){if(t.length===0)return;let n=this.getAll(e),i=new Set(t),o=!1;for(let s of n)if(i.has(s.id)){s.accessCount=(s.accessCount||0)+1,s.lastAccessed=new Date().toISOString();let a=s.intervalDays||1;s.intervalDays=Math.min(a*2,30),s.nextReview=new Date(Date.now()+s.intervalDays*864e5).toISOString(),o=!0}o&&le(this.filePath(e),n.map(s=>JSON.stringify(s)).join(`
@@ -19,4 +19,4 @@ import{b as Xe,c as et}from"./chunk-GLQLCBJS.js";import{c as Ge}from"./chunk-SZD
19
19
  `),n}sync(e,t){let n=this.get(e);if(!n)return null;let i={};for(let s of t)n.nodes[s]&&(i[s]=n.nodes[s]);let o={version:1,nodes:i};return this.save(e,o)}delete(e){let t=this.pathFor(e);return Nt(t)?(Gn(t),!0):!1}};function Wt(r){return new Set(r.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(e=>e.length>3))}function Zn(r,e){if(r.size===0||e.size===0)return 0;let t=0;for(let n of r)e.has(n)&&t++;return t/Math.max(r.size,e.size)}function Qn(r,e){let t=Wt(r.message),n=e.filter(o=>o.state==="active"&&(o.status??"active")==="active"),i=null;for(let o of n){let s=0,a=[];if(o.ownerAgent&&o.ownerAgent===r.agentId&&(s+=.25,a.push("owner-agent")),r.channel&&o.tags.includes(r.channel)&&(s+=.15,a.push("channel-tag")),r.intentPath?.length&&o.intentPath.length){let p=r.intentPath.filter((f,g)=>o.intentPath[g]===f).length;p>0&&(s+=Math.min(.3,p*.1),a.push("intent-path"))}let d=[o.id,o.title,o.description??"",...o.tags].join(" "),c=Zn(t,Wt(d));c>0&&(s+=Math.min(.35,c),a.push("text-similarity")),(o.matchCount??0)>0&&(s+=Math.min(.1,o.matchCount*.01),a.push("prior-matches"));let u=Math.max(0,Math.min(1,s));(!i||u>i.confidence)&&(i={workflow:o,confidence:u,reasons:a})}return i&&i.confidence>0?i:null}function ve(r){let{workflow:e,fromNodeId:t,selectedPort:n}=r,i=e.nodes.find(a=>a.id===t);if(!i)return{nextPending:[]};let o=e.edges.filter(a=>a.from===t);return{nextPending:(i.type==="branch"?o.filter(a=>(a.fromPort??"")===(n??"")):o).map(a=>a.to)}}function Se(r,e){let t=r.config.cases??[],n=r.config.default??"";for(let i of t)if(Y(i.when,e))return i.to;return n}function Y(r,e){let t=r.params??{},n=String(t.path??""),i=j(e,n);switch(r.kind){case"equals":return i===t.value;case"contains":return typeof i=="string"?i.includes(String(t.value??"")):Array.isArray(i)?i.some(o=>o===t.value):!1;case"matches":{if(typeof i!="string")return!1;try{return new RegExp(String(t.regex??"")).test(i)}catch{return!1}}case"exists":return i!=null&&i!=="";default:return!1}}function j(r,e){if(!e)return;let t=e.split("."),n=r;for(let i of t){if(n==null||typeof n!="object")return;n=n[i]}return n}function G(r){let e=r.nodes.find(n=>n.type.startsWith("trigger."));if(!e)return null;let t=r.edges.filter(n=>n.from===e.id).map(n=>n.to);return{triggerId:e.id,pending:t}}function N(r,e){return r.nodes.find(t=>t.id===e)}sn();an();function Xn(r,e,t){let n=r.split(".");if(n[0]==="env"){if(n.length!==2)return"";let o=n[1];if(!t.has(o))return"";let s=process.env[o];return typeof s=="string"?s:""}let i=e;for(let o of n){if(i==null||typeof i!="object")return"";i=i[o]}return i==null?"":typeof i=="object"?JSON.stringify(i):String(i)}function A(r,e,t={}){let n=new Set(t.envAllow||[]);return r.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_.-]*)\s*\}\}/g,(i,o)=>Xn(o,e,n))}function b(r,e,t={}){let n={};for(let[i,o]of Object.entries(r))typeof o=="string"?n[i]=A(o,e,t):Array.isArray(o)?n[i]=o.map(s=>typeof s=="string"?A(s,e,t):s):o&&typeof o=="object"?n[i]=b(o,e,t):n[i]=o;return n}var Et="workflow-classify",V="unsure",Dt=async r=>{let e=r.node.config,t=r.run.context,n={envAllow:r.workflow.envAllow},i=A(String(e.input??""),t,n).trim();if(!i)return{error:`classify node "${r.node.id}" missing config.input`};let o=e.labels,s=Array.isArray(o)?Object.fromEntries(o.map(m=>[String(m),null])):typeof o=="object"&&o?Object.fromEntries(Object.entries(o).map(([m,w])=>[m,w==null?null:String(w)])):{},a=Object.keys(s);if(a.length<2)return{error:`classify node "${r.node.id}" needs at least two labels`};if(a.includes(V))return{error:`classify node "${r.node.id}": "${V}" is reserved for the low-confidence port`};let d=typeof e.minConfidence=="number"?e.minConfidence:.7,c=e.instructions?A(String(e.instructions),t,n):void 0,u={input:i};if(e.state&&typeof e.state=="object")for(let[m,w]of Object.entries(e.state)){let y=typeof w=="string"?A(w,t,n):w;(y===null||["string","number","boolean"].includes(typeof y))&&(u[m]=y)}let p=await Fe(Et,u,{label:je(s,c)},{features:{workflow:r.workflow.id,node:r.node.id}});if(!p)return{error:`classify node "${r.node.id}": decision seat unavailable (set decisions.seats.${Et}.mode)`};let f=p.answers.label,g=f.confidence>=d,h=g?f.choice:V;return r.log(`[node:${r.node.id}] classify \u2192 ${f.choice} (${f.confidence.toFixed(2)})${g?"":` \u2014 below ${d}, routing to ${V}`}`),{output:{result:f.choice,label:f.choice,confidence:f.confidence,probabilities:f.probabilities,unsure:!g,port:h},port:h}};var Ie=class{active=new Map;waiters=new Map;async acquire(e,t){let n=this.active.get(e)??0;if(n<t){this.active.set(e,n+1);return}return new Promise(i=>{let o=this.waiters.get(e)??[];o.push({resolve:()=>{this.active.set(e,(this.active.get(e)??0)+1),i()}}),this.waiters.set(e,o)})}release(e){let t=this.active.get(e)??0;this.active.set(e,Math.max(0,t-1));let n=this.waiters.get(e);n&&n.length>0&&n.shift().resolve()}stats(e){return{active:this.active.get(e)??0,waiting:this.waiters.get(e)?.length??0}}},Z=new Ie;function jt(r,e){return`${r}:${e}`}var F=async r=>({output:r.run.context[r.node.id]??{}}),er=async r=>{let e=r.node.config,t=String(e.agentId??""),n=String(e.prompt??"");if(!t)return{error:`agent node "${r.node.id}" missing config.agentId`};let i=A(n,r.run.context,{envAllow:r.workflow.envAllow}),o=typeof e.timeoutMinutes=="number"?e.timeoutMinutes:void 0,s=e.autonomy===void 0||e.autonomy===null?void 0:String(e.autonomy);if(s!==void 0&&s!=="report"&&s!=="propose"&&s!=="act")return{error:`agent node "${r.node.id}" has invalid autonomy "${s}" (expected report, propose or act)`};let a=typeof e.maxConcurrent=="number"&&e.maxConcurrent>0?e.maxConcurrent:null,d=a?jt(r.workflow.id,r.node.id):null;if(d&&a){let u=Z.stats(d);u.active>=a&&r.log(`[node:${r.node.id}] gated: ${u.active} active (cap ${a}), ${u.waiting+1} waiting`),await Z.acquire(d,a)}let c=Date.now();try{let u=await r.agents.execute({agentId:t,message:i,workflowRunId:r.run.id,timeoutMinutes:o,...s?{autonomy:s}:{}}),p=Date.now()-c;if(u.error){let h=u.errorKind??"unknown";return r.log(`[node:${r.node.id}] agent "${t}" failed (${h}): ${u.error}`),{error:`[${h}] ${u.error}`}}let g=String(e.resultParser??"acme-result-token")==="json"?Ar(u.content):Ct(u.content);return{output:{reply:u.content,result:g.result,json:g.json,taskId:u.taskId,durationMs:p,...u.autonomyBlocks?.length?{autonomyBlocks:u.autonomyBlocks}:{}}}}catch(u){return r.log(`[node:${r.node.id}] agent "${t}" threw: ${u.message}`),{error:u.message}}finally{d&&Z.release(d)}},tr=async r=>{let e=Se(r.node,r.run.context);return e?{output:{port:e},port:e}:(r.log(`[node:${r.node.id}] branch matched no case and no default port`),{output:{port:null}})},nr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),i=String(e.text??"");if(!t||!n){let a=String(r.node.config.chatId??""),d=String(r.node.config.channel??""),c=[];return t||c.push(`channel config="${d}" rendered=""`),n||c.push(`chatId config="${a}" rendered=""`),(/\{\{\s*env\./.test(a)||/\{\{\s*env\./.test(d))&&c.push("(env.* templates only resolve for names listed in workflow.envAllow and actually set in process.env)"),{error:`action.send "${r.node.id}" needs channel + chatId \u2014 ${c.join("; ")}`}}let o=Re(r,e.accountId),s=r.channels[t];if(s?.send)try{return{output:{messageId:await s.send({channel:t,chatId:n,text:i,...o?{accountId:o}:{}})??null}}}catch(a){return{error:`action.send failed: ${a.message}`}}if(r.forwardChannelSend)try{return{output:{messageId:(await r.forwardChannelSend({channel:t,chatId:n,text:i,accountId:o})).messageId,viaMesh:!0}}}catch(a){return r.log(`[node:${r.node.id}] mesh-forward of "${t}" send failed: ${a.message}`),{error:`action.send via mesh failed: ${a.message}`}}return r.log(`[node:${r.node.id}] adapter "${t}" not available locally and no mesh forwarder`),{error:`channel "${t}" not available (no local adapter, no mesh route)`}},rr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),i=String(e.title??""),o=String(e.description??""),s=Array.isArray(e.labels)?e.labels.map(String):[],a=Array.isArray(e.assignees)?e.assignees.map(String):[];if(!n||!i)return{error:`action.createIssue "${r.node.id}" needs project + title`};let d=$e(r),c=r.channels[t];if(!c?.createIssue)return{error:`channel "${t}" does not support createIssue`};try{let u=await c.createIssue({project:n,title:i,description:o,labels:s,assignees:a,agentId:d});return u?{output:{issue:{iid:u.iid,url:u.url,webUrl:u.url}}}:{error:"createIssue returned null (see adapter log)"}}catch(u){return{error:`action.createIssue failed: ${u.message}`}}},ir=async()=>({output:{}}),or=async r=>{let e=r.node.config,t=String(e.name??r.node.id),n=e.waitFor??{},i=e.resumeMatch??{};return{paused:!0,pausedAt:{kind:"checkpoint",nodeId:r.node.id,checkpointName:t,resumeMatch:{...n,...i}}}},sr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),i=String(e.iid??""),o=Array.isArray(e.add)?e.add.map(String):[],s=Array.isArray(e.remove)?e.remove.map(String):[];if(!n||!i)return{error:`action.setLabel "${r.node.id}" needs project + iid (try {{trigger.project}} / {{trigger.issue.iid}})`};if(o.length===0&&s.length===0)return{output:{skipped:!0,reason:"no labels to add or remove"}};let a=r.channels[t];if(!a?.setLabels)return{error:`channel "${t}" does not support setLabels`};let d=$e(r),c=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await a.setLabels({project:n,kind:c,iid:i,add:o,remove:s,agentId:d})??[],add:o,remove:s}}},ar=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),i=String(e.iid??"");if(!n||!i)return{error:`action.readLabel "${r.node.id}" needs project + iid`};let o=r.channels[t];if(!o?.getLabels)return{error:`channel "${t}" does not support getLabels`};let s=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await o.getLabels({project:n,kind:s,iid:i})??[]}}},dr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),i=String(e.messageId??""),o=String(e.emoji??"\u{1F440}");if(!t||!n||!i)return{error:`action.react "${r.node.id}" needs channel + chatId + messageId`};let s=Re(r,e.accountId),a=r.channels[t];if(!a?.react)return{error:`channel "${t}" does not support react`};try{return await a.react(n,i,o,s),{output:{emoji:o}}}catch(d){return{error:`action.react failed: ${d.message}`}}},cr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),i=String(e.messageId??""),o=String(e.text??""),s=e.parseMode?String(e.parseMode):void 0;if(!t||!n||!i||!o)return{error:`action.editMessage "${r.node.id}" needs channel + chatId + messageId + text`};let a=Re(r,e.accountId),d=r.channels[t];if(!d?.editMessage)return{error:`channel "${t}" does not support editMessage`};try{return{output:{edited:await d.editMessage(n,i,o,s,a)}}}catch(c){return{error:`action.editMessage failed: ${c.message}`}}},lr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.chatId??""),i=Number(e.durationMs??0);if(!n||!i)return{error:`action.logTime "${r.node.id}" needs chatId + durationMs`};let o=r.channels[t];if(!o?.logTimeSpent)return{error:`channel "${t}" does not support logTimeSpent`};let s=$e(r);try{return await o.logTimeSpent(n,i,s),{output:{durationMs:i}}}catch(a){return{error:`action.logTime failed: ${a.message}`}}},ur=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.url??"");if(!t)return{error:`action.callHTTP "${r.node.id}" needs url`};let n=String(e.method??"POST").toUpperCase(),i=e.headers&&typeof e.headers=="object"?e.headers:{"Content-Type":"application/json"},o;e.body!==void 0&&(o=typeof e.body=="string"?e.body:JSON.stringify(e.body));try{let s=await fetch(t,{method:n,headers:i,body:o}),a=await s.text(),d=a;try{d=JSON.parse(a)}catch{}return{output:{ok:s.ok,status:s.status,body:d}}}catch(s){return{error:`action.callHTTP failed: ${s.message}`}}},pr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.actionId??e.id??"");if(!t)return{error:`action.run "${r.node.id}" needs actionId`};let n=e.inputs&&typeof e.inputs=="object"?e.inputs:{},{ActionStore:i}=await import("./store-TWQPEM5V.js"),{runAction:o}=await import("./runner-56G3N7M4.js"),s=new i().get(t);if(!s)return{error:`action.run "${r.node.id}": no action "${t}" in registry`};try{let a=await o(s,n),d={ok:a.ok,output:a.output,status:a.status,durationMs:a.durationMs};return a.errors!==void 0&&(d.errors=a.errors),a.ok?{output:d}:{output:d,error:`action "${t}" failed (status=${a.status})`}}catch(a){return{error:`action.run failed: ${a.message}`}}},fr=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.name??"");if(!t)return{error:`action.builtin "${r.node.id}" needs a "name" (e.g. "http.fetch")`};let n=e.input&&typeof e.input=="object"?e.input:{},{runBuiltin:i,getBuiltin:o}=await import("./builtin-W6KNX7RS.js");if(!o(t))return{error:`action.builtin "${r.node.id}": unknown built-in "${t}"`};try{return{output:await i(t,n)}}catch(s){let a=s?.name==="ZodError"?`validation: ${s.message}`:s?.message||String(s);return{error:`action.builtin "${t}" failed: ${a}`}}},gr=async r=>{let e=r.node.config,t=r.run.context;return typeof e.path=="string"&&e.path?{output:{value:j(t,e.path)}}:e.template&&typeof e.template=="object"?{output:b(e.template,t,{envAllow:r.workflow.envAllow})}:{output:{}}};function mr(r){if(r!=null){if(typeof r=="number")return new Date(Date.now()+r*6e4).toISOString();if(typeof r=="object"&&r&&"minutes"in r){let e=Number(r.minutes);if(Number.isFinite(e))return new Date(Date.now()+e*6e4).toISOString()}if(typeof r=="string"){let e=/^P(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9]+)S)?)?$/.exec(r);if(e){let t=Number(e[1]??0),n=Number(e[2]??0),i=Number(e[3]??0),o=Number(e[4]??0),s=((t*24+n)*60+i)*6e4+o*1e3;if(s>0)return new Date(Date.now()+s).toISOString()}}}}var hr=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.workflowId??"");if(!n)return{error:`subProcess "${r.node.id}" missing config.workflowId`};let i=r.run.depth??0,o=r.workflow.maxChildDepth??5;if(i+1>=o)return{error:`max child workflow depth ${o} exceeded at ${r.workflow.id} \u2192 ${n} (parent depth ${i})`};let s=e.inputMap,a={};if(s==="*")a={...r.run.context};else if(s&&typeof s=="object")for(let[d,c]of Object.entries(s))c&&typeof c=="object"&&!Array.isArray(c)?a[d]=b(c,r.run.context,{envAllow:r.workflow.envAllow}):typeof c=="string"&&(a[d]={value:A(c,r.run.context,{envAllow:r.workflow.envAllow})});return{paused:!0,pausedAt:{kind:"subProcess",nodeId:r.node.id,childRunId:"",childWorkflowId:n},spawnChild:{workflowId:n,input:a}}},yr=F,wr=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.name??"");if(!n)return{error:`signal.emit "${r.node.id}" missing config.name`};let i=t.scope==="global"?"global":"workflow",o=t.payload&&typeof t.payload=="object"?t.payload:{};return{output:{emittedAt:new Date().toISOString(),name:n,scope:i,payload:o},emitSignal:{name:n,scope:i,payload:o}}},kr=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.name??"");if(!n)return{error:`signal.wait "${r.node.id}" missing config.name`};let i=t.scope==="global"?"global":"workflow",o=e.match&&typeof e.match=="object"?e.match:{};return{paused:!0,pausedAt:{kind:"signalWait",nodeId:r.node.id,signalName:n,match:o,scope:i}}},br=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=mr(t.after??e.after);return n?{paused:!0,pausedAt:{kind:"timerWait",nodeId:r.node.id,fireAt:n}}:{error:`timer.boundary "${r.node.id}" needs config.after (duration or minutes)`}},vr=async()=>({output:{}}),Sr=async r=>{let e=r.node.config,n=(Array.isArray(e.inputs)?e.inputs:[]).map(s=>typeof s=="string"?A(s,r.run.context,{envAllow:r.workflow.envAllow}):s),i=Array.isArray(e.rules)?e.rules:[];for(let s of i){let a=Array.isArray(s.when)?s.when:[];if(a.length!==n.length)continue;let d=!0;for(let c=0;c<a.length;c++)if(!Ir(a[c],n[c])){d=!1;break}if(d)return{output:{...s.output??{},matchedPort:s.to??""},port:s.to}}let o=e.default;return{output:{...o?.output??{},matchedPort:o?.to??""},port:o?.to}};function Ir(r,e){if(r==null||r==="*")return!0;let t=String(r),n=typeof e=="number"?e:String(e??""),i=/^(>=|<=|>|<)\s*(-?\d+(?:\.\d+)?)$/.exec(t);if(i){let o=i[1],s=Number(i[2]),a=typeof n=="number"?n:Number(n);if(Number.isNaN(a))return!1;switch(o){case">":return a>s;case"<":return a<s;case">=":return a>=s;case"<=":return a<=s}}if(t.startsWith("!="))return String(n)!==t.slice(2);if(t.startsWith("/")&&t.endsWith("/")&&t.length>2)try{return new RegExp(t.slice(1,-1)).test(String(n))}catch{return!1}return String(n)===t}var Ft={"trigger.channel":F,"trigger.manual":F,"trigger.cron":F,"trigger.hook":F,"trigger.form":yr,"trigger.poll":F,agent:er,classify:Dt,branch:tr,transform:gr,"gateway.parallel":vr,rule:Sr,"action.send":nr,"action.createIssue":rr,"action.setLabel":sr,"action.readLabel":ar,"action.react":dr,"action.editMessage":cr,"action.logTime":lr,"action.callHTTP":ur,"action.run":pr,"action.builtin":fr,subProcess:hr,"signal.emit":wr,"signal.wait":kr,"timer.boundary":br,checkpoint:or,end:ir};function Ae(r){return Ft[r]}function Re(r,e){if(typeof e=="string"&&e)return e;let t=r.workflow.nodes.find(o=>o.type.startsWith("trigger."));if(!t)return;let i=r.run.context[t.id]?.accountId;return typeof i=="string"&&i?i:void 0}function $e(r){for(let e=r.run.history.length-1;e>=0;e--){let t=r.run.history[e],n=r.workflow.nodes.find(i=>i.id===t.nodeId);if(n?.type==="agent")return n.config.agentId??void 0}}function Ct(r){if(!r)return{};let e=r.match(/\bRESULT:\s*([a-z][a-z0-9_-]*)/i);if(e)return{result:e[1].toLowerCase()};let t=r.match(/\[(APPROVED|REJECTED|CHANGES[-_]REQUESTED|DONE|FAILED|SKIPPED)\]/i);return t?{result:t[1].toLowerCase().replace("_","-")}:{}}function Ar(r){let{result:e}=Ct(r);if(!r)return{result:e};let t=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(!t)return{result:e};try{return{result:e,json:JSON.parse(t[1])}}catch{return{result:e}}}var M=class{handlers=new Set;subscribe(e){return this.handlers.add(e),()=>this.handlers.delete(e)}emit(e){for(let t of this.handlers)try{Promise.resolve(t(e)).catch(()=>{})}catch{}}};function Q(r,e){if(r.name!==e.name||r.scope==="workflow"&&r.workflowId!==e.workflowId)return!1;for(let[t,n]of Object.entries(r.match??{}))if(!(n===void 0||n===""||n==="*")&&e.payload[t]!==n)return!1;return!0}function Rr(r,e,t=Date.now){return{ts:t(),source:"workflow",sourceEventId:`${r.workflowId}:${r.eventId}`,project:r.project,subject:`workflow:${r.workflowId}:entity:${r.entityRef.backend}:${r.entityRef.id}`,intent:`workflow.${r.triggerSource}`,rawJson:e}}function $r(r){return r.claimed&&r.runId?{agentId:`workflow-run:${r.runId}`,outcome:"dispatched",reason:r.reason??"claimed"}:r.claimed&&!r.runId?{agentId:null,outcome:"halted",reason:r.reason??"claimed-but-no-run"}:{agentId:null,outcome:"halted",reason:r.reason??"not-claimed"}}function xr(r){return{decidedBy:"workflow-dispatcher",decide:()=>({agentId:r.agentId,outcome:r.outcome==="deduped"?"halted":r.outcome,reason:r.outcome==="deduped"?`legacy-dedup: ${r.reason??""}`.trim():r.reason??null})}}function Mt(r,e,t,n,i=Date.now){let o=Rr(e,t,i),s=$r(n),a=xr(s),d=Ze(r,o,a,i);return Qe(r,"workflow",d,s,i),d}on();var Pr=4e3,Tr=8,xe=class{store;runs;nodeId;forwarder;channels;agents;log;timers;signals;events;ackTypingTimers=new Map;commitChains=new Map;constructor(e){this.store=e.store,this.runs=e.runs,this.nodeId=e.nodeId,this.forwarder=e.forwarder,this.channels=e.channels,this.agents=e.agents,this.log=e.log??(()=>{}),this.timers=e.timers??new ce({log:t=>this.log(t)}),this.signals=e.signals??new M,this.events=e.events,this.timers.onFire(t=>this.resumeFromTimer(t)),this.signals.subscribe(t=>this.resumeFromSignal(t))}emitRunEvent(e){if(this.events)try{this.events.publish({kind:"run",runId:e.runId,workflowId:e.workflowId,nodeId:e.nodeId,phase:e.phase,status:e.status,note:e.note,homeNode:e.homeNode,rootId:e.rootId})}catch{}}async commit(e,t){let i=(this.commitChains.get(e)??Promise.resolve()).then(()=>t(),()=>t());return this.commitChains.set(e,i.then(()=>{},()=>{})),i}emitSignal(e){let t={name:e.name,scope:e.scope??"global",workflowId:e.workflowId??"",payload:e.payload??{},emittedAt:new Date().toISOString()};if(this.signals.emit(t),this.events)try{this.events.publish({kind:"signal",name:t.name,scope:t.scope,workflowId:t.workflowId||void 0,payload:t.payload})}catch{}return t}async resumeFromSignal(e){let t=this.runs.list({limit:500});for(let n of t){if(n.status!=="paused"||!n.pausedAt||n.pausedAt.kind!=="signalWait")continue;let i={name:n.pausedAt.signalName,scope:n.pausedAt.scope,workflowId:n.workflowId,match:n.pausedAt.match??{}};if(!Q(i,e))continue;let o=this.store.list().find(s=>s.id===n.workflowId);o&&(await this.commit(n.id,()=>{let s=this.runs.get(n.id);if(!s||s.status!=="paused"||!s.pausedAt||s.pausedAt.kind!=="signalWait"||!Q({name:s.pausedAt.signalName,scope:s.pausedAt.scope,workflowId:s.workflowId,match:s.pausedAt.match??{}},e))return;let a=N(o,s.pausedAt.nodeId),d=a?o.edges.filter(u=>u.from===a.id).map(u=>u.to):[],c={receivedAt:new Date().toISOString(),name:e.name,payload:e.payload};this.runs.recordExecution({runId:s.id,entry:{at:c.receivedAt,nodeId:s.pausedAt.nodeId,inputKeys:[],status:"resumed",output:c,idempotencyKey:T(s.id,s.pausedAt.nodeId,`signal:${e.name}:${e.emittedAt}`)},nextPending:d,status:"running",pausedAt:null,context:{...s.context,[s.pausedAt.nodeId]:c}}),this.log(`[workflow:${o.id}] run ${s.id} resumed from signal "${e.name}"`),this.emitRunEvent({runId:s.id,workflowId:o.id,nodeId:s.pausedAt.nodeId,phase:"resumed",status:"running",note:`signal:${e.name}`,rootId:s.eventRootId})}),this.walk(o,n.id,`signal:${e.name}`).catch(s=>this.log(`[workflow:${o.id}] walk-after-signal failed: ${s.message}`)))}}async resumeFromTimer(e){let t=this.store.list().find(n=>n.id===(this.runs.get(e.runId)?.workflowId??""));t&&(await this.commit(e.runId,()=>{let n=this.runs.get(e.runId);if(!n||n.status!=="paused"||!n.pausedAt||n.pausedAt.kind!=="timerWait"||n.pausedAt.nodeId!==e.nodeId)return;let i=N(t,e.nodeId),o=i?t.edges.filter(d=>d.from===i.id).map(d=>d.to):[],s=new Date().toISOString(),a={firedAt:s,scheduledFor:e.fireAt};this.runs.recordExecution({runId:n.id,entry:{at:s,nodeId:e.nodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:T(n.id,e.nodeId,`timer:${e.id}`)},nextPending:o,status:"running",pausedAt:null,context:{...n.context,[e.nodeId]:a}}),this.log(`[workflow:${t.id}] run ${n.id} resumed from timer "${e.nodeId}" (fired ${s})`),this.emitRunEvent({runId:n.id,workflowId:t.id,nodeId:e.nodeId,phase:"resumed",status:"running",note:`timer:${e.id}`,rootId:n.eventRootId})}),this.walk(t,e.runId,`timer:${e.id}`).catch(n=>this.log(`[workflow:${t.id}] walk-after-timer failed: ${n.message}`)))}async dispatchWorkflow(e){let t=this.store.list().find(d=>d.id===e.workflowId);if(!t)return this.log(`[workflows] dispatchWorkflow: workflow "${e.workflowId}" not found`),{claimed:!1,run:null};let n=this.runs.getActiveByEntity(e.entityRef),i=n?this.runs.get(n):null;if(i&&i.workflowId!==t.id)return this.log(`[workflow:${t.id}] entity ${e.entityRef.id} has run ${i.id} of workflow "${i.workflowId}" \u2014 not dispatching`),{claimed:!1,run:null};let s=t.nodes.find(d=>d.type.startsWith("trigger."))?.config??{},a={source:e.trigger?.source??s.source??"hook",project:e.trigger?.project,repo:e.trigger?.repo,chat:e.trigger?.chat,labels:e.trigger?.labels};return this.dispatchOne(t,e.entityRef,e.event,a)}startChannelAck(e,t){let n=String(t.channel??""),i=String(t.chatId??"");if(!n||!i)return;let o=this.channels[n];if(!o)return;let s=typeof t.accountId=="string"?t.accountId:void 0,a=t.event,d=typeof a?.id=="string"?a.id:a?.id!=null?String(a.id):void 0;if(d&&o.react)try{Promise.resolve(o.react(i,d,"\u{1F440}",s)).catch(()=>{})}catch{}if(this.ackTypingTimers.has(e)||!o.sendTyping)return;let c=()=>{try{Promise.resolve(o.sendTyping(i,s)).catch(()=>{})}catch{}};c();let u=setInterval(c,Pr);this.ackTypingTimers.set(e,u)}stopChannelAck(e){let t=this.ackTypingTimers.get(e);t&&(clearInterval(t),this.ackTypingTimers.delete(e))}async dispatch(e){let t=this.matchByTrigger(e.trigger,e.fromRemote),i=t.some(a=>a.fanOut)?t:t.slice(0,1),o=[],s=[];for(let a of i){let d=await this.dispatchOne(a,e.entityRef,e.event,e.trigger);d.claimed&&o.push(a),d.run&&s.push(d.run)}return!e.fromRemote&&this.forwarder?.broadcastTrigger&&Promise.resolve(this.forwarder.broadcastTrigger({trigger:e.trigger,entityRef:e.entityRef,event:e.event})).catch(a=>this.log(`[mesh-broadcast] ${a?.message??a}`)),{claimed:o,runs:s}}matchByTrigger(e,t){let n=this.store.list(),i=[];for(let o of n){if(o.state&&o.state!=="active")continue;if(t){if(!o.mesh?.allowRemote)continue;let c=o.mesh.peers;if(c&&c.length>0&&!c.includes(t.peer))continue}let s=o.nodes.find(c=>c.type.startsWith("trigger."));if(!s)continue;let a=s.config;if(a.source!==e.source||o.project&&e.project&&o.project!==e.project)continue;let d=a.filter;if(d){if(d.project&&d.project!=="*"&&d.project!==e.project||d.repo&&d.repo!=="*"&&d.repo!==e.repo||d.chat&&d.chat!=="*"&&X(e.source,d.chat)!==X(e.source,e.chat))continue;if(d.labels?.length){let c=new Set(e.labels??[]);if(!d.labels.some(p=>c.has(p)))continue}}i.push(o)}return i.sort((o,s)=>s.priority-o.priority||o.id.localeCompare(s.id))}async dispatchOne(e,t,n,i){let o=await this.dispatchOneLegacy(e,t,n,i);if(Ve("workflow")!=="off")try{Mt(ze(),{workflowId:e.id,eventId:n.id,triggerSource:i.source,project:i.project??null,entityRef:t},JSON.stringify({event:n,trigger:i,entityRef:t}),{claimed:o.claimed,runId:o.run?.id??null})}catch(s){this.log(`[ledger] workflow ${e.id} run ${o.run?.id??"?"} record failed: ${s?.message??s}`)}return o}async dispatchOneLegacy(e,t,n,i){let o=this.runs.getActiveByEntity(t),s=o?this.runs.getHomeNodeByEntity(t):null;if(o&&s&&s!==this.nodeId){if(!this.forwarder)return this.log(`[workflow:${e.id}] run ${o} home'd on "${s}" but no forwarder \u2014 dropping`),{claimed:!1,run:null};try{await this.forwarder.forwardTransition(s,{workflowId:e.id,event:n,entityRef:t})}catch(d){this.log(`[workflow:${e.id}] forward to "${s}" failed: ${d.message}`)}return{claimed:!0,run:null}}let a=o?this.runs.get(o):null;if(a)if(a.status==="paused"&&a.pausedAt){if(a.pausedAt.kind!=="checkpoint")return this.log(`[workflow:${e.id}] run ${a.id} paused on ${a.pausedAt.kind} \u2014 channel event bypasses workflow`),{claimed:!1,run:null};if(!Or(a.pausedAt.resumeMatch,i,n))return this.log(`[workflow:${e.id}] run ${a.id} paused but event doesn't match resumeMatch \u2014 dropping`),{claimed:!1,run:null};let d=N(e,a.pausedAt.nodeId),c=d?e.edges.filter(h=>h.from===d.id).map(h=>h.to):[],u={at:new Date().toISOString(),nodeId:a.pausedAt.nodeId,inputKeys:[],status:"resumed",output:{event:n.payload},idempotencyKey:T(a.id,a.pausedAt.nodeId,`resume:${n.id}`)},p={...a.context,[a.pausedAt.nodeId]:{event:n.payload}},f=a.pausedAt.checkpointName,g=this.runs.recordExecution({runId:a.id,entry:u,nextPending:c,status:"running",pausedAt:null,context:p});g&&(a=g),this.log(`[workflow:${e.id}] run ${a.id} resumed from checkpoint "${f}"`),i.source.endsWith("-message")&&this.startChannelAck(a.id,n.payload)}else return a.status==="running"?(this.log(`[workflow:${e.id}] run ${a.id} already running; dropping concurrent event ${n.id}`),{claimed:!0,run:null}):(this.log(`[workflow:${e.id}] run ${a.id} is ${a.status}; dropping event ${n.id}`),{claimed:!1,run:null});else{let d=G(e);if(!d)return this.log(`[workflow:${e.id}] no trigger node found`),{claimed:!1,run:null};a=this.runs.create({workflowId:e.id,initialPending:d.pending,entityRef:t,initialContext:{[d.triggerId]:n.payload}}),this.log(`[workflow:${e.id}] run ${a.id} created from trigger "${d.triggerId}" for ${t.id}`),this.emitRunEvent({runId:a.id,workflowId:e.id,phase:"created",status:a.status,homeNode:a.homeNode,rootId:a.eventRootId}),i.source.endsWith("-message")&&this.startChannelAck(a.id,n.payload)}return this.walk(e,a.id,n.id),{claimed:!0,run:a}}async walk(e,t,n){let i=this.runs.get(t)?.eventRootId,o=()=>this.walkInner(e,t,n);try{await(i?qe({rootId:i},o):o())}finally{this.stopChannelAck(t)}}async walkInner(e,t,n){let i=this.runs.get(t);if(i)for(;i.status==="running"&&i.pending.length>0;){let o=i.pending.slice(0,Tr);await Promise.allSettled(o.map(a=>this.executeNodeAndCommit(e,t,a,n)));let s=this.runs.get(t);if(!s||(i=s,i.status!=="running"))return}}async executeNodeAndCommit(e,t,n,i){let o=T(t,n,i),s=await this.commit(t,()=>{let m=this.runs.get(t);if(!m)return{kind:"done"};if(m.status!=="running")return{kind:"done"};let w=N(e,n);if(!w)return this.log(`[workflow:${e.id}] missing node "${n}" \u2014 marking run failed`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"failed",idempotencyKey:o,note:"node definition missing from workflow"},nextPending:m.pending.filter(R=>R!==n),status:"failed"}),{kind:"done"};let y=Ae(w.type);return y?m.history.some(R=>R.idempotencyKey===o)?(this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"skipped",idempotencyKey:o+"_dedup",note:"duplicate execution dropped"},nextPending:m.pending.filter(R=>R!==n)}),{kind:"done"}):{kind:"go",run:m,node:w,handler:y}:(this.log(`[workflow:${e.id}] no handler for node type "${w.type}"`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"failed",idempotencyKey:o,note:`no handler for node type "${w.type}"`},nextPending:m.pending.filter(R=>R!==n),status:"failed"}),{kind:"done"})});if(s.kind==="done")return;let{run:a,node:d,handler:c}=s,u=e.edges.filter(m=>m.to===n).map(m=>m.from),p;if(d.type!=="agent"){let m=ie();if(m)try{p=Xe(m,{agentId:`workflow:${d.type}`,channel:"workflow",chatId:`${e.id}:${n}`,workflowRunId:t,workflowId:e.id,workflowNodeId:n,messagePreview:`${d.type} ${n}`})}catch{}}let f=d.retry??{maxAttempts:1,backoffMs:1e3},g={error:"retry-loop did not run"},h=0;for(;h<f.maxAttempts;){h++;try{g=await c({workflow:e,run:a,node:d,channels:this.channels,agents:this.agents,forwardChannelSend:this.forwarder?.forwardChannelSend?.bind(this.forwarder),log:this.log})}catch(m){this.log(`[workflow:${e.id}] handler "${d.type}" threw: ${m.message}`),g={error:m.message}}if(!g.error||g.paused)break;if(h<f.maxAttempts){let m=f.backoffMs*Math.pow(2,h-1);this.log(`[workflow:${e.id}] node "${n}" failed (attempt ${h}/${f.maxAttempts}): ${g.error.slice(0,120)} \u2014 retrying in ${m}ms`),await new Promise(w=>setTimeout(w,m))}}if(p){let m=ie();if(m)try{et(m,p,{status:g.error?"error":"ok",error:g.error??null})}catch{}}await this.commit(t,async()=>{let m=this.runs.get(t);if(!m)return;let w=new Date().toISOString(),y=m.pending.filter(k=>k!==n);if(g.error){let k=m.status==="running"?"failed":void 0;this.runs.recordExecution({runId:t,entry:{at:w,nodeId:n,inputKeys:u,status:"failed",idempotencyKey:o,note:g.error.slice(0,200)},nextPending:y,status:k}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:"failed",status:k??m.status,note:g.error.slice(0,200)});return}if(g.paused&&g.pausedAt){let k=g.pausedAt,P=null;if(g.spawnChild&&k.kind==="subProcess"){if(P=await this.spawnChild({parent:m,parentNodeId:n,childWorkflowId:g.spawnChild.workflowId,input:g.spawnChild.input}),!P){this.runs.recordExecution({runId:t,entry:{at:w,nodeId:n,inputKeys:u,status:"failed",idempotencyKey:o,note:`subProcess: child workflow "${g.spawnChild.workflowId}" not found`},nextPending:y,status:"failed"});return}k={...k,childRunId:P.id}}if(this.runs.recordExecution({runId:t,entry:{at:w,nodeId:n,inputKeys:u,status:"paused",idempotencyKey:o},nextPending:y,status:"paused",pausedAt:k}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:"paused",status:"paused",note:k.kind}),P&&this.kickChildWalk(P),k.kind==="timerWait")try{this.timers.schedule({runId:t,workflowId:e.id,nodeId:k.nodeId,fireAt:k.fireAt,cancelKey:`${t}:${k.nodeId}`})}catch(We){this.log(`[workflow:${e.id}] timer schedule failed: ${We.message}`)}return}let R=g.output??{},Qt={...m.context,[n]:R},{nextPending:Xt}=ve({workflow:e,fromNodeId:n,selectedPort:g.port}),re=[],_={...m.joinCounters??{}};for(let k of Xt){let P=N(e,k);if(!(P?.type==="gateway.parallel"&&String(P.config?.mode??"fanOut")==="join")){re.push(k);continue}let H=_[k]??[];H.includes(n)||H.push(n),_[k]=H;let nn=e.edges.filter(rn=>rn.to===k).length;H.length>=nn&&(re.push(k),delete _[k])}let en=[...y,...re],L=d.type==="end",tn=m.status==="running"?L?String(d.config.status??"completed"):"running":void 0,O=this.runs.recordExecution({runId:t,entry:{at:w,nodeId:n,inputKeys:u,status:"ok",output:R,idempotencyKey:o},nextPending:L?[]:en,status:tn,context:Qt,joinCounters:_});this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:L?"completed":"ok",status:O?.status??m.status}),g.emitSignal&&this.emitSignal({name:g.emitSignal.name,scope:g.emitSignal.scope,workflowId:e.id,payload:g.emitSignal.payload}),L&&O&&O.parentRunId&&O.parentNodeId&&this.resumeParent({parentRunId:O.parentRunId,parentNodeId:O.parentNodeId,childRun:O}).catch(k=>this.log(`[workflow:${e.id}] resumeParent failed: ${k.message}`))})}async spawnChild(e){let t=this.store.list().find(a=>a.id===e.childWorkflowId);if(!t)return null;let n=G(t);if(!n)return this.log(`[workflow:${t.id}] no trigger node \u2014 cannot spawn as child`),null;let i={...e.input};i[n.triggerId]={...i[n.triggerId]??{},parentRunId:e.parent.id,parentNodeId:e.parentNodeId};let o={backend:"agentx-internal",id:`subprocess:${e.parent.id}:${e.parentNodeId}`},s=this.runs.create({workflowId:t.id,initialPending:n.pending,entityRef:o,initialContext:i,parentRunId:e.parent.id,parentNodeId:e.parentNodeId,rootRunId:e.parent.rootRunId??e.parent.id,depth:(e.parent.depth??0)+1});return this.log(`[workflow:${t.id}] child run ${s.id} spawned from ${e.parent.id}/${e.parentNodeId} (depth ${s.depth})`),s}kickChildWalk(e){let t=this.store.list().find(n=>n.id===e.workflowId);t&&this.walk(t,e.id,`spawn:${e.parentRunId}:${e.parentNodeId}`).catch(n=>this.log(`[workflow:${t.id}] child walk failed: ${n.message}`))}async resumeParent(e){let t=this.runs.get(e.parentRunId);if(!t)return;let n=this.store.list().find(i=>i.id===t.workflowId);n&&(await this.commit(e.parentRunId,()=>{let i=this.runs.get(e.parentRunId);if(!i||i.status!=="paused"||!i.pausedAt||i.pausedAt.kind!=="subProcess"||i.pausedAt.nodeId!==e.parentNodeId||i.pausedAt.childRunId!==e.childRun.id)return;let o=N(n,e.parentNodeId),s=o?n.edges.filter(d=>d.from===o.id).map(d=>d.to):[],a={childRunId:e.childRun.id,status:e.childRun.status,output:Nr(e.childRun)};this.runs.recordExecution({runId:i.id,entry:{at:new Date().toISOString(),nodeId:e.parentNodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:T(i.id,e.parentNodeId,`child:${e.childRun.id}`)},nextPending:s,status:"running",pausedAt:null,context:{...i.context,[e.parentNodeId]:a}}),this.log(`[workflow:${n.id}] parent run ${i.id} resumed from subProcess child ${e.childRun.id}`),this.emitRunEvent({runId:i.id,workflowId:n.id,nodeId:e.parentNodeId,phase:"resumed",status:"running",note:`child:${e.childRun.id}`,rootId:i.eventRootId})}),this.walk(n,e.parentRunId,`child:${e.childRun.id}`))}};function Nr(r){for(let e=r.history.length-1;e>=0;e--){let t=r.history[e];if(t.status==="ok"&&t.output&&Object.keys(t.output).length>0)return t.output}return{}}function Or(r,e,t){let n=o=>{let s=r[o];if(s===void 0||s===""||s==="*")return!0;if(Array.isArray(s)){let a=new Set(e.labels??[]);return s.some(d=>a.has(String(d)))}return o==="chat"?X(e.source,String(s))===X(e.source,e.chat):e[o]===s};if(!n("source")||!n("project")||!n("repo")||!n("chat"))return!1;let i=r.eventIdLike;return!(typeof i=="string"&&i&&!t.id.includes(i))}function X(r,e){return e==null?"":r==="whatsapp-message"?e.replace(/@s\.whatsapp\.net$|@g\.us$/i,"").replace(/[\s+()]/g,""):e}function Wr(r){return{"pre:channel-message":async e=>{let t=e.msg;if(!t)return{};let n=Er(t.channel);if(!n)return{};let i=t.group?.id??t.sender.id,o={backend:t.channel,id:`${t.channel}:${i}`},{claimed:s}=await r.dispatch({trigger:{source:n,chat:i},entityRef:o,event:{id:`${t.channel}:${t.accountId}:${t.id}`,payload:Dr(t)}});return s.length===0?{}:s.every(d=>d.nodes.find(u=>u.type.startsWith("trigger."))?.config?.passthrough===!0)?{}:{blocked:!0,message:`handled by workflow${s.length>1?"s":""}: ${s.map(d=>d.id).join(", ")}`}},"on:gitlab-issue":async e=>{let t=e.project,n=e.iid,i=e.issueEvent;if(!t||n===void 0)return{};let o=Array.isArray(i?.object_attributes?.labels)?i.object_attributes.labels.map(d=>typeof d=="string"?d:d?.title).filter(Boolean):i?.labels?.map(d=>d?.title)??[],s=i?.assignees??i?.object_attributes?.assignee_ids??[],a={backend:"gitlab",id:`${t}#${n}`};return await r.dispatch({trigger:{source:"gitlab-issue",project:t,labels:o},entityRef:a,event:{id:`gitlab-issue:${t}:${n}:${i?.object_attributes?.updated_at||i?.object_attributes?.action||"evt"}`,payload:{issue:{iid:n,title:i?.object_attributes?.title,description:i?.object_attributes?.description,url:i?.object_attributes?.url,action:i?.object_attributes?.action,labels:o,assignees:s},project:t,channel:"gitlab",chatId:`${t}:issue:${n}`}}}),{}},"on:gitlab-mr":async e=>{let t=e.project,n=e.iid,i=e.mrEvent;if(!t||n===void 0)return{};let o=Array.isArray(e.labels)?e.labels:Array.isArray(i?.object_attributes?.labels)?i.object_attributes.labels.map(c=>typeof c=="string"?c:c?.title).filter(Boolean):[],s=i?.assignees??i?.object_attributes?.assignee_ids??[],a=i?.reviewers??[],d={backend:"gitlab",id:`${t}!${n}`};return await r.dispatch({trigger:{source:"gitlab-mr",project:t,labels:o},entityRef:d,event:{id:`gitlab-mr:${t}:${n}:${i?.object_attributes?.updated_at||i?.object_attributes?.action||"evt"}`,payload:{mr:{iid:n,title:e.title,description:e.description,url:e.url,action:e.action,state:e.state,source_branch:e.source_branch,target_branch:e.target_branch,labels:o,assignees:s,reviewers:a},project:t,channel:"gitlab",chatId:`${t}:merge_request:${n}`,iid:n,title:e.title,description:e.description,url:e.url,action:e.action,state:e.state,source_branch:e.source_branch,target_branch:e.target_branch,labels:o}}}),{}},"on:gitlab-note":async e=>{let t=e.project,n=e.noteId,i=e.noteableType,o=e.noteableIid,s=e.text,a=e.authorUsername,d=e.mentions??[];if(!t||!n||!i||!o)return{};let c=i==="merge_request"?{backend:"gitlab",id:`${t}!${o}`}:{backend:"gitlab",id:`${t}#${o}`};return await r.dispatch({trigger:{source:"gitlab-note",project:t},entityRef:c,event:{id:`gitlab-note:${t}:${i}:${o}:${n}`,payload:{note:{id:n,text:s,author:a,mentions:d,noteableType:i,noteableIid:o,noteableTitle:e.noteableTitle},project:t,channel:"gitlab",chatId:`${t}:${i}:${o}`,noteId:n,noteableType:i,noteableIid:o,text:s,author:a,mentions:d}}}),{}},"on:gitlab-pipeline":async e=>{let t=e.project,n=e.pipelineId,i=e.status,o=e.ref;if(!t||!i)return{};let a=e.raw?.merge_request?.iid;if(!a)return{};let d={backend:"gitlab",id:`${t}!${a}`};return await r.dispatch({trigger:{source:"gitlab-pipeline",project:t},entityRef:d,event:{id:`gitlab-pipeline:${t}:${n}:${i}`,payload:{pipeline:{id:n,status:i,ref:o},project:t,channel:"gitlab",chatId:`${t}:merge_request:${a}`}}}),{}}}}function Er(r){switch(r){case"telegram":return"telegram-message";case"whatsapp":return"whatsapp-message";case"discord":return"discord-message";case"slack":return"slack-message";default:return null}}function Dr(r){let e=r.group?.id??r.sender.id;return{channel:r.channel,chatId:e,accountId:r.accountId,text:r.text,fromJid:r.sender.id,sender:{id:r.sender.id,name:r.sender.name,username:r.sender.username},contact:r.channelMeta?.facts?{facts:r.channelMeta.facts}:void 0,group:r.group?{id:r.group.id,name:r.group.name}:void 0,channelMeta:r.channelMeta,replyTo:r.replyTo,replyToText:r.replyToText,media:r.media,event:{id:r.id,timestamp:r.timestamp?.toISOString?.()??new Date().toISOString()}}}var ee=r=>r.trim().toLowerCase().replace(/^@/,"");function jr(r){let e=typeof r.author=="string"?r.author:typeof r.authorUsername=="string"?r.authorUsername:void 0;if(e)return ee(e);let n=r.payload?.sender?.login;return typeof n=="string"&&n?ee(n):void 0}function Fr(r,e){let t=typeof e.project=="string"?e.project:"";if(r==="on:gitlab-issue"||r==="on:gitlab-mr")return!t||e.iid==null?void 0:`gitlab:${t}${r==="on:gitlab-issue"?"#":"!"}${String(e.iid)}`;if(r==="on:gitlab-note"){let n=e.noteableIid!=null?String(e.noteableIid):"",i=typeof e.noteableType=="string"?e.noteableType:"";return!t||!n||!i?void 0:`gitlab:${t}${i==="issue"?"#":"!"}${n}`}if(r==="on:github-issue"||r==="on:github-pr"){let n=e.payload??{},i=typeof e.repo=="string"?e.repo:n.repository?.full_name,o=e.number??n.issue?.number??n.pull_request?.number;return typeof i!="string"||!i||o==null?void 0:`github:${i}#${String(o)}`}}function Cr(r){let e=new Set;for(let t of r.nodes){let n=t.type==="agent"?t.config.agentId:void 0;typeof n=="string"&&n&&e.add(n)}return[...e]}var te=class{constructor(e=2e3){this.maxKeys=e}fires=new Map;tryFire(e,t,n,i=Date.now()){let o=(this.fires.get(e)??[]).filter(s=>i-s<n);if(o.length>=t)return this.fires.set(e,o),!1;for(o.push(i),this.fires.delete(e),this.fires.set(e,o);this.fires.size>this.maxKeys;){let s=this.fires.keys().next().value;if(s===void 0)break;this.fires.delete(s)}return!0}get size(){return this.fires.size}};function Pe(r,e,t){let n=r.logged??(r.logged=new Set);n.has(e)||(n.add(e),r.log(t))}function _t(r,e,t,n,i){let o=jr(t);if(o&&Array.isArray(n?.ignoreAuthors)&&n.ignoreAuthors.length>0&&n.ignoreAuthors.map(ee).includes(o))return{skip:!0,reason:"ignored-author",detail:`author @${o} is in filter.ignoreAuthors`};if(n?.skipSelfAuthored===!0){let a=Cr(r),d=typeof t.authorAgent=="string"?t.authorAgent:void 0;if(d&&a.includes(d))return{skip:!0,reason:"self-authored",detail:`author @${o??"?"} is agent "${d}" which this workflow runs`};if(o){let c=new Set(a.flatMap(u=>(i.forgeUsernames?.(u)??[]).map(ee)));if(c.has(o))return{skip:!0,reason:"self-authored",detail:`author @${o} is this workflow's own bot identity`};a.length===0?Pe(i,`noagents:${r.id}`,`[workflows] ${r.id} has no agent node \u2014 self-authored skip can't resolve a bot identity; only filter.ignoreAuthors applies`):c.size===0&&!("authorAgent"in t)&&Pe(i,`noident:${r.id}:${e}`,`[workflows] ${r.id} no forge username known for agent(s) ${a.join(", ")} on ${e} \u2014 self-authored skip inactive; only filter.ignoreAuthors applies`)}}let s=n?.maxFiresPerTarget;if(s&&typeof s.count=="number"&&s.count>0){let a=Fr(e,t);if(a){let d=typeof s.windowMinutes=="number"&&s.windowMinutes>0?s.windowMinutes:60,c=i.now?.()??Date.now();if(!i.fireWindow.tryFire(`${r.id}|${a}`,s.count,d*6e4,c))return{skip:!0,reason:"chain-limit",detail:`${a} already fired ${s.count}x within ${d}m (filter.maxFiresPerTarget)`}}else Pe(i,`notarget:${r.id}:${e}`,`[workflows] ${r.id} filter.maxFiresPerTarget has no target key for ${e} \u2014 limit not applied`)}return{skip:!1}}function Mr(r){let e=r.store.list(),t={fireWindow:new te,log:r.log,forgeUsernames:r.forgeUsernames,logged:new Set},n=0,i=0;for(let o of e){if(o.state&&o.state!=="active"){r.log(`[workflows] ${o.id} state=${o.state} \u2014 skipping trigger registration`);continue}let s=o.nodes.find(a=>a.type.startsWith("trigger."));if(s){if(s.type==="trigger.cron"){let a=s.config;if(!a.spec){r.log(`[workflows] ${o.id} trigger.cron missing config.spec \u2014 skipping`);continue}Lr({workflowId:o.id,triggerNodeId:s.id,spec:a.spec,timezone:a.timezone??"UTC"},r.dispatcher,r.log),n++}else if(s.type==="trigger.hook"){let a=s.config;if(!a.event||!a.event.startsWith("on:")){r.log(`[workflows] ${o.id} trigger.hook config.event must start with "on:" \u2014 skipping`);continue}r.hooks.registerHandler(a.event,`workflows:${o.id}`,async d=>{try{let c=typeof d.project=="string"?d.project:void 0;if(o.project&&c&&o.project!==c)return{};if(a.filter){if(Array.isArray(a.filter.topic)&&a.filter.topic.length>0){let h=typeof d.topic=="string"?d.topic.toLowerCase():void 0;if(!h||!a.filter.topic.map(m=>m.toLowerCase()).includes(h))return{}}if(Array.isArray(a.filter.action)&&a.filter.action.length>0){let h=typeof d.action=="string"?d.action:void 0;if(!h||!a.filter.action.includes(h))return{}}if(Array.isArray(a.filter.mentions)&&a.filter.mentions.length>0){let h=Array.isArray(d.mentions)?d.mentions.map(y=>y.toLowerCase().replace(/^@/,"")):[];if(!a.filter.mentions.map(y=>y.toLowerCase().replace(/^@/,"")).some(y=>h.includes(y)))return{}}if(Array.isArray(a.filter.noteableType)&&a.filter.noteableType.length>0){let h=typeof d.noteableType=="string"?d.noteableType.toLowerCase():void 0,m=a.filter.noteableType.map(w=>w.toLowerCase());if(!h||!m.includes(h))return{}}if(Array.isArray(a.filter.assigneesAdded)&&a.filter.assigneesAdded.length>0){let h=Array.isArray(d.assigneesAdded)?d.assigneesAdded.map(y=>y.toLowerCase().replace(/^@/,"")):[];if(!a.filter.assigneesAdded.map(y=>y.toLowerCase().replace(/^@/,"")).some(y=>h.includes(y)))return{}}if(Array.isArray(a.filter.reviewersAdded)&&a.filter.reviewersAdded.length>0){let h=Array.isArray(d.reviewersAdded)?d.reviewersAdded.map(y=>y.toLowerCase().replace(/^@/,"")):[];if(!a.filter.reviewersAdded.map(y=>y.toLowerCase().replace(/^@/,"")).some(y=>h.includes(y)))return{}}if(Array.isArray(a.filter.labelsAdded)&&a.filter.labelsAdded.length>0){let h=Array.isArray(d.labelsAdded)?d.labelsAdded.map(y=>y.toLowerCase()):[];if(!a.filter.labelsAdded.map(y=>y.toLowerCase()).some(y=>h.includes(y)))return{}}}let u=_t(o,a.event,d,a.filter,t);if(u.skip){if(r.log(`[workflows] ${o.id} skipping ${a.event} (${u.reason}): ${u.detail}`),a.passthrough)return{};let h=d.__workflowClaimed;return{modified:{__workflowClaimed:[...Array.isArray(h)?h:[],o.id]}}}let p=_r(o.id,a.event,d);if(await r.dispatcher.dispatchWorkflow({workflowId:o.id,entityRef:{backend:"hook",id:p},event:{id:`hook:${a.event}:${Date.now().toString(36)}`,payload:{hookEvent:a.event,...d}}}),a.passthrough)return{};let f=d.__workflowClaimed;return{modified:{__workflowClaimed:[...Array.isArray(f)?f:[],o.id]}}}catch(c){return r.log(`[workflows] ${o.id} hook dispatch failed: ${c.message}`),{}}},60),i++}}}return{cronTimers:n,hookSubscribers:i}}function _r(r,e,t){let n=typeof t.project=="string"?t.project:"",i=t.iid!=null?String(t.iid):"";if(e==="on:gitlab-issue"&&n&&i)return`${r}:${e}:${n}#${i}`;if(e==="on:gitlab-mr"&&n&&i)return`${r}:${e}:${n}!${i}`;if(e==="on:gitlab-pipeline"&&n){let o=t.pipelineId!=null?String(t.pipelineId):"";if(o)return`${r}:${e}:${n}@pipeline:${o}`}return`${r}:${e}:${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function Lr(r,e,t){let n=()=>{let i;try{i=tt(r.spec,new Date,r.timezone)}catch(s){t(`[workflows] ${r.workflowId} cron spec invalid: ${s.message}`);return}let o=Math.max(1e3,i.getTime()-Date.now());setTimeout(()=>{(async()=>{let s=`cron:${r.workflowId}:${i.toISOString()}`;try{await e.dispatchWorkflow({workflowId:r.workflowId,trigger:{source:"cron"},entityRef:{backend:"cron",id:`${r.workflowId}@${i.toISOString()}`},event:{id:s,payload:{now:i.toISOString(),spec:r.spec,workflowId:r.workflowId}}})}catch(a){t(`[workflows] ${r.workflowId} cron dispatch failed: ${a.message}`)}finally{n()}})()},o)};n()}import{createHash as Hr}from"crypto";import{existsSync as Ur,mkdirSync as Kr,readFileSync as Br,renameSync as zr,writeFileSync as Jr}from"fs";import{resolve as Lt}from"path";import{z as C}from"zod";var Ht=C.object({actionId:C.string().min(1),everySeconds:C.number().int().min(5).max(86400).default(60),key:C.string().min(1).default("id"),filter:C.array(ue).default([]),maxPerPoll:C.number().int().min(1).max(500).default(20)}),qr=5e3,Yr=30;async function Gr(r){let e=new Ye().get(r);if(!e)throw new Error(`no action "${r}" in registry`);return Ge(e)}function Ut(r,e){let t=[],n=0;for(let i of r.split(`
20
20
  `)){let o=i.trim();if(!o)continue;let s;try{s=JSON.parse(o)}catch{n++;continue}if(!s||typeof s!="object"||Array.isArray(s)){n++;continue}let a=j(s,e);if((typeof a!="string"||!a)&&typeof a!="number"){n++;continue}t.push({key:String(a),value:s})}return{items:t,skipped:n}}function Vr(r,e){let t=`${r}:${e}`;return/^[a-zA-Z0-9._:@-]+$/.test(e)&&t.length<=200?t:`${r}:#${Hr("sha256").update(e).digest("hex").slice(0,32)}`}var Te=class{constructor(e){this.opts=e;this.stateDir=Lt(e.store.baseDir,"_poll"),this.runAction=e.runAction??Gr}timers=new Map;warned=new Map;stateDir;runAction;resync;start(){return this.resync??=setInterval(()=>{try{this.sync()}catch(e){this.opts.log(`[workflows] poll sync failed: ${e.message}`)}},Yr*1e3),this.sync()}sync(){let e=new Map;for(let t of this.opts.store.list()){let n=this.configOf(t);n&&e.set(t.id,n)}for(let[t,n]of this.timers)e.has(t)||(clearTimeout(n),this.timers.delete(t),this.opts.log(`[workflows] ${t} poll stopped`));for(let[t,n]of e)this.timers.has(t)||(this.schedule(t,n.everySeconds),this.opts.log(`[workflows] ${t} polls action "${n.actionId}" every ${n.everySeconds}s`));return this.timers.size}stop(){this.resync&&clearInterval(this.resync),this.resync=void 0;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}async pollOnce(e){let t=this.opts.store.get(e),n=t?this.configOf(t):null;if(!n)return 0;let i;try{i=await this.runAction(n.actionId)}catch(f){return this.warnOnce(e,`poll failed: ${f.message}`),0}if(!i.ok)return this.warnOnce(e,`poll failed (status=${i.status??"?"}): ${(i.errors??"").slice(0,200)}`),0;let{items:o,skipped:s}=Ut(i.output,n.key);this.warnOnce(e,s>0?`poll skipped ${s} line(s) that are not a JSON object with "${n.key}"`:"");let a=new Set(o.map(f=>f.key)),d=this.readState(e);if(!d||d.actionId!==n.actionId||d.key!==n.key)return this.writeState(e,{actionId:n.actionId,key:n.key,seen:[...a]},a),this.opts.log(`[workflows] ${e} poll baseline: ${a.size} existing item(s) recorded, no runs started`),0;let c=new Set(d.seen),u=0,p=!1;for(let f of o){if(c.has(f.key))continue;let g=n.filter.every(h=>Y(h,f.value));if(!(g&&u>=n.maxPerPoll)){if(c.add(f.key),d.seen.push(f.key),!g){p=!0;continue}this.writeState(e,d,a),p=!1;try{let{run:h}=await this.opts.dispatcher.dispatchWorkflow({workflowId:e,trigger:{source:"poll"},entityRef:{backend:"poll",id:Vr(e,f.key)},event:{id:`poll:${e}:${f.key}`,payload:f.value}});h?u++:this.opts.log(`[workflows] ${e} poll item "${f.key}" started no run`)}catch(h){this.opts.log(`[workflows] ${e} poll dispatch failed for "${f.key}": ${h.message}`)}}}return p&&this.writeState(e,d,a),u}schedule(e,t){let n=setTimeout(()=>{(async()=>{try{await this.pollOnce(e)}catch(s){this.opts.log(`[workflows] ${e} poll failed: ${s.message}`)}if(this.timers.get(e)!==n)return;let i=this.opts.store.get(e),o=i?this.configOf(i):null;o?this.schedule(e,o.everySeconds):this.timers.delete(e)})()},t*1e3);this.timers.set(e,n)}configOf(e){if(e.state&&e.state!=="active")return null;let t=e.nodes.find(i=>i.type.startsWith("trigger."));if(!t||t.type!=="trigger.poll")return null;let n=Ht.safeParse(t.config);if(!n.success){let i=n.error.issues.map(o=>`${o.path.join(".")||"config"}: ${o.message}`).join("; ");return this.warnOnce(e.id,`trigger.poll config invalid, not polling (${i})`),null}return n.data}warnOnce(e,t){this.warned.get(e)!==t&&(this.warned.set(e,t),t&&this.opts.log(`[workflows] ${e} ${t}`))}statePath(e){return Lt(this.stateDir,`${e}.json`)}readState(e){let t=this.statePath(e);if(!Ur(t))return null;try{let n=JSON.parse(Br(t,"utf-8"));return typeof n.actionId!="string"||typeof n.key!="string"||!Array.isArray(n.seen)?null:{actionId:n.actionId,key:n.key,seen:n.seen.map(String)}}catch{return null}}writeState(e,t,n){let i=t.seen.length-qr;i>0&&(t.seen=t.seen.filter(s=>n.has(s)||i--<=0)),Kr(this.stateDir,{recursive:!0});let o=this.statePath(e);Jr(`${o}.tmp`,JSON.stringify(t)),zr(`${o}.tmp`,o)}};function Kt(r){return r.nodes.find(n=>n.type.startsWith("trigger."))?.config?.inputSchema??null}function Bt(r,e){if(!r||!e?.properties)return{};let t=r.match(/^([^:]+\/[^:]+):([^:]+):(.+)$/);if(!t)return{};let[,n,i,o]=t,s={};if(e.properties.project&&(s.project=n),i==="push"){let a=o.match(/^refs\/heads\/(.+)$/);a&&e.properties.ref&&(s.ref=a[1])}else{let a=Number(o);Number.isFinite(a)&&(e.properties.id&&(s.id=a),e.properties.iid&&(s.iid=a),e.properties.mrId&&(s.mrId=a),e.properties.issueId&&(s.issueId=a),e.properties.prId&&(s.prId=a))}return s}function zt(r,e){if(!r?.properties)return e;let t={...e};for(let[n,i]of Object.entries(r.properties))t[n]===void 0&&i&&"default"in i&&(t[n]=i.default);return t}function Jt(r,e){return!r?.required||!Array.isArray(r.required)?[]:r.required.filter(t=>{let n=e[t];return n===void 0||n===""||n===null})}function Qr(r,e){let t=Kt(r);if(!t?.properties){let d={};for(let[c,u]of Object.entries(e))u!==void 0&&(d[c]=u);return{inputs:d,missing:[],filledFrom:{passthrough:Object.keys(d),chatId:[],defaults:[]}}}let n={};for(let d of["message","agentId","channel","chatId","senderId","senderUsername"])t.properties[d]&&e[d]!==void 0&&(n[d]=e[d]);let i=Bt(e.chatId,t),o={...n,...i},s={...o};o=zt(t,o);let a=Object.keys(o).filter(d=>s[d]===void 0&&o[d]!==void 0);return{inputs:o,missing:Jt(t,o),filledFrom:{passthrough:Object.keys(n),chatId:Object.keys(i),defaults:a}}}import{extname as Xr}from"path";var qt=/<agentx-artifact>([\s\S]*?)<\/agentx-artifact>/gi,Yt=/<agentx-artifact>[\s\S]*$/i;function ps(r,e=1/0,t=!1){let n=[],i=String(r??"");if(!/<agentx-artifact>/i.test(i))return{text:i,artifacts:n};let o=i.replace(qt,(s,a)=>{try{let d=JSON.parse(a.trim());if(d&&typeof d.filename=="string"&&typeof d.mime=="string"&&n.length<e){let c=d.mime,u=c.startsWith("image/")?"image":c==="application/pdf"?"pdf":c.startsWith("text/")?"text":"file";n.push({type:u,filename:d.filename,mime:c})}}catch{}return""});return{text:(t?o.replace(Yt,""):o).trim(),artifacts:n}}function fs(r,e=!1){let t=String(r??""),n=t;if(/<agentx-artifact>/i.test(t)){let i=t.replace(qt,(o,s)=>{try{let a=JSON.parse(s.trim());return a&&typeof a.filename=="string"?a.filename:""}catch{return""}});n=(e?i.replace(Yt,""):i).trim()}return n.replace(/```[\s\S]*?```|`[^`\n]*`|!\[([^\]\n]*)\]\(([^)\s]+)\)/g,(i,o,s)=>o===void 0||s===void 0?i:`[${o||s}](${s})`)}var ei={".png":{mime:"image/png",kind:"image"},".jpg":{mime:"image/jpeg",kind:"image"},".jpeg":{mime:"image/jpeg",kind:"image"},".gif":{mime:"image/gif",kind:"image"},".webp":{mime:"image/webp",kind:"image"},".svg":{mime:"image/svg+xml",kind:"file"},".pdf":{mime:"application/pdf",kind:"file"},".txt":{mime:"text/plain; charset=utf-8",kind:"file"},".md":{mime:"text/markdown; charset=utf-8",kind:"file"},".csv":{mime:"text/csv; charset=utf-8",kind:"file"},".json":{mime:"application/json",kind:"file"},".mp3":{mime:"audio/mpeg",kind:"audio"},".m4a":{mime:"audio/mp4",kind:"audio"},".wav":{mime:"audio/wav",kind:"audio"},".mp4":{mime:"video/mp4",kind:"video"},".webm":{mime:"video/webm",kind:"video"}},gs={bytes:20*1024*1024,perMessage:20,pathChars:512};function ms(r){return ei[Xr(r).toLowerCase()]??null}var ti=["[Phone app: showing files]","To show the owner a file you created (a chart, a screenshot, a PDF, a recording), save or copy it into .agentx/outbox/ in your workspace and end your reply with one line per file:",'<agentx-artifact>{"filename":".agentx/outbox/<name.ext>","mime":"<mime/type>"}</agentx-artifact>',"Files outside your workspace (/tmp, your home folder) are refused. Outbox files are removed after 7 days.","The line is removed from the text. Images show in the reply, audio and video get a player, other files an Open link. Allowed: png, jpg, gif, webp, svg, pdf, txt, md, csv, json, mp3, m4a, wav, mp4, webm; up to 20 MB and 20 files per reply.","A picture already on the web can go inline as ![what it shows](https://...)."].join(`
21
21
  `);function hs(r,e,t){return r==="app"&&e&&t!==!1?ti:void 0}import{lstatSync as Oe,mkdirSync as ni,readdirSync as ri,realpathSync as Ne,unlinkSync as ii}from"fs";import{join as ne,resolve as Gt}from"path";var Vt=".agentx/outbox",oi=7*24*60*60*1e3;function si(r,e){try{let t=Ne(Gt(e,r)),n=ne(t,Vt);return Ne(n)===n&&Oe(n).isDirectory()?n:null}catch{return null}}function bs(r,e={}){let t=e.cwd??process.cwd();if(e.create!==!1)try{let i=Ne(Gt(t,r));Oe(ne(i,".agentx"),{throwIfNoEntry:!1})?.isSymbolicLink()||ni(ne(i,Vt),{recursive:!0})}catch{return 0}let n=si(r,t);return n?Zt(n,(e.now??Date.now())-(e.maxAgeMs??oi)):0}function Zt(r,e){let t=0;for(let n of ri(r)){let i=ne(r,n);try{let o=Oe(i);o.isDirectory()?t+=Zt(i,e):Math.max(o.mtimeMs,o.ctimeMs)<e&&(ii(i),t++)}catch{}}return t}export{it as a,pt as b,ft as c,Si as d,Sn as e,Ii as f,$ as g,pe as h,v as i,K as j,Dn as k,he as l,we as m,be as n,xe as o,Wr as p,Mr as q,Te as r,Qn as s,Qr as t,ps as u,fs as v,gs as w,ms as x,hs as y,Vt as z,bs as A};
22
- //# sourceMappingURL=chunk-ES7Z64Z5.js.map
22
+ //# sourceMappingURL=chunk-6G72CCT2.js.map
@@ -1,4 +1,4 @@
1
- import{b as C}from"./chunk-CECHWYJ2.js";import{a as L,b as _,c as R,d as j,e as M,j as I}from"./chunk-GUAJNZIX.js";import{v as x,w as O}from"./chunk-5GXCOHDM.js";import{c as A,d as D}from"./chunk-QOYAX2FT.js";import{readFileSync as y,writeFileSync as b,appendFileSync as P,existsSync as w,mkdirSync as $,readdirSync as v,statSync as B}from"fs";import{resolve as u,join as N,relative as k,dirname as U}from"path";O();var T=class{baseDir;rawDir;log;constructor(t=u(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki]")){this.baseDir=t,this.rawDir=u(t,"raw/entries"),this.log=e,$(this.rawDir,{recursive:!0}),$(u(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`,r=u(this.rawDir,e),n=["---",`id: ${t.id}`,`date: ${t.date}`,`agent: ${t.agentId}`,`source: ${t.source}`];if(t.sourceContext&&n.push(`context: ${t.sourceContext}`),t.meta)for(let[a,s]of Object.entries(t.meta))n.push(`${a}: ${JSON.stringify(s)}`);return n.push("---","",t.content),b(r,n.join(`
1
+ import{b as C}from"./chunk-CECHWYJ2.js";import{a as L,b as _,c as R,d as j,e as M,j as I}from"./chunk-BM6ZLX6F.js";import{v as x,w as O}from"./chunk-C4YY6746.js";import{c as A,d as D}from"./chunk-QOYAX2FT.js";import{readFileSync as y,writeFileSync as b,appendFileSync as P,existsSync as w,mkdirSync as $,readdirSync as v,statSync as B}from"fs";import{resolve as u,join as N,relative as k,dirname as U}from"path";O();var T=class{baseDir;rawDir;log;constructor(t=u(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki]")){this.baseDir=t,this.rawDir=u(t,"raw/entries"),this.log=e,$(this.rawDir,{recursive:!0}),$(u(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`,r=u(this.rawDir,e),n=["---",`id: ${t.id}`,`date: ${t.date}`,`agent: ${t.agentId}`,`source: ${t.source}`];if(t.sourceContext&&n.push(`context: ${t.sourceContext}`),t.meta)for(let[a,s]of Object.entries(t.meta))n.push(`${a}: ${JSON.stringify(s)}`);return n.push("---","",t.content),b(r,n.join(`
2
2
  `)),this.appendLog("ingest",`${t.id} from ${t.agentId} via ${t.source}`),e}listEntries(t){if(!w(this.rawDir))return[];let e=v(this.rawDir).filter(n=>n.endsWith(".md")).sort(),r=[];for(let n of e){let a=y(u(this.rawDir,n),"utf-8"),s=this.parseEntry(a,n);s&&(t?.agentId&&s.agentId!==t.agentId||t?.after&&s.date<t.after||t?.before&&s.date>t.before||r.push(s))}return r}parseEntry(t,e){let r=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!r)return null;let n=r[1],a=r[2].trim(),s=c=>n.match(new RegExp(`^${c}:\\s*(.+)$`,"m"))?.[1]?.trim()||"",o=new Set(["id","date","agent","source","context"]),i={};for(let c of n.split(`
3
3
  `)){let l=c.match(/^(\w+):\s*(.+)$/);if(!(!l||o.has(l[1])))try{i[l[1]]=JSON.parse(l[2])}catch{i[l[1]]=l[2].trim()}}return{id:s("id")||e.replace(".md",""),date:s("date"),agentId:s("agent"),source:s("source"),sourceContext:s("context")||void 0,content:a,meta:Object.keys(i).length>0?i:void 0}}writeArticle(t,e,r,n){let a=this.readArticle(t);if(a&&!this.canWrite(a.meta,n))return this.log(`Permission denied: "${n}" cannot write "${t}" (owner: ${a.meta.owner})`),!1;e.type&&!C(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 s=u(this.baseDir,t);a&&this.saveVersion(t,s),$(U(s),{recursive:!0});let o=["---",`title: "${e.title}"`];e.type&&o.push(`type: ${e.type}`),e.related?.length&&o.push(`related: [${e.related.map(c=>`"${c}"`).join(", ")}]`),o.push(`tags: [${(e.tags||[]).map(c=>`"${c}"`).join(", ")}]`,`owner: ${e.owner}`,`access: ${e.access}`),e.sharedWith?.length&&o.push(`shared_with: [${e.sharedWith.map(c=>`"${c}"`).join(", ")}]`),o.push(`created: ${e.created}`,`last_updated: ${e.lastUpdated}`,`sources: [${e.sources.map(c=>`"${c}"`).join(", ")}]`),e.graphPath?.length&&o.push(`graph_path: [${e.graphPath.map(c=>`"${c}"`).join(", ")}]`),o.push("---","",r),b(s,o.join(`
4
4
  `));let i=a?"update":"create";return this.appendLog(i,`${e.title} [${(e.tags||[]).slice(0,5).join(", ")}] by ${n} at ${t}`),!0}saveVersion(t,e){try{if(!w(e))return;let r=y(e,"utf-8"),n=new Date().toISOString().replace(/[:.]/g,"-"),a=u(this.baseDir,"_versions",t.replace(/\.md$/,""));$(a,{recursive:!0}),b(u(a,`${n}.md`),r)}catch{}}getVersions(t){let e=u(this.baseDir,"_versions",t.replace(/\.md$/,""));if(!w(e))return[];try{return v(e).filter(r=>r.endsWith(".md")).sort().reverse().map(r=>({timestamp:r.replace(/\.md$/,"").replace(/-/g,(n,a)=>a<19?a===10?"T":a===13||a===16?":":"-":n),path:u(e,r)}))}catch{return[]}}restoreVersion(t,e){let n=this.getVersions(t).find(a=>a.timestamp.startsWith(e));if(!n)return!1;try{let a=y(n.path,"utf-8"),s=u(this.baseDir,t);return this.saveVersion(t,s),b(s,a),this.appendLog("restore",`${t} restored to ${e}`),!0}catch{return!1}}readArticle(t){let e=u(this.baseDir,t);if(!w(e))return null;let r=y(e,"utf-8");return this.parseArticle(r,t)}readArticleAs(t,e){let r=this.readArticle(t);return!r||!this.canRead(r.meta,e)?null:r}parseArticle(t,e){let r=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!r)return null;let n=r[1],a=r[2].trim(),s=m=>n.match(new RegExp(`^${m}:\\s*(.+)$`,"m"))?.[1]?.trim().replace(/^"(.*)"$/,"$1")||"",o=m=>{let h=n.match(new RegExp(`^${m}:\\s*\\[(.*)\\]$`,"m"));return h?h[1].split(",").map(f=>f.trim().replace(/^"(.*)"$/,"$1")).filter(Boolean):[]},i=s("type")||s("kind"),l=new Set(["person","project","place","concept","event","decision","pattern"]).has(i)?i:void 0,p=o("tags").filter((m,h,f)=>m&&f.indexOf(m)===h),d=o("related"),g=o("graph_path");return{meta:{title:s("title"),type:l,related:d.length?d:void 0,tags:p,owner:s("owner"),access:s("access")||"public",sharedWith:o("shared_with"),created:s("created"),lastUpdated:s("last_updated"),sources:o("sources"),graphPath:g.length?g:void 0},content:a,path:e}}listCache=new Map;listArticles(t){let e=[],r=[];this.walkDir(this.baseDir,(o,i)=>{if(!o.endsWith(".md"))return;let c=k(this.baseDir,o);c.startsWith("raw/")||c.startsWith("_")||(e.push(c),r.push(`${c}:${i?.mtimeMs??"?"}:${i?.size??"?"}`))});let n=r.join("|"),a=this.listCache.get(t);if(a&&a.signature===n)return a.articles.slice();let s=[];for(let o of e){let i=this.readArticle(o);i&&this.canRead(i.meta,t)&&s.push(i)}return this.listCache.set(t,{signature:n,articles:s}),s.slice()}search(t,e,r=10){let n=t.toLowerCase(),a=[];if(this.walkDir(this.baseDir,d=>{if(!d.endsWith(".md"))return;let g=k(this.baseDir,d);if(g.startsWith("raw/")||g.startsWith("_"))return;let m=this.readArticle(g);!m||!this.canRead(m.meta,e)||a.push(m)}),a.length===0)return[];let s=a.map(d=>d.content),o=u(this.baseDir,"_bm25_cache.json"),i=D(s,o),c=A(t,i),l=new Map(c.map(d=>[d.docIndex,d.score]));return a.map((d,g)=>{let m=l.get(g)??0;return d.meta.title.toLowerCase().includes(n)&&(m+=10),d.meta.tags?.some(h=>h.toLowerCase().includes(n))&&(m+=5),{article:d,score:m}}).filter(d=>d.score>0).sort((d,g)=>g.score-d.score).slice(0,r).map(d=>d.article)}async findRelevantReranked(t,e,r=10,n={}){let a=Math.max(r,n.shortlist??_),s=this.findRelevant(t,e,a);if(s.length<2)return s.slice(0,r);let o=s.map((l,p)=>({id:`c${p}`,title:l.meta.title||`(untitled ${p})`,tags:l.meta.tags,excerpt:l.content})),i=await x(L,R({query:t,candidates:o,excerptChars:n.excerptChars}),j(o),{incumbent:{best:o[0].id},features:{agent:e??"unknown"}});return!i||i.mode!=="active"?s.slice(0,r):M(i.answers,o).ranked.map(l=>s[Number(l.slice(1))]).filter(l=>!!l).slice(0,r)}findRelevant(t,e,r=3,n,a={graph:.6,bm25:.4}){let s=[];if(this.walkDir(this.baseDir,h=>{if(!h.endsWith(".md"))return;let f=k(this.baseDir,h);if(f.startsWith("raw/")||f.startsWith("_"))return;let W=this.readArticle(f);!W||!this.canRead(W.meta,e)||s.push(W)}),s.length===0)return[];let o=s.map(h=>`${h.meta.title} ${(h.meta.tags||[]).join(" ")} ${h.content}`),i=u(this.baseDir,"_bm25_relevance_cache.json"),c=D(o,i),l=A(t,c),p=l.reduce((h,f)=>Math.max(h,f.score),0)||1,d=new Map(l.map(h=>[h.docIndex,h.score/p])),g=!!(n&&n.length>0);return s.map((h,f)=>{let W=d.get(f)??0,S=0;g&&h.meta.graphPath?.length&&(S=I(n,h.meta.graphPath));let E=g?a.graph*S+a.bm25*W:W;return{article:h,score:E}}).filter(h=>h.score>0).sort((h,f)=>f.score-h.score).slice(0,r).map(h=>h.article)}buildContext(t,e=4e3){if(t.length===0)return"";let r=["[Wiki Knowledge]"],n=0;for(let a of t){let s=`
@@ -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
  ${r}`}walkDir(t,e){if(w(t))for(let r of v(t)){let n=N(t,r),a=B(n);a.isDirectory()?this.walkDir(n,e):e(n,a)}}};export{T as a};
105
- //# sourceMappingURL=chunk-LUL4ILAQ.js.map
105
+ //# sourceMappingURL=chunk-6PTO6DWW.js.map