agentix-cli 0.122.0 → 0.124.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 (120) hide show
  1. package/dist/{App-2D5W26LY.js → App-BUYK4EGC.js} +2 -2
  2. package/dist/{ChatApp-FZFZD2XY.js → ChatApp-ZS6EPDDK.js} +2 -2
  3. package/dist/{agent-PCRE3TRK.js → agent-W7UNXO6L.js} +2 -2
  4. package/dist/{board-dashboard-ZDJ4UDW4.js → board-dashboard-3AOENRSG.js} +292 -226
  5. package/dist/board-dashboard-3AOENRSG.js.map +1 -0
  6. package/dist/{chunk-XLCUHG3N.js → chunk-46ACP7A7.js} +71 -69
  7. package/dist/chunk-46ACP7A7.js.map +1 -0
  8. package/dist/{chunk-ZLUROC2Y.js → chunk-46JKX6CT.js} +17 -17
  9. package/dist/chunk-46JKX6CT.js.map +1 -0
  10. package/dist/{chunk-ZWZADDXV.js → chunk-5DFUUYEA.js} +2 -2
  11. package/dist/{chunk-NFS2VR3L.js → chunk-5RE2B5YQ.js} +2 -2
  12. package/dist/{chunk-NYAMY7EA.js → chunk-6GLJIA25.js} +2 -2
  13. package/dist/{chunk-5SLTRG66.js → chunk-6HKLRU62.js} +2 -2
  14. package/dist/{chunk-XBRVV4ZT.js → chunk-6PJ6XHG4.js} +2 -2
  15. package/dist/{chunk-54XX2LSW.js → chunk-AKLZ4YO2.js} +4 -4
  16. package/dist/{chunk-54XX2LSW.js.map → chunk-AKLZ4YO2.js.map} +1 -1
  17. package/dist/{chunk-TYFGL2YS.js → chunk-B3B7KEHJ.js} +2 -2
  18. package/dist/{chunk-EHKI2RKD.js → chunk-BN5QMNON.js} +2 -2
  19. package/dist/{chunk-2UDSIG5K.js → chunk-BSTIA4M6.js} +2 -2
  20. package/dist/{chunk-YCMO3KZ4.js → chunk-CY6ABHF2.js} +2 -2
  21. package/dist/{chunk-BRVQZC6P.js → chunk-FHBPKMCF.js} +2 -2
  22. package/dist/{chunk-C52IPIKJ.js → chunk-INLKJEEN.js} +2 -2
  23. package/dist/chunk-ITATBKUL.js +37 -0
  24. package/dist/chunk-ITATBKUL.js.map +1 -0
  25. package/dist/{chunk-DMPTCBX6.js → chunk-K5QUQNFE.js} +3 -3
  26. package/dist/chunk-K5QUQNFE.js.map +1 -0
  27. package/dist/{chunk-UVV6GUOG.js → chunk-PAM56O25.js} +257 -254
  28. package/dist/chunk-PAM56O25.js.map +1 -0
  29. package/dist/{chunk-SB7WMFJV.js → chunk-QQYXYJOG.js} +2 -2
  30. package/dist/{chunk-WJDFR3WE.js → chunk-VHT7HESZ.js} +2 -2
  31. package/dist/{chunk-QCPSGOSK.js → chunk-WEPON4FP.js} +2 -2
  32. package/dist/{chunk-XX6MLDTL.js → chunk-WMTGAVPW.js} +2 -2
  33. package/dist/{chunk-YUNMSLZN.js → chunk-YL4C63S2.js} +2 -2
  34. package/dist/{chunk-7ZGTRXWS.js → chunk-YSIRJZWF.js} +2 -2
  35. package/dist/cli.js +1 -1
  36. package/dist/{client-TFZEASIJ.js → client-PO5LDFS4.js} +2 -2
  37. package/dist/config-L2RQ6EJX.js +2 -0
  38. package/dist/config-mutator-44OAOZXM.js +2 -0
  39. package/dist/doctor-AU5TCOSG.js +2 -0
  40. package/dist/{editor-chat-4MLCP5D2.js → editor-chat-ELKNLXM6.js} +10 -3
  41. package/dist/{editor-chat-4MLCP5D2.js.map → editor-chat-ELKNLXM6.js.map} +1 -1
  42. package/dist/follow-up-tool-AIOLNUF7.js +6 -0
  43. package/dist/follow-up-tool-AIOLNUF7.js.map +1 -0
  44. package/dist/{grants-NGBKFONG.js → grants-HIFE6L5N.js} +2 -2
  45. package/dist/index.d.ts +80 -3
  46. package/dist/index.js +1 -1
  47. package/dist/{program-CGPPGRMR.js → program-EJWE7NVT.js} +221 -221
  48. package/dist/program-EJWE7NVT.js.map +1 -0
  49. package/dist/{promote-VTVIPRTC.js → promote-DPPNEINZ.js} +2 -2
  50. package/dist/push-bridge-325SXDGN.js +1 -1
  51. package/dist/{query-3CVDT2GZ.js → query-SLUOL6MQ.js} +2 -2
  52. package/dist/{registry-NOJMMWE3.js → registry-UBVBEEDW.js} +2 -2
  53. package/dist/{request-planner-E2Q5O66N.js → request-planner-2G73AJ4S.js} +2 -2
  54. package/dist/{review-candidates-I36HEYKX.js → review-candidates-S34UICQD.js} +2 -2
  55. package/dist/routing-K2LAUFRL.js +2 -0
  56. package/dist/schedule-tool-YRANRFHO.js +2 -0
  57. package/dist/scheduler-L4P4Z55R.js +2 -0
  58. package/dist/{seat-NGY2BMP6.js → seat-ZJT5T2NO.js} +2 -2
  59. package/dist/{select-X7VBGZ6X.js → select-Y23SKHCJ.js} +2 -2
  60. package/dist/{set-enabled-6NP63KCU.js → set-enabled-YWXWSKME.js} +2 -2
  61. package/dist/{tool-EZIILXYL.js → tool-5JTCSRTW.js} +2 -2
  62. package/dist/{tool-WKIF52OH.js → tool-FZEC5FQX.js} +2 -2
  63. package/dist/web/workflow-editor.global.js +1 -1
  64. package/dist/web/workflow-editor.global.js.map +1 -1
  65. package/dist/wiki-ZZ3MU5Y5.js +2 -0
  66. package/package.json +1 -1
  67. package/dist/board-dashboard-ZDJ4UDW4.js.map +0 -1
  68. package/dist/chunk-DMPTCBX6.js.map +0 -1
  69. package/dist/chunk-TLCURHW3.js +0 -28
  70. package/dist/chunk-TLCURHW3.js.map +0 -1
  71. package/dist/chunk-UVV6GUOG.js.map +0 -1
  72. package/dist/chunk-XLCUHG3N.js.map +0 -1
  73. package/dist/chunk-ZLUROC2Y.js.map +0 -1
  74. package/dist/config-IXCOAOPZ.js +0 -2
  75. package/dist/config-mutator-EPYIZVSG.js +0 -2
  76. package/dist/doctor-G5TM5GVF.js +0 -2
  77. package/dist/program-CGPPGRMR.js.map +0 -1
  78. package/dist/routing-KBUZON5R.js +0 -2
  79. package/dist/schedule-tool-GUHHYYTO.js +0 -2
  80. package/dist/scheduler-PGUELFMB.js +0 -2
  81. package/dist/wiki-7BFVMMNR.js +0 -2
  82. /package/dist/{App-2D5W26LY.js.map → App-BUYK4EGC.js.map} +0 -0
  83. /package/dist/{ChatApp-FZFZD2XY.js.map → ChatApp-ZS6EPDDK.js.map} +0 -0
  84. /package/dist/{agent-PCRE3TRK.js.map → agent-W7UNXO6L.js.map} +0 -0
  85. /package/dist/{chunk-ZWZADDXV.js.map → chunk-5DFUUYEA.js.map} +0 -0
  86. /package/dist/{chunk-NFS2VR3L.js.map → chunk-5RE2B5YQ.js.map} +0 -0
  87. /package/dist/{chunk-NYAMY7EA.js.map → chunk-6GLJIA25.js.map} +0 -0
  88. /package/dist/{chunk-5SLTRG66.js.map → chunk-6HKLRU62.js.map} +0 -0
  89. /package/dist/{chunk-XBRVV4ZT.js.map → chunk-6PJ6XHG4.js.map} +0 -0
  90. /package/dist/{chunk-TYFGL2YS.js.map → chunk-B3B7KEHJ.js.map} +0 -0
  91. /package/dist/{chunk-EHKI2RKD.js.map → chunk-BN5QMNON.js.map} +0 -0
  92. /package/dist/{chunk-2UDSIG5K.js.map → chunk-BSTIA4M6.js.map} +0 -0
  93. /package/dist/{chunk-YCMO3KZ4.js.map → chunk-CY6ABHF2.js.map} +0 -0
  94. /package/dist/{chunk-BRVQZC6P.js.map → chunk-FHBPKMCF.js.map} +0 -0
  95. /package/dist/{chunk-C52IPIKJ.js.map → chunk-INLKJEEN.js.map} +0 -0
  96. /package/dist/{chunk-SB7WMFJV.js.map → chunk-QQYXYJOG.js.map} +0 -0
  97. /package/dist/{chunk-WJDFR3WE.js.map → chunk-VHT7HESZ.js.map} +0 -0
  98. /package/dist/{chunk-QCPSGOSK.js.map → chunk-WEPON4FP.js.map} +0 -0
  99. /package/dist/{chunk-XX6MLDTL.js.map → chunk-WMTGAVPW.js.map} +0 -0
  100. /package/dist/{chunk-YUNMSLZN.js.map → chunk-YL4C63S2.js.map} +0 -0
  101. /package/dist/{chunk-7ZGTRXWS.js.map → chunk-YSIRJZWF.js.map} +0 -0
  102. /package/dist/{client-TFZEASIJ.js.map → client-PO5LDFS4.js.map} +0 -0
  103. /package/dist/{config-IXCOAOPZ.js.map → config-L2RQ6EJX.js.map} +0 -0
  104. /package/dist/{config-mutator-EPYIZVSG.js.map → config-mutator-44OAOZXM.js.map} +0 -0
  105. /package/dist/{doctor-G5TM5GVF.js.map → doctor-AU5TCOSG.js.map} +0 -0
  106. /package/dist/{grants-NGBKFONG.js.map → grants-HIFE6L5N.js.map} +0 -0
  107. /package/dist/{promote-VTVIPRTC.js.map → promote-DPPNEINZ.js.map} +0 -0
  108. /package/dist/{query-3CVDT2GZ.js.map → query-SLUOL6MQ.js.map} +0 -0
  109. /package/dist/{registry-NOJMMWE3.js.map → registry-UBVBEEDW.js.map} +0 -0
  110. /package/dist/{request-planner-E2Q5O66N.js.map → request-planner-2G73AJ4S.js.map} +0 -0
  111. /package/dist/{review-candidates-I36HEYKX.js.map → review-candidates-S34UICQD.js.map} +0 -0
  112. /package/dist/{routing-KBUZON5R.js.map → routing-K2LAUFRL.js.map} +0 -0
  113. /package/dist/{schedule-tool-GUHHYYTO.js.map → schedule-tool-YRANRFHO.js.map} +0 -0
  114. /package/dist/{scheduler-PGUELFMB.js.map → scheduler-L4P4Z55R.js.map} +0 -0
  115. /package/dist/{seat-NGY2BMP6.js.map → seat-ZJT5T2NO.js.map} +0 -0
  116. /package/dist/{select-X7VBGZ6X.js.map → select-Y23SKHCJ.js.map} +0 -0
  117. /package/dist/{set-enabled-6NP63KCU.js.map → set-enabled-YWXWSKME.js.map} +0 -0
  118. /package/dist/{tool-EZIILXYL.js.map → tool-5JTCSRTW.js.map} +0 -0
  119. /package/dist/{tool-WKIF52OH.js.map → tool-FZEC5FQX.js.map} +0 -0
  120. /package/dist/{wiki-7BFVMMNR.js.map → wiki-ZZ3MU5Y5.js.map} +0 -0
@@ -1,28 +0,0 @@
1
- import{b as tt,c as nt}from"./chunk-GLQLCBJS.js";import{a as Ve}from"./chunk-GV7S5BAX.js";import{c as Ze}from"./chunk-SZDACK6O.js";import{b as ce}from"./chunk-AFRHKA7B.js";import{b as qe,e as Ye,f as Ge,i as Qe,k as Xe,l as et,q as rt}from"./chunk-ZWZADDXV.js";import{c as Ke,e as ze,f as Je}from"./chunk-KA2UIZXG.js";import{e as He,g as Ue,h as Be,i as de}from"./chunk-GQ76J72O.js";import{a as _e,b as oe,c as se,d as Le,e as ae}from"./chunk-QD6IICK7.js";import{y as Ce,z as hn}from"./chunk-EHKI2RKD.js";import{b as Me,f as mn}from"./chunk-72SZI2UW.js";import{c as We,d as je}from"./chunk-QOYAX2FT.js";import{f as ie,n as gn}from"./chunk-UIBUZ2N3.js";import{existsSync as yn,mkdirSync as it,readFileSync as wn,writeFileSync as kn,renameSync as bn}from"fs";import{resolve as ot,dirname as vn}from"path";var st=class{filePath;log;constructor(e={}){let t=e.baseDir??ot(process.cwd(),".agentx");this.filePath=ot(t,"handover.json"),this.log=e.log??console.error.bind(console,"[handover]"),it(t,{recursive:!0})}key(e,t,n){return`${e}::${t}::${n||"-"}`}load(){if(!yn(this.filePath))return{version:1,overrides:{}};try{let e=wn(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){it(vn(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp-${process.pid}`;kn(t,JSON.stringify(e,null,2)),bn(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 ut,writeFileSync as le,appendFileSync as Rn,mkdirSync as $n,existsSync as pt,statSync as xn}from"fs";import{resolve as U}from"path";var at="[Agent Memory \u2014 persistent facts from past conversations]",Sn=2400;function dt(r,e){return r?`UNVERIFIED (${e===null?"age unknown":`${e}d old`}) `:""}function In(r,e=Date.now()){let t=ze(r,e),n=r.undated?"UNVERIFIED (never checked) ":dt(t,He(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 An(r,e){let n=!r.source.chatId.startsWith("-")&&/^\d+$/.test(r.source.chatId)?"DM":r.source.chatId,i=Be(r,e);return{line:`- [${r.category}] ${dt(i,Ue(r,e))}${r.content} (${n}, ${r.source.date})`,unverified:i}}function ct(r,e=[],t=Date.now()){let n=[],i=new Set,o=at.length,s=!1;for(let a of r){let d=e.length>0?Je(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=In(d,t),u=d.id}else c=An(a,t),d&&(c.line+=` [differs from wiki ${d.id}]`);let f=c.unverified&&!s?de.length:0;if(o+f+c.line.length>Sn)break;n.push({fact:a,...c,...u?{wikiRef:u}:{}}),o+=f+c.line.length,f&&(s=!0)}return n}function lt(r){if(r.length===0)return"";let e=r.some(t=>t.unverified)?[de]:[];return[at,...e,...r.map(t=>t.line),"[End Memory]"].join(`
2
- `)}var ft=200,Pn=7,gt=class{memoryDir;ledger;constructor(e=process.cwd()){this.memoryDir=U(e,".agentx/memory"),this.ledger=new Ke(U(e,".agentx/wiki")),pt(this.memoryDir)||$n(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??_e(t.source.channel),i=t.review??Le(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 Rn(this.filePath(e),JSON.stringify(o)+`
3
- `),!0}parsedCache=new Map;getAll(e){let t=this.filePath(e);if(!pt(t))return[];try{let{mtimeMs:n,size:i}=xn(t),o=this.parsedCache.get(t);if(o&&o.mtimeMs===n&&o.size===i)return o.facts.slice();let a=ut(t,"utf-8").split(`
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=je(o,s),d=We(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 lt(this.contextLines(e))}contextFacts(e){return this.contextLines(e).map(t=>t.fact)}contextLines(e){let t=[];try{t=this.ledger.list()}catch{}return ct(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(`
5
- `)+`
6
- `)}getDueForReview(e,t=5){let n=this.getAll(e).filter(ae),i=Date.now();return n.filter(o=>o.category==="task-state"?!1:o.nextReview?new Date(o.nextReview).getTime()<=i:!0).sort((o,s)=>!o.nextReview&&s.nextReview?-1:o.nextReview&&!s.nextReview?1:o.nextReview&&s.nextReview?new Date(o.nextReview).getTime()-new Date(s.nextReview).getTime():(o.accessCount||0)-(s.accessCount||0)).slice(0,t)}buildRecallContext(e){let t=this.getDueForReview(e,5);if(t.length===0)return"";let n=["[Memory Recall \u2014 facts due for review, verify they are still accurate]"];for(let i of t){let o=Math.round((Date.now()-new Date(i.createdAt).getTime())/864e5);n.push(`- [${i.category}] ${i.content} (${o}d old, accessed ${i.accessCount||0}x)`)}return n.push("[If any fact is outdated, note the correction. Otherwise, acknowledge recall.]"),n.join(`
7
- `)}held(e){return this.getAll(e).filter(t=>t.review==="held"||t.review===void 0&&se(t)==="external")}review(e,t,n,i="operator"){let o=this.getAll(e),s=o.find(a=>a.id===t);return s?(s.review=n,s.reviewedBy=i,s.reviewedAt=new Date().toISOString(),this.rewrite(e,o),!0):!1}scrubSecrets(e,t=!1){let n=this.getAll(e),i=n.filter(s=>s.category!=="secret"&&!oe(s.content)),o=n.length-i.length;return t&&o>0&&this.rewrite(e,i),o}trustSummary(e){let t={};for(let n of this.getAll(e)){let i=`${se(n)}${n.review?`/${n.review}`:""}`;t[i]=(t[i]??0)+1}return t}fileFor(e){return this.filePath(e)}rewrite(e,t){let n=[];try{n=ut(this.filePath(e),"utf-8").split(`
8
- `).filter(o=>{if(!o.trim())return!1;try{return JSON.parse(o),!1}catch{return!0}})}catch{}let i=[...t.map(o=>JSON.stringify(o)),...n];le(this.filePath(e),i.join(`
9
- `)+(i.length?`
10
- `:""))}hasSimilar(e,t){let n=this.getAll(e),o=t.toLowerCase().split(/\s+/).filter(s=>s.length>3);return n.some(s=>{let a=s.content.toLowerCase();return o.filter(c=>a.includes(c)).length>=o.length*.7})}prune(e){let t=this.getAll(e);if(t.length===0)return;let n=Date.now(),i=Pn*24*60*60*1e3;t=t.filter(s=>s.category==="task-state"&&s.expiresAt?new Date(s.expiresAt).getTime()>n:s.category==="task-state"&&!s.expiresAt?n-new Date(s.createdAt).getTime()<i:!0),t.length>ft&&(t=t.slice(-ft));let o=this.filePath(e);le(o,t.map(s=>JSON.stringify(s)).join(`
11
- `)+`
12
- `)}};function mt(r){let e=(r||"").trim();for(let t=0;t<5;t++){let n=e;if(e=e.replace(/^Peer\s+"[^"]*"\s+\/task error:\s*\d{3}:\s*/i,"").replace(/^Peer\s+"[^"]*"\s+agent error:\s*/i,"").replace(/^mesh fallback failed:\s*/i,"").trim(),e===n)break}return e}var Tn="__queued__";function Fi(r,e){return`${Tn}:${r}:${e}`}var On=/^__queued__(?::([A-Za-z-]+):(\d+))?$/;function Nn(r){if(!r)return null;let e=On.exec(mt(r));return e?{mode:e[1]||"collect",pending:e[2]?Number(e[2]):1}:null}function Wi(r){return Nn(r)!==null}import{existsSync as S,mkdirSync as Vn,readdirSync as z,readFileSync as J,statSync as Zn,unlinkSync as q,writeFileSync as ge}from"fs";import{resolve as I,relative as me}from"path";import{z as l}from"zod";var Dn=l.enum(["trigger.channel","trigger.manual","trigger.cron","trigger.hook","trigger.form","trigger.poll","agent","transform","classify","branch","gateway.parallel","rule","action.send","action.createIssue","action.setLabel","action.readLabel","action.react","action.editMessage","action.logTime","action.callHTTP","action.run","action.builtin","subProcess","signal.emit","signal.wait","timer.boundary","checkpoint","end"]),En=l.enum(["equals","contains","matches","exists"]),ue=l.object({kind:En,params:l.record(l.unknown()).default({})}),yt=l.object({maxAttempts:l.number().int().min(1).max(10).default(1),backoffMs:l.number().int().min(0).max(6e4).default(1e3)}).default({maxAttempts:1,backoffMs:1e3}),wt=l.object({id:l.string().min(1).regex(/^[a-zA-Z_][a-zA-Z0-9_-]*$/,"node id must be identifier-safe"),type:Dn,config:l.record(l.unknown()).default({}),retry:yt,position:l.object({x:l.number(),y:l.number()}).optional()}),kt=l.object({from:l.string(),fromPort:l.string().optional(),to:l.string(),toPort:l.string().optional(),label:l.string().optional()}),ht=l.union([l.string(),l.date().transform(r=>r.toISOString())]),$=l.object({id:l.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"workflow id must be lower-kebab"),version:l.literal(2).default(2),title:l.string().min(1),description:l.string().optional(),status:l.enum(["draft","review","active","deprecated"]).default("active"),tags:l.array(l.string()).default([]),project:l.string().optional(),entity:l.string().optional(),intentPath:l.array(l.string()).default([]),generatedFrom:l.string().optional(),sourceTaskIds:l.array(l.string()).default([]),confidence:l.number().min(0).max(1).optional(),workflowVersion:l.string().optional(),ownerAgent:l.string().optional(),lastMatchedAt:l.string().optional(),matchCount:l.number().int().min(0).default(0),state:l.enum(["active","disabled","quarantined"]).default("active"),priority:l.number().int().default(0),fanOut:l.boolean().default(!1),nodes:l.array(wt).refine(r=>r.length>0,{message:"workflow must have at least one node"}),edges:l.array(kt).default([]),envAllow:l.array(l.string()).default([]),retention:l.object({maxRuns:l.number().int().positive().default(500),maxDays:l.number().int().positive().default(90)}).default({maxRuns:500,maxDays:90}),maxChildDepth:l.number().int().positive().default(5),mesh:l.object({allowRemote:l.boolean().default(!1),peers:l.array(l.string()).optional()}).default({allowRemote:!1}),created:ht.optional(),updated:ht.optional()});function pe(r){let e=[],t=new Map(r.nodes.map(s=>[s.id,s])),n=r.nodes.filter(s=>s.type.startsWith("trigger."));n.length===0&&e.push("workflow must have exactly one trigger.* node (found 0)"),n.length>1&&e.push(`workflow has ${n.length} trigger.* nodes; v1 supports exactly one`);for(let s of r.edges)t.has(s.from)||e.push(`edge references missing node: from="${s.from}"`),t.has(s.to)||e.push(`edge references missing node: to="${s.to}"`);let i=n[0];if(i){let s=new Map;for(let c of r.edges)s.has(c.from)||s.set(c.from,[]),s.get(c.from).push(c.to);let a=new Set,d=[i.id];for(;d.length;){let c=d.pop();if(!a.has(c)){a.add(c);for(let u of s.get(c)??[])d.push(u)}}for(let c of r.nodes)a.has(c.id)||e.push(`node "${c.id}" is unreachable from trigger "${i.id}"`);r.nodes.some(c=>a.has(c.id)&&Fn(c.type))||e.push("no reachable `end`, `checkpoint`, `subProcess`, `signal.wait`, or `timer.boundary` node \u2014 the run cannot terminate or pause")}for(let s of r.nodes){if(s.type!=="branch"&&s.type!=="rule")continue;let a=s.type==="branch"?s.config.cases??[]:(s.config.rules??[]).filter(p=>typeof p.to=="string"),d=s.type==="branch"?s.config.default:s.config.default?.to,c=new Set(a.map(p=>p.to));d&&c.add(d);let u=r.edges.filter(p=>p.from===s.id);for(let p of u){let f=p.fromPort??"";c.has(f)||e.push(`${s.type} "${s.id}" has outgoing edge with port "${f}" not declared in cases or default`)}}let o=jn(r);for(let s of o)e.push(`cycle without agent/checkpoint: ${s.join(" -> ")}`);return e}function Fn(r){return r==="end"||r==="checkpoint"||r==="subProcess"||r==="signal.wait"||r==="timer.boundary"}function Wn(r){return r==="agent"||r==="checkpoint"||r==="subProcess"||r==="signal.wait"||r==="timer.boundary"}function jn(r){let e=new Map;for(let a of r.edges)e.has(a.from)||e.set(a.from,[]),e.get(a.from).push(a.to);let t=new Map(r.nodes.map(a=>[a.id,a])),n=[],i=new Map,o=[],s=a=>{if(i.get(a)===1){let d=o.indexOf(a);if(d>=0){let c=o.slice(d).concat(a);c.some(p=>{let f=t.get(p)?.type;return f?Wn(f):!1})||n.push(c)}return}if(i.get(a)!==2){i.set(a,1),o.push(a);for(let d of e.get(a)??[])s(d);o.pop(),i.set(a,2)}};for(let a of r.nodes)i.get(a.id)!==2&&s(a.id);return n}var bt=l.enum(["running","paused","completed","failed","canceled"]),Mn=l.enum(["ok","failed","timeout","skipped","paused","resumed"]),Cn=l.object({at:l.string(),nodeId:l.string(),inputKeys:l.array(l.string()).default([]),status:Mn,output:l.record(l.unknown()).optional(),idempotencyKey:l.string(),note:l.string().optional()}),_n=l.object({backend:l.string(),id:l.string()}),Ln=l.discriminatedUnion("kind",[l.object({kind:l.literal("checkpoint"),nodeId:l.string(),checkpointName:l.string(),resumeMatch:l.record(l.unknown()).default({})}),l.object({kind:l.literal("subProcess"),nodeId:l.string(),childRunId:l.string(),childWorkflowId:l.string()}),l.object({kind:l.literal("signalWait"),nodeId:l.string(),signalName:l.string(),match:l.record(l.unknown()).default({}),scope:l.enum(["workflow","global"]).default("workflow")}),l.object({kind:l.literal("timerWait"),nodeId:l.string(),fireAt:l.string()})]),Hn=l.object({id:l.string(),workflowId:l.string(),workflowVersion:l.literal(2),homeNode:l.string(),status:bt,pausedAt:Ln.optional(),context:l.record(l.record(l.unknown())).default({}),pending:l.array(l.string()).default([]),joinCounters:l.record(l.array(l.string())).default({}),entityRef:_n,history:l.array(Cn).default([]),parentRunId:l.string().nullable().default(null),parentNodeId:l.string().nullable().default(null),rootRunId:l.string().nullable().default(null),depth:l.number().int().min(0).default(0),eventRootId:l.string().optional(),createdAt:l.string(),updatedAt:l.string()});import St from"js-yaml";var Un=new Set(["branch","gateway.parallel","rule","signal.wait","subProcess","timer.boundary","checkpoint"]),v=class extends Error{constructor(t,n){super(t);this.mark=n;this.name="WorkflowYamlError"}};function B(r,e={}){if(!r||r.trim()==="")throw new v(`${x(e)}empty file \u2014 workflow YAML must contain at least an id, version, title, and one node.`);let t;try{t=St.loadAll(r)}catch(i){let o=i?.mark;throw new v(`${x(e)}YAML parse error: ${i?.reason??i?.message??i}`+(o?` (line ${o.line+1}, column ${o.column+1})`:""),o)}if(t.length===0||t.length===1&&t[0]==null)throw new v(`${x(e)}YAML produced no document.`);if(t.length>1)throw new v(`${x(e)}multi-document YAML is not supported in v1; one workflow per file.`);let n=t[0];if(typeof n!="object"||n===null||Array.isArray(n)){let i=Array.isArray(n)?"array":typeof n;throw new v(`${x(e)}top-level YAML must be a mapping (got ${i}).`)}return It(n,e)}function It(r,e={}){if(!("flow"in r))return r;let t=r.flow;if(t==null){let p={...r};return delete p.flow,p}if(!Array.isArray(t))throw new v(`${x(e)}flow must be an array of node ids (got ${typeof t}).`);for(let p of t)if(typeof p!="string")throw new v(`${x(e)}flow entries must be strings (got ${typeof p}).`);let n=t,i=Array.isArray(r.nodes)?r.nodes:[],o=new Map;for(let p of i)p&&typeof p=="object"&&typeof p.id=="string"&&typeof p.type=="string"&&o.set(p.id,p.type);for(let p of n){if(!o.has(p))throw new v(`${x(e)}flow references unknown node "${p}".`);let f=o.get(p);if(Un.has(f))throw new v(`${x(e)}flow cannot include ${f} node "${p}"; use explicit edges for ${f} nodes.`)}let s=[];for(let p=0;p<n.length-1;p++)s.push({from:n[p],to:n[p+1]});let a=Array.isArray(r.edges)?r.edges:[],d=new Set,c=[];for(let p of a){if(!p||typeof p!="object")continue;let f=vt(p.from,p.fromPort,p.to);f&&!d.has(f)?(d.add(f),c.push(p)):f||c.push(p)}for(let p of s){let f=vt(p.from,void 0,p.to);f&&!d.has(f)&&(d.add(f),c.push(p))}let u={...r,edges:c};return delete u.flow,u}function vt(r,e,t){return typeof r!="string"||typeof t!="string"?null:`${r}::${typeof e=="string"?e:""}::${t}`}function x(r){return r.filePath?`${r.filePath}: `:""}function Bn(r){return St.dump(r,{noRefs:!0,lineWidth:100,sortKeys:!1})}import{Document as Kn,isMap as K,isSeq as zn,isScalar as At,parseDocument as Jn}from"yaml";function Rt(r,e){let t=Jn(r);if(!t.contents||!K(t.contents)){let n=new Kn(e);return t.commentBefore&&(n.commentBefore=t.commentBefore),String(n)}return fe(t,t.contents,e),String(t)}function fe(r,e,t){let n=Object.keys(t),i=new Set(n),o=new Map;for(let a of e.items){let d=Gn(a);d!==null&&o.set(d,a)}let s=[];for(let a of n){let d=t[a],c=o.get(a);c?(qn(r,c,d),s.push(c)):s.push(r.createPair(a,d))}e.items=s}function qn(r,e,t){let n=e.value;if(t==null){e.value=r.createNode(null);return}if(typeof t!="object"){e.value=r.createNode(t);return}if(Array.isArray(t)){zn(n)?Yn(r,n,t):e.value=r.createNode(t);return}K(n)?fe(r,n,t):e.value=r.createNode(t)}function Yn(r,e,t){if(!(t.length>0&&t.every(s=>s&&typeof s=="object"&&typeof s.id=="string"))){let s=r.createNode(t);e.items=s.items;return}let i=new Map;for(let s of e.items)if(K(s)){let a=s.get("id",!0);At(a)&&typeof a.value=="string"&&i.set(a.value,s)}let o=[];for(let s of t){let a=s.id,d=i.get(a);d&&K(d)?(fe(r,d,s),o.push(d)):o.push(r.createNode(s))}e.items=o}function Gn(r){let e=r.key;return At(e)&&typeof e.value=="string"?e.value:typeof e=="string"?e:null}var $t=new Map,he=class{baseDir;constructor(e={}){this.baseDir=e.baseDir??I(process.cwd(),".agentx/workflows"),Vn(this.baseDir,{recursive:!0})}pathFor(e){return this.pathForJson(e)}pathForJson(e){return I(this.baseDir,`${e}.json`)}pathForYaml(e){return I(this.baseDir,`${e}.yaml`)}isWorkflowFile(e){return e.startsWith("_")?!1:e.endsWith(".json")||e.endsWith(".yaml")||e.endsWith(".yml")}idFromFilename(e){return e.replace(/\.(json|ya?ml)$/,"")}readAndParse(e){let t=I(this.baseDir,e),n=J(t,"utf-8");return e.endsWith(".json")?JSON.parse(n):B(n,{filePath:e})}list(){if(!S(this.baseDir))return[];let e=new Map,t=[];for(let a of z(this.baseDir,{withFileTypes:!0})){if(!a.isFile()||!this.isWorkflowFile(a.name))continue;let d=this.idFromFilename(a.name),c=e.get(d)??[];c.push(a.name),e.set(d,c);try{let u=Zn(I(this.baseDir,a.name));t.push(`${a.name}:${u.mtimeMs}:${u.size}`)}catch{t.push(`${a.name}:?`)}}let n=t.sort().join("|"),i=$t.get(this.baseDir);if(i&&i.signature===n)return i.workflows.slice();let o=[];for(let[,a]of e)if(!(a.length>1))try{let d=this.readAndParse(a[0]),c=$.safeParse(d);c.success&&o.push(c.data)}catch{}let s=o.sort((a,d)=>a.id.localeCompare(d.id));return $t.set(this.baseDir,{signature:n,workflows:s}),s.slice()}validateAll(){let e=[];if(!S(this.baseDir))return e;let t=new Map;for(let n of z(this.baseDir,{withFileTypes:!0})){if(!n.isFile()||!this.isWorkflowFile(n.name))continue;let i=this.idFromFilename(n.name),o=t.get(i)??[];o.push(n.name),t.set(i,o)}for(let[n,i]of t){if(i.length>1){let p=[...i].sort();for(let f of p)e.push({id:n,path:me(this.baseDir,I(this.baseDir,f)),issues:[`duplicate workflow id "${n}" \u2014 found ${p.join(" and ")}; delete one to disambiguate`],isValid:!1});continue}let o=i[0],s=I(this.baseDir,o),a=me(this.baseDir,s),d;try{d=this.readAndParse(o)}catch(p){let f=p instanceof v?p.message:`parse error: ${p?.message??p}`;e.push({id:n,path:a,issues:[f],isValid:!1});continue}let c=$.safeParse(d);if(!c.success){let p=c.error.issues.map(f=>`${f.path.join(".")||"<root>"}: ${f.message}`);e.push({id:String(d?.id??n),path:a,issues:p,isValid:!1});continue}let u=pe(c.data);e.push({workflow:c.data,issues:u,isValid:u.length===0})}return e}get(e){let t=this.pathForJson(e),n=this.pathForYaml(e),i=I(this.baseDir,`${e}.yml`),o=S(t),s=S(n)||S(i);if(o&&s)return null;if(o)try{let d=JSON.parse(J(t,"utf-8")),c=$.safeParse(d);return c.success?c.data:null}catch{return null}let a=S(n)?n:S(i)?i:null;if(a)try{let d=J(a,"utf-8"),c=B(d,{filePath:me(this.baseDir,a)}),u=$.safeParse(c);return u.success?u.data:null}catch{return null}if(!S(this.baseDir))return null;for(let d of z(this.baseDir,{withFileTypes:!0}))if(!(!d.isFile()||!this.isWorkflowFile(d.name)||this.idFromFilename(d.name)===e))try{let u=this.readAndParse(d.name),p=$.safeParse(u);if(p.success&&p.data.id===e)return p.data}catch{}return null}save(e,t={}){let n=new Date().toISOString().slice(0,10),i=$.parse({...e,created:e.created||n,updated:n}),o=this.pathForYaml(i.id),s=I(this.baseDir,`${i.id}.yml`),a=S(o)?o:S(s)?s:null;if(!a&&S(this.baseDir)){for(let d of z(this.baseDir,{withFileTypes:!0}))if(!(!d.isFile()||!this.isWorkflowFile(d.name))&&!d.name.endsWith(".json"))try{let c=this.readAndParse(d.name),u=$.safeParse(c);if(u.success&&u.data.id===i.id){a=I(this.baseDir,d.name);break}}catch{}}if(a&&t.convertFromYaml)return q(a),ge(this.pathForJson(i.id),JSON.stringify(i,null,2)+`
13
- `),i;if(a){let d=J(a,"utf-8");try{let c=Rt(d,i);return ge(a,c),i}catch(c){let u=new Error(`yaml round-trip failed for "${i.id}" at ${a}: ${c?.message??c}`);throw u.yamlPath=a,u}}return ge(this.pathForJson(i.id),JSON.stringify(i,null,2)+`
14
- `),i}delete(e){let t=this.pathForJson(e),n=this.pathForYaml(e),i=I(this.baseDir,`${e}.yml`),o=!1;return S(t)&&(q(t),o=!0),S(n)&&(q(n),o=!0),S(i)&&(q(i),o=!0),o}};import{createHash as Qn,randomUUID as Xn}from"crypto";import{appendFileSync as xt,existsSync as E,mkdirSync as Pt,readdirSync as Tt,readFileSync as ye,statSync as Ot,unlinkSync as Nt,writeFileSync as er}from"fs";import{resolve as D}from"path";function tr(r){return r.replace(/[^a-zA-Z0-9._:#@-]/g,"_").slice(0,200)}function T(r,e,t){return Qn("sha1").update(`${r}|${e}|${t}`).digest("hex").slice(0,16)}var we=class{baseDir;runsDir;indexDir;nodeId;constructor(e){this.baseDir=e.baseDir??D(process.cwd(),".agentx/workflows"),this.runsDir=D(this.baseDir,"_runs"),this.indexDir=D(this.baseDir,"_index"),this.nodeId=e.nodeId,Pt(this.runsDir,{recursive:!0}),Pt(this.indexDir,{recursive:!0})}runPath(e){return D(this.runsDir,`${e}.jsonl`)}indexPath(e){return D(this.indexDir,`${e.backend}__${tr(e.id)}.json`)}create(e){let t=new Date().toISOString(),n=Xn(),i={id:n,workflowId:e.workflowId,workflowVersion:2,homeNode:this.nodeId,status:"running",pausedAt:void 0,context:e.initialContext??{},pending:e.initialPending,entityRef:e.entityRef,history:[],parentRunId:e.parentRunId??null,parentNodeId:e.parentNodeId??null,rootRunId:e.rootRunId??n,depth:e.depth??0,eventRootId:e.eventRootId??Ye()?.rootId,joinCounters:{},createdAt:t,updatedAt:t};return this.appendSnapshot(i),this.writeIndex(e.entityRef,i.id),i}get(e){let t=this.runPath(e);if(!E(t))return null;let n=ye(t,"utf-8").trim();if(!n)return null;let i=null;for(let o of n.split(`
15
- `)){let s;try{s=JSON.parse(o)}catch{continue}if(s.v===2){if(s.kind==="snapshot")i=s.run;else if(s.kind==="exec"&&i&&i.id===s.runId){let a=i;i={...a,history:[...a.history,s.entry],pending:s.pending,status:s.status??a.status,pausedAt:s.pausedAt===null?void 0:s.pausedAt??a.pausedAt,context:s.context??a.context,joinCounters:s.joinCounters??a.joinCounters,updatedAt:s.entry.at}}}}return i}getActiveByEntity(e){let t=this.indexPath(e);if(!E(t))return null;try{return JSON.parse(ye(t,"utf-8")).runId}catch{return null}}getHomeNodeByEntity(e){let t=this.indexPath(e);if(!E(t))return null;try{return JSON.parse(ye(t,"utf-8")).homeNode}catch{return null}}recordExecution(e){let t=this.get(e.runId);if(!t)return null;if(t.history.some(o=>o.idempotencyKey===e.entry.idempotencyKey))return t;let n={v:2,kind:"exec",runId:e.runId,entry:e.entry,pending:e.nextPending,status:e.status,pausedAt:e.pausedAt===null?null:e.pausedAt,context:e.context,joinCounters:e.joinCounters};xt(this.runPath(e.runId),JSON.stringify(n)+`
16
- `);let i=e.status??t.status;return i==="completed"||i==="failed"||i==="canceled"?this.clearIndex(t.entityRef):this.writeIndex(t.entityRef,t.id),this.get(e.runId)}setStatus(e,t){let n=this.get(e);if(!n)return null;let i={...n,status:t,updatedAt:new Date().toISOString()};return this.appendSnapshot(i),t!=="running"&&t!=="paused"&&this.clearIndex(i.entityRef),i}list(e={}){if(!E(this.runsDir))return[];let t=Tt(this.runsDir).filter(i=>i.endsWith(".jsonl")).map(i=>({name:i,mtime:Ot(D(this.runsDir,i)).mtimeMs})).sort((i,o)=>o.mtime-i.mtime),n=[];for(let i of t){let o=this.get(i.name.replace(/\.jsonl$/,""));if(o&&!(e.workflowId&&o.workflowId!==e.workflowId)&&(n.push(o),e.limit&&n.length>=e.limit))break}return n}prune(e){if(!E(this.runsDir))return 0;let t=Date.now()-e.maxDays*24*60*60*1e3,n=[];for(let o of Tt(this.runsDir)){if(!o.endsWith(".jsonl"))continue;let s=D(this.runsDir,o),a=Ot(s).mtimeMs,d=this.get(o.replace(/\.jsonl$/,""));d&&(d.status==="running"||d.status==="paused"||n.push({file:s,run:d,mtime:a}))}n.sort((o,s)=>s.mtime-o.mtime);let i=0;for(let o=0;o<n.length;o++){let s=n[o],a=s.mtime<t,d=o>=e.maxRuns;if(a||d)try{Nt(s.file),i++}catch{}}return i}appendSnapshot(e){let t={v:2,kind:"snapshot",run:e};xt(this.runPath(e.id),JSON.stringify(t)+`
17
- `)}writeIndex(e,t){er(this.indexPath(e),JSON.stringify({runId:t,homeNode:this.nodeId,updatedAt:new Date().toISOString()},null,2)+`
18
- `)}clearIndex(e){let t=this.indexPath(e);if(E(t))try{Nt(t)}catch{}}};import{existsSync as Dt,mkdirSync as nr,readFileSync as rr,unlinkSync as ir,writeFileSync as or}from"fs";import{resolve as ke}from"path";import{z as F}from"zod";var Et=F.object({version:F.literal(1),nodes:F.record(F.object({x:F.number(),y:F.number()}))}),be=class{baseDir;layoutsDir;constructor(e={}){this.baseDir=e.baseDir??ke(process.cwd(),".agentx/workflows"),this.layoutsDir=ke(this.baseDir,"_layouts"),nr(this.layoutsDir,{recursive:!0})}pathFor(e){let t=e.replace(/[^a-zA-Z0-9._-]/g,"_");return ke(this.layoutsDir,`${t}.json`)}get(e){let t=this.pathFor(e);if(!Dt(t))return null;try{let n=Et.safeParse(JSON.parse(rr(t,"utf-8")));return n.success?n.data:null}catch{return null}}save(e,t){let n=Et.parse(t);return or(this.pathFor(e),JSON.stringify(n,null,2)+`
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 Dt(t)?(ir(t),!0):!1}};function Ft(r){return new Set(r.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(e=>e.length>3))}function sr(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 ar(r,e){let t=Ft(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=sr(t,Ft(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=W(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 W(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 O(r,e){return r.nodes.find(t=>t.id===e)}mn();hn();function dr(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)=>dr(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 Wt="workflow-classify",V="unsure",jt=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 Ce(Wt,u,{label:Me(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.${Wt}.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 Mt(r,e){return`${r}:${e}`}var j=async r=>({output:r.run.context[r.node.id]??{}}),cr=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?Mt(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"?Er(u.content):_t(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)}},lr=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}})},ur=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)`}},pr=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}`}}},fr=async()=>({output:{}}),gr=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}}}},mr=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}}},hr=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})??[]}}},yr=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}`}}},wr=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}`}}},kr=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}`}}},br=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}`}}},vr=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}`}}},Sr=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}`}}},Ir=async r=>{let e=r.node.config,t=r.run.context;return typeof e.path=="string"&&e.path?{output:{value:W(t,e.path)}}:e.template&&typeof e.template=="object"?{output:b(e.template,t,{envAllow:r.workflow.envAllow})}:{output:{}}};function Ar(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 Rr=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}}},$r=j,xr=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}}},Pr=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}}},Tr=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=Ar(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)`}},Or=async()=>({output:{}}),Nr=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(!Dr(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 Dr(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 Ct={"trigger.channel":j,"trigger.manual":j,"trigger.cron":j,"trigger.hook":j,"trigger.form":$r,"trigger.poll":j,agent:cr,classify:jt,branch:lr,transform:Ir,"gateway.parallel":Or,rule:Nr,"action.send":ur,"action.createIssue":pr,"action.setLabel":mr,"action.readLabel":hr,"action.react":yr,"action.editMessage":wr,"action.logTime":kr,"action.callHTTP":br,"action.run":vr,"action.builtin":Sr,subProcess:Rr,"signal.emit":xr,"signal.wait":Pr,"timer.boundary":Tr,checkpoint:gr,end:fr};function Ae(r){return Ct[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 _t(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 Er(r){let{result:e}=_t(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 C=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 Fr(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 Wr(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 jr(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 Lt(r,e,t,n,i=Date.now){let o=Fr(e,t,i),s=Wr(n),a=jr(s),d=Xe(r,o,a,i);return et(r,"workflow",d,s,i),d}gn();var Mr=4e3,Cr=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 C,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=O(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=O(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,Mr);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(Qe("workflow")!=="off")try{Lt(qe(),{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(!Lr(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=O(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?Ge({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,Cr);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=O(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=tt(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{nt(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(Fe){this.log(`[workflow:${e.id}] timer schedule failed: ${Fe.message}`)}return}let R=g.output??{},dn={...m.context,[n]:R},{nextPending:cn}=ve({workflow:e,fromNodeId:n,selectedPort:g.port}),re=[],_={...m.joinCounters??{}};for(let k of cn){let P=O(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 pn=e.edges.filter(fn=>fn.to===k).length;H.length>=pn&&(re.push(k),delete _[k])}let ln=[...y,...re],L=d.type==="end",un=m.status==="running"?L?String(d.config.status??"completed"):"running":void 0,N=this.runs.recordExecution({runId:t,entry:{at:w,nodeId:n,inputKeys:u,status:"ok",output:R,idempotencyKey:o},nextPending:L?[]:ln,status:un,context:dn,joinCounters:_});this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:L?"completed":"ok",status:N?.status??m.status}),g.emitSignal&&this.emitSignal({name:g.emitSignal.name,scope:g.emitSignal.scope,workflowId:e.id,payload:g.emitSignal.payload}),L&&N&&N.parentRunId&&N.parentNodeId&&this.resumeParent({parentRunId:N.parentRunId,parentNodeId:N.parentNodeId,childRun:N}).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=O(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:_r(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 _r(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 Lr(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 Hr(r){return{"pre:channel-message":async e=>{let t=e.msg;if(!t)return{};let n=Ur(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:Br(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 Ur(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 Br(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 Kr(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 zr(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 Jr(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 Ht(r,e,t,n,i){let o=Kr(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=Jr(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=zr(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 qr(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}Gr({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=Ht(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=Yr(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 Yr(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 Gr(r,e,t){let n=()=>{let i;try{i=rt(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 Vr}from"crypto";import{existsSync as Zr,mkdirSync as Qr,readFileSync as Xr,renameSync as ei,writeFileSync as ti}from"fs";import{resolve as Ut}from"path";import{z as M}from"zod";var Bt=M.object({actionId:M.string().min(1),everySeconds:M.number().int().min(5).max(86400).default(60),key:M.string().min(1).default("id"),filter:M.array(ue).default([]),maxPerPoll:M.number().int().min(1).max(500).default(20)}),ni=5e3,ri=30;async function ii(r){let e=new Ve().get(r);if(!e)throw new Error(`no action "${r}" in registry`);return Ze(e)}function Kt(r,e){let t=[],n=0;for(let i of r.split(`
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=W(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 oi(r,e){let t=`${r}:${e}`;return/^[a-zA-Z0-9._:@-]+$/.test(e)&&t.length<=200?t:`${r}:#${Vr("sha256").update(e).digest("hex").slice(0,32)}`}var Te=class{constructor(e){this.opts=e;this.stateDir=Ut(e.store.baseDir,"_poll"),this.runAction=e.runAction??ii}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}`)}},ri*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}=Kt(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:oi(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=Bt.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 Ut(this.stateDir,`${e}.json`)}readState(e){let t=this.statePath(e);if(!Zr(t))return null;try{let n=JSON.parse(Xr(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-ni;i>0&&(t.seen=t.seen.filter(s=>n.has(s)||i--<=0)),Qr(this.stateDir,{recursive:!0});let o=this.statePath(e);ti(`${o}.tmp`,JSON.stringify(t)),ei(`${o}.tmp`,o)}};function zt(r){return r.nodes.find(n=>n.type.startsWith("trigger."))?.config?.inputSchema??null}function Jt(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 qt(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 Yt(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 ai(r,e){let t=zt(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=Jt(e.chatId,t),o={...n,...i},s={...o};o=qt(t,o);let a=Object.keys(o).filter(d=>s[d]===void 0&&o[d]!==void 0);return{inputs:o,missing:Yt(t,o),filledFrom:{passthrough:Object.keys(n),chatId:Object.keys(i),defaults:a}}}import{existsSync as Oe,mkdirSync as Gt,readFileSync as Ne,renameSync as Vt,writeFileSync as Zt,appendFileSync as di}from"fs";import{dirname as Qt,resolve as Xt}from"path";import{randomBytes as en}from"crypto";var ci=".agentx/members.json",li=".agentx/members-log.jsonl",tn=class{constructor(e=process.cwd(),t=Date.now,n=90){this.now=t;this.retentionDays=n;this.file=Xt(e,ci),this.logFile=Xt(e,li)}file;logFile;prunedAt=0;devices(e){let t=this.load().devices;return e?t.filter(n=>n.personId===e):t}byToken(e){return this.load().devices.find(t=>t.tokenId===e)??null}add(e){let t=this.load();t.devices=t.devices.filter(n=>n.tokenId!==e.tokenId),t.devices.push(e),this.save(t)}update(e,t){let n=this.load(),i=n.devices.find(o=>o.tokenId===e);return i?(Object.assign(i,t),this.save(n),i):null}log(e){try{this.prune()}catch{}try{Gt(Qt(this.logFile),{recursive:!0}),di(this.logFile,JSON.stringify({at:new Date(this.now()).toISOString(),...e})+`
21
- `,{mode:384})}catch{}}prune(e=!1){let t=this.now();if(!e&&t-this.prunedAt<36e5||(this.prunedAt=t,!Oe(this.logFile)))return 0;let n=t-this.retentionDays*864e5,i=Ne(this.logFile,"utf-8").split(`
22
- `).filter(Boolean),o=i.filter(a=>{try{return Date.parse(JSON.parse(a).at)>=n}catch{return!1}});if(o.length===i.length)return 0;let s=`${this.logFile}.${process.pid}.${en(4).toString("hex")}.tmp`;return Zt(s,o.length?o.join(`
23
- `)+`
24
- `:"",{encoding:"utf-8",mode:384}),Vt(s,this.logFile),i.length-o.length}events(e,t=50){if(!Oe(this.logFile))return[];let n=Ne(this.logFile,"utf-8").split(`
25
- `).filter(Boolean),i=[];for(let o=n.length-1;o>=0&&i.length<t;o--)try{let s=JSON.parse(n[o]);(!e||s.person===e)&&i.push(s)}catch{}return i}load(){if(Oe(this.file))try{let e=JSON.parse(Ne(this.file,"utf-8"));if(e&&Array.isArray(e.devices))return e}catch{}return{devices:[]}}save(e){Gt(Qt(this.file),{recursive:!0});let t=`${this.file}.${process.pid}.${en(4).toString("hex")}.tmp`;Zt(t,JSON.stringify(e,null,2)+`
26
- `,{encoding:"utf-8",mode:384}),Vt(t,this.file)}};import{extname as ui}from"path";var nn=/<agentx-artifact>([\s\S]*?)<\/agentx-artifact>/gi,rn=/<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(nn,(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(rn,""):o).trim(),artifacts:n}}function Ts(r,e=!1){let t=String(r??""),n=t;if(/<agentx-artifact>/i.test(t)){let i=t.replace(nn,(o,s)=>{try{let a=JSON.parse(s.trim());return a&&typeof a.filename=="string"?a.filename:""}catch{return""}});n=(e?i.replace(rn,""):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 pi={".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"}},Os={bytes:20*1024*1024,perMessage:20,pathChars:512};function Ns(r){return pi[ui(r).toLowerCase()]??null}var fi=["[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(`
27
- `);function Ds(r,e,t){return r==="app"&&e&&t!==!1?fi:void 0}import{lstatSync as Ee,mkdirSync as gi,readdirSync as mi,realpathSync as De,unlinkSync as hi}from"fs";import{join as ne,resolve as on}from"path";var sn=".agentx/outbox",yi=7*24*60*60*1e3;function wi(r,e){try{let t=De(on(e,r)),n=ne(t,sn);return De(n)===n&&Ee(n).isDirectory()?n:null}catch{return null}}function js(r,e={}){let t=e.cwd??process.cwd();if(e.create!==!1)try{let i=De(on(t,r));Ee(ne(i,".agentx"),{throwIfNoEntry:!1})?.isSymbolicLink()||gi(ne(i,sn),{recursive:!0})}catch{return 0}let n=wi(r,t);return n?an(n,(e.now??Date.now())-(e.maxAgeMs??yi)):0}function an(r,e){let t=0;for(let n of mi(r)){let i=ne(r,n);try{let o=Ee(i);o.isDirectory()?t+=an(i,e):Math.max(o.mtimeMs,o.ctimeMs)<e&&(hi(i),t++)}catch{}}return t}export{st as a,gt as b,mt as c,Fi as d,Nn as e,Wi as f,$ as g,pe as h,v as i,B as j,Bn as k,he as l,we as m,be as n,xe as o,Hr as p,qr as q,Te as r,ar as s,ai as t,tn as u,Ps as v,Ts as w,Os as x,Ns as y,Ds as z,sn as A,js as B};
28
- //# sourceMappingURL=chunk-TLCURHW3.js.map